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

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

urxvt_terminal_emulator_ss_ubuntu.jpg

urxvt こと rxvt-unicodextermgnome-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 コマンドにオプション -f-o を与えると、デーモン起動後にコマンドラインが開放され、またログアウト時にデーモンを終了してくれる。

$ 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 の操作

操作と言ってもメニューバーやツールバーがあるわけではなく、設定ダイアログなんかも存在しない。設定については後述することとし、ともかくここではバックスクロールとか文字のコピペといったことをとり上げる。殊にコピペは、 X ウィンドウにおける「セレクション」を念頭に置いていないと操作の混乱を招くこともあるようだ。

まず、当たり前のことのようだがスクロールホイールによるバックスクロール操作が可能であり、一般によく使われることだろう。スクロール量はデフォルトで5行である。また、キーボードからは Shift+PageUp / Shift+PageDown でページめくりが可能である。

特に設定をしていなければ、ウインドウの左端に垂直スクロールバーが表示されるが、操作方法は GUI でよく知られているものと同様である。矢印(アロー)をクリックするごとに1行スクロールし、押しっぱなしで連続スクロールさせることができる。レール(トラック)上のつまみ(スクローラー)をドラッグしたり、レールのつまみがいないところをクリックしてもスクロールできる。

そうしてバックスクロールしていけるバッファ内では、次の要領でキャラクターをコピーしてコマンドラインや他のアプリで再利用することができるので、コピーアンドペースト連携が可能である。

キー 操作内容
左クリック 選択開始位置をセット
左クリック ×2 単語を選択してコピー(PRIMARY)
左クリック ×3 論理行を選択してコピー(PRIMARY)
右クリック 選択終了位置を設定/再設定してコピー(PRIMARY)
左ドラッグ 範囲選択してコピー(PRIMARY)
Alt+左ドラッグ 矩形選択してコピー(PRIMARY)
中クリック ペースト(PRIMARY)
Shift+Ins ペースト(PRIMARY)

マウスの左ボタンでクリックするとそこが選択の開始位置となる。そのままでは何も起きないが、選びたい範囲の最後の文字を右ボタンでクリックすると、選択範囲が反転で示されると同時にコピーされる。また、最初から左ボタンを押しっぱなしにしてドラッグしていき、範囲の最後でボタンをリリースすることでも同様の結果となる。単語や行選択、または矩形選択なんかもできるが、いずれにしろ選択と同時にコピーがなされる。

そして、真ん中ボタンか Shift+Ins でペーストできる。なお、urxvt では基本的に PRIMARY セレクションが使われる。

Xウィンドウのクリップボード概念は3つのセレクション、すなわち PRIMARY 、 SECONDARY 、 CLIPBOARD を擁しており、だいたいは PRIMARY か CLIPBOARD を使う。セレクションの扱いはアプリによって違うが、 CLIPBOARD セレクションしか利用しないアプリとの連携のため urxvt には以下のキー操作が用意されている。

キー 操作内容
Ctrl+Alt+c 選択範囲をコピー(CLIPBOARD)
Ctrl+Alt+v ペースト(CLIPBOARD)
Alt+真ん中クリック ペースト(CLIPBOARD)

他のアプリでコピーしてから urxvt のコマンドラインで Shift+Ins を押しても何も起きないとか、全く違う文字列がペーストされる場合には、 Ctrl+Al+v を押してみるといい。逆のケースも然りで、 urxvt で範囲指定(すなわち PRIMARY コピー)してから目的のアプリでペースト操作してもうまくいかないなら、いまいちど urxvt に戻り、文字列が選択状態(反転)にあることを確認して Ctrl+Alt+c ( CLIPBOARD コピー)を押してから、アプリに切り替えてペースト操作する。

なお、 tmux で setw -g mouse on していると、 urxvt のマウス操作で文字の選択ができないようである。 mouse モードをoff(デフォルト)にしておくとか、あるいはキー操作で on/off できるようにしておくといいかもしれない。

※「マウス?何を言われているのか、さっぱりわからないな」という人は、後述の keyboard-select という拡張機能を使えばいいと思う。

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 コマンドを使っている)。

