2 votos

Terminal MacOS: forma rápida de editar las opciones de los comandos tras el autocompletado de bash/zsh

La cuestión

Utilizo mucho el autocompletado del historial, ya sea con up-arrow o escribiendo las primeras letras y completando todo el comando incluyendo todos los argumentos (opciones y otros) con right-arrow .

A menudo tengo que ejecutar el mismo comando varias veces en el mismo archivo pero con diferentes opciones. Sin embargo, al pulsar up-arrow o right-arrow , completo a la fin del comando y es más rápido escribirlo todo manualmente que llevar el cursor a las opciones, editar y volver a introducir.

Básicamente, me gustaría saber si hay alguna forma de utilizar el autocompletado para volver a introducir un comando desde el historial pero devuelve el cursor a la primera opción/argumento . Alternativamente, un atajo de teclado para rellenar los argumentos restantes como anteriormente después de escribir uno diferente.

Por ejemplo

Opción 1

Escribo y entro:

$ command -opt1 reallyverylongindeedarg1

Al pulsar la flecha hacia arriba se produce $ command -opt1 reallyverylongindeedarg1 con mi cursor al final de la línea.

Me gustaría tener un atajo de teclado diferente que me haga tener el cursor en algún lugar alrededor de -opt1 así que puedo cambiarlo por -differntopt2 y volver a ejecutar el comando que ahora se leerá:

$ command -differntopt2 really.verylong.indeed.arg1

O bien, habiendo tecleado y ejecutado previamente:

$ command -opt1 really.verylong.indeed.arg1

Escribir en comman y luego golpear right-arrow completa el comando completo $ command -opt1 reallyverylongindeedarg1 (de nuevo con el cursor al final de la línea). Me gustaría saber si hay un atajo de teclado para saltar al primer argumento/opción cuando se autocompleta.

Opción 2

Otro método sería que mi escribiera $ command -differntopt2 luego presione la flecha derecha para rellenar el argumento really.verylong.indeed.arg1 como la última vez que ejecuté este comando. El resultado es:

$ command -differntopt2 really.verylong.indeed.arg1

¿Qué tal si sólo navegas con el teclado y saltas hacia atrás por palabras?

Bueno, en primer lugar, eso está lejos de ser lo ideal, ya que los argumentos tienen muchos signos de puntuación, por lo que cada uno lleva varias (y diferentes números de) pulsaciones de teclas y es lento retroceder el número correcto de palabras cada vez para llegar a la opción que quiero editar.

En segundo lugar, no encuentro la forma de configurar los 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 principio de la línea selecciona todo. Ctrl + <- y Ctrl + -> sólo producir [D y [C .

tl;dr

  1. ¿Cómo puedo autocompletar y terminar con el cursor en el primer argumento en lugar de al final de la línea?, o,
  2. ¿Cómo puedo configurar atajos de teclado para saltar hacia adelante y hacia atrás por argumento en iTerm2?

1voto

thrig Puntos 101

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). Por defecto:

% PS1='%% ' zsh -f
% bindkey | grep up-line-or
"^[OA" up-line-or-history
"^[[A" up-line-or-history

Yo uso set -o vi por lo que es posible que tenga que traducir el bindkey llaves en 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

no realmente quiero saltar al primer argumento

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 pondrá el cursor en el primer argumento o en el final del nombre del comando (a menos que haya varios espacios entre el primer argumento y el siguiente, lo que no es común). Docs en 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 la hay), 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 de la BUFFER para el caso de que no haya espacio en el comando.

pero espera que hay más

La siguiente versión maneja casos (quizás poco comunes) como ls -al y en caso de fallo pondrá el cursor al principio 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 principio de la BUFFER coinciden con una o más cosas que no son espacios seguidas de una o más cosas que son espacios" y luego se mueve el CURSOR por esa cantidad en el partido.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X