是否有可能...
加强本地 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/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
因此,如果您启用了本地历史记录,您就可以查看全局历史记录,反之亦然。
答案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-history
或up-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改变本地历史偏好后,重新定义了用于搜索的开头,因此整个找到的第一个命令将作为第二次搜索的开头。