shell 如何保存当前工作目录到Zsh历史?

qjp7pelc  于 2023-06-06  发布在  Shell
关注(0)|答案(4)|浏览(583)

我想实现与这里所要求的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
}

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

hgqdbh6s

hgqdbh6s1#

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
}
ccgok5k5

ccgok5k52#

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

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

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

7fhtutme

7fhtutme3#

以下对ZyX's solution的调整解决了一个问题,即使用(向上箭头)重复使用历史命令会导致历史中### $PWD堆积:

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

它在添加当前的PWD注解之前剥离所有现有的PWD注解。这样,我就可以自由地点击向上箭头,执行一个旧的命令,而不需要通过注解退格键,并且新的历史记录项将只有一个注解与当前的工作目录。

c3frrgcw

c3frrgcw4#

我修改了zsh的源代码;历史文件如下:

: 1685803508:/home/gogogo/abc/;tail -f ~/.histfile

以前的事不要改

diff --git a/Src/hist.c b/Src/hist.c
index bff0abe..9de1a3d 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -29,6 +29,7 @@
 
 #include "zsh.mdh"
 #include "hist.pro"
+#include <unistd.h>
 
 /* Functions to call for getting/ungetting a character and for history
  * word control. */
@@ -3027,9 +3028,11 @@ savehistfile(char *fn, int err, int writeflags)
                histfile_linect++;
            }
            t = start = he->node.nam;
+           char cwd[PATH_MAX];
+           getcwd(cwd, sizeof(cwd));
            if (extended_history) {
-               ret = fprintf(out, ": %ld:%ld;", (long)he->stim,
-                             he->ftim? (long)(he->ftim - he->stim) : 0L);
+               ret = fprintf(out, ": %ld:%s;", (long)he->stim, cwd);
+                             // he->ftim? (long)(he->ftim - he->stim) : 0L);
            } else if (*t == ':')
                ret = fputc('\\', out);

相关问题