2014-01-30 40 views
0

我試圖編寫一個函數來根據其他窗口中的緩衝區是否綁定了一個文件,不。在emacs lisp中寫入kill-or-bury-other-buffer

它有時似乎有效,並不總是選擇其他窗口中的緩衝區來殺死。 我使用錯誤的功能或功能錯誤嗎?

(defun kill-or-bury-other-buffer() 
    (interactive) 
    (let* ((other-buf (window-buffer (other-window 1 nil))) 
     (other-has-file (buffer-file-name other-buf)) 
     (buf-action (if other-has-file 
          'bury-buffer 
         'kill-buffer))) 
    (funcall buf-action other-buf)))) 

回答

1

另外的什麼@legoscia點,我覺得你的代碼將使用save-selected-window更簡單:

(defun kill-or-bury-other-buffer() 
    (interactive) 
    (save-selected-window 
    (other-window 1) 
    (if buffer-file-name 
     (bury-buffer) 
     (kill-buffer)))) 
+0

我見這個緩衝區文件名是一個變量以及一個函數 - 在elisp中這很常見嗎?例如(我知道命名空間被拆分) – Squidly

+0

這並不罕見,例如許多次要模式都有一個功能來切換它們和一個具有相同名稱的變量來存儲切換的狀態。 – juanleon

2

功能other-window開關到另一窗口,並返回nil。由於(window-buffer nil)返回當前窗口的緩衝區,調用(window-buffer (other-window 1 nil))會因爲重合而返回另一個窗口的緩衝區。您可能需要使用next-window。 (我不知道這解釋了爲什麼功能殺死了錯誤的緩衝區,雖然)。