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

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

是否有可能...

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

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

... 分别地。

例如,可以将 CTRL+up 绑定为全局历史记录,将普通 up 绑定为本地历史记录。同时,使用全局历史记录进行向后历史记录搜索(即CTRL+ R)也是有意义的。

这可能会加速一些 shell 操作,因为某些操作特定于该 shell 窗口并且您希望返回其中。

答案1

复制并粘贴此到您的.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

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

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

为了使此功能有效,可以使用 SHARE_HISTORY 选项(请参阅16.2.4 历史) 需要启用。运行setopt并检查是否列出了“sharehistory”。如果没有,请将其添加setopt sharehistory到您的.zshrc。然后可以像上面一样使用 set-local-history。文档说:

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

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

这与 @mpy 的解决方案非常相似,但可以复制粘贴。它覆盖了上下光标键。我使用了此邮件列表条目

也可以看看:

答案2

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

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

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

 bindkey "^[Oa" only-local-history

这是否有效可能取决于你的终端。上面的代码在 中有效URxvt/Screenxterm你需要

 bindkey "^[[1;5A" only-local-history

对于CTRL+

另一种可能是

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

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

答案3

@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

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

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

答案4

我一直在尝试此处其他答案中列出的选项,但我对它们并不满意。小部件1 up-historyup-line-or-history不包括开始搜索并且小部件1 up-line-or-beginning-search在使用它时更改本地历史记录偏好设置时似乎无法正常工作。2

所以我选择了以下设置。它启用Ctrl+arrows 浏览全局历史记录,Alt+arrows 仅浏览本地历史记录(类似于 Bash),独立箭头使用智能开始搜索(默认为哦我的天啊)。

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    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-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1它们的down对应部分也是隐含的。

2改变本地历史偏好后,重新定义了用于搜索的开头,因此整个找到的第一个命令将作为第二次搜索的开头。

相关内容