大家好。要解释清楚我想要做什么有点困难。
我想创建一个脚本“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' example
将Control+ 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+E,CTRL+L在当前光标位置插入到命令行中。ssh [email protected]
这样做的好处是,您可以轻松地使用此快捷方式来构造管道,例如
猫 foo | CTRL+E, CTRL+L => 猫 foo | ssh[电子邮件保护]