urxvt こと rxvt-unicode を使うことのメモ

省コストとパフォーマンスの高みを目指す孤高のターミナルエミュレータ

urxvt_terminal_emulator_ss_ubuntu.jpg

urxvt こと rxvt-unicode は、 xterm や gnome-terminal などと並ぶ代表的なターミナルエミュレータのひとつ。その特徴としてよく言われるのが軽快なことである。

ただ軽い小さいという事では後発の st (simple terminal) に軍配が上がる可能性も示唆されるけれど、 urxvt はなお高いパフォーマンスと必要機能の維持を両立していて、その成熟のスタビリティで多くの支持を集めている。

もっとも成熟ということでは xterm という大御所の存在を忘れてはならないのだけれど、その御大もついに持ち得ていないデーモンモードを urxvt は備えている。すなわちよくある複数ターミナルの運用において、サーバとクライアントターミナルを駆使してシステムリソースの消費量を抑えながら、起動時間も短くするという巧妙な芸当が可能になっているのだ。

高速・大容量の様相著しい今日、 ターミナルエミュレータで省メモリだの軽量だのとは、いかにも陳腐な方法論と仰る向きもおいでだろうか。しかし侮ることなかれ、一銭を笑うものは一銭に泣くとの諺もある。その1メガバイトは転ばぬ先の杖かもしれない。

そこで、 CLI ライフにおける一大チョイスとなりうるターミナルエミュレータ urxvt を使うことのメモをかようにまとめた。

urxvt こと rxvt-unicode とは

urxvt が軽量なのはご先祖様の頃からのようだ。もともと X Window System に向けた VT100 エミュレータで xvt (extended virtual terminal)というのがあった。

その以前より X Window の標準ターミナルエミュレータとして xterm があったが、この xterm からほとんど使われない機能(Tektronix 4014 エミュレーションなど)は省いてもよろしかろうというアプローチで実装されたのが xvt である。結果としてスワップスペースが xterm に比べかなり少ないという、X Window System において大きなアドバンテージを持つに至った。

その後 xvt に拡張が施され rxvt となる。その名は “our xvt” に由来するとされる(もともとは作者名からとった “Robert’s xvt” から)。

そしてこの rxvt のクローンとして、 Unicode 時代の多言語対応版たる urxvt こと rxvt-unicode がフォークされたというわけだ。

さて、 urxvt の特長としては以下のことがよく言われる。

  • メモリ消費量が少ない
  • デーモンで複数クライアントをまとめる機能
    • システムリソースが節約できる
    • さらに起動が早くなる
  • Unicode による多言語対応
  • Perlによる拡張が可能

このほか「素早いテキストレンダリング」「信頼のスタビリティ」「マルチプルフォントタイプ」あるいは「透過機能」があるから urxvt に食指が動く、という意見もあるようだ。

urxvt のインストール

インストールは各ディストリビューションのパッケージリポジトリを利用するのが楽である。

## Arch Linux
$ sudo pacman -S rxvt-unicode

Ubuntu など APTリポジトリの rxvt-unicode は256色機能をサポートしていない。が、多くの場合これを利用したいはずなので、 rxvt-unicode-256color というパッケージをインストールする。

## APT Repository
$ sudo apt install rxvt-unicode-256color

urxvt の起動

起動コマンドは urxvt だ。

さっそく起動してみると、そのままではものすごく字がガタガタだったり背景がすごく白かったりする。だからコマンドラインでちょっと引数を与えてあげる。

$ urxvt -fn "xft:monospace-9" -fg white -bg black

urxvt_terminal_emulator_ss_vanilla.jpg

これはフォントとポイント、文字色、背景色と最低限だけれど、この要領で起動オプションをつないでいけば豊富な機能が使い放題だ。エイリアスやスクリプトにしておくとラクかもしれない。

