プロンプトをカスタマイズしてターミナルを楽しく使おう💻


この記事は、サイバーウェーブ Advent Calendar 2019 の23日目の記事です。

最近、ちょっと気分を変えたいと思いターミナルのプロンプトを更新したので、その時にやったことを小ネタとしてまとめます。
僕の現在のターミナルはこんな感じになっています。

今このプロンプトを使っていて、

  • 2行プロンプトかつ、出力の後に1行空く
  • 普通は$となる部分がスタイリッシュ
  • 自分が今いるディレクトリや入力したコマンドによって絵文字表示が変わる

なところが気に入っています。
それぞれについて、どのように設定ファイルを書くか解説していきます。
使用しているシェルはzshです。

また、今回解説するスクリプトは全て dotfiles/.zshrc at master · guri3/dotfiles にあります。

まず、2行プロンプトについてです。

.zshrc
PROMPT='$(emoji) %~ ${vcs_info_msg_0_}
%{%F{202}%}❯%{%f%}%{%F{221}%}❯%{%f%}%{%F{027}%}❯%{%f%} '

プロンプトの定義はこのようになっています。
実は、プロンプトの途中で改行すれば簡単に2行プロンプトにすることができます。

また、出力後の改行については、add_lineという関数を定義し、precmdで呼び出すことで実現しています。

.zshrc
function add_line {
  if [[ -z $PS1_NEWLINE_LOGIN ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}

precmd() { add_line }

add_line関数の中では、PS1_NEWLINE_LOGIN環境変数に中身が存在しなければPS_NEW_LINE_LOGIN環境変数にtrueを代入し、そうでなければ改行コードを出力しています。これをprecmdで呼び出すことでプロンプトを表示する直前に毎回実行されるため、出力の後に改行をうまく挟むことができます。(ググればこの書き方がたくさん出てくるので、慣習みたいなものなのかも?)

次に、$部分の変更についてです。
実際のコードではプロンプト2行目の部分です。

.zshrc
%{%F{202}%}❯%{%f%}%{%F{221}%}❯%{%f%}%{%F{027}%}❯%{%f%} '

ポイントは%F{}%fで、%F{}で色を指定し%fで色をリセットします。
この時に指定する色は、dotfiles/colcheck.sh at master · guri3/dotfiles などを使って調べることができます。(このスクリプト拾い物のはずなのですが、出典がわかりませんでした...すみません)
また、全てを%{%}で囲っているのは、こうしないとなぜかプロンプトがずれてしまう現象が起きるからです。スマートな解決方法を知っていたら教えてください。

最後に、絵文字部分についてです。
これも、関数を実装して呼び出しています。

.zshrc
function emoji {
  if [[ $? != 0 ]]; then
    echo -n '\U1F914'
  elif [[ $(pwd) = $HOME ]]; then
    echo -n '\U1F3E0'
  elif [[ $(pwd) =~ "$HOME/projects" ]]; then
    echo -n '\U1F4BB'
  elif [[ $(pwd) =~ "$HOME/dotfiles" ]]; then
    echo -n '\U1F527'
  else
    echo -n '\U1F4C2'
  fi
}

プロンプトの1行目部分で呼び出しています。

PROMPT='$(emoji) %~ ${vcs_info_msg_0_}

僕はカレントディレクトリの状況に応じて

  • home🏠
  • projects💻(コード管理用ディレクトリ)
  • dotfiles🔧
  • それ以外📂

にそれぞれ絵文字を登録しているのと、
何か間違ったコマンドを入力した際に🤔が表示されるようになっています。

今回紹介するものは以上になります。
ぜひいつも使うターミナル環境を自分好みにカスタマイズしてみてはいかがでしょうか?