Zsh:如何在命令后自动完成?

Zsh:如何在命令后自动完成?

大家好。要解释清楚我想要做什么有点困难。

我想创建一个脚本“example”,它可以在你使用短参数运行它后为你输入长命令。例如,

$ example server # I input this line manually
$ ssh [email protected] # This line is automatically generated by the above command

这样我就可以在当前行编辑命令行。

我正在使用 shell ZSH。我尝试过类似的方法history,但最终失败了。有什么建议吗?

答案1

我认为运行外部脚本是不可能的(或者至少是非常黑客的),因此任何东西都会被放在提示上进行进一步的编辑

话虽如此,您可以使用自己的功能(即所谓的小部件)来扩展 zle(zsh 的命令行编辑器)。

任何用户定义的小部件都可以访问BUFFER,其中包含编辑缓冲区,也可以进行修改。

这是一个简短的原型:

function example () {
    if [[ $BUFFER = 'server' ]]; then
        LBUFFER='ssh [email protected] '
    else
        zle accept-line
    fi
}

zle -N example
bindkey '^M' example

zle -N example创建一个名为的新窗口小部件example,并将其映射到同名函数。bindkey '^M' exampleControl+ M(也称为 )映射Return到窗口小部件example。因此,每次您只需键入“服务器”并按下Return它就会被替换,并且光标会放在末尾以供进一步编辑,而任何其他行都会按原样执行/接受。ssh [email protected]

答案2

除了使用 shell 函数,你还可以使用键绑定。例如:

bindkey -s '\C-e\C-l' 'ssh [email protected]'

这里-s创建一个字符串替换,请参见man zshzle

-s in-string out-string ... 将每个输入字符串绑定到每个输出字符串。输入字符串时,输出字符串将被推回并视为行编辑器的输入。当还使用 -R 时,将输入字符串解释为范围。

通过上述示例,您可以使用CTRL+ECTRL+L在当前光标位置插入到命令行中。ssh [email protected]

这样做的好处是,您可以轻松地使用此快捷方式来构造管道,例如

猫 foo | CTRL+E, CTRL+L  => 猫 foo | ssh[电子邮件保护]

相关内容