13

Я использую поведение menu select в zsh , которое вызывает меню под курсором, где вы можете увидеть различные возможности. Опция .zshrc, которую я установил для этого,

zstyle ':completion:*' menu select=2

По умолчанию нажатие Return для выбора возможности в этом меню только завершает слово - фактически оно не отправляет команду. Например, я мог бы получить такое меню

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

Нажатие Return здесь приведет к

~ % cd Desktop/

Затем мне нужно нажать Return во второй раз, чтобы фактически отправить команду.

Я могу изменить это поведение таким образом, чтобы нажатие Return одновременно выбирало завершение и отправляло команду, выполняя это

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

Однако есть проблема с этим: иногда мне нужно заполнить файл или каталог без отправки команды. Например, мне может понадобиться ln -s Desktop Desktop2 - при таком поведении bindkey попытка завершить Desktop приведет к отправке ln -s Desktop/ в качестве команды, и, очевидно, я этого не хочу.

Я знаю, что нажатие клавиши «пробел» позволит мне продолжить выполнение команды, но теперь это привычка.
Учитывая это, есть ли способ сделать так, чтобы только некоторые команды позволяли вам нажать Return один раз (например, cd), но все другие команды требуют нажатия дважды?

2 ответа2

3

Если вам это действительно нужно, теоретически вы можете установить функцию, которая проверяет выполняемую вами команду, и завершить или отправить строку.

Попробуйте что-то вроде этого (не проверено):

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

Источник: используя пользовательскую команду из старого .inputrc в Zsh?

0

Технически это невозможно, как вы просите. Не знаю, есть ли другой выход

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .