保留每个工作目录的历史记录(参见每个 shell 会话)

保留每个工作目录的历史记录(参见每个 shell 会话)

有没有办法让现代 shell 的历史功能限定在路径范围内?

我的工作上下文被分割为文件系统上的路径,并且 shell 活动的模式(例如重复发出的命令)对于每个“项目”来说往往是不同的。如果我可以将历史功能范围限制为从当前路径(或子路径)发出的命令,那就太好了。

答案1

这不是一个简洁的答案,但如果您用作 shell,则可以选择bash:您可以在.bashrc.

例如:

alias a='cd /tmp/A ; history -w ; history -c ; export HISTFILE=/home/user/.a_history ; history -r $HISTFILE'
alias b='cd /tmp/B ; history -w ; history -c ; export HISTFILE=/home/user/.b_history ; history -r $HISTFILE'

然后,如果您输入a

  1. 您将被移动到您的项目目录中
  2. 当前历史记录将被保存 ( history -w)
  3. 那么内存中保存的历史记录将被重置 ( history -c)
  4. 项目历史文件将被设置为/home/user/.a_history并读取 ( history -r)

答案2

有了zsh,你可以这样做:

mkdir -p ~/.zsh/dirhist

并添加到你的~/.zshrc:

HISTSIZE=1000
SAVEHIST=10000
setopt HIST_SAVE_NO_DUPS INC_APPEND_HISTORY
HISTFILE=~/.zsh/dirhist/${PWD//\//@}
chpwd() {
  [[ $PWD = $OLDPWD ]] || fc -Pp ~/.zsh/dirhist/${PWD//\//@}
}

chpwd()每当当前目录更改时都会调用。在那里,我们将历史文件重置为类似~/.zsh/dirhist/@foo@bar当您cd访问/foo/bar.

答案3

如果您使用 ZSH,请看一下我最近编写的这个小插件来处理这个问题:

https://github.com/ericfreese/zsh-cwd-history

HISTFILE它为您在其中执行命令的每个目录存储一个单独的目录,并添加一个钩子以在您更改目录时在 schpwd之间进行切换。HISTFILE

它还提供了一个 zle 小部件,您可以绑定到按键,该按键将HISTFILE在原始“全局”HISTFILEHISTFILE当前工作目录之间切换。

它最初是基于Jim Hester 的每个目录历史记录插件,但此后已从头开始重写,以解决该插件的许多问题。

答案4

我写了一个 ZSH 插件,它可以满足你的需求: https://github.com/tymm/zsh-directory-history

与其他解决方案相比,我的插件会自动回退到全局历史记录。这意味着您不必在目录历史记录和全局历史记录之间切换。

然而,我想其他解决方案更加轻量级。

相关内容