terminal macOS: forma rápida de editar las opciones de comando después de que bash / zsh autocomplete

1

El problema

Uso mucho autocompletar del historial, ya sea con up-arrow o escribiendo las primeras letras y completando el comando completo, 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 el final del comando y es más rápido escribir todo manualmente que el cursor para volver a las opciones, editar y luego volver a entrar.

Básicamente, me gustaría saber si hay alguna forma de usar autocompletar para volver a ingresar un comando del historial pero volver a colocar el cursor en la primera opción / argumento . Alternativamente, un método abreviado de teclado para completar los argumentos restantes como anteriormente, después de escribir uno diferente.

por ejemplo

Opción 1

Escribo y escribo:

$ 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 alrededor de -opt1 , así que puedo cambiarlo a -differntopt2 y volver a ejecutar el comando que ahora se lee:

$ command -differntopt2 really.verylong.indeed.arg1

O, habiendo escrito y ejecutado anteriormente:

$ command -opt1 really.verylong.indeed.arg1

Al 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 encanta saber si hay un método abreviado de teclado para saltar al primer argumento / opción al autocompletar.

Opción 2

Otro método sería que yo escribiera $ command -differntopt2 y luego presione la flecha derecha para completar el argumento really.verylong.indeed.arg1 como lo hice anteriormente cuando ejecuté este comando por última vez. Resultando en:

$ command -differntopt2 really.verylong.indeed.arg1

¿Qué hay de navegar con el teclado y saltar por palabra?

Bueno, en primer lugar, eso dista mucho de ser ideal, ya que los argumentos tienen mucha puntuación, por lo que cada uno requiere varios (y diferentes números de) pulsaciones y es lento volver al número correcto de palabras cada vez para alcanzar la opción que deseo. para editar.

En segundo lugar, no puedo encontrar una manera de configurar los atajos de teclado normales para navegar hacia adelante y hacia atrás por palabra.

En iTerm2 lo he intentado:

Secuencias de escape como [1;5D , [1;5C , 3b , 3f , etc.

Escribir manualmente Esc , F y Esc , B funciona pero es muy lento. Ctrl + A para ir a inicio de línea selecciona todos. Ctrl + <- y Ctrl + -> solo producen [D y [C .

tl; dr

  1. ¿Cómo puedo autocompletar y terminar con mi cursor en la primera argumento en lugar del 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?
pregunta Turkeyphant 22.08.2018 - 21:38

1 respuesta

1

Para ZSH, otra opción es colocar el cursor al principio y no al final de la línea (esto lo hace más como mksh u otros). El predeterminado:

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

Uso set -o vi , por lo que es posible que tenga que traducir las claves bindkey a lo que mejor 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 funcionar de forma similar a

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 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). Los documentos en zshexpn(1) y zshzle(1) pueden ayudar a explicar los detalles, pero lo esencial es avanzar como lo hace ZSH, obtener la primera palabra (si existe) 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 para el caso en que no haya espacio en el comando.

pero espera hay más

La siguiente versión maneja casos (tal vez poco comunes) como ls -al y si falla, el cursor se ubicará 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 BUFFER coincide con una o más cosas que no son espacios seguidos de una o más cosas que son espacios" y luego mueve el CURSOR en esa coincidencia.

    
respondido por el thrig 23.08.2018 - 04:14

Lea otras preguntas en las etiquetas