单独向上箭头回溯本地和全局 ZSH 历史记录

Mik*_*maa 29 zsh command-history

是否有可能...

  • 加强本地 ZSH shell 历史记录(操作仅在该提示中发生)

  • 加强全局 ZSH 历史记录(共享历史记录已打开)- 默认情况下,当共享历史记录打开时按向上箭头时会发生什么

... 分别地。

例如,可以将 CTRL+up 绑定为全局历史,正常为本地历史。同时,将全局历史用于向后历史搜索(即CTRL+ R)是有意义的。

这可能会加速某些 shell 操作,因为某些操作特定于该 shell 窗口,并且您想返回到它们中。

lum*_*ric 27

将此复制并粘贴到您的.zshrc

游标使用本地历史:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history
Run Code Online (Sandbox Code Playgroud)

如果您还需要键绑定(CTRL+ 游标)来逐步浏览全局历史记录,请将其添加到您的.zshrc

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down
Run Code Online (Sandbox Code Playgroud)

为了使这项工作起作用,需要启用选项 SHARE_HISTORY(请参阅16.2.4 History)。运行setopt并检查是否列出了“sharehistory”。如果没有添加setopt sharehistory到您的.zshrc. 然后可以像我们上面所做的那样使用 set-local-history 。文档说:

默认情况下,历史移动命令访问导入的行和本地行,但您可以使用 set-local-history zle 绑定打开和关闭它。也可以创建一个 zle 小部件,使某些命令忽略导入的命令,而有些则包含它们。

请注意,默认情况下使用全局历史记录(并且所有函数都以“zle set-local-history 0”结尾,即禁用本地历史记录)。因此,默认情况下按CTRL+R将搜索全局历史记录(这在大多数情况下是有意义的)。

这与@mpy 的解决方案非常相似,但已准备好进行复制和粘贴。它会向上和向下覆盖光标键。我使用了这个邮件列表条目

也可以看看:

  • 在 zsh 5.0.2 上,我收到一个错误,指出它无法绑定到空键序列。即使我用下面另一个答案中的键替换它,向上/向下和 Ctrl+向上/向下都只会遍历全局历史记录。我在这里做错了什么吗? (2认同)
  • @rjh:试试这个:在像 vim 这样的编辑器中,删除 `${key[Up]}`。然后(在编辑模式下),键入 Ctrl+V,然后键入向上箭头。这应该插入正确的密钥代码。对向下箭头执行相同的操作。 (2认同)

mpy*_*mpy 5

您可以设置一个特殊的 zle 小部件以仅显示本地历史记录项目:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history
Run Code Online (Sandbox Code Playgroud)

假设绑定到up-line-or-history(我认为这是默认值),您可以将此小部件绑定到另一个击键,例如CTRL+

 bindkey "^[Oa" only-local-history
Run Code Online (Sandbox Code Playgroud)

如果这有效可能取决于您的终端。上面的行在URxvt/Screen. 有了xterm你需要

 bindkey "^[[1;5A" only-local-history
Run Code Online (Sandbox Code Playgroud)

对于CTRL+

另一种变体可能是

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history
Run Code Online (Sandbox Code Playgroud)

因此,如果您启用了本地历史记录,则可以查看全局历史记录,反之亦然。


小智 5

@lumbic 的答案对我有用,只需进行一些更改:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down
Run Code Online (Sandbox Code Playgroud)

此代码将全局历史记录设置为默认值,并使用 CTRL-箭头作为本地历史记录。

注意:我将 zsh 5.0.2 与 oh-my-zsh 一起使用。