$ 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    /* black          */
URxvt.color1:      [90]#cc241d    /* red            */
URxvt.color2:      [90]#98971a    /* green          */
URxvt.color3:      [90]#d79921    /* yellow         */
URxvt.color4:      [90]#458588    /* blue           */
URxvt.color5:      [90]#b16286    /* magenta        */
URxvt.color6:      [90]#689d6a    /* cyan           */
URxvt.color7:      [90]#a89984    /* white          */
URxvt.color8:      [90]#928374    /* bright black   */
URxvt.color9:      [90]#fb4934    /* bright red     */
URxvt.color10:     [90]#b8bb26    /* bright green   */
URxvt.color11:     [90]#fabd2f    /* bright yellow  */
URxvt.color12:     [90]#83a598    /* bright blue    */
URxvt.color13:     [90]#d3869b    /* bright magenta */
URxvt.color14:     [90]#8ec07c    /* bright cyan    */
URxvt.color15:     [90]#ebdbb2    /* bright white   */
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

Perl 拡張の抑止について

urxvt には Perl 拡張と呼ばれる機能拡張の仕組みがある。通常パッケージでは準拠のスクリプトを同梱して便に供しており、中には設定せずともデフォルトでロードされるものもある。

だがもしこの Perl 拡張を使わないということであれば、その旨を指定することで多少の性能向上が見込めるらしい。メモリの節約ということにもなるのだろう。

以下のように perl-extperl-ext-common の両方のリソース値を空に指定する。

URxvt.perl-ext:
URxvt.perl-ext-common:

Perl 拡張が無くとも余りある機能は依然として urxvt を使うことのメリットをもたらすだろう。しかしその所以たるフィーチャーで urxvt がより至便に振る舞う事もまた確かである。ついては Perl 拡張によってどんな機能が実現されるかを知って検討し、選択すべきかと思う。次項ではこの Perl 拡張機能の利用についてとり上げる。

Perl 拡張を使う

urxvt には Perl 拡張( urxvt perl extensions )、すなわち Perl スクリプトによる機能拡張仕様が実装されており、高度なカスタマイズ要求に耐えるAPIを備えている。簡易マクロなどでなく、 Perl インタープリターによる機能の拡張が可能なのである。そしてまた、自前でスクリプトを用意せずとも便利なものがいくつも公開されている。

機能の利用は面倒なことではなく、所定のディレクトリに Perl スクリプトを配置してリソース定義や起動オプションで指定すれば使えるようになる。

標準パッケージには既に Perl 拡張スクリプトが同梱(プリパッケージ)されており、中には設定せずとも有効になっている機能もある。例えば Alt+s を押すとフレーム下端にダイアログとプロンプトが現れ入力文字列で正規表現検索できる( ESC で中止)が、これは Perl 拡張の searchable-scrollback 機能だ( man urxvt-searchable-scrollback )。

また、以下のように起動すると digital-clock という拡張機能をロードして右上に時計をオーバーレイ表示するようになる。

$ urxvt -pe digital-clock

このように起動オプションでは -pe で指定するが、リソース定義では perl-ext-common リソースに利用したいスクリプト名を設定する。何れにおいても複数を利用するにはカンマ , 区切りで記述する。

$ urxvt -pe kuake,tabbed
URxvt.perl-ext-common: digital-clock,matcher

また、拡張スクリプトのリソースは URxvt.<extension_name>.<resource> などというようになっているが、夫々のマンページやリードミー、あるいはスクリプトヘッダに書かれてあるものを参照するといい。

以下では urxvt のパッケージ(ここでは Arch Linux の community/rxvt-unicode : rxvt-unicode 9.22-7 を参照している)に同梱されているタブ機能(tabbed)、ポップアップコンソール(kuake)、そして matcher を取り上げる。他の詳細は man urxvt-extensions を参照して下さい。

tabbed (タブ機能)

ウィンドウマネージメントについては様々な方法が模索されるところだが、タブ型アプリケーションの利用も解答のひとつであろう。タブ型とはつまりマルチプルな画面をインデックスタブで切り替えるようなやつで、複数のウィンドウを表示させるかわりに、ひとつのフレーム内でウィンドウやペインの表示を切り替えながら使う工夫である。ウェブブラウザーのほとんどがこれを採用しており、端末では gnome-terminal などに実装されている。

urxvt では tabbed エクステンションでタブバー機能を付加することが可能だ。

標準的なパッケージには同梱されているので -pe オプションでの指定だけで利用可能である。

$ urxvt -pe tabbed

