Emacs'ta mevcut olanın dışındaki tüm arabellekleri kapatın


92

Emacs'ta mevcut ara bellek dışında tümünü nasıl kapatırım? Modern web tarayıcılarındaki "Diğer sekmeleri kapat" özelliğine benzer mi?

Yanıtlar:


101

Daha manuel bir yaklaşım için, tüm arabellekleri ile listeleyebilir, listedeki arabellekleri ile C-x C-bsilinmek üzere işaretleyebilir dve sonra xbunları kaldırmak için kullanabilirsiniz .

Ben de daha gelişmiş ibuffer ile liste tampon değiştirilmesini tavsiye: (global-set-key (kbd "C-x C-b") 'ibuffer). Yukarıdakiler ibuffer ile çalışacaktır, ancak bunu da yapabilirsiniz:

m(tutmak istediğiniz tamponu
tişaretleyin)
D( geçiş işaretleri) (tüm işaretli tamponları kapatın)

Ayrıca, bu manuel yaklaşımı daha da kolaylaştıracak olan Emacs Wiki'den bu pasajı kullanıyorum:

;; Ensure ibuffer opens with point at the current buffer's entry.
(defadvice ibuffer
  (around ibuffer-point-to-most-recent) ()
  "Open ibuffer with cursor pointed to most recent buffer name."
  (let ((recent-buffer-name (buffer-name)))
    ad-do-it
    (ibuffer-jump-to-buffer recent-buffer-name)))
(ad-activate 'ibuffer)

Nasıl dönebilirim ibuffer? @phils
alper

1
Ne istediğinden emin değilim ama belki q? C-h mDiğer modlarda olduğu gibi tuş bağlamalarını öğrenmek için kullanın .
phils

53

Gönderen EmacsWiki: Tamponlar Öldürme :

(defun kill-other-buffers ()
    "Kill all other buffers."
    (interactive)
    (mapc 'kill-buffer 
          (delq (current-buffer) 
                (remove-if-not 'buffer-file-name (buffer-list)))))

Düzenleme : Gilles'ten gelen geri bildirimlerle güncellendi


3
Kirlenmiş tampon neden öldürülmüyor? Bunu da kaldırmayı seviyorum
swdev

dired arabellekleri ayarlanmaz buffer-file-nameve bu nedenle remove-if-notyukarıdaki örnekte yapılan çağrı, yönlendirilmiş arabellekleri (ayrıca çalışma arabelleği, terim arabellekleri, yardım arabellekleri vb., bir dosyayı ziyaret etmeyen her şeyi) korur. Hem dosya arabelleklerini hem de yönlendirilmiş arabellekleri kapatacak kolay bir test düşünemiyorum, temelde yönlendirilmiş tamponlar için farklı bir testle birlikte ikinci bir mapc çağrısına ihtiyacınız olacak.
robru

aynı zamanda yönlendirilen tamponları öldürmek için basit bir değişiklik (defun kill-other-buffers () "Kill all other buffers." (interactive) (mapc 'kill-buffer (delq (current-buffer) (remove-if-not '(lambda (x) (or (buffer-file-name x) (eq 'dired-mode (buffer-local-value 'major-mode x)))) (buffer-list)))))
frinkr

Görünüşe göre bu videoda adam bunu yapabiliyor. GNU arabelleklerini ve diğerlerini kapatırken yeni bir Slime arabelleği açar. Bunu nasıl yaptığı hakkında bir fikrin var mı? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

Değiştirme cl-remove-if-notile remove-if-notişler ama bu öldürmez *helm..tamponlarını
alper

21

Bunu doğrudan emacs'ta yapmanın bir yolu yok.

Bunu yapmak için bir fonksiyon yazabilirsiniz. Aşağıdakiler tüm arabellekleri kapatır:

(tüm arabellekleri kapat ()
  (etkileşimli)
  (mapc 'öldürme tamponu (arabellek listesi)))

4
Ah, ama bu tüm tamponları kapatacak .
Sridhar Ratnakumar

(delete (current-buffer) (buffer-list))size eşleştirebileceğiniz kill-bufferve mevcut arabelleği öldürmekten kaçınabileceğiniz bir arabellek listesi vermelidir .
NickD

16

Yerleşik bir komut var m- x kill-some-buffers(24.3.50 kullanıyorum) Sonraki adımda gui'mde (bir terminalde denenmedi, ancak benzer olduğundan emin olun) daha sonra hangi tamponların kapatılacağını onaylayabilirsiniz.


2
Bu, özellikle yüklü 1000'den fazla tamponunuz olduğunda kullanışlıdır.
ocodo

11
 (defun only-current-buffer () 
   (interactive)
   (let ((tobe-killed (cdr (buffer-list (current-buffer)))))
     (while tobe-killed
       (kill-buffer (car tobe-killed))
       (setq tobe-killed (cdr tobe-killed)))))

Beklediğiniz gibi çalışıyor.

@ Starkey'in cevabını okuduktan sonra, bunun daha iyi olacağını düşünüyorum:

(defun only-current-buffer () 
  (interactive)                                                                   
    (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))

(arabellek listesi (geçerli-arabellek)), mevcut arabellek listenin başında olacak şekilde tüm mevcut arabellekleri içeren bir liste döndürür.

Bu, StackOverflow'daki ilk cevabım. Umarım yardımcı olur :)


2
Ve arkadaşlarım, fikirlerini paylaşan insanlardan zarif çözümlerin ortaya
Chris Clark

Ben değil; detaylı teknik gerekse bile biliyorum buffer-listyılda ancak değiştirilen (buffer-list (current-buffer))işe yukarıdaki cevabı olacak anlaşılacağı gibi DEĞİL çalışır. Do C-h f buffer-list RETcari spec.
NickD

4

Bu çözümü en basit olanı buldum. Bu, geçerli olan dışındaki tüm arabelleği siler. Bu kodu .emacsdosyanıza eklemelisiniz

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

Tabii ki, o zaman onu birlikte kullanırsınız M-x kill-other-buffers RET veya aşağıdaki kodu .emacsdosyaya da yapıştırırsınız ve ardındanC-xC-b

(global-set-key (kbd "C-x C-b") 'kill-other-buffers)

1

Ben ettik kullanım püf noktası-öldürme-diğer-tamponlar birkaç ay.

Ama diredilmiş tamponların da silinmesini istiyorum. @ Euge's ve @ wenjun.yan'ın cevapları bunu çözüyor. Ancak özel arabellekleri silecektir (örneğin * git-kimlik bilgisi-önbellek - daemon *, * çizik *, dümen işlemi vb.). Ben de bu (güncel) çözümü buldum.

(defun aza-kill-other-buffers ()
  "Kill all buffers but current buffer and special buffers"
  (interactive)
  (dolist (buffer (delq (current-buffer) (buffer-list)))
    (let ((name (buffer-name buffer)))
      (when (and name (not (string-equal name ""))
             (/= (aref name 0) ?\s)
             (string-match "^[^\*]" name))
        (funcall 'kill-buffer buffer)))))

Dan esinlenerek öldürme eşleştirme-tamponları . İsterseniz, conditiondışlamak için diğer arabellek adı üzerine daha fazlasını ekleyebilirsiniz .

Umarım yardımcı olur :)


Bkz bu benim geliştirilmiş çözüm için.
azzamsa

0

Bunu da beğenebilirsiniz - şu anki * Mesajlar * ve * çizik * hariç tüm arabellekleri öldürün (bunlara sahip olmak kullanışlı, onlara "araç seti" diyorum), gereksiz pencereleri de kapatın, hangi pencerede hangi pencerede olduğunuzu yaşayın tampon.

(defun my/kill-all-buffers-except-toolbox ()
  "Kill all buffers except current one and toolkit (*Messages*, *scratch*). Close other windows."
  (interactive)
  (mapc 'kill-buffer (remove-if
                       (lambda (x)
                         (or
                           (string-equal (buffer-name) (buffer-name x))
                           (string-equal "*Messages*" (buffer-name x))
                           (string-equal "*scratch*" (buffer-name x))))
                       (buffer-list)))
  (delete-other-windows))

(string-equal (buffer-name) (buffer-name x))aynı şey (eq x (current-buffer)), sadece daha az verimli. Kalan orbasitleştirilebilir(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.