有没有办法在 zsh 中实现可扩展的片段?
我希望能够写入ssh ssh_alias -t :tmux
按下 tab 键,这将扩展为`ssh ssh_alias -t“tmux a||tmux”
我希望这种行为是全局的,因此此代码片段可以在其他地方工作mosh ssh_alias - :tmux
最后,我希望这种行为能够超越特定命令的完成规则。
目前,我正在使用“Dash”实现类似的目标
答案1
有一个插件:zsh-片段. 使用类似插件管理器插件。它与 Meta-x 绑定,经过测试 – 有效。以下是完整的 zplugin 报告:
Plugin report for willghatch/zsh-snippets
-----------------------------------------
Source snippets.plugin.zsh
Zle -N snippet-expand
Bindkey ^[x snippet-expand
Zle -N run-help-list-snippets
Functions created:
help-list-snippets run-help-list-snippets
snippet-add snippet-expand
Variables added or redefined:
snippets [ "" -> association ]
答案2
您可以尝试使用全局别名。与常规别名相反,无论它们出现在命令行的什么位置,它们都会被扩展,而不仅仅是在命令位置。
alias -g :tmux='"tmux a || tmux"'
这样,:tmux
将扩展为(替换为)"tmux a || tmux"
。请注意,您需要将其引用两次,一次用于定义,一次用于最终命令行。因此,如果您运行
ssh ssh_alias -t :tmux
zsh
将替换:tmux
并执行
ssh ssh_alias -t "tmux a || tmux"
通常,按下时不会显示扩展名Tab- 就像常规别名一样。话虽如此,该_expand_alias
小部件可用于扩展别名。您可以直接调用它(在 emacs 模式下,它绑定到Ctrl+ x, a。vi 模式下没有默认绑定,但您可以使用 以从 vicmd 模式运行它:_expand_alias
)或将其添加到completer
zstyle。