リソース定義なら以下のようになる。配色が派手と思ったから、ついでにかわいく水色にしてみた。

!! tabbed (prepackaged edition)
URxvt.perl-ext-common:  tabbed
URxvt.tabbed.tabbar-fg: 243
URxvt.tabbed.tabbar-bg: 237
URxvt.tabbed.tab-fg:    250
URxvt.tabbed.tab-bg:    30

操作キーは以下の通り。

キー 機能
Shift+↓ タブ作成
[New] タブ作成
Shift+← / Shift+→Right 左 / 右のタブへ移動
Ctrl+← / Ctrl+→ 左 / 右へタブを移動

なお、タブの切り替えはマウスでもでき、作成も [New] のクリックで可能。

機能は以上なのだが、もうすこし機能が欲しい、物足りない、という声が聞こえそうだ。じつは tabbed には機能拡張版が存在するのだが、それについては後述する。

man urxvt-tabbed

kuake (ポップアップコンソール風)

kuake はホットキーで端末を呼び出したり消したりする、いわゆるポップアップコンソールというやつを urxvt でもできるようにするものだ。

以下のように起動時のオプション指定で使うのがいい。

$ urxvt -pe kuake

端末は隠れた状態で起動する。ホットキー(デフォルトは F10 )を押すことで表示され、もう一度押せば隠れる。

ホットキーは kuake.hotkey リソースで変更できる(以下では F12 に)。

$ urxvt -pe kuake -kuake-hotkey F12

以下のようにリソース定義もあたりまえのごとくできるのだが、ちょっと注意が必要である。

URxvt.perl-ext-common: kuake
URxvt.kuake.hotkey: F12

上記のようにリソース設定して複数の urxvt を走らせると当然 kuake も複数でロードされるのだが、2つめを起動するとエラーになったり(プロセスは残るが切り替えられない)、あるいはうまく起動できてホットキー切り替えできても、1つの端末を終了させるとホットキーが働かなくなるなどの不具合が発生するようである。リソース定義しないのが無難であろう。どうも同じホットキーを複数端末で共有することが都合に合わないようで、起動オプションで2つ目の端末を同じホットキーで起動しても同様の不具合が発生する。

ただし、以下のように別のホットキー(以下では F10F12 )で起動する場合は普通に使える。

$ urxvt -pe kuake & urxvt -pe kuake -kuake-hotkey F12

kuake と tabbed を組み合わせれば、ポップアップタブコンソールになる。そこで tmux なんか動かすと外観上はとっても多機能な感じに見えるかもしれない。

$ urxvt -pe tabbed,kuake &

urxvt_terminal_emulator_ss_perl_ext_tabbed_extended_1.jpg

なお、ヴィジュアル効果(アニメーション描画)は一般に Window Manager なんかの仕事とされているようで、ここには実装されていない。

man urxvt-kuake

matcher (文字列選択でアプリ起動)

matcher は表示端末内の条件に合った文字列を、マウスかキーボードで選択して他のアプリケーションに転送出来るようにする拡張機能である。

デフォルトで URL を想定したマッチ文字列が定義されているので、 URL を選択してブラウザで閲覧できるようにする設定が容易にできる。

マウスのクリックボタンはデフォルトで 2 となっており、真ん中のボタンを押すようである。 matcher.button リソースを下記のように 1 にすると左クリックに設定できる。

キーバインディングは keysym リソースで設定する。利用できるアクションは以下の3つ

matcher:select セレクトモードに切り替え
matcher:list マッチ文字列の一覧(数字キーで選んでアプリに転送)
matcher:last 最後のURLをアプリに転送
URxvt.perl-ext-common: matcher
URxvt.matcher.launcher: xdg-open
URxvt.matcher.button: 1
URxvt.keysym.M-u: matcher:select
URxvt.keysym.M-U: matcher:list
URxvt.keysym.M-o: matcher:last

上記の設定では Alt+u でセレクトモードに入り、下表の操作を受けつけるようになる。また Alt+U (大文字)でリストから数字で選択したものを開き、 Alt+o は表示の最後にあるURLを開く。

キー 動作
上、下へカーソル移動
Home End 最初、最後へカーソル移動
Enter 開く
y 選択文字列をコピー (CLIPBOARD)
Esc モード中止

