将当前目录保存到zsh历史记录

时间:2010-05-13 02:04:34

标签: shell zsh zshrc

我希望实现与此处Saving current directory to bash history相同但在zsh shell中实现的相同功能。我之前没有做任何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 个答案:

答案 0 :(得分:7)

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

### ${PWD}添加到您的命令行。不是您可以使用的最佳解决方案,但它确实有效。

UPD:根据@Dennis Williamson的评论回答:

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

答案 1 :(得分:3)

我没有将它存储在每个命令上,而是将以下内容添加到我的precmd()函数的beging中以便在我更改目录时存储它:

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

每次从新目录运行命令时,将“## dir ## dir name”独立行添加到历史记录中。

答案 2 :(得分:0)

ZyX's solution 的以下改编解决了使用 ⍐ (UpArrow) 重用历史命令会导致历史中 ### $PWD 堆积的问题:

function zshaddhistory() {
  history_item="${${1%%$'\n'}%%$' ###'*} ### ${PWD}"
  print -sr ${(z)history_item}
  fc -p
  return 1
}

在添加当前注释之前,它会删除任何现有的 PWD 注释。这样我就可以自由地点击 UpArrow,执行一个旧命令而不通过注释退格,而新的历史项将只有当前工作目录的一个注释。