1 頁 (共 1 頁)

[iTerm2] 美化你的Terminal

發表於 : 2017-05-09 08:56:12
yehlu
http://ucheng.logdown.com/posts/2013/10 ... r-terminal

這裡禮拜看了許多Paul Irish的簡報,開頭都是講shell的重要性。


Terminal是身為程式開發人員每天都會接觸的工具,但是Mac OS X 本身內建的Terminal相當的陽春,因此也出現了許多的替代產品,像是iTerm2或是TotalTerminal。然而剛安裝好的Terminal顏色通常都是很單一的,長時間觀看下來其實相當吃力,因此透過一些顏色的區別,可以方便我們快速地區分和尋找我們要的資訊。

以我目前在使用的iTerm2來說,預設的顏色是這樣的。電腦名稱,當前目錄,以及使用者名稱的顏色完全沒有任何區別。

iTerm2本身有內建一些顏色主題(Preset),你可以從Preference->Profiles->Color,來載入或是匯出Preset。iTerm2官網上也有整理許多人設計的Color Schemes,可以找找看有沒有適合自己的色彩主題。

但是如果要設定一些比較進階的顏色顯示,就需要透過編寫bash檔的方式來設定了。
這邊我們要使用的是Paul Irish的設定,https://github.com/paulirish/dotfiles/b ... ash_prompt 。下載下來後,將.bash_prompt放在你的user目錄底下(/Users/yourname/),並將default_username改為自己的名字。

代碼: 選擇全部

# This prompt inspired by gf3, sindresorhus, alrra, and mathiasbynens.
# but customized to me. <3

default_username='yehlu'


if which thefuck > /dev/null; then
    eval "$(thefuck --alias)"
fi;

# Automatically trim long paths in the prompt (requires Bash 4.x)
PROMPT_DIRTRIM=2

if [[ -n "$ZSH_VERSION" ]]; then  # quit now if in zsh
    return 1 2> /dev/null || exit 1;
fi;


if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then
    export TERM=gnome-256color
elif infocmp xterm-256color >/dev/null 2>&1; then
    export TERM=xterm-256color
fi


