個人的な M1 Mac のCUI環境セットアップメモ

**自分用の細かいセットアップの手順書です**

*PATH の YOU は適宜自分のホームディレクトリ名に置き換えてください*

# 環境

- macOS Big Sur 11.3.1
- Mac mini (M1, 2020)

# iterm

### 概要
iterm を使うとどのスクリーンにいても透過したターミナルをホットキーで全画面表示することができる．便利

[ここ](https://www.iterm2.com/downloads.html)から iterm をダウンロード．
`/Applications` におく

### iterm の設定

- General
    - Closing
        - confirm "Quit iterm2" をオフ
    - Selection
        - Applications in terminal may access clipbord をオン
    - Window
        - Native full screen windows をオフ
- Appearance
    - General
        - Auto-hide menu bar in non-native fullscreen をオン
        - Exclude from Dock and ⌘-tab applications switcher をオン
- Profiles
    - General
        - working directory で terminal 起動時のディレクトリを変更できる．
    - Colors
        - [lucario](https://github.com/raphamorim/lucario) をダウンロードしてカラースキームに設定
    - Window
        - Blur をオフ
        - Transparency をいい感じに
        - Keep background colors opaque をオン
        - Settings for new windows を以下のように設定
            - Style: Full Screen
            - Screen: Screen with Cursor
            - Space: AppSpaces
- Keys
    - Hotkey
        - コントロール + スペースをホットキーに設定



# Command Line Tool for Xcode

brew のために Xcode 入れるのは… だから command line tools のみをインストール

```console
$ xcode-select --install
```


# brew

### brew

Homebrew の[公式サイト](https://brew.sh/index_ja)を参考に下のコマンドを実行して brew をインストール

```console
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

おそらくこのように設定を `~/.zprofile` に書き込みなさいと言われるので，素直に実行

```console
$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/YOU/.zprofile
```

インストールが正常に行われたかは以下のコマンドでチェックできる

```console
$ brew doctor
```

### brew bundle

[Homebrew bundle](https://github.com/Homebrew/homebrew-bundle) という機能を使うと， brew でのインストールがファイル形式で管理できるので便利．

例えばこの記事のでインストールしているものは `Brewfile` という名前のファイルにこのように記述して管理できる．

```config:Brewfile
brew 'neovim', args: ['HEAD']
brew 'tmux'
brew 'anyenv'
brew 'git'
brew 'gh'
brew 'tree'
brew 'trash'
```

以下のようなコマンドで管理できる

```zsh
# Brewfile に書いてあるパッケージをインストール
$ brew bundle
# Brewfile に書いていない， 依存していないパッケージを表示
$ brew bundle cleanup
```


# zprezto

### 概要
最近の Mac はデフォルトで zsh なのでそのまま使って大丈夫そう
よく知らないが，軽量 oh-my-zsh みたいなものらしい
これをインストールするときに `.zshrc`, `.zprofile` などが上書きされるらしいので既存の `.zshrc`, `.zprofile` がある人は退避させておくべき

### インストール
[この](https://github.com/sorin-ionescu/prezto) README に従えば問題なくインストールできると思う
投稿時には以下の手順でインストールできた．

ダウンロード

```console:コマンドラインで実行
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

インストール

```console:コマンドラインで実行
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

`~/.zprofile` も書き換えられるので再び homebrew の設定を `~/.zprofile` に書き込む

```
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/YOU/.zprofile
```

### 設定
インストールが完了後，ホームディレクトリに `.zpreztorc` ができるのでここの設定をいじってお好みの設定にする．

個人的に好んでいる設定を晒しておく

```diff:~/.zpreztorc
- zstyle ':prezto:module:editor' key-bindings 'emacs'
+ zstyle ':prezto:module:editor' key-bindings 'vi'
- zstyle ':prezto:module:prompt' theme 'sorin'
+ export TERM="xterm-256color"
+ zstyle ':prezto:module:prompt' theme 'powerlevel10k'
```

Shell を再起動などすると powerlevel10k の初期設定が起動する．

### [poewrlevel10k](https://github.com/romkatv/powerlevel10k)

powerlevel10k は zsh のテーマの一つでインタラクティブに設定を行えるリッチなプロンプト．

上記の設定 `zstyle ':prezto:module:prompt' theme 'powerlevel10k'` を行い， 
再起動すると設定画面がコンソール上で開く．
この設定で Nerd-font の MesloLGF NS をインストールすることができるので，　
Nerd-font を設定してないのであればここでお願いする．

powerlevel10k の[transient-prompt](https://github.com/romkatv/powerlevel10k#transient-prompt) 機能は過去のコマンドのプロンプトがシンプルになり見やすいのでとってもおすすめ．


# zshrc

お気に入りの設定設定ファイル

```zsh:.zshrc
# 初回シェル時のみ tmux 実行
# if [ $SHLVL = 1 ]; then
#   tmux attach || tmux new-session
# fi

# プロンプトを画面の下に固定する
tput cup $LINES

# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
  source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

# ctrl-l で画面を再描画した時の設定
function myclear() {
    clear
    tput cup $LINES
    zle reset-prompt
}
zle -N myclear
bindkey '^L' myclear

# clear で画面を再描画した時の設定
alias clear="clear;tput cup $LINES"

# vimでescが押された後のタイムラグを防ぐ
KEYTIMEOUT=1

# cursorの形状をmodeによって変える
zle-keymap-select () {
if [ $KEYMAP = vicmd ]; then
    printf "\033[2 q"
else
    printf "\033[6 q"
fi
}
zle -N zle-keymap-select
zle-line-init () {
zle -K viins
printf "\033[6 q"
}
zle -N zle-line-init
bindkey -v
```

`.p10k.zhs` に `typeset -g POWERLEVEL9K_INSTANT_PROMPT_COMMAND_LINES=0` を追加

powerlevel10k の設定で transient-prompt をオンにして，このように設定することで， [このgif](https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/transient-prompt.gif) のように画面下にプロンプトを固定することができる．

# anyenv

nodenv とか pyenv とかをまとめて管理できる便利なもの

### インストール

[リポジトリ](https://github.com/anyenv/anyenv)を参照

```shell
$ brew install anyenv
# anyenv init を実行すると eval "$(anyenv init -)" を ~/.zshrc に追加するように指示される
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
# シェルを再起動
$ exec $SHELL -l
$ anyenv install --init
```

### node と python をインストール

```console
$ anyenv install nodenv
$ anyenv install pyenv
```

投稿時では　pyenv の PATH の設定をちゃんとしないと警告が出る．
以下の項目を `~/.zprofile`, `~/.zshrc` に追記

```zsh:.zprofile
export PYENV_ROOT="$HOME/.anyenv/envs/pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
```

```zsh:.zshrc
eval "$(pyenv init -)"
```


```console
$ nodenv install 15.14.0
$ nodenv global 15.14.0
$ pyenv install 3.9.5
$ pyenv global 3.9.5
```

Homebrew が参照するPATHの中に anyenv のパスが含まれていると brew doctor が警告をはくので alias で brew の参照する PATH を設定

```zsh:.zshrc
alias brew="PATH=/opt/homebrew/bin brew"
```



# tmux

おなじみ端末多重接続ソフトウェア

### インストール

brew でインストール

```console
$ brew install tmux
```

### .tmux.conf

お気に入りの設定

```conf:~/.tmux.conf
# .tmux.conf の変更を適用する
bind C-r source-file "${HOME}/.tmux.conf"

# TrueColr
set -g default-terminal "xterm-256color"
set-option -ga terminal-overrides ",xterm-256color*:Tc:smso=[3m"

# ステータスバの上に線をひく
setw -g pane-border-status bottom
setw -g pane-border-format '─'

# ペイン分割の線の色
set -g pane-active-border-style bg=default,fg=colour244
set -g pane-border-style fg=colour239

# prefix キーを C-q に変更する
set -g prefix C-q

# C-b のキーバインドを解除する
unbind C-b

# キーストロークのディレイを減らす
set -sg escape-time 1

# ステータスバーを1秒毎に描画し直す
set-option -g status-interval 1

# vim のキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind -r C-k select-window -t :-
bind -r C-j select-window -t :+

# vim のキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# c で新しいウィンドウを作成する
bind c new-window -c "#{pane_current_path}"

# | でペインを縦分割する
bind | split-window -hc "#{pane_current_path}"

# - でペインを縦分割する
bind - split-window -vc "#{pane_current_path}"

# 番号基準値を変更
set-option -g base-index 1

# コピーモードを設定する
# コピーモードで vim キーバインドを使う
setw -g mode-keys vi

# 'v' で選択を始める
bind -T copy-mode-vi v send -X begin-selection

# 'V' で行選択
bind -T copy-mode-vi V send -X select-line

# 'C-v' で矩形選択
bind -T copy-mode-vi C-v send -X rectangle-toggle

# 'y' でヤンク
bind -T copy-mode-vi y send -X copy-selection

# 'Y' で行ヤンク
bind -T copy-mode-vi Y send -X copy-line

# 'C-p' でペースト
bind-key C-p paste-buffer

# マウスに関する設定
set-option -g mouse on
bind-key -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'"
bind-key -n WheelDownPane select-pane -t= \; send-keys -M

setw -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
unbind -T copy-mode-vi MouseDragEnd1Pane
```

### powerline

[pip を用いた powerline インストール方法](https://powerline.readthedocs.io/en/master/installation.html)を参考に以下の三つのライブラリを pip でインストールする

```shell
# powerline 本体
$ pip install powerline-status

# powerline の segment で用いているライブラリ
# psutil python package. Required for some segments like cpu_percent. Some segments have linux-only fallbacks for psutil functionality.
$ pip install psutil

# powerline の segment で用いているライブラリ
# pyuv python package. Required for libuv-based watcher to work.
$ pip install pyuv
```

[tmux の powerline の設定](https://powerline.readthedocs.io/en/master/usage/other.html?highlight=tmux#tmux-statusline)を参考に`.tmux.conf`に以下の行を追記する．

```conf:~/.tmux.conf
run-shell "powerline-daemon -q"
source "{repository_root}/powerline/bindings/tmux/powerline.conf"
```

`{repository_root}` は[ここ](https://powerline.readthedocs.io/en/master/installation.html#repository-root)に書いてある通り `pip show powerline-status` を実行したときに出力される `Location: {path}` の `{path}` のこと．

```conf:~/.tmux.confの具体例
source "/Users/You/.anyenv/envs/pyenv/versions/3.9.5/lib/python3.9/site-packages/powerline/bindings/tmux/powerline.conf"
```

powerlineは[このように](https://powerline.readthedocs.io/en/latest/configuration.html#quick-setup-guide)`~/.config/powerline`ディレクトリに設定を書くことでカスタマイズが可能．

ちなみに私は[このように](https://github.com/shimehituzi/powerline.git)設定している


# nvim

vim について詳しく書くと大変なことになるのでセットアップ方法のみ書く

## インストール

neovim 本体をインストールするのですが vim のプラグインで以下のものを使うので， 以下のコマンドで依存する言語拡張をインストール

- [denite.nvim](https://github.com/Shougo/denite.nvim)
    -  色々なインターフェース
    -  python3 依存
- [defx.nvim](https://github.com/Shougo/defx.nvim)
    - ファイルマネージャー
    - python3 依存
- [coc.nvim](https://github.com/neoclide/coc.nvim)
    - LSPサーバー
    - node 依存
- [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter)
    - 複数言語のシンタックスハイライター
    - HEAD の neovim 依存

```console
$ brew install --HEAD neovim
$ pip install pynvim
$ npm install -g neovim
```

neovim に入って checkhealth を実行して問題なければ ok

```console
$ nvim
```

```vim
:checkhealth
```

neovim をデフォルトのエディタに設定するために `.zprofile` を編集

```diff:.zprofile
- export EDITOR='nano'
+ export EDITOR='nvim'
- export VISUAL='nano'
+ export VISUAL='nvim'
- export PAGER='less'
+ export PAGER='nvim -R'
+ export MANPAGER='nvim -c "set ft=man" -R'
```

## 私の init.vim

init.vim の詳細については省略．以下のコマンドで私が個人的に継ぎ足し継ぎ足ししている init.vim をとってこれる

```console:自分用
$ cd ~/.config
$ git clone https://github.com/shimehituzi/nvim.git
```

### dein

私はプラグインマネージャーとして [dein](https://github.com/Shougo/dein.vim) を使っているので以下のコマンドでインストールする

```console
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.cache/dein
```

これを実行すると下記のような出力を得るので `~/.config/nvim/init.vim` に貼り付ける

```vim
"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/Users/You/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
call dein#begin('/Users/You/.cache/dein')

" Let dein manage dein
" Required:
call dein#add('/Users/You/.cache/dein/repos/github.com/Shougo/dein.vim')

" Add or remove your plugins here like this:
"call dein#add('Shougo/neosnippet.vim')
"call dein#add('Shougo/neosnippet-snippets')

" Required:
call dein#end()

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
"if dein#check_install()
"  call dein#install()
"endif

"End dein Scripts-------------------------
```




[私の init.vim](https://github.com/shimehituzi/nvim) では， この状態で neovim に入ると使用しているプラグインがインストールされ，次のコマンドを打つといくつかのプラグインがセットアップされる．

```console
:UpdateRemotePlugins
```


### coc.nvim

私の neovim では LSP クライアントとして [coc.nvim](https://github.com/neoclide/coc.nvim) を使っているので必要な LSP サーバを以下のようなコマンドでインストール
下の例では json typescript javascript の LSP サーバーを導入している

```plaintext:neovimのコマンドライン
:CocInstall coc-json coc-tsserver coc-eslint
```

# git

デフォルトで入ってはいるが brew で最新版をインストール

```console
$ brew install git
```

### git のグローバル設定

コマンドで `--global` してやってもいいのかもしれない

個人的にお気に入りの設定．（そもそも name と email はないと git が使えない）

- git の pager を nvim にしている
- `git pull` した時に remote の削除ずみブランチが反映される設定をしている

```config:~/.gitconfig
[user]
    name = YOUR_NAME
    email = username@gmail.com
[core]
    page = nvim -R
[color]
    pager = no
[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    process = git-lfs filter-process
    required = true
[fetch]
    prune = true
[init]
    defaultBranch = master
```

### github-cli

github を cli で操作できるやつ

#### インストール

brew でインストールできる

```
brew install gh
```

#### zsh の補完

`~/.zshrc` に以下を記述

```
eval "$(gh completion -s zsh)"
```


#### 認証

以下のコマンドで認証できる

```
gh auth login
```

私は以下のように設定した

```
❯ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? HTTPS
? Authenticate Git with your GitHub credentials? Yes
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: ****-****
- Press Enter to open github.com in your browser...
✓ Authentication complete. Press Enter to continue...

- gh config set -h github.com git_protocol https
✓ Configured git protocol
✓ Logged in as *********
```

`gh auth status` で確認ができるように，これで `~/.config/gh/hosts.yml` に github のログイン情報が保存される

この github-cli の認証経由で，[githubへssh-keyの登録](https://docs.github.com/ja/github/authenticating-to-github/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)などをしなくても， `git push`, `git pull` が可能になるところが個人的にいいなと思った．

ちなみに HTTPS ではなく SSH を protocol に選ぶと `~/.ssh` に新しい ssh-key が生成されて github にも登録されるっぽい

#### github-cli でできること

- リポジトリの新規作成
- リポジトリのクローン
- リポジトリをブラウザで表示
- プルリクエストの操作
- イシューの操作

などなどいろいろできるっぽい

# その他

### trash

trash は MacOS のゴミ箱に入らないファイルを入れてくれるもの
`rm -rf` なんて怖いことをせずにディレクトリを削除できる

```console
$ brew install trash
```

### tree

ディレクトリをツリー表示してくれるやつ

```console
$ brew install tree
```

### 全角スペース無効

[bigsurでは無理](https://qiita.com/on0z/items/a9b4033cc088627b1728)らしい