Theresa O’Connor

Deleting email like Strong Bad

I'm pretty sure Strong Bad Email needs no introduction.

A while ago I thought it would be cool to make my Gnus delete email like Strong Bad's 386, with a big, white-on-blue DELETED!!!! in the middle of the display.

screenshot of gnus deleting article like strong bad

This is simple enough to do, with a little use of Emacs Lisp advice:

(defadvice gnus-summary-delete-article (around compyify-deletion activate)
  "Ensure that article deletion always looks like Strong Bad's Compy 386."
  (with-compy-deleted-display
    (sit-for 1)
    ad-do-it))

Basically, this code wraps the normal functionality of gnus-summary-delete-article within a call to with-compy-deleted-display. The easy part is over; the hard part is writing with-compy-deleted-display. Here's what I came up with at the time. It's not the best example of good Emacs Lisp code, but it gets the job done.

(defmacro with-compy-deleted-display (&rest body)
  "Execute forms in BODY while displaying a 'DELETED!!' buffer.
Just like on Strong Bad's Compy 386. BA-LEETED!"
  `(save-window-excursion
     (let ((old-buf (current-buffer)))
       (with-temp-buffer
         (setq mode-line-format     nil
               indicate-empty-lines nil)
         (let ((bg (face-background 'default))
               (fg (face-foreground 'default)))
           (unwind-protect
               (progn
                 (set-face-background 'default "Medium Blue")
                 (set-face-foreground 'default "White")
                 (ted-insert-centered-line "DELETED!!!")
                 (message "")
                 (delete-other-windows)
                 (switch-to-buffer (current-buffer))
                 (recenter)
                 (with-current-buffer old-buf
                   ,@body))
             (set-face-background 'default bg)
             (set-face-foreground 'default fg)))))))

This depends on the function ted-insert-centered-line, which inserts a line of text so that it's horizontally and vertically centered in a window. Here it is:

(defun ted-insert-centered-line (line)
  "Insert LINE into the current buffer.
Will also insert the necessary number of spaces and newlines to center
LINE in the window."
  (let ((lines (make-string (/ (frame-height) 2) ?\n))
        (spaces (make-string (- (/ (frame-width) 2)
                                (/ (length line) 2))
                             ?\s)))
    (insert lines spaces line)))

In order to get the body of my advice to indent properly, I did this:

(put 'with-compy-deleted-display 'lisp-indent-function 0)