また、オプションを X resources で設定しておくとその分の起動オプションは必要なくなる。コマンドラインでさらにオプションを追加する、あるいは既設定オプションを打ち消すこともできるので、常用するオプションは X resources で定義しておくのが効率的だ(後述)。

デーモンモードでメモリを節約する

私の知る中でも、画面を覗けば端末ばかりというのはそう珍しいことではない。テキストブラウザを当たり前のように使っていたりもして。

そこまでではないにしても、何箇所かのリモートに接続したり TUI アプリを複数立ち上げるなど、ターミナルエミュレータをいくつも起動しているなんていうのはよくあることだ。

それなら urxvt のデーモンモードでメモリを大幅に節約できるかもしれない。

やり方は簡単で、基本的には urxvtd コマンドでデーモンを起動し、そこへ urxvtc コマンドでアタッチするというものだ。

デーモンとクライアントの起動と終了

urxvtd コマンドにオプション -o-f を与えると、デーモン起動後にコマンドラインが開放され、またログアウト時にデーモンを終了してくれる。

$ urxvtd -o -f
rxvt-unicode daemon listening on /home/jeneolla/.urxvt/urxvtd-malkalech.

そうしてから urxvtc コマンドでクライアントコンソールを起動する。

$ urxvtc

あなたの作業が終わってコンソールを閉じるなら exit コマンドで終了する。

あるいは、デーモンまでをも終了させるなら urxvtc-k オプションを添えて実行する。

$ urxvtc -k

なお urxvturxvtc で使えるオプションはこの -k 以外まったく一緒だ。

起動スクリプト

ところで、誤っていくつもデーモンを起動させてしまうとメモリが無駄になってしまう。そこで余計なプロセスを殺してまわるのは面倒くさい。かと言って常駐してるかどうか気にしながらやるというのは、全くもってうまくない。

そこで、 urxvtc はデーモンが見つからない場合にエンドステータス 2 を返して終了するようになっている。だからそこを見張っておいて必要ならデーモンを起動して、もう一度 urxvtc を試みるというようにすれば何も面倒なことはないはずだ。

というようなことが urxvtc の man ページに、以下のようなスクリプトと共に記されてある。

#!/bin/sh
urxvtc "$@"
if [ $? -eq 2 ]; then
  urxvtd -q -o -f
  urxvtc "$@"
fi

これをパスの通ったところに保存して実行属性をつけておく。ここでは ~/bin/run_urxvt としよう。

$ chmod +x ~/bin/run_urxvt

そうして、 ターミナルをいくつも起動するのにこのスクリプトを使うようにすれば、システムリソースの節約になるという寸法なのだ。

$ run_urxvt -fn 'xft:monospace-9' -fg white -bg black

urxvtの 設定

urxvt の機能設定は X resources の定義による方法と、起動オプションによる方法とがあり、ネットでは前者がよく扱われているようだ。

リソース定義がバッチリなら起動オプションは単純化できる。またある機能を一時的に使いたいとか、あるいは無効にしたいといったニーズには起動オプションで対応できるので、まずはリソース定義を固めてしまう。

X resources の定義

リソース定義は ~/.Xresources に書いておいて後から xrdb コマンドで読み取る。

以下は、一般的な設定に配色 gruvbox を組み合わせた。各々の詳細は後述する。

!! ~/.Xresources

!!
!! rxvt-unicode (urxvt)
!!

URxvt.geometry:             96x32
URxvt.scrollBar_right:      true
URxvt.scrollBar_floating:   true
URxvt.scrollstyle:          plain
URxvt.cursorBlink:          true
URxvt.cursorUnderline:      true
URxvt.pointerBlank:         true
URxvt.visualBell:           true
URxvt.saveLines:            3000
URxvt.fading:               40

!! Font list and Spacing
URxvt.font:                 xft:Dejavu Sans Mono-9,\
                            xft:IPAGothic
URxvt.letterSpace:          -1
!URxvt.lineSpace:            0

