ปิดบัฟเฟอร์ทั้งหมดนอกเหนือจากบัฟเฟอร์ปัจจุบันใน Emacs


92

ฉันจะปิดบัฟเฟอร์ทั้งหมดยกเว้นบัฟเฟอร์ปัจจุบันใน Emacs ได้อย่างไร คล้ายกับคุณลักษณะ "ปิดแท็บอื่น ๆ " ในเว็บเบราว์เซอร์สมัยใหม่หรือไม่

คำตอบ:


100

สำหรับวิธีการแบบแมนนวลเพิ่มเติมคุณสามารถแสดงรายการบัฟเฟอร์ทั้งหมดด้วยC-x C-bทำเครื่องหมายบัฟเฟอร์ในรายการเพื่อลบด้วยdจากนั้นใช้xเพื่อลบออก

ผมยังแนะนำให้เปลี่ยนรายการบัฟเฟอร์กับ ibuffer (global-set-key (kbd "C-x C-b") 'ibuffer)ที่สูงขึ้น: ข้างต้นจะใช้ได้กับ ibuffer แต่คุณสามารถทำได้:

m(ทำเครื่องหมายบัฟเฟอร์ที่คุณต้องการเก็บไว้)
t(เครื่องหมายสลับ)
D(ฆ่าบัฟเฟอร์ที่ทำเครื่องหมายไว้ทั้งหมด)

ฉันยังใช้ตัวอย่างนี้จาก Emacs Wiki ซึ่งจะช่วยปรับปรุงแนวทางด้วยตนเองนี้เพิ่มเติม:

;; 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)

ฉันจะกลับจากibufferที่ไหน? @phils
alper

1
ฉันไม่แน่ใจว่าคุณกำลังถามqอะไรแต่อาจจะ? ใช้C-h mเพื่อเรียนรู้การเชื่อมโยงคีย์เช่นเดียวกับโหมดอื่น ๆ
Phils

53

จากEmacsWiki: Killing Buffers :

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

แก้ไข : อัปเดตพร้อมข้อเสนอแนะจาก Gilles


3
ทำไมบัฟเฟอร์ dired ถึงไม่ถูกฆ่า? ฉันต้องการลบมันออกด้วย
swdev

ไม่ได้ตั้งค่าบัฟเฟอร์ dired buffer-file-nameดังนั้นการเรียกไปยังremove-if-notในตัวอย่างข้างต้นจะรักษาบัฟเฟอร์ที่ต้องใช้ (เช่นเดียวกับบัฟเฟอร์รอยขีดข่วนบัฟเฟอร์คำบัฟเฟอร์ความช่วยเหลือ ฯลฯ สิ่งใดก็ตามที่ไม่ได้เข้าชมไฟล์) ฉันไม่สามารถนึกถึงการทดสอบง่ายๆที่จะปิดทั้งบัฟเฟอร์ไฟล์และบัฟเฟอร์ dired คุณต้องมีการเรียก mapc ครั้งที่สองโดยทั่วไปด้วยการทดสอบที่แตกต่างกันสำหรับบัฟเฟอร์ dired
robru

การปรับเปลี่ยนง่ายๆในการฆ่าบัฟเฟอร์ที่ (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)))))
ทำให้แห้งด้วย

ดูเหมือนว่าในวิดีโอนี้ชายคนนั้นจะทำได้ เขาเปิดบัฟเฟอร์สไลม์ใหม่ในขณะที่ปิดบัฟเฟอร์ GNU และอื่น ๆ คุณมีความคิดว่าเขาทำอย่างไร? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

การเปลี่ยนcl-remove-if-notที่มีremove-if-notผลงาน แต่ไม่ได้ฆ่า*helm..บัฟเฟอร์
Alper

21

ไม่มีวิธีโดยตรงใน emacs ที่จะทำสิ่งนี้

คุณสามารถเขียนฟังก์ชันเพื่อทำสิ่งนี้ได้ สิ่งต่อไปนี้จะปิดบัฟเฟอร์ทั้งหมด:

