Asial Blog

Recruit! Asialで一緒に働きませんか?

stumpwm設定v2

カテゴリ :
バックエンド(インフラ)
タグ :
Linux
stumpwm
common-lisp
tmux
function()
stumpwmって便利ですよね!

なんじゃそりゃ?という方は、"stumpwm"とか"タイル型ウィンドウマネージャ"でググってください。
簡単に言えば、GNU Screenのようなイメージでウィンドウを切り替えることができるので、ウィンドウの配置に関してはマウスを一切使わない硬派なウィンドウマネージャ(WM)です。
普段からウィンドウを最大化して使うか、上下左右に並べて配置して使う人の場合、マウスでちまちま並べる労力を削減出来れば効率が上がるはずです。
そんな人にはタイル型WMをおすすめ致します。


前置きはこのくらいにして、今回は自分が設定したstumpwmをちょっと便利にする方法2つを紹介致します。
1・tmuxを組み合わせて起動するターミナルをひとつだけにする
2・グループごとに壁紙を変更


1・tmuxを組み合わせて起動するターミナルをひとつだけにする


tmuxとは、GNU Screenのようなターミナルマルチプレクサです。
余談:Screenとの違いはありますが、個人的には下記が便利なので乗り換えました。
・Screenの縦分割程遅くならない
・分割機能が便利

本題。
しばらく作業しているとターミナルが増えていきます。
その上、他のブラウザとかlibreofficeなども起動しているとわけわからなくなります。
グループのグループ化してターミナルだけまとめて表示できないかと考えたところ、普通にtmux使えばいいという結論に達しました。

仕様は、
・各グループごとにtmuxを起動
・起動していればフォーカスを当てる
・起動していなければ起動する

実装についてですが、stumpwmにはrun-or-raiseという便利な関数があり、タイトルなどで起動しているか判定して無ければ起動、あればフォーカスをあてることができます。
なんと便利なことでしょう。

ということで、下記コードです。

/usr/local/bin/utmux 作成
  1. #!/bin/bash
  2. PRX="PRX_`stumpish groups| grep -o '\*.\+'| cut -c 2-`"
  3. stumpish eval '(run-or-raise "urxvt -T '$PRX' -e tmux new-session -s '$PRX'" '"'"'(:title "'$PRX'"))'

~/.stumpwmrc 追記
  1. (defcommand urxvt () ()  (run-shell-command "utmux"))

なんでbash使っているかって?CLで実装しようと思ったが間に合わなかったのさHAHAHA!
ということで許してください。CLを触ったことが無かったので、CLだけだとうまくグループのIDが取れませんでした。

PRX=の行は、力技でグループ名を取得。
urxvtは -T でタイトルを指定し、-e でその後に書いたコマンドを実行。
tmuxは、new-sessionで新規セッション、-sでセッション名を指定。
run-or-raiseの第二引数で、判定に使用する値(今回はタイトル)を指定。

このコードを使う場合には、stumpwmを落としてもいい覚悟で使用してください。
自分の環境だけかもしれませんが、起動したウィンドウが一瞬で消えるとstumpwmがフリーズするので注意。


2・グループごとに壁紙を変更


グループ機能は便利ですよね!
複数のウィンドウをまとめることができる機能で、人によっては捉え方は色々とあるかとは思いますが、自分は"タブ"のようなものと考え、各機能ごとにグループを作成しています。

例えば、普段は、メーラ、rdesctop、audacious、そして作業中のターミナルやemacsなど用 のグループを作成し、各グループにショートカットキーを割り当てて、一発で切り替えられるようにしてあります。
M-F1 -> メーラ
M-F3 -> rdesktop
M-F5 -> audacious
Prefix-1〜9 -> ターミナル用

これだけでも便利ですが、もうひと工夫。
ターミナル(urxvt)は背景透過を設定して、各ターミナル用グループで壁紙を変えています。

壁紙変えるだけなら、時間ごとに変えてくれるアプリケーション使えばいいじゃないかと思われるかもしれませんが、実はこちらの方が実用的です。
例えば、各グループでそれぞれ違うサーバに接続していたとします。
壁紙が違えばパッと見どのサーバにつながっているのかすぐに解ります。
もちろん、ターミナルのサーバ名は表示していますが、文字を読むより絵で見たほうが直感的に一目瞭然で、作業ミスを減らすことができます。たぶん。
まさに一石二鳥。

長々と語りましたが、実際の設定方法は下記になります。

~/.stumpwmrc 追記
  1. (defun gselectw (num img) () (progn (if img (run-shell-command (concatenate 'string "fbsetbg -t '" img "'")) (run-shell-command "fbsetbg -t '/path/to/dir/default.jpg'")) (run-commands (concatenate 'string "gselect " num))))
  2. (defcommand gselect1 () () (gselectw "1" "/path/to/dir/01.jpg"))
  3. (defcommand gselect2 () () (gselectw "2" nli))
  4. (define-key *root-map* (kbd "1") "gselect1")
  5. (define-key *root-map* (kbd "2") "gselect2")

要は、gselectw第二引数のパスがあればその画像、無ければdefault.jpgを設定しています。
define-keyとgselectの行を増やしていけば次々設定できます。
なお、fbsetbgを使用しているのは、xsetbgとかdisplayだとうまく切り替わらなかったので。

おまけ


この一件でCL触ってますが、触っているうちに少し楽しくなって来ました。
でも、CLどころかLISPってstumpwmかemacsしか使っていないので、自分の場合はそれ以外の使い所が無いですね。
今やっている案件に・・・いや、ただの嫌がらせにしかならない。


こうやって見ると書いたプログラムは大したことは無いですね。
ですが、少しのコードを書くだけで割と便利になります。

stumpwmに限らず、自分のPCは長く触る環境です。
もし時間が確保できて気が向けば、他のアプリケーションも細かいところをカスタマイズしてみてはいかがでしょうか。