我想为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在执行命令之前拒绝打开自动完成而不清除。如果可能的话,我非常希望避免这种复杂性。有什么想法解决这个问题吗?