help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Seeking Advice about refactoring and advice snippet


From: Filipe Silva
Subject: Seeking Advice about refactoring and advice snippet
Date: Fri, 10 Feb 2017 09:43:53 -0200

Dear good people of the emacs help list,

I have a working snippet that advices both kill-buffer and kill-this-buffer
to not kill the *scratch* buffer:

      (defun ninrod/scratch-bodyguard (buffer-assassin &rest arguments)
        (let ((buffer-to-kill (buffer-name (current-buffer))))
          (if (equal buffer-to-kill "*scratch*")
              (message "DENIED! don't kill my precious *scratch*!!")
            (apply buffer-assassin arguments))))
      (defun ninrod/scratch-protection (buffer-assassin &rest arguments)
        (let ((buffer-to-kill (car arguments)))
          (if (equal buffer-to-kill "*scratch*")
              (message "DENIED! don't kill my precious *scratch*!!")
            (apply buffer-assassin arguments))))
      (advice-add #'kill-this-buffer :around #'ninrod/scratch-bodyguard)
      (advice-add #'kill-buffer :around #'ninrod/scratch-protection)

The problem is that these lines:

      (message "DENIED! don't kill my precious *scratch*!!")
     (apply buffer-assassin arguments))))

Are repeated in both functions, so I thought that I could apply the DRY
principle and refactor the snippet to this:

    (defun ninrod--protection (buffer-assassin buffer-to-kill &rest
arguments)
      (if (equal buffer-to-kill "*scratch*")
          (message "DENIED! don't kill my precious *scratch*!!")
        (apply buffer-assassin arguments)))
    (defun ninrod/scratch-bodyguard (buffer-assassin &rest arguments)
      (let ((buffer-to-kill (buffer-name (current-buffer))))
        (ninrod--protection 'buffer-assassin buffer-to-kill arguments)))
    (defun ninrod/scratch-protection (buffer-assassin &rest arguments)
      (let ((buffer-to-kill (car arguments)))
        (ninrod--protection 'buffer-assassin buffer-to-kill arguments)))
    (advice-add #'kill-this-buffer :around #'ninrod/scratch-bodyguard)
    (advice-add #'kill-buffer :around #'ninrod/scratch-protection)

This causes all hell to break loose. Now I can't even close emacs, because
apparently emacs tries to kill all buffers
and as I've just tampered with the kill buffer functions, well, it's bad.
Very bad.

I know I mean well, but I'm must be doing something very stupid. For
starters, I don't know if I can really pass around
functions as parameters? So it could be that?

How would you refactor that snippet to apply the dry principle?

thanks in advance,

Filipe.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]