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


25

是否有可能...

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

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

...分开。

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

这可能会加快某些Shell操作的速度,因为某些操作特定于该Shell窗口,而您想返回到它们。

Answers:


25

复制并粘贴到您的.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的解决方案非常相似,但可以进行复制和粘贴。它将向上和向下覆盖光标键。我使用了此邮件列表条目

也可以看看:


1
在zsh 5.0.2上,我收到一个错误,指出它无法绑定到空键序列。即使我将其替换为下面另一个答案中的键,向上/向下和Ctrl +向上/向下也都可以查看全局历史记录。我在这里做错什么了吗?
rjh

1
@rjh:试试看:在像vim这样的编辑器中,删除${key[Up]}。然后(在编辑模式下)键入Ctrl + V,然后按向上箭头。这应该插入正确的密钥代码。对向下箭头执行相同的操作。
罗宾斯特

我使用了这种方法,并且可以正常工作,但是通过编写命令的初始部分然后按上箭头键,我失去了搜索历史记录的能力。它遍历了Bash之类的所有命令,因此我必须使用来解决Ctrl+R
Melebius

5

您可以设置一个特殊的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/Screen。有xterm你需要

 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

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


4

@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一起使用。


Ctrl+arrows对于本地历史记录,这似乎与OP要求的相反。
Melebius

1

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

所以我来到了以下设置。它使Ctrl+箭头可以浏览全局历史记录,Alt+箭头可以仅浏览本地历史记录(类似于Bash),而独立箭头则可以使用智能开始搜索(默认为Oh My Zsh)。

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更改本地历史记录首选项后,将重新定义用于搜索的开始,因此,将使用第一个找到的整个命令作为第二个搜索中要搜索的开始。


1

根据这里的各种答案,我能够制作一个精简版本:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

此版本将使用新的用户定义的小部件覆盖现有up-line-or-historydown-line-or-history小部件。此小部件启用了本地历史记录,然后将调用原始小部件,这些小部件在.-prefixed名称下可用。有关详细信息,请参见zle小部件文档

这意味着您将保留所有现有的键绑定。因此,您可以避免弄清楚在当前终端中键入向上箭头时的转义序列。


-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

以上答案对我有用。

参考:https : //coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys


您能解释一下这如何区分本地和全球历史吗?恕我直言,您的代码根本不这样做。而且,这似乎已经在Oh My Zsh中设置了。
Melebius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.