アシアルブログ

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

タイル型ウィンドウマネージャ 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っぽいキーバインドで操作可能にしてます。

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