トップ 最新

ただのにっき

2018-07-20(金) [長年日記]

常用エディタをVisual Studio Codeに変えようかな(挫折する予感はある)

普段はさほどカスタマイズしていないvimでコード(やコード以外のなんでも)を書いていて、sshで乗り込んだ先でもローカルといっさい違いのない環境でものが書けるのはとてもいいし、困ったことは特にない。とはいえ、いろんな支援技術が入っている最近のエディタも使ってみたいんだよなぁ……とはもう何年も考えてるんだけど、ここらでえいやっと取り組んでみることに。とりあえず勢いのあるVS CODEがいいんじゃないの。

目標は、職場(Ubuntu Desktop)と自宅(Windows 10)で同じ環境にすること。WindowsではWSLを使っているから、基本的にLinuxに合わせるのがいい。ということで、まずはUbuntu 18に導入。これはらくちん。

ちゃんとハード3タブにできるんだ。えらいぞ、Microsoft。Light系のテーマ、日本語化、フォントはMyricaM。あとは言語サポート拡張をいくつか入れて、環境はぼちぼち作れた。ビルトインのgit連携でリモートへのpush / pullがうまくいってないけど、コンソールでもできるから解決はあとで。

次にWindows。さすがにMicrosoftが作ってるだけあって、導入は楽だし、エディタ機能でトラブルはない。DropBoxを使ってLinux環境と設定の共有もした*1

問題は、WSLとの連携だ。ご存知のとおり(ご存知ないかも知れないけど気にせず続ける)、Windows側からWSL側のファイルシステムは見えない。逆は可能。てことは、Windows側に置いたコードを、WSL側からも扱えばいい……んだけど、またもやご存知の通り、WSLから見えるWindowsファイルのパーミッションが極めて気持ち悪い。具体的には全部「-rwxrwxrwx」になる。しかも所有者はroot。

で、この春のアップデートでこのへんに改良が入ったのでやってみる。(WSL内の)/etc/wsl.confを作って以下を入力:

[automount]
enable = true
root = /mnt/
options = "metadata,uid=1000,gid=1000,umask=022"
mountFsTab = false

WSLを再起動すると*2、Linuxのパーミッションまわりがだいたい期待したような感じになる。なんでこれ、デフォルトじゃないんですかね。

なお、Windows版のgitを入れなくても、WSLGitというコマンドをパスの通ったところに入れておけば、VS CODEはWSL内のgitを使ってくれるようになる*3

それから、コンソールまわりでもいくつかいじる必要がある。まずは

"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\wsl.exe"

標準だとbash.exeになってるのかな? ログインシェルを変えてる場合はwsl.exeを呼ぶようにしないとうまくいかない。これで開いているワークスペースに相当するディレクトリをカレントにしてくれる。

あと、個人的にあらゆるシェルから起動中のscreenセッションにアタッチする設定にしてあるんだけど、これだと都合が悪いので、VS CODEから入ったときにはscreenを無視させたい。いろいろ調べてみると、Linuxでは環境変数「TERM_PROGRAM」が「vscode」になるのでこれがあるときに無視させる。Windowsではいい感じの環境変数はなかったんだけど、「PWD」が「/mnt」から始まるのを利用できるのでそうした。これでVS CODEの中では対象のプロジェクトにフォーカスできる。

んー、だいたいこんなところかな。意外とうまくいった感じはある。あとssh先にあるディレクトリをマウントできるSSH FSなんて拡張もみつけたので、リモート開発もVS CODEでできるかも?

あとは、使い慣れたvimのキーアサインからどれだけ慣れることができるか、だなぁ。vimのキーアサインになる拡張もあるようだけど、そこはあえて入れない方向でしばらく使ってみる。もうちょっと目に優しい感じのテーマも探したい。

Tags: vscode wsl

*1 settings.jsonをシンボリックリンクを使って同期する手法。やり方はググればいくらでも出てくる。秘匿情報がなければgistを使った方法もいいと思う。履歴がとれるし。

*2 最近のWSLはタスクマネージャから「LxssManagerサービス」の再起動が必要。

*3 settings.jsonを共通にするためにはファイル名を「git.exe」にするのがミソ。あとssh-agent系の環境変数を扱わせるにはWSLENVの設定が必要。See https://github.com/andy-5/wslgit/pull/23