Est-il possible d'utiliser un comportement de sélection de menu zsh différent pour différentes commandes?

13

J'utilise le menu selectcomportement zsh, qui invoque un menu en dessous du curseur où vous pouvez voir les différentes possibilités. L'option .zshrc que j'ai définie pour cela est

zstyle ':completion:*' menu select=2

Par défaut, appuyer sur Returnpour sélectionner une possibilité dans ce menu ne fait que terminer le mot - il n'envoie pas réellement la commande. Par exemple, je pourrais obtenir un menu comme celui-ci

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

En appuyant Returnici, vous obtiendrez

~ % cd Desktop/

Je dois ensuite appuyer Returnune deuxième fois pour envoyer la commande.

Je peux modifier ce comportement pour faire en sorte qu'en appuyant sur les Returndeux sélectionne l'achèvement et envoie la commande en faisant cela

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

Cependant, il y a un problème avec cela: parfois, je dois compléter un fichier ou un répertoire sans envoyer la commande. Par exemple, je devrais peut-être faire ln -s Desktop Desktop2- avec ce bindkeycomportement, essayer de terminer Desktop entraînera l' ln -s Desktop/envoi de la commande, et je ne veux évidemment pas cela.

Je suis conscient que le simple fait d'appuyer sur l'espace me permettra de continuer la commande, mais c'est maintenant une habitude.
Compte tenu de cela, existe-t-il un moyen de faire en sorte que seules certaines commandes vous permettent d'appuyer Returnune fois (comme cd), mais toutes les autres commandes nécessitent d'appuyer deux fois?

bétail
la source
Si le .zshrcfichier ne vous permet pas de le faire, la réponse sera simplement non, à moins que vous ajustiez vous-même le code source pour prendre en charge le comportement basé sur les commandes. Mais alors vous devez encore définir pour quelles commandes faire cela, ce qui en soi est beaucoup plus fastidieux que d'appuyer simplement sur une entrée supplémentaire ...
Tamara Wijsman

Réponses:

3

Si vous en avez vraiment besoin, vous pouvez théoriquement définir une fonction qui vérifie la commande que vous exécutez et terminer ou envoyer la ligne.

Essayez quelque chose comme ça (non testé):

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

Source: en utilisant la commande personnalisée de l'ancien .inputrc dans zsh?

balkian
la source
0

Techniquement, ce n'est pas possible comme vous le demandez. Je ne sais pas s'il existe une autre issue

Aexyn
la source