我使用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
),但所有其他命令需要按两次吗?
答案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
答案2
从技术上来说,按照你问的方式是不可能的。不知道还有其他方法吗