安装

安装

我发现我在一个固定的目录中为一个项目做了很多工作。有时——几个月后——我需要在那个项目上重做一些东西,但我记不清我做了什么。我使用 mercurial 或 git 来跟踪更改文件但我希望能够记住我在该目录中发出的命令。

搜索我的 shell 历史记录并不能提供太多信息。我已经将所有内容记录到 .*_history 文件中,但我想要一份我在 ~/foo/bar 中执行的操作列表,而不是我那一周执行的所有其他 (百万) 项操作。我可能甚至不记得我上次在那个特定项目上工作的月份。

有人知道我使用过的所有 shell 命令的项目目录日志文件是怎样的吗?我设想的命令如下:

从事我的项目

...这会将 shell 日志文件设置为 ~/myproject/.history.log,从该日志文件加载以前的历史记录,并且可能更新我的提示以告诉我正在处理哪个目录(例如 vcprompt 提供版本控制信息)。

那里有类似的东西吗?

答案1

如果你还没有弄清楚:你正在寻找的是优秀的虚拟环境包装器包。它是 python 的虚拟环境(去想象)并且,虽然在谈论 python 环境时它通常被提及,但它实际上是一个非常通用的工具,可以满足您的用例。

安装

pip install virtualenvwrapper

或者

easy_install virtualenvwrapper

并将初始化内容添加到你的 shell 配置中(~/.zshrc, ~/.bashrc

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$WORKON_HOME/projects
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
source /usr/local/bin/virtualenvwrapper.sh

用法

# create your env
mkvirtualenv my_project

# edit per project hooks
vim ~/.virtualenvs/my_project/bin/{postactivate,preactivate,predeactivate,etc}

# work in this env
workon my_project

你还可以使用~/.virtualenvs/{postactivate,postdeactivate,etc}每次调用的通用钩子workon any_project

export HISTFILE="$VIRTUAL_ENV/bash_history"因此,例如,钩子中的行~/virtualenvs/postactivate意味着$HISTFILE变量每次都会扩展到不同的项目。

答案2

我也需要这个,我已经想出了一个使用Bash 的 PROMPT_COMMAND 变量

在 Bash 打印每个主提示符之前,会检查变量 PROMPT_COMMAND 的值。如果 PROMPT_COMMAND 已设置且具有非空值,则将执行该值,就像在命令行中输入该值一样。

因此,我在 ~/.bashrc.my 中输入 PROMPT_COMMAND="check_for_local_history",这check_for_local_history是我的一个函数,用于检查上次执行的命令是否是目录更改,如果是,则检查新的当前目录中是否存在 .bash_history 文件。如果存在,则将其用作历史文件。

以下是完整内容:https://gist.github.com/gurdiga/dac8d2e7eb3056d6b839

答案3

我为产品构建子包的框架使用的一个技巧是使用子 shell。

对于 bash 你可以创建一个如下的 shell 脚本:

#!/bin/bash

export PROJECT_DIRECTORY=$(pwd)

exec bash --rcfile $HOME/.project-bashrc

然后$HOME/.project-bashrc输入类似这样的内容:

source $HOME/.bashrc
export HISTFILE="${PROJECT_DIRECTORY}/.bash_history"
cd "${PROJECT_DIRECTORY}"

这还允许您自定义文件中的提示.project-bashrc,这很方便。

我不确定如何在 中执行相同操作zsh。我认为您必须覆盖ZDOTDIR变量。但它看起来很相似。

再见!

答案4

为了获取目录的本地历史文件,我在 bash 提示命令中添加了以下行。

if [ -f .local_history ] ; then tail -1 $HISTFILE >> .local_history ; fi

命令touch .local_history在目录中,然后为我提供在该目录中执行的所有命令的本地历史文件,而不会丢失主历史文件。我猜在 zsh 中也可以使用类似的方法。

相关内容