3

emacs のバッファーからバッファーを元に戻す関数を作成しようとしています*Buffer List*。ドキュメントからわかる限り、これをすばやく行う方法はありません (に組み込まれている保存/マーク/アクセス関数のようにbuff-menu.el)。だから私はいくつかのelispを書いています。これが私の現在の試みです:

(defun frobnitz ()
  "Call in buffer list to revert buffer at point to file."
  (interactive)
  (let ((buf (buffer-menu-buffer t)))
    (if (y-or-n-p (concat "Revert " (buffer-name (buf)) " ?"))
    (with-current-buffer buf
      (let (())
        (revert-buffer t t t)
        (message
          (concat "Reverted " (buffer-name (buf)) "to last saved state."))
        )))))

残念ながら、上記の defun は機能していないようで、その理由を理解するのに苦労しています。上記を評価し、*Buffer List*バッファに切り替えて を呼び出すM-: (frobnitz)と、次のエラーが発生します。

Debugger entered--Lisp error: (void-function buffer-menu-buffer)
  (buffer-menu-buffer t)
  (let ((buf (buffer-menu-buffer t))) (if (y-or-n-p (concat "Revert " (buffer-name (buf)) " ?")) (with-current-buffer buf (let (nil) (revert-buffer t t t) (message (concat "Reverted " (buffer-name (buf)) "to last saved state."))))))
  frobnitz()
  eval((frobnitz) nil)
  eval-expression((frobnitz) nil)
  call-interactively(eval-expression nil nil)

それは機能がないことを私に伝えているように思えます- しかし、バッファメニューを機能させるためのかなり中心的な機能であるため、それはbuffer-menu-buffer不当にもありそうにないようです! buffer-menu-buffer同様の理由で、私はbuffer-menu-buffer自分自身をいじることに深く警戒しています - 私はバッファメニューを壊したくありません.

答えは「あなたが見落としていたこの関数を呼び出す」かもしれないことを念頭に置いて、バッファメニューから直接バッファを元に戻すという宣言された目的を達成するために、この defun を取得するにはどうすればよいでしょうか?


更新:回答者の Sean が指摘しているように、私が苦労していた関数の正しい名前はBuffer-menu-buffer大文字のイニシャル B です。その問題を修正した後、別の問題に遭遇しました:

  (let (nil) (revert-buffer t t t) (message (concat "Reverted " buf-name "to last saved state.")))
  (save-current-buffer (set-buffer buf) (let (nil) (revert-buffer t t t) (message (concat "Reverted " buf-name "to last saved state."))))
  (with-current-buffer buf (let (nil) (revert-buffer t t t) (message (concat "Reverted " buf-name "to last saved state."))))
  (if (y-or-n-p (concat "Revert " buf-name " ?")) (with-current-buffer buf (let (nil) (revert-buffer t t t) (message (concat "Reverted " buf-name "to last saved state.")))))
  (let ((buf (Buffer-menu-buffer t)) (buf-name (concat "" (buffer-name (Buffer-menu-buffer t))))) (if (y-or-n-p (concat "Revert " buf-name " ?")) (with-current-buffer buf (let (nil) (revert-buffer t t t) (message (concat "Reverted " buf-name "to last saved state."))))))
  frobnitz()
  eval((frobnitz) nil)
  eval-expression((frobnitz) nil)
  call-interactively(eval-expression nil nil)

私の推測では、それwith-current-bufferは現在のバッファを保存しようとするものであり、それは no-no on*Buffer List*です。だから今、私は代替手段を探しています - おそらく、切り替え、元に戻し、呼び出し(buffer-list)て元に戻すだけです。


更新 2:

将来の読者のために: 機能する関数とそれを呼び出すための単一キーバインディングbuffer-menu-mode:

;; Enhance the buffer menu's capabilities.
(defun revert-buffer-from-buffer-list ()
  "Call in buffer list to revert buffer at point to file.

Bind this to a key in `buffer-menu-mode' to use it there - not productive in
other modes because it depends on the `Buffer-menu-buffer' function. Undefined
behavior if you invoke it on a buffer not associated with a file: that's why it
has a confirmation gate. Buffers not associated with files get to play by their
own rules when it comes to `revert-buffer' (which see)."
  (interactive)
  (let (
        (buf (Buffer-menu-buffer t))
        (buf-name (concat "" (buffer-name(Buffer-menu-buffer t))))
        )
    (if (y-or-n-p (concat "Revert " buf-name " ?"))
        (with-current-buffer buf
          (let ()
            (revert-buffer t t t)
            (message (concat "Reverted " buf-name " to last saved state."))
            )))))
(add-hook 'Buffer-menu-mode-hook
          (lambda ()
            (define-key Buffer-menu-mode-map (kbd "R") revert-buffer-from-buffer-list)
            ))

また、注意を促す:add-hookは冪等ではないため、foo-mode-hook意図しないものや機能しないものを追加すると、壊れた要素foo-modeをゾーチfoo-mode-hookまたはプルーニングするまで壊れる危険があります。私がどのように知っているか聞いてください!

4

1 に答える 1

4

私の Emacs には関数Buffer-menu-bufferがありますが、ありませんbuffer-menu-buffer。それがあなたをつまずかせていると思います。

編集:

コードにさらに 2 つの問題が見つかりました。その後、バッファ メニューからバッファを元に戻すことができました。

  • 私は2か所で 乗り換えなけれ(buf)ばなりませんでした。は変数であり、呼び出す関数ではありません。bufbuf
  • (let (()) ...)構成によりエラーが発生します。それを削除するか、変更して(let () ...)ください(ただし、なぜそうしたいのかわかりません)。
于 2012-08-07T23:14:36.153 に答える