fish_prompt.fish

发布者:站点默认
2020/01/11 浏览数(710) 分类:CentOS/RockyLinux, Linux, macOS fish_prompt.fish已关闭评论

概要

左边是限制了长度的 $PWD,右边是 git 状态,返回码非 0 时 $ 会变红。

预览

代码

注:fish_prompt.fish 依赖 location.fish

~/.config/fish/functions/fish_prompt.fish

# 判断是否是git仓库的工具函数
function is_git_repo --description 'Check if directory is a repository'
    test -d .git
    or command git rev-parse --git-dir >/dev/null ^/dev/null
end

# PS1
function fish_prompt --description 'Write out the prompt'
    set last_status $status

    set -l os (uname -o)
    if test "$os" = "Darwin"
        set -g __fish_git_prompt_show_informative_status 1
    end

    if not test $last_status -eq 0
        set status_color (set_color red)
    else
        set status_color (set_color normal)
    end

    if set --query SSH_TTY
        set fish_color_host red
    end

    if test "$USER" = "root"
        set user_info (set_color red)"$USER"(set_color normal)" on "
        set prompt_sign $status_color' # '
    else
        set prompt_sign $status_color' $ '
    end

    set path (set_color 2ca7f8)(location)

    echo -ne "$user_info$path$prompt_sign"

    set_color normal
end

function fish_right_prompt
    set -g __fish_git_prompt_showupstream "informative"
    set -g __fish_git_prompt_showdirtystate 1
    set -g __fish_git_prompt_showstashstate 1
    set -g __fish_git_prompt_showuntrackedfiles 1
    set -g __fish_git_prompt_char_stateseparator " "
    set -g __fish_git_prompt_char_upstream_prefix " "
    # set -g __fish_git_prompt_showcolorhints 1

    set git_info
    if is_git_repo
        if set -q __fish_git_prompt_show_informative_status
            set file_status (__fish_git_prompt "%s")
            set git_info (set_color yellow)"$file_status"
        else
            __fish_git_prompt >/dev/null 2>&1
            set upstream (__fish_git_prompt_show_upstream)
            set branch (git branch | grep \* | sed 's/* //')
            set file_status (__fish_git_prompt_informative_status)
            set git_info (set_color yellow)"$branch$__fish_git_prompt_char_stateseparator$file_status$upstream"
        end
    end

    set -l os (uname -o)
    if test "$os" = "Darwin"
        set -g __fish_git_prompt_show_informative_status 1
    end
    if set -q HTTP_PROXY
        if test "$os" = "Darwin"
            set proxy (set_color normal)"🚀 "
        else
            set proxy (set_color normal)"p "
        end
    end

    echo -n "$proxy$git_info"
    set_color normal
end

~/.config/fish/functions/location.fish

function location --description "限制了长度的 $PWD,中间用 ... 代替了"
    set _prefix_len 7
    set _suffix_len 10
    set _pwd (string replace -r '^'"$HOME"'($|/)' '~$1' $PWD)
    set _pwd_len (string length $_pwd)
    set _divider '...'
    set _divider_len (string length $_divider)
    set _cur_path_len (math $_pwd_len + $_divider_len)
    set _max_len (math $_prefix_len + $_suffix_len + $_divider_len)
    set _basename (basename $_pwd)
    set _basename_len (string length $_basename)
    if test $_pwd_len -gt $_max_len
        if test $_basename_len -gt $_suffix_len
            # basename 比 _suffix 长时显示完整的 basename
            set _surplus_len (math $_prefix_len + $_divider_len + $_suffix_len - $_basename_len)
            set _suffix_len $_basename_len
            # 没有剩余空间时不显示 prefix 和 ...
            if test $_surplus_len -lt $_divider_len
              set prefix ''
              set _divider ''
            # 至少能显示下省略号:剩余空间 > _prefix_len + _divider_len
            else
              set _prefix_len (math $_surplus_len - $_divider_len)
              set prefix (string sub --length $_prefix_len $_pwd)
            end
        else
            set prefix (string sub --length $_prefix_len $_pwd)
        end
        set suffix (string sub --start=-$_suffix_len $_pwd)
        echo "$prefix$_divider$suffix"
    else
        echo $_pwd
    end
end
点击返回顶部
  1. 留言
  2. 联系方式