Есть ли способ переключить Bash или Zsh из режима Emacs в режим vi нажатием клавиши? - PullRequest
9 голосов
/ 14 апреля 2010

Я бы хотел иметь возможность временно переключиться из режима emacs в режим vi, поскольку режим vi лучше иногда , но обычно я наполовину набираю что-то, прежде чем понимаю, что хочу используйте режим vi.

Я не хочу постоянно переключаться в режим vi, потому что я обычно предпочитаю режим emacs в командной строке, в основном потому, что это то, к чему я привык, и с годами многие нажатия клавиш стали второй натурой. (В качестве редактора я обычно использую emacs в режиме viper, так что я могу использовать и vi, и нажатия клавиш emacs, так как я обнаружил, что случайно использую их в vi все время и путаю, и потому что в в некоторых случаях я считаю нажатия клавиш vi более запоминающимися и удобными, а в других случаях emacs.)

Ответы [ 3 ]

11 голосов
/ 15 апреля 2010

Вы можете создать переключатель, поскольку привязки клавиш разделены между режимами vi и emacs.

$ set -o emacs
$ bind '"\ee": vi-editing-mode'
$ set -o vi
$ bind '"\ee": emacs-editing-mode'

Теперь Alt-e (или Esc e) будет переключаться между режимами.

Добавьте это где-то в вашем определении для PS1, чтобы в вашем приглашении был индикатор того, в каком режиме вы находитесь. Он не будет отображать изменение сразу при переключении режимов, но будет обновляться при появлении нового приглашения. выдается.

$(set -o | grep emacs.*on >/dev/null 2>&1 && echo E || echo V)
5 голосов
/ 14 апреля 2010

Aha! Я посмотрел на источник readline и обнаружил, что вы можете сделать это:

 "\M-v": vi-editing-mode
 "\M-e": emacs-editing-mode

Похоже, что переключения нет, но этого, вероятно, достаточно хорошо!

Ради потомков, вот мой оригинальный ответ, который может быть полезен людям, пытающимся делать вещи, для которых нет функции readline.

Вот способ, которым вы можете настроить его, очистив текущую командную строку в процессе. Не то, что вы хотите, я знаю, но, возможно, это поможет кому-то еще, кто найдет этот вопрос. В ~ / .inputrc:

"\M-v": "\C-k\C-uset -o vi\C-j" # alt (meta)-v: set vi mode
"\M-e": "\C-k\C-uset -o vi\C-j" # alt (meta)-e: set emacs mode

или для переключения ... это должно работать:

"\M-t": "\C-k\C-u[[ \"$SHELLOPTS\" =~ '\\bemacs\\b' ]] && set -o vi || set -o emacs\C-j"

Это, по сути, псевдонимы, сделанные на один шаг дальше для сопоставления с ключами в readline, чтобы вам не приходилось вводить псевдоним и нажимать ввод.

3 голосов
/ 16 августа 2016

Следующие .inputrc строки позволяют Meta / Alt + E переключаться между режимами emacs и vi-insert.

Мышление одновременно j и k приведет вас в режим vi-command.

Примечание: единственное английское слово с "kj" - это "блэкджек", никакие слова не содержат "jk")

set keymap emacs
"\ee": vi-editing-mode
"jk": "\eejk"
"kj": "\eejk"

set keymap vi-insert
"\ee": emacs-editing-mode
"jk": vi-movement-mode
"kj": vi-movement-mode

set keymap vi-command
"\ee": emacs-editing-mode

Примечание. Если вы добавите привязку в keymap emacs к vi-movement-mode, чтобы попытаться перейти прямо в режим vi-command, приглашение не обновится, если у вас есть show-mode-in-prompt on, поэтому необходим вышеуказанный обходной путь .

...