(ยกเลิกบัฟเฟอร์ปิดทั้งหมด ()
  (เชิงโต้ตอบ)
  (mapc 'kill-buffer (รายการบัฟเฟอร์)))

4
อ่า แต่นี่จะปิดบัฟเฟอร์ทั้งหมด
Sridhar Ratnakumar

(delete (current-buffer) (buffer-list))ควรให้รายการบัฟเฟอร์ที่คุณสามารถแมปkill-bufferข้ามและหลีกเลี่ยงการฆ่าบัฟเฟอร์ปัจจุบัน
NickD

16

มีคำสั่งในตัวm- x kill-some-buffers(ฉันใช้ 24.3.50) ในขั้นตอนถัดไปของฉัน (ไม่ได้ลองในเทอร์มินัล แต่แน่ใจว่ามันคล้ายกัน) จากนั้นคุณสามารถอนุมัติบัฟเฟอร์ที่จะฆ่าได้


2
สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณโหลดบัฟเฟอร์มากกว่า 1,000 รายการ
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)))))

ทำงานตามที่คุณคาดไว้

และหลังจากอ่านคำตอบของ @ Starkey ฉันคิดว่าสิ่งนี้จะดีกว่า:

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

(buffer-list (current-buffer)) จะส่งคืนรายการที่มีบัฟเฟอร์ที่มีอยู่ทั้งหมดโดยมีบัฟเฟอร์ปัจจุบันอยู่ที่ส่วนหัวของรายการ

นี่คือคำตอบแรกของฉันใน StackOverflow หวังว่าจะช่วยได้ :)


2
และนี่คือเพื่อนของฉันคือวิธีแก้ปัญหาที่ยอดเยี่ยมเกิดขึ้นจากผู้คนที่แบ่งปันความคิดของพวกเขา
Chris Clark

ฉันไม่รู้ว่าข้อกำหนดสำหรับการbuffer-listเปลี่ยนแปลงในช่วงหลายปีที่ผ่านมา แต่(buffer-list (current-buffer))การทำงานตามคำตอบข้างต้นระบุว่าจะใช้ไม่ได้ ทำC-h f buffer-list RETเพื่อสเป็คปัจจุบัน
NickD

4

ฉันพบว่าวิธีนี้เป็นวิธีที่ง่ายที่สุด ซึ่งจะลบทุกบัฟเฟอร์ยกเว้นบัฟเฟอร์ปัจจุบัน คุณต้องเพิ่มรหัสนี้ใน.emacsไฟล์ของคุณ

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

แน่นอนว่าคุณใช้ร่วมกับM-x kill-other-buffers RET หรือวางรหัสต่อไปนี้ใน.emacsไฟล์ด้วยแล้วกดC-xC-b

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

1

ฉันใช้crux-kill-other-buffersมาหลายเดือนแล้ว

แต่ฉันต้องการลบบัฟเฟอร์ dired ด้วย คำตอบของ @ Euge และ @ wenjun.yan ช่วยแก้ปัญหานี้ได้ แต่จะลบบัฟเฟอร์พิเศษ (เช่น * git-credential-cache - daemon *, * scratch *, helm operation และอื่น ๆ ) ผมจึงคิดวิธีแก้ปัญหา (ปัจจุบัน) ขึ้นมา

(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)))))

แรงบันดาลใจจากการฆ่าจับคู่บัฟเฟอร์ คุณสามารถเพิ่มเติมได้conditionชื่อบัฟเฟอร์อื่น ๆ เพื่อยกเว้นได้หากต้องการ

หวังว่าจะช่วยได้ :)


ดูสิ่งนี้สำหรับโซลูชันที่ปรับปรุงแล้วของฉัน
azzamsa

0

คุณสามารถชอบอันนี้ได้เช่นกัน - ฆ่าบัฟเฟอร์ทั้งหมดยกเว้นอันปัจจุบัน * ข้อความ * และ * รอยขีดข่วน * (ซึ่งมีประโยชน์ฉันเรียกพวกเขาว่า "ชุดเครื่องมือ") ปิดหน้าต่างที่ซ้ำซ้อนเช่นกันใช้ชีวิตของคุณที่หน้าต่างเดียวซึ่งปัจจุบัน กันชน.

(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))ก็เหมือนกับ(eq x (current-buffer))ประสิทธิภาพน้อยกว่า ส่วนที่เหลือorสามารถทำให้ง่ายขึ้น(member (buffer-name x) '("*Messages*" "*scratch*"))
Stefan

-4

นี่คือสิ่งที่คุณต้องการ:

C-x 1

แหล่งที่มา: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/


1
ผมคิดว่าเหตุผลที่คุณได้ลงโหวตถูก OP ที่ขอให้อื่น ๆ ใกล้เคียงบัฟเฟอร์ไม่หน้าต่าง คำศัพท์ Emacs อาจทำให้สับสนเล็กน้อย
fengshaun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.