読者です 読者をやめる 読者になる 読者になる

opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

StumpWMを使い始めてみた

これまではi3wmを使ってたけど流石にテキストファイルでの設定なので限界を感じて、最近Common Lispが好きなのもあってStumpWMというCommon Lisp製のWMに乗り換える試み。
今日はインストール方法とか簡単な設定方法だけメモ。

Install stumpwm

普通ならpacmanやAURから入れるのが良いのだろうが、stumpwmは手動でインストールした。一応AURにもあるが今回は使わなかった。というのも、日本語ArchWikiが手動インストールを推奨していたのと、common lispの依存パッケージのインストールがmakepkgだと不安だったというのもある。

コンパイルはrootユーザーで行う。
基本的にはstumpwmのREADMEに書かれている方法でビルドする。

# pacman -S sbcl

clisp上でも動くらしいがパフォーマンス重視でsbclで動かす。

# curl -O http://beta.quicklisp.org/quicklisp.lisp
# sbcl --load quicklisp.lisp

これでsbclのREPLが起動するので

* (quicklisp-quickstart:install)
* (ql:add-to-init-file)

これでquicklispのインストールが終わる。.sbclrcには書かなくても良い気もするがまあ別にいいかと思って書いた。

* (ql:quickload "clx")
* (ql:quickload "cl-ppcre")

これで依存関係のインストールが終わる。REPLを終了する。

# git clone https://github.com/stumpwm/stumpwm.git
# cd stumpwm

# autoconf
# ./configure --prefix=/usr/stumpwm --with-lisp=sbcl &&make 
# make install

これで/usr/stumpwm/bin/stumpwmとしてバイナリが生成される。

起動

xinitrcなどに

exec /usr/stumpwm/bin/stumpwm

と書き込んでおけばstumpwmが起動する。

基本的な使い方

特に何もいじってないデフォルト状態だとprefixはC-tになっている。C-tと何かのキーを押すことでいろいろなコマンドを実行できる。
C-tは初期ではemacsともかぶらないし押しやすい位置なのでそのまま使う。(tmuxと被ってて私は泣きましたが)
C-tのあとに呼び出し可能なショートカットはroot-mapという変数に格納されているようだ。

root-mapに割り当てられているキーバインド

C-t(prefix)を入力したあとに入力することで認識する。
このショートカットはStumpWMの公式ドキュメントをかなり適当に日本語に訳したもの。

コマンド実行及びアプリケーションの呼び出し

指定したコマンドを実行したり、アプリケーションを起動するためのコマンド

C-e, e => emacs起動
C-!    => shellコマンド実行
C-;    => stumpwmのコマンドを実行
C-:    => S式を評価
C-c,c  => xtermを起動  
C-g    => C-tをキャンセルする用途に使える。いわゆるAbortの為のキー  
C-a,a  => 現在の日付や時間を表示  

Window関係

Window関係のコマンド。Windowは特別な意味はなくてみんながよく知る通常通りの意味(だと思う)。

d      => dには数値(0~9)が入る。その番号のWindowに切り替える
C-d    => dには数値(0=9)が入る。その番号のWindowを現在のフレームに移動する  
SPC    => windowを順番に切り替える(C-n, nでも同じ意味)
C-p,p  => 一つ前の順番のWindowに戻る。(SPCと逆周り)
'      => 名前を指定してそのWindowに移動  
"      => 一覧から移動先のWindowを選択して移動  
i      => 現在のWindowの情報を表示
C-w,w  => 現在のWindowの一覧を表示(表示するだけ)

Frame関係

画面の垂直・水平分割はフレームという単位で行われる。フレームを分割することで、Windowを複数表示できる。EmacsでいうならWindowがbufferならFrameがEmacsのWindowに当たる(気がする)

s      => 垂直に現在のフレームを分割する
S      => 水平に現在のフレームを分割する
C-k,k  => 現在のフレームで走ってるプログラムに終了シグナルを送る
C-K    => SIGKILLを現在のフレームで走っているプログラムに送る
Left
Right
Up
Down   => カーソルキーを使ってフレームを移動できる
Tab,o  => フレームを順番に移動する
R      => 現在のフレームを削除する  
Q      => 現在のフレームを除いてすべてのフレームを削除する  
-      => すべてのフレームを隠してroot windowを表示する  

グループ関係

いわゆる仮想スクリーンのようなことはグループを使って実現できる。
グループは少なくとも実用的な範囲で無数に作ることができる。

G      => すべてのグループとそのWindow一覧を表示する
g g    => すべてのグループを表示する
g c    => 新しいグループを作成
g n    => グループリスト順に次のグループに移動する(g SPCとか他にもいろいろある)
g N    => グループリスト順に次のグループに移動するが、その時現在のwindowも移動させる
g p    => グループリスト順に一個前のグループに移動する
g P    => g Nと逆に、一個前のグループに移動して、現在のWindowも移動させる
g '    => グループ名またはグループ番号で指定されたグループに移動
g "    => グループリストから移動するグループを選択して移動
g m    => 現在のWindowを指定されたグループに移動させる
g k    => 現在のグループを削除して、Windowをすべて次のグループに移動させる
g A,g R=> 現在のグループ名を変更する
g d    => dは整数(0~9)。dの番号のグループに移動する  

他にもあるけど、とりあえず今日はこれだけ。

終了

