アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

stumpwm設定v2

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 作成


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


~/.stumpwmrc 追記


(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 追記


(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))))

(defcommand gselect1 () () (gselectw "1" "/path/to/dir/01.jpg"))
(defcommand gselect2 () () (gselectw "2" nli))

(define-key *root-map* (kbd "1") "gselect1")
(define-key *root-map* (kbd "2") "gselect2")


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

おまけ


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


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

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

タイル型ウィンドウマネージャ stumpwm 導入

stumpwmとは、タイル型ウィンドウマネージャの一種。
ratpoisonの後継でcommon lispで実装されています。
Cで書かれたratpoisonより若干重くはなりますが、拡張性に優れており、設定ファイルもcommon lispでかけるのでいろいろと便利。

ついこの間ratpoisonからstumpwmへ乗り換えたので、導入について書いてみたいと思います。

1・乗り換えた理由
ratpoisonでもほとんど満足でしたか、一つ不満点がありました。
xrandrで解像度を変更するときに、ratpoisonを再起動しないと解像度が反映されないのが非常に面倒なことです。

再起動するとグループも再構成されてしまい、ウィンドウを再配置する必要があります。
(さらに自分の環境が悪いのかもしれませんが、既存のウィンドウを他のグループに移動しようとするとウィンドウが消えると言う妙な事柄になります)

最近割と頻繁にディスプレイを変えることがあり面倒なので、その辺に対応しているstumpwmをインストールしてみました。

2・インストール


$ sudo apt-get install stumpwm

以上。
common lispだとかいろいろ入ります。

3・設定
設定ファイルは ~/.stumpwmrc にcommon lispで記述します。


;; -*- lisp -*-
(in-package :stumpwm)
(setf *shell-program* "/bin/zsh")

;; 色
(set-fg-color "#000000")
(set-bg-color "#FFFFFF")
(set-border-color "#000000")
;; フォーカスがあるウィンドウの色
;; デフォルトは白ですが、何か自己主張が激しい(?)ので暗い赤に
(set-focus-color "#883333")
;; フォーカスが無いのは暗い青に
(set-unfocus-color "#333388")

;; フォント
(set-font "-xos4-terminus-bold-r-normal--14-140-72-72-c-0-iso8859-7")

;; あらかじめグループを作成しておく
(run-commands "gnewbg 1")
(run-commands "gnewbg 2")
(run-commands "gnewbg 3")
(run-commands "gnewbg 4")
(run-commands "gnewbg 5")
(run-commands "gnewbg 6")
(run-commands "gnewbg 7")
(run-commands "gnewbg 8")
(run-commands "gnewbg 9")
(run-commands "gnewbg 10")

;; 1番を選択
(run-commands "gselect 1")

;; 以下、独自コマンド
; urxvt起動
(defcommand urxvt () ()  (run-shell-command "urxvt"))

; 音楽プレーヤのコントロール
; audio_ctlはシェルスクリプトで、
; playが渡されたら rhythmbox-client --play 実行するように書いている
(defcommand mprev () ()  (run-shell-command "audio_ctl prev"))
(defcommand mplay () ()  (run-shell-command "audio_ctl play"))
(defcommand mpause () ()  (run-shell-command "audio_ctl pause"))
(defcommand mstop () ()  (run-shell-command "audio_ctl stop"))
(defcommand mnext () ()  (run-shell-command "audio_ctl next"))
(defcommand mshuffle () ()  (run-shell-command "audio_ctl shuffle"))
(defcommand mrepeat () ()  (run-shell-command "audio_ctl repeat"))
(defcommand volup () ()  (run-shell-command "audio_ctl volup"))
(defcommand voldown () ()  (run-shell-command "audio_ctl voldown"))
(defcommand mnotify () ()  (run-shell-command "audio_ctl notify"))

; music
(define-key *root-map* (kbd "M-z") "mprev")
(define-key *root-map* (kbd "M-x") "mplay")
(define-key *root-map* (kbd "M-c") "mpause")
(define-key *root-map* (kbd "M-v") "mstop")
(define-key *root-map* (kbd "M-b") "mnext")
(define-key *root-map* (kbd "M-s") "mshuffle")
(define-key *root-map* (kbd "M-r") "mrepeat")
(define-key *root-map* (kbd "C-0") "volup")
(define-key *root-map* (kbd "C-9") "voldown")
(define-key *root-map* (kbd "x") "mnotify")

