M1/M2/M3 MacBookPro 初期設定/ Nerdフォント,ghq+fzf(gitリポジトリ管理)+exa,zshrc,ターミナル/VSCode表示,

# 概要
久しぶりにAppleシリコンのMacBookを購入したので初期設定を記載していきます。
NerdFontがJetBraninsのフォントと統合していたりと、より便利になった変化がありましたので備忘録です。

## 作業開始前準備

実施リスト

- Homebrewのインストール
- エディター インストール(自分の好みで)

### Homebrewのインストール
https://brew.sh/ja/

macでのインストール作業はHomebrewをメインに使用するので、
公式サイトに従ってインストールしてください。

### エディター インストール(自分の好みで)
https://dev.classmethod.jp/articles/vim-versions-list/

今回は NeoVimを Homebrewからインストール
理由はプラグインが豊富そうだったから(完全に好み)

```zsh:zsh ターミナルに入力
brew install neovim
```

vimの操作方法は以下を参考にしてください(よく忘れるので)

https://mstn2050.github.io/blogs/contents/vim-basic-oparation.html





## ターミナル設定

実施リスト

- ターミナルプロンプト設定(StarShipインストール) 
- Nerd/JetBrain フォント設定 
- フォントの設定/反映

### StarShip/フォント インストール

Step 1. Starshipをインストール
Step 2. フォントのインストール

https://starship.rs/ja-jp/guide/#step-1-starship%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB


https://github.com/JetBrains/JetBrainsMono

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


```zsh:
# starshipのインストール (mac)
curl -sS https://starship.rs/install.sh | sh
echo 'eval "$(starship init zsh)"' >> ~/.zshrc
mkdir -p ~/.config && touch ~/.config/starship.toml 
# startship 表示カスタム(お好みで)
# sudo vim ~/.config/starship.toml 

# Nerdフォント(アイコン表示/字体に使用 JetBrains Mono Nerd install)
brew tap homebrew/cask-fonts
brew install --cask font-jetbrains-mono-nerd-font
# フォント 有効化 (macOS Ventura v13以降のOSでは必要ないかも)
# fc-cache -f -v
```


### vsCode/ターミナル上でのNerdFonts表示の有効化
Step 3. フォントの設定/反映

実施リスト
- VSCodeフォント設定
- ターミナルフォント設定

フォントファミリは有効にしたいNerdFonts名(色々種類がある)を指定する

#### VSCodeフォント設定
今回は `JetBrainsMono Nerd Font Mono`を使用
VSCode内のターミナル表示にも影響するのでNerdFonts表示の有効化を実施

VScodeの右上の[ファイル]→[基本設定]→[設定]の検索で[font]で検索
settings.json　で編集をクリック
どちらでも設定できるので `JetBrainsMono Nerd Font Mono`を追記
![スクリーンショット 2023-12-09 15.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/dc110b44-3d4c-9f82-4616-f6fc2e0c115f.png)


#### ターミナル上でのフォント設定
[ターミナル]→[設定]→[フォント]から変更 
フォント変更(JetBrainsMono)とアイコン表示(NerdFontが必要)を行いたいので VSCodeと同じく両方兼ね備えている`JetBrainsMono Nerd Font Mono`を選択
![スクリーンショット 2023-12-09 15.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/d56ba470-ccfc-3a0c-58ca-cb9c52f7c3df.png)


## Git管理とディレクトリ移動

実施リスト

- ghq+fzf(peco)+exa(lsの代わり)のインストール
- ghq+fzf(peco)+exa(lsの代わり)の設定
- cd + ls の設定(おまけ)
- zsh起動時の設定(おまけ②)


### ghq+fzf(peco)+exa(lsの代わり)のインストール

https://github.com/x-motemen/ghq

https://github.com/junegunn/fzf

https://github.com/ogham/exa/


```zsh:
brew install ghq fzf exa
# To install useful key bindings and fuzzy completion:
# $(brew --prefix)/opt/fzf/install
# ghqで管理するrootディレクトリを設定(この記事では~/srcとする)
git config --global ghq.root '~/src'
# exaコマンドの確認
exa -l -g --icons
```

### ghq+fzf(peco)+exa(lsの代わり)の設定
前提条件
- デフォルトシェルでzshを使用している
- ghq+fzf(peco)+exaがインストールされている

#### exaをlsの代用として使用する設定

```vim ~/.zshrc
# エイリアス設定
# exaがインストールされている場合のみ有効化
if [[ $(command -v exa) ]]; then
  alias e='exa --icons --git'
  alias l=e
  alias ls=e
  alias ea='exa -a --icons --git'
  alias la=ea
  alias ee='exa -aahl --icons --git'
  alias ll=ee
  alias et='exa -T -L 3 -a -I "node_modules|.git|.cache" --icons'
  alias lt=et
  alias eta='exa -T -a -I "node_modules|.git|.cache" --color=always --icons | less -r'
  alias lta=eta
  alias l='clear && ls'
fi
```

