Esta pregunta se sigue directamente de la respuesta . En este caso, específicamente no puedo entender la parte que dice:
En ese sentido, su comportamiento está más cerca de emacs 'que con el modo bash (readline) / ksh / zsh emacs, pero se aparta del editor de línea incorporado del controlador de terminal (en modo canónico), donde Ctrl-Welimina la palabra anterior (borrar, también en vi )
Aquí estamos hablando de shells y no editores, que son dos programas completamente diferentes. ¿Qué significa decir que Shell está en modo editor?
PD: Puede basar su respuesta en la premisa de que entiendo qué es un shell y cómo usar vim para la edición básica.

Respuestas:
En el modo "vi" puede editar / navegar en el indicador de shell actual como una línea en el editor vi. Puedes verlo como un archivo de texto de una línea. De manera análoga, en el modo "emacs" puede editar / navegar por la línea de comando actual utilizando (algunos) los accesos directos de Emacs.
Ejemplo
Por ejemplo, en modo vi puedes hacer algo como (en bash):
En el modo emacs, puede presionar, por ejemplo, Ctrl+ Apara saltar al comienzo de una línea (vi: Ctrl+ [, 0o ESC, 0). Puede activar el modo emacs mediante
set -o emacs(en bash, ksh, zsh, etc.).Readline
Muchos programas de línea de comandos interactivos (incluido bash ) usan la biblioteca readline . Por lo tanto, puede configurar qué modo de entrada usar (vi o emacs) y otras opciones en un solo lugar, de modo que cada programa que use readline tenga exactamente la misma interfaz de edición / navegación.
Por ejemplo, mi configuración de línea de lectura se ve así:
Por ejemplo, zsh / ksh no usa readline hasta donde yo sé, sino que también admite modos vi / emacs que son muy parecidos al bash / readline.
Por supuesto, el modo vi / emacs en un shell de línea de comandos es solo un subconjunto del conjunto completo de características del editor. No todas las características tienen sentido en una línea de comandos, y algunas características son más complicadas de soportar que otras.
Modo canónico
Antes de que se 'inventaran' los modos vi / emacs de los shells interactivos de la línea de comandos, su shell usaría solo el modo canónico de su terminal, que solo proporciona un conjunto limitado de comandos de edición (por ejemplo, Ctrl+ Wpara eliminar la última palabra.
fuente
set -o | grep 'emacs\|vi'. Sin embargo, en zsh (donde tengo modo vi) esto no funciona.Notarás que cuando ejecutas
catun indicador de comandos de shell en un terminal,catse supone que debes escribir para stdout lo que lee de stdin, y presionas a, ves unaeco del controlador del terminal, perocatno escribe esoa(ves solo unoa, el que hizo eco el controlador de terminal).Sin embargo, si escribe a Backspace b Enter, no verá
catsalidaa\010b\015, perob\012(by nueva línea).Esto se debe a que el controlador de terminal (estamos hablando de software en el núcleo, no en el emulador de terminal
xterm) implementa un editor de línea muy básico cuando está en modo canónico . El controlador de terminal se puede configurar medianteioctl()llamadas al sistema, como cuando se usa elsttycomando. Por ejemplo, para salir del modo canónico, puedes hacerlostty -icanon. Si lo haces:Luego, verá tanto la
echo(que podría haber deshabilitado constty -echo) como lacatsalida al mismo tiempo.Ese editor es un editor de línea. Es decir, corresponde al usuario editar una línea de texto hasta que se envíe a la aplicación que lee el dispositivo terminal al presionar Enter.
Las capacidades de edición de ese editor son muy limitadas. En la mayoría de las implementaciones, solo hay 4 teclas de edición (en realidad caracteres) también configurables con
stty:^Ho^?generalmente): borra el carácter anterior^Ugeneralmente): vacía (kill) la línea ingresada hasta ahora^W): borra la palabra anterior^V): ingrese el siguiente carácter literalmente (cancele el significado especial de todo lo anterior)En los viejos tiempos, se pensaba que ese editor de línea de controlador de terminal se ampliaría con capacidades más sofisticadas. Es por eso que ninguno de los primeros shells tiene capacidades de edición de línea de comando (obtendría las mismas capacidades de edición de línea en el indicador de shell que cuando se ejecuta
catcomo lo hicimos anteriormente).Sin embargo, eso realmente nunca sucedió, tal vez parte de la razón es el desorden con diferentes terminales que no envían los mismos caracteres al presionar algunas teclas, lo que hizo evidente que eso no debería implementarse en el espacio del núcleo.
Entonces, algunos shells comenzaron a abandonar el modo canónico del controlador de terminal e implementaron su propio editor de línea. En ese momento,
emacsyvieran los editores de texto visual más populares con un modo de operación y enlace de teclas completamente diferente. Envi, tiene un modo para ingresar texto y otro para editar. Enemacs, siempre está ingresando al modo de texto , pero la edición se realiza presionando combinaciones de teclas (como^bmover el carácter hacia atrás).No tenía sentido que los proyectiles en el momento presentaran sus propias ataduras de teclas diferentes. Eso habría provocado la frustración de que las personas tuvieran que aprender una diferente. Sin embargo, elegir un (
emacsovi) estilo sobre el otro habría sido una forma segura de alienar a los usuarios del otro editor.De acuerdo con https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.a :
Por lo tanto, implementaron ambos y una interfaz para que los usuarios elijan entre los dos.
kshfue probablemente el primero a principios de los años 80 (reutilizando el código que se había escrito por separado para agregar un modo vi y un modo emacs al shell Bourne como se ve arriba) seguido detcsh(tcshinicialmente solo teníaemacsenlace de teclas, elvimodo se agregó más tarde) y más tardebashyzsha principios de los 90.Cambia entre los dos modos en
bash,zshokshconset -o vioset -o emacs, y conbindkey -eobindkey -ventcshozsh.POSIX realmente especifica el
vimodo y no elemacsmodo parash(la historia dice que Richard Stallman se opuso a que POSIX especificara elemacsmodo parash).El modo predeterminado para
bash, las variantes de dominio público deksh(pdksh, mksh, oksh),tcshyzshes el modo emacs (aunque conzsh, esvisi$EDITORes tuyovi), mientras que en AT&Tksh, es el modo tonto a menos$EDITORo$VISUALmencionavioemacs.kshTambién más tarde se agregó ungmacsmodo para acomodar a los usuarios de Goslingemacsque se manejan de manera Ctrl+Tdiferente.Ahora, el manejo de
^Wenemacso entcshmodo emacs probablemente sea anterior alwerasepersonaje en el editor de línea de terminal, por lo que realmente no podemos culparlos por eso y mi declaración sobre "partir ..." puede verse como engañosa. Es solo que me resulta irritante cuando las cosas comoemacs,tcsho seinfocomportan de manera diferente a todo lo demás cuando escribes Ctrl-W. Puedes imaginar que me pareció mucho más irritante cuando algunas aplicaciones comenzaron a cerrar su ventana cuando escribías Ctrl-W.fuente
pdkshTambién analiza$EDITORparaviy cambia de modo durante el inicio; Lo eliminé paramksh(especialmente porque de todos modos solo mantengo el modo Emacs).^Wcerrar ventanas).