2010-05-13 64 views
5

我希望在zsh shell中达到与Saving current directory to bash history中所述相同的效果。我没有做任何的zsh trickry之前,但到目前为止,我有:将当前目录保存到zsh历史中

function precmd { 
hpwd=$history[$((HISTCMD-1))] 
if [[ $hpwd == "cd" ]]; then 
cwd=$OLDPWD 
else 
cwd=$PWD 
fi 
hpwd="${hpwd% ### *} ### $cwd" 
echo "$hpwd" >>~/.hist_log 
} 

现在我保存的目录名到一个日志文件注释的命令。这对我来说很好。只是认为可能有办法在历史缓冲区中进行替换。

+3

可能的重复[我如何(从脚本)添加一些东西到zsh命令的历史?](http://stackoverflow.com/questions/2816225/how-can-i-from-a-script-add - 什么东西到这个zsh命令历史) – 2010-05-13 11:02:53

回答

6
function _-accept-line() { 
    [[ -z "${BUFFER" ]] || [[ "${BUFFER}" =~ "### ${(q)PWD}\$" ]] || BUFFER="${BUFFER} ### ${PWD}" 
    zle .accept-line 
} 
zle -N accept-line _-accept-line 

将添加### ${PWD}到您的命令行。不是你可以使用的最好的解决方案,但它的工作原理。

UPD:基于@Dennis威廉姆森的评论答案:

function zshaddhistory() { 
    print -sr "${1%%$'\n'} ### ${PWD}" 
    fc -p 
} 
+0

谢谢丹尼斯和Zyx。它按预期工作。丹尼斯,这是重复的。不知何故,这个问题没有在我的搜索过程中显示出来。你关于bash/zsh历史的文章很有帮助,而且内容翔实。 – Sandeep 2010-05-13 20:06:46

+0

有人可以向我解释为什么'fc -p'需要?为什么当我不在这里放置'fc -p'时,历史列表为每个命令获得两个条目(第一个是包含路径的条目,第二个条目是简单的)? – 2013-07-08 21:30:20

+0

我一直在努力解析'#'字符,但开启'setopt interactivecomments'解决了这个问题,我现在对这个设置很满意。当你遍历它时,它扩大了命令历史,这让我很难过。 – 2013-07-09 01:55:27

3

而不是将其存储在我增加了以下我PRECMD的beginging()函数来存储它,当我更改目录的每一个命令:

if [ "$LAST_DIR" != "$PWD" ] 
    then 
      print -s "##dir## $PWD" 
      LAST_DIR=$PWD 
    fi 

添加一个“## DIR DIR ##名”独立线到历史中的每个命令是从一个新的目录中运行时间。

+1

我喜欢'print -s“$ PWD#Path”',这样我可以调出这个历史记录全部正常,并且它已经准备就绪对我来说,按Enter键自动切换到该路径(这是'zsh'的一个特性,如果你只是提供'cd' /'pushd'的路径)。 **然而,**我确实相信这种方法存在根本上的缺陷:如果你有两个开放的术语,每个术语都在不同的目录中,然后保留它们各自的目录,但在它们之间切换发出命令,不可能知道哪些目录发生了这些命令在!这是失败:( – 2013-07-09 01:50:49