set_prompts() {

    local black="" blue="" bold="" cyan="" green="" orange="" \
          purple="" red="" reset="" white="" yellow=""

    local dateCmd=""

    if [ -x /usr/bin/tput ] && tput setaf 1 &> /dev/null; then

        tput sgr0 # Reset colors

        bold=$(tput bold)
        reset=$(tput sgr0)

        # Solarized colors
        # (https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized#the-values)
        black=$(tput setaf 0)
        blue=$(tput setaf 33)
        cyan=$(tput setaf 37)
        green=$(tput setaf 190)
        orange=$(tput setaf 172)
        purple=$(tput setaf 141)
        red=$(tput setaf 124)
        violet=$(tput setaf 61)
        magenta=$(tput setaf 9)
        white=$(tput setaf 8)
        yellow=$(tput setaf 136)

    else

        bold=""
        reset="\e[0m"

        black="\e[1;30m"
        blue="\e[1;34m"
        cyan="\e[1;36m"
        green="\e[1;32m"
        orange="\e[1;33m"
        purple="\e[1;35m"
        red="\e[1;31m"
        magenta="\e[1;31m"
        violet="\e[1;35m"
        white="\e[1;37m"
        yellow="\e[1;33m"

    fi

    # Only show username/host if not default
    function usernamehost() {

        # Highlight the user name when logged in as root.
        if [[ "${USER}" == *"root" ]]; then
            userStyle="${red}";
        else
            userStyle="${magenta}";
        fi;

        userhost=""
        userhost+="\[${userStyle}\]$USER "
        userhost+="\[${white}\]at "
        userhost+="\[${orange}\]$HOSTNAME "
        userhost+="\[${white}\]in"

        if [ $USER != "$default_username" ]; then echo $userhost ""; fi
    }


    function prompt_git() {
        # this is >5x faster than mathias's.

        # check if we're in a git repo. (fast)
        git rev-parse --is-inside-work-tree &>/dev/null || return

        # check for what branch we're on. (fast)
        #   if… HEAD isn’t a symbolic ref (typical branch),
        #   then… get a tracking remote branch or tag
        #   otherwise… get the short SHA for the latest commit
        #   lastly just give up.
        branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \
            git describe --all --exact-match HEAD 2> /dev/null || \
            git rev-parse --short HEAD 2> /dev/null || \
            echo '(unknown)')";


        ## early exit for Chromium & Blink repo, as the dirty check takes ~5s
        ## also recommended (via goo.gl/wAVZLa ) : sudo sysctl kern.maxvnodes=$((512*1024))
        repoUrl=$(git config --get remote.origin.url)
        if grep -q chromium.googlesource.com <<<$repoUrl; then
            dirty=" ⁂"
        else

            # check if it's dirty (slow)
            #   technique via github.com/git/git/blob/355d4e173/contrib/completion/git-prompt.sh#L472-L475
            dirty=$(git diff --no-ext-diff --quiet --ignore-submodules --exit-code || echo -e "*")

            # mathias has a few more checks some may like:
            #    github.com/mathiasbynens/dotfiles/blob/a8bd0d4300/.bash_prompt#L30-L43
        fi


        [ -n "${s}" ] && s=" [${s}]";
        echo -e "${1}${branchName}${2}$dirty";

        return
    }



    # ------------------------------------------------------------------
    # | Prompt string                                                  |
    # ------------------------------------------------------------------

    PS1="\[\033]0;\w\007\]"                                 # terminal title (set to the current working directory)
    PS1+="\n\[$bold\]"
    PS1+="\[$(usernamehost)\]"                              # username at host
    PS1+="\[$green\]\w"                                     # working directory
    PS1+="\$(prompt_git \"$white on $purple\" \"$cyan\")"   # git repository details
    PS1+="\n"
    PS1+="\[$reset$white\]\\$ \[$reset\]"

    export PS1

    # ------------------------------------------------------------------
    # | Subshell prompt string                                         |
    # ------------------------------------------------------------------

    export PS2="⚡ "

    # ------------------------------------------------------------------
    # | Debug prompt string  (when using `set -x`)                     |
    # ------------------------------------------------------------------

    # When debugging a shell script via `set -x` this tricked-out prompt is used.

    # The first character (+) is used and repeated for stack depth
    # Then, we log the current time, filename and line number, followed by function name, followed by actual source line

    # FWIW, I have spent hours attempting to get time-per-command in here, but it's not possible. ~paul
    export PS4='+ \011\e[1;30m\t\011\e[1;34m${BASH_SOURCE}\e[0m:\e[1;36m${LINENO}\e[0m \011 ${FUNCNAME[0]:+\e[0;35m${FUNCNAME[0]}\e[1;30m()\e[0m:\011\011 }'


    # shoutouts:
    #   https://github.com/dholm/dotshell/blob/master/.local/lib/sh/profile.sh is quite nice.
    #   zprof is also hot.

}



set_prompts
unset set_prompts
設定.bash_profile(/Users/yourname/.bash_profile)

代碼: 選擇全部

# Prompt
[[ -f "$HOME/.bash_prompt" ]] && source "$HOME/.bash_prompt"
alias ls="ls -G"
重新啓動後就可以擁有彩色的Terminal啦!
不過這個設定檔除了顏色設定外,還會在每個tab上面顯示目前目錄,能讓你快速知道現在的目錄位置。另外如果這個folder是透過git來管理的,也會顯示目前所在的branch,並且用紫色的文字顯示。如果你登入的使用者和.bash_prompt中設定的不一樣,也會用顏色來提示你。

如果想更進一步了解如何修改Terminal的顯示,可以參考下面的連結
http://www.ibm.com/developerworks/linux ... ip-prompt/
http://stevelosh.com/blog/2010/02/my-ex ... hole-thing