!! Color Scheme and Opacity - gruvbox-dark https://github.com/morhetz/gruvbox
URxvt.depth:                32
URxvt.color0:               [90]#282828
URxvt.color1:               [90]#cc241d
URxvt.color2:               [90]#98971a
URxvt.color3:               [90]#d79921
URxvt.color4:               [90]#458588
URxvt.color5:               [90]#b16286
URxvt.color6:               [90]#689d6a
URxvt.color7:               [90]#a89984
URxvt.color8:               [90]#928374
URxvt.color9:               [90]#fb4934
URxvt.color10:              [90]#b8bb26
URxvt.color11:              [90]#fabd2f
URxvt.color12:              [90]#83a598
URxvt.color13:              [90]#d3869b
URxvt.color14:              [90]#8ec07c
URxvt.color15:              [90]#ebdbb2
URxvt.foreground:           [90]#ebdbb2
URxvt.background:           [90]#282828
URxvt.colorIT:              [90]#8ec07c
URxvt.colorBD:              [90]#d5c4a1
URxvt.colorUL:              [90]#83a598
URxvt.scrollColor:          [90]#504945
!URxvt.troughColor:          [90]#3C3836

以上を ~/.Xresources に追記して xrdb コマンドでマージ(あるいはロード)する。

$ xrdb -merge ~/.Xresources

xrdb コマンドは -merge オプションで現在の設定に指定ファイルの内容をマージする。 -load (あるいはオプション無し)で全ての内容を置き換える。 -query オプションで現在定義中の内容を確認できる。

おかしいと思うときは -query で確認してみて、 -remove オプションでリソース定義を全て削除してからもう一度試す、というのもいいかもしれない。

urxvt_terminal_emulator_ss_xfce.jpg

起動オプション

リソース設定はしたものの、一時無効にしたい機能などもある。例えばスクロールバーは TUI アプリケーションに必要ないからこれをオフにしたい、みたいに。以下は urxvt 上でファイルマネージャの ranger を直接起動する一例。

$ run_urxvt +sb -geometry 120x36 -e ranger

スクロールバー無しはリソース設定のところで scrollBar: false だったが、起動オプションでは +sb と指定する。プラス記号は直感的でないようだがもともと scrollBar: true-sb であることから、反対の意味で + を使ってあるのだろうか。urxvt のオプションにはこのような - : true / + : false という表現がよくある。

urxvtの 設定詳細

上記 .Xresources の内容を簡単に解説する。

一般設定

■ ウィンドウサイズ

URxvt.geometry:             96x32

geometry でウィンドウサイズを指定できる。 <文字数>x<行数> で指定。これを設定しない場合のデフォルト値は 80x24

■ スクロールバー

なにも設定しないとスクロールバーが表示される。だが、いいか 俺はマウスになんか触れもしないし、目の端に映る余計なバーにもうんざりなんだ!というひとは落ち着いて scrollBarfalse を設定すればいい。

もっとも tmux などのバックスクロール機能を使うならば urxvt のスクロールバーはオフにしておくべきであろう。

URxvt.scrollBar:            false

やっぱり私はスクロールバーがあったほうがいいな、というひとなら以下を設定するといい。

デフォルトではスクロールバーが左に表示されるのだが scrollBar_right で右にできる。

scrollBar_floating は、つまみが走るレールのところを消してくれる(機能が失われるわけではない)。これで浮いてるように見える、かもしれない。

また、 scrollstyle でデザインを rxvtplainnextxterm の4タイプから選べる。デフォルトは rxvt だが多くの人が plain を薦めてくる。

URxvt.scrollBar_right:      true
URxvt.scrollBar_floating:   true
URxvt.scrollstyle:          plain

そのほか、幅を指定したい場合は scrollBar_thickness でピクセル数を指定できる。

■ カーソル形状と点滅

URxvt.cursorBlink:          true
URxvt.cursorUnderline:      true

