Edited at

新品のWindows10にWSLを利用した開発環境を整える [備忘録]

初投稿です。

新品のWindows10 PCを購入したので、WSLを利用した開発環境をセットアップするまでを備忘録がてら残しておきます。なお、ここで言う開発環境とは特定の言語の開発環境を指すのではなく、より全般的な設定などを指しています。

各ツールの詳細な使い方などについては記しませんので、気になったものをそれぞれ調べてみてください。

想定読者


  • Linux (Unix) の多少の経験がある開発者


フォント


MacType

Releases - snowie2000/mactype

まず見た目からということでフォントのレンダリングを改善するソフトウェアですが、Windowsの更新などが不安定になるため可能なら入れたくないソフトウェアです。とはいえ、これに慣れてしまうとやっぱりMacTypeありの方が文字がキレイに感じてしまいます。

精細なディスプレイを使ってスケーリングを効かせれば、最近はMacType抜きでもだいぶ文字が見られるようになってきた気はします。フォントのレンダリングに現状で不満を抱いていないなら入れない方が良いです。


Ricty Diminished

プログラミング用フォント Ricty Diminished

プログラミング用のフォントにはRicty Diminishedを愛用しています。他のフォントに浮気していたこともありますが結局これに戻ってきてしまいます。フォントが配布されており、自分でビルドする必要がないのも楽で良いですね。Powerlineに対応したものもあります。


ブラウザ


Firefox

Firefox

なぜChromeではなくFirefoxを使っているかというと、単にMacTypeが効くからです。現在の私の環境 (MacType v1.2018.10.19-beta4 / Firefox 63) では、about:config を開いて



  • gfx.content.azure.backendsdirect2d1.1,cairo (skiaを抜く)

に変更するだけでMacTypeを適用させることができています。


アドオン


キーボード


キーの入れ替え

Windows Server 2003 Resource Kit Tools

Resource Kitに含まれている「remapkey.exe」を管理者権限で起動することで、キーを簡単かつ安全に入れ替えることができます。CapsLockをCtrlに割り当てる定番の変更のみであれば、Ctrl2capで十分かもしれません。


日本語入力

Google 日本語入力

固有名詞などはやはりGoogle日本語入力の方が強いので、こちらをデフォルトにします。個人的には学習機能は要らないのでオフにしています。また無変換キーをIME無効化、変換キーをIME有効化に割り当てて、半角/全角キーを押さなくても済むようにしています。


Windows Subsystem for Linux (WSL)

以前まではWindows上の開発環境としてMSYS2を利用していたのですが、Windows Subsystem for Linux (WSL) が随分使えるようになってきたのでこちらに乗り換えました。


  • プログラムと機能 → Windowsの機能の有効化または無効化 → Windows Subsystem for Linux のチェックを入れる


Kali Linux

Kali Linux を入手 - Microsoft Store

執筆時点でUbuntuやopenSUSE LeapなどのディストリビューションがWSLに対応していますが、その中でKali Linuxを選択してみました。私自身これまで聞いたことのなかったディストリビューションなのですが、選択した理由はひとえにローリングリリースを採用しているためです。

ローリングリリースでないものは fixed release や point release と呼ばれますが、これらの多くのディストリビューションはバージョン番号で管理され、バージョンを上げる際には明示的に更新を行わなければなりません (e.g., Ubuntu の do-release-upgrade) 。ローリングリリースモデルではそうではなく、頻繁な小さい更新によって常に最新版を保とうとします。

例えばUbuntuはLTSしかWSLでサポートされないと仮定した場合、バージョン18.04の次は20.04まで待たなくてはならないことになります。パッケージマネージャから入れられるソフトウェアのバージョンが古く、結局ソースコードを落としてきて自前でビルドした、なんて経験も皆さんお有りではないでしょうか? ローリングリリースが採用されているディストリビューションではパッケージも頻繁に更新されるため、そのようなことはほぼ無くなると言えます。Kali LinuxはDebianベースであるため、馴染みのあるaptが使えるのもポイントです。

ただ、Kali Linuxは本来ペネトレーションテストに特化した癖のあるディストリビューションであるため、サーバーを立てたいといった用途には適していません (そもそもWSLがサーバーを立てるのに向いていない気もしますが) 。また、マイナーなディストリビューションであるために情報量が少ない点も気になります。長いものに巻かれていた方が安心という方は、素直にUbuntuを利用した方がいろいろと無難かなと思います。


パーミッションの設定

Windows上のファイルはWSLからは /mnt/c/ などから見れますが、デフォルトではファイルのパーミッションが777に見えていて実に気持ち悪いです。そこで、/etc/wsl.conf を (sudoで) 作成して次のように設定することで、パーミッションが755で見えるようになり多少マシになります。


