Zsh:在提示中扩展散列目录名称

Zsh:在提示中扩展散列目录名称

我正在尝试从 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

/在目录名中添加尾部将达到预期的效果。

相关内容