アシアルブログ

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

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

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

ratpoisonで快適操作

こんにちは。最近若干太りぎみの門脇です。
先日、体重を計ったら68.8Kgでした。(平均60程度のアシアルではデブキャラになってます・・・)

そして、自分の体重以上に気になるのがPCの重さです。
もちろん、物理的ではありません。

私が開発で使用しているマシンのメモリ搭載量が512MBで、少々少なめです。
もちろんWindoze Vistaなんてry

メモリ増設すればすぐに解決ですが、DDRなので価格がDDR2の倍近くあり、お金出すのが勿体ないので、ソフトウェアをできるだけ軽くすることにしています。

まず、WMはfluxbox。軽量、シンプル。デフォルトで入っているテーマもいい感じです。
ブラウザはOperafirefoxは40%近く使うことが多々あったので、止めました。(3系で軽くなれば戻るかもしれません)
Operaなら、Max30%程度になります。

ターミナルエミュレーターは、urxvtで、urxvtdを起動して、urxvtcを使用すればxtermを複数立ち上げるより効率が良いです。

と言う具合に環境を整えていましたが、最近さらにおもしろいものを見つけました。

それが「ratpoison」です。

公式
http://www.nongnu.org/ratpoison/

タイル型WMの一種で、飾り気が一切ないです。
起動直後はXのルートが表示されるだけ、どこをクリックしても無反応。

その理由は、「殺鼠剤」と言う過激な名前が物語っています。
作者が「マウス」を「ラット」よわばりし、かなり嫌っているのでこんな名前に・・・。

要は、キーボードだけで快適に操作出来るWMと言うことです。
また、GNU Screenに影響を受けており、GNU Screenライクな操作でウィンドウを操作出来ます。
タイトルバーなし。システムトレイなし。メニューなし。あるのはウィンドウのみ。まさにGNU Screen

インストールは例にもよって



apt-get install ratpoison


スクリーンショットはこんな感じ



基本操作は、

C-t c -> xterm (私の場合はurxvtcに変更してある)
C-t w -> ウィンドウのリスト
C-t 1-9 -> その番号のウィンドウに切り替え
C-t C-t -> 直前のウィンドウに切り替え
C-t C-n -> 次のウィンドウ
C-t C-p -> 前のウィンドウ
C-t C-s -> 横分割
C-t C-S -> 縦分割
C-t C-Q -> 分割解除

などなど。

とりあえず、C-t ? とすれば基本的なコマンドが出ます。
詳しいこと調べるなら、man ratpoisonで。


さて、デフォルトでも普通に使えますが、
この手の物はやはりカスタマイズしてなんぼのものです。



.ratpoisonrc

exec rpws init 10 -k

bind b nextscreen 
bind c exec urxvtc


以上。シンプル。

バリバリカスタマイズしたいところですが、今のところ苦労していないので少ないです。
一番上は、仮想デスクトップ有効にするためのもので、10個の仮想デスクトップを作成しています。

仮想デスクトップの切り替えは、Alt-F1...F9でできます。(fluxboxと同じ)
便利な仮想デスクトップですが、シングルディスプレイだと素直に使えます。
マルチディスプレイの場合、気をつけないと画面の分割状態が別のデスクトップに行ってしまうので、注意してください。(この辺もう少し調べないと・・・)

その次からはキーバインドで、C-tを押した後のキーを定義します。

一つ目はスクリーンの切り替えです。マルチディスプレイ環境で次のディスプレイにフォーカスを移すコマンドです。
これは使用頻度が高いため、そこそこ使いやすいく紛らわしくない b にしています。
最後は、C-t c で urxvtc を起動するだけです。

ですが、ratpoisonのカスタマイズはこれだけではありません。



ratpoison -c 何か


ratpoisonのコマンドを実行できます。

例えば、



ratpoison -c 'echo hoge'
ratpoison -c 'exec opera'


一つ目は、ミニバッファに hoge を出力します。
二つ目は、operaを実行します。

つまり、シェルスクリプトなどでどこまでも拡張することができます。

・・・しかし、私はxchatで呼ばれたら30秒間echoするくらいしか書いてなかったり。
システムトレイが無いため、呼ばれたことに気づかないので作りました。



alert_xchat 

#!/bin/bash
ratpoison -c "echo ===================You_got_a_message=================="
sleep 6
ratpoison -c "echo ===================You_got_a_message=================="
sleep 6
ratpoison -c "echo ===================You_got_a_message=================="
sleep 6
ratpoison -c "echo ===================You_got_a_message=================="
sleep 6
ratpoison -c "echo ===================You_got_a_message=================="
sleep 6


これだけです。
このファイルをパスの通っているところに置いて、xchatの音楽再生プログラムにこのスクリプトをセットし、サウンドファイル名は適当にtouchでもしたものを指定すれば動作します。

など、便利なratpoisonですが、難点の一つに ウィンドウが常に最大化状態 ということがあります。

gimpを使おうと思うと、複数のウィンドウが全て最大化されてしまうため、ツールボックスなど全てがが最大化 orz
分割をうまく使えばどうにか使えますが、使いやすいとは言えませんし、キャンパスを前画面にして、その上にツールボックスを配置するのは無理です。

ratpoisonもここまでか・・・

いえ、諦めてはいけません。
とりあえず、

C-t : tmpwm fluxbox

を打ってください。(fluxboxは別にgnome-sessionでもなんでもいいです)
そうすれば一時的に別のウィンドウマネージャが使用できます。

使い慣れた環境でgimpを使えます。
作業が終了したらratpoisonに戻って、快適な作業へ。

作者本人も、ratpoisonで全てをまかなうつもりは無い。と言っていますので、便利なところだけ使用すればいいわけです。

以上、簡単な紹介でした。


さて、このratpoisonはかなり便利に使えますが、癖が強いのでWindoze万歳な人やマウス大好きな人にはお勧めできませんが

キーボード大好き
GNU Screen大好き
マウスが鬱陶しい
トラックポイント大好きだけど、使えない環境
タッチパッドが使いにくい
KDEとか重すぎ(Windoze V何とかは論外)
メニューをちまちま選択するなんて面倒
ウィンドウの切り替えにAlt-tabなんて打ちにくい
alt-shift-tabとか論外
Windozeアレルギー

な人におすすめです。(なお、以上のリストは私の個人的な主観に基づいたものなので、100%信用しないでください)

その他、タイル型WMと言えばいくつかありまして、その中でもawesomeはかなり良さそうでしたが、キーがWindozeキー+何かなので、止めました。やはり、2ストロークホームポジションから手が離れないのが最高なので。

とりあえずつかってみてください。100人に1人くらいは気に入るかと思います。