TL; DR
Si quieres la esencia, salta al encabezado editing-mode vi
(el último).
¡Pero espera! Sin embargo, es posible que se necesite bastante información de fondo: por ejemplo, la diferencia entre an editing-mode
y a keymap
.
Particularmente útil es el concepto de un emacs
mapa de teclas híbrido para insertar texto y al mismo tiempo acceder fácilmente vi-command
para realizar cambios.
¿Cuál es la diferencia entre an editing-mode
y a keymap
?
Hay solamente dos editing-mode
s: emacs
(por defecto) y vi
.
La documentación de GNU Readline Library dice:
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'.
Tenga en cuenta la diferencia entre editing-mode
y keymap
: en editing-mode vi
los dos (sí, solo hay dos, siga leyendo) los mapas de teclas se intercambian para emular los diferentes modos del vi
editor. TODOS los emacs
que operan al mismo tiempo en editing-mode emacs
(explicado más adelante).
Entonces, ¿qué hace editing-mode
realmente? Simplemente establece el mapa de teclas activo al iniciar el shell en emacs
o vi-insert
.
¿Cuáles son los mapas de teclas únicos?
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.
Si bien no está documentado, vi
/ vi-command
y los vi-move
mapas de teclas también son equivalentes:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
Esto nos deja con: emacs
, emacs-meta
, emacs-ctlx
, vi
, y vi-insert
como mapas de teclas exclusivas para explicar. Probablemente lo mejor sea diferenciar los mapas de teclas inspeccionándolos ...
¿Cuáles son los enlaces predeterminados de los mapas de teclado?
Para ver las combinaciones de teclas predeterminadas para (por ejemplo) emacs (el predeterminado), use:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -v '^#
Puede reemplazarlo emacs
con cualquier otro nombre de mapa de teclas en el ejemplo anterior.
Hay muchas líneas que dicen self-insert
o do-lowercase-version
que no son muy útiles, así que para eliminarlas:
INPUTRC=~/dev/null bash -c 'bind -pm emacs' | grep -vE '^#|: (do-lowercase-version|self-insert)$' | sort
¿Cuál es la diferencia entre los distintos emacs
mapas de teclas?
TL; DR: son vistas diferentes en un solo conjunto de asignaciones aplicadas editing-mode emacs
.
Si la salida del segundo comando en los archivos de llamada emacs-standard
, emacs-meta
, emacs-ctlx
, vi-command
, y vi-insert
por sus correspondientes keymap
s, se puede descubrir que:
NO hay comandos asignados emacs-meta
y emacs-ctlx
que tampoco aparecen en 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)
$
Entonces emacs
/ emacs-standard
es un superconjunto funcionalmente funcional de ambos emacs-ctlx
y emacs-meta
esto significa que:
keymap emacs
"\eg": glob-expand-word
"\C-x\C-r": re-read-init-file
Es funcionalmente equivalente a:
keymap emacs-meta
"g": glob-expand-word
keymap emacs-ctlx
"\C-r": re-read-init-file
Podría argumentar que la segunda forma es más fácil de leer.
Insertar texto: emacs
vsvi-insert
Hay 28 comandos en emacs-standard
no envi-insert
+ravi@boxy:~/lib/readline$ comm -12 vi-insert emacs-standard |wc -l
28
+ravi@boxy:~/lib/readline$
emacs
/ emacs-standard
es básicamente un superconjunto de vi-insert
. Por lo tanto, para escribir texto, es mejor usar el emacs-standard
mapa de teclas vi-insert
siempre que pueda cambiar fácilmente entre emacs
yvi-command
.
Los únicos enlaces adicionales en vi-insert
not in emacs-standard
son:
+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
Los primeros 3 de estos cuatro conflictos con los emacs
enlaces:
"\C-d": delete-char
"\C-n": next-history
"\C-p": previous-history
que resolví de la siguiente manera:
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
Como hemos visto más arriba, vi
, vi-command
y vi-move
son uno y el mismo mapa de teclas:
+ravi@boxy:~$ diff <(bind -pm vi) <(bind -pm vi-move)
+ravi@boxy:~$
Tenga en cuenta que se trata de un total de solo dos mapas distintos que están asociados por defecto editing-mode vi
.
Cuando está en editing-mode vi
, los keymap
s en uso son vi
/ vi-command
/ vi-move
y vi-insert
(el mapa de teclas inicial). Solo uno de estos dos mapas está activo a la vez.
editing-mode vi
no hace nada más que establecer un mapa de teclas predeterminado cuando se inicia el shell, etiquetado vi-insert
. De nuevo, solo hay un mapa de teclas activo a la vez. Este vi-insert
mapa de teclas asigna la mayoría de las teclas de self-insert
modo que cuando presiona el botón de plástico en su teclado, el símbolo impreso aparece en su pantalla.
El vi-insert
mapa de teclas se permite cambiar al mapa de teclas manipulador de texto llamado vi-command
/ vi
/ vi-move
mediante el vi-movement-mode
comando, vinculado a la ESCtecla de forma predeterminada en el vi-insert
mapa de teclas .
En realidad, incluso el emacs
mapa de teclas puede activar el vi
mapa de teclas de manipulación de texto similar mediante el vi-movement-mode
comando, como en la solución híbrida mencionada anteriormente.
O en un lenguaje más fácil ...
De forma predeterminada, presione ESCpara cambiar al vi-command
mapa de teclas cuando el vi-insert
mapa de teclas esté activo.
El vi-command
mapa de teclas utiliza pulsaciones de teclas estándar, simples a, by cpara moverse e interactuar con el texto, al igual que el vi
modo predeterminado o de comando del editor. Generalmente no hay combinaciones Ctrl+ key. No puede insertar texto en este modo; las teclas de letras se asignan a comandos de edición / movimiento. Para escribir texto, cambie al vi-insert
mapa de teclas (ejemplo: presione ipara "Insertar").
El ingreso de texto se realiza utilizando el vi-insert
mapa de teclas, que está activo cuando se inicia el shell si tiene editing-mode vi
en su .inputrc
archivo. Cambie al vi-insert
mapa de teclas presionando i"insertar" mientras está en vi-command
(o de muchas otras maneras para aquellos iniciados en vi
).
A menos que conozca el vi
editor, es probable que encuentre vi-command
claves muy difíciles de usar al principio, pero si lo hace bien, puede editar el texto como un asistente de barba larga.