WSL + Alacritty で Powerline を使う

Windows 10 の WSL (Windows Subsystem for Linux) は Linux 環境が Windows 上で簡単に使えるため、UNIX 系の OS と親和性の高い開発系を持つウェブなどのプログラミングに大変便利です。

自分はこの WSL 環境に高速ターミナルエミュレーターである Alacritty から接続して使っていますが、日本語や Powerline を使う上でいくつか必要な設定がありますのでここに記載しておきます。(なお、残念ながら Windows 版ではまだ日本語のインライン入力はできません)

Alacritty の設定

Alacritty の設定ファイルは以下の位置にあります。(なお、AppData は隠しフォルダーです)

C:\Users\[ユーザ名]\AppData\Roaming\alacritty\alacritty.yml

Alacritty 起動時に cmd.exe ではなく WSL を直接起動する設定:

shell:
  program: /Windows/System32/wsl.exe

Windows の新しい API(conPTY / Windows 10 October 2018 update 以降)を有効にして、Powerline や vim でカーソル位置がずれないようにする:

enable_experimental_conpty_backend: true

Powerline を使うため Ricty Diminished w/ Powerline patched フォントを設定する:

font:
  normal:
    family: Ricty Diminished Discord for Powerline

WSL の設定

WSL と WSL 2(現在 insider build)の Ubuntu 18.04 で有効です。

標準で ja ロケールが入っておらず文字化けするのでロケール追加:

$ sudo locale-gen ja_JP.UTF-8
$ sudo /usr/sbin/update-locale LANG=ja_JP.UTF-8
$ echo $LANG # 設定されていなければいったんターミナル再起動
ja_JP.UTF-8

ネットワークがプロキシ配下の場合は以下を実施:

# for curl
echo 'proxy = "http://example.com:8080"' > ~/.curlrc

# for wget
echo 'http_proxy=http://example.com:8080' >> ~/.wgetrc
echo 'https_proxy=http://example.com:8080' >> ~/.wgetrc

# for other (include nodejs/pip)
echo 'export HTTP_PROXY="http://example.com:8080"' >> ~/.bashrc
echo 'export HTTPS_PROXY_="${HTTP_PROXY}"'  >> ~/.bashrc

# for apt
sudo echo 'Acquire::http::proxy "http://example.com:8080";' >> /etc/apt/apt.conf
sudo echo 'Acquire::https::proxy "http://example.com:8080";' >> /etc/apt/apt.conf

# for jvm (optional)
# export JAVA_OPTS="-DproxyHost=example.com -DproxyPort=8080"

Powerline を導入(WSL 1 は速度が遅いので、素早く動作する Rust 製の powerline-rs を使っています):

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ sudo apt install pkg-config libssl-dev
$ cargo install powerline-rs

powerline-rs を .bashrc にてプロンプトに設定:

$ vi ~/.bashrc # 一番下に追加
prompt() {
    PS1="$(powerline-rs --shell bash $?)"
}
PROMPT_COMMAND=prompt

以上、あとは tmux などを入れてあげると便利なターミナル環境になると思います。

なお、powerline-rs は tmux のステータス行には対応していませんので、tmux も powerline 化した場合は pip3 から powerline-status も導入すると良さそうです。

WSL 1 では git リポジトリがあるディレクトリなどで powerline がちょっと遅くなりますが、powerline-rs ならほぼほぼ問題ない速度で動作するようです。WSL2 ではファイルシステムの速度が大幅に速くなっていますので、普通の Linux と遜色ない速度で動作しています。

本題とはあんまり関係ないですが、Poweline 設定導入後 VSCode から WSL に VSCode WSL Extention で接続すると次のようになります。 (VSCode のターミナルも powerline フォントを設定してあげます)

xterm.js すごい。

AsciidoctorとGradleでつくる文書執筆環境

技術文書を書く環境が欲しくなり、VS Code と Gradle を使って Asciidoc 文書を執筆する環境を整えてみました。 お手軽に構成できて、300ページくらいの文書でも耐えられそうです。 🙂

VS Code でリアルタイムプレビューしながら Asciidoc 文書を執筆し、最後に HTML/PDF 文書にすることができように仕込んだ Gradle ビルド、フォントや CJK パッチ、.vscode 設定などをパッケージして github で公開しています。

https://h1romas4.github.io/asciidoctor-gradle-template/index.html

本文書は Asciidoc とその Ruby による実装である Asciidoctor を用いて Asciidoc 文書を執筆する環境を構築する手順を示します。実行環境は Windows、Linux、macOS の各 OS に対応しています。

