Solist Work Blog

Software engineer note

rxvt-unicodeとxtermを使いやすくする

Terminalはシンプルなのが気に入ってしばらくtermiteを使ってきました。 ところが、vteのバージョン52くらいからユニコードをターミナルに入力すると落ちるようになり、 しばらく別のターミナルに避難していましたが、それから半年たっても問題が解決されません。 これはあきらめるしかないようです。1

ターミナルエミュレータ選びはソフトウェアエンジニアにとってクリティカルな問題です。 vteに依存したターミナルだけを使っているとvte絡みの問題に左右されかねません。 これがないと商売にならないので一つに依存しないで複数の選択肢を持つ多様性が大事だと思います。

フォークに見る多様性

なぜこのような多様性が大事なのかは、周期ゼミ から教えてもらうことができます。 周期ゼミは生き残るために素数年間冬眠して土の中からでてきます。 なぜ素数なのかというと、 発生周期が12年であったなら、発生周期が3年や4年の天敵に狙われて絶滅してしまう確率が高くなります。 発生周期が13年であれば、発生周期が3年の天敵とは39年、4年の天敵とは52年おきにしか遭遇しません。 彼らは素数の性質によって生き残っているのかもしれません。 何が正しいかわからないときは一つに絞らないこと絞らせないことが大切です。 一つに決め打ちして失敗すると絶滅してしまうからです。 こういう問題には多様性を確保して対処することが必要になると思います。

多様性で思いだすのは、アンドリュー・タネンバウムとリーヌス・トーヴァルズの議論でしょうか。 端的にいうとモノリシックカーネル(Linux)とマイクロカーネル(Minix)のどちらがよいかという議論なのですが、 我々は1992年から見れば未来人ですからLinuxの現在を知っていますが、当時リーナス・トーバルズは学生、かたやアンドリュー・タネンバウムはOSの大家とも言える人物です。 1992年にデロリアンでタイムトラベルできたとしても彼らを説得できる人は少ないでしょう。 現在もWEBサービス界隈ではモノリシックサービスアーキテクチャとマイクロサービスアーキテクチャで同じような論争を繰り広げているところが興味深いところではあります。 結局生き残ったものがよいソフトウェアとされるので多様性がとても大切なのです。 長い間風雪に耐えることもよいソフトウェアの条件なのかもしれません。 経済学においても寡占はあまりよいことではないとされています。 ソフトウェアでフォークを嫌う人もいますが、一つのリポジトリにすべて集約すると多様性がなくなるので適切なフォークは必要なのだと思います。

ターミナルエミュレータ選び

ターミナルエミュレータを選ぶにあたってArchWikiのターミナルエミュレータにあるものは片っ端から試しました。 やはりこういうときはArchLinuxは偉大です。 なんでもパッケージ化されているのでインストールして回るのは簡単です。 cool-retro-termはレトロなターミナルエミュレータで郷愁をさそって面白いですが、実用性重視の私にはフィットしませんでした。

結局多様性を確保するためにのこったのは3つです。

  1. rxvt-unicode
  2. xterm
  3. Alacritty

rxvt-unicodeをメインターミナルエミュレータにします。 vteに依存しておらず安定性と速度が抜群だからです。 xtermもvteに依存しておらず安定性も抜群ですが、ほんの少し速度が遅いのと好みの問題です。多様性を確保するために使用できる状態を保っておきます。 AlacrittyはGPUでレンダリングするRustで作られたターミナルエミュレータです。いいGPUを積んでディープラーニングをするようなデスクトップパソコンで使うならよさそうですが、ThinkPad X1 Carbonで計測してみるとrxvt-unicodeより遅かったのでラップトップではGPUを使ってもそれほどご利益はないのかもしれません。多様性を確保するために使用できる状態を保っておきます。

速度はホームディレクトリで以下のコマンドをたたいて表示が終了する時間で計測しました。

time ls -al | tree

コマンドの実行結果

rxvt-unicode(urxvt)とxtermを改善する

rxvt-unicodeをメインに選んだのですが、 WaylandになってからのGNOMEは起動時に.Xresourcesを読んでくれなくなった関係で ターミナル起動時はカスタマイズされていないデフォルトの状態で起動します。 デフォルトの見た目はかなり酷く常用に耐えないのでターミナルエミュレータを開いてから

xrdb -merge $HOME/.Xresources

を実行してターミナルエミュレータを落として、 再度ターミナルエミュレータを起動しないと好みのターミナルにならないのです。 ささいなことですが、ラップトップ起動時に毎回このような作業をするのは不毛でしかないのでなんとかしましょう。

以下のファイルはGitHubにあるMakefileから抜粋したものです。 これを使うとmake urxvtで必要なセットアップが完了します。

sudo pacman -S rxvt-unicode urxvt-perls
ln -vsf ${PWD}/.Xresources   ${HOME}/.Xresources
sudo ln -vsf ${PWD}/usr/share/applications/urxvt.desktop   /usr/share/applications/urxvt.desktop
sudo ln -vsf ${PWD}/usr/share/applications/urxvtc.desktop   /usr/share/applications/urxvtc.desktop
sudo ln -vsf ${PWD}/usr/share/applications/urxvt-tabbed.desktop   /usr/share/applications/urxvt-tabbed.desktop
mkdir -p ${HOME}/.config/autostart
ln -vsf ${PWD}/.config/autostart/autostart.desktop   ${HOME}/.config/autostart
chmod a+x ${PWD}/.auto_start.sh
ln -vsf ${PWD}/.auto_start.sh   ${HOME}/.auto_start.sh

5行目まではインストールと設定ファイルを配置していて、 6行目から不毛な作業を自動化しています。

${HOME}/.config/autostartディレクトリの中に以下のようなファイルを置いておくとGNOME起動時に一度だけ実行されます。 これはDropboxの実装を調べていて発見したのでさっそく真似します。

[Desktop Entry]
Name=AutoStart
GenericName=Auto Start Script
Comment=no comment
Exec=/home/masa/.auto_start.sh
Icon=utilities-terminal
Terminal=true
Type=Application
StartupNotify=false

ターミナルエミュレータが勝手に起動して${HOME}/.auto_start.shが自動で実行されます。 以下が.auto_start.shです。

#!/bin/bash
# Script to apply .Xresources at GUI startup
# See ${PWD}/.config/autostart/autostart.desktop
sleep 1
xrdb -merge $HOME/.Xresources
xdotool key shift+space
exit

5行目でお目当てのコマンドを実行しています。 exitでターミナルエミュレータは落ちるので何事もなかったかのようにGNOMEの起動画面になります。 ターミナルエミュレータが勝手に起動して何やらやっているのが一瞬だけ見えるのでポルターガイストのようで趣があります。

xdotool key shift+space

これは何をしているかというと自動でshift spaceキーをソフトウェアに押してもらっています。 なぜそんなことをするのかというとmozcは日本語モードで起動するのですが、EmacsやChromiumを起動するのは当然英語モードでないと不便なので 毎日ラップトップを起動したらshift spaceキー2を叩いて英語モードにしていて、 この作業もたいへん不毛であると思うにいたったので、自動でやってもらうことにしたということです。

xdotoolはキーボードをソフトウェアでエミュレーションするソフトウェアです。 人間がいないのにキーボードを叩いているように振る舞えるのです。 こういう発想が斜め上を行くソフトウェアから学ぶことは多いです。


  1. 現在このバグは直っています。 ↩︎

  2. 私のキーボードはUSキーボードなので全角半角キーがなくshift spaceで代用しているのです。 ↩︎

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