ZSH-输出整个历史记录?

ZSH-输出整个历史记录?

我最近从 bash 切换到 zsh。在 bash 中,我用来查找以前运行的命令的一种方式(除了递归搜索)是history | grep whateverwhatever我记得的命令部分在哪里。

在 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

看一下陣陣。它不仅有助于查找 shell 历史记录中的“任何粒子”,还有助于查找其他有趣的地方,例如浏览器历史记录、目录历史记录等。

fzf 是一个命令行模糊查找器。这意味着您可以搜索要查找的粒子或部分,它会显示一组匹配项,您可以不断对其进行优化。它确实是一个游戏规则改变者。

主页作者提供了许多说明性例子。

答案4

使用 FZF 进行历史记录

包括来自这里的其他帖子的建议,我找到了实现使用搜索历史记录的最佳方法(至少对我来说)fzf

  1. 首先确保您已经安装了fzf,另外您还需要bat
  2. 配置您的fzfas(将其放入您的别名中)
 #########################################################
#             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'"

  1. 将 pip 添加history 0fzf使用
history 0 | fzf

你应该能够顺利地找到过去的任何命令 在此处输入图片描述

相关内容