From c994bac7a587772b934bc02d4905d190c2c0c793 2010-08-23 22:30:54 From: epatters Date: 2010-08-23 22:30:54 Subject: [PATCH] The FrontendWidget now performs tab-completion more aggressively. --- diff --git a/IPython/frontend/qt/console/console_widget.py b/IPython/frontend/qt/console/console_widget.py index 59208ee..5ef10f9 100644 --- a/IPython/frontend/qt/console/console_widget.py +++ b/IPython/frontend/qt/console/console_widget.py @@ -641,8 +641,10 @@ class ConsoleWidget(QtGui.QWidget): elif key == QtCore.Qt.Key_Tab: if self._reading: intercepted = False + elif not self._tab_pressed(): + intercepted = True else: - intercepted = not self._tab_pressed() + intercepted = not self._in_buffer() elif key == QtCore.Qt.Key_Left: intercepted = not self._in_buffer(position - 1) @@ -968,11 +970,15 @@ class ConsoleWidget(QtGui.QWidget): cursor.endEditBlock() self._control.setTextCursor(cursor) - def _in_buffer(self, position): - """ Returns whether the given position is inside the editing region. + def _in_buffer(self, position=None): + """ Returns whether the current cursor (or, if specified, a position) is + inside the editing region. """ cursor = self._control.textCursor() - cursor.setPosition(position) + if position is None: + position = cursor.position() + else: + cursor.setPosition(position) line = cursor.blockNumber() prompt_line = self._get_prompt_cursor().blockNumber() if line == prompt_line: @@ -987,13 +993,12 @@ class ConsoleWidget(QtGui.QWidget): """ Ensures that the cursor is inside the editing region. Returns whether the cursor was moved. """ - cursor = self._control.textCursor() - if self._in_buffer(cursor.position()): - return False - else: + moved = not self._in_buffer() + if moved: + cursor = self._control.textCursor() cursor.movePosition(QtGui.QTextCursor.End) self._control.setTextCursor(cursor) - return True + return moved def _page(self, text): """ Displays text using the pager if it exceeds the height of the diff --git a/IPython/frontend/qt/console/frontend_widget.py b/IPython/frontend/qt/console/frontend_widget.py index 831b2b1..5a5f0f6 100644 --- a/IPython/frontend/qt/console/frontend_widget.py +++ b/IPython/frontend/qt/console/frontend_widget.py @@ -148,9 +148,16 @@ class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin): """ Called when the tab key is pressed. Returns whether to continue processing the event. """ - self._keep_cursor_in_buffer() - cursor = self._get_cursor() - return not self._complete() + # Perform tab completion if: + # 1) The cursor is in the input buffer. + # 2) There is a non-whitespace character before the cursor. + text = self._get_input_buffer_cursor_line() + if text is None: + return False + complete = bool(text[:self._get_input_buffer_cursor_column()].strip()) + if complete: + self._complete() + return not complete #--------------------------------------------------------------------------- # 'ConsoleWidget' protected interface