GitBashでWindowsに快適CLI環境を構築

# はじめに

WindowsでCLI環境を構築してターミナルからいろいろ操作したい！という場合には、Git for Windowsをインストールすると付属してくるGitBashを利用しましょう。

WSLよりもWindowsシステムに入り込んでいる度が高いと思いますので、Windowsとしてアクセスできる場所にならアクセスできます。OneDrive/Boxなどのクラウドストレージや、sambaなどの共有フォルダとかも、エクスプローラー経由で利用できるようにしていればターミナルから直接参照できるので、なにかと便利でもあります。
（WSLだとドライブレターやらUNCパスやら、Windowsファイルシステムとの連携がちょい面倒だったと思います）

# ソフトウェアのインストール

## Git for Windows


以下URLからダウンロードしてインストールします。

https://gitforwindows.org/

インストールしたら、スタートメニュから「Git Bash」で起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/3d763bc3-53b1-c847-8042-d02481b10d00.png)


<details><summary>tmuxを使いたい場合はこちら</summary>

Git for Windowsに付属しているGitBashではtmuxをインストールするためのパッケージ管理ソフトウェアであるpacmanが利用できません。そのため、GitSDKをインストールすると付属してくるGitBashを利用してpacman経由でtmuxをインストールする必要があります。

**[Git for Windows - build-extra](https://github.com/git-for-windows/build-extra/releases)** から `git-sdk-installer-x.x.x-64.7z.exe`をダウンロードしてインストールします。

インストーラーのバイナリ自体は2020年と古いのですが、実行するとリポジトリからクローンするので、その時点の最新状態になります。

GitSDKのインストール後に一度起動してtmuxをインストールしておきます。

```:tmuxのインストール
pacman -S tmux
```

Git for Windows付属のGitBashからGitSDKでインストールしたtmuxバイナリを利用するには、以下のようにします。

```:tmuxを使う
/c/git-sdk-64/usr/bin/tmux
```

GitSDKをインストールしたときのGitBashはPythonとかも入ってて、Windows版Pythonの同時利用と相性が悪そうなので常用しません。pacmanでインストールが必要なパッケージが出てきたときに使います。

以下はtmuxの設定ファイルですが、これはサンプルで自身が利用しているものです。

```:.tmux.conf
cat <<'EOF' > ~/.tmux.conf
# prefixキーをC-aに変更
set -g prefix C-a
bind C-a send-prefix

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

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

# 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

# | でペインを縦分割する
bind | split-window -h

# - でペインを横分割する
bind - split-window -v

# Status line

# Global
set-option -g status-interval 1
set-option -g window-active-style bg=colour232
set-option -g window-style bg=colour234

# Left
set-option -g status-left-length 50
set-option -g status-left-style bg=white,fg=black
set-option -g status-left  " Screen:#I Pane:#P / Git:#(cd #{pane_current_path}; git rev-parse --abbrev-ref HEAD) "

# Center
set-option -g status-justify "centre"
set-option -g status-style bg=magenta,fg=white

# Right
set-option -g status-right-length 50
set-option -g status-right-style bg=white,fg=black
set-option -g status-right " [%Y/%m/%d %H:%M:%S] "

# Set Terminal
set -g default-terminal "xterm-256color"
EOF
```

</details>


## Python

（2023/4時点では）Azure Functions Core Tools がPython3.11で利用できないので、Python3.10をインストールします。

GitBashから`python`とタイプするとWindowsStoreが立ち上がるので、Python3.10を検索しなおしてインストールします。


# ソフトウェアの設定

## ターミナルエミュレータの設定

以下の設定のためのファイルを生成します。
* 配色
* フォント
* 日本語設定
* 選択範囲をクリップボードにコピーする
* `Ctrl-Shift-V`でクリップボードをペーストする

```:.minttyrc
cat <<'EOF' > ~/.minttyrc
Locale=ja_JP
Charset=UTF-8
Font=Terminal
FontHeight=14
Term=xterm-256color
RightClickAction=paste
CursorType=block
Columns=100
Rows=40
Language=ja
BellType=0
AllowSetSelection=yes
CursorColour=191,191,191
White=255,255,255
ForegroundColour=255,255,255
ThemeFile=xterm
BoldAsColour=yes
BoldAsFont=no
CtrlShiftShortcuts=yes
EOF
```

これは、以下の「オプション」から設定することで生成される設定ファイルを直接つくるだけです。そのほかの設定などはお好みで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334782/5d9565f8-1629-f016-75b0-a82657f085c2.png)