cursorUnderline でカーソルを下線タイプにする。 cursorBlink でカーソルを点滅。

■ ポインター消去

URxvt.pointerBlank:         true

pointerBlank を設定しておけば、キーボード入力を始めたところでマウスポインターを消してくれる。「いいか 俺はマウスなんて」という人は落ち着いてこれを設定したほうがいい。

■ ヴィジュアルベル

URxvt.visualBell:           true

突然鳴り響くブザー音というのはいかにもストレスを高めてくれる。 visualBell はあれをヴィジュアルエフェクトに変えてくれるのだ。

■ バッファ行数

URxvt.saveLines: 3000

saveLines はバックスクロールできるバッファの行数を設定する。デフォルトは 1000 (v.9.22)。

■ アウトオブフォーカス時に画面を暗く

URxvt.fading: 40

fading を設定するとウィンドウフォーカスがほかへ移ったときにテキストの輝度を落とす感じにしてくれる。カレントウィンドウの認識が高まるので、ウィンドウマネージャ全般でいい感じになる。パーセンテージを数字で指定する。

フォント名を知る

CLI 好みのあなたにはこだわりのフォントがあって、その語り尽くせない魅力のためにはどれほどの時を費やすことも厭わないだろう。なんてそれは勝手な憶測だけれど、 でももうこのページを半分以上読んでいるんだったらその可能性はありそう。ともかく、ここではフォント設定についてやってみる。

urxvt では XLFD(論理フォント名)と Xft (X FreeType)が利用できる。Xft は滑らかで近代的なフォントを扱えるから、ここでは Xft の利用を取り上げる。

ところで、的確にフォントを指定するには使いたいフォント名の正しい表現を知ることだ。それにはまず利用可能なフォントの一覧が欲しい。

fontconfig の fc-list コマンドを使うとフォント一覧が得られる。

ただしそのままだとファイル名やらスタイル名なんかも表示されてしまってちょっと見にくい。いま欲しいのはフォント名一覧なのに。

$ fc-list | sort
...
/usr/share/fonts/OTF/ipag.ttf: IPAゴシック,IPAGothic:style=Regular
/usr/share/fonts/OTF/ipagp.ttf: IPA Pゴシック,IPAPGothic:style=Regular
/usr/share/fonts/OTF/ipam.ttf: IPA明朝,IPAMincho:style=Regular
/usr/share/fonts/OTF/ipamp.ttf: IPA P明朝,IPAPMincho:style=Regular
...
/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf: DejaVu Sans Mono:style=Bold
/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf: DejaVu Sans Mono:style=Bold Oblique
/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf: DejaVu Sans Mono:style=Oblique
/usr/share/fonts/TTF/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
...

引数を fc-list <font-family>:<style> <element> <element> ... のように与えると <font-family>:<style> に合致するものの指定エレメントだけを表示してくれるので、それを使って以下のようにするとちょっと見やすくなる。ソートも適確だ。

$ fc-list : family | sort
...
DejaVu Sans Mono
...
IPA Pゴシック,IPAPGothic
IPA P明朝,IPAPMincho
IPAゴシック,IPAGothic
IPA明朝,IPAMincho
...

上記のように : だけの指定で全フォントにマッチさせるということのようだ。なお fc-list "" family | sort でも同じ結果になるもよう。

Xft ではエイリアスでの指定もできる。エイリアスは fonts-conf で定義されているもので、アプリケーションが使用する一般的なエイリアス名に妥当なフォントが割り当てられている。

urxvt の起動のところでは xft:monospace というエイリアス指定の例を書いたが、この monospace というのは一体どんなフォントが表示されるのだろうか。

エイリアスにどんなフォントが設定されているかは fontconfig の fc-match で調べられる。

fc-match は引数で与えるフォント名によって最終的にどのフォントが選ばれるのかを示してくれるものだ。

下のようにすると xft:monospace を指定した場合に使われるフォントを示してくれる。

