Ist es möglich, für verschiedene Befehle ein anderes zsh-Menüauswahlverhalten zu verwenden?

13

Ich benutze das menu selectVerhalten in zsh, das ein Menü unterhalb des Cursors aufruft, in dem Sie die verschiedenen Möglichkeiten sehen können. Die .zshrc-Option, die ich dafür festgelegt habe, ist

zstyle ':completion:*' menu select=2

Standardmäßig wird durch Drücken von Return, um eine Möglichkeit in diesem Menü auszuwählen, nur das Wort vervollständigt - der Befehl wird nicht gesendet. Zum Beispiel könnte ich ein Menü wie dieses bekommen

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

Wenn Sie Returnhier drücken , erhalten Sie

~ % cd Desktop/

Ich muss dann Returnein zweites Mal drücken , um den Befehl tatsächlich zu senden.

Ich kann dieses Verhalten dahingehend ändern, dass durch Drücken Returnbeider Tasten der Abschluss ausgewählt und der Befehl auf diese Weise gesendet wird

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

Es gibt jedoch ein Problem damit: Manchmal muss ich eine Datei oder ein Verzeichnis vervollständigen, ohne den Befehl zu senden. Möglicherweise muss ich Folgendes tun ln -s Desktop Desktop2: Wenn Sie mit diesem bindkeyVerhalten versuchen, Desktop fertigzustellen, wird ln -s Desktop/es als Befehl gesendet, und das möchte ich natürlich nicht.

Ich bin mir bewusst, dass ich den Befehl nur durch Drücken der Leertaste ausführen kann, aber es ist jetzt eine Gewohnheit.
Gibt es eine Möglichkeit, dies so zu gestalten, dass Sie nur bei einigen Befehlen Returneinmal drücken können (wie cd), bei allen anderen Befehlen jedoch zweimal drücken müssen?

kine
quelle
Wenn die .zshrcDatei dies nicht zulässt, lautet die Antwort einfach nein, es sei denn, Sie passen den Quellcode selbst an, um befehlsbasiertes Verhalten zu unterstützen. Dann müssen Sie jedoch noch festlegen, für welche Befehle dies ausgeführt werden soll. Dies ist für sich genommen weitaus mühsamer, als nur eine zusätzliche Eingabetaste zu drücken ...
Tamara Wijsman,

Antworten:

3

Wenn Sie dies wirklich benötigen, können Sie theoretisch eine Funktion festlegen, die den von Ihnen ausgeführten Befehl überprüft und die Zeile vervollständigt oder sendet.

Versuchen Sie so etwas (ungetestet):

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

Quelle: Verwenden eines benutzerdefinierten Befehls aus der alten .inputrc in zsh?

Balkianer
quelle
0

Technisch ist es nicht möglich, wie Sie es wünschen. Ich weiß nicht, ob es einen anderen Ausweg gibt

Aexyn
quelle