文章背景图

好看的PS1设置

2026-08-28
10
-
- 分钟

# ============ 优雅 PS1 提示符 v4 胶囊块 (开始) ============
__ps1_git() {
    command -v git >/dev/null 2>&1 || return
    git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return

    local branch dirty untracked status
    branch=$(git symbolic-ref --short HEAD 2>/dev/null) || branch=$(git describe --tags --exact-match 2>/dev/null) || return

    status=$(git status --porcelain 2>/dev/null)
    if [ -n "$status" ]; then
        echo "$status" | grep -q '^.[MADRC]' && dirty="✚"
        echo "$status" | grep -q '^??' && untracked="?"
    fi

    printf '%s%s%s' "$branch" "${dirty:+ $dirty}" "${untracked:+ $untracked}"
}

__ps1_path() {
    local p="${PWD/#$HOME/\~}"
    local IFS='/' parts=($p) n=${#parts[@]} out
    if [ "$n" -gt 3 ]; then
        out="…/${parts[$((n-2))]}/${parts[$((n-1))]}"
    else
        out="$p"
    fi
    printf '%s' "$out"
}

__build_ps1() {
    __ps1_ret=$?

    local git_info path_info
    git_info=$(__ps1_git)
    path_info=$(__ps1_path)

    local RST='\[\033[0m\]'
    local C_USER='\[\033[46;30m\]'
    local C_PATH='\[\033[44;97m\]'
    local C_GIT='\[\033[45;97m\]'
    local C_TIME='\[\033[100;97m\]'
    local C_ERR='\[\033[41;97m\]'
    local C_ARROW='\[\033[32m\]'

    PS1="\n ${C_USER} \u@\h ${RST}"
    PS1+="${C_PATH} ${path_info} ${RST}"

    if [ -n "$git_info" ]; then
        PS1+="${C_GIT} ${git_info} ${RST}"
    fi

    PS1+=" ${C_TIME} \t ${RST}"

    if [ "${__ps1_ret:-0}" -ne 0 ]; then
        PS1+=" ${C_ERR} ✘ ${__ps1_ret} ${RST}"
    fi

    PS1+="\n${C_ARROW}▶${RST} "
}

PROMPT_COMMAND='__build_ps1'
# ============ 优雅 PS1 提示符 v4 胶囊块 (结束) ============

上一篇 没有了
下一篇 没有了
评论交流

文章目录