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 コマンドにオプション -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 の設定

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

デフォルトで 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 を選択してブラウザで閲覧できるようにする設定が容易にできる。

マウスのクリックボタンはデフォルトで 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 選択文字列をクリップボードへコピー
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)

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

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

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

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

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

キー 機能
Ctrl+Shift+n タブ作成
Ctrl+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 )。なおタブ番号の表示を抑止しても 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

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

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

キー 動作
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 / Return 選択部コピー / 選択部コピーしてモード終了
q , ESC , Ctrl+c モード終了

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 のフォント指定方法について Dejavu Sans Mono-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すら含むマッチ文字列の操作をマウスはおろかキーボードまで matcher がサポートするようになった。このため現在、デベロッパーは url-select を deprecated としている。

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

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

キー 動作 他のキー
j k 上、下へカーソル移動 矢印キー
g G 最初、最後へカーソル移動 Home End
Enter 開く o
y 選択文字列をクリップボードへコピー  
Esc モード中止 q
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 の機能を使えばハッピーになれると思い、やってみたが動かない。残念ながら matcher と url-select の併存は無理のようだ。

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

とりあげた Perl 拡張の設定をまとめてみた( URL セレクトについては matcher を使っている)。

!! 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.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

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

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

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

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

そうしておいて xrdb~/.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 選択文字列をクリップボードへコピー
Esc モード中止

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

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

X resources 記述の工夫

X resources そのものの定義では条件分岐や外部ファイルの読み込みといったことができない。しかし、 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 を設定することのメモ」に書いてあるので、御興味を抱かれた向きは読んでいってください。

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 追記など

コメント