Я использую Bash в "режиме vi". Какая последовательность горячих клавиш для редактирования текущей командной строки с использованием внешнего редактора?

В Bash"Emacs mode" (set -o emacs), Я могу редактировать текущую командную строку в моем любимом внешнем $EDITOR. Все, что мне нужно сделать, это нажать Ctrl+X, а затем Ctrl+E.

Но, потому что я переключился на "режим vi" Баш (set -o vi), эта последовательность клавиш ничего не делает. В режиме "vi", как я могу запустить внешний редактор, чтобы составлять более длинные команды?

4 ответа

Решение

Привязка режима emacs выполняет команду edit-and-execute-command. Чтобы увидеть, какая привязка выполняет его в режиме vi, вы можете дать команду:

$ bind -m vi -q edit-and-execute-command
edit-and-execute-command is not bound to any keys.

Проще всего было бы добавить для него привязку

$ bind -m vi-insert '"\C-x\C-e": edit-and-execute-command'

Чтобы сделать его постоянным, вы можете добавить его в ~/.inputrc как

set keymap vi-insert
"\C-x\C-e": edit-and-execute-command

Ответ

Нажмите ESC, чтобы перейти в режим vi-command, затем нажмите v. Bash запустит выбранный вами $EDITOR. Если вы не выбрали один, Bash запустит vi (визуальный редактор).

объяснение

Почему Bash ESC v запускает vi?

Потому что Баш bashline.c включает вызов функции:

rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);

Что такое vi_edit_and_execute_command? Это функция Bash C, определенная в другом месте bashline.c,

Один в сторону. Я немного поэкспериментировал, и теперь я подозреваю, что это правда. Связывание функций Bash C странно. Вы можете сделать это из исходного кода Bash, но это невозможно сделать, используя bind встроенный в приглашении Bash. И, как только вы это сделали, bind встроенный, кажется, даже не признает, что это было сделано.

Я благодарю Karsten за то, что он указал на то, что ответом является ESC v, и dualbus и Riviera из Freenode #bash за то, что они помогли мне разобраться в объяснении выше.

Если вы хотите указать редактор по умолчанию как viтогда вам нужно установить переменную окружения EDITOR:

export EDITOR=vi

Теперь говорят, что Ctrl-XCtrl-E запустится vi,

Как отключить edit-and-execute-command для v введите режим vi\vi-command\vi-Movement:

Вы не можете привязать его к nop, поскольку он будет автоматически восстановлен (см. сообщение от unforgettableid). Вместо этого вы можете привязать его к set-mark если вы не используете это..inputrc:

set keymap vi-command
v: set-mark
# If you want to bind it to something else, e.g. Ctrl-v:
# "\C-v": edit-and-execute-command
Другие вопросы по тегам