; term
(define-key *root-map* (kbd "C-c") "urxvt")
(define-key *root-map* (kbd "c") "urxvt")

; colon
; stumpwmのデフォルトはセミコロンなため、コロンに変更して置く
(define-key *root-map* (kbd "C-:") "colon")
(define-key *root-map* (kbd ":") "colon")

;; group
;; M-Fxで切り替え *top-map* とすることでシングルストロークで実行出来る
(define-key *top-map* (kbd "M-F1") "gselect 1")
(define-key *top-map* (kbd "M-F2") "gselect 2")
(define-key *top-map* (kbd "M-F3") "gselect 3")
(define-key *top-map* (kbd "M-F4") "gselect 4")
(define-key *top-map* (kbd "M-F5") "gselect 5")
(define-key *top-map* (kbd "M-F6") "gselect 6")
(define-key *top-map* (kbd "M-F7") "gselect 7")
(define-key *top-map* (kbd "M-F8") "gselect 8")
(define-key *top-map* (kbd "M-F9") "gselect 9")
(define-key *top-map* (kbd "M-F10") "gselect 10")
(define-key *root-map* (kbd ",") "gmove")

;; window
;; 今いるウィンドウが分かりずらかったため書いてみた
;; 慣れれば必要ない
(defcommand sfnext () () (run-commands "fnext" "echo #########################################
#########################################
      C U R R E N T F R A M E
#########################################
#########################################
"))

(define-key *root-map* (kbd "C-b") "sfnext")
(define-key *root-map* (kbd "b") "sfnext")

; カーソルキーでフォーカス切り替え
(define-key *top-map* (kbd "M-Left") "move-focus left")
(define-key *top-map* (kbd "M-Right") "move-focus right")
(define-key *top-map* (kbd "M-Up") "move-focus up")
(define-key *top-map* (kbd "M-Down") "move-focus down")

; vim風のキーバインドでフォーカス切り替え
(define-key *top-map* (kbd "C-M-h") "move-focus left")
(define-key *top-map* (kbd "C-M-l") "move-focus right")
(define-key *top-map* (kbd "C-M-k") "move-focus up")
(define-key *top-map* (kbd "C-M-j") "move-focus down")

; FPS風(?)のキーバインドでフォーカス切り替え(左手だけで変更可能にするため)
(define-key *top-map* (kbd "C-M-a") "move-focus left")
(define-key *top-map* (kbd "C-M-d") "move-focus right")
(define-key *top-map* (kbd "C-M-w") "move-focus up")
(define-key *top-map* (kbd "C-M-s") "move-focus down")


そこそこ長くなった割にあまり詳しいことしてないですが、参考までに。

上記で、*top-map*は地味に便利です。
ツーストロークは指がもつれたりするので、連続でタイプする場合はシングルの方が便利です。

3・xmodmapなどのおまけ
脱線ですが、大抵の日本語キーボードは
|無変換|カナ|Alt|
みたいな配列になっていると思います。
自分の場合はカナは使わないので、Altにしています。



clear Mod1
keycode 101 = Alt_R Meta_R
add Mod1 = Alt_L Alt_R

xmodmapの設定はこんな感じです。

ratpoisonの時は keycode の設定だけで動いていましたが、stumpwmにしてから動かなくなったのでModの設定を追加しました。(環境依存かもしれません)

余談ですが、半角全角をエスケープにしておくと便利です。
(IMを有効にするのはソフト側で Ctrl-無変換にしています)


keycode  49 = Escape Kanji Kanji


カスタマイズと言えば、vimperatorについても、~/.vimperatorrc



"2.3.1 (created: 2010/04/07 18:56:53)

set runtimepath=/home/yuji/.vimperator
source! /home/yuji/.vimperatorrc.local

" vim: set ft=vimperator:

map A H
map S j
map D L
map W k
map Q <C-p>
map E <C-n>



上記のようにし、FPSっぽいキーバインドで操作可能にしてます。

ウィンドウ切り替えからブラウザまで、できるだけ左手で完結出きるようにしておくと、案外便利なのでおすすめです。