kiwanami / emacs-window-manager

Customizable window manager for emacs
229 stars 28 forks source link

提案: e2wm:c-recordable-buffer-p から window 情報にアクセス可能に #12

Open tkf opened 12 years ago

tkf commented 12 years ago

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

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

  1. buf 引数を与えるより、 current buffer をセットしてはどうですか。 buffer-local-value をいちいち呼ぶ必要がなくなったり、関数によっては引数が省略できるので、きれいに書けると思います。
  2. これから先、引数が増えるかもしれないことを考えると、 lambda よりクオートした progn と dynamical binding を使ってはどうでしょうか。 1. の提案とも整合性がとれます。
  3. あまり関連してませんが、 e2wm:pst-get-wm を呼ぶときにいつでも(e2wm 管理下になくても)エラーが出ないようにして欲しいです。 以下のコードでは e2wm:pst-get-instance で条件分けてますが、これがないと e2wm をスタートするときに、まだe2wm管理下にないので、エラーでこけてしまいます。
(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))))))))
kiwanami commented 12 years ago

ありがとうございます。1のcurrent-bufferと3はそのとおりだと思いました。 2は引数を変えて非互換にしてもいいかなと思っているのですが、 具体的な変更後の形がちょっとよく分からなかったのでもう少し教えてもらってもいいでしょうか?

tkf commented 12 years ago

こんな感じ↓で使うイメージです。特に let 内がシンプルになります。 e2wm:current-window-name を新しく dynamical binding 変数として導入することを想定してみました。

(setq e2wm:c-recordable-buffer-p
      '(progn  ; quote された、 eval 可能な式を入れる (2)
        (let* ((name (buffer-name)) ; 引数なしで呼べる (1)
               (wname e2wm:current-window-name))  ; dynamical binding (2)
          (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 major-mode     ; buffer-local-value 省略可 (1)
                  '(dired-mode))
            ;; support org indirect buffers
            (and (equal major-mode 'org-mode) ; buffer-local-value 省略可 (1)
                 (string-match "\\.org-[0-9]*$" name))
            (and
             ;; buffer is associated with a file
             buffer-file-name ; buffer-local-value 省略可 (1)
             ;; 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))))))))
tkf commented 12 years ago

よく見たら progn 必要ないですね...

kiwanami commented 12 years ago

コード例示ありがとうございます。 dynamic bind で自由変数を束縛するという事にして、 quote ではなくて引数なしの lambda でもいいですか? 結局同じなんですが、関数はlambdaというふうに統一したほうがわかりやすいかなと思っている人なので。すいません。

tkf commented 12 years ago

いえ、lambdaでも良いと思います。最近 el-get で似たような変更があってそちらで progn を使っていたのでそれを提案してみました。

tkf commented 12 years ago

ちなみに、他の場所で prev-selected-buffer っていう dynamic bind 変数使ってますが、これは e2wm: プレフィックス付けて defvar しておいたほうが良くないですか? warning 減らせますし。あと、そういう予定があるかは知りませんが、 lexical scope で動かすには defvar が必要だったと思います。

kiwanami commented 12 years ago

いろいろ情報ありがとうございます! lexical scopeにそんな制限があるとはしりませんでした。defvar つけます。