Mercurial > emacs
changeset 45612:e1b3f85895a5
Reworked 2001-06-01 change.
(choose-completion-string1): Merged back into choose-completion-string.
(choose-completion-string): Run choose-completion-string-functions
after checking for proper minibuffer window. Added mini-p arg to
the hook functions. Insert choice if all hook functions return nil.
(choose-completion-string-functions): Doc update.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Sat, 01 Jun 2002 21:56:01 +0000 |
parents | b234841ccaef |
children | b1f7bf23b76d |
files | lisp/simple.el |
diffstat | 1 files changed, 38 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/simple.el Sat Jun 01 18:04:35 2002 +0000 +++ b/lisp/simple.el Sat Jun 01 21:56:01 2002 +0000 @@ -3778,11 +3778,15 @@ (delete-char len))) (defvar choose-completion-string-functions nil - "List of functions which may override the standard `choose-completion-string'. -Each function in the list is called in turn with arguments CHOICE BUFFER BASE-SIZE -like choose-completion-string. If a function in the list returns non-nil, that -function is supposed to have inserted the completion in the minibuffer. -If all functions in the list return nil, use the default completion selection.") + "Functions that may override the normal insertion of a completion choice. +These functions are called in order with four arguments: +CHOICE - the string to insert in the buffer, +BUFFER - the buffer in which the choice should be inserted, +MINI-P - non-nil iff BUFFER is a minibuffer, and +BASE-SIZE - the part of BUFFER which isn't part of completion. +If a function in the list returns non-nil, that function is supposed +to have inserted the CHOICE in the BUFFER, and possibly exited +the minibuffer; no further functions will be called.") ;; Switch to BUFFER and insert the completion choice CHOICE. ;; BASE-SIZE, if non-nil, says how many characters of BUFFER's text @@ -3792,11 +3796,6 @@ ;; unless it is reading a file name and CHOICE is a directory, ;; or completion-no-auto-exit is non-nil. (defun choose-completion-string (choice &optional buffer base-size) - (unless (run-hook-with-args-until-success - 'choose-completion-string-functions choice buffer base-size) - (choose-completion-string1 choice buffer base-size))) - -(defun choose-completion-string1 (choice &optional buffer base-size) (let ((buffer (or buffer completion-reference-buffer)) (mini-p (string-match "\\` \\*Minibuf-[0-9]+\\*\\'" (buffer-name buffer)))) ;; If BUFFER is a minibuffer, barf unless it's the currently @@ -3806,33 +3805,35 @@ (not (equal buffer (window-buffer (active-minibuffer-window)))))) (error "Minibuffer is not active for completion") - ;; Insert the completion into the buffer where completion was requested. - (set-buffer buffer) - (if base-size - (delete-region (+ base-size (if mini-p - (minibuffer-prompt-end) - (point-min))) - (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))) - ;; If completing for the minibuffer, exit it with this choice. - (and (not completion-no-auto-exit) - (equal buffer (window-buffer (minibuffer-window))) - minibuffer-completion-table - ;; If this is reading a file name, and the file name chosen - ;; is a directory, don't exit the minibuffer. - (if (and (eq minibuffer-completion-table 'read-file-name-internal) - (file-directory-p (field-string (point-max)))) - (let ((mini (active-minibuffer-window))) - (select-window mini) - (when minibuffer-auto-raise - (raise-frame (window-frame mini)))) - (exit-minibuffer)))))) + (unless (run-hook-with-args-until-success + 'choose-completion-string-functions choice buffer mini-p base-size) + ;; Insert the completion into the buffer where completion was requested. + (set-buffer buffer) + (if base-size + (delete-region (+ base-size (if mini-p + (minibuffer-prompt-end) + (point-min))) + (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))) + ;; If completing for the minibuffer, exit it with this choice. + (and (not completion-no-auto-exit) + (equal buffer (window-buffer (minibuffer-window))) + minibuffer-completion-table + ;; If this is reading a file name, and the file name chosen + ;; is a directory, don't exit the minibuffer. + (if (and (eq minibuffer-completion-table 'read-file-name-internal) + (file-directory-p (field-string (point-max)))) + (let ((mini (active-minibuffer-window))) + (select-window mini) + (when minibuffer-auto-raise + (raise-frame (window-frame mini)))) + (exit-minibuffer))))))) (defun completion-list-mode () "Major mode for buffers showing lists of possible completions.