현재 버퍼를 종료할 때 특수 버퍼를 건너뛰는 방법은 무엇입니까?

현재 버퍼를 종료할 때 특수 버퍼를 건너뛰는 방법은 무엇입니까?

내 코드에는 and 를 사용할 때 미리 정의된 특수 버퍼를 표시 .emacs하지 못하게 하는 코드가 있습니다 .previous-buffernext-buffer

(defadvice next-buffer (after avoid-messages-buffer-in-next-buffer)
  (when (string= "*Messages*" (buffer-name)) (next-buffer))
  (when (string= "*Completions*" (buffer-name)) (next-buffer))
  (when (string-match "\*tramp.*\*" (buffer-name)) (previous-buffer))
   ... and so on)

이것은 훌륭하게 작동하지만 C-x k지금까지 동일한 유형의 함수를 작성하려고 시도했지만 (defadvice (after kill-buffer) ...)작동하지 않는 것 같습니다.

어떻게 해야 하나요?

답변1

이것은 작동합니다:

(defvar no-kill-buffers
  '("*Messages*"
    ;; ...
    ))

(defadvice kill-buffer (around no-kill-some-buffers activate)
  (unless (member (buffer-name) no-kill-buffers)
    ad-do-it))

귀하의 제안이 작동하지 않는 이유는 "이후" 제안이기 때문입니다. 즉, kill-buffer일반 논리가 완료될 때까지 실행되지 않습니다. (여기 after(after avoid-message-buffer-in-next-buffer).

around제안을 사용하면 제안된 명령 앞이나 뒤에 사용자 지정 논리를 배치할 수 있으며 실행 여부도 제어할 수 있습니다. 이 ad-do-it기호는 일반 kill-buffer루틴을 실행할지 여부와 시기를 알려줍니다.

편집하다:

귀하의 질문을 다시 읽어보니 제가 잘못 이해한 것 같습니다. 버퍼를 죽인 후 표시되는 특수 버퍼를 건너뛰려면 기본적으로 접근 방식이 정확합니다. 너활성화 제안?

예제에서 했던 것처럼 인수 목록 끝에 평가 (ad-activate 'avoid-messages-buffer-in-next-buffer)하거나 포함 할 수 있습니다.activatedefadvice

관련 정보