Bash

如何在 readline 中切換到 vi 編輯模式?

  • November 19, 2021

我想在 readline 環境中切換到 vi 編輯模式。但我不想使用’set -o vi’。我想使用鍵盤快捷鍵臨時切換。手冊頁說我可以用M-C-j. 但這對我不起作用。

我正在使用 Ubuntu 和一個 xterm。在 gnome-terminal 下也不起作用。

Bash 明確禁用了這個和其他一些 Readline 快捷方式。查看initialize_readline()bash 原始碼中的函式(http://www.catonmat.net/download/bashline.c):

  /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
     so it is not necessary to allow C-M-j for context switching.  Turn
     off this occasionally confusing behaviour. */
  rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
  rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
#if defined (VI_MODE)
 rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
#endif

我似乎無法使用 Readline 配置文件 (.inputrc) 覆蓋此行為。

我會確認鍵盤映射Meta++Control實際上j在您的系統上是正確的。您可以使用此命令列出 Bash 各種模式的所有鍵綁定。在我的系統上也沒有鍵綁定。

$ bind -P| grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode is not bound to any keys

您可以執行以下操作,以便當您鍵入Esc+e時,它將在兩種模式之間切換。

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

bind命令現在顯示:

在那裡模式

$ bind -P |grep edit
edit-and-execute-command is not bound to any keys
emacs-editing-mode can be found on "\ee".
vi-editing-mode is not bound to any keys

在 emacs 模式下

$ bind -P |grep edit
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
vi-editing-mode can be found on "\ee".

現在您可以使用Esc+e在 2 種不同模式之間切換。

引用自:https://unix.stackexchange.com/questions/112406