diff options
author | Jimmy Aguilar Mena <spacibba@aol.com> | 2022-04-05 13:08:36 +0200 |
---|---|---|
committer | Jimmy Aguilar Mena <spacibba@aol.com> | 2022-04-05 13:52:53 +0200 |
commit | 91ca41e292184bf0c21b55a8e51f3eb1a8c89bb7 (patch) | |
tree | 45d8eef8f8e532b751296d49705b5b3bc8fbfee4 | |
parent | 28b9dcb002ac56d296b48499e6a0ff2617185a08 (diff) | |
download | emacs-91ca41e292184bf0c21b55a8e51f3eb1a8c89bb7.tar.gz emacs-91ca41e292184bf0c21b55a8e51f3eb1a8c89bb7.tar.bz2 emacs-91ca41e292184bf0c21b55a8e51f3eb1a8c89bb7.zip |
Fix some details in completions
* lisp/minibuffer.el (completion--insert-one-column) : Remove the extra
new-line at the end.
* lisp/simple.el (next-completion) : Fix behavior when
completion-wrap-movement and remove bobp and eobp. This removes the
extra tab ad the end of the list before wrapping or going to the
minibuffer and apparently also fixes bug#54374
(switch-to-completions) : Simplify condition code and remove comment not
applicable anymore.
-rw-r--r-- | lisp/minibuffer.el | 3 | ||||
-rw-r--r-- | lisp/simple.el | 79 |
2 files changed, 43 insertions, 39 deletions
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index d8df1799c93..5ad44a7a2d8 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -2044,7 +2044,8 @@ Runs of equal candidate strings are eliminated. GROUP-FUN is a (when title (insert (format completions-group-format title) "\n"))))) (completion--insert str group-fun) - (insert "\n"))))) + (insert "\n"))) + (delete-char -1))) (defun completion--insert (str group-fun) (if (not (consp str)) diff --git a/lisp/simple.el b/lisp/simple.el index c60abcb1f43..7918767a756 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -9179,46 +9179,53 @@ backward)." ((/= prev (point)) (point)) (t prev)))) - (let ((beg (point-min)) (end (point-max))) + + (let ((beg (point-min)) + (end (point-max)) + (tabcommand (member (this-command-keys) '("\t" [backtab]))) + prop) (catch 'bound (while (> n 0) ;; If in a completion, move to the end of it. (when (get-text-property (point) 'mouse-face) (goto-char (next-single-property-change (point) 'mouse-face nil end))) ;; If at the last completion option, wrap or skip to the - ;; minibuffer, if requested. - (when (and completion-wrap-movement (eobp)) - (if (and (member (this-command-keys) '("\t" [backtab])) - completion-auto-select) + ;; minibuffer, if requested. We can't use (eobp) because some + ;; extra text may be after the last candidate: ex: when + ;; completion-detailed + (setq prop (next-single-property-change (point) 'mouse-face nil end)) + (when (and completion-wrap-movement (eq end prop)) + (if (and completion-auto-select tabcommand) (throw 'bound nil) (goto-char (point-min)))) ;; Move to start of next one. (unless (get-text-property (point) 'mouse-face) (goto-char (next-single-property-change (point) 'mouse-face nil end))) (setq n (1- n))) + (while (and (< n 0) (not (bobp))) - (let ((prop (get-text-property (1- (point)) 'mouse-face))) - ;; If in a completion, move to the start of it. - (when (and prop (eq prop (get-text-property (point) 'mouse-face))) - (goto-char (previous-single-property-change - (point) 'mouse-face nil beg))) - ;; Move to end of the previous completion. - (unless (or (bobp) (get-text-property (1- (point)) 'mouse-face)) - (goto-char (previous-single-property-change - (point) 'mouse-face nil beg))) - ;; If at the first completion option, wrap or skip to the - ;; minibuffer, if requested. - (when (and completion-wrap-movement (bobp)) - (if (and (member (this-command-keys) '("\t" [backtab])) - completion-auto-select) - (progn - (goto-char (next-single-property-change (point) 'mouse-face nil end)) - (throw 'bound nil)) - (goto-char (point-max)))) - ;; Move to the start of that one. + (setq prop (get-text-property (1- (point)) 'mouse-face)) + ;; If in a completion, move to the start of it. + (when (and prop (eq prop (get-text-property (point) 'mouse-face))) (goto-char (previous-single-property-change - (point) 'mouse-face nil beg)) - (setq n (1+ n))))) + (point) 'mouse-face nil beg))) + ;; Move to end of the previous completion. + (unless (or (bobp) (get-text-property (1- (point)) 'mouse-face)) + (goto-char (previous-single-property-change + (point) 'mouse-face nil beg))) + ;; If at the first completion option, wrap or skip to the + ;; minibuffer, if requested. + (setq prop (previous-single-property-change (point) 'mouse-face nil beg)) + (when (and completion-wrap-movement (eq beg prop)) + (if (and completion-auto-select tabcommand) + (progn + (goto-char (next-single-property-change (point) 'mouse-face nil end)) + (throw 'bound nil)) + (goto-char (point-max)))) + ;; Move to the start of that one. + (goto-char (previous-single-property-change + (point) 'mouse-face nil beg)) + (setq n (1+ n)))) (when (/= 0 n) (switch-to-minibuffer)))) @@ -9436,22 +9443,18 @@ select the completion near point.\n\n"))))) (defun switch-to-completions () "Select the completion list window." (interactive) - (let ((window (or (get-buffer-window "*Completions*" 0) - ;; Make sure we have a completions window. - (progn (minibuffer-completion-help) - (get-buffer-window "*Completions*" 0))))) - (when window - (select-window window) + (when-let ((window (or (get-buffer-window "*Completions*" 0) + ;; Make sure we have a completions window. + (progn (minibuffer-completion-help) + (get-buffer-window "*Completions*" 0))))) + (select-window window) + (when (bobp) (cond ((and (memq this-command '(completion-at-point minibuffer-complete)) - (equal (this-command-keys) [backtab]) - (bobp)) + (equal (this-command-keys) [backtab])) (goto-char (point-max)) (previous-completion 1)) - ;; In the new buffer, go to the first completion. - ;; FIXME: Perhaps this should be done in `minibuffer-completion-help'. - ((bobp) - (next-completion 1)))))) + (t (next-completion 1)))))) (defun read-expression-switch-to-completions () "Select the completion list window while reading an expression." |