Mercurial > emacs
changeset 102596:580bf204da67
(crm--choose-completion-string): New function.
(completing-read-multiple): Set and restore
choose-completion-string-functions (Bug#1080).
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Mon, 16 Mar 2009 00:44:02 +0000 |
parents | 91e59cf19c07 |
children | 01843ba0d6af |
files | lisp/emacs-lisp/crm.el |
diffstat | 1 files changed, 38 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emacs-lisp/crm.el Mon Mar 16 00:43:52 2009 +0000 +++ b/lisp/emacs-lisp/crm.el Mon Mar 16 00:44:02 2009 +0000 @@ -228,6 +228,22 @@ (forward-char 1)) (if doexit (exit-minibuffer)))) +(defun crm--choose-completion-string (choice buffer mini-p base-size) + "Completion string chooser for `completing-read-multiple'. +This is called from `choose-completion-string-functions'. +It replaces the string that is currently being completed, without +exiting the minibuffer." + (let ((ol (crm--select-current-element))) + (if base-size + (delete-region (+ base-size (field-beginning)) (point)) + (choose-completion-delete-max-match choice)) + (insert choice) + (remove-text-properties (- (point) (length choice)) (point) + '(mouse-face nil)) + ;; Update point in the window that BUFFER is showing in. + (let ((window (get-buffer-window buffer t))) + (set-window-point window (point))))) + ;; superemulates behavior of completing_read in src/minibuf.c ;;;###autoload (defun completing-read-multiple @@ -259,22 +275,28 @@ See the documentation for `completing-read' for details on the arguments: PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST, DEF, and INHERIT-INPUT-METHOD." - (let* ((minibuffer-completion-table #'crm--collection-fn) - (minibuffer-completion-predicate predicate) - ;; see completing_read in src/minibuf.c - (minibuffer-completion-confirm - (unless (eq require-match t) require-match)) - (crm-completion-table table) - (map (if require-match - crm-local-must-match-map - crm-local-completion-map)) - ;; If the user enters empty input, read-from-minibuffer returns - ;; the empty string, not DEF. - (input (read-from-minibuffer - prompt initial-input map - nil hist def inherit-input-method))) - (and def (string-equal input "") (setq input def)) - (split-string input crm-separator))) + (unwind-protect + (progn + (add-hook 'choose-completion-string-functions + 'crm--choose-completion-string) + (let* ((minibuffer-completion-table #'crm--collection-fn) + (minibuffer-completion-predicate predicate) + ;; see completing_read in src/minibuf.c + (minibuffer-completion-confirm + (unless (eq require-match t) require-match)) + (crm-completion-table table) + (map (if require-match + crm-local-must-match-map + crm-local-completion-map)) + ;; If the user enters empty input, read-from-minibuffer returns + ;; the empty string, not DEF. + (input (read-from-minibuffer + prompt initial-input map + nil hist def inherit-input-method))) + (and def (string-equal input "") (setq input def)) + (split-string input crm-separator))) + (remove-hook 'choose-completion-string-functions + 'crm--choose-completion-string))) (define-obsolete-function-alias 'crm-minibuffer-complete 'crm-complete "23.1") (define-obsolete-function-alias