Czy można używać różnych zachowań wyboru menu Zsh dla różnych poleceń?

13

Korzystam z menu selectzachowania w zsh, które wywołuje menu pod kursorem, w którym można zobaczyć różne możliwości. Ustawiłem dla tego opcję .zshrc

zstyle ':completion:*' menu select=2

Domyślnie naciśnięcie, Returnaby wybrać opcję w tym menu, uzupełnia tylko słowo - tak naprawdę nie wysyła polecenia. Na przykład mogę dostać takie menu

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

Naciśnięcie Returntutaj spowoduje

~ % cd Desktop/

I wtedy trzeba nacisnąć Returnna drugi czasu, aby rzeczywiście wysłać polecenie.

Mogę zmodyfikować to zachowanie, tak aby naciśnięcie Returnobu wybrało zakończenie i wysłało polecenie w ten sposób

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

Jednak jest z tym problem: czasami muszę uzupełnić plik lub katalog bez wysyłania polecenia. Na przykład być może będę musiał to zrobić ln -s Desktop Desktop2- przy takim bindkeyzachowaniu próba ukończenia pulpitu spowoduje ln -s Desktop/wysłanie polecenia i oczywiście nie chcę tego.

Wiem, że naciśnięcie spacji pozwoli mi wykonać polecenie, ale teraz jest to nawyk.
Biorąc to pod uwagę, czy istnieje sposób, aby zrobić to tak, aby tylko niektóre polecenia pozwalały naciskać Returnraz (jak cd), ale wszystkie inne polecenia wymagają dwukrotnego naciśnięcia?

bydło
źródło
Jeśli .zshrcplik na to nie pozwala, odpowiedź będzie brzmiała „nie”, chyba że sam dostosujesz kod źródłowy, aby obsługiwał zachowanie oparte na poleceniach. Ale nadal musisz określić, dla których poleceń to zrobić, co samo w sobie jest znacznie bardziej nużące niż naciśnięcie dodatkowego Enter ...
Tamara Wijsman,

Odpowiedzi:

3

Jeśli naprawdę tego potrzebujesz, teoretycznie możesz ustawić funkcję sprawdzającą wykonywane polecenie i uzupełnić lub wysłać linię.

Wypróbuj coś takiego (niesprawdzone):

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

Źródło: za pomocą niestandardowego polecenia ze starego .inputrc w Zsh?

Bałkian
źródło
0

Technicznie nie jest to możliwe w sposób, w jaki pytasz. Nie wiem, czy jest jakieś inne wyjście

Aexyn
źródło