##// END OF EJS Templates
make sure to encode URL components for API requests...
make sure to encode URL components for API requests notebook names can have spaces, hashes, other special characters.

File last commit:

r13587:210d5e2f
r13693:4daff2b9
Show More
history_console_widget.py
305 lines | 11.5 KiB | text/x-python | PythonLexer
/ IPython / 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
Thomas Kluyver
Replace references to unicode and basestring
r13353 from IPython.utils.py3compat import unicode_type
epatters
Add 'history_lock' setting to Qt console....
r3728 from IPython.utils.traitlets import Bool
Thomas Kluyver
Use explicit relative imports...
r13347 from .console_widget import ConsoleWidget
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983
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)
Bernardo B. Marques
remove all trailling spaces
r4872
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:
Bernardo B. Marques
remove all trailling spaces
r4872 # Save the command unless it was an empty string or was identical
epatters
Moved HistoryConsoleWidget to its own file to make console_widget.py a little smaller.
r2983 # 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
MinRK
tweak history prefix search (up/^p) in qtconsole...
r9205 # use the *shortest* of the cursor column and the history prefix
# to determine if the prefix has changed
n = min(col, len(self._history_prefix))
# prefix changed, restart search from the beginning
if (self._history_prefix[:n] != input_buffer[:n]):
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 self._history_index = len(self._history)
MinRK
tweak history prefix search (up/^p) in qtconsole...
r9205
# the only time we shouldn't set the history prefix
# to the line up to the cursor is if we are already
# in a simple scroll (no prefix),
# and the cursor is at the end of the first line
MinRK
fix qtconsole history logic for end-of-line...
r9704
# check if we are at the end of the first line
MinRK
wrong cursor
r9705 c = self._get_cursor()
MinRK
fix qtconsole history logic for end-of-line...
r9704 current_pos = c.position()
c.movePosition(QtGui.QTextCursor.EndOfLine)
at_eol = (c.position() == current_pos)
MinRK
tweak history prefix search (up/^p) in qtconsole...
r9205 if self._history_index == len(self._history) or \
MinRK
fix qtconsole history logic for end-of-line...
r9704 not (self._history_prefix == '' and at_eol) or \
MinRK
check whether line was edited in qt history scroll...
r9434 not (self._get_edited_history(self._history_index)[:col] == input_buffer[:col]):
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 self._history_prefix = input_buffer[:col]
# Perform the search.
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 self.history_previous(self._history_prefix,
as_prefix=not shift_modifier)
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984
# 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:
Bernardo B. Marques
remove all trailling spaces
r4872 cursor.movePosition(QtGui.QTextCursor.Right,
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 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.
Bernardo B. Marques
remove all trailling spaces
r4872 replaced = self.history_next(self._history_prefix,
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 as_prefix=not shift_modifier)
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()
Bernardo B. Marques
remove all trailling spaces
r4872 cursor.movePosition(QtGui.QTextCursor.Right,
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 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
#---------------------------------------------------------------------------
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 def history_previous(self, substring='', as_prefix=True):
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
Thomas Kluyver
Clean up numpydoc section headers
r13587 Parameters
----------
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 substring : str, optional
If specified, search for an item with this substring.
as_prefix : bool, optional
If True, the substring must match at the beginning (default).
epatters
Add 'history_lock' setting to Qt console....
r3728
Thomas Kluyver
Clean up numpydoc section headers
r13587 Returns
-------
epatters
Add 'history_lock' setting to Qt console....
r3728 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)
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 if (as_prefix and history.startswith(substring)) \
or (not as_prefix and substring in history):
epatters
Add 'history_lock' setting to Qt console....
r3728 replace = True
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 break
Bernardo B. Marques
remove all trailling spaces
r4872
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
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 def history_next(self, substring='', as_prefix=True):
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
Thomas Kluyver
Clean up numpydoc section headers
r13587 Parameters
----------
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 substring : str, optional
If specified, search for an item with this substring.
as_prefix : bool, optional
If True, the substring must match at the beginning (default).
epatters
Add 'history_lock' setting to Qt console....
r3728
Thomas Kluyver
Clean up numpydoc section headers
r13587 Returns
-------
epatters
Add 'history_lock' setting to Qt console....
r3728 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
MinRK
fix typo in qtconsole history_next...
r9206 while index < len(self._history):
epatters
Temporarily save edits when moving through history in Qt console.
r3727 index += 1
history = self._get_edited_history(index)
Benjamin Thyreau
Navigating history holding shift make searches match even if non-prefix
r4481 if (as_prefix and history.startswith(substring)) \
or (not as_prefix and substring in history):
epatters
Add 'history_lock' setting to Qt console....
r3728 replace = True
epatters
First cut at support readline-esque history filtering in ConsoleWidget.
r2984 break
Bernardo B. Marques
remove all trailling spaces
r4872
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.
Thomas Kluyver
Clean up numpydoc section headers
r13587 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:]
Bernardo B. Marques
remove all trailling spaces
r4872
Matthias BUSSONNIER
Improve 'save history' menu (%save)...
r5030 def _request_update_session_history_length(self):
MinRK
update Qt to use KernelClient
r10288 msg_id = self.kernel_client.shell_channel.execute('',
Matthias BUSSONNIER
Improve 'save history' menu (%save)...
r5030 silent=True,
user_expressions={
'hlen':'len(get_ipython().history_manager.input_hist_raw)',
}
)
Matthias BUSSONNIER
qtconsole: fix race-cond, handle multiple exec...
r5506 self._request_info['execute'][msg_id] = self._ExecutionRequest(msg_id, 'save_magic')
Matthias BUSSONNIER
Improve 'save history' menu (%save)...
r5030
def _handle_execute_reply(self, msg):
""" Handles replies for code execution, here only session history length
"""
Matthias BUSSONNIER
qtconsole: fix race-cond, handle multiple exec...
r5506 msg_id = msg['parent_header']['msg_id']
Puneeth Chaganti
BUG: Minor typo in history_console_widget.py
r5846 info = self._request_info['execute'].pop(msg_id,None)
Matthias BUSSONNIER
fix to minrk suggestion
r5520 if info and info.kind == 'save_magic' and not self._hidden:
content = msg['content']
status = content['status']
if status == 'ok':
MinRK
update qtconsole with user_expressions changes...
r10681 self._max_session_history = int(
content['user_expressions']['hlen']['data']['text/plain']
)
Matthias BUSSONNIER
Improve 'save history' menu (%save)...
r5030
Matthias BUSSONNIER
create menu bar on OSX with some action...
r5027 def save_magic(self):
Matthias BUSSONNIER
Improve 'save history' menu (%save)...
r5030 # update the session history length
self._request_update_session_history_length()
file_name,extFilter = QtGui.QFileDialog.getSaveFileName(self,
"Enter A filename",
filter='Python File (*.py);; All files (*.*)'
)
# let's the user search/type for a file name, while the history length
# is fetched
if file_name:
Matthias BUSSONNIER
create menu bar on OSX with some action...
r5027 hist_range, ok = QtGui.QInputDialog.getText(self,
'Please enter an interval of command to save',
'Saving commands:',
Matthias BUSSONNIER
Improve 'save history' menu (%save)...
r5030 text=str('1-'+str(self._max_session_history))
)
Matthias BUSSONNIER
create menu bar on OSX with some action...
r5027 if ok:
Matthias BUSSONNIER
remove duplicate function "pasteMagic", and change code not to use it
r5046 self.execute("%save"+" "+file_name+" "+str(hist_range))
Matthias BUSSONNIER
create menu bar on OSX with some action...
r5027
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.
"""
Bernardo B. Marques
remove all trailling spaces
r4872 return (self.history_lock and
(self._get_edited_history(self._history_index) !=
epatters
Add 'history_lock' setting to Qt console....
r3728 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):
Thomas Kluyver
Replace references to unicode and basestring
r13353 return unicode_type()
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