如何阻止 zsh 在管道符号之前吃空间?

sca*_*nny 23 zsh oh-my-zsh

当我'|'在 zsh 命令行上键入一个空格后跟管道符号时,zsh 会占用空间,将管道符号直接放在前面的单词上。我如何阻止它这样做?我不确定任何可能的风格约定,但我喜欢管道符号两侧的空格以提高可读性。我几乎开箱即用地使用 oh-my-zsh。

解决方案

根据下面mpy的回答,我使用了以下解决方案:

默认情况下,zsh/ohmyzsh 中未定义 ZLE_REMOVE_SUFFIX_CHARS。未定义时,它的行为就像:

ZLE_REMOVE_SUFFIX_CHARS=$' \t\n;&|'
Run Code Online (Sandbox Code Playgroud)

我在 ~/.zshrc 中添加了以下定义:

ZLE_REMOVE_SUFFIX_CHARS=$' \t\n;&'
Run Code Online (Sandbox Code Playgroud)

(所有管道除外)和快速,完美!问题消失了。

mpy*_*mpy 22

我想你的意思是当你TAB完成一个命令/文件名时,一个空格会自动添加,但在按下|它后又消失了。否则我无法重现这种效果。

但是,在这种情况下,解决方案应该很简单

ZLE_REMOVE_SUFFIX_CHARS=""
Run Code Online (Sandbox Code Playgroud)

解释有点棘手,所以我简单地引用 man zshparam

ZLE_REMOVE_SUFFIX_CHARS/ZLE_SPACE_SUFFIX_CHARS 这些参数由行编辑器使用。在某些情况下,补全系统添加的后缀(通常是空格或斜线)将被自动删除,要么是因为下一个编辑命令不是可插入的字符,要么是因为该字符被标记为需要删除后缀。

这些变量可以包含将导致后缀被删除的字符集。如果 ZLE_REMOVE_SUFFIX_CHARS 设置,这些字符将导致后缀被删除;如果ZLE_SPACE_SUFFIX_CHARS设置,这些字符将导致后缀被删除并替换为空格。

如果ZLE_REMOVE_SUFFIX_CHARS未设置,则默认行为等效于:

ZLE_REMOVE_SUFFIX_CHARS=$' \t\n;&|'
Run Code Online (Sandbox Code Playgroud)

如果ZLE_REMOVE_SUFFIX_CHARS设置但为空,则没有字符具有此行为。 ZLE_SPACE_SUFFIX_CHARS 优先,因此:

ZLE_SPACE_SUFFIX_CHARS=$'&|'
Run Code Online (Sandbox Code Playgroud)

导致字符&|删除后缀但用空格替换它。

为了说明差异,假设该选项AUTO_REMOVE_SLASH有效并且目录 DIR 刚刚完成,并附加了一个/,用户在其后键入&. 默认结果是DIR&。随着 ZLE_REMOVE_SUFFIX_CHARS集,但不包括&结果DIR/&。随着ZLE_SPACE_SUFFIX_CHARS设置为包括&结果DIR &

请注意,某些完成可能会提供自己的后缀删除或替换行为,这些行为会覆盖此处描述的值。