5225


Emacs に標準で搭載されている関数で、 `switch-to-buffer`
でバッファを切り替えるようになっているものの動作をポップアップするように変更したいです。（具体的には
[eww](http://www.emacswiki.org/emacs/eww) の動作をポップアップするようにしたい）

そのために、以下のプログラムを試みました。

[code]

    (defadvice eww (around ad-eww activate)
      (let ((switch-to-buffer 'display-buffer))
       ad-do-it))
    
[/code]

これで [eww](http://www.emacswiki.org/emacs/eww) を呼び出したときに、全ての `switch-to-buffer`
は `display-buffer` に置き換わると思ったのですが、しかしこれでは挙動が変更されません。

何かアドバイスの使い方に誤解があるのでしょうか。

* * *

コードを質問の回答を参考に修正してみました。

[code]

    (defadvice switch-to-buffer (around eww-popwin activate)
      (let ((name
             (typecase buffer-or-name
               (string buffer-or-name)
               (buffer (buffer-name buffer-or-name)))))
        (if (string-equal name "*eww*")
            (display-buffer buffer-or-name)
          ad-do-it)))
    
[/code]


CC BY-SA 3.0
2015-01-24T18:33:20.063
5224
2015-01-24T23:03:02.073
2015-01-24T23:03:02.073
4978
7768
question
emacs elisp
popwin.el でバッファ切り替えをポップアップに変更したい


Emacs Lisp や Common Lisp などの Lisp-2 と呼ばれる Lisp 方言では、シンボルに値用のセルと関数用のセルがあります。
`let` は値用のセルに束縛する特殊フォームですので期待した通りの動作になりません。

関数用のセルを変更するには

[code]

    (fset 'switch-to-buffer (symbol-function 'display-buffer))
    
[/code]

とする必要がありますが、変更が永続するためおすすめできません。

`cl.el` の `flet`（`cl-flet` ではありません）を利用すると一時的に関数セルを動的スコープで束縛できます。

[code]

    (flet ((switch-to-buffer (&rest args) (apply 'display-buffer args)))
      ...)
    
[/code]

ただ、これもあまりお行儀の良いものとは言えないでしょう。

一つの案は `switch-to-buffer` 自体を `defadvice` して渡されたバッファが `eww` のものであれば代わりに
`display-buffer` を呼ぶというものです。（疑似コードで示します）

[code]

    (defadvice switch-to-buffer (around eww-popwin ...)
      (if (eww-buffer? buffer)
          (display-buffer buffer)
        ad-do-it))
    
[/code]

`eww` のソースを少し読んでみましたが（`eww-setup-buffer`）、フックポイントがない以上、回避策を取らざるを得ないと思われます。

更新:

上記の方法はうまくいかないようです。代わりに `eww-render` を `defadvice`
する方法を考えました。手元では一応動作しているように見えます。

[code]

    (defadvice eww-render (around eww-render-popwin activate)
      (save-window-excursion ad-do-it)
      (unless (get-buffer-window "*eww*")
        (pop-to-buffer "*eww*")))
    
[/code]

イシューを作っておきました。

<https://github.com/m2ym/popwin-el/issues/118>


CC BY-SA 3.0
2015-01-24T19:13:38.557
5225
2015-01-24T20:51:06.993
2015-01-24T20:51:06.993
7769
7769
5224
answer