有没有办法在 bash 或 zsh 中使用 tab 键来触发片段,例如 Sublime Text 呢?
例如,如果我配置了x
应该扩展为~/projects/one/two/x/
,那么:
$ cd x[TAB]
会变成
$ cd ~/projects/one/two/x/
有没有办法在 bash 或 zsh 中使用 tab 键来触发片段,例如 Sublime Text 呢?
例如,如果我配置了x
应该扩展为~/projects/one/two/x/
,那么:
$ cd x[TAB]
会变成
$ cd ~/projects/one/two/x/
实际上,这在 zsh 中很容易。
首先,您需要一个 shell 函数,如果满足条件(这里,如果 zle 特殊变量$LBUFFER
- 即 zle 缓冲区中当前位置左侧的内容 - 是x
) 并回退到常规完成否则:
expandSnippetOrComplete() {
[[ $LBUFFER = x ]] && LBUFFER=~/projects/one/two/x/ || zle expand-or-complete
}
其次,你必须使这个 shell 函数成为一个 zle 小部件,即一个可以在 zle 中而不是从命令行调用的函数。
zle -N expandSnippetOrComplete
第三,您必须将此小部件绑定到 tab 键:
bindkey "^i" expandSnippetOrComplete
而已!
现在,如果 zle 缓冲区中当前位置之前的最后一个单词是 ,您可能想要这样做x
,无论它是否在开头。如果是这样,那么这应该可以解决问题:
local ALBUFFER
ALBUFFER=($=LBUFFER) # split $LBUFFER on $IFS, put the resulting in $ALBUFFER
[[ $ALBUFFER[-1] = x ]] && LBUFFER[-1]=~/projects/one/two/x/ || zle expand-or-complete