$ fc-match monospace
ipag.ttf: "IPAゴシック" "Regular"

エイリアスに当てられているフォントはひとつだけと限らない。例えばロケールが違うと以下のようになることもある。

$ fc-match monospace:lang=en
LiberationMono-Regular.ttf: "Liberation Mono" "Regular"

fc-match はどのフォントが使われるかを調べるわけだから、エイリアスの確認だけでなく指定するフォント名が妥当な表現になっているかどうかの確認にも使える。

$ fc-match "dejavu sans mono"
DejaVuSansMono.ttf: "DejaVu Sans Mono" "Book"
$ fc-match "bejavu sans mono"
ipag.ttf: "IPAゴシック" "Regular"

このように Xft は、フォント名が間違っていてもエラーとならずに他の妥当なフォントが表示されるような仕組みなのだが、そのせいでいつまでもうまく設定できずにイライラしてしまうかもしれない。だが fc-match で調べておけばそんなことはなくなるだろう。

ところで、インストールされているフォントの中で monospace として登録されているものは何か、 fc-match でリストアップできる。

$ fc-match --sort "monospace" family | sort

さて、フォント名がわかっているなら、フォントフェースを眺めて比較したいだろう。 CharMap – Powered by OpenType.js というウェブアプリが便利だ。

あるいは、コンソールの話題なのだからスパッとコマンドラインから行きたいじゃないか、というおスキなあなたは Image Magick の display を簡易フォントビューアに使うといいかも知れない。 display /path/to/fugapiyo.ttf などとするだけでいい。だから fc-match と組みあわせて、

$ fc-match "dejavu sans mono" -f "%{file}" | xargs display

というようにするのが、いかにも乙であろう(要 imagemagick)。

urxvt_terminal_emulator_ss_imagemagick.jpg

フォント設定

Xft のフォントとサイズの指定は xft:<font-family>-<size> あるいは xft:<font-family>:pixelsize=<int> などと指定する。

例えば xft:DejaVu Sans Mono-10 とすると DejaVu Sans Mono を10ポイントで表示する。あるいは xft:monospace:pixelsize=14 などとするとエイリアス monospace にセットされたフォントを14ピクセルサイズで表示する。

また、 urxvt ではカンマ区切りリストで複数のフォントを指定できる。 Xft と XLFD の混在も可能。

そうしてフォントを複数指定すると、先に指定したフォントのグリフをキャラクターに割り当て、なお空いているキャラクターについては、その後に指定するフォントグリフを割り当てていくということのようだ。あたかも複数のフォントで補完しながら一つのフォントセットを形成するかのようである。

例えば DejaVu Sans Mono に続けて IPAゴシック を指定すると、英数字は DejaVu Sans Monoで表示されるが DejaVu で表現できない日本語については IPAゴシック のグリフで表示してくれる。

URxvt.font:         xft:DejaVu Sans Mono-10, xft:IPAGothic

もちろん3つ以上の指定も可能だ。

なお文字の大きさは最初に指定したセルサイズ(ベースフォントサイズ)を最大とし、それ以下のセルサイズであれば、2番目以降の指定も有効となる。

この要領で普通のフォントに含まれないようなシンボルを付加することもできる。 Powerline fonts なんかをベースフォントに設定すれば、普通の日本語フォントでも Powerline が使える。

URxvt.font:         xft:DejaVu Sans Mono for Powerline-10,\
                    xft:IPAGothic

なお、行末バックスラッシュで複数行にわけられる。

文字間・行間設定

特に日本語フォントで文字間が空きすぎることがあるが、 letterSpace にマイナス数値を指定するとこれを狭めることができる。

URxvt.letterSpace:  -1

既に記した .Xresources の設定例では、DejaVu Sans Mono と IPAゴシックの組み合わせで -1 としておいたが、もう少し狭く -2 くらいでも大丈夫かもしれない。

