2017-07-15 63 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錘子,但你可能會更好過,你遇到他們固定的角落案件。