From time to time I write an Emacs function that I believe others might find useful as well. I then try to post it on identi.ca, which requires me to trim it down to 140 characters minus the Emacs group tag. (The hardest part of that is that (Emacs) Lisp function and variable names tend to be long and descriptive, by the way.) Here are the ones I've posted so far, with comments and slightly improved formatting.

Save old buffer contents when reverting

This will save your life, or at least pieces of work that you put your soul in, at least once. Before a buffer is reverted, it puts a copy in the kill ring, so you can get it back with C-y. I found this especially useful with vc-mode, where updating a file to whatever version would perform a revert.

This takes up some memory, of course, though I haven't noticed that becoming a problem.

(add-hook 'before-revert-hook
  (lambda ()
    (kill-new (buffer-string))
    (message "Previous buffer text saved to kill ring")))

First posted here.

Delete processes with an interactive command

The Emacs function delete-process is not interactive, which means that you have to use M-: and type some magic to kill a certain "process" (which in Emacs might be either a shell command or a network connection). Here is a function that lets you choose the process to delete with tab completion:

(defun delete-process-i(p)
  (interactive `(,(completing-read"Kill proc: "
    (mapcar 'process-name(process-list))()t)))
  (delete-process p))

This one suffered the most from compression. The name was supposed to be delete-process-interactive, but that was the first thing to go. I also found that () is a handy alias for nil, especially as it doesn't require spaces around it.

First posted here.

Get track info in EMMS playlist buffer

It shouldn't come as a surprise to anyone that there is a music player for Emacs. Well, probably more than one, but the one I use is EMMS, the Emacs Multimedia System.

Skipping ahead a bit, suddenly you're in the playlist buffer with a track that's being displayed only with its filename, instead of name, artist, album etc. EMMS is supposed to go through the playlist and get that information for each track, but sometimes you need to prod it. Thus this function, which forces EMMS to reread information for the track at point:

(defun my-emms-get-info()
  (interactive)
  (let(emms-info-auto-update)
    (emms-info-really-initialize-track(emms-playlist-track-at))))

First posted here.

Change Eshell working directory

For running shell commands within Emacs I prefer Eshell to the alternatives (M-x shell and M-x term). Eshell is implemented in Emacs Lisp, and in my experience the friction between the editor and the shell is lesser than when running Bash in an Emacs buffer.

If Eshell hasn't been started yet, M-x eshell starts it in the current buffer's current directory. If Eshell has been started already, M-x eshell jumps to the Eshell buffer without changing directory. I wanted something better and ended up with ecd: it prompts for a directory, defaulting to the directory of the current buffer, and starts Eshell if needed and switches to the directory you specify. (For extra enlightenment, use ido-mode when selecting the directory.)

(defun ecd (d)
  (interactive
   (list (expand-file-name (read-directory-name "cd: " nil nil t))))
  (eshell)
  (eshell/cd d))

(Actually it always starts Eshell. I found during "compression" that it doesn't matter.)

First posted here.

From time to time I write an Emacs function that I believe others might find useful as well.