# Dictionary and Thesaurus Lookup in Emacs

Or, adding a feature to a piece of software that already has too many features.

Tagged: Software

Emacs is my preferred tool for editing LATEX documents. A few years ago I got tired of switching back and forth to a terminal or web browser every time I wanted to look up a word in the dictionary or thesaurus. To remedy this, I wrote a simple, 100-line Emacs Lisp plugin to look up words using the DICT protocol.

One can simply cut/paste this into their .emacs file or make it a separate file in their elisp directory.

; -*-Emacs-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; File:         dict.el
; Description:  Dict access functions
; Author:       Evan Sultanik
; Created:      Sun Aug 14 15:44:57 2005
; Modified:     Thu Nov 15 08:45:48 2007
; Language:     Emacs-Lisp
; Package:      N/A
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; *******************************************************
;; ***** THIS IS AN ALPHA TEST VERSION (Version 0.2) *****
;; *******************************************************
;;
;; dict.el
;; Copyright (C) 2005 Evan Sultanik (http://www.sultanik.com/)
;;
;; This program is free software; you can redistribute it and/or modify
;; the Free Software Foundation; either version 1, or (at your option)
;; any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defvar dict-protocol-client “dict”
“This is the name and/or path to the local copy of the DICT protocol client.”)

(defconst dict-scratch-buffer-name “*dict*”
“This is the name of the buffer in which the dict output is displayed.”)

(defun dict-extract-word ()
“From the current buffer, extract and return the word under the cursor.”
(let (start word)
(save-excursion
(forward-char 1)
(backward-word 1)
(setq start (point))
(forward-char 1)
(if (not (re-search-forward “\\b”))
(error “Can’t find end of word”))
(buffer-substring start (point))
)))

(defun dict-lookup-word (word dict)
“Look up the word WORD using the client, given by
dict-protocol-client’.  The results will be displayed in the buffer
given by dict-scratch-buffer-name’.  If DICT is nil, WORD is looked
up from a thesaurus only.”
(interactive “sWord to lookup? \nP”)
(let ((dict-buffer (get-buffer-create dict-scratch-buffer-name)))
(save-excursion
(buffer-disable-undo (set-buffer dict-buffer))
(erase-buffer)
(display-buffer dict-buffer)
(if (null dict)
(call-process dict-protocol-client
nil ;; no infile
t   ;; put output in the current buffer
t   ;; re-display as we get more output
“-P” “-” “-d” “moby-thes” word)
(call-process dict-protocol-client
nil ;; no infile
t   ;; put output in the current buffer
t   ;; re-display as we get more output
“-P” “-” word)
)
(goto-char (point-min))
)
))

(defun thesaurus-lookup-word (word)
(dict-lookup-word word nil))

(defun dictionary-lookup-word (word)
(dict-lookup-word word t))

(defun thesaurus-lookup-word-in-text (exact)
“Like dict-lookup-word’, but uses the word under the cursor.”
(interactive “P”)
(thesaurus-lookup-word (dict-extract-word)))

(defun dictionary-lookup-word-in-text (exact)
“Like dict-lookup-word’, but uses the word under the cursor.”
(interactive “P”)
(dictionary-lookup-word (dict-extract-word)))


This code assumes that you have the command dict available.

You can set a keyboard shortcut as follows:

(global-set-key (quote [f7]) ‘thesaurus-lookup-word-in-text)
(global-set-key (quote [f8]) ‘dictionary-lookup-word-in-text)


Pressing the F7 and F8 keys will then look up the word under the cursor in the thesaurus or dictionary, respectively.