From 3a349ff6487982d9e3c427eda987aed452305d78 Mon Sep 17 00:00:00 2001 From: Jimmy Aguilar Mena Date: Tue, 22 Mar 2022 21:24:13 +0100 Subject: [PATCH] Add completion-auto-select second-tab value. * lisp/minibuffer.el (completion--in-region-1) : Change if with cond and check if completion-auto-select. * lisp/simple.el (completion-auto-select) : Move before first use. (completion-setup-function) : Make a more precise check for when completion-auto-select is t. --- lisp/minibuffer.el | 30 +++++++++++++++++++----------- lisp/simple.el | 18 ++++++++++-------- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index c4fb1c00391..742d39f2d29 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -1410,18 +1410,26 @@ scroll the window of possible completions." ;; and this command is repeated, scroll that window. ((and (window-live-p minibuffer-scroll-window) (eq t (frame-visible-p (window-frame minibuffer-scroll-window)))) - (let ((window minibuffer-scroll-window) - (reverse (equal (this-command-keys) [backtab]))) + (let ((window minibuffer-scroll-window)) (with-current-buffer (window-buffer window) - (if (pos-visible-in-window-p (if reverse (point-min) (point-max)) window) - ;; If end or beginning is in view, scroll up to the - ;; beginning or end respectively. - (if reverse - (set-window-point window (point-max)) - (set-window-start window (point-min) nil)) - ;; Else scroll down one screen. - (with-selected-window window - (if reverse (scroll-down) (scroll-up)))) + (cond + ;; here this is possible only when second-tab, so jump now. + (completion-auto-select + (switch-to-completions)) + ;; reverse tab + ((equal (this-command-keys) [backtab]) + (if (pos-visible-in-window-p (point-min) window) + ;; If beginning is in view, scroll up to the end + (set-window-point window (point-max)) + ;; Else scroll down one screen. + (with-selected-window window (scroll-down)))) + ;; normal tab + (t + (if (pos-visible-in-window-p (point-max) window) + ;; If end is in view, scroll up to the end + (set-window-start window (point-min) nil) + ;; Else scroll down one screen. + (with-selected-window window (scroll-up))))) nil))) ;; If we're cycling, keep on cycling. ((and completion-cycling completion-all-sorted-completions) diff --git a/lisp/simple.el b/lisp/simple.el index 9a8ed0bb757..f2296086908 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -9144,6 +9144,14 @@ This affects the commands `next-completion' and :version "29.1" :group 'completion) +(defcustom completion-auto-select nil + "Non-nil means to automatically select the *Completions* buffer." + :type '(choice (const :tag "Select window" t) + (const :tag "Disabled" nil) + (const :tag "Select window on second-tab" second-tab)) + :version "29.1" + :group 'completion) + (defun previous-completion (n) "Move to the previous item in the completion list. With prefix argument N, move back N items (negative N means move @@ -9365,12 +9373,6 @@ Called from `temp-buffer-show-hook'." :version "22.1" :group 'completion) -(defcustom completion-auto-select nil - "Non-nil means to automatically select the *Completions* buffer." - :type 'boolean - :version "29.1" - :group 'completion) - ;; This function goes in completion-setup-hook, so that it is called ;; after the text of the completion list buffer is written. (defun completion-setup-function () @@ -9411,8 +9413,8 @@ Called from `temp-buffer-show-hook'." (insert (substitute-command-keys "In this buffer, type \\[choose-completion] to \ select the completion near point.\n\n"))))) - (when completion-auto-select - (switch-to-completions))) + (if (eq completion-auto-select t) + (switch-to-completions))) (add-hook 'completion-setup-hook #'completion-setup-function) -- 2.39.5