WindowsでGitBashを使って快適なBashライフを送る

# 環境
Windows11Home 21H2
Ryzen5 3500U
RAM 8GB

# 経緯  
僕が初めてCLIに触ったのは、小学生の頃のラズパイだったこともあって、コマンド操作はLinuxで慣れています。  
すると、Windowsで```ls```使っちゃったりして、むむむってなります。  
そこで、Windowsでbash使えたらどんなにいいだろう！との思考にたどり着きました。  

だがしかし！WSLを使おうとするとBIOSで仮想化の設定を確認してくださいと出る。いやオンにしてるんだよ！  
追記:Windowsセキュリティから、コア分離をオンにしたらWSL使えるようになりました。でもやっぱりWSLだとexe動かないんですよね。そこでGitbashを使えばexe動くよ、って話です。（後付け）  

そこでしばらく諦めていたんですが、先日素晴らしいものと出会いましてですね、その名も「Git Bash」!!  
てなことで書いていきます。  
初心者なので、変なこと書いてあったらすいません。コメントやTwitterでご指摘頂けたらありがたいです。  

# GitについてきたGitbash  
先日Windowsにgitを入れた時のことです。gitにGitBashなるものが着いてくるとは噂に聞いていたんですが、いざ入れてみると、これはしっかりBashじゃないか！Linuxネイティブのコマンドこそ使えないが、基本的なファイル操作はできる。そのうえリポジトリに入ったらブランチ名が表示されるから何気ただのBashより使いやすい。よく考えたら当然だけど。  

ちなみに、WindowsでUNIXコマンドが使えるものとして、ほかにも、MSYS2やCygwinなどがありますが、動作がクソ重くて、GitBashとは比べ物にはなりません。GitBashもMSYS2を元に作られてるはずなのになぁ、と思ったり。  

