Как установить конкретные vim-привязки в Ipython 5.0.0
Я понимаю, что, поскольку Ipython 5.0.0 использует новую входную библиотеку (prompt_toolkit), он по умолчанию больше не работает в режиме редактора, указанном в.inputrc (*nix). Этот параметр должен быть установлен в файле конфигурации профиля Ipython (см. /questions/16506847/kak-ispolzovat-klyuchi-vi-v-ipython-pod-nix/16506853#16506853).
Мой вопрос: установив vi-mode в файле конфигурации профиля, как указать конкретную привязку клавиш? Например, мне нравится использовать jk для побега.
2 ответа
Ты прав. prompt_toolkit
игнорируемых .inputrc
, Кажется, нет способа определить пользовательские сочетания клавиш для vi
режим в файле конфигурации профиля IPython 5.0.0.
Вот обходной путь, который я сейчас использую. Это не красиво, но пока работает.
Согласно документации IPython, вы можете указать сочетания клавиш в сценарии конфигурации запуска.
Вместо переплета jk
в ESC
Я делаю юникод "j" (u'j'
) с последующим Unicode "K" (u'k'
) Внутри VimInsertMode()
ярлык для prompt_toolkit
событие, которое переключается в режим навигации.
Я создал .ipython/profile_default/startup/keybindings.py
со следующим кодом:
from IPython import get_ipython
from prompt_toolkit.enums import DEFAULT_BUFFER
from prompt_toolkit.filters import HasFocus, ViInsertMode
from prompt_toolkit.key_binding.vi_state import InputMode
ip = get_ipython()
def switch_to_navigation_mode(event):
vi_state = event.cli.vi_state
vi_state.reset(InputMode.NAVIGATION)
if getattr(ip, 'pt_cli'):
registry = ip.pt_cli.application.key_bindings_registry
registry.add_binding(u'j',u'k',
filter=(HasFocus(DEFAULT_BUFFER)
& ViInsertMode()))(switch_to_navigation_mode)
Источник prompt_toolkit поможет вам реализовать другие ярлыки по мере необходимости.
Это старая статья, но она помогла мне найти ответ, поэтому я решил опубликовать, как я добавил пару привязок в режим vi в ipython. Я добавил следующий код в ~/.ipython/profile_default/startup/00-keybindings.py для привязки к K и J в режиме навигации vi.
"""Improve history access so I can skip over functions"""
from IPython import get_ipython
from prompt_toolkit.enums import DEFAULT_BUFFER
from prompt_toolkit.filters import HasFocus, ViNavigationMode
from prompt_toolkit.key_binding.bindings.named_commands import get_by_name
ip = get_ipython()
registry = ip.pt_app.key_bindings
ph = get_by_name('previous-history')
nh = get_by_name('next-history')
registry.add_binding('K',
filter=(HasFocus(DEFAULT_BUFFER) &
ViNavigationMode()))(ph)
registry.add_binding('J',
filter=(HasFocus(DEFAULT_BUFFER) &
ViNavigationMode()))(nh)