[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 28c9c7cf464 1/2: Fix next-line-completion for multi-line completi
From: |
Juri Linkov |
Subject: |
master 28c9c7cf464 1/2: Fix next-line-completion for multi-line completions |
Date: |
Thu, 25 Jan 2024 02:51:21 -0500 (EST) |
branch: master
commit 28c9c7cf464c87e90567f8b0e04f854163aa6187
Author: Spencer Baugh <sbaugh@janestreet.com>
Commit: Juri Linkov <juri@linkov.net>
Fix next-line-completion for multi-line completions
Previously it would not move out of a multi-line completion, and now it
will.
* lisp/simple.el (next-line-completion): Move to the completion start
or end before going forward or backward lines. (bug#68688)
---
lisp/simple.el | 20 +++++++++++++++++---
test/lisp/minibuffer-tests.el | 14 ++++++++++++++
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/lisp/simple.el b/lisp/simple.el
index 692c0dacefc..4ffe159dc88 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -9940,6 +9940,20 @@ Also see the `completion-auto-wrap' variable."
(interactive "p")
(next-completion (- n)))
+(defun completion--move-to-candidate-start ()
+ "If in a completion candidate, move point to its start."
+ (when (and (get-text-property (point) 'mouse-face)
+ (not (bobp))
+ (get-text-property (1- (point)) 'mouse-face))
+ (goto-char (previous-single-property-change (point) 'mouse-face))))
+
+(defun completion--move-to-candidate-end ()
+ "If in a completion candidate, move point to its end."
+ (when (and (get-text-property (point) 'mouse-face)
+ (not (eobp))
+ (get-text-property (1+ (point)) 'mouse-face))
+ (goto-char (or (next-single-property-change (point) 'mouse-face)
(point-max)))))
+
(defun next-completion (n)
"Move to the next item in the completions buffer.
With prefix argument N, move N items (negative N means move
@@ -10029,9 +10043,7 @@ Also see the `completion-auto-wrap' variable."
(if (get-text-property (point) 'mouse-face)
;; If in a completion, move to the start of it.
- (when (and (not (bobp))
- (get-text-property (1- (point)) 'mouse-face))
- (goto-char (previous-single-property-change (point) 'mouse-face)))
+ (completion--move-to-candidate-start)
;; Try to move to the previous completion.
(setq pos (previous-single-property-change (point) 'mouse-face))
(if pos
@@ -10046,6 +10058,7 @@ Also see the `completion-auto-wrap' variable."
(while (> n 0)
(setq found nil pos nil column (current-column) line
(line-number-at-pos))
+ (completion--move-to-candidate-end)
(while (and (not found)
(eq (forward-line 1) 0)
(not (eobp))
@@ -10070,6 +10083,7 @@ Also see the `completion-auto-wrap' variable."
(while (< n 0)
(setq found nil pos nil column (current-column) line
(line-number-at-pos))
+ (completion--move-to-candidate-start)
(while (and (not found)
(eq (forward-line -1) 0)
(eq (move-to-column column) column))
diff --git a/test/lisp/minibuffer-tests.el b/test/lisp/minibuffer-tests.el
index c1fe3032cb5..d104858b0d0 100644
--- a/test/lisp/minibuffer-tests.el
+++ b/test/lisp/minibuffer-tests.el
@@ -465,6 +465,20 @@
(previous-line-completion 4)
(should (equal "ac" (get-text-property (point) 'completion--string))))))
+(ert-deftest completion-next-line-multline-test ()
+ (let ((completion-auto-wrap t))
+ (completing-read-with-minibuffer-setup
+ '("a\na" "a\nb" "ac")
+ (insert "a")
+ (minibuffer-completion-help)
+ (switch-to-completions)
+ (goto-char (point-min))
+ (next-line-completion 5)
+ (should (equal "a\nb" (get-text-property (point) 'completion--string)))
+ (goto-char (point-min))
+ (previous-line-completion 5)
+ (should (equal "a\nb" (get-text-property (point) 'completion--string))))))
+
(ert-deftest completions-header-format-test ()
(let ((completion-show-help nil)
(completions-header-format nil))