简而言之,我想将Ctrl + 2
映射到我的.zsh_history文件中最近记录的第二个命令。通常我会输入!-2
来实现这一目标。但是,要在shell函数中重新创建此行为,我写了以下内容:
function two_back {
HISTFILE=~/.zsh_history
command=$(history | tail -n 2 | head -n 1 | cut -c 8-)
echo -n "$command"
}
这会输出我期望的值,所以对我来说似乎很好。实际上,如果我只运行函数two_back
并按<Enter>
,它就会按预期工作。在将函数绑定到某些键击之后,问题似乎就显现出来了。
首先我将该函数转换为zsh小部件,以便我可以将它绑定到某些按键...
$ zle -N two_back_widget two_back
然后我使用bindkey
命令创建映射...
$ bindkey '^@' two_back_widget
现在当我输入Ctrl + 2
时,我的z-shell行编辑器zle
包含了我期望的输出。但是当我按<Enter>
尝试运行命令时没有任何反应......其他人可以重现这个吗?有谁知道为什么这不起作用?
答案 0 :(得分:2)
这不起作用的原因是,当命令被打印到终端(输出)时,它没有写入终端(输入)。
为了实际输入命令,就像输入shell一样,这应该有效:
function two_back {
HISTFILE=~/.zsh_history
command=$(history | tail -n 2 | head -n 1 | cut -c 8-)
BUFFER="$command"
CURSOR=$#BUFFER
}
zle -N two_back_widget two_back
bindkey '^@' two_back_widget
BUFFER
包含当前命令行。它也可以修改。在这种情况下,BUFFER
设置为command
的值。写入BUFFER
可以有效地在命令行上编辑当前命令。CURSOR
包含命令行上的光标位置。通过将其设置为BUFFER
的长度,光标将被放置在输入的末尾。这不是严格必要的,如果不设置它,光标将保持在同一位置。如果命令行以前是空的,则光标将位于命令的最左侧。