ZSH ZLE小部件从历史记录中删除接受行命令
我想为zsh添加一些额外的语法。我希望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/…,然后调用命令。这
//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,我不熟悉命名目录,这肯定是我将来必须记住的一个有用功能。但是,如果可能的话,我更愿意使用/
语法。是否有任何方法可以利用标记为/
的命名目录?