Я использую 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