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