我正在尝试从 bash 迁移到 zsh,特别是哈希函数;以便
hash -d Do=~/Downloads
意味着我可以输入cd Do
立即移动到该目录。好的。但在提示中,给出的目录是 as~Do
而~/Downloads
不是我希望看到的目录。有没有什么方法可以使用目录哈希值,以便提示符扩展到完整的目录名称(带有初始~
if 在用户目录中)?
答案1
这迅速逃脱 %~
尽可能使用散列目录缩写当前目录。要停止使用目录缩写,您可以%/
改为使用,但这也不会缩写主目录。
要仅缩写主目录,请设置prompt_subst
选项(这可能需要在提示符中添加额外的反斜杠)。使用 的手动扩展来代替%~
or 。%/
$PWD
setopt prompt_subst
PS1='%B${${PWD/#%$HOME%/\~\/}/#$HOME/\~}\$%b '
如果你想执行更复杂的替换,你可以在chpwd
挂钩并在提示中使用它。即使对于上面所示的简单情况,这种方法也更加冗长,但可以说更具可读性。
setopt prompt_subst
chpwd () {
case $PWD in
$HOME/*) prompt_PWD=\~/${PWD#$HOME};;
$HOME) prompt_PWD=\~;;
*) prompt_PWD=$PWD;;
esac
}
PS1='%B$prompt_PWD\$%b '
您可能更喜欢仅扩展某些哈希目录的混合方法。这很容易插入到chpwd
方法中(甚至插入到直接方法中,但可读性较差)。例如,以下chpwd
命令仅缩写以/home
(可能是其他用户的主目录)开头且不在您的主目录下的目录。
chpwd () {
case $PWD in
$HOME/*) prompt_PWD=\~/${PWD#$HOME};;
$HOME) prompt_PWD=\~;;
/home/*) prompt_PWD=${(%)${:-%~}};;
*) prompt_PWD=$PWD;;
esac
}
答案2
/
在目录名中添加尾部将达到预期的效果。