ปิดบัฟเฟอร์ที่ทิ้งไว้ทั้งหมด


23

บางครั้งรายการบัฟเฟอร์ของฉันมีมากกว่า 10 windows และฉันใช้buffer-menuเพื่อทำเครื่องหมายและฆ่าทั้งหมดด้วยตนเอง มีวิธีที่เร็วกว่าในการปิดหน้าต่างที่เปิดทั้งหมดหรือไม่


ฉันยอมรับคำตอบที่ตอบคำถามมากที่สุดโดยตรง อย่างไรก็ตามฉันได้เริ่มใช้การป้องกันออนซ์แทนแล้ว: emacs.stackexchange.com/a/1041/93
nispio

คำตอบ:


32

คุณสามารถทำสิ่งต่อไปนี้:

M-x ibuffer

* / เพื่อทำเครื่องหมายบัฟเฟอร์ในโหมด dired

D เพื่อลบ


1
ฉันไม่เคยได้ยิน ibuffer มาก่อน ฉันจะทำแผนที่C-x C-bให้ibufferแน่นอน
nispio

นอกจากนี้คุณยังสามารถกดt( dired-toggle-marks) เพื่อทำเครื่องหมายทั้งหมด (หากไม่ได้ทำเครื่องหมายไว้ก่อนหน้านี้)
caisah

@caisah dired-toggle-marksเป็นชื่อของคำสั่งdired การกดtจะเป็นการสลับเครื่องหมายทั้งหมดใน ibuffer แต่บัฟเฟอร์ที่ไม่ต้องใช้มักจะมีจำนวนมากกว่าบัฟเฟอร์ที่ dired ดังนั้นการสลับจะไม่สมเหตุสมผลในบริบทนี้
nispio

@nispio คุณพูดถูก ผมไม่ทราบว่าทำไม แต่ผมคิดว่าบัฟเฟอร์ทั้งหมดถูกdired ...
caisah

1
หมายเหตุ: สิ่งนี้จะทำงานไม่ถูกต้องเมื่อไม่มีบัฟเฟอร์ dired เนื่องจาก D จะไม่ใช้กับบัฟเฟอร์ dired แต่กับบัฟเฟอร์แรกในรายการ
daniel kullmann

10

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

นี่คือตัวอย่างการตั้งค่ากลุ่มตัวกรอง:

