夢やぶれて・・・ VSCodeでファイルの自動エンコーディングを実現したかった話

  • 51
    いいね
  • 3
    コメント

はじめに

これは Visual Studio Code Advent Calendar 2016 の8日目の記事です。

みなさん、VSCodeつかってますか?
僕はといえば、昔Atomを愛用していたことをすっかり忘れて日々VSCodeライフを満喫しております。
そんなVSCodeですが、日本(語)で働く我々にとって避けては通れぬつらみがありますよね。
そう、デフォルトのファイルエンコードがUTF-8のときに、ほかのエンコードのファイルを開くと文字化けしちゃう、あれです。

これは、VSCodeの非UTF-8エンコーディング問題に立ち向かった一人の男の物語である…!

Preferenceで設定できますよ?

そうなのです。ファイルが全て非UTF-8であれば files.encoding を変更すれば解決です。
※ 常に非UTF-8ならユーザ設定、そのプロジェクトのみの設定ならワークスペース設定を編集しましょう
でもこの現象に出くわすのって、たいてい誰かからもらったファイル(環境設定メモとか)をちょっと開きたいだけなときなんです。
いつもはUTF-8がいいんです。

エンコード設定の手数が多い

じゃあ標準の方法で都度エンコーディング変えろという話になるのですが、
用意されている手順は

  1. 下にあるステータスバーのエンコードをクリック or コマンドパレットで Change file encoding を選択
  2. Reopen with encoding を選択 (借り物だったり共有のファイルだったりするのでエンコード変更はしないことが多い)
  3. ファイルエンコーディングを選択 (たいていShit-JIS ですよね!)

毎回なんてやってられないですよね。

Atomでは?

拡張機能がありまして。
auto-encoding
これを入れればファイルオープン時に自動で判定したエンコーディングを設定してくれるのです。
たぶん日本Atomユーザのかなりの方が入れているのではないかと。

じゃあVSCodeでも!

そしたらVSCode版の拡張機能を作ればいいじゃない、となるのは当然の摂理ですね。
しかも当時は1.0なりたてだったので、あわよくば人気拡張機能の作成者になれるかもしれない、という下心もありました。
意気揚々としばらく実装(CoffeeScript→TypeScriptの移植)を進めていたのですが、AtomのTextEditor.setEncodingに準ずるAPIがVSCodeにはないことが判明。
コマンドを呼び出せばいけるかもと思ったのですが、workbench.action.editor.changeEncoding は、[Reopen with encoding, Save with encodig]のPickerを表示するだけのコマンドで撃沈。
AtomみたいにドキュメントにないAPIとか呼べるかも、と探しましたが、そんなことはありませんでした。
さすがMicrosoft、ドキュメントがしっかりしていらっしゃる…。

ならば本体に手を入れるしかないようだな

ということでPRしました。
OSSにソースがマージされたらそれこそ夢のようです。(しかもMicrosoftのプロダクト)
https://github.com/Microsoft/vscode/pull/10013
内容はAtomの拡張機能に倣って、jschardetでエンコーディングを自動判別!って感じです。
するとどうでしょう。「ユーザが設定でUTF-8を設定しているのに勝手にエンコード変えちゃうのはおかしくね?」みたいなもっともな意見をもらいました。
ぐぬぬ…としているうちに時間が経ちIssueはCloseされたのでした。

ならば本体に手を入れるしかないようだな その2

今度は、「違うエンコードだよ!変えちゃう?」みたいなメッセージを出してエンコーディングの変更をユーザが選べるようにしました。
https://github.com/Microsoft/vscode/pull/13142
するとなんと。「ファイル開くたびにエンコード判定するのはUX的にどうなのよ?」みたいな、これまたもっともな意見でCloseされました。
また、Close、されました…。

思ったことと分かったこと

こうして、僕の下心と夢は儚く散ったわけですが、この経験で感じたことを書いておきます。

  • 拙い英語でもPRとかIssueは何となく理解してもらえる
    • わけわかんねー奴がわけわかんねーこと言ってる、とはならない
    • たぶん英語ネイティブでないPRとかもいっぱいあるので慣れているのでしょう
  • とはいえ英語大事
    • 自分の思いがすべて伝わらない
    • コードレビュー外の部分でレビュー者になるべく負担をかけたくない
  • 自動エンコーディングに需要はある
    • PRに誰かしら +1 してくれていた
    • でも、たぶん英語ネイティブの人たちはあまり困ってない
  • Extension開発は意外と簡単
    • TypeScriptで作ればIntellisenseがかなり便利
    • ドキュメントがしっかりしている!

あと、PRとかIssueとか出すと急激にプロダクトがかわいくなります!

さいごに

関係するIssueはいまだOpenですので、我こそはと思う方はぜひVSCodeのために、ひと肌脱いでいただければと思います。
僕も何か妙案が浮かんだら、懲りずに再チャレンジするつもりでいます。
この件に限らず、VSCodeへのコントリビュートは、手の届く範囲に不便のある今がねらい目だと思いますが、いかがでしょうか。

ReleaseNote の Thank you に載ってる人かっこいいなー…

追記

コメントで教えてもらいましたが、ついに自動判別機能が実装されたようです!(僕の手柄ではありません)
https://code.visualstudio.com/updates/v1_11#_auto-guess-encoding-of-files
files.autoGuessEncodingtrue にすると有効化されるみたいです。レッツ!

この投稿は Visual Studio Code Advent Calendar 20168日目の記事です。