En Bash, ¿puedo copiar el último argumento escrito en la posición del cursor?

6

Supongamos que tengo lo siguiente en mi terminal:

> cp my_file_name originals/#

Donde #representa el cursor.

¿Hay una combinación de teclas para insertar my_file_nameen la posición del cursor, para que no tenga que volver a escribirla? Soy consciente de ALT+ .para obtener el último argumento del comando anterior, ¡pero quiero el argumento anterior del comando actual!

Rico
fuente
1
Tal vez me estoy perdiendo algo, pero ¿no cp myfile orginals/hace exactamente lo mismo que cp myfile originals/myfile?
frabjous
Tienes toda la razón: es un mal ejemplo, pero es un ejemplo simple de lo que quiero :) Necesito hacer lo mismo en situaciones en las que los originales / no son lo suficientemente claros.
Rico
Yo también desearía que hubiera un equivalente de Zsh copy-prev-shell-word:(
Sridhar Sarnobat

Respuestas:

9

Una forma de hacerlo es mediante la expansión de llaves :

cp {,originals/}my_file_name
mkarasek
fuente
+1. Acabo de pasar 5 minutos intentando el archivo cp {, / orig}. doh! Gracias por publicar esto.
Sirex
12

Puede usar Ctrl+ Wpara cortar el argumento y almacenarlo en su portapapeles, y luego Ctrl+ Ypara pegarlo nuevamente:

cp my_file_name Ctrl+ W Ctrl+ Yoriginales / Ctrl+Y
dogbane
fuente
5

Uso complicado, pero configuración más simple:

Puede vincular una pulsación de tecla (usaré Ctrl- Q) a la readline copy-backward-wordfunción y hacer esto:

Alt- 2 Ctrl- Q Ctrl- y Ctrl- Alt-h

Eso significa:

  • digit-argument copy-backward-word (copie las dos palabras anteriores)
  • yank (pegar)
  • backward-kill-word (deshacerse de la palabra extra)

Para enlazar la pulsación de tecla en la línea de comando:

bind '"\C-q": copy-backward-word'

o agregue esto a su ~/.inputrc:

"\C-q": copy-backward-word

Uso más simple, pero configuración más complicada:

Usted puede hacer que secuencia de teclas de largo en una macro provocada por un golpe de teclado (utilizaré Alt- qaquí y hacer uso de la Ctrl- qunión de la anterior):

En un indicador de shell:

bind '"\eq": "\e2\C-q\C-y\e\C-h"'

o en tu ~/.inputrc:

"\eq": "\e2\C-q\C-y\e\C-h"

Recuerde, también deberá vincular Ctrl, qcomo se indicó anteriormente.

Ahora para copiar la palabra antes de la actual, todo lo que necesita presionar es Alt- q.

Dennis Williamson
fuente
2

Hazlo asi:

    cp my_file_name originals/!#:1

! # es la línea actual,: 1 es el primer argumento.

Aura
fuente
Wow, ese es un buen consejo general que nunca supe
Sridhar Sarnobat
1

Aquí hay otra forma, aunque no estoy seguro de por qué está buscando hacer lo que está tratando de hacer, ya que el nombre del archivo está implícito en su ejemplo de comando cp (y funcionaría como se esperaba).

> F=my_file_name && cp $F Workspace/$F

Esto podría expandirse también para cambiar el nombre del archivo:

> F=my_file_name && cp $F Workspace/$F.new
Mate
fuente
Gracias. De hecho, necesito hacer esto en situaciones donde se requiere el segundo uso del nombre de archivo, por lo que mi elección de usar cp para la pregunta fue una mala elección.
Rico
0

Podrías probar esto:

cp my_file_nameCtrl+ WCtrl+ Yoriginals/Ctrl+Y

Pero eso no funciona cuando ya estás al final de la línea. Quizás algo similar podría funcionar sin embargo. (y con copia, no cortada)

Editar: Trate Alt+ B, Ctrl+ W, Ctrl+ Y, End, Ctrl+ Y - un poco de una solución desordenado sin embargo!

Sirex
fuente
0

Tengo esto en mi ~/.inputrc:

"\ej":"!#:$\e^"

!#es la línea actual, :$es la última palabra y \e^es history-expand-line.

nisetama
fuente