如何在不访问缓冲区的情况下在 Emacs 中保存缓冲区?

How can I save a buffer in Emacs without visiting it?

内置命令 list-buffers 创建一个名为 *Buffer List* 的缓冲区,可以使用 C-x C-s。有什么方法可以自动执行此操作,以便我可以输入 list-buffers-to-file 之类的内容并自动创建输出文件,而不必离开我正在使用的缓冲区?

当我执行 list-buffers 时,我正在工作的 window 被拆分,一个名为 *Buffer List*[= 的缓冲区27=] 出现在下部窗格中。然后我必须 C-x o 移动到 *Buffer List* 缓冲区并保存它,然后 C-x o 回到我正在工作的缓冲区并键入 C-x 1 以删除另一个窗格。我想避免拆分 window,实际上根本不需要查看 *Buffer List* 缓冲区,但我不知道该怎么做.所有的缓冲区保存 elisp 命令似乎只在当前缓冲区上工作,这意味着必须离开我正在工作的缓冲区。似乎没有像 save-other-buffer 这样的命令 缓冲区名称 要保存的文件。有什么办法可以做到这一点吗?

这应该可以满足您的要求。

(defun save-buf-list (&optional arg)
  "Write `list-buffers' output to file `~/somewhere/my-buflist.txt'.
A prefix arg is handled as in `list-buffers'."
  (interactive "P")
  (with-current-buffer (list-buffers-noselect arg)
    (write-file "~/somewhere/my-buflist.txt")))

如果您希望能够将缓冲区写入不同的文件,您可以为 FILE 添加一个 arg 并首先提示它。

要自己查找,请检查定义 list-buffers 的代码(C-h f list-buffers,然后单击文件名)。该命令仅使用以下代码定义:

(display-buffer (list-buffers-noselect arg))

所以你知道 list-buffers-noselect 必须 return 一个缓冲区(这正是 display-buffer 所需要的)。 C-h f list-buffers-noselect` 证实了这一点。

那么您只需要知道如何将给定缓冲区写入给定文件即可。 write-file 当前 缓冲区写入文件。宏 with-current-buffer 使用给定的缓冲区电流进行操作。