stumpwmを終了するにはquitコマンドを使うと良い

C-t ;

これでコマンド入力できるようになるので

quit

と入力すれば良い。

設定

設定ファイルは~/.stumpwm.d/init.lispに書くと良さそう。設定ファイルは後々長くなることが予想できるので、ファイルを分割してloadで読み込むようにすると良いかもしれない。

全部の設定を載せるの長くなるので、簡単な例として、i3wm風にするためにいくつかのグループを予め作っておいて、1段のショートカットで簡単にWindowを切り替えれるようにする設定の例。
もっと良い書き方があるかもしれないが、何分Common Lispもstumpwmのnoobなのでしょうがないね。

例えば、groupの設定は

(in-package :stumpwm)

(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 0")
(run-commands "gnewbg Emacs")

;; launch applications
(run-commands "gselect Emacs")
(run-or-raise "emacs -T Emacs" '(:class "Emacs"))

;; to default group 1
(run-commands "gselect 1")

stumpwmが提供する関数などはstumpwmパッケージで定義されているので、in-packageでstumpwmに入って設定すると良い。
RUN-COMMANDはstumpwmのコマンドを実行する。gnewbgは新しいグループを作る(切り替えは行わない)ためのコマンドである。
1番目のグループはDefaultという名前で最初から作成されるので、2から作っていく。

最後にEmacs用のグループもついでに作成している。こうするとC-t eなどでEmacsを起動するとき毎回起動せずに、起動済みEmacsに移動するような設定を書ける。
また、Emacsを起動するコードも記載しておく。run-or-raiseを使ってこのように書くとemacsを起動時に一回だけ起動してくれる。(もちろん故意に起動すればいくらでも起動できる)

で、キーバインドを次のようにしてみた。

;; Clear C-[number]
(undefine-key *top-map* (kbd "M-1"))
(undefine-key *top-map* (kbd "M-2"))
(undefine-key *top-map* (kbd "M-3"))
(undefine-key *top-map* (kbd "M-4"))
(undefine-key *top-map* (kbd "M-5"))
(undefine-key *top-map* (kbd "M-6"))
(undefine-key *top-map* (kbd "M-7"))
(undefine-key *top-map* (kbd "M-8"))
(undefine-key *top-map* (kbd "M-9"))
(undefine-key *top-map* (kbd "M-0"))
(undefine-key *top-map* (kbd "M-o"))

;; group select key binds
(define-key *top-map* (kbd "M-1") "gselect 1")
(define-key *top-map* (kbd "M-2") "gselect 2")
(define-key *top-map* (kbd "M-3") "gselect 3")
(define-key *top-map* (kbd "M-4") "gselect 4")
(define-key *top-map* (kbd "M-5") "gselect 5")
(define-key *top-map* (kbd "M-6") "gselect 6")
(define-key *top-map* (kbd "M-7") "gselect 7")
(define-key *top-map* (kbd "M-8") "gselect 8")
(define-key *top-map* (kbd "M-9") "gselect 9")
(define-key *top-map* (kbd "M-0") "gselect 0")
(define-key *top-map* (kbd "M-o") "gother")

キーマップはdefine-keyを使って定義でき、undefine-keyで解除できる。
キーを登録する前に念の為undefine-keyを使う。この2つをセットで行うようなマクロか何かを作ってもいいかもしれないが今回はやってない。

root-mapに登録するとC-tの後に押すことが前提になる。C-tを使わない場合はtop-mapに登録する。
もちろん他のアプリケーションとかぶる可能性が格段に上がるのであまりtop-mapを使うのはおすすめできないが...
ちなみに後で気がついたがこれだとFirefoxのタブ切り替えとかぶる気がするが、まあ私はそんなに使わないので気にしないことにした。

Emacsも、初期設定だとC-t eまたはC-t C-eを押すたびに新しいemacsを起動するので、C-t eの場合はEmacsグループに起動済みのEmacsに飛ぶようにしてみた。C-t C-eはそのまま。

;; call emacs
(undefine-key *root-map* (kbd "C-e"))
(undefine-key *root-map* (kbd "e"))
(define-key *root-map* (kbd "C-e") "exec emacs")
(define-key *root-map* (kbd "e") "gselect Emacs")

コマンドを作る

新しいコマンドを作るにはdefcommandが使える。
例えば、notify-sendなどのコマンドを使ってnotifyを送るようなコマンドを作りたいなら

(defcommand notify-to-twmnd (title content)
  ((:string "title > ") (:string "content > "))
  (run-shell-command (concatenate 'string "notify-send " title " " content) nil))

見たいな感じで作れる。
Emacsのコマンド呼び出しと同じように、C-t ;でコマンドを指定した後に引数を対話形式で指定するために、defcommandの3つ目のパラメータには例のようなリストを指定する。
他にも数値なんかを受け取ることもできるが、そのへんの詳細は公式のドキュメントを参照。

StumpWM Manual: 3. Commands

終わり

今日はとりあえずこの辺で終わり。
多分あんまりこういう記事は書かないけど、何か苦労した設定があればまた何か書くかもしれない。

最近Qiitaを始めてみたので、そっちにもメモってる。

StumpWMで設定ファイルをreloadする - Qiita

StumpWMでtwmnを使う - Qiita

どっちに書くかは今のところ完全に気分なのでなんとも...

Firefox ブラウザ無料ダウンロード