Uso de teclas VI para editar comandos de shell en UNIX

28

Solía ​​tener un compañero de trabajo que era realmente bueno en UNIX.

Me mostró cómo usar las combinaciones de teclas Vi para editar mis comandos de shell.

Colocó el comando en un archivo que se ejecutaba cada vez que iniciaba sesión.

Desde entonces, me mudé a un proyecto diferente.

Lamentablemente, no recuerdo cómo configurar esto.

¿Hay alguien aquí que sepa cómo usar las combinaciones de teclas Vi para editar comandos en el terminal?

¿Cómo puedo hacer que esa configuración sea permanente?

usuario919860
fuente

Respuestas:

31

¡Estás hablando de la mejor característica de la historia!

Puede usar los comandos vi para editar los comandos de shell (y el historial de comandos) agregando esto a su .bashrcarchivo:

set -o vi

También puede ejecutar ese comando desde la línea de comando para afectar solo su sesión actual.

Si no usa bash, sustituya el archivo rc apropiado por su shell.


Esto le permite usar comandos vi para editar cualquier comando ...

También puede usar jy kmoverse por su historial (después de presionar ESC).

También puede usar /(después de presionar ESC) para buscar comandos antiguos.

En otras palabras, para encontrar ese cpcomando superlargo que hiciste hace diez minutos:

ESC/cpENTER

Luego, puede recorrer todos los comandos coincidentes en su historial con ny N.

¡Todo esto me hace 10 billones de veces más productivo en la línea de comando!

jahroy
fuente
44
Bueno, en realidad no está usando vi, está usando comandos de teclado de estilo vi para la edición de líneas.
44
Claro ... ¡Supongo que la terminología adecuada es vi bindings in the shellla característica más grande jamás inventada!
jahroy
Cambiaría de enlaces emacs a enlaces vi si hubiera una manera de mostrar el modo. ¿Conoces una manera de hacer eso?
iconoclasta
Ellos, hay una manera de obligar jja ESCcomo solemos hacer en vim?
steveyang
@yangchenyun: tal vez esta pregunta ayude con eso: stackoverflow.com/questions/844862/… Personalmente no ato / modifico ninguno de los comandos, por lo que no estoy muy seguro de lo que estás preguntando.
jahroy
12

Si está usando bash, como ya respondieron jahroy y evil otto, puede usar

set -o vi

hacer que bash use comandos de edición de estilo vi.

Una vez que haya hecho esto, puede escribir Esc vpara iniciar el editor vi con un archivo temporal que contenga una copia de la línea de comando actual. Puede editar el comando, incluso reemplazarlo con varias líneas; cuando guarde el archivo ( :wq), el shell ejecutará los comandos editados.

Si tu prefieres

set -o emacs

puedes usar Ctl-XCtl-Epara hacer lo mismo. Utilizará su editor preferido $EDITOR, no necesariamente emacs.

(Personalmente, uso vi (en realidad, vim) para la mayor parte de mi edición, pero prefiero set -o emacsen el shell; activar y desactivar el modo de inserción es excelente para editar archivos, pero incómodo para comandos interactivos. YMMV).

Keith Thompson
fuente
¿Conoces la forma de volver al modo de edición normal evitando el estilo vi? Recuerdo haber tenido éxito con Bl Num, pero ahora no más; ¿Qué me estoy perdiendo?
piertoni
@piertoni: ¿ set -o emacsNo hace lo que quieres?
Keith Thompson el
Sí, funciona, perdí el punto, gracias
piertoni
10

Puede usar set -o vipara cambiar sus comandos de edición de línea como @jahroy publicado, pero puede estar pensando en el fccomando (disponible en bash y creo que ksh, pero probablemente no en tcsh), que colocará el comando anterior en un editor (FCEDIT o EDITOR , que probablemente haya configurado en vi) y luego ejecute el comando cuando salga del editor. Vea la página de manual o help fcpara más detalles, o simplemente pruébelo.

mal otto
fuente
55
alias r='fc -e -'es un alias valioso para volver a ejecutar comandos anteriores. fcPor sí solo se originó en Korn Shell, creo. Puede especificar comandos por número ( fc 123 129para editar los números de comando 123 a 129 en el historial). Puede especificar números relativos ( fc -10 -1para editar los últimos 10 comandos ingresados). Puede enumerar comandos anteriores con fc -l. Puede especificar un comando por prefijo con el ralias ( r makeejecuta la última invocación de make; también lo hace r msi no ha ejecutado un mvcomando desde la última vez que ejecutó make, etc.).
Jonathan Leffler
6

Para editar el comando utilizado más recientemente en vim e invocar una versión editada después de que el editor guarde y salga, use el fcshell incorporado. Sin ningún argumento hará lo siguiente:

  1. Crea un archivo temporal /tmpy lo llena con el comando escrito más recientemente
  2. Después de que el editor sale normalmente (con el código de salida 0) ejecuta el comando encontrado en ese archivo temporal y elimina este archivo. La versión editada se guarda en el historial como un comando habitual (al menos en zsh). No ejecuta nada si el editor sale con un código que no sea cero (en vim, esto se puede lograr eliminándolo o usando :cquit).

El comando funciona tanto en bash como en zsh.

ZyX
fuente
5

De hecho, esta es de hecho la mejor característica de la historia. Sin embargo, hay más:

Crea un archivo llamado

.editrc

que contiene la línea

bind -v

Editline , es una biblioteca de versiones con licencia BSD que proporciona servicios de tipo readline. Ese .editrc establecerá sus combinaciones de teclas en modo vi en el shell de la línea de comandos de MySQL, o en cualquier aplicación que no use readline.

Me he vuelto un tanto olvidadizo con el paso de los años, por lo que mi .zshrc obtiene algunos contenedores para el modo vi, para mostrarme en qué modo estoy en la línea de comandos. Es agradable.

Sé que en zsh puedes escribir

bindkey -L

y obtener la lista de combinaciones de teclas. Estoy seguro de que bash debe tener algo similar. No todas las teclas vi están vinculadas por defecto. Átalos como mejor te parezca y saldrás a las carreras.

chiggsy
fuente
¡Ojalá pudiera votar esto 5 veces para enlaces vi en MySQL!
jahroy
1

en su terminal, escriba export EDITOR=vi.

Para guardar esta configuración. poner esta línea en el archivo ~ / .profile


fuente
55
Eso establece su editor predeterminado (para los comandos que prestan atención $EDITOR) a vi. No te permite editar comandos de shell con vi(al menos no directamente).
Keith Thompson
2
@KeithThompson Zsh pasa al modo de edición vi si $EDITORcontiene vi. Creo que es el único caparazón que hace esto.
Gilles 'SO- deja de ser malvado'