我希望实现与此处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
}
现在我将带有目录名称注释的命令保存到日志文件中。这对我来说很好。只是想到可能有一种方法可以在历史缓冲区中进行替换。
答案 0 :(得分:7)
function _-accept-line() {
[[ -z "${BUFFER" ]] || [[ "${BUFFER}" =~ "### ${(q)PWD}\$" ]] || BUFFER="${BUFFER} ### ${PWD}"
zle .accept-line
}
zle -N accept-line _-accept-line
将### ${PWD}
添加到您的命令行。不是您可以使用的最佳解决方案,但它确实有效。
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,执行一个旧命令而不通过注释退格,而新的历史项将只有当前工作目录的一个注释。