2017-07-15 67 views
2

我很新使用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和蟒蛇,我会做这样的事情

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

在一些挖,我发现存在remove-if。不幸的是,对于lisp来说全新的,我不知道如何访问列表,它们的属性,或者......以及任何东西。帮我解决问题?

回答

4

一种可能性是检查buffer-file-name如果缓冲区没有访问文件,它将返回零,例如。

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

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

你可能想也恢复dired目录。任何类型的缓冲区都可以拥有自己的专用还原(请参阅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锤子,但你可能会更好过,你遇到他们固定的角落案件。