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
, но если вы хорошо разбираетесь в этом, вы можете редактировать текст, как волшебник с длинной бородой.