Как использовать ключи 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


@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

Я все это время пытался понять, почему 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 и хотите импортировать все свои модели по умолчанию.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.