ただし文字間を狭めすぎるとグリフが表示されなくなってコマンドラインが判読できなくなるので注意。

また、行間を広げたい場合は lineSpace でピクセル数を指定してやる。

URxvt.lineSpace:    2

色設定と透過

urxvt では背後のウィンドウや壁紙が透けてみえるような、いわゆる透過というのができる。

なお、透過にはコンポジット機能が必要である。Ubuntuなどでは標準的なようだが、例えば Arch Linux をコンポジット機能を持たないウィンドウマネージャで構築しているならば、コンポジットマネージャの追加が必要となってくる。コンポジットマネージャには軽量なものとして xcompmgr や compton がある。

まず色指定だが、いくつか書き方があるけれど color0: #282828 のように指定するのがいい。ネットによくあるカラースキームサンプルはこの表記が多いので適用しやすい。

次に透過だが、 depth: 32 を指定しておいてから透過色指定する。透過率の指定は [85] というように不透明度のパーセンテージをブラケットで括ったものを色指定の頭にのっけてあげる。この不透明度とはすなわち、数字が小さい方がより透明になるということで、 [100] が全く透き通っていない状態で [0] が完全な透明となる。

!! color scheme and opacity - gruvbox-dark https://github.com/morhetz/gruvbox
URxvt.depth:       32
URxvt.color0:      [90]#282828
URxvt.color1:      [90]#cc241d
URxvt.color2:      [90]#98971a
URxvt.color3:      [90]#d79921
URxvt.color4:      [90]#458588
URxvt.color5:      [90]#b16286
URxvt.color6:      [90]#689d6a
URxvt.color7:      [90]#a89984
URxvt.color8:      [90]#928374
URxvt.color9:      [90]#fb4934
URxvt.color10:     [90]#b8bb26
URxvt.color11:     [90]#fabd2f
URxvt.color12:     [90]#83a598
URxvt.color13:     [90]#d3869b
URxvt.color14:     [90]#8ec07c
URxvt.color15:     [90]#ebdbb2
URxvt.foreground:  [90]#ebdbb2
URxvt.background:  [90]#282828
URxvt.colorIT:     [90]#8ec07c
URxvt.colorBD:     [90]#fe8019
URxvt.colorUL:     [90]#83a598
URxvt.scrollColor: [90]#504945
!URxvt.troughColor: [90]#3C3836

colorITcolorBDcolorUL はそれぞれ斜体、強調、下線の文字につける色を指定できる。この指定で man ページが少しだけ華やかになるかもしれない。

また、スクロールバーの色を scrollColor で指定できる。 troughColor というのはつまみが走るレールのところの色。だから scrollstyleplain の場合は必要ないだろう。

urxvt_terminal_emulator_ss_manpage.jpg

X resources 記述の工夫

X resource そのものの定義では条件分岐や外部ファイルの読み込みといったことができない。しかし、 xrdb でロードする時にデフォルトで C プリプロセッサを通す仕組みになっており、それに解釈させる命令を書き込んでおくことで条件分岐などが可能になる。

例えば以下のように書くと hostname が foo の場合はフォントに DejaVu と IPA ゴシックを使用し、それ以外では monospace を使うようになる。このような記述を用いれば、 GitHub などを介して複数ホストで設定ファイルを共用するような使い方が模索できるだろう。

!! ~/.Xresources

#ifdef SRVR_foo
  URxvt.font: xft:DejaVu Sans Mono-9, xft:IPAGothic
#else
  URxvt.font: xft:monospace-10
#endif

SRVR_foo というのは hostname が foo の場合に定義されるシンボルだが、ほかにも環境に則ったシンボルがいくつもあり独自の定義も可能である。外部ファイルの読み込みもできるので、アプリや機能別にファイルを分けるといったことも可能である。

そこらへんの詳細も含めた X resources の記述については「X resources を設定することのメモ | Jenemal Notes」に書いてあるので、御興味を抱かれた向きは読んでいってください。