/etc/wsl.conf

[automount]

enable = true
root = /mnt/
options = "metadata,umask=22"
mountFsTab = false

とはいえ、これでもただのテキストファイルが644ではなく実行可能な755で見えたりするため気持ち悪さは残りますが、Windowsのファイルシステム上ではこれらを区別することができないため仕方のないところです。デフォルトで実行不能にしてしまう fmask=111 を追加するのは攻めすぎで、後述するWSLttyが起動しなくなってしまいました。

(その点MSYS2などは面白い実装をしていて、テキストファイルなどは「シェバンがあるかどうか」で実行可能かどうかを判断していました)

また、なぜかデフォルトではディレクトリを新規作成した場合にパーミッションが777になっていたりするので、umask 022.bash_profile などにでも追加しておきましょう。


ターミナル・シェル


端末: WSLtty

Releases - mintty/wsltty

ターミナル・シェルについても外側から見ていくことにしましょう。まずはターミナルですが、現在はWSLttyを利用しています。以前はCmderを使っていたのですが、aptの進捗がちゃんと表示されなかったりでWSLttyに乗り換えました。

WSLttyの設定はあまりなく、大事なのはフォントをRictyにして、端末のタイプを xterm-256color に変更するくらいです。またショートカットキーなどは次のtmux側で設定を行うので、チェックは全て外してしまっています。

tmuxやvim上でもカーソルの点滅を行わせるには、こちらを参考に以下の内容を設定ファイルに書き込みます。(設定ファイルはWindows側に置く点に注意)


%LOCALAPPDATA%\wsltty\home\%USERNAME%\.minttyrc

SuppressDEC=12



仮想端末: tmux

WSLttyにはタブ機能が無いため、仮想端末のtmuxを利用することでタブ機能を実現します。aptからtmuxをインストールしたら、WSLttyのショートカットのリンク先の最後の -~/bin/tmux new -c~ に変更してデフォルトでtmuxを起動するようにします。

tmuxの設定は ~/.tmux.conf 上で行います。個人的にはローカルのtmuxではタブ機能さえ実現できれば良いので、プレフィックスは完全に無効化してしまっています。


~/.tmux.conf

# terminal

set -g default-terminal "screen-256color"

# mouse
setw -g mouse on

# disable prefix
unbind C-b

# key bindings
bind -n C-t new-window -a # Ctrl+Tで新規タブ
bind -n C-w kill-window # Ctrl+Wでタブを閉じる
set -s user-keys[0] "\e[1;5I"
set -s user-keys[1] "\e[1;6I"
bind -n User0 next-window # Ctrl+Tabで次のタブ
bind -n User1 previous-window # Ctrl+Shift+Tabで前のタブ

# index
set -g base-index 1

# status line
set -g status-position top
set -g status-bg "colour240"
set -g status-fg "colour255"
set -g status-interval 1
set -g status-left ""
set -g status-right "[%Y-%m-%d %H:%M:%S]"
setw -g window-status-current-bg "colour234"
setw -g window-status-current-attr bright



コピー&ペースト

Releases - equalsraf/win32yank

このへんを参考に、win32yankを利用してWindows上のクリップボードを介したコピー&ペーストを行えるようにします。(win32yankには適当にパスを通します)


~/.tmux.conf

# copy and paste

setw -g mode-keys vi
# ドラッグでコピー
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "win32yank.exe -i --crlf"
# Ctrl+Vでペースト
bind -n C-v run "win32yank.exe -o --lf | tmux load-buffer - && tmux paste-buffer"


スクロール

WSL上のテキストエディタにはnanoを利用しているのですが、デフォルトではマウスのスクロールがtmuxに奪われてしまいます。このへんを参考に、nano, manなどいくつかのプログラムではtmux側でスクロールを処理しないように設定します。


~/.tmux.conf

# scrolling support

tmux_commands_with_legacy_scroll="nano less more man"
bind-key -T root WheelUpPane \
if-shell -Ft= '#{?mouse_any_flag,1,#{pane_in_mode}}' \
'send -Mt=' \
'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
"send -t= Up Up Up" "copy-mode -et="'

bind-key -T root WheelDownPane \
if-shell -Ft = '#{?pane_in_mode,1,#{mouse_any_flag}}' \
'send -Mt=' \
'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
"send -t= Down Down Down" "send -Mt="'



シェル: fish

シェルは長らく普通にBashを使っていたのですが、fishを使ってみたところ補完が強力で、コマンドも自動で色がつくなど便利だったためこれを機に乗り換えてみました。

