ターミナルプロンプトの表示・色の変更

「プロンプト」は、ターミナルで ``hoge-macbook:~ hoge$`` と書かれた行のこと。
今回の記事では以下のことをなるべく簡潔にまとめていきたいと思います。

- プロンプトの表示内容を変える方法
- プロンプトの色や書体を変える方法
- コマンドの出力の後に改行を入れる方法
- プロンプトでGitブランチを表示する方法
- よく見るあの表示 ( ■■■▶︎ ) を再現する方法

ここわかんないよ！ここ間違ってるよ！などの意見があれば、ご遠慮なくコメントください。

# 先に一言

このツールを使うと全自動でカスタマイズできます！

https://github.com/romkatv/powerlevel10k

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225997/fcc45d70-d8f9-68f0-6152-29b77c1290f6.png)

開始方法 (Mac):
```shell
brew install powerlevel10k
echo "source $(brew --prefix)/share/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc
exec zsh
```

あとはターミナルの質問に対して答えていきながらカスタマイズしていきます:

![スクリーンショット 2024-09-25 23.53.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225997/98a9b33a-6caf-fa8d-2947-b0a9f1e0f49e.png)

![スクリーンショット 2024-09-25 23.53.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225997/8b15d76a-a705-7577-a8c2-a0319a051d8f.png)

何も起動しない場合や、再設定したい場合は以下のコマンドを実行します

```shell
p10k configure
```

もし、特殊な記号を使いたい場合は NerdFonts をインストールして、ターミナルのフォントに指定します。

https://github.com/ryanoasis/nerd-fonts


# デフォルトのプロンプト

![スクリーンショット 2018-06-20 3.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/225997/d8d057ae-a2e2-adce-f467-19871da350fe.png)

