簡體   English   中英

如何在emacs的緩沖區列表中恢復緩沖區?

[英]How can I revert the buffer at point in emacs' buffer list?

我正在嘗試創建一個將從emacs' *Buffer List*緩沖區恢復緩沖區的函數。 據我從文檔中可以看出,沒有辦法快速執行此操作(以buff-menu.el內置的save / mark / visit函數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."))
        )))))

不幸的是,上述修改似乎不起作用,我無法弄清楚原因。 如果我評估上述內容,請切換到*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 - 我不想打破緩沖區菜單。

請記住,答案可能是“調用您忽略的這個功能”,我怎樣才能實現其目的,即直接從緩沖區菜單中恢復緩沖區?


更新:正如回答者肖恩指出的那樣,我正在努力工作的函數的正確名稱是具有大寫字母B的Buffer-menu-buffer 。修復了這個問題后,我遇到了另一個問題:

  (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嘗試保存當前緩沖區,並且這是*Buffer List*上的*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直到你zorch foo-mode-hook或修剪破碎的元素。 問我怎么知道!

我的Emacs有一個函數Buffer-menu-buffer ,但沒有buffer-menu-buffer 我想這就是絆倒你的原因。

編輯:

我發現你的代碼還有兩個問題,之后我可以用它來恢復緩沖區菜單中的緩沖區。

  • 我不得不在兩個地方改變(buf)buf buf是一個變量,而不是一個調用的函數。
  • (let (()) ...)構造會導致錯誤。 消除它,或將其改為(let () ...) (雖然我不知道你為什么要這樣做)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM