2011-02-23 37 views
13

這裏是我的問題: 我使用Emacs,並得到大量的緩衝區是沒什麼用的時候,比如*郵件*或*完井*。殺死緩衝區的名字開始與一個特定的字符串

欲\ C-Y結合以關閉,與開始的所有緩衝區*除了*殼*(和* *殼< K>)緩衝器。

爲了做到這一點,我想補充一些的Emacs Lisp的在我的.emacs文件:

(defun string-prefix s1 s2 
    (if (> (string-length s1) (string-length s2)) nil 
    (string=? s1 (substring s2 0 (string-length s1))))) 

(defun curry2 
    (lambda (f) 
    (lambda (x) 
     (lambda (y) 
    (f x y))))) 

(defun filter 
    (lambda (f l) 
    (if (null? l) '() 
     (let ((rest (cdr l))) 
    (if (f (car l)) (cons (car l) rest) 
     rest))))) 


(defun kill-useless (arg) 
    (interactive "p") 
    (map 'kill-buffer 
     (filter 
    (not ((curry2 string-prefix) "*shell*")) 
    (list-buffers) 
    ))) 

(global-set-key "\C-y" 'kill-useless) 

我使用計劃和filter似乎非常簡單已經測試string-prefixcurry2。 可悲的是我不能讓kill-useless正常工作。

它說filter: Invalid function: (curry2 string-prefix)。現在

,事情是我種吮吸的Emacs Lisp的,我真的不使用任何的Lisp除了計劃和方案(MIT),這個工程:

(filter ((curry2 string-prefix?) "*shell") '("*shell*" "*sh22" "eel")) 
;Value 5: ("*shell*") 

我想:

  1. 辦法解決我的代碼上如何做到這一點以不同的方式

感謝

  • 建議!

  • +1

    開頭的'*郵件*'緩衝區是有用的:每次Emacs的告訴你,它讓它在那裏,所以你可以例如複製並粘貼到谷歌找到一個解決方案在谷歌。還要當心,當你可能會使用某種模式(如magit)來以一種有用的方式使用這樣的緩衝區。 – 2011-02-24 09:59:39

    +0

    是的,我最終還是保留了這個緩衝區。謝謝你的提示! – 2011-02-24 18:30:28

    回答

    11

    另一種方法:

    (require 'cl) 
    
    (defun is-useless-buffer (buffer) 
        (let ((name (buffer-name buffer))) 
        (and (= ?* (aref name 0)) 
         (not (string-match "^\\*shell\\*" name))))) 
    
    (defun kill-useless-buffers() 
        (interactive) 
        (loop for buffer being the buffers 
         do (and (is-useless-buffer buffer) (kill-buffer buffer)))) 
    
    +0

    +1。太好了! – ataylor 2011-02-23 23:00:54

    +0

    我最喜歡這種方法。我還在檢查中添加了\ * Messages *緩衝區。恭喜肖恩!你贏了:) 另外,'(需要'cl')究竟做了什麼? – 2011-02-24 18:28:33

    +0

    它引入了Emacs的Common Lisp包,這是一個(非常方便)「循環」宏所在的地方。整個軟件包非常有用;我的.emacs文件中的第一行是(require'cl)。請參閱http://www.gnu.org/software/emacs/manual/html_mono/cl.html – Sean 2011-02-24 19:21:55

    5

    記住elisp的不是方案,甚至是Common Lisp的。語法和語義是不同的。例如,defun需要括號括起來的參數列表。另外,在elisp中,咖喱並不是真的可能。

    幸運的是,elisp的對你最想做什麼建宏。對於string-prefix,您可以使用內建的string-prefix-p。對於filter,可以使用remove-if-notremove-if作爲逆。

    爲了討好你可以使用apply-partially內置函數。爲了得到以前綴"*shell*"匹配字符串的函數,嘗試這樣的事情:

    (apply-partially 'string-prefix-p "*shell*") 
    

    您可以使用它像這樣:

    (mapcar 
    (apply-partially 'string-prefix-p "*shell*") 
    '("*shell*" "foo" "*shell*<2>")) 
    
    ; results in 
    (t nil t) 
    
    (require 'cl) ; for remove-if 
    (remove-if 
    (apply-partially 'string-prefix-p "*shell*") 
    '("*shell*" "foo" "*shell*<2>")) 
    
    ; results in 
    ("foo") 
    
    +0

    非常感謝您的支持,但是我給了我一個工作解決方案的人。試圖擺弄這個工作不會太有趣! – 2011-02-24 18:32:26

    25

    ˚Fkill-matching-buffersRET

    kill-matching-buffers是一個inte ractive在 `files.el'中編譯Lisp函數。

    (殺匹配緩衝器REGEXP &可選的內部-TOO)

    殺緩衝器,其名稱指定REGEXP匹配。 可選的第二個參數指示是否殺死內部緩衝區。

    +2

    對於內置函數+1,雖然如何使用它的實際示例會更有幫助。 – 2011-02-24 18:29:58

    +2

    它不斷詢問我是否想關閉每個緩衝區(即使未修改) - 是否有辦法避免這種情況? – Zitrax 2014-01-28 12:07:25

    +0

    Zitrax:http:// stackoverflow。com/a/10931190/324105 – phils 2014-01-28 19:49:44

    0

    它可以是一個好主意,看看你會刪除它之前刪除,爲了穩妥起見。

    冰柱,默認情況下C-x k是一個多命令,你可以用殺死任何數量的匹配您的小緩衝區輸入的緩衝區中。在這種情況下,您需要鍵入* TAB以查看以*開頭的所有緩衝區名稱作爲完成候選項。

    然後,您可以通過多種方式縮小比賽範圍。當剩餘的所有匹配都是你想要的,點擊C-!刪除所有這些緩衝區。

    在您提交的情況下,您不想刪除名爲*shell...的緩衝區。所以在* TAB之後,您將點擊S-SPC,然後輸入另一個匹配的模式:shell,然後S-TAB。那隻限於*shell...緩衝區,你做而不是想要殺死。然後你擊中C-~減去那些匹配(補足)。這會留下除緩衝區外的所有緩衝區。擊中C-!,他們全部遇難。

    您也可以通過在控制單擊*Completions*C-mouse-2中的名稱來殺死單個緩衝區。

    更一般地,在冰柱多命令讀取緩衝區名稱可讓您使用S-delete(Shift + Delete鍵)殺緩衝候選人。

    http://www.emacswiki.org/emacs/Icicles_-_Multi-Commands

    http://www.emacswiki.org/emacs/Icicles_-_More_About_Multi-Commands

    0

    我發現kill-matching-functions提示我要未修改的緩衝區,這不是我想要的東西。下面的函數將殺死匹配前綴的緩衝區(如問題的標題)。不完全是你想要的,但也許像我這樣來自Google的人會發現這很有用。

    (require 'cl) 
    (defun kill-buffers-with-prefix (prefix) 
        "Kill buffers whose names start with the given prefix" 
        (interactive "sPrefix to kill: ") 
        (loop for buffer in (buffer-list) 
         do (if (string-prefix-p prefix (buffer-name buffer)) 
           (kill-buffer buffer)))) 
    
    0

    要殺死所有其他緩衝區

    (defun px-kill-other-buffers() 
        "Kill all other buffers." 
        (interactive) 
        (mapc 'kill-buffer (delq (current-buffer) (buffer-list)))) 
    

    要搜索的字符串

    (defun string-starts-with-p (string prefix) 
        "Return t if STRING starts with prefix." 
        (and 
        (string-match (rx-to-string `(: bos ,prefix) t) string) 
        t)) 
    
    相關問題