5

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

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

3 ответа3

8

Привязка режима 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
1

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

export EDITOR=vi

Теперь, говоря Ctrl-X, Ctrl-E запускает vi .

1

Ответ

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

объяснение

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

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

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 , кажется, даже не узнает, что это было сделано.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .