Можно ли использовать разные режимы выбора меню zsh для разных команд?

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поведении попытка завершить рабочий стол приведет ln -s Desktop/к отправке в качестве команды, и, очевидно, я этого не хочу.

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

корова
источник
Если .zshrcфайл не позволяет вам сделать это, тогда ответ будет просто «нет», если вы сами не настроите исходный код для поддержки поведения на основе команд. Но тогда вам все еще нужно определить, для каких команд это сделать, что
само

Ответы:

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?

balkian
источник
0

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

Aexyn
источник