davis@scr.slb.com (Paul Davis) (04/24/89)
elisp part 3: a generic completion function (complete-token)why isn't
this in Emacs already ? Also, some stuff to do expansions that show
a docstring if the token is already complete (complete-or-expand-token).
I use this in a `hyper-C' mode: I can get help on all the Unix calls,
and all the standard library functions by just typing part of the
name, completing and then trying to complete again: this pops up the
declaration next to the function, and a short docstring in the minibuffer.
I bind complete-or-expand-token to M-TAB in C-mode, and various others too.
It may be useless ... especially without the docstring file - that
comes later.
Paul
-- cut here ---
;; Generic completion/expansion functions
;; Paul Davis <davis%scr.slb.com@relay.cs.net>, May 1988
;; Inspired by DEC's Language Sensitive Editor and
;; Emacs' lisp completion
(defun complete-token (completion-list)
"Complete token before point using COMPLETION-LIST. Inserts as many
characters as possible, and then if multiple completions, display them
in a *Completions* buffer."
(let* ((end (point))
(beg (save-excursion
(backward-sexp 1)
(point)))
(pattern (buffer-substring beg end))
(completion (try-completion pattern completion-list)))
(cond ((eq completion t)
(expand-token pattern completion-list))
((null completion)
(message "Can't find completion for \"%s\"" pattern)
(ding))
((not (string= pattern completion))
(delete-region beg end)
(insert completion))
(t
(message "Making completion list...")
(let ((list (all-completions pattern completion-list)))
(with-output-to-temp-buffer "*Completions*"
(display-completion-list list))
(message "Making completion list...%s" "done"))))))
(defun complete-or-expand-token (completion-list)
"Complete token before point using COMPLETION-LIST, or if complete
expand to show generic declaration, and display synopsis in the echo area"
(let* ((end (point))
(beg (save-excursion
(backward-sexp 1)
(point)))
(pattern (buffer-substring beg end))
(completion (try-completion pattern completion-list)))
(cond ((eq completion t)
(expand-token pattern completion-list))
((null completion)
(message "Can't find completion for \"%s\"" pattern)
(ding))
((not (string= pattern completion))
(delete-region beg end)
(insert completion))
(t
(message "Making completion list...")
(let ((list (all-completions pattern completion-list)))
(with-output-to-temp-buffer "*Completions*"
(display-completion-list list))
(message "Making completion list...%s" "done"))))))
(defun expand-token (completion completion-list)
"\
Expand COMPLETION using COMPLETION-LIST to (momentarily) show generic
declaration, and display synopsis in echo area. COMPLETION must be
complete, and COMPLETION-LIST is a list of elements of the form
\(\"completion\" . \(\"declaration\" . \"synopsis\"\)\)\n"
(cond
((null completion-list)
(message "no expansion found for %s" completion))
((string-equal completion (car (car completion-list)))
(momentary-string-display
(concat " " (car (cdr (car completion-list)))) (point) ?\
(cdr (cdr (car completion-list)))))
(t
(expand-token completion (cdr completion-list)))))
(provide 'completion)