#### ghq/fzf/exa 組み合わせ
`cntl(^) + f `でGithubディレクトリを選択し移動
関数とそれをキーバインドさせる設定を`~/.zshrc`に書き込み完成
`source ~/.zshrc`で有効化させれば使えます

```vim ~/.zshrc
# # エイリアス設定
# ghq/fzf/exa 組み合わせ
function ghq-fzf_change_directory() {
    # 選択したリポジトリへ移動 かつ
    # 右にリポジトリのディレクトリ詳細を表示
  local src=$(ghq list | fzf --preview "exa -l -g -a --icons $(ghq root)/{} | tail -n+4 | awk '{print \$6\"/\"\$8\" \"\$9 \" \" \$10}'")
  if [ -n "$src" ]; then
    BUFFER="cd $(ghq root)/$src"
    zle accept-line
  fi
  zle -R -c
}

zle -N ghq-fzf_change_directory
bindkey '^f' ghq-fzf_change_directory

```

#### cd + ls の設定(おまけ)
cdの後にlsしたい
参考：[cdした後にlsするのはzshにやらせよう](https://qiita.com/2357gi/items/0ab1297357dedb90bbb1)
カレントディレクトリが変更されたときに発火する`chpwd`を使用
下記を .zshrcに追記してあげる

```.zshrc
# hook
## cd+ls
chpwd() {
    if [[ $(pwd) != $HOME ]]; then;
        ls
    fi
}
```

```
# 読み込み(設定反映)
source ~/.zshrc
```

#### zsh起動時の設定(おまけ②)
zshシェル起動時にコマンドを実行させる
下記を .zshrcに追記してあげる

```.zshrc
# zsh起動時の処理
## VSCodeのターミナルを使っていない、かつ、
## ターミナルでHomeディレクトリ展開時はcdコマンドを実行
if [ "$TERM_PROGRAM" != "vscode" ] && [ "$PWD" = "$HOME" ] ; then
  cd ~/src
fi
## exa(lsの代わり)コマンドの実行
if [[ $(command -v exa) ]]; then;
 exa --icons --git
fi

```

```
# 読み込み(設定反映)
source ~/.zshrc
```


# 最後に
少し前までは、字体フォントとアイコン表示用にNerdFontを別途インストールする必要がありましたが、jetBrainsのフォントとNerdFontが一体になっているのはかなり便利だと感じました。
ここまでのdotfileを置いておくので自分好みに設定してみてください~

<details><summary>~/.zshrc</summary><div>

```zsh:vim ~/.zshrc
# zsh起動時の処理
eval "$(starship init zsh)"
## HOMEディレクトリとVSCodeのターミナル以外でcdコマンドを実行
if [ "$TERM_PROGRAM" != "vscode" ] && [ "$PWD" = "$HOME" ]; then
  cd ~/src
fi
## exa(lsの代わり)コマンドの実行
if [[ $(command -v exa) ]]; then;
 exa --icons --git
fi

# aliases
alias g=git
# alias vim=nvim

# hook
## cd+ls
chpwd() {
    if [[ $(pwd) != $HOME ]]; then;
        ls
    fi
}

## exaがインストールされている場合のみ有効化
if [[ $(command -v exa) ]]; then
  alias e='exa --icons --git'
  alias l=e
  alias ls=e
  alias ea='exa -a --icons --git'
  alias la=ea
  alias ee='exa -aahl --icons --git'
  alias ll=ee
  alias et='exa -T -L 3 -a -I "node_modules|.git|.cache" --icons'
  alias lt=et
  alias eta='exa -T -a -I "node_modules|.git|.cache" --color=always --icons | less -r'
  alias lta=eta
  alias l='clear && ls'
fi

# func
## ghq/fzf/exa 組み合わせ
function ghq-fzf_change_directory() {
    # 選択したリポジトリへ移動 かつ
    # 右にリポジトリのディレクトリ詳細を表示
  local src=$(ghq list | fzf --preview "exa -l -g -a --icons $(ghq root)/{} | tail -n+4 | awk '{print \$6\"/\"\$8\" \"\$9 \" \" \$10}'")
  if [ -n "$src" ]; then
    BUFFER="cd $(ghq root)/$src"
    zle accept-line
  fi
  zle -R -c
}

zle -N ghq-fzf_change_directory
bindkey '^f' ghq-fzf_change_directory

```
</div></details>


<details><summary>~/.config/starship.toml</summary><div>

```zsh:vim ~/.config/starship.toml
# A minimal left prompt
format = """$character"""

# move the rest of the prompt to the right
right_format = """$all"""


[memory_usage]
disabled = false
threshold = -1
symbol = ""
style = "bright-black"

[hostname]
ssh_only = true
disabled = false
```
</div></details>