如何有条件地修改PS1中的\w?

如何有条件地修改PS1中的\w?

我所做的所有工作都位于 icloud 目录中,这使得我的bash提示很长:

~/Library/Mobile Documents/com~apple~CloudDocs/Projects/foo/bar/baz @master $ 

我的提示是:

PS1='\w\[\e[1;35m\]$(__git_ps1 " @%s") \[\e[1;32m\]\$\[\e[m\] '

/Library/Mobile Documents/com~apple~CloudDocs/是否可以仅将in的出现替换\w 为类似的内容,icloud从而产生如下更好的提示?

~/icloud/Projects/foo/bar/baz @master $ 

答案1

Zsh 具有“命名目录”功能,它几乎也会自动缩写提示中的目录名称。我不认为 Bash 具有等效功能,但您可以通过PROMPT_COMMAND运行自定义函数来设置变量,然后在 using 的提示 insetad 中打印来解决它\w

/tmp/test例如,这应该用 替换路径中的首字母~testdir

set_promptpath() {
    promptpath=$PWD;
    # do whatever replacement you like here
    promptpath=${promptpath/#\/tmp\/test/\~testdir}
}
PROMPT_COMMAND=set_promptpath
PS1='$promptpath\$ '

答案2

cwd我通过使用动态更新路径的函数,使用 @ilkkachu 的部分答案解决了这个问题:

cwd() {
    cwd=${PWD/\/Users\/htor/\~}
    echo ${cwd/\Library\/Mobile Documents\/com~apple~CloudDocs/icloud}
}
PS1='$(cwd)\[\e[1;35m\]$(__git_ps1 " @%s") \[\e[1;32m\]\$\[\e[m\] '

虽然不太漂亮,但至少我的提示又漂亮了!

相关内容