Answers:
使用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
。
如果您将其bash
用作shell,这不是一个很好的答案,而是一个替代方案:您可以在中创建一些别名.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
:
history -w
)history -c
)/home/user/.a_history
并读取(history -r
)HISTFILE
。没有理由将其导出到其他程序,并且每个交互式bash进程都将执行〜/ .bashrc,因此设置它的代码将始终在每个bash中运行。通常,如果默认情况下未导出外壳定义的变量,则很少应导出它。
如果您使用的是ZSH,请看一下我最近写来处理此问题的这个小插件:
https://github.com/ericfreese/zsh-cwd-history
它HISTFILE
为您在其中执行命令的每个目录存储一个单独的目录,并在更改目录时添加了一个chpwd
在HISTFILE
s 之间切换的钩子。
它还提供了一个zle小部件,您可以将其绑定到按键,这将HISTFILE
在您的原始“全局” HISTFILE
和HISTFILE
当前工作目录的之间切换。
它最初基于Jim Hester的per-directory-history插件,但此后被重新编写以修复该插件的许多问题。
我写了一个ZSH插件,它可以满足您的需求:https : //github.com/tymm/zsh-directory-history
与其他解决方案相比,我的插件自动返回到全局历史记录。这意味着您不必在目录历史记录和全局历史记录之间切换。
但是我想其他解决方案要轻一些。