vimのターミナルで発生した文字化けが解消しなかった
私はvimを愛用しているのだが、windows環境はとかくlinux環境と違いすぎていて思い通りに利用するための考慮があちこちに必要となる。
今回ハマったのは、Windows版のgitbash上でvimを起動したときにterminal機能で発生した文字化けだ。
私は文字化け対策を環境設定ファイル.profileに施しているのだが、これがvimのターミナルでは機能しなかった。vimターミナル上でWindowsコマンドを実行するときに出力される日本語が文字化けし、解消しなかった。
色々と試行錯誤した結果、原因はgitbashとvimのターミナルでは、読み込み可能な環境設定ファイル名がことなるため、.profileファイルに設定していた文字化け対策が機能していなかったという事だった。
gitbashの環境設定ファイル
まず、gitbashで読み込み可能な環境設定ファイルは以下の3つだ。
1. .bash_profile
2. .bash_login
3. .profile
これ以外のファイルはデフォルトでは読み込まず、エラーとなる。私は元々.profileに環境設定情報を設定していたので、特に問題なくgitbashを利用していた。
vimターミナルの環境設定ファイル
私はプログラムコードを書くエディタとしてvimを愛用していた。そして、vimのターミナルを起動することでいちいち別のコマンドラインを起動することなくvim上からビルドしたりツールを実行していた。
Linux環境では正常に利用できていたこのやり方だが、Windows環境下では文字化けが問題だった。Windowsコマンドはコンソールメッセージに日本語が出力されることが多々あり、gitbash上のvimのターミナルから実行するともれなく文字化けする。
私は最近C#プログラムをdotnet core環境で開発するプロジェクトに携わっておりVSを利用している。今回gitbash環境下でvim+コマンドラインのお手軽開発環境で利用したいと思い、プログラムのビルドはvimターミナルからdotnetコマンドで実行しようと試みた。
dotnetコマンドは何の情報を見てロケールを判断しているのか不明だが、とにかく日本語がコンソールメッセージに表示される。
dotnetコマンドが参照している環境変数として「DOTNET_CLI_UI_LANGUAGE」があるが、これは元々「en」に設定されており、これ以上の情報を見つけることが出来なかった。
上記イメージは正しく日本語が表示されているが、これはiconvを使用して強制的に文字コードをutf-8に変換しているためである。そうでなければgitbash上からコマンドを実行したタイミングで文字化けして使い物にならなかった。
「dotnet」と入力すると「wincmd()」関数が実行され、iconvを経由してcp932をutf-8に変換している。
だが、これがvimのターミナルから実行すると正常に動作しなかった。
調べていくうちに、vimのターミナルは環境変数として.bashrcというファイルを読み込むという事が分かった。試しに、.profileファイルを.bashrcファイルとしてコピーしてからvimのターミナルでコマンド実行すると、思惑通りに表示された。
そうか、なら.bashrcでいいかと.profileを削除してgitbashを再起動したら、今度はgitbashが.bashrcファイルを読み込まない。以下は、.bashrcファイルを作成後にgitbashを起動したときのエラーメッセージ。
ただし、この時gitbashは.bashrcファイルの存在を認識しており、何と.bashrcファイルを読み込む.bash_profileファイルを自動生成することでこの問題を自動解決していた。
そんなことせずに.bashrcを素直に読んでくれればいいだけなのだが。。
とにかく、これでgitbashでもvimのターミナルでも同じ環境設定ファイルが認識されるようになった。
これなら私好みにしたほうがよさそうだ。
.profileファイルをそのまま残し、.bashrcファイルで.profileファイルを読み込むことにした。
解決!