TL; DR
Если вы хотите суть, перейдите к режиму редактирования заголовка editing-mode vi (последний).
Но ждать! Тем не менее, может потребоваться довольно много фоновой информации: например, разница между editing-mode и keymap .
Особенно полезной является концепция гибридной раскладки ключей emacs для вставки текста и, в то же время, простой доступ к vi-command для внесения изменений.
В чем разница между editing-mode и keymap?
Есть только два editing-mode : emacs (по умолчанию) и vi .
Документация библиотеки GNU Readline гласит:
editing-mode
The editing-mode variable controls which default set of key bindings is
used. By default, Readline starts up in Emacs editing mode, where the
keystrokes are most similar to Emacs. This variable can be set to either
`emacs' or `vi'.
Обратите внимание на разницу между editing-mode и keymap: в editing-mode vi две (да, только две, читайте дальше) раскладки клавиш включаются и выключаются для эмуляции различных режимов редактора vi . ВСЕ emacs работают одновременно в editing-mode emacs (объяснено позже).
Так что же на самом деле делает editing-mode ? Он просто устанавливает активную раскладку ключей при запуске оболочки на emacs или vi-insert .
Какие уникальные раскладки клавиатуры?
Acceptable keymap names are emacs, emacs-standard, emacs-meta, emacs-ctlx,
vi, vi-move, vi-command, and vi-insert.
vi is equivalent to vi-command; emacs is equivalent to emacs-standard.
Хотя это не документировано, сочетания клавиш vi/vi-command и vi-move также эквивалентны:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
Это оставляет нам: emacs , emacs-meta , emacs-ctlx , vi и vi-insert качестве уникальных таблиц ключей для объяснения. Дифференцировать раскладки клавиш, вероятно, лучше всего, проверив их ...
Каковы привязки клавиш по умолчанию?
Чтобы просмотреть привязки по умолчанию для (например) emacs (по умолчанию), используйте:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -v '^#
Вы можете заменить emacs любым другим именем таблицы ключей в примере выше.
Есть много строк, в которых говорится, что self-insert или do-lowercase-version не очень полезны, поэтому удалите их:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort
В чем разница между различными таблицами ключей emacs ?
TL; DR: это разные виды одного набора отображений, применяемых к editing-mode emacs .
Если вам выход из второй команды в файлах , называемых emacs-standard emacs-meta emacs-ctlx vi-command и vi-insert для их соответствующего keymap s, вы можете узнать, что:
В emacs-meta и emacs-ctlx НЕТ команд, отображаемых в emacs-standard:
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-ctlx|sort)
$ comm -13 <(sed -r 's/.*: (\S+)/\1/' emacs-standard|sort) <(sed -r 's/.*: (\S+)/\1/' emacs-meta|sort)
$
Таким образом, emacs/emacs-standard - это функционально-функциональный расширенный набор как emacs-ctlx и emacs-meta Это означает, что:
keymap emacs
"\eg": glob-expand-word
"\C-x\C-r": re-read-init-file
Функционально эквивалентно:
keymap emacs-meta
"g": glob-expand-word
keymap emacs-ctlx
"\C-r": re-read-init-file
Вы можете утверждать, что вторую форму легче читать.
Вставка текста: emacs против vi-insert
В emacs-standard 28 команд, а не vi-insert
+ravi@boxy:~/lib/readline$ comm -12 vi-insert emacs-standard |wc -l
28
+ravi@boxy:~/lib/readline$
emacs/emacs-standard - это в основном расширенный набор vi-insert . Поэтому для ввода текста лучше всего использовать стандартную раскладку emacs-standard поверх vi-insert если вы можете легко переключаться между emacs и vi-command .
Единственные дополнительные привязки в vi-insert не входят в emacs-standard :
+ravi@boxy:~/lib/readline$ comm -23 vi-insert emacs-standard
"\C-d": vi-eof-maybe
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\e": vi-movement-mode
Первые 3 из этих четырех конфликтуют с привязками emacs :
"\C-d": delete-char
"\C-n": next-history
"\C-p": previous-history
который я решил следующим образом:
set keymap emacs
"\e": "kj" # see https://unix.stackexchange.com/questions/303631/how-can-i-setup-a-hybrid-readline-with-emacs-insert-mode-and-vi-command-mode
"\C-d": delete-char # eof-maybe: ^D does nothing if there is text on the line
"\C-n": menu-complete
"\C-p": menu-complete-backward
"\C-y": previous-history # historY
"\e\C-y": previous-history
editing-mode vi
Как мы видели выше, vi , vi-command и vi-move - это одна и та же таблица ключей:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
Обратите внимание, что всего две отдельные карты, которые по умолчанию связаны с editing-mode vi .
В editing-mode vi используемой keymap являются vi/vi-command/vi-move и vi-insert (начальная таблица ключей). Только одна из этих двух карт активна одновременно.
editing-mode vi при установке оболочки делает только набор ключей по умолчанию, помеченный как vi-insert . Опять же, одновременно активна только одна раскладка клавиш. Эта клавиатурная карта vi-insert отображает большинство клавиш для self-insert поэтому при нажатии на пластиковую кнопку на клавиатуре напечатанный на ней символ появляется на экране.
Карта vi-insert позволяет переключаться на карту манипулирования текстом, называемую vi-command/vi/vi-move с помощью команды vi-movement-mode , связанной с ключом ESC по умолчанию в карте ключей vi-insert .
На самом деле, даже emacs раскладка может установить vi -как обработки текста раскладку активной с помощью команды vi-movement-mode как в гибридном решении , упомянутых выше.
Или более простым языком ...
По умолчанию нажмите ESC, чтобы перейти к таблице ключей vi-command когда карта ключей vi-insert активна.
Таблица vi-command использует стандартные одиночные нажатия клавиш, такие как a, b и c, для перемещения и взаимодействия с текстом, как в режиме по умолчанию или в командном режиме редактора vi . Там нет , как правило , нет Ctrl+ комбинации клавиш. Вы не можете вставить текст в этом режиме; буквенные клавиши отображаются на команды редактирования / перемещения. Для ввода текста вы переключаетесь на карту клавиш vi-insert (пример: нажмите i для "Вставить").
Ввод текста осуществляется с помощью карты ключей vi-insert , которая активна при запуске оболочки, если у вас есть editing-mode vi в вашем файле .inputrc . Перейдите к карте клавиш vi-insert , нажав i для "вставки" в vi-command (или несколькими другими способами для тех, кто был инициирован в vi).
Если вы не знакомы с редактором vi , вам, вероятно, сначала будет трудно пользоваться клавишами vi-command , но если вы хорошо разбираетесь в этом, вы можете редактировать текст, как волшебник с длинной бородой.