macbook で使用する .zshrc の PS1(プロンプト)設定 (今更)

# 追記-2021/07/25
Git表示とプロント表示を変更
参考サイト:
[zshプロンプトをカスタマイズ、色と改行とgit対応で見やすくする【Mac】2021.04.22](https://dev.macha795.com/zsh-prompt-customize/)

# 追記-2021-11-06

最近知ったのですが、macを使っている人はこちらを使っている方が多いようです。
私も現在は Starshipを使用しているのでおすすめです。
https://starship.rs/
![スクリーンショット 2021-11-06 17.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/fa1e79ec-76b1-d697-a215-200af84d8b3a.png)

# 追記-2022-6-9(木)

starship は macの場合brewでインストールできます。

## Starship step1/2
```zsh:
# brew install (通常はこっちだけ)
brew install starship

# Lastest version(最新版を自分でインストールする場合はこっち)
curl -sS https://starship.rs/install.sh | sh
```

![スクリーンショット 2022-06-09 10.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/788405e1-7e90-717e-5d8f-38828c8e9130.png)

## Starship step2/2 
Starshipをシェルにセットアップ

```zsh
# これはzshの設定
echo 'eval "$(starship init zsh)"' >> ~/.zshrc
```
![スクリーンショット 2022-06-09 10.07.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/2df8da9a-dddb-ca5e-c9ea-412cc2063a17.png)

これだけでとても綺麗なプロンプトになると思います。
詳細な設定もできるのでぜひ StartshipのHPに訪れてください。

https://starship.rs/

# 本題
macbookAirを購入したばかりの頃にbashの入力欄をカスタマイズできることを知り、久しぶりに.zshrcで挑戦した時の備忘録。

当時意外と悩んだので簡単にまとめておきます。

今回参考にしたのはこの２つのサイト
https://zsh-prompt-generator.site/
https://qastack.jp/unix/53789/whats-the-newline-symbol-in-zshs-ps1

１つ目がzsh-prompt(プロンプトと呼ぶみたいです)を直感的に作成できるジェネレイトサイト
2つ目が意外とハマってしまった改行の仕方

## どうしていまさら？
今まで `.bash_profile PS1`と検索しており、めぼしい情報がなく尚且ちょっと仕様が古いものばかりでまともにカスタマイズできなかった。
さらにmacの`~/.zshrc`に設定した`export PS1=''`が動いてしまったのが勘違いに拍車をかけてしまった。
正確にはbashのものは動かなかったのだが手探りで試し動くオプションを見つけ使用していた。

## 使用方法

![スクリーンショット 2020-11-20 4.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/edbca9ff-a8ea-e13c-4be7-66fb574e0859.png)


     vim ~/.zshrc 


```vim:~/.zshrc 
# 一番頭付近に追加
PROMPT="%B%F{214}%n%f%b on %B%F{86}%m%f%b in %~"
```

### 2行表示させるには？
今回は改行し、下の行で入力をさせたい。
[サイト2](https://qastack.jp/unix/53789/whats-the-newline-symbol-in-zshs-ps1 "Link")を参考にし`$'\n'`を追加。

```vim:使い方
PROMPT="%B%F{214}%n%f%b on %B%F{86}%m%f%b in %~"
＃ と
PROMPT="%B%F{49}➜ %f%b"
＃ を $'\n' を使いつなげたい
# 下に記述の ~/.zshrc のようにする。
```

```vim:~/.zshrc 
# 一番頭付近に追加
PROMPT="%B%F{214}%n%f%b on %B%F{86}%m%f%b in %~"$'\n'"%B%F{49}➜ %f%b"
```

![スクリーンショット 2020-11-20 4.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/f94521f9-f1e0-b50d-436a-9ab1364d8c13.png)

ターミナルを新規で起動もしくは読み込んで上げれば完成です。
お疲れさまでした。
bashからzshに変わりPS1がプロンプトへ呼び名が変わる。
改めて`zsh プロンプト`で検索すると色々ヒットしますね。楽しそう

## 追記 -- 2020/11/21

ラズパイのターミナル(.bashrc)を設定したので参考になればとメモを残しておく。
(.bashrc)のPS1設定で参考にしたサイト
https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60
https://qiita.com/HMMNRST/items/d8fe7b3c528f447d68a6
https://scriptim.github.io/bash-prompt-generator/
ちなみに文字のカラー設定が.bashrcだと8色しかないように思えたが
[参考サイト3] (https://scriptim.github.io/bash-prompt-generator/ "Link_3")のカラーパレットでかなりの色を選択できたため問題ないのかもしれない?

今回は下記の形で作成していく
(時間24H) username on hostname ~
→ $ 入力欄

## .bashrc PS1設定の編集位置の把握
`echo "$PS1"　`
実行し表示された位置を.bashrcから探していくと60行目に確認できたのでここを編集していく
表示された文字列は少し違うが大丈夫だと思う
`vim ~/.bashrc`
![スクリーンショット 2020-11-21 16.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/e036c625-d4b6-d48e-de19-50584a316df0.png)
[参考サイト3] (https://scriptim.github.io/bash-prompt-generator/ "Link_3")を使用しPS1を作成していく。このサイト便利すぎる
`~/.bashrc`の自分の場合60行目をコメントアウトし、その下にサイト3で作成したものをコピー貼り付け 
vimの場合 escを一度押し Shift押しながら:w で保存　Shift押しながら:q でvimから抜ける

```vim:~/.bashrc 
PS1='\[\e[0m\](\[\e[0;2;38;5;122m\]\A\[\e[0m\])\[\e[m\] \[\e[0;1;38;5;216m\]\u\[\e[0m\] on \[\e[0;1;38;5;216m\]\h\[\e[0m\] in \[\e[0;38;5;74m\]\w\[\e[m\]\n\[\e[0;38;5;74m\]➜ \[\e[0;38;5;74m\]\$\[\e[m\] \[\e0'
```

![スクリーンショット 2020-11-21 16.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/ec0a8da0-2553-cf8a-adac-1fa954932950.png)
![スクリーンショット 2020-11-21 16.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/5c0aab93-b142-e412-06ea-7a599b581588.png)
![スクリーンショット 2020-11-21 17.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/e93a4cbf-9859-9e60-cea8-968e520bca70.png)

`source ~/.bashrc`で読み込み設定が反映されていれば成功です。お疲れさまでした。
色はもしかしたら8色で表現されているかもしれないですね
コメントアウトしておくことで元に戻したいときに簡単に戻せるので初学者の方は前の設定は消さずにコメントアウトすることをおすすめします。


# 追記-2021/07/25
Git表示とプロント表示を変更
参考サイト:
[zshプロンプトをカスタマイズ、色と改行とgit対応で見やすくする【Mac】2021.04.22](https://dev.macha795.com/zsh-prompt-customize/)

## git の補完機能
```zsh:ターミナルでの操作
echo 'ファイルの格納場所' && \
mkdir -p ~/.zsh/completion/ && \
echo 'ファイルをダウンロード' && \
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh -o ~/.zsh/completion/git-completion.zsh && \
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -o ~/.zsh/completion/git-prompt.sh && \
echo 'ファイルの権限を変更' && \
chmod a+x ~/.zsh/completion/git-prompt.sh && \
chmod a+x ~/.zsh/completion/git-completion.zsh && \
echo '移動しリネーム' && \
mv ~/.zsh/completion/git-completion.zsh ~/.zsh/completion/_git && \
echo '.zcompdump を一旦削除' && \
rm -f ~/.zcompdump
```

補完機能を自動的に起動するように .zshrc へ追記

```vim:.zshrc
fpath=(~/.zsh/completion $fpath)

autoload -Uz compinit
compinit -u
```

最後に設定を記述した.zshrcを再読み込み

```zsh:zsh
source ~/.zshrc
```

## 下準備1-プロントのカスタマイズ
使える色からそれぞれに使用したい色を選ぶ
1 UserName
2 HostName

```zsh:使える色
for c in {000..255}; do echo -n "\e[38;5;${c}m $c" ; [ $(($c%16)) -eq 15 ] && echo;done;echo
```
![スクリーンショット 2021-07-25 22.19.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/22121bf2-0d4a-6c9b-f0d3-b9162f8f3c82.png)

私は下記を選びました
1 UserName　214 オレンジ
2 HostName　086 蛍光色の水色

## 下準備2-プロントのフォント変更

```zsh:特殊記号対応フォントのインストール
cd ~/ && \
git clone https://github.com/powerline/fonts && \
cd fonts && \
./install.sh && \
echo 'フォントのキャッシュクリア' && \
fc-cache -vf 
```

ターミナルの設定画面でフォントを「DejaVu Sans Mono Powerline」に変更

```zsh:特殊記号表示の確認
echo "\ue0b0 \u00b1 \ue0a0 \u27a6 \u2718 \u26a1 \u2699"
```

## プロントのカスタマイズ設定
`~/.zshrc`に下記を書き込んでください。
書き込みが出来たら`source ~/.zshrc`で読み込めば完成です。

```vim:.zshrc
# Git保管機能の設定 ▼▼ここから▼▼ >>>>>
fpath=(~/.zsh/completion $fpath)
autoload -Uz compinit
compinit -u
# Git保管機能の設定 ▲▲ここまで▲▲ >>>>>

function left-prompt {
  name_t='214m%}'      # user name text clolr
  name_b='000m%}'    # user name background color
  path_t='255m%}'     # path text clolr
  path_b='031m%}'   # path background color
  arrow='087m%}'   # arrow color
  text_color='%{\e[38;5;'    # set text color
  back_color='%{\e[30;48;5;' # set background color
  reset='%{\e[0m%}'   # reset
  sharp="\uE0B0"      # triangle

  user="${back_color}${name_b}${text_color}${name_t}"
  dir="${back_color}${path_b}${text_color}${path_t}"
  echo "${user}%n%f%b on %B%F{086}%m%f%b ${back_color}${path_b}${text_color}${name_b}${sharp} ${dir}%~ ${reset}${text_color}${path_b}${sharp}${reset}\n${text_color}${arrow}➡ ${reset}"
}

PROMPT=`left-prompt`

# コマンドの実行ごとに改行
function precmd() {
  # Print a newline before the prompt, unless it's the
  # first prompt in the process.
  if [ -z "$NEW_LINE_BEFORE_PROMPT" ]; then
      NEW_LINE_BEFORE_PROMPT=1
  elif [ "$NEW_LINE_BEFORE_PROMPT" -eq 1 ]; then
      echo ""
  fi
}

# git ブランチ名を色付きで表示させるメソッド
function rprompt-git-current-branch {
  local branch_name st branch_status

  branch='\ue0a0'
  color='%{\e[38;5;' #  文字色を設定
  green='114m%}'
  red='001m%}'
  yellow='227m%}'
  blue='033m%}'
  reset='%{\e[0m%}'   # reset

  color='%{\e[38;5;' #  文字色を設定
  green='114m%}'

  # ブランチマーク
  if [ ! -e  ".git" ]; then
    # git 管理されていないディレクトリは何も返さない
    return
  fi
    branch_name=`git rev-parse --abbrev-ref HEAD 2> /dev/null`
    st=`git status 2> /dev/null`
  if [[ -n `echo "$st" | grep "^nothing to"` ]]; then
    # 全て commit されてクリーンな状態
    branch_status="${color}${green}${branch}"
  elif [[ -n `echo "$st" | grep "^Untracked files"` ]]; then
    # git 管理されていないファイルがある状態
    branch_status="${color}${red}${branch}?"
  elif [[ -n `echo "$st" | grep "^Changes not staged for commit"` ]]; then
    # git add されていないファイルがある状態
    branch_status="${color}${red}${branch}+"
  elif [[ -n `echo "$st" | grep "^Changes to be committed"` ]]; then
    # git commit されていないファイルがある状態
    branch_status="${color}${yellow}${branch}!"
  elif [[ -n `echo "$st" | grep "^rebase in progress"` ]]; then
    # コンフリクトが起こった状態
    echo "${color}${red}${branch}!(no branch)${reset}"
    return
  else
    # 上記以外の状態の場合
    branch_status="${color}${blue}${branch}"
  fi

  # ブランチ名を色付きで表示する
  echo "${branch_status}$branch_name${reset}"
}

# プロンプトが表示されるたびにプロンプト文字列を評価、置換する
setopt prompt_subst

# プロンプトの右側にメソッドの結果を表示させる
RPROMPT='`rprompt-git-current-branch`'
```