Как использовать ключи vi в ipython под * nix?

97

В настоящее время в Bash я использую set -o viдля включения режима vi в командной строке bash.

Как мне добиться этого в ipython?

Примечание: если ответ относится ко всем * nix, я удалю OS X из названия :)

гак
источник

Ответы:

170

В случае, если кто-то недавно сюда зашел , IPython 5.0 переключился с readline на prompt_toolkit , поэтому обновленный ответ на этот вопрос - передать опцию:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... или установить его глобально в конфигурации профиля ( ~/.ipython/profile_default/ipython_config.py; создать его, ipython profile createесли у вас его нет) с помощью:

c.TerminalInteractiveShell.editing_mode = 'vi'
имирический
источник
4
Я пришел сюда, чтобы опубликовать этот ответ - спасибо, что
опередили
2
Спасибо. Это досадно сложно найти где-нибудь в документации по IPython, Jupyter или prompt_toolkit.
nth
2
Где я могу добавить свои собственные сопоставления привязки клавиш?
Aravinda
Мой ответ на этот вопрос показывает один способ добавить пользовательские привязки клавиш.
jellycola 09
2
Есть ли способ узнать, в нормальном ли я режиме или в режиме вставки?
Peeyush Kushwaha
32

Похоже, решение работает для многих других приложений, совместимых с readline:

Установите в своем ~/.inputrcфайле следующее:

set editing-mode vi
set keymap vi
set convert-meta on

Источник: http://www.jukie.net/bart/blog/20040326082602

гак
источник
7
Будьте очень осторожны с set convert-meta on. Он конфликтует с записью Unicode, поэтому, если вы вставляете или вводите unicode, вы можете запускать различные события, что может быть неожиданным. Например, попробуйте ввести ü, и вы увидите интересный результат.
minrk
4
Вы знаете, что делают последние две строчки? Быстрая проверка показывает, что только первая строка дает базовые сочетания клавиш vi - я хотел бы знать, есть ли причина для добавления остальных.
weronika
1
@weronika Похоже, это set keymap viменяет раскладку клавиатуры (т.е. режим), на которую будут влиять следующие команды , и set convert-meta onменяет поведение некоторых клавиш . Я не уверен, нужны ли они вам.
s4y 05
@weronika Итак, set convert-meta on(и все, что ниже этой строки) будет применяться только к командному режиму, а не к режиму вставки.
s4y 05
6
Примечание. Это больше не работает с IPython 5.0.0. См. Ответ @ imiric ниже.
Джейсон Сундрам
11

Вы также можете интерактивно переключаться между режимом Vi и режимом Emacs. Согласно документам readline, чтобы переключаться между ними, вы должны иметь возможность использовать комбинацию клавиш MCj, но это, похоже, позволяет мне переключиться в режим vi - на моем Mac (где ESC используется как клавиша `` Мета '' ) это: ESC+ CTRL+ j. Чтобы вернуться в режим Emacs, можно использовать Ce, но это, похоже, не сработало для меня - мне пришлось вместо этого выполнить MCe - на моем Mac это: ESC+ CTRL+ e.

К вашему сведению, мой ~ / .inputrc настроен следующим образом:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
Pierz
источник
Я все это время пытался понять, почему MCj не работал!
шансяо
9

ipythonиспользует библиотеку readline, и ее можно настроить с помощью ~/.inputrcфайла. Можете добавить

set editing-mode vi

в этот файл, чтобы все readlineбазирующиеся приложения использовали сочетания клавиш в стиле vi вместо Emacs.

Нуфаль Ибрагим
источник
9
ipythonперешли от readlineв библиотеку питона называется prompt_toolkitв 5.0.0так что это больше не работает.
jellycola 09
Спасибо, это было очень полезно для работы со старой версией IPython.
timgeb
8

Мне нужно было иметь возможность переключать режимы в интерактивном режиме в IPython 5, и я обнаружил, что это можно сделать, воссоздав менеджер подсказок на лету:

a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()
Лекс Р
источник
0

Вы можете установить vi в файле начальной конфигурации .ipython. Создайте его, если у вас его нет, добавив файл с ~/.ipython/profile_default/startup/именем что-то вроде start.py. Вот пример:

# Initializing script for ipython in ~/.ipython/profile_default/startup/
from IPython import get_ipython
ipython = get_ipython()

# If in ipython, set vi and load autoreload extension
if 'ipython' in globals():
    ipython.editing_mode = 'vi'
    ipython.magic('load_ext autoreload')
    ipython.magic('autoreload 2')
from Myapp.models import * 

Эта последняя строка предназначена для случая, когда вы используете ipython с Django и хотите импортировать все свои модели по умолчанию.

Грегори
источник