##// END OF EJS Templates
Make post-execution happen at the cell instead of the block level....
Make post-execution happen at the cell instead of the block level. This was the original intent of the design, and it's necessary if we want post-execute functions to be used to pick up things like figures at the end of an entire cell, rather than multiple times per cell (which defeats the purpose of the whole design).

File last commit:

r3728:66c6673f
r3732:54e4e463
Show More
history_console_widget.py
234 lines | 8.4 KiB | text/x-python | PythonLexer
/ IPython / frontend / qt / console / history_console_widget.py
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 # System library imports
Evan Patterson
Paved the way for PySide support....
r3304 from IPython.external.qt import QtGui
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
# Local imports
epatters
Add 'history_lock' setting to Qt console....
r3728 from IPython.utils.traitlets import Bool
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 from console_widget import ConsoleWidget
class HistoryConsoleWidget(ConsoleWidget):
""" A ConsoleWidget that keeps a history of the commands that have been
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 executed and provides a readline-esque interface to this history.
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 """
epatters
Add 'history_lock' setting to Qt console....
r3728
#------ Configuration ------------------------------------------------------
# If enabled, the input buffer will become "locked" to history movement when
# an edit is made to a multi-line input buffer. To override the lock, use
# Shift in conjunction with the standard history cycling keys.
history_lock = Bool(False, config=True)
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
#---------------------------------------------------------------------------
# 'object' interface
#---------------------------------------------------------------------------
def __init__(self, *args, **kw):
super(HistoryConsoleWidget, self).__init__(*args, **kw)
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
# HistoryConsoleWidget protected variables.
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 self._history = []
epatters
Temporarily save edits when moving through history in Qt console.
r3727 self._history_edits = {}
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 self._history_index = 0
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 self._history_prefix = ''
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
#---------------------------------------------------------------------------
# 'ConsoleWidget' public interface
#---------------------------------------------------------------------------
def execute(self, source=None, hidden=False, interactive=False):
""" Reimplemented to the store history.
"""
if not hidden:
history = self.input_buffer if source is None else source
executed = super(HistoryConsoleWidget, self).execute(
source, hidden, interactive)
if executed and not hidden:
# Save the command unless it was an empty string or was identical
# to the previous command.
history = history.rstrip()
if history and (not self._history or self._history[-1] != history):
self._history.append(history)
epatters
Temporarily save edits when moving through history in Qt console.
r3727 # Emulate readline: reset all history edits.
self._history_edits = {}
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 # Move the history index to the most recent item.
self._history_index = len(self._history)
return executed
#---------------------------------------------------------------------------
# 'ConsoleWidget' abstract interface
#---------------------------------------------------------------------------
epatters
Add 'history_lock' setting to Qt console....
r3728 def _up_pressed(self, shift_modifier):
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 """ Called when the up key is pressed. Returns whether to continue
processing the event.
"""
prompt_cursor = self._get_prompt_cursor()
if self._get_cursor().blockNumber() == prompt_cursor.blockNumber():
epatters
Add 'history_lock' setting to Qt console....
r3728 # Bail out if we're locked.
if self._history_locked() and not shift_modifier:
return False
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 # Set a search prefix based on the cursor position.
col = self._get_input_buffer_cursor_column()
input_buffer = self.input_buffer
if self._history_index == len(self._history) or \
(self._history_prefix and col != len(self._history_prefix)):
self._history_index = len(self._history)
self._history_prefix = input_buffer[:col]
# Perform the search.
self.history_previous(self._history_prefix)
# Go to the first line of the prompt for seemless history scrolling.
# Emulate readline: keep the cursor position fixed for a prefix
# search.
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 cursor = self._get_prompt_cursor()
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 if self._history_prefix:
cursor.movePosition(QtGui.QTextCursor.Right,
n=len(self._history_prefix))
else:
cursor.movePosition(QtGui.QTextCursor.EndOfLine)
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 self._set_cursor(cursor)
return False
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 return True
epatters
Add 'history_lock' setting to Qt console....
r3728 def _down_pressed(self, shift_modifier):
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 """ Called when the down key is pressed. Returns whether to continue
processing the event.
"""
end_cursor = self._get_end_cursor()
if self._get_cursor().blockNumber() == end_cursor.blockNumber():
epatters
Add 'history_lock' setting to Qt console....
r3728 # Bail out if we're locked.
if self._history_locked() and not shift_modifier:
return False
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
# Perform the search.
epatters
Add 'history_lock' setting to Qt console....
r3728 replaced = self.history_next(self._history_prefix)
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
# Emulate readline: keep the cursor position fixed for a prefix
# search. (We don't need to move the cursor to the end of the buffer
# in the other case because this happens automatically when the
# input buffer is set.)
epatters
Add 'history_lock' setting to Qt console....
r3728 if self._history_prefix and replaced:
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 cursor = self._get_prompt_cursor()
cursor.movePosition(QtGui.QTextCursor.Right,
n=len(self._history_prefix))
self._set_cursor(cursor)
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 return False
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 return True
#---------------------------------------------------------------------------
# 'HistoryConsoleWidget' public interface
#---------------------------------------------------------------------------
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 def history_previous(self, prefix=''):
epatters
Temporarily save edits when moving through history in Qt console.
r3727 """ If possible, set the input buffer to a previous history item.
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 Parameters:
-----------
prefix : str, optional
If specified, search for an item with this prefix.
epatters
Add 'history_lock' setting to Qt console....
r3728
Returns:
--------
Whether the input buffer was changed.
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 """
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 index = self._history_index
epatters
Add 'history_lock' setting to Qt console....
r3728 replace = False
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 while index > 0:
index -= 1
epatters
Temporarily save edits when moving through history in Qt console.
r3727 history = self._get_edited_history(index)
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 if history.startswith(prefix):
epatters
Add 'history_lock' setting to Qt console....
r3728 replace = True
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 break
Satrajit Ghosh
BF: history message had string keys, converted to create properly sorted history
r3244
epatters
Add 'history_lock' setting to Qt console....
r3728 if replace:
self._store_edits()
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 self._history_index = index
epatters
Add 'history_lock' setting to Qt console....
r3728 self.input_buffer = history
return replace
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
def history_next(self, prefix=''):
epatters
Temporarily save edits when moving through history in Qt console.
r3727 """ If possible, set the input buffer to a subsequent history item.
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
Parameters:
-----------
prefix : str, optional
If specified, search for an item with this prefix.
epatters
Add 'history_lock' setting to Qt console....
r3728
Returns:
--------
Whether the input buffer was changed.
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 """
epatters
Temporarily save edits when moving through history in Qt console.
r3727 index = self._history_index
epatters
Add 'history_lock' setting to Qt console....
r3728 replace = False
epatters
Temporarily save edits when moving through history in Qt console.
r3727 while self._history_index < len(self._history):
index += 1
history = self._get_edited_history(index)
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 if history.startswith(prefix):
epatters
Add 'history_lock' setting to Qt console....
r3728 replace = True
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 break
epatters
Add 'history_lock' setting to Qt console....
r3728
if replace:
self._store_edits()
epatters
Temporarily save edits when moving through history in Qt console.
r3727 self._history_index = index
epatters
Add 'history_lock' setting to Qt console....
r3728 self.input_buffer = history
return replace
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
epatters
Add history_tail method to ConsoleWidget for retreiving the local history.
r3516 def history_tail(self, n=10):
""" Get the local history list.
epatters
Temporarily save edits when moving through history in Qt console.
r3727 Parameters:
-----------
epatters
Add history_tail method to ConsoleWidget for retreiving the local history.
r3516 n : int
The (maximum) number of history items to get.
"""
return self._history[-n:]
epatters
Added support for Ctrl-Enter (unconditionally enter a newline) to ConsoleWidget....
r2985 #---------------------------------------------------------------------------
# 'HistoryConsoleWidget' protected interface
#---------------------------------------------------------------------------
epatters
Add 'history_lock' setting to Qt console....
r3728 def _history_locked(self):
""" Returns whether history movement is locked.
"""
return (self.history_lock and
(self._get_edited_history(self._history_index) !=
self.input_buffer) and
(self._get_prompt_cursor().blockNumber() !=
self._get_end_cursor().blockNumber()))
epatters
Temporarily save edits when moving through history in Qt console.
r3727 def _get_edited_history(self, index):
""" Retrieves a history item, possibly with temporary edits.
"""
if index in self._history_edits:
return self._history_edits[index]
epatters
Add 'history_lock' setting to Qt console....
r3728 elif index == len(self._history):
return unicode()
epatters
Temporarily save edits when moving through history in Qt console.
r3727 return self._history[index]
epatters
Added support for Ctrl-Enter (unconditionally enter a newline) to ConsoleWidget....
r2985 def _set_history(self, history):
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 """ Replace the current history with a sequence of history items.
"""
self._history = list(history)
epatters
Temporarily save edits when moving through history in Qt console.
r3727 self._history_edits = {}
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 self._history_index = len(self._history)
epatters
Add 'history_lock' setting to Qt console....
r3728
def _store_edits(self):
""" If there are edits to the current input buffer, store them.
"""
current = self.input_buffer
if self._history_index == len(self._history) or \
self._history[self._history_index] != current:
self._history_edits[self._history_index] = current