Hatena::Groupcadr

kozima の日記

2011-04-03

emacs から StumpWM の eval を呼ぶ

| 11:28

.stumpwmrc を編集しているときに,とりあえず書いてみたものを評価したいと思うことがあったのでできるようにしました。

文字列を投げつける部分

stumpish を使うとよいようなので shell-command で呼び出してみました。結果は短ければミニバッファに,長ければ *Shell Command Output* バッファに現れるようです。

(defun mylib-stumpwmrc-eval-region (start end)
  (interactive "r")
  (let ((string (buffer-substring-no-properties start end)))
    (shell-command (format "echo %S | stumpish -e eval"
                           (format "(progn %s)" string)))))

(defun mylib-stumpwmrc-eval-last-sexp ()
  (interactive)
  (save-excursion
    (let ((start (progn (backward-sexp 1) (point)))
          (end (progn (forward-sexp 1) (point))))
      (mylib-stumpwmrc-eval-region start end))))

あんまりテストしてないのですが,C-x C-e で直前の式の評価, C-c C-r でリージョンの評価ができるつもり。

モード作った

わざわざ M-x からコマンド名を打ち込むのも手間なので,おざなりながらモードを作りました。

最初はマイナーモードとして作っておいて lisp-mode-hook に引っかければいいと思ったんですが,それだと slime とキーバインディングが衝突しました。slime-mode を呼ぶかどうかをファイル名を見て判断するように修正するとか,slime-mode の後で呼ばれるように順序を調整するという手も考えられますが,それもあんまりきれいな解決方法じゃない気がするし,それよりもメジャーモードにしてしまうのが早いだろうということでメジャーモードに。

(defvar mylib-stumpwmrc-mode-map (make-sparse-keymap))
(define-key mylib-stumpwmrc-mode-map "\C-x\C-e" 'mylib-stumpwmrc-eval-last-sexp)
(define-key mylib-stumpwmrc-mode-map "\C-c\C-r" 'mylib-stumpwmrc-eval-region)

(defun mylib-stumpwmrc-mode ()
  (interactive)
  (let ((lisp-mode-hook nil))
    (lisp-mode))
  (use-local-map mylib-stumpwmrc-mode-map))

(add-to-list 'auto-mode-alist '("\\.stumpwmrc$" . mylib-stumpwmrc-mode))

r_takaishir_takaishi2011/05/02 08:51StumpWMでswankサーバを起動して,slimeで接続すればいいと思うのですが,何か問題があるのでしょうか.もしあるなら教えて頂きたいです.

2011-04-02

StumpWM で起動時にウィンドウの配置を復元したい

| 15:19

起動してからグループを作って分割してウィンドウを移動させて,という作業が面倒なので勝手にやってくれないかなーという試み。やりたいことは http://cadr.g.hatena.ne.jp/g000001/20100507/1273145273 とだいたい同じです。

グループの分割状態の復元

これは g000001 さんと同じですが,

dump-desktop .stummpwm.d/default-desktop

などとやってファイルに書き出しておいて,restore-from-file で復元します。

ところで restore したときに Default っていうグループがファイルに書いてなくても消えない気がするんですが,そういうものでしょうか。

ウィンドウの場所の復元

本当は前回の終了時に起動していたものをあった場所に置くのがよいのだと思いますが,どうやればできるかすぐにはわかりそうになかったので,とりあえず代替手段を探していたら Rule Based window Placement というのがマニュアルにあったので試してみることに。

特定の条件を満たすウィンドウが,指定したグループの指定したフレームに送られるようにするみたいです。適当なファイルに

;; (group-name frame-number raise lock ...)

(("Default" 0 NIL T :CLASS "Emacs")

("Default" 1 NIL T :CLASS "Gnome-terminal")

("Default" 1 NIL T :CLASS "Firefox")

("skype" 0 NIL T :CLASS "Skype")

)

とか書いて restore-window-placement-rules で設定します。:CLASS にプログラム名を capitalize して指定すればうまくいくことが多いみたいです。

ウィンドウの振り分けルールを設定するだけなので,自動でいろんなのが立ち上がったりするわけではありません。

まとめ

全体の流れとしては,

  1. dump-desktop する (下の例では .stumpwm.d/default-desktop へ出力)
  2. window placement rule を書く (下の例では .stumpwm.d/default-placement に記述)
  3. .stumpwmrc で restore する

という感じになります。

ということで,.stupwmrc にこんな設定を追加してみました。フックを使ってるのは :loadrc したときには何もしないほうがいいかなと思うので。

(defun stumpwm-default-startup ()
  (restore-from-file (data-dir-file "default-desktop"))
  (restore-window-placement-rules (data-dir-file "default-placement"))

  ;; 必要に応じていろいろする
  (run-shell-command "xrdb ~/.Xresources")
  (run-shell-command "gnome-settings-daemon")
  (run-shell-command "gnome-terminal")
  ;; (run-shell-command "firefox")
  ;; (run-shell-command "emacs")
  ;; (run-shell-command "skype")
  )

(add-hook *start-hook* 'stumpwm-default-startup)

詳しいことはわからない部分もあるのですが,とりあえず適当にやったらそれっぽく動くようになった感じです。もっと頑張って調べれば,よりいい感じになるのかもしれません。