Zsh 代码片段实现

Zsh 代码片段实现

有没有办法在 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)或将其添加到completerzstyle。

相关内容