如何自定义 Git Bash 提示以显示特定文件夹后的子目录(类似于 Codespace)

问题描述 投票:0回答:1

我一直在 Windows 上使用 Git Bash,最近,我有机会尝试 Codespace。我喜欢 Codespace 终端设置非常干净和简单。

打开终端时,没有路径前缀,即在主目录中工作时:

$ write_here

当您进入子目录时,它会从主目录之后的第一个子目录开始写入路径前缀

new/ $ write_here

new/new2/ $ write_here

基本上,它所做的就是从任何目录的完整路径前缀中剥离主目录的路径前缀

我想在我的主要设置上复制这个,但找不到编写脚本的干净方法。

到目前为止我已经尝试过的事情

我尝试通过修改 .bashrc 文件来自定义提示。例如,我使用了这两个脚本:
(PS:我的主目录是/e/VScode

PS1='${PWD#/e/VScode/} $ ' <br/>
PS1='${PWD//\/e\/VScode\//}/ $ '

这两者都完成了一半的工作。它们显示子目录的简化路径,
(例如

new/new2/ $ write_from_here

但是到了主目录,还是显示
/e/VScode/ $ write_here
.

我对社区来说还比较陌生,所以我承认我还不太熟悉所有的脚本约定和技术。但我尝试了一种解决方法,为主目录引入单独的情况:

PS1='$(if [ "$PWD" = "/e/VScode" ] 
then 
  echo "$ "; 
else 
  echo "${PWD#/e/VScode/}/ $ "; 
fi)'

当然,结果正是我想要的。

但是:

尽管我可以继续使用解决方法,但我仍然对实现这一结果的理想、干净、单例脚本行感到好奇。为什么最初的脚本行对于这种情况不起作用?

bash shell terminal scripting git-bash
1个回答
0
投票

这是我个人的解决方案:

#--- prompt

function getPS1path()
{
    local p="$PWD"
    local len=${#HOME}
    (( $len > 3 )) && [[ ${p:0:$len} == $HOME ]] && p="~${p:$len}"

    local max="${PS1_MAX_PATH//[!0-9]}"
    [[ $max = "" ]] && max=$(( $(stty -a | tr \; '\n' | awk '$1=="columns" {print $2}')/3 ))
    (( max < 20 )) && max=20
    (( max > 50 )) && max=50

    local i x pre=
    for (( i=0; i<30; i++ ))
    do
        len=${#p}
        (( len <= max )) && break
        x="${p#*/}"
        [[ $x = "" || "$x" = "$p" ]] && break
        p="$x"
        pre=".../"
    done
    echo -n "$pre$p"
}

[[ $origPS1 = "" ]] && origPS1="$PS1"
newPS1=$'\\[\e[1m\e[31m\\]\\h:$(getPS1path) # \\[\e[m\017\\]'
PS1="$newPS1"
© www.soinside.com 2019 - 2024. All rights reserved.