## GitBashの設定

### .bashrc
`Ctrl-s`って使う人いるんかな？

```:~/.bashrc
cat <<'EOF' >> ~/.bashrc
# パス追加
export PATH=$PATH:~/bin/

# Ctrl-sを解除　
stty stop undef

# Pythonをwinpty経由で実行する
alias python='winpty python'
EOF
```

### .vimrc
おせっかいなインデント関連はすべてOFFじゃああ～！

```:~/.vimrc
cat <<'EOF' > ~/.vimrc
" syntaxがあれば有効
if has("syntax")
  syntax on
endif

" インデントは無効
filetype indent off
set noautoindent
set nosmartindent
set paste

" マークダウンで_をエラー表示しない用の設定
augroup update_markdown_syntax
  autocmd!
  autocmd FileType markdown syntax match markdownError '\w\@<=\w\@='
augroup END

" ターミナルの背景（黒）で見やすい配色
set background=dark

" 画面ベルも不要なので全部無効
set belloff=all

" 検索ハイライトをON（目がチカチカするときは:nohlすればいい）
set hlsearch

" マウスで選択した箇所はクリップボードにコピー
set mouse=a
set clipboard=unnamed,autoselect
EOF
```


### SSH設定
他端末にSSH接続する場合は、これをやっておく。

まず `~/.ssh` ディレクトリがない場合は、先に作成しておく。

他サーバにログインした際に鍵の流用ができるようにしておきます。
```:~/.ssh/config
cat <<'EOF' >> ~/.ssh/config
ForwardAgent yes
EOF
```

**SSH鍵の新規作成**
```
openssl genrsa -out ~/.ssh/id_rsa -aes256 4096
```

<details><summary><b>既存のSSH鍵を流用する場合</b></summary>
`BEGIN RSA PRIVATE KEY` は PKCS#1 形式

```
# PKCS#1->PKCS#8 パスフレーズ追加
openssl rsa -in id_rsa  -aes256  -out id_rsa.encrypted

# PKCS#8->PKCS#8 パスフレーズ削除
openssl rsa -in id_rsa.encrypted -out id_rsa.decrypted
```

OpenSSHの公開鍵（authorized_keys）を作成する場合
```
ssh-keygen -y -f ~/.ssh/id_rsa >> ~/.ssh/authorized_keys
```

PEM形式の公開鍵を作成する場合
```
openssl rsa -pubout -in ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
```
</details>


**ログイン時に自動でssh-agentに鍵を追加する**
（鍵の保管ディレクトリはローカルディスク以外でもいいが、他人が参照できない場所に！）
```:~/.bashrc
cat <<'EOF' >> ~/.bashrc
# ssh-agent
if [ -f ~/.ssh-agent ]; then
    . ~/.ssh-agent
fi
if [ -z "$SSH_AGENT_PID" ] || ! kill -0 $SSH_AGENT_PID; then
    ssh-agent > ~/.ssh-agent
    . ~/.ssh-agent
fi
ssh-add -l >& /dev/null || ssh-add ~/.ssh/id_rsa
EOF
```

<details><summary><b>手動でssh-agentに鍵を追加/削除する場合</b></summary>

```
# 鍵追加
ssh-add [key path]

# 一覧表示
ssh-add -l 

# 全部削除
ssh-add -D
```
</details>


# そのほかのソフトウェア

## Azure関連

### AzureCLI
以下を参照にしてMSIファイルをダウンロードしてインストールする。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli


<details><summary>MSIインストール以外の方法</summary>
```:PowerShell
winget install -e --id Microsoft.AzureCLI
```

```:pip
pip install azure-cli
```
</details>

### Azure Functions Core Tools
以下を参照にしてMSIファイルをダウンロードしてインストールする。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=v4%2Cwindows%2Ccsharp%2Cportal%2Cbash#install-the-azure-functions-core-tools

エラーが出る場合は **[.NET SDK](https://dotnet.microsoft.com/ja-jp/download)** の再インストール後に、再度CoreToolsをインストールする。

<details><summary>MSIインストール以外の方法</summary>
```
winget install Microsoft.AzureFunctionsCoreTools
```
</details>