有没有办法让现代 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
:
- 您将被移动到您的项目目录中
- 当前历史记录将被保存 (
history -w
) - 那么内存中保存的历史记录将被重置 (
history -c
) - 项目历史文件将被设置为
/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
在原始“全局”HISTFILE
和HISTFILE
当前工作目录之间切换。
它最初是基于Jim Hester 的每个目录历史记录插件,但此后已从头开始重写,以解决该插件的许多问题。
答案4
我写了一个 ZSH 插件,它可以满足你的需求: https://github.com/tymm/zsh-directory-history
与其他解决方案相比,我的插件会自动回退到全局历史记录。这意味着您不必在目录历史记录和全局历史记录之间切换。
然而,我想其他解决方案更加轻量级。