È possibile utilizzare diversi comportamenti di selezione del menu zsh per comandi diversi?


13

Sto usando il menu selectcomportamento in zsh, che richiama un menu sotto il cursore dove puoi vedere le varie possibilità. L'opzione .zshrc che ho impostato per questo è

zstyle ':completion:*' menu select=2

Per impostazione predefinita, premendo Returnper selezionare una possibilità in questo menu si completa solo la parola - in realtà non invia il comando. Ad esempio, potrei ottenere un menu come questo

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

Premendo Returnqui si otterrà

~ % cd Desktop/

Devo quindi premere Returnuna seconda volta per inviare effettivamente il comando.

Posso modificare questo comportamento per farlo in modo che premendo Returnentrambi selezioni il completamento e invii il comando in questo modo

bindkey -M menuselect '^M' .accept-line

Tuttavia, c'è un problema con questo: a volte ho bisogno di completare un file o una directory senza inviare il comando. Ad esempio, potrei aver bisogno di fare ln -s Desktop Desktop2- con questo bindkeycomportamento, provare a completare Desktop comporterà ln -s Desktop/l'invio come comando, e ovviamente non lo voglio.

Sono consapevole che solo premendo lo spazio mi permetterà di andare avanti con il comando, ma ora è un'abitudine.
Detto questo, c'è un modo per farlo in modo che solo alcuni comandi ti permettano di premere Returnuna volta (come cd), ma tutti gli altri comandi richiedono di premerlo due volte?


Se il .zshrcfile non ti consente di farlo, la risposta sarà semplicemente no, a meno che tu non modifichi tu stesso il codice sorgente per supportare il comportamento basato sui comandi. Ma poi devi ancora definire per quali comandi eseguire questo, che da solo è molto più noioso che premere semplicemente un tasto aggiuntivo ...
Tamara Wijsman

Risposte:


3

Se ne hai davvero bisogno, teoricamente potresti impostare una funzione che controlla il comando che stai eseguendo e completare o inviare la riga.

Prova qualcosa del genere (non testato):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

Fonte: usando il comando personalizzato dal vecchio .inputrc in zsh?


0

Tecnicamente non è possibile nel modo in cui lo chiedi. Non so se c'è altra via d'uscita

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.