(setq-default ibuffer-saved-filter-groups
              `(("Default"
                 ;; I create a group call Dired, which contains all buffer in dired-mode
                 ("Dired" (mode . dired-mode))
                 ("Temporary" (name . "\*.*\*"))
                 )))

จากนั้นC-x C-bเปิดibufferหน้าต่างคุณจะเห็นสิ่งนี้:

example1

เลื่อนเคอร์เซอร์ไปที่[ Dired ](ด้วยM-p, M-n) จากนั้นกดdเพื่อทำเครื่องหมายว่าลบ

example2

จากนั้นกดxเพื่อดำเนินการ

ฉันชอบวิธีนี้เพราะฉันไม่จำเป็นต้องคิดว่าฉันควรผูกกุญแจของฉันกับฟังก์ชั่นใหม่อย่างไรและบัฟเฟอร์ของฉันก็จัดได้ดีขึ้น


กลุ่มตัวกรองไม่แสดงสำหรับฉันเมื่อฉันเปิดตัวครั้งแรกibufferหลังจากประเมินรหัสของคุณ ฉันต้องกดปุ่ม/ R(ผูกติดกับibuffer-switch-to-saved-filter-groups) เพื่อให้ได้กลุ่ม
itsjeyd

(ibuffer-switch-to-saved-filter-groups "Default")คุณสามารถเพิ่มบรรทัดของรหัสนี้ลงในตะขอ ibuffer ชื่อกลุ่มตัวกรองควรมีการเปลี่ยนแปลงหากไม่ได้เป็นDefault
Rangi Lin

1
ใช่นั่นคือสิ่งที่ฉันทำลงไป ไม่ทราบเกี่ยวกับกลุ่มตัวกรองก่อนอ่านคำตอบของคุณขอบคุณที่พูดถึงพวกเขา;)
itsjeyd

10

คุณมีบัฟเฟอร์ Dired มากมายเพราะคุณต้องการให้พวกเขาทั้งหมดในจุดเดียว? IOW คุณต้องการสร้างแต่ละรายการเป็นบัฟเฟอร์แยกกันหรือไม่

หากไม่เป็นเช่นนั้นวิธีแก้ปัญหาคือง่าย: ให้บอก Dired เพื่อใช้บัฟเฟอร์ Dired ที่มีอยู่แล้วซ้ำอีกครั้งเมื่อคุณกดRETชื่อไดเรกทอรีเพื่อเปิดใน Dired

นี่คือวิธีการทำ:

  1. โหลดไลบรารีDired + ( dired+.el):

    (require 'dired+)
    
  2. บอก Dired เพื่อนำบัฟเฟอร์ Dired ไปใช้ซ้ำ:

    (diredp-toggle-find-file-reuse-dir 1)
    

ผลกระทบคือเมื่อคุณกดRET(หรือคลิกเมาส์) ในไดเรกทอรีใน Dired find-alternate-fileจะถูกใช้ดังนั้นบัฟเฟอร์ Dired ดั้งเดิมจะถูกแทนที่ (ลบ) โดยอันใหม่

คุณสามารถสลับพฤติกรรมนี้ได้ทุกเมื่อโดยใช้C-M-R(aka C-M-S-r) ใน Dired


นี่คือทางออกที่ฉันได้ตัดสินในตอนนี้ ฉันไม่เคยต้องการบัฟเฟอร์ Dired 20 ที่เปิดในครั้งแรก ขอขอบคุณที่แนะนำ (และสร้าง)
nispio

ลิงก์ตายไปแล้วรับ 404: (
Zelphir Kaltstahl

1
@Zelphir: ขอบคุณสำหรับหัวขึ้น ควรจะตกลงตอนนี้ (Emacs Wiki เปลี่ยน URL โดยทั่วไปดังนั้นโพสต์เก่า ๆ เช่นนี้จึงมีลิงก์ที่เสียหาย)
Drew


5

คุณยังสามารถใช้helm-mini:

  • M-x helm-miniวิ่ง
  • พิมพ์ลงในพรอมต์: *Di(คำบางคำสำหรับDired, ไม่จำเป็นต้องใส่เพิ่มเติม) ขณะที่คุณพิมพ์บัฟเฟอร์จะถูก จำกัด แบบค่อยเป็นค่อยไป ตอนนี้เหลือเพียงDiredบัฟเฟอร์เท่านั้น กดM-aเพื่อทำเครื่องหมายทั้งหมด
  • กดTABสวิทช์ไปที่เมนูการกระทำและกดเพื่อเลือกการกระทำKKill buffer(s)
  • กดRETเพื่อดำเนินการแอ็คชัน

ข้อดีก็helm-miniคือมันสามารถแทนที่ Emacs ปกติได้C-x bดังนั้นคุณไม่ต้องใช้การเชื่อมโยงคีย์สองครั้งหนึ่งครั้งสำหรับการสลับบัฟเฟอร์และอีกอันสำหรับผู้จัดการบัฟเฟอร์จริง helm-miniคือทั้งหมดในหนึ่งเดียว อ่านเพิ่มเติมในหางเสือขนาดเล็กคำแนะนำของฉัน

helm-miniยังสามารถจับคู่บัฟเฟอร์ฟัซซี่และอนุญาตให้เปิดหลายบัฟเฟอร์ด้วยการทำเครื่องหมายด้วยC-SPCหรือM-a(ยืนสำหรับM ark a ll) นอกจากนี้คุณยังสามารถ จำกัด บัฟเฟอร์ให้แคบลงได้โดยการต่อท้าย@รูปแบบตัวอย่างเช่น@testหมายถึงเลือกเฉพาะบัฟเฟอร์เท่านั้นที่มีสตริง "test"


1

ฉันจะลองสิ่งนี้:

(require 'dash)

(defun my-kill-dired-buffers ()
  (interactive)
  (kill-some-buffers
   (-filter (lambda (buffer)
              (save-excursion
                (set-buffer buffer)
                (eq major-mode 'dired-mode)))
            (buffer-list))))

1
ฉันเชื่อว่า-filterต้องการdash.elจาก MELPA คุณควรระบุว่าเป็นข้อกำหนด
Vamsi

1

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

แต่โดยทั่วไปการพูดibufferทำให้การใช้งานบัฟเฟอร์เป็นจำนวนมากเป็นเรื่องง่ายตามที่ฟรานซิสโกแนะนำ


1

หากคุณใช้Iciclesคุณสามารถใช้C-x kเพื่อฆ่าบัฟเฟอร์ Dired ทั้งหมดหรือบัฟเฟอร์ทั้งหมดในโหมดที่กำหนด

หลังจากกดปุ่มC-x kใช้C-x M +เพื่อเก็บบัฟเฟอร์ด้วยโหมดที่แน่นอนเท่านั้น กดเพื่อดูรูปแบบและเลือกTAB dired-modeจากนั้นใช้C-!เพื่อฆ่าทั้งหมดของบัฟเฟอร์ด้วยโหมดที่

C-x k C-x M + dired-mode C-!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.