¿Cómo edito líneas anteriores en un comando de varias líneas en Bash?

24

Al ingresar un comando que abarca varias líneas en Bash, ¿cómo edito las líneas anteriores? Soy un usuario de Linux Mint (Lisa) que usa el Terminal GNOME.

Por ejemplo, digamos que escribo:

$ echo "foo bar
> baz
>

Y luego, cuando estoy a punto de escribir la tercera línea del comando, de repente me doy cuenta de que quiero que "foo" y "bar" estén en líneas separadas. ¿Cómo reposicionaría mi cursor entre "foo" y "bar" para poder presionar enter y ponerlos en líneas separadas?

(No es fácil como podría pensar. La flecha hacia arriba no funciona, tampoco lo hace Ctrl-P. ¡Así que por favor, pruébelo antes de publicar! ¡Gracias!)

Asher Walther
fuente
La respuesta aceptada dice que no hay solución, pero la hay. Ver abajo
cdosborn

Respuestas:

16

Eso, desafortunadamente, depende de bash, no a la terminal. Sus opciones son:

  1. Use punto y coma en lugar de líneas nuevas, aunque incluso así no puede subir una línea de pantalla a la vez, sino que debe usar comandos de movimiento de caracteres o palabras. (Curiosamente, zshal menos te permite moverte dentro de un comando compuesto al editar el historial, pero no dentro del comando actual ). A veces fc(que te arroja a tu editor con el comando anterior) es la forma más fácil de manejar comandos compuestos.

  2. Si está utilizando Bash, use la siguiente combinación de teclas:

    ctrl x e

    Se abrirá el comando en el que está trabajando usando su editor de texto. Guarde el archivo y salga. (Encontré el comando en la presentación del Shell Hater ). Los usuarios de Zsh tienen esta alternativa .

geekosaur
fuente
1
La página de manual de bash explica cómo cambiar qué editor se utiliza: comando de edición y ejecución (C-xC-e): invoque un editor en la línea de comandos actual y ejecute el resultado como comandos de shell. Bash intenta invocar $ VISUAL, $ EDITOR y emacs como editor, en ese orden.
Mateo
Hay una solución, sin abrir el editor.
cdosborn
Técnicamente no depende de bash, sino de la biblioteca "readline" que bash usa para obtener entradas.
Christian Herenz
11

La solución es no ingresar nunca un comando hasta que la multilínea sea correcta, simplemente escriba: CtrlvCtrlj cuando desee pasar a la siguiente línea. Metabpara retroceder una palabra.

solución

crédito a la respuesta de @ rici

cdosborn
fuente
4

Curiosamente, Ctrl+Ces lo que estás buscando.

cuando estas en

$ echo "foo bar
> baz
>

simplemente presione Ctrl+C(la línea de comando editada se suspenderá) y presione Up(anterior-historial). Su mensaje será: (tenga en cuenta la ausencia de>)

$ echo "foo bar
baz

Ahora puedes moverte Left Rightincluso con saltos de línea.

Solo hay un capricho, debes estar en el último personaje para agregar otra línea, así que muévete para editar las líneas existentes (ve al principio Ctrl+A) y presiona Enter si es suficiente o ve al final ( Ctrl+E) para agregar más líneas Enter. Otro inconveniente es que Ctrl+_(deshacer) solo restaura los cambios del últimoCtrl+C

albfan
fuente
-2

Copie los comandos y péguelos en el bloc de notas y luego formatee desde allí. Después de eso, puede copiar sus comandos nuevamente a la terminal.

Pacheko
fuente