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    /* 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 拡張機能の利用については後述する。

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

urxvt で 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.<extenssion_name>.<resource> などというようになっているが、夫々のマンページやリードミー、あるいはスクリプトヘッダに書かれてあるものを参照する。

以下で urxvt のパッケージ(ここでは Arch Linux の community/rxvt-unicode : rxvt-unidoe 9.22-7 を参照している)に同梱されているもので便利なものを幾つかピックアップして紹介する。他の詳細は man urxvt-extensions を参照のこと。

スクリプト名 機能
tabbed urxvt にタブ機能を付加する
kuake urxvt をポップアップコンソール風にする
matcher URL 文字列をマウスでクリックしてブラウザなどで開けるようにする

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 でもできるようにするものだ。

デフォルトで F10 がホットキーにあてられているが、変更できる。以下のリソース定義では F9 に変更してみている。

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

もっとも、複数起動すると何がなんだかわからなくなるので、リソースで定義せず、必要なときに起動オプションで呼び出すようにするのがいいかもしれない。

$ urxvt -pe kuake -kuake-hotkey F9

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 をクリックしてそれをブラウザで表示するようにできる。もちろん URL 以外の、例えばスクリプトファイルを示す表現を登録してワンクリックでエディタに転送、といったこともできる。

デフォルトのクリックボタンは 2 となっており真ん中のボタンを押すようである。以下のリソース定義ではこれを左クリックに設定し直している。

URxvt.matcher.launcher: /usr/bin/xdg-open
URxvt.matcher.button: 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)

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

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

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

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

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

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

Ctrl+数字キー での切り替えは、最初の10個について対応する。また、タブバーをマウスでクリックするとそのタブに切り替わる。

以下のように設定してみた。色設定についてはプリパッケージ版と同様である。

!! 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 )。なおタブ番号の表示を抑止しても Contro+数字 での切り替えに影響はないもよう。

次に、タブコマンドである。

tabbed.tabcmds.<n> リソースでショートカットキーにコマンドを登録できる(タブ作成もこの機能によるもよう)。リソース名の <n> には数字を1から順にふっていくようにする(数字に間が空くと不具合となる)。値は | 区切りで以下のように、2つないし3つを設定する。

key|name[|command]

<key>Ctrl+Shift とともに押すキーを指定(大小文字区別なし)。 n とすれば Control+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 でファイルマネージャを起動するということになる。

また、上記に加えて以下の指定を加えると 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

モードに入るとカーソルがコマンドラインから解き放たれてフリーとなり、バックスクロールできるバッファ内のキャラクターを選択してコピペできる。

keyboard-select モード中では vi ライクなキー操作ができる。簡易に列挙してみる

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

コメント