是否可以对不同的命令使用不同的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行为,尝试完成Desktop会导致ln -s Desktop/作为命令发送,并且显然我不希望这样做。

我知道只要按空格就可以让我继续执行该命令,但这已成为一种习惯。
鉴于此,有没有一种方法可以使只有某些命令让您按Return一次(如cd),而所有其他命令都需要按两次?


如果.zshrc文件不允许您这样做,那么除非您自己调整源代码以支持基于命令的行为,否则答案将是“否”。但是然后您仍然必须定义要执行哪些命令,这本身比单按一个额外的输入单单更
麻烦

Answers:


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

来源:在zsh中使用来自旧.inputrc的自定义命令?


0

从技术上讲,这不是您要求的方式。不知道还有没有其他出路

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.