url-launcher リソースに設定されたコマンドがオープナープログラム(関連付けハンドラー)として使われるが、 matcher.launcher リソースが設定されていれば優先する。これらの設定がない場合には sensible-browser コマンドを捜すようである。 sensible-browser は Debian で “既定のブラウザ” を起動するコマンドだが、直接 firefox などと指定してもいい。だが、ここで xdg-open を指定しておけば各デスクトップ環境のオープナー( gnome-openexo-open など)が存在する場合には処理を渡してくれるから、都合がいい。デスクトップ環境を特にセットアップしていないウィンドウマネージャだけの環境では xdg-open 自身が対応してくれる(この場合には xdg-mime コマンドで関連付けのコントロールをするといい)。

また、 matcher.pattern.N リソースに正規表現を登録することで URL 以外の文字列を転送することができる。リソース最後の N には数字を指定し、対応する matcher.launcher.N で開く、ということのようである。なお、デフォルトの URL は matcher.pattern.0 を設定することで上書くことができるものなので、URL以外のマッチ文字列の定義は 1 からはじめるのがいいだろう。

URxvt.matcher.pattern.1:  \\B(/\\S+?):(\\d+)(?=:|$)
URxvt.matcher.launcher.1: gvim +$2 $1

man urxvt-matcher

Perl 拡張をインストールして使う

上ではプリパッケージのスクリプトについて記したが、それら以外にも便利な Perl 拡張スクリプトが公開されており、個人的に必須と思う拡張機能もあるので、あわせて紹介したい。

その前にスクリプトの置き場についてだが、 urxvt は起動時に $URXVT_PERL_LIB~/.urxvt/ext/usr/lib/urxvt/perl の順にディレクトリを探索していく。ただし、 perl-lib リソース( -perl-lib オプション)が定義されている場合にはそれを一番最初に調べに行く。 perl-lib にはコロン : をデリミタにして複数のディレクトリの指定が可能である。

ダウンロードしてきたものや自前のスクリプトは ~/.urxvt/ext に置いて使う、というのがもっとも手軽な利用法だろう。

tabbed (機能拡張版)

ここでとりあげるのは前述の tabbed の機能拡張版で、tabbedex の機能なども取り込んでいるもよう。便利な tabbed をさらに拡張して、かゆいところに手が届いた感じだ。

GitHub – gryf/tabbed: Extended tabbed plugin for rxvt-unicode (urxvt)

なお、既に記した通り同名のプリパッケージ版が /usr/lib/urxvt/perl にあっても、ダウンロードしてきたものを ~/.urxvt/ext などに置くのであればそれが優先される。

追加の機能は以下の通り。

  • タブに名前がつけられる
  • [New] ボタンを消せる
  • タブの数字を消せる
  • タブコマンド定義 : タブ作成-タブ命名-コマンド実行、の一連をショートカットキーに設定できる

[New] ボタンが消せるのはありがたい(マウスが嫌いなわけではない)。また「タブコマンド」を使うと捗るので、これは後ほど詳しく。

以下では [NEW] ボタンとタブの番号を表示させないようにしてみた。色設定はプリパッケージ版と同様。

