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 : 버퍼를 죽이는 :

(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-notdired 버퍼 (스크래치 버퍼, 용어 버퍼, 도움말 버퍼 등, 파일을 방문하지 않는 모든 항목)가 보존됩니다. 파일 버퍼와 dired 버퍼를 모두 닫는 쉬운 테스트는 생각할 수 없습니다. 기본적으로 dired 버퍼에 대해 다른 테스트를 사용하여 mapc을 완전히 두 번째 호출해야합니다.
robru

간단한 수정도 dired 버퍼 죽일 (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 버퍼 및 기타 버퍼를 닫는 동안 새 Slime 버퍼를 엽니 다. 그가 어떻게 그랬는지 아십니까? 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 2010 년

(delete (current-buffer) (buffer-list))매핑 할 수있는 버퍼 목록을 제공 kill-buffer하고 현재 버퍼를 죽이지 않도록해야합니다.
NickD

16

내장 된 명령이 있습니다 m- x kill-some-buffers(24.3.50을 사용하고 있습니다) 다음 단계의 GUI (터미널에서 시도하지 않았지만 유사하다고 확신합니다)에서 죽일 버퍼를 승인 할 수 있습니다.


2
이것은 1000 개 이상의 버퍼가로드 된 경우 특히 유용합니다.
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 작업 등)를 삭제합니다. 그래서 저는이 (현재) 해결책을 생각해 냈습니다.

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

kill-matching-buffers 에서 영감을 얻었습니다 . condition원하는 경우 제외 할 다른 버퍼 이름에 추가 할 수 있습니다 .

도움이되기를 바랍니다 :)


내 개선 된 솔루션을 보려면 이것을 참조하십시오 .
azzamsa

0

당신은 이것도 좋아할 수 있습니다-현재 버퍼를 제외한 모든 버퍼를 죽이고 * Messages *와 * scratch * (이것이 편리합니다. "툴킷"이라고 부릅니다), 중복 된 창도 닫고, 현재 어느 하나의 창에 살고 있습니다. 완충기.

(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*"))
스테판

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.