是否可以对不同的命令使用不同的 zsh 菜单选择行为?

是否可以对不同的命令使用不同的 zsh 菜单选择行为?

我使用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 Desktop2bindkey行为 — 尝试完成桌面将导致被ln -s Desktop/发送为命令,而我显然不希望这样。

我知道只需按空格键就可以继续执行命令,但现在这已经成为一种习惯。
鉴于此,有没有办法让一些命令允许您按Return一次(例如cd),但所有其他命令需要按两次吗?

答案1

如果您确实需要这个,理论上您可以设置一个函数来检查您正在执行的命令,然后完成或发送该行。

尝试这样的操作(未经测试):

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 中的自定义命令?

答案2

从技术上来说,按照你问的方式是不可能的。不知道还有其他方法吗

相关内容