【问题标题】:zsh bindkey with history带有历史记录的 zsh bindkey
【发布时间】:2016-08-07 18:46:53
【问题描述】:

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

【问题讨论】:

    标签: shell command-line zsh


    【解决方案1】:

    这不起作用的原因是,当命令被打印到终端(output)时,它没有被写入终端(input)。

    为了像在 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 的长度,光标将放置在输入的末尾。这不是绝对必要的,如果不设置它,光标将保持在同一个位置。如果命令行之前为空,则光标将位于命令的最左侧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2015-07-26
      • 1970-01-01
      • 2021-04-12
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多