私は見た目が気に入っている[Hyper](https://hyper.is/)というターミナルを使っていますが、中身は同じBashなので、Mac標準のターミナルでも、iTerm２でも変更方法は全く同じです。

# 試しにプロンプト変えてみる

ターミナルを開いて以下のコマンドを叩いてみる。

```shell
$ PS1='Hello Prompt! \# \t \w \$ '
```

![スクリーンショット 2018-06-20 4.01.04.png](https://qiita-image-store.s3.amazonaws.com/0/225997/65327a77-6982-b815-6cd2-2ce406fbfaa7.png)

これだけで、プロンプトの表示が変えられました〜！👏
ただ、ウィンドウを閉じてまた開くとプロンプトが元に戻ります。

# うまく行かなかった場合
`\` を `%` に置き換えてみてください。

```:bash用の書き方例
\# \t \w \$
```
```text:zsh用の書き方例
%# %t %w %$
```
MacOS Catalina (2019/10) 以上の方など、Bashではなく、Zshをお使いの場合は、この書き方になります。
また、このあとで編集するファイルは `.bashrc` ではなく `.zshrc` となります。 
使用中のシェルは、`$ echo $SHELL` で確認できます。

( @tetsuyakojima さん、ありがとうございました！)


# 閉じても変更が残るようにする

プロンプトを変更するには、🏠**ホームフォルダ** (~) にある`.bashrc` というファイルを編集します。
自分のユーザだけではなく、全ユーザの設定を変更したい場合は `/etc/bashrc` を編集します。
上でも触れましたが、Zshをお使いの場合は、 `.bashrc` ではなく `.zshrc` を編集します。 

Mac の Finder で隠しファイルの表示を切り替えるには `⌘command + shift + .(ドット)` を押します。
存在ない場合は、新規作成します。( `$ touch ~/.bashrc` )

```bash:~/.bashrc
export PS1='Hello Prompt! \# \t \w \$ '
```
これで保存して、ターミナルを閉じて開き直すと、プロンプトが変更されたままになります。
( `$ source ~/.bashrc` 、もしくは、 `$ source ~/.zshrc` を実行することで反映することもできます。)

# 表示する内容を変える

![スクリーンショット 2018-06-20 3.21.46.png](https://qiita-image-store.s3.amazonaws.com/0/225997/d65aa2c6-936a-392f-387d-cebbce858685.png)

以下のように記述すると、上のスクリーンショットのような結果がでます。

```bash:~/.bashrc
export PS1='✌️ \# \t \w \$ '
```

|記号|意味|例|
|:--:|:--|:--|
| \h | ホスト名 | hamajunnoMacBook-Pro　|
| \u | ユーザ名 | hamajun |
| \w | ディレクトリ（フルパス） | ~/Documents/GitHub |
| \W | ディレクトリ | GitHub |
| \t | 時間 (24形式) | 23:29:38 |
| \T | 時間 (12形式) | 11:29:38 |
| \@ | AM / PM | PM |
| \d | 日付 | Wed Jun 20 |
| \D | 日時 | \D{%y/%m/%d %H:%M:%S}<br/>18/06/20 23:29:38 |
| \\# | コマンドの番号 (1, 2, 3...) | 1 |
| \n | 改行 | |
| \\\$ | 一般ユーザーの時 `$`、rootの時 `#` を表示| $ |

【備考】デフォルトの表示を敢えて書くとこうなります: `\h:\W \u\$ `
【備考】ちなみに、ホスト名は`システム環境設定` > `共有` で変更できます。





# 文字の色や書体を変える
「エスケープシーケンス」と呼ばれるものを使って、文字を太字にしたり、色をつけたり</font>できます。

## 書体

![スクリーンショット 2018-06-20 2.54.53.png](https://qiita-image-store.s3.amazonaws.com/0/225997/00d1781d-0306-eabd-1a7f-c447b70a2e0b.png)


```bash:~/.bashrc
export PS1='装飾なし \[\e[1m\] ここは太字 \[\e[0m\] 装飾なし \$ '
```

**【解説】** `\[` と `\]`で囲んだところは「エスケープシーケンス」で、文字出力の制御を行う特殊な文字列。`\e[` はASCIIのエスケープ文字を使うよという意味で、`1m`は「太字」、`0m`は「装飾をリセットする」という意味。

【備考】 `\[` と `\]`で囲まなくても一応、書体や色を変えることはできますが、↑↓キーを押したときや、画面サイズを変えたときに表示バグが発生しますので、ちゃんと`\[` と `\]`で囲みましょう。

| 値 | 効果 |
|:--:|:--|
| 0m | 装飾なし |
| 1m | **太字** |
| 2m | 細字 (未対応) |
| 3m | *イタリック体* |
| 4m | 下線 |

【備考】 `\e[0m` は `\e[m` と省略できます。

## 文字の色

![スクリーンショット 2018-06-20 2.56.17.png](https://qiita-image-store.s3.amazonaws.com/0/225997/5be07188-b42b-2a5c-e39d-18d432decbd9.png)


```bash:~/.bashrc
export PS1='装飾なし \[\e[32m\] ここは緑色 \[\e[0m\] 装飾なし \$ '
```

| 値 | 文字色 | 値 | 背景色 |
|:--:|:--|:--:|:--:|
| 30m | <font color="#000000">黒</font> | 40m | <font color="#000000">■ </font>背景黒 |
| 31m | <font color="#AA0000">赤</font> | 41m | <font color="#AA0000">■ </font>背景赤 |
| 32m | <font color="#00AA00">緑</font> | 42m | <font color="#00AA00">■ </font>背景緑 |
| 33m | <font color="#AAAA00">黄</font> | 43m | <font color="#AAAA00">■ </font>背景黄 |
| 34m | <font color="#0000AA">青</font> | 44m | <font color="#0000AA">■ </font>背景青 |
| 35m | <font color="#AA00AA">紫</font> | 45m | <font color="#AA00AA">■ </font>背景紫 |
| 36m | <font color="#00AAAA">水</font> | 46m | <font color="#00AAAA">■ </font>背景水 |
| 37m | <font color="#AAAAAA">灰</font> | 47m | <font color="#AAAAAA">■ </font>背景灰 |


【備考】 `39m`で文字色を、`49m`で背景色をデフォルトに戻せます。
【備考】 `90m〜97m`でもう少し明るい文字色を指定できます。
【備考】 `100m〜107m`でもう少し明るい背景色を指定できます。
【備考】 色のついた文字を太字にすると色が少し明るくなります。

詳しくは[こちら](https://www.mm2d.net/main/prog/c/console-02.html)を参照

## 書体、文字色、背景色の同時指定
![スクリーンショット 2018-06-20 2.51.36.png](https://qiita-image-store.s3.amazonaws.com/0/225997/c17837f1-efcf-6db2-35a6-8169313c9e56.png)


```bash:~/.bashrc
export PS1='装飾なし \[\e[1;37;42m\] ここは太字、文字白、背景緑 \[\e[0m\] 装飾なし \$'
```
これらは `;` でつなげることができ、例えば、`1;32m`と指定すると、「太字、文字色緑」となり、`1;30;47m`と指定すると、「太字、文字色黒、背景白」となる。



# アウトプットの後に改行を入れる
`hamajun-mbp:~ hamajun$`の上に１行開いているのが確認できますでしょうか。こうすると出力が(かなり)長めのコマンドを叩くときに、アウトプット先頭が見つけやすくなると思います。

![スクリーンショット 2018-06-20 3.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/225997/f81daba3-5a97-0a8d-0e3b-881492c0190f.png)


```bash:~/.bashrc
# 出力の後に改行を入れる
function add_line {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}
PROMPT_COMMAND='add_line'

export PS1='\h:\W \u\$ '
```

**【解説】** ここでは「シェルスクリプト」と呼ばれるものを使います。if文の条件文の`-z` フラグで文字列の長さが0かどうかを確かめます。`PROMPT_COMMAND` はプロンプトが表示される度に呼び出されるBashの特殊変数です。これで、１回目のときは改行せずに、2回目以降のときにプロンプトの前に改行を入れます。


# Gitブランチを表示
カレントディレクトリがGitレポジトリの場合はブランチ名（master）を表示できます。

![スクリーンショット 2018-06-20 3.10.31.png](https://qiita-image-store.s3.amazonaws.com/0/225997/a879fc6b-c96f-cf59-fd80-035664fdc58c.png)


https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
を`.git-prompt.sh`というファイル名で🏠**ホームフォルダ(~)**に保存する。([**Raw**]→右クリック保存)
ファイル名の**先頭にピリオド**を付け忘れずに。

```bash:~/.bashrc
# show git branch
# https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh
source ~/.git-prompt.sh

export PS1='\h:\W \u \[\e[1;32m\] $(__git_ps1 "(%s)") \[\e[0m\] \$ '
```

**【解説】** `.git-prompt.sh`は、Git公式が用意したシェルスクリプトで、これを読み込みます。`$()`はコマンドを呼び出すための記号。`__git_ps1`は関数で、引数の`"(%s)"`はフォーマット指定子です。`(%s)`の場合、`(master)`、`<< %s >>`の場合、`<< master >>`となります。

# よく見るあの表示 ( ■■■▶︎ ) を再現する方法

![スクリーンショット 2018-06-23 18.00.57.png](https://qiita-image-store.s3.amazonaws.com/0/225997/48496cc9-e72f-4ef5-8b1f-48a945ecc5ad.png)

```bash:~/.bashrc
# 先に、Menlo-forPowerlineをなどの記号文字を含むフォントをダウンロードして、ターミナルのフォントに指定する必要があります。

export PS1='\[\e[30;47m\] \t \[\e[37;46m\]\[\e[30m\] \W \[\e[36;49m\]\[\e[0m\] '
# (文字黒/背景灰色) 時刻 (文字灰色/背景水色)▶︎(文字黒) ディレクトリ (文字水色/背景色なし)▶︎(装飾なし)
```

よく目にするこのスタイリッシュな表示、[Powerline-Shell](https://github.com/b-ryan/powerline-shell)という便利なプラグインを入れることでプロンプトがこのような見た目になります。でも、見た目の方は、実は「▶︎」の形をした特殊な記号文字だけで作らているんです。

<img width="624" alt="スクリーンショット 2018-06-23 18.37.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/668ce1d0-91e1-bc6b-1d95-dec82dd54c28.png">

[Menlo for Powerline.ttf](https://github.com/abertsch/Menlo-for-Powerline/blob/master/Menlo%20for%20Powerline.ttf) という特殊フォントをインストールして、ターミナルのフォントをこれに指定すれば、こういう表示を簡単に作れます。([Powerline Fonts](https://github.com/powerline/fonts), [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts)も使えます。)
Menloはターミナルの標準フォントで、Menlo for Powerlineはこれに特殊な記号文字を追加したフォントセットとなってます。

ターミナルのフォントは、「ターミナル」>「環境設定(⌘,)」>「プロファイル」タブ>「テキスト」タブ>「フォント」で変えられます。iTerm2の場合も同じく、「iTerm2」>「Preferences(⌘,)」>「Profiles」タブ>「Text」タブ>「Font」で変更できます。

<img width="779" alt="スクリーンショット 2018-06-21 0.53.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/225997/9a62580a-b675-ff76-7be1-811a92ac71ce.png">

「▶︎」の形をした記号文字はこちら → ``
※ 通常は四角形とか、四角形で囲った?として表示されます。


# エディターのプロンプトにも反映される
私は、Atomの[platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal)というパッケージを使っていますが、こちらのプロンプトにも反映されていました。これは便利ですね！
VS Codeの標準ターミナルも同様に反映されます！
 
![スクリーンショット 2018-06-20 3.50.31.png](https://qiita-image-store.s3.amazonaws.com/0/225997/17da3896-8088-b612-797d-0ebe045618ed.png)

最後まで見ていただいてありがとうございました。
もし役に立ったのであれば「👍いいね」していただけると嬉しいです。
また、何か間違いがあった場合は、コメントの方をお願いします。

# 参考
https://www.mm2d.net/main/prog/c/console-02.html
https://stackoverflow.com/questions/14859148/how-to-set-a-conditional-newline-in-ps1
http://motw.mods.jp/shellscript/tutorial.html