내 코드에는 and 를 사용할 때 미리 정의된 특수 버퍼를 표시 .emacs
하지 못하게 하는 코드가 있습니다 .previous-buffer
next-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)
하거나 포함 할 수 있습니다.activate
defadvice