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
またはプルーニングするまで壊れる危険があります。私がどのように知っているか聞いてください!