From: Chong Yidong Date: Mon, 16 Mar 2009 00:44:02 +0000 (+0000) Subject: (crm--choose-completion-string): New function. X-Git-Tag: emacs-pretest-23.0.92~172 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=abb3c752e2bc19405956aaab5ce842ac55d883f8;p=emacs.git (crm--choose-completion-string): New function. (completing-read-multiple): Set and restore choose-completion-string-functions (Bug#1080). --- diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el index cedfb1504b1..12d92bc0a6d 100644 --- a/lisp/emacs-lisp/crm.el +++ b/lisp/emacs-lisp/crm.el @@ -228,6 +228,22 @@ This function is modeled after `minibuffer-complete-and-exit'." (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 @@ The return value of this function is a list of the read strings. 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