kiwanami/emacs-window-manager — Issue #12: 提案: e2wm:c-recordable-buffer-p から window 情報にアクセス可能に
Author: tkf
Created: 2012-03-01 23:07:13+00:00
State: open

e2wm:c-recordable-buffer-p に以下のような設定をして使っています。 window 情報 (`wm`, `wname`) をとるために長々とコードを書かなければいけないので、 window 関連の変数にアクセス可能だと、大変楽になります。

あと、関連していくつか提案があります:

1. buf 引数を与えるより、 current buffer をセットして eval してはどうですか。 buffer-local-value をいちいち呼ぶよりは、きれいに書けると思います。

2. これから先、引数が増えるかもしれないことを考えると、 lambda よりクオートした progn と dynamical binding を使ってはどうでしょうか。 1. の提案とも整合性がとれます。

3. あまり関連してませんが、 `e2wm:pst-get-wm` を呼ぶときにいつでも(e2wm 管理下になくても)エラーが出ないようにして欲しいです。 以下のコードでは e2wm:pst-get-instance で条件分けてますが、これがないと e2wm をスタートするときに、まだe2wm管理下にないので、エラーでこけてしまいます。

```lisp
(setq e2wm:c-recordable-buffer-p
(lambda (buf)
(let* ((name (buffer-name buf))
(wm (when (e2wm:pst-get-instance) (e2wm:pst-get-wm)))
(bufwin (get-buffer-window buf))
(wname (when (and wm bufwin)
(wlf:get-window-name wm bufwin))))
(and
;; record only if shown in "non-sub" window
(not (memq wname '(sub)))
(or
;; specify some recordable buffers
(equal "*Ibuffer*" name)
(string-match "\\*Python\\[.*\\]*" name)
(equal "*IPython*" name)
(equal "*info*" name)
(equal "*Help*" name)
(equal "*Simplenote*" name)
;; specify some recordable major modes
(memq (buffer-local-value 'major-mode buf)
'(dired-mode))
;; support org indirect buffers
(and (equal (buffer-local-value 'major-mode buf) 'org-mode)
(string-match "\\.org-[0-9]*$" name))
(and
;; buffer is associated with a file
(buffer-local-value 'buffer-file-name buf)
;; buffer name is not something like "*BUFFER-NAME*"
(not (string-match "^ *\\*.*\\* *$" name))
;; buffer does not end with ".org_archive"
(not (string-match "\\.org_archive$" name))))))))
```