ZSH ZLE小部件从历史记录

时间:2017-05-19 23:29:12

标签: zsh history

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

我发现这样做的最好方法是使用ZLE接受行窗口小部件,使用完整的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-line将其命令添加到历史记录中?我见过涉及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在执行命令之前拒绝打开自动完成而不清除。如果可能的话,我非常希望避免这种复杂性。有什么想法解决这个问题吗?

0 个答案:

没有答案