dmenuとwmctrlで、選択的インターフェースなウィンドウ切り替えを実現した


動機

今流行りの「選択的インターフェース」。

初めてpecoを触った時は、いたく感動しました。

コマンドラインの履歴をpecoで追いかけるなどすると、もうこれ無しではターミナル生活はできないというほど快適ですよね。

また、僕がメインで使っているEmacsには、Helmというプラグインがあり、現在開いているファイル、最近開いたファイルなどが一覧化できます。
最近はhelm-do-ag.el無しではコーディングできません。

Vimでも同様のことをするuniteというプラグインがあります。

このような、「一覧を表示」 => 「絞り込んで選択」 というインターフェースで、
ブラウザのタブ操作を実現できないかと考えたのが事の始まりでした。

試したこと

同様のことをするGoogle Chromeの拡張もあったのですが、いまいち使いづらかったので止めました。

そこで、Linuxのウィンドウ切替を丸ごと選択的にしてしまうという解決策を考えつきました。

成功イメージ

こんな感じで、ウィンドウタイトルを絞り込んで選択できます。

やり方

事前に、dmenuwmctrlをインストールします。Arch Linuxなら

sudo pacman -S dmenu wmctrl

です。

インストールしたら、下記のシェルスクリプトを、パスの通った場所に置きます。

select_window
#!/bin/bash

target=`wmctrl -l | cut -d ' ' -f 5- | dmenu -ib -l 30`

if [[ "$target" =~ ^$ ]]; then
   exit 1
else
    wmctrl -a "$target"
fi

dmenuの動きとしては、

  • 標準入力を受け取る
  • ユーザーに1行の絞り込みをさせる
  • 選択した行を標準出力に出す

ということをしています。シンプルなので、使い方次第で色んなことができそうですね。

あとは、ターミナルなどでselect_windowコマンドを叩くだけです。

オプション

Alt-Tabのように使うために、下記のようにキーボードショートカットを設定しています。

私は、Openboxというウィンドウマネージャーを使っていますので、その設定例です。

~/.config/openbox/rc.xml
  <keyboard>
    <keybind key="W-b">
      <action name="Execute">
        <command>select_window</command>
      </action>
    </keybind>
  </keyboard>

これにより、Super + bselect_windowコマンドが発動するようになります。

Super + Spaceで発動するようにしたいな。できるのかな。

追記

これはこれで便利だけど、新興ブラウザvivaldiなら、コマンド機能が標準で有り、タブの切り替えがHelmみたいにできる。乗り換えようかな。