我最近从 bash 切换到 zsh。在 bash 中,我用来查找以前运行的命令的一种方式(除了递归搜索)是history | grep whatever
,whatever
我记得的命令部分在哪里。
在 zsh 中,这不起作用。history
只返回几个项目,即使我的.zsh_history
文件包含许多条目,我已将其配置为执行此操作。
我怎样才能输出我的整个历史记录,以适合搜索grep
?
答案1
History 接受 zsh 条目中的一系列作为[first] [last]
参数,因此要运行它们history 0
。
要获得 zsh 帮助(至少在头脑中),请输入Alt-h
历史命令,这将调出内置帮助。
答案2
接受的答案是正确的,但值得注意的是你没有需要调用外部grep
二进制文件进行搜索,因为该功能是内置的。我在我的中定义了这个函数.zshrc
:
histsearch() { fc -lim "*$@*" 1 }
笔记:
fc
是控制交互历史记录的内置 zsh。history
相当于fc -l
。该
-m
标志需要一个模式,必须用引号引起来。该
-i
标志添加了时间戳。fc
还有更多技巧(例如将搜索限制在当前会话的内部历史记录中)。请参阅zshbuiltins(1)
手册页或官方文档。
编辑(2021-01-27):
与仅 grep zsh 历史文件相比,使用此方法的一个主要优点是您可以通过 获得人类可读的时间戳-i
。当然,这只有在您首先启用将时间戳保存到历史文件时才有效:
setopt EXTENDED_HISTORY
多年来,我还将-D
标志添加到我的函数中,该标志显示历史记录中命令的运行时间。 (这再次依赖于EXTENDED_HISTORY
。)另外,我已将函数重命名为hgrep
,我发现这样更容易记住:
hgrep () { fc -Dlim "*$@*" 1 }
答案3
答案4
使用 FZF 进行历史记录
包括来自这里的其他帖子的建议,我找到了实现使用搜索历史记录的最佳方法(至少对我来说)fzf
。
- 首先确保您已经安装了
fzf
,另外您还需要bat
。 - 配置您的
fzf
as(将其放入您的别名中)
#########################################################
# CHECK THE BINARY OF FZF
# URL: https://github.com/Homebrew/brew/blob/master/docs/\
# FAQ.md#why-is-the-default-installation-prefix-opthomebrew-on-apple-silicon
#########################################################
case $(uname -s) in
"Darwin")
if [ "$(uname -m)" = "arm64" ]; then
fzf_binary="/opt/homebrew/bin/fzf"
elif [ "$(uname -m)" = "x86_64" ]; then
fzf_binary="/usr/local/bin/fzf"
fi
;;
"Linux")
if [ "$(uname -m)" = "x86_64" ]; then
fzf_binary="/home/linuxbrew/.linuxbrew/bin/fzf"
fi
;;
esac
alias fzf="$fzf_binary --preview-window top:30 --preview '([[ -f {} ]] && (bat --style=numbers --color=always\
{} || bat {})) || ([[ -d {} ]] && (tree -C {} | less)) || echo {} 2> /dev/null | head -200'"
- 将 pip 添加
history 0
到fzf
使用
history 0 | fzf