From: Mark Wooding Date: Sat, 15 Jul 2017 13:49:10 +0000 (+0100) Subject: dot/ipython-key-bindings.py: Hack IPython's bogus keybindings. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/profile/commitdiff_plain/bff12eb1383898f758fcf19f3fc1a62846e4e963 dot/ipython-key-bindings.py: Hack IPython's bogus keybindings. Hopefully they're a bit less bogus now. Maybe. --- diff --git a/dot/ipython-key-bindings.py b/dot/ipython-key-bindings.py new file mode 100644 index 0000000..3f392fe --- /dev/null +++ b/dot/ipython-key-bindings.py @@ -0,0 +1,43 @@ +### -*-python -*- + +import IPython as IPY +import prompt_toolkit as PTK + +def ding(): + with open('/dev/tty', 'w') as f: f.write('\a') + +## Key bindings. Alas, IPython's attempt at Emacs keybindings is abysmal. +K = PTK.keys.Keys +F = PTK.filters +BUF = PTK.enums.DEFAULT_BUFFER +ipy = IPY.get_ipython() +try: pt = ipy.pt_cli +except AttributeError: pass +else: + reg = pt.application.key_bindings_registry + bind = PTK.key_binding.bindings.utils.create_handle_decorator(reg) + + def inhibit_history_search(buf, fn): + searchp, searchtext = buf.enable_history_search, buf.history_search_text + buf.enable_history_search = F.Never() + try: + fn() + finally: + buf.enable_history_search, buf.history_search_text = searchp, searchtext + @bind(K.ControlP) + def prev_line(ev): + buf = ev.current_buffer + if buf.document.cursor_position_row > 0: + buf.cursor_up() + elif not buf.selection_state: + inhibit_history_search(buf, lambda: buf.history_backward()) + @bind(K.ControlN) + def next_line(ev): + buf = ev.current_buffer + if buf.document.cursor_position_row < buf.document.line_count - 1: + buf.cursor_down() + elif not buf.selection_state: + inhibit_history_search(buf, lambda: buf.history_forward()) + + bind(K.Escape, u'p')(lambda ev: ev.current_buffer.history_backward()) + bind(K.Escape, u'n')(lambda ev: ev.current_buffer.history_forward()) diff --git a/setup b/setup index 0e1bcd2..98a93bd 100755 --- a/setup +++ b/setup @@ -136,6 +136,7 @@ dotfiles=" vimrc mg zile lesskey sqliterc parallel-config:.parallel/config ipython-config.py:.ipython/profile_default/ipython_config.py + ipython-key-bindings.py:.ipython/profile_default/startup/50-key-bindings.py ditz-config mailrc signature muttrc cgrc tigrc