Dynamic Abbreviation in Emacs

January 29, 2009

Dynamic abbreviation, available by calling `dabbrev-expand` or pressing M-/, is a generalization of the standard abbreviation system in Emacs and is one of it’s most productivity-enhancing features. Regular abbreviations, or abbrevs, are shortcuts for words and blocks of text that you type frequently. For example, if you write a lot of C programs with similar comment blocks at the top of the file you could define an abbreviation, say “chead”. Typing “chead” would then automatically insert the desired header. Abbrevs can also be used as a method of auto-correction for misspelled words: just set “recieve” as an abbrev for “receive”. Some modes also define a few abbrevs for you automatically. For example, AUCTeX has a LaTeX-Math minor mode (C-c ~ or `LaTeX-math-mode`) that defines shortcuts for many common mathematical symbols and Greek letters.

Dynamic abbreviations are different in that you do not have to define them explicitly and you must call `dabbrev-expand` to use them. `dabbrev-expand` is essentially a form of completion where you first type a couple of letters of a word and press M-/. Emacs tries to complete the word by first looking at all the words in the current buffer, then in all other open buffers. Pressing M-/ multiple times will cycle through all possible completions.

First and foremost, `dabbrev-expand` is useful for typing long or difficult words that appear many times in a single document. For example, I’m typing da M-/ instead of dabbrev-expand as I write this. You might need to refer several times to an author with a name that’s difficult to remember or spell. After you type it once, you can begin using M-/ to complete it after the first few letters. In a programming context, you might need to call a function with a long name that’s defined or used elsewhere in the file.

More advanced usage of `dabbrev-expand` involves completion of symbols from other buffers. For example, I use BibTeX to manage my references. All of the books and articles that I might need to cite in my research are stored in a single BibTeX database which I usually have open in Emacs while I’m writing a paper. When I need to cite a paper a the LaTeX document I’m writing, I simply type \cite{ and the first few letters of the corresponding BibTeX key–in my case this starts with the first author’s surname–and press M-/. If I’ve cited the paper before it’s key is completed from the current buffer. Otherwise, Emacs looks at the other open buffers, namely my BibTeX database.

Although I’ve only covered a couple of cases, they are suggestive of other situations where `dabbrev-expand` might be helpful. There are many more productive uses for this hidden Emacs gem. See EmacsWiki:DynamicAbbreviations for more discussion, some useful bindings, and a few enhancements.