上記のサイト(Asciidoc 文書のサンプルになっています)で詳しく手順を書いていますが、基本的にリポジトリを取得し、文書を書いて、 ./gradlew docs するだけでいい感じに Asciidoc を HTML/PDF 文書に変換して公開できるようになっています。

PDF 文書は次のようなものが出力されます。

AsciidoctorとGradleでつくる文書執筆環境(PDF版)

https://h1romas4.github.io/asciidoctor-gradle-template/index.pdf

PDF に関しては本文フォントを明朝体にできるとより技術書らしくなると思うのですが、残念ながら prawnpdf ライブラリが OpenType に対応していないため導入を断念しました。しかし、対応は進んでいるようなので期待します。

https://github.com/prawnpdf/ttfunk/issues/53

Hey there maintainers! I’ve been working for the last several months on supporting OpenType fonts, which really just means supporting the CFF font table.

さて、今回このプロジェクトを作成するにあたり初めて Asciidoc の書式を全て確認しましたが、表現力が高く、思ったことは思った通り書けばよい感じなのでお気に入りました。 😀

リポジトリを github に置けば Github Pages ですぐ綺麗な文書を公開できるようになりますので、良ければお試しください!

Alacritty 高速ターミナルエミュレーター

Rust 方面で気になっていた高速ターミナルエミュレーターである Alacritty を Ubuntu 18.10 にて試してみました。

まだ alpha levelとのことですが、2日ほど使い続けてみましたが不具合もなく、むしろ速くてとても快適でしたので常用させていただいております。:)

https://github.com/jwilm/alacritty

Alacritty is the fastest terminal emulator in existence. Using the GPU forrendering enables optimizations that simply aren’t possible in other emulators.Alacritty currently supports macOS and Linux, and Windows.

サイトに導入手順がありますが、Ubuntu の場合はライブラリ依存関係と Rust のツールチェインを入れビルドをかけると .deb が作成されパッケージとしてインストール・することができます。

Rust ツールチェインの導入

https://rustup.rs/

curl https://sh.rustup.rs -sSf | sh

依存関係の導入

https://github.com/jwilm/alacritty/blob/master/INSTALL.md#debianubuntu

apt-get install cmake libfreetype6-dev libfontconfig1-dev xclip

Alacritty のビルドとインストール

https://github.com/jwilm/alacritty#debianubuntu

git clone https://github.com/jwilm/alacritty.git
cd alacritty
cargo install cargo-deb
cargo deb --install

起動すると設定ファイルが、$HOME/.config/alacritty/alacritty.yaml として作成されますので、画面サイズやフォントの設定をします。自分はプロンプトなどに Powerline を使っていますのでフォントの指定を Ricty Diminished w/ Powerline patched に変更しました。

font:
  # Normal (roman) font face
  normal:
    family: Ricty Diminished Discord for Powerline
    # The `style` can be specified to pick a specific face.
    # style: Regular

ということで起動してみると、、

フォントずれも発生せず日本語環境でもいい感じに動作しました!

IM による漢字入力についてはまだインライン入力ができないようですが、カーソル位置の適切な場所に吹き出し形式でインサートすることができますので、大量に日本語を入力しない限り違和感はないと感じました。

マウスエミュレーションも動作し、スクリーンショットのように tmux を動作させるとペインの移動やスクロールなどがマウスで行うことができます。

tmux(アプリケーション)にマウスを奪わせたくない場合は、一般的なターミナルエミュレーターのアサインと同様 Shift キーを押しながらマウス操作すればOKです。また OS に対するコピーアンドペーストは、Shift + Ctrl + c や v などが使えます。

検証もかねまして 2日ほどがちゃがちゃいじってみましたが、不具合を起こすこともなく快適に動作しています。すごい 🙂

(画面を覆い尽くす)Ctrl + Enter のフルスクリーンモードがあれば自分的には完璧だったのですが、issue も上がっていましたので少し経てば実装されるものと思います。

Alacritty は Windows 版も開発が進んでおり先日起動が成功したようです。

ためにし WSL(bash on Windows)で試したところ、マウスエミュレーションが動作しませんでしたが、かなり動き始めているようです。(残念ながら IM による日本語入力窓はへんな位置にポップアップしてしまいました)

Windows 上の Alacritty で WSL を起動する場合は $HOME\alacritty.yaml のシェルの指定を次のようにします。

shell:
  program: "C:\\Windows\\sysnative\\bash.exe"

Rust でつくられているということで高速で強固。自分は Rust の勉強中にてソースコードもかなり参考になりそうです。継続してウォッチしていきたいと思います。 🙂

関連