Emacs में वर्तमान एक के अलावा सभी बफ़र्स बंद करें


91

मैं Emacs में सभी लेकिन वर्तमान बफ़र को कैसे बंद करूं? आधुनिक वेब ब्राउज़रों में "अन्य टैब बंद करें" सुविधा के समान है?

जवाबों:


99

अधिक मैन्युअल दृष्टिकोण के लिए, आप सभी बफ़र्स को सूचीबद्ध कर सकते हैं 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कीबाइंडिंग सीखने के लिए उपयोग करें , किसी अन्य मोड की तरह।
फिल्स

53

से EmacsWiki: हत्या बफ़र :

(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
क्यों बिंदास बफ़र को नहीं मारा जा रहा है? मुझे वह भी दूर करना पसंद है
रात 9:11

डेयर किए गए बफ़र्स सेट नहीं होते हैं buffer-file-nameऔर इस प्रकार remove-if-notउपरोक्त उदाहरण में कॉल, डेयर किए गए बफ़र्स (साथ ही स्क्रैच बफर, टर्म बफ़र्स, बफ़र्स की मदद करने, आदि, किसी भी चीज़ को फ़ाइल में नहीं आने) को संरक्षित करेगा। मैं एक आसान परीक्षण के बारे में नहीं सोच सकता जो दोनों फ़ाइल बफ़र्स और दिनांकित बफ़र्स को बंद कर देगा, आपको मूल रूप से मृगत बफ़र्स के लिए एक अलग परीक्षण के साथ मैपक के पूरे दूसरे आह्वान की आवश्यकता होगी।
डकैती

एक साधारण संशोधन भी मरने वाले बफ़र्स को मारने के लिए (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

ऐसा लग रहा है कि इस वीडियो में वह आदमी ऐसा करने में सक्षम है। वह GNU बफ़र्स और अन्य को बंद करते हुए एक नया स्लम बफर खोलता है। क्या आपके पास कोई विचार है कि वह ऐसा कैसे करता है? youtube.com/watch?v=BKFcznZ28BE&t=310s
MadPhysicist

जगह cl-remove-if-notके साथ remove-if-notकाम करता है, लेकिन इस को नहीं मार पाता *helm..बफ़र्स
alper

21

ऐसा करने के लिए सीधे emacs में कोई रास्ता नहीं है।

आप ऐसा करने के लिए एक फ़ंक्शन लिख सकते हैं। निम्नलिखित सभी बफ़र्स को बंद कर देगा:

(करीब-सभी बफर्स)
  (सहभागी)
  (मेप्स 'किल-बफर (बफर-सूची)))

4
आह, लेकिन यह सभी बफ़र्स को बंद कर देगा ।
श्रीधर रत्नाकुमार

14

एक अंतर्निहित कमांड है m- x kill-some-buffers(मैं 24.3.50 का उपयोग कर रहा हूं) मेरे अगले स्टेप गुई में (एक टर्मिनल में कोशिश नहीं की गई, लेकिन यकीन है कि यह समान है) फिर आप किस शौकीन को मारने के लिए मंजूरी दे सकते हैं।


2
यह विशेष रूप से तब उपयोगी है जब आपके पास 1000+ बफ़र्स लोड हो।
ओडोयो

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

यह आपकी अपेक्षा के अनुरूप काम करता है।

और @ स्टार्क के जवाब को पढ़ने के बाद, मुझे लगता है कि यह बेहतर होगा:

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

(बफ़र-सूची (वर्तमान-बफ़र)) एक सूची लौटाएगा जिसमें सभी मौजूदा बफ़र्स शामिल हैं, सूची के प्रमुख पर वर्तमान बफ़र के साथ।

StackOverflow पर यह मेरा पहला उत्तर है। आशा करता हूँ की ये काम करेगा :)


2
और यह मेरे मित्र हैं कि कैसे अपने विचारों को साझा करने वाले लोगों से सुरुचिपूर्ण समाधान
क्रिस क्लार्क

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

मैंने कुछ महीनों के लिए क्रूक्स-किल-अदर-बफ़र्स का उपयोग किया है ।

लेकिन मैं चाहता हूं कि डेयरिंग बफ़र्स भी डिलीट हो जाएं। @ Euge's और @ wenjun.yan के उत्तर इसे हल करते हैं। लेकिन यह विशेष बफ़र्स (जैसे * गिट-क्रेडेंशियल-कैश - डेमॉन *, * स्क्रैच *, हेल्म ऑपरेशन, और आदि) को हटा देगा। इसलिए मैं इस (वर्तमान) समाधान के साथ आया।

(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यदि आप चाहते हैं तो आप बाहर निकालने के लिए अन्य बफर-नाम पर जोड़ सकते हैं ।

आशा करता हूँ की ये काम करेगा :)


मेरे बेहतर समाधान के लिए इसे देखें ।
अज़मसा

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*"))
स्टीफन

-4

ये वो है जो तुम चाहते हो:

C-x 1

स्रोत: https://blasphemousbits.wordpress.com/2007/05/04/learning-emacs-part-4-buffers-windows-and-frames/


मुझे लगता है कि आपके द्वारा मतदान किए जाने का कारण यह था कि ओपी अन्य शौकीनों को बंद करने के लिए कह रहा है , न कि खिड़कियां । Emacs शब्दावली थोड़ी भ्रामक हो सकती है।
फेंगशुन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.