help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: List possible completions in pop-up menu and choose from it.


From: Kevin Rodgers
Subject: Re: List possible completions in pop-up menu and choose from it.
Date: Fri, 19 Aug 2005 11:57:21 -0600
User-agent: Mozilla Thunderbird 0.9 (X11/20041105)

Rolex JM wrote:
> I want to list in pop-up menu the possible completions returned from
> (dabbrev-completion). Then I can choose one from it and insert it into
> the text, just as (semantic-ia-complete-symbol-menu)
> does.

dabbrev-completion stores its results in dabbrev--last-obarray, which is
a data structure suitable for the completion functions.  You can read
about obarrays in the "Creating [and Interning] Symbols
==============================" node of the
Emacs Lisp manual.

Converting that to a menu keymap was too interesting for me to pass up:

  (let ((menu (make-sparse-keymap "dabbrev-completion"))
        (completions (let ((symbols '()))
                       (mapatoms (lambda (sym)
                                   (setq symbols (cons sym symbols)))
                                 dabbrev--last-obarray)
                       (sort symbols 'string-lessp))))
    (mapc (lambda (completion)
            (define-key menu (vector completion)
              `(,(symbol-name completion) .
                (lambda ()
                  (interactive)
                  (insert ,(symbol-name completion))))))
          (nreverse completions))
    (x-popup-menu t menu))

You can create your own command that you could bind to a key, mouse
click, or menu item by wrapping that in something like:

(defun dabbrev-mouse-completion (event)
  "*Just like `dabbrev-completion', but display a popup menu."
  (interactive "*e")
  (save-window-excursion                ; suppress *Completions* buffer
    (dabbrev-mouse-completion))
...
)

And then replace the t POSITION argument to x-popup-menu with event.

-- 
Kevin Rodgers





reply via email to

[Prev in Thread] Current Thread [Next in Thread]