Utilizo mucho la función de autocompletar desde el historial, ya sea con up-arrow
o escribiendo las primeras letras y completando todo el comando, incluidos todos los argumentos (opciones y otros) con right-arrow
.
Muy a menudo tengo que ejecutar el mismo comando varias veces en el mismo archivo pero con diferentes opciones. Sin embargo, al presionar up-arrow
o right-arrow
, completo hasta el final del comando y es más rápido escribirlo todo manualmente que regresar el cursor a las opciones, editar y luego volver a ingresar.
Básicamente, me gustaría saber si hay alguna forma de usar el autocompletado para volver a ingresar un comando del historial pero llevar el cursor de regreso a la primera opción/argumento . Alternativamente, un atajo de teclado para completar los argumentos restantes como antes después de escribir uno diferente.
p.ej
Escribo e ingreso:
$ command -opt1 reallyverylongindeedarg1
Presionar la flecha hacia arriba produce $ command -opt1 reallyverylongindeedarg1
con mi cursor al final de la línea.
Me gustaría tener un método abreviado de teclado diferente que me permita tener el cursor en algún lugar -opt1
para poder cambiarlo -differntopt2
y volver a ejecutar el comando que ahora diría:
$ command -differntopt2 really.verylong.indeed.arg1
O bien, habiendo tecleado y ejecutado previamente:
$ command -opt1 really.verylong.indeed.arg1
Escribir comman
y luego presionar right-arrow
completa el comando completo $ command -opt1 reallyverylongindeedarg1
(nuevamente con mi cursor al final de la línea). Me encantaría saber si hay un atajo de teclado para saltar al primer argumento/opción cuando se completa automáticamente.
Otro método sería que escriba y $ command -differntopt2
luego presione la flecha derecha para completar el argumento really.verylong.indeed.arg1
como anteriormente cuando ejecuté este comando por última vez. Resultando en:
$ command -differntopt2 really.verylong.indeed.arg1
Bueno, en primer lugar, eso está lejos de ser ideal ya que los argumentos tienen mucha puntuación, por lo que cada uno requiere varias (y diferentes cantidades) de pulsaciones de teclas y es lento retroceder la cantidad correcta de palabras cada vez para llegar a la opción que quiero editar.
En segundo lugar, no puedo encontrar una manera de configurar atajos de teclado normales para navegar hacia adelante y hacia atrás por palabra.
En iTerm2 he probado:
Secuencias de escape como [1;5D
, [1;5C
, \033b
, \033f
, etc.
Escribir manualmente Esc
, F
y Esc
, B
funciona pero es muy lento. Ctrl + A
para ir al inicio de la línea selecciona todo. Ctrl + <-
y Ctrl + ->
solo producir [D
y [C
.
Para ZSH otra opción es poner el cursor al principio y no al final de la línea (esto lo hace más como mksh
u otros). El valor por defecto:
% PS1='%% ' zsh -f
% bindkey | grep up-line-or
"^[OA" up-line-or-history
"^[[A" up-line-or-history
Lo uso set -o vi
, por lo que es posible que deba traducir las bindkey
claves a lo que se adapte a sus necesidades:
bindkey -M vicmd "j" vi-down-line-or-history
bindkey -M vicmd "k" vi-up-line-or-history
Esto requiere un widget personalizado, que podría ejecutar algo como
function up-line-first-arg {
local first offset
zle vi-up-line-or-history
first=${BUFFER%% *}
CURSOR+=$(( 1 + ${#first} ))
}
zle -N up-line-first-arg
autoload -U up-line-first-arg
autoload -U compinit
compinit
set -o vi
bindkey -M vicmd "k" up-line-first-arg
Esta versión colocará el cursor en el primer argumento o al final del nombre del comando (a menos que haya varios espacios entre el primer argumento y el siguiente, lo cual no es común). Docs zshexpn(1)
y zshzle(1)
puede ayudar a explicar los detalles, pero la esencia es moverse hacia arriba como lo hace ZSH, obtener la primera palabra (si corresponde) y mover el cursor sobre esa longitud, más uno para pasar el espacio. ZSH es inteligente, no moverá el cursor más allá del final del BUFFER
caso en el que no haya espacio en el comando.
La siguiente versión maneja casos (quizás poco comunes) como ls -al
y en caso de falla colocará el cursor al comienzo de la línea.
function up-line-first-arg {
zle vi-up-line-or-history
[[ $BUFFER =~ "^[^ ]+[ ]+" ]] && CURSOR+=${#MATCH}
}
Básicamente, una expresión regular "desde el comienzo del BUFFER
partido, una o más cosas que no son espacios seguidas de una o más cosas que son espacios" y luego se mueve CURSOR
tanto en el partido.
bindkey
puede vincular la mayoría de las combinaciones de teclas, no solo las que se muestran.
marc wilson