Add the recenter-redisplay' variable, and make recenter' use it.

Revision: emacs@sv.gnu.org/emacs--devo--0--patch-1604
This commit is contained in:
Miles Bader 2009-06-23 07:07:45 +00:00
parent c6da7cd2b6
commit 666e158e38
6 changed files with 68 additions and 15 deletions

View file

@ -1,3 +1,7 @@
2009-06-23 Miles Bader <miles@gnu.org>
* display.texi (Scrolling): Document `recenter-redisplay'
2009-06-21 Chong Yidong <cyd@stupidchicken.com>
* Branch for 23.1.

View file

@ -54,7 +54,7 @@ commands:
@table @kbd
@item C-l
Scroll the selected window to center point vertically within it and
redisplay the screen (@code{recenter-top-bottom}).
maybe redisplay the screen (@code{recenter-top-bottom}).
@item C-v
@itemx @key{next}
@itemx @key{PageDown}
@ -73,9 +73,12 @@ Scroll heuristically to bring useful information onto the screen
The most basic scrolling command is @kbd{C-l}
(@code{recenter-top-bottom}). This @dfn{recenters} the selected
window, scrolling it so that the current screen line is exactly in the
center of the window, or as close to the center as possible. It also
clears the screen and redisplays all windows; this is useful in case
the screen becomes garbled for any reason (@pxref{Screen Garbled}).
center of the window, or as close to the center as possible. If the
variable @var{recenter-redisplay} is non-nil, it also clears the
screen and redisplays all windows; this is useful in case the screen
becomes garbled for any reason (@pxref{Screen Garbled}). If
@var{recenter-redisplay} has the special value @code{tty} (the
default), then redisplay only happens on tty frames.
Typing @kbd{C-l} twice in a row (@kbd{C-l C-l}) scrolls the window
so that point is on the topmost screen line. Typing a third @kbd{C-l}
@ -95,6 +98,11 @@ puts point on the bottom line, and @kbd{C-u - 5 C-l} puts it five
lines from the bottom. When given an argument, @kbd{C-l} does not
clear the screen or cycle through different screen positions.
@vindex recenter-redisplay
When the variable @code{recenter-redisplay} is non-nil, the
@code{recenter} and @code{recenter-top-bottom} commands redisplay the
selected frame when they are invoked without a prefix argument.
@kindex C-v
@kindex M-v
@kindex next

View file

@ -1,3 +1,7 @@
2009-06-23 Miles Bader <miles@gnu.org>
* cus-start.el: Add entry for `recenter-redisplay'.
2009-06-22 Dan Nicolaescu <dann@ics.uci.edu>
* vc-hooks.el (vc-stay-local-p, vc-state, vc-working-revision):

View file

@ -307,6 +307,12 @@ since it could result in memory overflow and make Emacs crash."
(const :tag "Off (nil)" :value nil)
(const :tag "Full screen (t)" :value t)
(other :tag "Always" 1)) "22.1")
(recenter-redisplay windows
(choice
(const :tag "Never (nil)" :value nil)
(const :tag "Only on ttys" :value tty)
(other :tag "Always" t))
"23.1")
;; xdisp.c
(scroll-step windows integer)
(scroll-conservatively windows integer)

View file

@ -1,3 +1,10 @@
2009-06-23 Miles Bader <miles@gnu.org>
* window.c (Vrecenter_redisplay): New variable.
(syms_of_window): Initialize it.
(Qtty): New extern declaration.
(Frecenter): Only do redisplay if Vrecenter_redisplay requests it.
2009-06-23 Jim Meyering <meyering@redhat.com>
Don't dereference NULL upon failed malloc and realloc

View file

@ -193,6 +193,14 @@ static int inhibit_frame_unsplittable;
extern EMACS_INT scroll_margin;
extern Lisp_Object Qwindow_scroll_functions, Vwindow_scroll_functions;
/* If non-nil, then the `recenter' command with a nil argument
the entire frame to be redrawn; the special value `tty' causes the
frame to be redrawn only if it is a tty frame. */
static Lisp_Object Vrecenter_redisplay;
extern Lisp_Object Qtty;
DEFUN ("windowp", Fwindowp, Swindowp, 1, 1, 0,
doc: /* Return t if OBJECT is a window. */)
@ -5602,14 +5610,17 @@ displayed_window_lines (w)
DEFUN ("recenter", Frecenter, Srecenter, 0, 1, "P",
doc: /* Center point in selected window and redisplay frame.
doc: /* Center point in selected window and maybe redisplay frame.
With prefix argument ARG, recenter putting point on screen line ARG
relative to the selected window. If ARG is negative, it counts up from the
bottom of the window. (ARG should be less than the height of the window.)
If ARG is omitted or nil, erase the entire frame and then redraw with point
in the center of the selected window. If `auto-resize-tool-bars' is set to
`grow-only', this resets the tool-bar's height to the minimum height needed.
If ARG is omitted or nil, then recenter with point on the middle line of
the selected window; if the variable `recenter-redisplay' is non-nil,
also erase the entire frame and redraw it (when `auto-resize-tool-bars'
is set to `grow-only', this resets the tool-bar's height to the minimum
height needed); if `recenter-redisplay' has the special value `tty',
then only tty frame are redrawn.
Just C-u as prefix means put point in the center of the window
and redisplay normally--don't erase and redraw the frame. */)
@ -5629,16 +5640,22 @@ and redisplay normally--don't erase and redraw the frame. */)
if (NILP (arg))
{
int i;
if (!NILP (Vrecenter_redisplay)
&& (!EQ (Vrecenter_redisplay, Qtty)
|| !NILP (Ftty_type (selected_frame))))
{
int i;
/* Invalidate pixel data calculated for all compositions. */
for (i = 0; i < n_compositions; i++)
composition_table[i]->font = NULL;
/* Invalidate pixel data calculated for all compositions. */
for (i = 0; i < n_compositions; i++)
composition_table[i]->font = NULL;
WINDOW_XFRAME (w)->minimize_tool_bar_window_p = 1;
WINDOW_XFRAME (w)->minimize_tool_bar_window_p = 1;
Fredraw_frame (WINDOW_FRAME (w));
SET_FRAME_GARBAGED (WINDOW_XFRAME (w));
}
Fredraw_frame (WINDOW_FRAME (w));
SET_FRAME_GARBAGED (WINDOW_XFRAME (w));
center_p = 1;
}
else if (CONSP (arg)) /* Just C-u. */
@ -7246,6 +7263,13 @@ selected; while the global part is run only once for the modified frame,
with the relevant frame selected. */);
Vwindow_configuration_change_hook = Qnil;
DEFVAR_LISP ("recenter-redisplay", &Vrecenter_redisplay,
doc: /* If non-nil, then the `recenter' command with a nil argument
the entire frame to be redrawn; the special value `tty' causes the
frame to be redrawn only if it is a tty frame. */);
Vrecenter_redisplay = Qtty;
defsubr (&Sselected_window);
defsubr (&Sminibuffer_window);
defsubr (&Swindow_minibuffer_p);