列出与文件关联的缓冲区?

List buffers associated with files?

我对使用 lisp 还很陌生,如果这是一个微不足道的问题,我很抱歉。经过一段时间的谷歌搜索后,我一直无法找到解决方案,但我确信这是我的错。

所以。我正在尝试编写一个命令来恢复所有打开的缓冲区。简单的。我只是

(setq revert-without-query (buffer-list))
(mapc 'revert-buffer (buffer-list))` 

不幸的是,如果有任何缓冲区不与文件关联——也就是说,总是这样,这最终会失败。

对列表缓冲区执行 C-x C-b 会打印类似

的内容
CRM   Buffer        Size  Mode            File
      init.el       300   Emacs-lisp      ~/.spacemacs.d/init.el
      %scratch%      30   Test            

好的。很容易。如果允许我混合使用 lisp 和 python,我会做类似

的事情
(setq revert-without-query [b for b in buffer-list if b.File != ""])
;; Or would I test for nil? Decisions, decisions...

经过一番挖掘,我发现存在remove-if。不幸的是,作为 lisp 的新手,我不知道如何访问列表、它们的属性,或者……好吧……任何东西。介意帮帮我吗?

一种可能性是检查 buffer-file-name 如果缓冲区没有访问文件,它将 return 为 nil,例如

(cl-loop for buf in (buffer-list)
   if (buffer-file-name buf)
   collect buf)

(cl-remove-if-not 'buffer-file-name (buffer-list))

您可能还想恢复目录。任何类型的缓冲区都可以有自己专门的还原(参见 revert-buffer-function)。所以你可能想检查 buffer-file-namedired-directory 是否非零。

(dolist (b (buffer-list))
  (when (buffer-live-p b)
    (with-current-buffer b
      (when (or buffer-file-name dired-directory)
        (revert-buffer 'ignore-auto 'noconfirm)))))

您也可以使用 ignore-errors 锤子,但最好在遇到极端情况时修复它们。