Asial Blog

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

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

カテゴリ :
バックエンド(インフラ)
タグ :
Tech
タイル型WM
Linux
Debian
stumpwm
stumpwmとは、タイル型ウィンドウマネージャの一種。
ratpoisonの後継でcommon lispで実装されています。
Cで書かれたratpoisonより若干重くはなりますが、拡張性に優れており、設定ファイルもcommon lispでかけるのでいろいろと便利。

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

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

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

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

2・インストール
  1. $ sudo apt-get install stumpwm
以上。
common lispだとかいろいろ入ります。

3・設定
設定ファイルは ~/.stumpwmrc にcommon lispで記述します。
  1. ;; -*- lisp -*-
  2. (in-package :stumpwm)
  3. (setf *shell-program* "/bin/zsh")
  4. ;; 色
  5. (set-fg-color "#000000")
  6. (set-bg-color "#FFFFFF")
  7. (set-border-color "#000000")
  8. ;; フォーカスがあるウィンドウの色
  9. ;; デフォルトは白ですが、何か自己主張が激しい(?)ので暗い赤に
  10. (set-focus-color "#883333")
  11. ;; フォーカスが無いのは暗い青に
  12. (set-unfocus-color "#333388")
  13. ;; フォント
  14. (set-font "-xos4-terminus-bold-r-normal--14-140-72-72-c-0-iso8859-7")
  15. ;; あらかじめグループを作成しておく
  16. (run-commands "gnewbg 1")
  17. (run-commands "gnewbg 2")
  18. (run-commands "gnewbg 3")
  19. (run-commands "gnewbg 4")
  20. (run-commands "gnewbg 5")
  21. (run-commands "gnewbg 6")
  22. (run-commands "gnewbg 7")
  23. (run-commands "gnewbg 8")
  24. (run-commands "gnewbg 9")
  25. (run-commands "gnewbg 10")
  26. ;; 1番を選択
  27. (run-commands "gselect 1")
  28. ;; 以下、独自コマンド
  29. ; urxvt起動
  30. (defcommand urxvt () ()  (run-shell-command "urxvt"))
  31. ; 音楽プレーヤのコントロール
  32. ; audio_ctlはシェルスクリプトで、
  33. ; playが渡されたら rhythmbox-client --play 実行するように書いている
  34. (defcommand mprev () ()  (run-shell-command "audio_ctl prev"))
  35. (defcommand mplay () ()  (run-shell-command "audio_ctl play"))
  36. (defcommand mpause () ()  (run-shell-command "audio_ctl pause"))
  37. (defcommand mstop () ()  (run-shell-command "audio_ctl stop"))
  38. (defcommand mnext () ()  (run-shell-command "audio_ctl next"))
  39. (defcommand mshuffle () ()  (run-shell-command "audio_ctl shuffle"))
  40. (defcommand mrepeat () ()  (run-shell-command "audio_ctl repeat"))
  41. (defcommand volup () ()  (run-shell-command "audio_ctl volup"))
  42. (defcommand voldown () ()  (run-shell-command "audio_ctl voldown"))
  43. (defcommand mnotify () ()  (run-shell-command "audio_ctl notify"))
  44. ; music
  45. (define-key *root-map* (kbd "M-z") "mprev")
  46. (define-key *root-map* (kbd "M-x") "mplay")
  47. (define-key *root-map* (kbd "M-c") "mpause")
  48. (define-key *root-map* (kbd "M-v") "mstop")
  49. (define-key *root-map* (kbd "M-b") "mnext")
  50. (define-key *root-map* (kbd "M-s") "mshuffle")
  51. (define-key *root-map* (kbd "M-r") "mrepeat")
  52. (define-key *root-map* (kbd "C-0") "volup")
  53. (define-key *root-map* (kbd "C-9") "voldown")
  54. (define-key *root-map* (kbd "x") "mnotify")
  55. ; term
  56. (define-key *root-map* (kbd "C-c") "urxvt")
  57. (define-key *root-map* (kbd "c") "urxvt")
  58. ; colon
  59. ; stumpwmのデフォルトはセミコロンなため、コロンに変更して置く
  60. (define-key *root-map* (kbd "C-:") "colon")
  61. (define-key *root-map* (kbd ":") "colon")
  62. ;; group
  63. ;; M-Fxで切り替え *top-map* とすることでシングルストロークで実行出来る
  64. (define-key *top-map* (kbd "M-F1") "gselect 1")
  65. (define-key *top-map* (kbd "M-F2") "gselect 2")
  66. (define-key *top-map* (kbd "M-F3") "gselect 3")
  67. (define-key *top-map* (kbd "M-F4") "gselect 4")
  68. (define-key *top-map* (kbd "M-F5") "gselect 5")
  69. (define-key *top-map* (kbd "M-F6") "gselect 6")
  70. (define-key *top-map* (kbd "M-F7") "gselect 7")
  71. (define-key *top-map* (kbd "M-F8") "gselect 8")
  72. (define-key *top-map* (kbd "M-F9") "gselect 9")
  73. (define-key *top-map* (kbd "M-F10") "gselect 10")
  74. (define-key *root-map* (kbd ",") "gmove")
  75. ;; window
  76. ;; 今いるウィンドウが分かりずらかったため書いてみた
  77. ;; 慣れれば必要ない
  78. (defcommand sfnext () () (run-commands "fnext" "echo #########################################
  79. #########################################
  80.       C U R R E N T F R A M E
  81. #########################################
  82. #########################################
  83. "))
  84. (define-key *root-map* (kbd "C-b") "sfnext")
  85. (define-key *root-map* (kbd "b") "sfnext")
  86. ; カーソルキーでフォーカス切り替え
  87. (define-key *top-map* (kbd "M-Left") "move-focus left")
  88. (define-key *top-map* (kbd "M-Right") "move-focus right")
  89. (define-key *top-map* (kbd "M-Up") "move-focus up")
  90. (define-key *top-map* (kbd "M-Down") "move-focus down")
  91. ; vim風のキーバインドでフォーカス切り替え
  92. (define-key *top-map* (kbd "C-M-h") "move-focus left")
  93. (define-key *top-map* (kbd "C-M-l") "move-focus right")
  94. (define-key *top-map* (kbd "C-M-k") "move-focus up")
  95. (define-key *top-map* (kbd "C-M-j") "move-focus down")
  96. ; FPS風(?)のキーバインドでフォーカス切り替え(左手だけで変更可能にするため)
  97. (define-key *top-map* (kbd "C-M-a") "move-focus left")
  98. (define-key *top-map* (kbd "C-M-d") "move-focus right")
  99. (define-key *top-map* (kbd "C-M-w") "move-focus up")
  100. (define-key *top-map* (kbd "C-M-s") "move-focus down")
そこそこ長くなった割にあまり詳しいことしてないですが、参考までに。

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

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

  1. clear Mod1
  2. keycode 101 = Alt_R Meta_R
  3. add Mod1 = Alt_L Alt_R
xmodmapの設定はこんな感じです。

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

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

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

  1. "2.3.1 (created: 2010/04/07 18:56:53)
  2. set runtimepath=/home/yuji/.vimperator
  3. source! /home/yuji/.vimperatorrc.local
  4. " vim: set ft=vimperator:
  5. map A H
  6. map S j
  7. map D L
  8. map W k
  9. map Q 
  10. map E 

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

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