¿Cómo repetir el parámetro actualmente escrito en la consola bash?

23

Estaba escribiendo algo en la línea de:

mv foo/bar/poit/zoid/narf.txt

y de repente me di cuenta, maldita sea, tengo que volver a escribir grandes partes de ese parámetro

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt

Incluso con la finalización de pestañas, un gran dolor. Sé que puedo copiar y pegar el parámetro seleccionando con el mouse el texto y hacer clic en el medio, pero eso no es lo suficientemente bueno. Quiero permanecer en el teclado.

Entonces, ¿hay alguna manera de copiar y pegar el parámetro actual de la línea usando el teclado?

k0pernikus
fuente
3
Mi consejo no responde a su pregunta, pero es un pequeño consejo. Como en su ejemplo, puede usar la siguiente construcción: en mv foo/bar/poit/zoid/{narf.txt,troz.txt}lugar de escribir / copiar una dirección larga dos veces.
precipitarse
2
@ Ligeramente más corta que la solución de la acometida: mv foo/bar/poit/zoid/{narf,troz}.txt. Esto funciona especialmente bien si tenemos algo como.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann
@Rush ¿Te importaría señalarlo como respuesta? Puede que no sea directamente lo que pregunté, pero una vez más, su solución es mucho más al punto de lo que quiero. Se merece una muestra de aceptación.
k0pernikus

Respuestas:

15

Si he planeado con anticipación, uso la expansión de llaves . En este caso:

mv foo/bar/poit/zoid/{narf,troz}.txt

Aquí hay otro enfoque que usa los readlineatajos de teclado predeterminados :

  • mv foo/bar/poit/soid/narf.txt: comienzo
  • Ctrl- w: unix-word-ruboutpara eliminarfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, espacio, yankde nuevo para obtenermv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-worddos veces para borrar el últimonarf.txt
  • troz.txt: escriba la parte de la cola que es diferente

Si pasa una cantidad de tiempo no trivial utilizando el bashshell, le recomiendo leer periódicamente una lista de los accesos directos predeterminados y elegir algunos que parecen útiles para aprender e incorporar a su rutina. El Capítulo 8 del bashmanual es un buen lugar para comenzar. Conocer los atajos realmente puede aumentar su eficiencia.

jw013
fuente
¡Ordenado! En mi caso, tuve que presionar Alt + Retroceso en lugar de Meta + Retroceso.
k0pernikus
3
@ k0pernikus Sí, en la mayoría de los teclados, la tecla Alt es la tecla Meta.
jw013
1
Para guardar la reescritura .txt, puede presionar Ctrl + Izquierda (o cualquier otro acceso directo que llame backward-word), luego Izquierda un carácter, luego Alt + Retroceso y escribir troz.
wjandrea
24

La expansión de historial también funciona en el comando actual, utilizando el designador de eventos !#. Combine esto con la palabra designadora para el último argumento - $- para obtener el parámetro que acaba de escribir. Y puede usar todos los modificadores regulares sobre él, por lo que si, por ejemplo, cambia el nombre de un archivo en un directorio lejano, puede escribir:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
fuente
¡Muy útil! Esto funciona especialmente bien con la magic-spaceopción de bash en inputrc para expandir automáticamente las expansiones del historial. (No pude usar la respuesta más votada porque configuré ^ W para romper en barras, ya que eso suele ser más útil).
Soren Bjornstad
@SorenBjornstad alt+backspacegeneralmente ya se detiene en delimitadores de palabras como barras, por lo que no necesita cambiar la forma ^Wde obtener esa funcionalidad, puede eliminar las palabras delimitadas por caracteres que no sean palabras o espacios en blanco
Eric Renouf
14

Como en su ejemplo, puede usar la siguiente construcción:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}

o incluso (como se sugiere Ansgar Esztermann ):

mv foo/bar/poit/zoid/{narf,troz}.txt

en lugar de escribir / copiar una dirección larga dos veces.

prisa
fuente
2
Esto se llama expansión de llaves .
CodeGnome
6

Jugando, conseguí que esto funcionara:

mv foo/bar/poit/zoid/narf.txt

Presiona Enter
para almacenar el último parámetro.

Ahora use para volver a escribir la última línea. Ingrese un espacio y para obtener el último parámetro utilizado use:

Alt + .

Odio provocar un error, pero hace el trabajo en este caso de uso.

k0pernikus
fuente
¡Genial, otro gran consejo aprendido!
Bram
<kbd> Esc </kbd> + <kbd>. </kbd> es (it?) lo mismo que <kbd> Alt </kbd> + <kbd>. </kbd>.
Nikos Alexandris
2

Puede usar fácilmente variables:

a=test.csv ; cp $a $a.bak

O en su caso (la competencia de pestaña de nota funciona para una parte):

a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt
ppp
fuente
2

Tengo esto en mi ~/.inputrc:

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

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

nisetama
fuente
Esto debe ser marcado como la respuesta. Al presionar 'alt / option + j' ahora se copia la última palabra.
mpprdev
2

Para zsh, encuentro las siguientes combinaciones de teclas útiles.

# Bind alt-m to insert previous word from the current line
bindkey '^[m' copy-prev-shell-word

# Bind alt-k to kill word before cursor in vi-style
bindkey '^[k' vi-backward-kill-word

Entonces presioné Alt, Mpara repetir el último argumento Alt, Ksi quiero eliminar partes del final de una ruta.

Aquí hay una referencia útil a algunos de los comportamientos que puede mapear.

bdellaterra
fuente
2

Una breve solución interactiva de dos pasos

  1. tipo: echo foo/bar/poit/zoid/narf.txt

    Esto hace foo/bar/poit/zoid/narf.txtdisponible para el Alt- .acceso directo en bash.

  2. escribir: mvy éxito Alt- ., Space, Alt-.

    Lo conseguirás mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt. Ahora puedes modificar la última palabra fácilmente.

Comandante de medianoche

Esta herramienta que puede ser (muy) útil es un administrador de archivos que se ejecuta en la consola. Le ofrece la posibilidad de copiar nombres de archivos y rutas de directorio de forma interactiva en la línea de comandos. Midnight Commander le muestra, por lo tanto, 2 paneles (izquierdo y derecho), que enumeran los contenidos de diferentes directorios.

Una breve guía:

  • Up/ Downteclas de flecha seleccionan archivos en el panel actual.
  • Tab cambia entre el panel izquierdo y derecho.
  • Ctrl- Shift- Entercopia el archivo seleccionado actualmente a la línea de comando (incluida la ruta completa)
  • Alt- oabre el directorio seleccionado actualmente en el otro panel
  • Ctrl- ote permite ver la consola en pantalla completa
  • Ctrl- x, pcopia la ruta del panel activo en la consola
  • Ctrl- x, Ctrl- pcopia la ruta del panel inactivo en la consola
  • Esc- Tabes autocompletado

Esta es, con mucho, la forma más rápida que encontré hasta ahora, después de que me acostumbré a los atajos.

Markus Dutschke
fuente
0

Use lo mismo en el {,} "duplicador". Es decir:

git tag -m {v,v}1.0.1

# same as 

git tag -m v1.0.1 v1.0.1
Pylinux
fuente