!! tabbed (https://github.com/gryf/tabbed)
URxvt.perl-ext-common:    tabbed
URxvt.tabbed.tabbar-fg:   243
URxvt.tabbed.tabbar-bg:   237
URxvt.tabbed.tab-fg:      250
URxvt.tabbed.tab-bg:      30
URxvt.tabbed.new-button:  false
URxvt.tabbed.tab-numbers: false

[New] ボタンの表示は tabbed.new-button リソースで、タブ番号の表示は tabbed.tab-numbers で設定する。いずれもブーリアン( true / false )。

操作キーは以下の通り。タブ作成のキーは、タブコマンド実装にあわせて変更されているようである。

キー 機能
Ctrl+Shift+n タブ作成
Ctrl+19, 0 1〜10 のタブに切り替え
Shift+← / Shift+→ 左 / 右のタブへ移動
Ctrl+← / Ctrl+→ 左 / 右へタブを移動
Shift+↑ タブをリネーム

Ctrl+数字キー での切り替えは、最初の10個について対応する。タブ番号の表示を抑止しても Ctrl+数字 キーでの切り替えに影響はないもよう。また、タブバーをマウスでクリックすることでもタブの切り替えが可能。

さて、タブコマンドについて。

この機能は、新しいタブを作成しつつ指定のコマンドを実行するためのショートカットキーを設定できるものだ。

tabbed.tabcmds.<n> リソースで設定する。リソース名の <n> には数字を1から順番に振っていくようにする(数字に間が空くと不具合となる)。リソース値には | 区切りで以下のように、2つないし3つを設定する。

key|name[|command]

<key>Ctrl+Shift キーとともに押すキーを指定(大小文字区別なし)。例えば n とするなら Ctrl+Shift+n を押すことをさす。

<name> はタブに表示させる文字列で、 | 以外の文字が使える。

<command> にはコマンドラインを指定。これを省略した場合にはログインシェルが立ち上がる。

端末の仕様上 <key> に指定しても無効となるキーがあるらしく、また私がやってみたところではシェルに Control キーでショートカット設定したりするとそっちにとられがちで使えなかった。そこらへんの制約は仕様がないだろう。

URxvt.tabbed.tabcmds.1: n|SHELL
URxvt.tabbed.tabcmds.2: r|ROOT|su -
URxvt.tabbed.tabcmds.3: f|FILER|bash -i -c ranger

以上のように設定すると、 Ctrl+Shift+n で通常のシェル(デフォルトと同様にした)、 Ctrl+Shift+r でrootのシェルを開く、 Ctrl+Shift+f でファイルマネージャ( ranger を指定しているが、もちろん他の curses ファイラーを指定してもいい)を起動するということになる。

また、上記に加えて以下の指定を加えると urxvt 起動時に上記3つのタブが自動的に開かれる。

URxvt.session: n|r|f

keyboard-select (文字列コピーや検索)

keyboard-select を使うと、バッファ内のキャラクターの検索・選択がキーボードでできるようになる。コマンドラインやログの抜粋をエディタに貼り付けるなどといったことがマウス抜きで容易にできるから、重宝する。

GitHub – muennich/urxvt-perls: Perl extensions for the rxvt-unicode terminal emulator

URxvt.perl-ext-common: keyboard-select
URxvt.keysym.M-Escape: perl:keyboard-select:activate

上記のようにリソース設定すると Alt+ESC で keyboard-select モードになる。

また perl:keyboard-select:search を設定すると、文字列検索してから keyboard-select モードに入るようにできる。 urxvt デフォルトの Alt+s ( searchable-scrollback )をこれに差し替えるといいかもしれない。

URxvt.keysym.M-s: perl:keyboard-select:search

モードに入るとカーソルがコマンドラインから解き放たれてフリーとなり、バックスクロールできるバッファ内のキャラクターを選択してコピーできる。キー操作は vi ライクなもので、 h j k l で移動し、 v で選択を開始し、範囲の最後へ移動して Enter を押せばコピーされる、といった感じだ。

キー 動作
h / j / k / l 左/下/上/右へ移動
w ( W ) / e ( E ) / b ( B ) 単語頭 / 単語尻 / 単語頭(逆方向) へ移動
f ( F ) 行内インクリメンタルサーチ
0 / ^ / $ 行頭 / 最初の非空白 / 行末へ移動
g / G バッファ先頭 / 最終行へ移動
H / M / L 頁上方 / 頁中間 / 頁下方へ移動
Ctrl+f / Ctrl+b / Ctrl+d / Ctrl+u 1頁下 / 1頁上 / 半頁下 / 半頁上へスクロール
/ / ? / n / N 順方向検索 / 逆方向検索 / 再順検索 / 再逆検索
v / V / Ctrl+v 選択 / 行選択 / ブロック選択開始
y / Enter 選択部コピー / 選択部コピーしてモード終了
q , ESC , Ctrl+c モード終了

なお、デフォルトではコピーのセレクションは PRIMARY のみが使われるが、 keyboard-select.clipboard を設定しておくと CLIPBOARD にも反映されるようになる。 PRIMARY と CLIPBOARD を別々に区別して使いたいということでなければ、以下のようにリソース設定しておいたほうが使い勝手がいいかも知れない。

URxvt.keyboard-select.clipboard: true

resize-font (文字の拡大・縮小)

resize-font は文字のサイズをリアルタイムに変更できる機能拡張だ。

GitHub – simmel/urxvt-resize-font: URxvt Perl extension for resizing the font

キーを押すごとに文字の大きさを拡縮できる。1押下ごとのステップ値は resize-font.step リソースで変更できる(下記の例では2ステップに設定してある)。

URxvt.perl-ext-common: resize-font
URxvt.resize-font.step: 2

デフォルトでは以下のようなキーバインディングとなっている

Ctrl+- 文字を小さく
Ctrl++ 文字を大きく
Ctrl+= 文字をもとのサイズに戻す
Ctrl+? 表示フォントの情報を表示する

別のキーへの割り当ては keysym リソースで行う。以下では Ctrl+↑ Ctrl+↓ に拡大縮小を当てている。

URxvt.keysym.C-Down: resize-font:smaller
URxvt.keysym.C-Up: resize-font:bigger

あるユーチューバーのビデオ(URXVT is the Best Terminal. (And some configuration notes) – YouTube)では Ctrl+jCtrl+k に拡縮を割り当て、素早いキーボード捌きでプレゼンしているのが印象的だった。わたしは fzf なんかでこのキーを使うからできないけれど、そうでなければこういう思い切ったキーバインディングもありと思う。

URxvt.keysym.C-j: resize-font:smaller
URxvt.keysym.C-k: resize-font:bigger

なお、本稿では urxvt のフォント指定方法について font-9 のような文字サイズの指定方法を記してきたが、それだと resize-font が反応しないようである。しかし font:size=Nfont:pixelsize=N のような表現であれば大丈夫である。つまり、以下のようにリソースを記せば良い。

URxvt.font: xft:DejaVu Sans Mono:pixelsize=14, xft:IPAGothic

前述の resize-font.step リソースの1ステップは 、 size= なら1ポイントずつ、 pixelsize= なら1ピクセルずつとなる。

url-select (URL選択でアプリ起動)

url-select は表示端末内の URL 文字列をマウスかキーボードで選択して、他のアプリケーションに転送できるようにする拡張機能である。つまり、既に紹介した matcher と機能がもろかぶりのものである。

そもそも matcher はマウスクリックの機能のみ提供していたようで、キーボードでのURL選択ができなかったのを url-select が補っていたようである。ところが urxvt 9.21 で matcher の機能が拡張され、URLすら含むマッチ文字列の操作をマウスはおろかキーボードまでサポートするようになった。このため現在、デベロッパーは url-select を deprecated としている。

urxvt-perls/deprecated at master · muennich/urxvt-perls · GitHub

しかし、なかなかどうして url-select のキーバインディングは(現状では) matcher よりも使い易いと私は思うのである(ようするに方向キーのとこまで手を持ってくのが面倒なのだ)。

キー 動作 他のキー
j k 上、下へカーソル移動
g G 最初、最後へカーソル移動 Home End
o 開く Enter
y 選択中のURLをコピー (PRIMARY)  
q モード中止 Esc
URxvt.perl-ext-common: url-select
URxvt.url-select.launcher: xdg-open
URxvt.url-select.underline: true
URxvt.keysym.M-u: perl:url-select:select_next
URxvt.url-select.button: 1

上記の設定で、 Alt+u を押すと画面の最も下にある URL を選択した状態になり、 j k で選択対象を切り替えて o でブラウザを開く。またマウスボタンはデフォルトが 2 (中ボタン)なので、これも 1 (左ボタン)にしてみた。

オープナーについては matcher と同様で、 url-launcher を設定するか、 url-select 専用指定として url-select.launcher を設定してもいい。

なお、リスト機能だけ matcher の機能を使ってセレクトは url-select の機能を使えばハッピーになれると思い、やってみたが動かない。残念ながら併存は無理のようだ。

Perl 拡張設定まとめ(X resources)

ここまでにとりあげた Perl 拡張の設定をまとめた。

!! urxvt opener
URxvt.url-launcher: xdg-open

!!
!! urxvt extensions
!!

!! extensions
URxvt.perl-ext-common:    default,matcher,keyboard-select,resize-font

!! matcher
URxvt.matcher.button:     1
URxvt.keysym.M-u:         matcher:select
URxvt.keysym.M-U:         matcher:list
URxvt.keysym.M-o:         matcher:last

!! tabbed - extended (https://github.com/gryf/tabbed)
URxvt.tabbed.tabbar-fg:   243
URxvt.tabbed.tabbar-bg:   237
URxvt.tabbed.tab-fg:      250
URxvt.tabbed.tab-bg:      30
URxvt.tabbed.new-button:  false
URxvt.tabbed.tab-numbers: false
URxvt.tabbed.tabcmds.1:   n|SHELL
URxvt.tabbed.tabcmds.2:   r|ROOT|su -
URxvt.tabbed.tabcmds.3:   f|FILER|bash -i -c ranger
URxvt.session:            n

!! keyboard-select (https://github.com/muennich/urxvt-perls)
URxvt.keyboard-select.clipboard: true
URxvt.keysym.M-Escape:    perl:keyboard-select:activate
URxvt.keysym.M-s:         perl:keyboard-select:search

!! resize-font (https://github.com/simmel/urxvt-resize-font)
URxvt.keysym.C-Down:      resize-font:smaller
URxvt.keysym.C-Up:        resize-font:bigger

ここでは URL セレクターに matcher を使っている。

以上を先述の ~/.Xresources 記述例に追記する。

resize-font のために URxvt.font の定義は font:pixelsize=n (または font:size=n )という表現にする。

URxvt.font: xft:Dejavu Sans Mono:pixelsize=12,\
            xft:IPAGothic

追加スクリプトの tabbed (Extended)keyboard-select (urxvt-perl)resize-font らを ~/.urxvt/ext 下に配置する。

そうしておいて ~/.Xresources をロードする。

$ xrdb -merge ~/.Xresources

tabbed 、 kuake 、 digital-clock については、全ての urxvt端末で使うと不便なことが多いので perl-ext-common リソースの定義からはずしてある。利用するなら以下のように起動時に -pe オプションで指定してあげる。

$ urxvt -pe digital-clock
$ urxvt -pe tabbed,kuake

この拡張設定で以下のキー操作が追加される。

キー 機能 備考
Alt+u URL選択モード  
Alt+U URLリスト 数字で指定
Alt+o URL(最後の)を開く  
mouse-left URLを開く  
Alt+ESC 文字選択モード  
Alt+s 文字選択モード(検索後)  
Ctrl+↓ 文字を小さく  
Ctrl+↑ 文字を大きく  
Ctrl+= 文字を戻す  
Ctrl+? フォント情報  
F10 端末引き出し/収納 -pe kuake
Ctrl+Shift+n タブ作成 -pe tabbed
Ctrl+Shift+r タブ作成 (root) -pe tabbed
Ctrl+Shift+f タブ作成 (ranger) -pe tabbed
Ctrl+0 〜 9 1〜10 のタブ切替 -pe tabbed
Shift+← タブを左に切替 -pe tabbed
Shift+→ タブを右に切替 -pe tabbed
Ctrl+← タブを左へ移動 -pe tabbed
Ctrl+→ タブを右へ移動 -pe tabbed
Shift+↑ タブをリネーム -pe tabbed

URL選択モードのキー操作。

キー 機能
上 下
Home End 最初 最後
Enter 開く
y 選択中のURL文字列をコピー(CLIPBOARD)
Esc モード中止

文字選択モードのキー操作(詳細は keyboard-select の節を参照)。

キー 機能
h j k l 左 下 上 右
g G バッファ先頭 最終行
/ ? n N 検索 逆検索 再検索 再逆検索
v V Ctrl+v 選択 行選択 ブロック選択
y コピー(PRIMARYとCLIPBOARD)
Return コピーしてモード終了
q モード終了

X resources 記述の工夫

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

例えば以下のように書くと 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 を設定することのメモ」に書いてあるので、御興味を抱かれた向きは読んでいってください。

なお上記のページでも触れているが、 GDM を使っている Ubuntu などで起動時に xrdb が CPP を通さない設定になっており、 ~/.Xresources に CPP 向けの記述をするとリソースに余計なデータが混入してエラーになるケースがある。

Xsession スクリプトの不備なので、解決策としてはこれを書き換えるのがベストだが、 urxvt の場合には次節のように起動オプションを活用してシェルスクリプトで記述してしまえるので、 X resources は不要となる。これは解決策の1つと言えなくもないだろう。

urxvt を起動オプションだけで設定する

urxvt ではおそらくリソース設定の全て(ほぼ全て?)を起動オプションでまかなえる。つまり X resources を利用せずに設定可能である。

また、(サンプルスクリプトには書かなかったが)シェルスクリプトならホスト別設定などの条件分岐はたやすく、活用の幅は広がるだろう。

あまり例のあることではないようだが、こういうのもありだろうということで、コマンドライン引数の羅列を以下簡単なスクリプトにしてみた。

最初の方で書いた run_urxvt スクリプトを元に、これも最初に示したリソース設定の内容を起動オプションに読み替えて書いてある。

#!/bin/bash
# run_urxvt_rich                                       JennyM 2019 Malkalech.com

opts=(

  ## common settings
  -geometry 96x32              # geometry
  -sr                          # scrollBar_right
  -st                          # scrollBar_floating
  -scrollstyle plain           # scrollstyle
  #+sb                          # scrollBar - on(default):-sb  off:+sb
  -bc                          # cursorBlink
  -uc                          # cursorUnderline
  -pointerBlank                # pointerBlank
  -vb                          # visualBell
  -sl 3000                     # saveLines
  -fade 40                     # fading

  ## font
  -fn 'xft:DejaVu Sans Mono-9, xft:IPAGothic'
  -letsp -1                    # letterSpace
  #-lsp 0                       # lineSpace

  ## color / opacity
  ## gruvbox-dark https://github.com/morhetz/gruvbox
  -depth       32              # depth
  -color0      '[90]#282828'   # (black)
  -color1      '[90]#cc241d'   # (red)
  -color2      '[90]#98971a'   # (green)
  -color3      '[90]#d79921'   # (yellow)
  -color4      '[90]#458588'   # (blue)
  -color5      '[90]#b16286'   # (magenta)
  -color6      '[90]#689d6a'   # (cyan)
  -color7      '[90]#a89984'   # (white)
  -color8      '[90]#928374'   # (bright black)
  -color9      '[90]#fb4934'   # (bright red)
  -color10     '[90]#b8bb26'   # (bright green)
  -color11     '[90]#fabd2f'   # (bright yellow)
  -color12     '[90]#83a598'   # (bright blue)
  -color13     '[90]#d3869b'   # (bright magenta)
  -color14     '[90]#8ec07c'   # (bright cyan)
  -color15     '[90]#ebdbb2'   # (bright white)
  -fg          '[90]#ebdbb2'   # foreground
  -bg          '[90]#282828'   # background
  -colorIT     '[90]#8ec07c'   # (italic characters)
  -colorBD     '[90]#d5c4a1'   # (bold characters)
  -colorUL     '[90]#83a598'   # (underlined characters)
  -scrollColor '[90]#504945'   # (scrollbar)
  #-troughColor '[90]#3C3836'   # (scrollbar's trough area)

  "$@"
)

urxvtc "${opts[@]}" >/dev/null 2>&1 || {
  [ "$?" -eq 2 ] && urxvtd -q -o -f && urxvtc "${opts[@]}"
}

スクリプトのはじめで配列変数($opts)にまるごと引数を代入してから urxvtc に渡すようにしているので、オプションの変更や追加が楽と思う。コメントもつけやすいかと。

また、 urxvt の起動オプションは -sr とか +sb のようなショート名だけでなく、 -scrollBar_right とか +scrollBar みたいなロング名(ほぼリソース名と同じ)で指定可能である。けれどここではなんというか、一応お作法(?)としてショートがあるものはショートで記した。

これをやはりパスの通ったところ( ~/bin とか)に置いて、実行属性をつけてあげる。

$ chmod +x ~/bin/run_urxvt_rich

引数も捉えるから例えば run_urxvt_rich -pe kuake などとすればポップアップコンソールとして常駐する( F10 で出現)。

VirtualBox に片っ端から色々なディストロゲストをたてて urxvt を動かす(そんなことふつうやらないかもしれないが)のに、このスクリプトをゲストで使ったらいちいち X resources の設定やらロードやらを気にせずともよいので、便利だった。

Sources and Revisions

Sources

Revisions

  • [2018-10-12 Fri] X resources 記述の工夫を追記
  • [2019-01-04 Fri] Perl 拡張について追記
  • [2019-02-07 Thu] matcher について改訂、 resize-font 、 url-select を追記など
  • [2019-03-26 Tue] 起動オプションのみで設定することを追記
  • [2019-04-25 Thu] コピペ操作について追記
  • [2019-05-07 Tue] kuake と keyboard-select について改訂、ほか

コメント