8

我想在 Zsh shell中实现与将当前目录保存到 bash 历史记录相同的问题。我之前没有做过任何 Zsh 诡计,但到目前为止我有:

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

现在,我将使用目录名称注释的命令保存到日志文件中。这对我来说很好。只是认为可能有一种方法可以在历史缓冲区本身中进行相同的替换。

4

3 回答 3

9
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
}
于 2010-05-13T12:07:27.323 回答
3

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

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

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

于 2011-10-13T17:20:22.563 回答
1

ZyX 解决方案的以下改编解决了一个问题,即使用 ⍐ (UpArrow) 重用历史命令会导致历史堆积 ### $PWD

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

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

于 2021-04-07T13:37:37.813 回答