我在用提示纯正如我在 zsh 中的提示。它在内部用于print -Pn ...
打印当前目录。由于某种原因,如果我设置了与当前目录开头匹配的环境变量,则该环境变量名称将被替换到输出中。
例如,
> export SOME_DIR=/home/bschlenk/some/path
> cd ~/some/path/deeper/nested/path
> print -Pn %~
~SOME_DIR/deeper/nested/path
如何防止它将随机环境变量替换到恰好匹配的路径中?我希望它打印出当前路径,并/home/bschlenk
替换为~
,但没有其他替换。
答案1
来自的文档%~
:
如果它有一个命名目录作为其前缀,则该部分将替换为
~
后跟目录名称,但前提是结果短于完整路径
如果 后面的文本
~
是值以 开头的字符串 shell 参数的名称,也可以定义它们/
。
因此,如果变量的值为SOME_DIR
,/home/bschlenk/some/path
则~SOME_DIR
是一个静态命名目录,其值为/home/bschlenk/some/path
。提示扩展%~
会看到/home/bschlenk/some/path
并将其缩写为~SOME_DIR
。
但这还不是故事的全部。事实上,只有当SOME_DIR
使用“激活”时才会出现缩写~SOME_DIR
时才会出现缩写。这记录在选项auto_name_dirs
,无需事先激活,但默认关闭。
任何设置为目录绝对名称的参数都会立即成为该目录的名称,该名称将由 和相关提示序列使用
%~
,并且在对以 开头的单词执行补全时可用~
。 (否则,参数必须~param
首先在表单中使用。)
激活%~
替换(并在 后完成~
)的参数显示为命名目录哈希表您可以使用 列出hash -d
。
我们将这些碎片放在一起以了解发生了什么。你如何解决你的问题?这取决于什么原因导致SOME_DIR
被激活。
如果您打开了该选项auto_name_dirs
,那么显然您应该将其关闭。
如果您以前使用过~SOME_DIR
,可以使用以下命令停用它
unhash -d SOME_DIR
这不是永久性的:如果您再次使用,它会再次弹出~SOME_DIR
。但考虑到你可以$SOME_DIR
在任何可以使用的地方使用~SOME_DIR
,~SOME_DIR
这并不是一个非常有用的功能。
如果您无法摆脱SOME_DIR
命名目录的组成部分,并且您想仅使用$HOME
→来缩写当前目录~
,则可以手动实现此转换。
if [[ $PWD = $HOME ]]; then
HPWD=\~
elif [[ $PWD = $HOME/* ]]; then
HPWD=\~/${PWD#$HOME/}
else
HPWD=$PWD
fi
然后使用print -rn $HPWD
代替print -Pn %~
.
如果您无法阻止SOME_DIR
成为命名目录并且无法更改使用的代码%~
,那么事情就会变得更加棘手。您可以使用 清空目录哈希表hash -r
,但无法使其成为函数的本地函数(仅适用于子 shell)。