##// END OF EJS Templates
Correct small history bug. Add busy cursor.
Gael Varoquaux -
Show More
@@ -87,8 +87,8 b' class LineFrontEndBase(FrontEndBase):'
87 87
88 88
89 89 def is_complete(self, string):
90 if ( len(self.get_current_edit_buffer().split('\n'))>1
91 and not re.findall(r"\n[\t ]*$", string)):
90 if ( len(self.get_current_edit_buffer().split('\n'))>2
91 and not re.findall(r"\n[\t ]*\n[\t ]*$", string)):
92 92 return False
93 93 else:
94 94 return FrontEndBase.is_complete(self, string)
@@ -103,7 +103,7 b' class LineFrontEndBase(FrontEndBase):'
103 103 # Create a false result, in case there is an exception
104 104 self.last_result = dict(number=self.prompt_number)
105 105 try:
106 self.history.input_cache[-1] = raw_string
106 self.history.input_cache[-1] = raw_string.rstrip()
107 107 result = self.shell.execute(python_string)
108 108 self.last_result = result
109 109 self.render_result(result)
@@ -121,8 +121,7 b' class LineFrontEndBase(FrontEndBase):'
121 121 self.new_prompt(self.prompt % (self.last_result['number'] + 1))
122 122 # Start a new empty history entry
123 123 self._add_history(None, '')
124 # The result contains useful information that can be used
125 # elsewhere.
124 self.history_cursor = len(self.history.input_cache) - 1
126 125
127 126
128 127 def _on_enter(self):
@@ -131,13 +130,12 b' class LineFrontEndBase(FrontEndBase):'
131 130 """
132 131 current_buffer = self.get_current_edit_buffer()
133 132 cleaned_buffer = self.prefilter_input(current_buffer)
134 if self.is_complete(cleaned_buffer + '\n'):
135 # The '\n' is important in case prefiltering empties the
136 # line, to get a new prompt.
133 if self.is_complete(cleaned_buffer):
137 134 self.execute(cleaned_buffer, raw_string=current_buffer)
138 135 else:
139 if len(current_buffer.split('\n'))>1:
140 self.write(self._get_indent_string(current_buffer))
136 if len(current_buffer.split('\n'))>2:
137 # We need to clean the trailing '\n'
138 self.write(self._get_indent_string(current_buffer[:-1]))
141 139 else:
142 140 self.write('\t')
143 141
@@ -99,7 +99,7 b' class ConsoleWidget(editwindow.EditWindow):'
99 99
100 100 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
101 101 size=wx.DefaultSize, style=0,
102 autocomplete_mode='IPYTHON'):
102 autocomplete_mode='STC'):
103 103 """ Autocomplete_mode: Can be 'IPYTHON' or 'STC'
104 104 'IPYTHON' show autocompletion the ipython way
105 105 'STC" show it scintilla text control way
@@ -152,7 +152,11 b' class ConsoleWidget(editwindow.EditWindow):'
152 152 self.SetTabWidth(4)
153 153
154 154 self.EnsureCaretVisible()
155
155 # Tell autocompletion to choose automaticaly out of a single
156 # choice list
157 self.AutoCompSetChooseSingle(True)
158 self.AutoCompSetMaxHeight(10)
159
156 160 self.SetMargins(3, 3) #text is moved away from border with 3px
157 161 # Suppressing Scintilla margins
158 162 self.SetMarginWidth(0, 0)
@@ -271,7 +275,7 b' class ConsoleWidget(editwindow.EditWindow):'
271 275 self.StyleSetSpec(style[0], "bold,fore:%s" % style[1])
272 276
273 277
274 def writeCompletion(self, possibilities):
278 def write_completion(self, possibilities):
275 279 if self.autocomplete_mode == 'IPYTHON':
276 280 max_len = len(max(possibilities, key=len))
277 281 max_symbol = ' '*max_len
@@ -304,6 +308,7 b' class ConsoleWidget(editwindow.EditWindow):'
304 308 last_word = self.get_current_edit_buffer()
305 309 for breaker in splitter:
306 310 last_word = last_word.split(breaker)[-1]
311 self.AutoCompSetMaxHeight(len(possibilities))
307 312 self.AutoCompShow(len(last_word), " ".join(possibilities))
308 313
309 314
@@ -329,7 +334,7 b' class ConsoleWidget(editwindow.EditWindow):'
329 334 # Intercept some specific keys.
330 335 if event.KeyCode == ord('L') and event.ControlDown() :
331 336 self.scroll_to_bottom()
332 if event.KeyCode == ord('K') and event.ControlDown() :
337 elif event.KeyCode == ord('K') and event.ControlDown() :
333 338 self.replace_current_edit_buffer('')
334 339 elif event.KeyCode == wx.WXK_PAGEUP and event.ShiftDown():
335 340 self.ScrollPages(-1)
@@ -22,6 +22,7 b' __docformat__ = "restructuredtext en"'
22 22
23 23
24 24 import wx
25 import re
25 26 from console_widget import ConsoleWidget
26 27
27 28 from IPython.frontend.prefilterfrontend import PrefilterFrontEnd
@@ -48,7 +49,23 b' class IPythonWxController(PrefilterFrontEnd, ConsoleWidget):'
48 49
49 50 # Capture Character keys
50 51 self.Bind(wx.EVT_KEY_DOWN, self._on_key_down)
51
52
53
54 def do_completion(self):
55 line = self.get_current_edit_buffer()
56 completions = self.complete(line)
57 self.write_completion(completions)
58
59
60 def execute(self, *args, **kwargs):
61 self._cursor = wx.BusyCursor()
62 PrefilterFrontEnd.execute(self, *args, **kwargs)
63
64
65 def after_execute(self):
66 PrefilterFrontEnd.after_execute(self)
67 del self._cursor
68
52 69 #--------------------------------------------------------------------------
53 70 # Private API
54 71 #--------------------------------------------------------------------------
@@ -59,28 +76,37 b' class IPythonWxController(PrefilterFrontEnd, ConsoleWidget):'
59 76 widget handle them, and put our logic afterward.
60 77 """
61 78 current_line_number = self.GetCurrentLine()
62 # Up history
63 if event.KeyCode == wx.WXK_UP and (
64 ( current_line_number == self.current_prompt_line and
65 event.Modifiers in (wx.MOD_NONE, wx.MOD_WIN) )
66 or event.ControlDown() ):
67 new_buffer = self.get_history_previous(
68 self.get_current_edit_buffer())
69 if new_buffer is not None:
70 self.replace_current_edit_buffer(new_buffer)
71 if self.GetCurrentLine() > self.current_prompt_line:
72 # Go to first line, for seemless history up.
73 self.GotoPos(self.current_prompt_pos)
74 # Down history
75 elif event.KeyCode == wx.WXK_DOWN and (
76 ( current_line_number == self.LineCount -1 and
77 event.Modifiers in (wx.MOD_NONE, wx.MOD_WIN) )
78 or event.ControlDown() ):
79 new_buffer = self.get_history_next()
80 if new_buffer is not None:
81 self.replace_current_edit_buffer(new_buffer)
79 if self.AutoCompActive():
80 event.Skip()
82 81 else:
83 ConsoleWidget._on_key_down(self, event, skip=skip)
82 # Up history
83 if event.KeyCode == wx.WXK_UP and (
84 ( current_line_number == self.current_prompt_line and
85 event.Modifiers in (wx.MOD_NONE, wx.MOD_WIN) )
86 or event.ControlDown() ):
87 new_buffer = self.get_history_previous(
88 self.get_current_edit_buffer())
89 if new_buffer is not None:
90 self.replace_current_edit_buffer(new_buffer)
91 if self.GetCurrentLine() > self.current_prompt_line:
92 # Go to first line, for seemless history up.
93 self.GotoPos(self.current_prompt_pos)
94 # Down history
95 elif event.KeyCode == wx.WXK_DOWN and (
96 ( current_line_number == self.LineCount -1 and
97 event.Modifiers in (wx.MOD_NONE, wx.MOD_WIN) )
98 or event.ControlDown() ):
99 new_buffer = self.get_history_next()
100 if new_buffer is not None:
101 self.replace_current_edit_buffer(new_buffer)
102 elif event.KeyCode == ord('\t'):
103 last_line = self.get_current_edit_buffer().split('\n')[-1]
104 if not re.match(r'^\s*$', last_line):
105 self.do_completion()
106 else:
107 event.Skip()
108 else:
109 ConsoleWidget._on_key_down(self, event, skip=skip)
84 110
85 111
86 112
General Comments 0
You need to be logged in to leave comments. Login now