emacs-devel
[Top][All Lists]
Advanced

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

Re: Suggestion to change the behavior of M-r


From: Juri Linkov
Subject: Re: Suggestion to change the behavior of M-r
Date: Tue, 06 Oct 2009 00:33:07 +0300
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (x86_64-pc-linux-gnu)

>> Yes, this is a separate question.  As for move-to-window-line-top-bottom,
>> I agree it should follow recenter-top-bottom.
>
> Can we conclude that this change is a reasonable one which should be
> put into Emacs? The original message was posted about half a year ago
> and since then no one has objected to this change.

While I agree that adding move-to-window-line-top-bottom for consistency
with recenter-top-bottom is reasonable, I don't think recenter-top-bottom
itself has a reasonable implementation now.

The problem is that currently the cycling order `middle -> top -> bottom'
is hard-coded in `recenter-top-bottom'.  I see no reason to impose this
order on users.

Below is a patch that adds a new customizable variable
`recenter-destinations' with the default value '(middle top bottom)
corresponding to the current hard-coded cycling order.  In addition to
possible values `top', `middle', `bottom', it's possible also to specify
integers to move to the absolute window-line.  And float numbers define
the percentage between 0.0 and 1.0 from the top.

As for `move-to-window', we could also do the same for it
and rename it accordingly to something like
move-to-window-line-top-bottom-or-anywhere-in-the-middle ;-)

Index: lisp/window.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/window.el,v
retrieving revision 1.183
diff -c -r1.183 window.el
*** lisp/window.el      4 Oct 2009 00:41:23 -0000       1.183
--- lisp/window.el      5 Oct 2009 21:30:46 -0000
***************
*** 1609,1646 ****
  
  (defvar recenter-last-op nil
    "Indicates the last recenter operation performed.
! Possible values: `top', `middle', `bottom'.")
  
  (defun recenter-top-bottom (&optional arg)
!   "Move current line to window center, top, and bottom, successively.
! With no prefix argument, the first call redraws the frame and
!  centers point vertically within the window.  Successive calls
!  scroll the window, placing point on the top, bottom, and middle
!  consecutively.  The cycling order is middle -> top -> bottom.
  
  A prefix argument is handled like `recenter':
   With numeric prefix ARG, move current line to window-line ARG.
!  With plain `C-u', move current line to window center.
! 
! Top and bottom destinations are actually `scroll-margin' lines
!  the from true window top and bottom."
    (interactive "P")
    (cond
!    (arg (recenter arg))                 ; Always respect ARG.
!    ((or (not (eq this-command last-command))
!       (eq recenter-last-op 'bottom))
!     (setq recenter-last-op 'middle)
!     (recenter))
     (t
      (let ((this-scroll-margin
           (min (max 0 scroll-margin)
                (truncate (/ (window-body-height) 4.0)))))
        (cond ((eq recenter-last-op 'middle)
!            (setq recenter-last-op 'top)
!            (recenter this-scroll-margin))
            ((eq recenter-last-op 'top)
!            (setq recenter-last-op 'bottom)
!            (recenter (- -1 this-scroll-margin))))))))
  
  (define-key global-map [?\C-l] 'recenter-top-bottom)
  
--- 1609,1667 ----
  
  (defvar recenter-last-op nil
    "Indicates the last recenter operation performed.
! Possible values: `top', `middle', `bottom', integer or float numbers.")
! 
! (defcustom recenter-destinations '(middle top bottom)
!   "Cycling order for `recenter-top-bottom'.
! A list of elements with possible values `top', `middle', `bottom',
! integer or float numbers that define the cycling order for
! the command `recenter-top-bottom'.
! 
! Top and bottom destinations are `scroll-margin' lines the from true
! window top and bottom.  Middle redraws the frame and centers point
! vertically within the window.  Integer number moves current line to
! the specified absolute window-line.  Float number between 0.0 and 1.0
! means the percentage of the screen space from the top.  The default
! cycling order is middle -> top -> bottom."
!   :type '(repeat (choice
!                 (const :tag "Top" top)
!                 (const :tag "Middle" middle)
!                 (const :tag "Bottom" bottom)
!                 (integer :tag "Line number")
!                 (float :tag "Percentage")))
!   :version "23.2"
!   :group 'windows)
  
  (defun recenter-top-bottom (&optional arg)
!   "Move current buffer line to the specified window line.
! With no prefix argument, successive calls place point according
! to the cycling order defined by `recenter-destinations'.
  
  A prefix argument is handled like `recenter':
   With numeric prefix ARG, move current line to window-line ARG.
!  With plain `C-u', move current line to window center."
    (interactive "P")
    (cond
!    (arg (recenter arg)) ; Always respect ARG.
     (t
+     (setq recenter-last-op
+         (if (eq this-command last-command)
+             (car (or (cdr (member recenter-last-op recenter-destinations))
+                      recenter-destinations))
+           (car recenter-destinations)))
      (let ((this-scroll-margin
           (min (max 0 scroll-margin)
                (truncate (/ (window-body-height) 4.0)))))
        (cond ((eq recenter-last-op 'middle)
!            (recenter))
            ((eq recenter-last-op 'top)
!            (recenter this-scroll-margin))
!           ((eq recenter-last-op 'bottom)
!            (recenter (- -1 this-scroll-margin)))
!           ((integerp recenter-last-op)
!            (recenter recenter-last-op))
!           ((floatp recenter-last-op)
!            (recenter (round (* recenter-last-op (window-height))))))))))
  
  (define-key global-map [?\C-l] 'recenter-top-bottom)
  

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




reply via email to

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