aptからインストールを行ったら、chsh -s /usr/bin/fish でデフォルトのシェルをfishに変更してしまいます。またtmuxでもデフォルトシェルを変更するには、以下を ~/.tmux.conf に書き込みます。


~/.tmux.conf

# default shell

set -g default-shell /usr/bin/fish

fishの設定ファイルは ~/.config/fish/config.fish に書き込みます。デフォルトで既に良い感じなので、あまり設定は行いません。個人的にはプロンプトはシンプルなのが好きなので以下ではそのように変更していますが、このあたりはお好みでどうぞ。


~/.config/fish/config.fish

# greeting/prompt

set fish_greeting
function fish_prompt
set_color brgreen
printf '%s$ ' (prompt_pwd)
set_color normal
end

# umask
umask 022


なお function の使い方を見ると分かるように、fishはBash/zsh等とはスクリプトの文法が異なります。このあたりはやや癖があると言えるかもしれませんが、慣れてくるとこちらの方が好ましく思えてきます (esacとか最悪じゃないですか?) 。

このため、例えば export CC=clang と書いていたところが set -x CC clang のように変わったりします。このあたりはチュートリアルに一度目を通しておくと良いかと思います。

また、Fisherを導入することでfishにプラグインを入れられるようにもなります。気になる方はこちらについても調べてみてください。


エディタ


Visual Studio Code

開発に用いるエディタはそれぞれこだわりのあるところだと思いますが、私は現在 Visual Studio Code (VSCode) を利用しています。さすが後発なだけあって、Gitとの連携などをはじめとして機能が非常に充実している (そのわりに動作も重くない) のが素晴らしいと思います。表示言語は英語でも構わないといえば構わないのですが、日本語化するために拡張機能から「Japanese Language Pack」をまず導入しておきましょう。

VSCodeのためだけにGit for Windowsをインストールするのは個人的には避けたいので、WSLGitを落としてきて次のように設定し、WSL上のGitを利用するようにします (path/to/の部分には実際のパスを設定してください) 。


settings.json

{

"git.path": "C:/path/to/wslgit.exe"
}

また、VSCodeの統合ターミナルでWSLを起動するようにするには、設定に以下を追加します。


settings.json

{

"terminal.integrated.shell.windows": "C:/Windows/System32/wsl.exe",
// カーソルを縦線で点滅させるようにする
"terminal.integrated.cursorBlinking": true,
"terminal.integrated.cursorStyle": "line",
}

本当は開発環境のあるWSL側にVSCodeをインストールしたかったのですが、VcXsrvをインストールして日本語入力のためにfcitx-mozc入れて……、とかいろいろ設定が面倒だった上になんか動作が安定せず辛かったので (WindowsとWSLの両方でVSCodeを起動するとWindows側のフォントがおかしくなったりと挙動が謎) 、当面の間はWindows側でのみVSCodeを使っていこうと思います。


Mery

Haijin Boys Online - Mery

VSCodeを起動するほどではない軽い用途のエディタとしては少し前までSublime Textを使用していたのですが、


  • ちょくちょく購入を促してきて鬱陶しいがライセンスを買うほどではない

  • スケーリング環境では日本語のインライン入力がちゃんと行えない (IMESupportプラグイン使用)

といった不満点が気になるようになり、国産エディタのMeryに乗り換えてみました。サクラエディタやNotepad++は設定画面が煩雑なわりに痒いところに手が届かなかったりであまり気に入らなかったのですが、Meryは今のところ快適に使えています。デフォルトでMonokaiなどのテーマが入っていて、日本語のインライン入力にも完全に対応しているのが良いですね。


その他便利ソフト

この項では、開発とは直接関係ないものの作業を効率化できるソフトをいくつか紹介します。


QTTabBar

QuizoApps - QTTabBar

Windowsのエクスプローラをタブ化するソフトウェアです。むしろなぜデフォルトでエクスプローラがタブ化できないのかという話です。「Sets」なる機能がWindows10に入るという話もあるので、いずれ不要になるかもしれません。


Everything

窓の杜 - Everything

ファイルの検索が爆速で行えるようになるソフトウェアです。個人的に常駐させるのは嫌なので、その点は設定で変更しています。


Rapid Environment Editor

Rapid Environment Editor

Windowsの環境変数を簡単に編集できるようにするソフトウェアです。狭い設定画面でセミコロンで区切りながら入力するのはおさらばです。


Lhaz

ちとらソフト - Lhaz

圧縮ファイルの展開を行うソフトウェアです。ダブルクリックでファイルのあるディレクトリに一発で展開を行うように設定しています。例によって4GBを超えるファイルを展開すると尻切れになってしまうようなので、巨大なファイルの展開はtarコマンドなどを利用した方が確実かと思います。