Edited at

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

More than 1 year has passed since last update.


はじめに

これは 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 にすると有効化されるみたいです。レッツ!