## インストール  
[Gitの公式サイト](https://git-scm.com/download/win)とかからインストールします。  
インストール過程は省略します。  

# 使い方  
スタートメニューからGitBashを選択。ここからの起動だとホームディレクトリが開きます。  

Gitをインストールしたディレクトリからgit-bash.exeを開くと、git-bash.exeがあるディレクトリが開きました。ここがルートディレクトリとして登録されてるっぽい。  
```/usr/bin```の中身を覗いてみたところ、各種コマンドがexeに変換された形で置いてありました。```/bin```も然り。  
エクスプローラーで```/bin```見たところbash.exe、git.exe、sh.exeの3つしかなかったので、何らかの方法で```/usr/bin```と同期させてるんでしょうね。シンボリックリンクでもないし、ハードリンクが2つあるわけでもないらしいんだけど、どういうことなんだろ。  
実際にGitBashとして動いているのは、```/bin/bash```の方っぽいです。でも、Bash上で```which bash```すると、```/usr/bin/bash```といわれるんだけど、なんでだろ。  

なお、もちろんWindowsですので、```sudo```だとか```apt```、```yum```とかのLinuxコマンドは使えませんでした。sudoしたけりゃ管理者権限で開け、aptしたけりゃWSL使えということですね。  

# カスタマイズ
## 起動しやすくしたい  
今のところホームディレクトリの起動は、スタートメニューからしか出来ません。そこで、コマンド入力でホームディレクトリ開いたらどんなにいいだろうと思ったのでやってみます。  

まあ、**```git-bash.exe```があるディレクトリをPATHに追加する**だけなんだけどね。  

:::note warn
Git for Windows以外に、CygwinとかMSYS2とかを入れてる場合、不具合が起きるかもしれない。  
出典：[混ぜるな危険 (msys2とCygwinとGit For Windowsを一緒に使ってはいけません)](https://opcdiary.net/%e6%b7%b7%e3%81%9c%e3%82%8b%e3%81%aa%e5%8d%b1%e9%99%ba-msys2%e3%81%a8cygwin%e3%81%a8git-for-windows%e3%82%92%e4%b8%80%e7%b7%92%e3%81%ab%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%af%e3%81%84%e3%81%91%e3%81%be/)  
:::

### 代替案  
パスは適宜読み替えてください。
1. 任意の場所にショートカット```git-bash.lnk```を作成。  
ショートカット先は```C:\Users\自分\AppData\Local\Programs\Git\git-bash.exe --cd-to-home```。  
1. ショートカットを置いたディレクトリを環境変数に追加。  
1. システム環境変数PathTextに```LNK```がなければ追加。  

確認してみる。
```winbatch:
C:\Users\自分> where git-bash
 C:\Path_Priority\git-bash.lnk
```

これでコマンドプロンプトからbashでホームディレクトリを1発で開けるようになった。  
なお、ショートカット名が```bash.lnk```だと、WSLが開きました。System32内の```bash.exe```(WSLの実行ファイル)が反応したみたいです。  
もし```bash```で開くようにしたければ、システム環境変数の、System32より上に追加すべきですね。 

:::note
bash内での環境変数PATHはどうなってるの？    
```bash:
$ env
(省略)
PATH=/c/Users/自分/bin:/mingw64/bin:/usr/local/bin…(省略)…/c/Windows/System32/…(省略)…
(省略)
```

確認したら、一応全てのWindowsのPATHが反映されてました。  
ついでに他の環境変数も確認したら、大体はWindowsに従ってるっぽいです。  
ちなみに、
~は```C:\Users\自分```  
/は```C:\Users\自分\AppData\Local\Programs\Git```  
になってました。ルートがホームの下にあるのって変な感じ。  

ところで、Windows11(おそらくNT~XP~11)の環境変数で規定されてるOS情報って、```Windows_NT```なんだね。初めて知った。  
:::

## WindowsにインストールしたVimを使う  
デフォルトで```vi```もしくは```vim```コマンドを叩くと、GitBash付属のVimが開きます。どうせなら自分でインストールしたVimを使いたい。  

:::note warn
OSデフォルトのエンコードをUTF-8にしてないと、ASCII以外の文字は多分化けます。
:::

### vim.exeを探す  
以下コマンドを打ちます。
```bash:
$ which vim
/usr/bin/vim
```
デフォルトのVimは、```/usr/bin/vim.exe```にあるようです。Linuxと同じですね。  
上述のように、```/bin/vim.exe```にも何らかの方法で同期されて置いてあります。  

WindowsにインストールしたVimは、環境にもよるでしょうが、インストールしてればおそらく```C:\Program Files (x86)\vim\vim90```(バージョンは適宜読み替えてください)あたりにあると思います。  
僕の場合、いずれのディレクトリもbash側の環境変数に登録されているので、環境変数の操作は必要ないでしょう。このとき、もしもWindows版のVimをインストールする際にWindowsの環境変数にVimを追加していなければしておきます。　　

### コマンド叩いてヒットするexeを変える
```/bin```のほうが```(略)\Vim\Vim90```よりも上位に登録されているので、```/bin```のほうをどうにかしましょう。  
消してもいいんですが、何かあったときに戻せるように、名前を変えるにとどめておきます。名前は何でもいいけど原型とどめてたほうが何かと扱いやすいよね。拡張子もそのまんまにしときましょう。  
```bash:
$ cd /usr/bin　※/binでも可
$ mv vim.exe _vim.exe
$ which vim
/c/Program Files (x86)/vim/vim90/vim
```
これで```vim```を叩くとWindowsにインストールしたVimが開きます。なお、```/bin/vi```は、```vim```呼び出すだけだったらしく、```vi```叩いても開きました。  

もちろん、```_vim```叩けば付属のVimが開きます。

## プロンプトのカスタマイズ  
UNIXやLinux環境下のBashなら、```~/.bashrc```で```PS1```指定してプロンプトをカスタマイズします。別にそれで上書きしてもいいんですが、GitBashのデフォルトのプロンプトのところから変えたい。無駄に設定ファイル増やしたくない。  

参考：  
- [https://qiita.com/EichiSanden/items/6dd7edb24ffb66b01276](https://qiita.com/EichiSanden/items/6dd7edb24ffb66b01276)  
- [https://qiita.com/hf7777hi/items/7585c3aa5423a44eef35](https://qiita.com/hf7777hi/items/7585c3aa5423a44eef35)
（ほぼ内容そのままです）

```/etc/profile.d/git-prompt.sh```(Bash上での表示)にデフォルトのプロンプトがあるらしいです。  
<details>
<summary>/etc/profile.d/git-prompt.sh の中身（長い）</summary>

```shell:git-prompt.sh
if test -f /etc/profile.d/git-sdk.sh
then
        TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
        TITLEPREFIX=$MSYSTEM
fi

if test -f ~/.config/git/git-prompt.sh
then
        . ~/.config/git/git-prompt.sh
else
        PS1='\[\033]0;$TITLEPREFIX:$PWD\007\]' # set window title
        PS1="$PS1"'\n'                 # new line
        PS1="$PS1"'\[\033[32m\]'       # change to green
        PS1="$PS1"'\u@\h '             # user@host<space>
        PS1="$PS1"'\[\033[35m\]'       # change to purple
        PS1="$PS1"'$MSYSTEM '          # show MSYSTEM
        PS1="$PS1"'\[\033[33m\]'       # change to brownish yellow
        PS1="$PS1"'\w'                 # current working directory
        if test -z "$WINELOADERNOEXEC"
        then
                GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
                COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
                COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
                COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
                if test -f "$COMPLETION_PATH/git-prompt.sh"
                then
                        . "$COMPLETION_PATH/git-completion.bash"
                        . "$COMPLETION_PATH/git-prompt.sh"
                        PS1="$PS1"'\[\033[36m\]'  # change color to cyan
                        PS1="$PS1"'`__git_ps1`'   # bash function
                fi
        fi
        PS1="$PS1"'\[\033[0m\]'        # change color
        PS1="$PS1"'\n'                 # new line
        PS1="$PS1"'$ '                 # prompt: always $
fi

MSYS2_PS1="$PS1"               # for detection by MSYS2 SDK's bash.basrc
```

</details>

うん、コメントそのまんまですね。  
上の方に、```~/.config/git/git-prompt.sh```があれば読み込む旨書いてあるので、ここに書いていこうと思います。これならホームディレクトリ散らかんないし、アクセスしやすい。  

12行目から36行目までを```~/.config/git/git-prompt.sh```に貼っつけ、カスタマイズします。BashとかPOSIX準拠シェルのPS1の設定方法は調べれば山ほど出てくるので、省略します。  

# おわり  
まだしっかりと使い始めてはいないので、まだ問題点とか出てくるかもしれません。出てきたらこの記事に追加していこうと思います。