zsh bindkey与历史记录

时间:2016-08-07 18:46:53

标签: shell command-line zsh

简而言之,我想将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>尝试运行命令时没有任何反应......其他人可以重现这个吗?有谁知道为什么这不起作用?

1 个答案:

答案 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

说明:

  • zle小部件中 BUFFER包含当前命令行。它也可以修改。在这种情况下,BUFFER设置为command的值。写入BUFFER可以有效地在命令行上编辑当前命令。
  • CURSOR包含命令行上的光标位置。通过将其设置为BUFFER的长度,光标将被放置在输入的末尾。这不是严格必要的,如果不设置它,光标将保持在同一位置。如果命令行以前是空的,则光标将位于命令的最左侧。