emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Backward completions (was: Vertical completions)


From: Juri Linkov
Subject: Backward completions (was: Vertical completions)
Date: Wed, 18 Nov 2009 11:47:12 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (x86_64-pc-linux-gnu)

>>> It's easier to skim through a list when completions are sorted
>>> vertically in columns down the screen.
>>
>> If it's not too problematic to implement, I'm all for the change (or
>> rather an option to have it).
>
> Not problematic at all.  Below is a small patch that implements
> a new option for vertical completions with the default to
> traditional horizontal completions, of course.

Scrolling the *Completions* buffer a full screen with the <TAB> key
is convenient to find a desirable item in a long list.

However, typing the <backtab> key doesn't reverse the scrolling
direction like this key does in other places in Emacs.  So to return to
the previous screen requires scrolling to the end of the *Completions*
buffer, wrapping to the beginning and scrolling forward from the
beginning, looking carefully to not miss the previous screen again.

The following patch binds <backtab> to `minibuffer-complete-backward'
that is an alias of `minibuffer-complete'.  But maybe code in
`minibuffer-complete' is so small, so it could be copied to a new
function `minibuffer-complete-backward' (with small modifications)
instead of creating an alias?

Index: lisp/minibuffer.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/minibuffer.el,v
retrieving revision 1.96
diff -c -w -b -r1.96 minibuffer.el
*** lisp/minibuffer.el  12 Nov 2009 23:10:06 -0000      1.96
--- lisp/minibuffer.el  18 Nov 2009 09:45:59 -0000
***************
*** 516,524 ****
  If you repeat this command after it displayed such a list,
  scroll the window of possible completions."
    (interactive)
!   ;; If the previous command was not this,
    ;; mark the completion buffer obsolete.
!   (unless (eq this-command last-command)
      (setq minibuffer-scroll-window nil))
  
    (let ((window minibuffer-scroll-window))
--- 516,528 ----
  If you repeat this command after it displayed such a list,
  scroll the window of possible completions."
    (interactive)
!   ;; If the previous command (or its alias) was not this,
    ;; mark the completion buffer obsolete.
!   (unless (or (eq this-command last-command)
!             (and (memq this-command '(minibuffer-complete
!                                       minibuffer-complete-backward))
!                  (memq last-command '(minibuffer-complete
!                                       minibuffer-complete-backward))))
      (setq minibuffer-scroll-window nil))
  
    (let ((window minibuffer-scroll-window))
***************
*** 526,536 ****
      ;; and this command is repeated, scroll that window.
      (if (window-live-p window)
          (with-current-buffer (window-buffer window)
            (if (pos-visible-in-window-p (point-max) window)
              ;; If end is in view, scroll up to the beginning.
              (set-window-start window (point-min) nil)
            ;; Else scroll down one screen.
!           (scroll-other-window))
          nil)
  
        (case (completion--do-completion)
--- 530,550 ----
      ;; and this command is repeated, scroll that window.
      (if (window-live-p window)
          (with-current-buffer (window-buffer window)
+           (if (eq this-command 'minibuffer-complete-backward)
+             ;; Scroll completions backward.
+             (if (pos-visible-in-window-p (point-min) window)
+                 ;; If beginning is in view, scroll down to the end.
+                 (with-selected-window window
+                   (goto-char (point-max))
+                   (recenter -1))
+               ;; Else scroll up one screen.
+               (scroll-other-window-down nil))
+           ;; Scroll completions forward.
            (if (pos-visible-in-window-p (point-max) window)
                ;; If end is in view, scroll up to the beginning.
                (set-window-start window (point-min) nil)
              ;; Else scroll down one screen.
!             (scroll-other-window)))
          nil)
  
        (case (completion--do-completion)
***************
*** 541,546 ****
--- 555,568 ----
                 t)
          (t     t)))))
  
+ (defalias 'minibuffer-complete-backward 'minibuffer-complete
+   "Like `minibuffer-complete', but scroll completions backward.
+ If you repeat this command after `minibuffer-complete' or
+ `minibuffer-complete-backward' displayed a list of possible
+ completions, it scrolls the window of possible completions a full
+ screen in the direction opposite to the scrolling direction of
+ `minibuffer-complete'.")
+ 
  (defvar completion-all-sorted-completions nil)
  (make-variable-buffer-local 'completion-all-sorted-completions)

-- 
Juri Linkov
http://www.jurta.org/emacs/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]