Существует ли способ переключить Bash или zsh от режима Emacs до vi режима с нажатием клавиши?

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

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

9
задан iconoclast 4 February 2014 в 19:45
поделиться

2 ответа

Вы можете создать переключение, поскольку привязки клавиш разделены между режимом 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)
11
ответ дан 4 December 2019 в 11:04
поделиться

Ага! Я просмотрел исходный текст строки чтения и обнаружил, что вы можете это сделать:

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

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

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

Вот способ настройки, очистив текущую командную строку в процессе. Я знаю, что это не то, что вам нужно, но, возможно, это поможет кому-то другому, кто найдет этот вопрос. В ~ / .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

or toggle ... это должно сработать:

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

По сути, это псевдонимы, сделанные на один шаг дальше для сопоставления с ключами в строке чтения, так что вам не нужно вводить имя псевдонима и нажмите Enter.

5
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: