使用zsh在终端提示符中缩短相对于git仓库的路径

68bkxrlz  于 2022-12-17  发布在  Git
关注(0)|答案(1)|浏览(136)

目标

我正在尝试为我的终端提示符创建一个相对于我所在的存储库的缩短路径,类似于我已经为根目录和主目录创建的路径,如下所示。
以下终端提示符路径中显示的最后一个目录始终是当前工作目录。
根:

/ %
/rootDir %
/rootDir/dir1/dir2 %
/rootDir/.../dir2/dir3 %
/rootDir/.../dir3/dir4 %

家庭:

~ %
~/dir1/dir2 %
~/.../dir2/dir3 %
~/.../dir3/dir4 %

我正在尝试找到一种方法,让它在仓库中也能工作,仓库是“根”,而不是实际的根或home是路径的“根”。
存储库:

|repo %
|repo/dir1/dir2 %
|repo/.../dir2/dir3 %
|repo/.../dir3/dir4 %

"我所做的"
验证码:

autoload -Uz vcs_info
zstyle ':vcs_info:git:*' formats '|%r'
zstyle ':vcs_info:git:*' check-for-changes true

setopt PROMPT_SUBST

precmd()
{
    vcs_info
    if [ -d .git ];
    then
        PROMPT='${vcs_info_msg_0_}'
    elif $(git rev-parse > /dev/null 2>&1);
    then
        PROMPT='${vcs_info_msg_0_}/%c'
    else
        PROMPT='%(4~|%-1~/.../%2~|%3~)'
    fi

    PROMPT+=' %# '
}

在根目录或主目录中的路径的解决方案非常简单:

PROMPT='%(4~|%-1~/.../%2~|%3~)'

这将检查从工作目录到最近的根目录或主目录的路径长度,并根据相对路径的目录长度显示两个不同路径中的一个。
但是我想不出一种方法来修改存储库,因为我现在有一个if..else来检查我的工作目录是否是存储库的“根目录”,或者我是否在存储库的更深处,使用这些来显示存储库的名称或者名称和当前工作目录。主目录,但我需要有当前长度之间的repo和工作目录或其他一些更简单的解决方案,我可能已经错过了。

q0qdq0h2

q0qdq0h21#

终于又有时间了。我最终想出了一个解决方案,达到了预期的效果:

autoload -Uz vcs_info
zstyle ':vcs_info:git:*' formats '|%r'
zstyle ':vcs_info:git:*' check-for-changes true

setopt PROMPT_SUBST

precmd()
{
    vcs_info

# in git repo
    if [[ -n $(git rev-parse --git-dir 2> /dev/null) ]]; then

    # in root of git repo
        if [ -d .git ];
        then
            PROMPT='${vcs_info_msg_0_}'

    # in first subfolder of git repo
        elif [ -d ../.git ];
        then
            PROMPT='${vcs_info_msg_0_}/%c'

    # in second subfolder of git repo
        elif [ -d ../../.git ];
        then
            PROMPT='${vcs_info_msg_0_}/%2c'

    # in deeper subfolder of git repo
        else
            PROMPT='${vcs_info_msg_0_}/.../%2c'
        fi

# not in git repo
    else
        PROMPT='%(4~|%-1~/.../%2~|%3~)'
    fi

    PROMPT+=' %# '
}

不是最优雅的黑客,但不是很熟悉语法,这就是我想出的。
现在函数检查工作目录相对于.git文件的位置,该文件位于每个git仓库的根目录下。为了减少函数的检查量,函数首先使用if语句来检查当前目录是否位于git仓库中的任何位置。如果不是,则使用原帖子中的主目录和根目录路径的解决方案。

相关问题