NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    (小ネタ)ターミナルプロンプト、カスタマイズしてみる?

    クラウド事業推進部の石倉です。

    私も最近まで意識したことがなかったのですが、現在参画しているプロジェクトで他メンバーの方のターミナルプロンプトを見た時に「見やすいな」と思ったのがこのブログを書こうと思ったきっかけです。 少し前の私と同じように気にしたことなかった方の興味のきっかけになったらと思います。

    私は普段はMacを使って開発していますがWindowsについても紹介します。 各設定値について説明するわけではなく私が設定している例を紹介する内容です。

    初期のターミナルプロンプト(Mac)

    カスタマイズしたターミナルプロンプト(Mac)

    Mac環境のターミナルプロンプト

    Macは標準のターミナルと、Oh My Zshというフレームワークを利用しています。

    github.com

    Oh My Zshはインストールも簡単で、インストールした後は好きなテーマを読み込むだけでターミナルプロンプトを変更することができます。

    ## .zshrcファイル
    
    # If you come from bash you might have to change your $PATH.
    # export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH
    
    # Path to your Oh My Zsh installation.
    export ZSH="$HOME/.oh-my-zsh"
    
    # Set name of the theme to load --- if set to "random", it will
    # load a random theme each time Oh My Zsh is loaded, in which case,
    # to know which specific one was loaded, run: echo $RANDOM_THEME
    # See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    ZSH_THEME="robbyrussell"  ⭐️好きなテーマに変更する
    ...
    ...

    テーマはたくさんあるので気に入ったものを選んで設定してみてください。

    github.com

    私はこれ!とドンピシャなテーマがなかったので複数のテーマからいいとこ取りした自分のテーマを作り使っています。テーマは.oh-my-zsh/themes/配下にあるのでそこに自分で新しくテーマを作成して上記.zshrcファイルで読み込みます。 以下はデフォルトのrobbyrussellテーマを元にapple, simpleテーマの設定を組み合わせています。

    function toon {
      echo -n ""
    }
    
    PROMPT="%{$fg[magenta]%}$(toon)%{$reset_color%} %{$fg[cyan]%}%~%{$reset_color%}"
    PROMPT+=' $(git_prompt_info)%{$reset_color%}'
    RPROMPT=[%T]
    
    ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[red]%}("
    ZSH_THEME_GIT_PROMPT_SUFFIX="%{$fg_bold[red]%}) "
    ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[yellow]%}✗"
    ZSH_THEME_GIT_PROMPT_CLEAN=" %{$fg[green]%}✔"

    表示は最初にお見せしたカスタマイズしたターミナルプロンプトのようになります。
    commitされてない変更がある場合は以下のようにブランチ名の横の表示が変わります。

    例えばVSCodeで開けばこれらのどのブランチにいるかやgitステータスの状態については分かりますが、ターミナルからも視覚的に分かるのは良いなと感じています。

    Windows環境のターミナルプロンプト

    WindowsはGit Bashを利用しています。 Git BashはWindows用のGitをインストールする際についてきます。

    git-scm.com

    インストールして立ち上げてみると既にいい感じなターミナルプロンプトになっています。

    /etc/profile.d/git-prompt.shで上記の表示の設定がされているので見てみます。

    if test -f /etc/profile.d/git-sdk.sh
    then
            TITLEPREFIX=SDK-${MSYSTEM#MINGW}
    else
            TITLEPREFIX=$MSYSTEM
    fi
    
    if test -f ~/.config/git/git-prompt.sh
    then
            . ~/.config/git/git-prompt.sh
    else
            PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]' # set window title
            PS1="$PS1"'\n'                 # new line
            PS1="$PS1"'\[\033[32m\]'       # change to green
            PS1="$PS1"'\u@\h '             # user@host<space>
            PS1="$PS1"'\[\033[35m\]'       # change to purple
            PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
            PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
            PS1="$PS1"'\w'                 # current working directory
            if test -z "$WINELOADERNOEXEC"
            then
                    GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
                    COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
                    COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
                    COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
                    if test -f "$COMPLETION_PATH/git-prompt.sh"
                    then
                            . "$COMPLETION_PATH/git-completion.bash"
                            . "$COMPLETION_PATH/git-prompt.sh"
                            PS1="$PS1"'\[\033[36m\]'  # change color to cyan
                            PS1="$PS1"'`__git_ps1`'   # bash function
                    fi
            fi
            echo $COMPLETION_PATH
            PS1="$PS1"'\[\033[0m\]'        # change color
            PS1="$PS1"'\n'                 # new line
            PS1="$PS1"'$ '                 # prompt: always $
    fi
    
    MSYS2_PS1="$PS1"               # for detection by MSYS2 SDK's bash.basrc
    
    # Evaluate all user-specific Bash completion scripts (if any)
    if test -z "$WINELOADERNOEXEC"
    then
            for c in "$HOME"/bash_completion.d/*.bash
            do
                    # Handle absence of any scripts (or the folder) gracefully
                    test ! -f "$c" ||
                    . "$c"
            done
    fi

    ~/.config/git/git-prompt.shがあればそっちを読み込むような設定になっているのでそのファイルを用意してカスタマイズします。 以下のようにカスタマイズしてみました。

    ## ~/.config/git/git-prompt.shファイル
    
    GIT_PS1_SHOWDIRTYSTATE=true
    GIT_PS1_SHOWUNTRACKEDFILES=true
    
    PS1='\[\033[0m\][\A] \[\033[35m\]\u \[\033[36m\]\w'
    
    if test -z "$WINELOADERNOEXEC"
    then
            GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
            COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
            COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
            COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
            if test -f "$COMPLETION_PATH/git-prompt.sh"
            then
                    . "$COMPLETION_PATH/git-completion.bash"
                    . "$COMPLETION_PATH/git-prompt.sh"
                    PS1="$PS1"'\[\033[31m\]`__git_ps1`'
            fi
    fi
    
    PS1="$PS1"' \[\033[0m\]$ '
    
    MSYS2_PS1="$PS1"               # for detection by MSYS2 SDK's bash.basrc
    
    # Evaluate all user-specific Bash completion scripts (if any)
    if test -z "$WINELOADERNOEXEC"
    then
            for c in "$HOME"/bash_completion.d/*.bash
            do
                    # Handle absence of any scripts (or the folder) gracefully
                    test ! -f "$c" ||
                    . "$c"
            done
    fi

    こちらもaddされてない変更やcommitされてない変更がある場合はブランチ名の横の表示が変わり状態が分かります。便利!

    最後に

    ターミナルプロンプト、カスタマイズしてみる?

    参考

    zsh: 13 Prompt Expansion

    Controlling the Prompt (Bash Reference Manual)

    git/contrib/completion/git-prompt.sh at master · git/git · GitHub

    執筆者石倉弘隆

    執筆記事一覧:https://tech.nri-net.com/archive/author/h-ishikura