搜索历史命令

很久之前,我是这样对历史搜索增强的,参考我的.zshrc文件

bash 中绑定 up 和 down 在匹配的条件中选择

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

zsh中的绑定:

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

这样 ctrl-r 后搜索 mvn 然后可以用 up/down 选择所有mvn的历史命令。
不过这样如果你刚好使用过“history | grep mvn” 这样的命令时,再通过ctrl-r搜索mvn会把这条也匹配到,并且再继续用方向键时,列出的都是“history | grep”开头的命令;这点有些不爽。

还好有一种稍微好点的方式:敲入一个命令时,通过快捷键列出所有这个命令开头的,并给出序号来选择。

把下面几行放到 .zshrc文件里:

autoload -Uz history-beginning-search-menu
zle -N history-beginning-search-menu
bindkey '^X^X' history-beginning-search-menu

然后在终端,当我敲入 mvn 后,按ctrl-x两次会列出所有mvn开头的命令,然后可以通过输入序号来执行那一次的命令了。

Enter digits:
01 mvn                                                     13 mvn dependency:sources
02 mvn assembly                                            14 mvn dependency:soureces
03 mvn assembly:assembly                                   15 mvn dependency:tree | tee /data/tmp/hsf-dep-tree
04 mvn assembly:assembly -Dmaven.test.skip                 16 mvn eclipse:eclipse
05 mvn clean                                               17 mvn hi /data
06 mvn clean compile                                       18 mvn install
07 mvn clean install -Dmaven.test.skip                     19 mvn package
08 mvn clean package assembly:assembly -Dmaven.test.skip   20 mvn package assembly:assembly
09 mvn compile                                             21 mvn package assembly:assembly -Dmaven.test.skip
10 mvn compile:compile                                     22 mvn3
11 mvn copile                                              23 mvn3 compile
12 mvn dependency:sources                                  24 mvn3 eclipse:eclipse

不过这招仍有些问题,当历史命令里带有管道时,输入序号不起作用了,比如:

hongjiang@whj-mbp ~ % ps #两次ctrl-x
Enter digits:
01 ps -aux | head -2                           12 ps -ef | grep mplayer 
02 ps -aux | head 2                            13 ps -ef | grep fmd 
03 ps -ef                                      14 ps -ef | grep java                            

这时候输入12并不能自动补齐这条历史命令。先配合着与ctr-r一同来用吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注