如何使用zsh提示符下输入的文本搜索历史记录?


58

在zsh中,我知道可以使用Ctrl+ 搜索历史记录r。但是,通常我会开始在提示符下直接键入命令,但后来意识到我应该在搜索历史记录。当我按Ctrl+时r,它会弹出一个空白的历史搜索提示,如下所示:

未预先填写历史记录搜索提示

请注意在我的提示下如何显示文本,而在历史记录搜索提示下却没有。如何使用提示中已有的文本开始历史搜索,因此看起来像这样:

历史搜索提示已预先填写

Answers:


44

您可以使用zle的history-search功能:

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

根据提示中已经输入的内容,此操作将绑定历史记录UpDown(根据您自己的转义序列进行调整)后退和前进。

因此,如果您输入“ vim”并单击Up,则zsh将仅对那些以“ vim”开始的命令向后遍历您的历史记录。

通过使用history-search-end函数(通常位于中/usr/share/zsh/functions/Zle/)从zsh的历史记录中选择所需的命令并将其追加-end到每行的末尾,您还可以将光标置于行的末尾,如下所示:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end

太好了谢谢。我必须删除两个bindkey命令的“ -end”,以使它们正常工作。我尚未编辑您的答案,因为也许在某些情况下有必要这样做?
肖恩·麦克凯西

没问题:用您想要澄清的细节更新了答案。
jasonwryan

直到2015年11月下旬,当我升级到最新版本的oh my zsh时,它才对我有用。有任何想法吗?建议?有人看到吗?如何调试?
哈尼

2
@hanielabed Oh-my-Zsh是clusterfsck;我一点也不感到惊讶,它会破坏历史搜索等根本性的东西……
jasonwryan

1
有没有一种方法可以使光标从空的历史记录搜索跳到末尾,但保持部分搜索的位置不变?这就是当前在bash中发生的情况。
CMCDragonkai '17

19

另一个有用的选择是 history | grep

分配一个别名,例如

alias hg='history | grep'

然后您可以键入hg whatever搜索使用的命令,例如

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

我将此别名放在我的点文件中。


17
是什么使hg我想起...哦,是的,水星!

12

如果您使用的是oh-my-zsh,请添加history-substring-search到该plugins=(...)行。

然后加

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

阅读的线下面的某处source $ZSH/oh-my-zsh.sh。保存并启动新终端或source ~/.zshrc在当前终端中运行。

注意:这 ^[[A是我使用的终端(kitty)和其他许多终端中向上箭头的转义序列。要签入您选择的终端,请键入showkey -a,然后按您要查找其转义序列的键。


目前尚不清楚此键盘映射的作用,上面的回答解释说:“这会根据提示中已经输入的内容,将Up(向上)和Down(向下)(根据您自己的转义序列进行调整)绑定到历史记录搜索中,然后向前和向后绑定。”
科林D

@ColinD添加了注释以澄清
joelostblom

1
子字符串搜索是最好的,它的命令超集从此开始。不用成为我的oh-my-zsh用户来实现brew install zsh-history-substring-search,请查看回购自述文件中的说明,然后继续创建答案,我对结果感到非常满意。
梅林


4

我强烈建议使用"$terminfo[kcuu1]""$key[Up]"而不是硬编码的东西一样"^[[A"可能会或可能不会任何特定的系统上运行。

查看/etc/zsh/zshrc更多密钥。这是我的系统上的样子。我认为terminfo密钥更有可能被定义。

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)

4

那使用zsh-autosuggestions呢?

问题是,对于您键入的每个命令,此插件都会向您显示一些可以接受或不接受的建议。试试看,给我们一些反馈。

没有插件,我们可以按Ctrlr一下历史记录上的反向搜索,一旦您开始键入匹配的命令就会显示为建议。


2

我使用vi-mode插件。然后在〜/ .zshrc中,我具有以下绑定:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

这样一来^P^N如果我没有输入任何文本,则可以使用和作为正常向后和向前搜索,如果输入则可以作为过滤搜索。


1

我同意Cheflo的观点,“子字符串”搜索更有用。我不能在那发表评论,所以我开始了一个新的答案。我使用oh-my-zsh,并将“ history-substring-search”添加到〜/ .zshrc的plugins =(...)。然后源〜/ .zshrc。不需要添加更多。使用“ bindkey”来验证:

“ ^ [OA”历史记录子字符串搜索
“ ^ [OB”历史记录-子字符串搜索-向下

稍后,您键入“至”和向上箭头,将出现“历史记录”并突出显示“至”(如果您之前使用过“历史记录”命令)。



0

因为我使用oh-my-zsh,并且使用joelostblom James的子字符串解决方案,所以我像这样修改.zshrc :(在第13行中,找到“ source $ ZSH / oh-my-zsh.sh”行。 ,然后修改周围的代码。)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

bindkey -v会破坏ctrl-a,ctrl-e。最有可能是所有ctrl命令。
Michael Ozeryansky

0

Non-Oh-My-Zsh答案

这对我有用(在macOS上),可以通过向上/向下箭头轻松访问子字符串历史记录。密钥绑定取决于您。

子字符串搜索历史比仅访问以字符串开头的命令更好。在大多数情况下,这更像ctrl -r,即那些没有glob或正则表达式匹配的情况。

zsh-users / zsh-history-substring-search的说明开始

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

现在充分享受这一点。

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.