I just spent ages writing these functions, so I thought I'd share them. This is probably the most complex bit of Lisp I've ever written, so feedback would be appreciated!
(defun super-buffer-file (&optional buffer-or-name)
"Name of a local file containing buffer `BUFFER-OR-NAME''s contents.
Uses `file-local-copy' and `make-temp-file' if necessary to make a file to use.
Uses `current-buffer' by default."
(interactive)
(let* ((buf (get-buffer (or buffer-or-name
(current-buffer))))
(name (buffer-name buf)))
(if buf
(with-current-buffer buf
(or (and (buffer-file-name)
(or (file-local-copy (buffer-file-name))
(file-local-name (buffer-file-name))))
(let ((tmp-file (make-temp-file (buffer-name))))
(write-file tmp-file)
tmp-file)))
buffer-or-name)))
(defun dragon-buffer (&optional buffer-or-file)
"Call dragon on `BUFFER-OR-FILE'.
If unspecified, `dired-get-marked-files' is used.
If that is unspecified (not a Dired buffer), `current-buffer' is used.
Uses `super-buffer-file' to get a file for a non-Dired buffer."
(interactive)
(set-process-sentinel
(eval (append '(start-process "Dragon"
(concat "*Dragon: " (buffer-name) "*")
"dragon-drag-and-drop")
(or (and (null buffer-or-file) (dired-get-marked-files))
(list (super-buffer-file buffer-or-file)))))
`(lambda (process signal)
(and (memq (process-status process) '(exit signal))
(buffer-live-p (process-buffer process))
(kill-buffer (process-buffer process))))))
(global-set-key (kbd "C-<f1>")
'dragon-buffer)