[Top][All Lists]
[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/