ZSH ZLE小部件从历史记录中删除接受行命令

ZSH ZLE小部件从历史记录中删除接受行命令,zsh,history,Zsh,History,我想为zsh添加一些额外的语法。我希望//some/path/to/file相对于源代码树的根(/src/repositories/projects)。因此运行ls//some/path/to/directory应该列出/src/repositories/projects/some/path/to/directory中的文件 我发现最好的方法是使用一个ZLE accept line小部件,它用完整的UNIX路径重写/…路径/src/repositories/projects/…,然后调用命令。这

我想为zsh添加一些额外的语法。我希望
//some/path/to/file
相对于源代码树的根(
/src/repositories/projects
)。因此运行
ls//some/path/to/directory
应该列出
/src/repositories/projects/some/path/to/directory
中的文件

我发现最好的方法是使用一个ZLE accept line小部件,它用完整的UNIX路径重写
/…
路径
/src/repositories/projects/…
,然后调用命令。这非常有效,但它将
/…
语法内联扩展并将扩展存储在历史记录中,这会使搜索变得更复杂。我想在历史记录中存储原始的
/…
语法,同时保留
/src/repositories/projects/…
语法

我可以使用
print-s
将原始的
/…
语法添加到历史记录中,但是我无法将扩展的语法保留在历史记录之外。当前我的代码如下所示:

function accept-line-override() {
  # Add untranslated command to history
  print -s "$BUFFER"

  # Translate //... paths to /src/repositories/projects/...
  BUFFER=$(fix-paths "$BUFFER")

  # Invoke command with new paths
  zle .accept-line
}

zle -N accept-line accept-line-override
这为每个调用的命令提供了两行历史记录:

$ echo //test
/src/repositories/projects/test
$ history | tail -n 2
10020  echo //test
10021  echo /src/repositories/projects/test
有什么方法可以阻止zle.accept行将其命令添加到历史记录中?我见过涉及
history-d
的方法,但这些方法似乎只适用于bash。我还看到了可以做的事情:

function accept-line-override() {
  # Add untranslated command to history
  print -s "$BUFFER"

  # Translate //... paths to /src/repositories/projects/...
  BUFFER=$(fix-paths "$BUFFER")

  # Manually invoke line so it is not added to history
  echo
  eval $BUFFER
  echo

  # Reset prompt
  BUFFER=""
  zle .reset-prompt
}

但这导致了许多不希望出现的副作用,从Emacs拒绝打开到命令执行前未清除的自动完成。如果可能的话,我非常希望避免这种复杂性。有没有解决这个问题的办法?

在我看来,您可以通过使用Zsh而不是自己替换
/
来避免大多数问题。例如:在运行
hash-dsome=/src/repositories/projects/some
之后,您可以使用
~some/path/to/file
而不是
/some/path/to/file
,Zsh将其自身扩展为
/src/repositories/projects/some/path/to/file
。您可以在/src/repositories/projects/*(/)中为dir使用
;hash-d${${dir}#*/}///}=$dir
为所有项目创建名称。他已经找到了解决方案,但正在尝试清理历史记录。回答到x最好的方法是从其他地方开始可能没有帮助。我自己也喜欢warp drive zsh插件。例如,wd test会将我带到/src/repositories/projects/test,对我来说,生活会愉快地继续。@Adaephon,我不熟悉命名目录,这肯定是我将来必须记住的一个有用功能。但是,如果可能的话,我更愿意使用
/
语法。有没有办法利用一个名为
/
的命名目录?在我看来,使用Zsh而不是自己替换
/
可以避免大多数问题。例如:在运行
hash-dsome=/src/repositories/projects/some
之后,您可以使用
~some/path/to/file
而不是
/some/path/to/file
,Zsh将其自身扩展为
/src/repositories/projects/some/path/to/file
。您可以在/src/repositories/projects/*(/)中为dir使用
;hash-d${${dir}#*/}///}=$dir
为所有项目创建名称。他已经找到了解决方案,但正在尝试清理历史记录。回答到x最好的方法是从其他地方开始可能没有帮助。我自己也喜欢warp drive zsh插件。例如,wd test会将我带到/src/repositories/projects/test,对我来说,生活会愉快地继续。@Adaephon,我不熟悉命名目录,这肯定是我将来必须记住的一个有用功能。但是,如果可能的话,我更愿意使用
/
语法。是否有任何方法可以利用标记为
/
的命名目录?