macOS terminal: modo rapido per modificare le opzioni di comando dopo il completamento automatico di bash / zsh

1

Il problema

Uso automaticamente la funzione di completamento automatico dalla cronologia, sia con up-arrow che digitando le prime lettere e completando l'intero comando, inclusi tutti gli argomenti (opzioni e altri) con right-arrow .

Molto spesso devo eseguire lo stesso comando più volte sullo stesso file ma con diverse opzioni. Tuttavia, premendo up-arrow o right-arrow , completo il fine del comando ed è più veloce digitare l'intera cosa manualmente che riportare il cursore sulle opzioni, modificare e poi ri- digitare.

In sostanza, mi piacerebbe sapere se esiste un modo per utilizzare il completamento automatico per immettere nuovamente un comando dalla cronologia ma riportare il cursore alla prima opzione / argomento . In alternativa, una scorciatoia da tastiera per riempire gli argomenti rimanenti come in precedenza dopo aver digitato uno diverso.

per es.

Opzione 1

Scrivo e inserisco:

$ command -opt1 reallyverylongindeedarg1

Premendo il tasto freccia in alto si ottiene $ command -opt1 reallyverylongindeedarg1 con il mio cursore alla fine della riga.

Mi piacerebbe avere una scorciatoia da tastiera diversa che mi porta a posizionare il cursore da qualche parte intorno a -opt1 , quindi posso cambiarlo in -differntopt2 e rieseguire il comando che ora leggerà:

$ command -differntopt2 really.verylong.indeed.arg1

Oppure, dopo aver precedentemente digitato ed eseguito:

$ command -opt1 really.verylong.indeed.arg1

Digitando comman e poi premendo right-arrow completa il comando completo $ command -opt1 reallyverylongindeedarg1 (di nuovo con il mio cursore alla fine della riga). Mi piacerebbe sapere se c'è una scorciatoia da tastiera per passare al primo argomento / opzione durante il completamento automatico.

Opzione 2

Un altro metodo potrebbe essere che digiti $ command -differntopt2 , quindi premi la freccia destra per inserire l'argomento really.verylong.indeed.arg1 come in precedenza, quando ho eseguito l'ultimo comando. Risultante in:

$ command -differntopt2 really.verylong.indeed.arg1

Che ne pensi di navigare con la tastiera e saltare indietro di parola?

Beh, in primo luogo, questo è lontano dall'ideale in quanto gli argomenti hanno molta punteggiatura in modo che ognuno di essi usi diversi tasti (e diversi numeri di) ed è lento risalire il numero giusto di parole ogni volta per raggiungere l'opzione che voglio per modificare.

In secondo luogo, non riesco a trovare un modo per impostare le scorciatoie da tastiera normali per navigare avanti e indietro per parola.

In iTerm2 ho provato:

Sequenze di escape come [1;5D , [1;5C , 3b , 3f , ecc.

Digitando manualmente Esc , F e Esc , B funziona ma è molto lento. Ctrl + A per go to start of line seleziona tutto. Ctrl + <- e Ctrl + -> producono solo [D e [C .

tl; dr

  1. Come posso completare automaticamente e finire con il mio cursore al primo argomento invece della fine della riga ?, o,
  2. Come faccio a configurare scorciatoie da tastiera per saltare avanti e indietro per argomento in iTerm2?
posta Turkeyphant 22.08.2018 - 21:38
fonte

1 risposta

1

Per ZSH un'altra opzione è posizionare il cursore all'inizio e non alla fine della riga (questo rende più come mksh o altri). L'impostazione predefinita:

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

Uso set -o vi , quindi potresti dover convertire le chiavi bindkey in qualsiasi cosa soddisfi le tue esigenze:

bindkey -M vicmd "j" vi-down-line-or-history
bindkey -M vicmd "k" vi-up-line-or-history

no voglio davvero passare al primo argomento

Ciò richiede un widget personalizzato, che potrebbe essere eseguito come

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

Questa versione posizionerà il cursore sul primo argomento o sulla fine del nome del comando (a meno che non vi siano più spazi tra il primo argomento e il successivo, che non è comune). Documenti in zshexpn(1) e zshzle(1) possono aiutare a spiegare i particolari, ma l'essenza è di muoversi come fa ZSH, ottenere la prima parola (se esiste) e spostare il cursore su quella lunghezza, più uno per superare lo spazio . ZSH è intelligente non sposterà il cursore oltre la fine di BUFFER per il caso in cui non vi è spazio nel comando.

ma aspetta c'è di più

La seguente versione gestisce casi (forse non comuni) come ls -al e in caso di errore posiziona il cursore all'inizio della riga.

function up-line-first-arg {
    zle vi-up-line-or-history
    [[ $BUFFER =~ "^[^ ]+[ ]+" ]] && CURSOR+=${#MATCH}
}

Fondamentalmente un'espressione regolare "dall'inizio di BUFFER corrisponde a una o più cose che non sono spazio seguite da una o più cose che sono spazi" e quindi sposta CURSOR di quel tanto sulla corrispondenza.

    
risposta data 23.08.2018 - 04:14
fonte

Leggi altre domande sui tag