Skip to content

Instantly share code, notes, and snippets.

Last active August 11, 2016 20:24
What would you like to do?
IPython 5 startup file that makes the cursor wrap around lines when editing multiline input.
def set_terminal_keybindings():
"""If IPython is running in the classic terminal mode, this function
is called once, and is not called otherwise. We could have just used
an if-block, but this way also keeps the variables local."""
from prompt_toolkit.keys import Keys
from prompt_toolkit.filters import Filter
class StartOfLine(Filter):
"""Filter for checking whether the cursor is at the start of a
line (other than the first line) in a multiline input."""
def __call__(self, cli):
document = cli.current_buffer.document
offset = len(document.current_line_before_cursor)
at_top = document.on_first_line
return bool(offset == 0 and not at_top)
class EndOfLine(Filter):
"""Filter for checking whether the cursor is at the end of a
line (other than the last line) in a multiline input."""
def __call__(self, cli):
document = cli.current_buffer.document
at_end = document.is_cursor_at_the_end_of_line
at_bottom = document.is_cursor_at_the_end
return bool(at_end and not at_bottom)
def wrap_cursor_forwards(event):
"""Move the cursor to the start of the next line."""
buff = event.cli.current_buffer
relative_start_index = buff.document.get_start_of_line_position()
def wrap_cursor_backwards(event):
"""Move the cursor to the end of the previous line."""
buff = event.cli.current_buffer
relative_end_index = buff.document.get_end_of_line_position()
bind_key = ip.pt_cli.application.key_bindings_registry.add_binding
bind_key(Keys.Right, filter=EndOfLine())(wrap_cursor_forwards)
bind_key(Keys.Left, filter=StartOfLine())(wrap_cursor_backwards)
ip = get_ipython()
if getattr(ip, "pt_cli"): set_terminal_keybindings()
del set_terminal_keybindings
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment