Como faço para pular buffers especiais ao matar o buffer atual?

2

Eu tenho um código no meu .emacs que o impede de mostrar alguns buffers especiais pré-definidos quando estou usando previous-buffer e 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)

Isso funciona muito bem, mas eu gostaria de ter a mesma funcionalidade para C-x k . Até agora, tentei escrever o mesmo tipo de função (defadvice (after kill-buffer) ...) , mas isso não parece funcionar.

Como faço para fazer isso?

    
por Stefano Palazzo 16.08.2013 / 14:44

1 resposta

2

Isso deve funcionar:

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

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

A razão pela qual seu conselho não funcionou é que ele foi "após" conselho, o que significa que ele não foi executado até que a lógica normal kill-buffer fosse concluída. (Esse é o after em (after avoid-message-buffer-in-next-buffer) .

around advice permite que você coloque a lógica personalizada antes ou depois do comando advised e até mesmo controle se ela é executada. O símbolo ad-do-it é o que diz se e quando executar a rotina normal kill-buffer .

Editar:

Depois de reler sua pergunta, acho que posso ter entendido errado. Se você estiver tentando pular um buffer especial que teria sido exibido depois de matar um buffer, sua abordagem está basicamente correta. Você ativou o aviso ?

Você pode avaliar (ad-activate 'avoid-messages-buffer-in-next-buffer) ou incluir activate no final da lista de argumentos como defadvice como no exemplo.

    
por 16.08.2013 / 17:14

Tags