shell 中的 Tab 触发片段

Tab-triggered snippets in shell

有没有办法在 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