7

Страница man readline(3) перечисляет эти четыре (vi, vi-move, vi-command, vi-insert) как возможные опции для настройки keymap . Я попытался установить эти различные параметры, и они, кажется, не имеют никакого эффекта помимо того, что делает set editing-mode vi .

Вероятно, самый краткий способ ответить на этот вопрос - дать пример того, как изменение keymap имеет значение.

Цитата из справочной страницы:

keymap (emacs)
          Set the current readline keymap.  The set of legal keymap  names
          is  emacs,  emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
          vi-command, and vi-insert.   vi  is  equivalent  to  vi-command;
          <<snip>>

2 ответа2

2

Это разные раскладки клавиш в режиме vi. Например, мои .inputrc наборы keymap связать ключи в различных режимах. Выдержка:

# insert mode bindings
set keymap vi-insert
"\C-p": previous-history
"\C-n": next-history

# command mode bindings
set keymap vi-command
"|": beginning-of-line
"_": vi-first-print
2

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

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