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


11

有没有一种方法可以使现代外壳的历史特征仅限于路径?

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

Answers:


5

使用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


我喜欢这种方法,因为它不需要更改我的shell使用习惯,并且在几天的测试中,它的运行情况似乎不错。
sohocoke

10

如果您将其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

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

我意识到我的问题已经省略了一个愿望/要求,对于所缺少的细节感到抱歉。即:我不想记住使用别名/函数;也就是说,作用域应该作为我通常与shell交互的方式的附件。
sohocoke

不要出口HISTFILE。没有理由将其导出到其他程序,并且每个交互式bash进程都将执行〜/ .bashrc,因此设置它的代码将始终在每个bash中运行。通常,如果默认情况下未导出外壳定义的变量,则很少应导出它。
克里斯·佩奇

1

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

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

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

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

它最初基于Jim Hester的per-directory-history插件,但此后被重新编写以修复该插件的许多问题。


此处不建议仅链接的答案,请添加一些解释/解释。

0

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

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

但是我想其他解决方案要轻一些。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.