;; move to the bottom of the buffer.
(goto-char (point-max))))))))
+(put 'scroll-up-command 'scroll-command t)
(put 'scroll-up-command 'isearch-scroll t)
-(add-to-list 'scroll-preserve-screen-position-commands 'scroll-up-command)
(defun scroll-down-command (&optional arg)
"Scroll text of selected window down ARG lines; or near full screen if no ARG.
;; move to the top of the buffer.
(goto-char (point-min))))))))
+(put 'scroll-down-command 'scroll-command t)
(put 'scroll-down-command 'isearch-scroll t)
-(add-to-list 'scroll-preserve-screen-position-commands 'scroll-down-command)
;;; Scrolling commands which scroll a line instead of full screen.
(interactive "p")
(scroll-up (or arg 1)))
+(put 'scroll-up-line 'scroll-command t)
(put 'scroll-up-line 'isearch-scroll t)
-(add-to-list 'scroll-preserve-screen-position-commands 'scroll-up-line)
(defun scroll-down-line (&optional arg)
"Scroll text of selected window down ARG lines; or one line if no ARG.
(interactive "p")
(scroll-down (or arg 1)))
+(put 'scroll-down-line 'scroll-command t)
(put 'scroll-down-line 'isearch-scroll t)
-(add-to-list 'scroll-preserve-screen-position-commands 'scroll-down-line)
\f
(defun scroll-other-window-down (lines)
Lisp_Object Qwindowp, Qwindow_live_p, Qwindow_configuration_p;
Lisp_Object Qdisplay_buffer;
-Lisp_Object Qscroll_up, Qscroll_down;
+Lisp_Object Qscroll_up, Qscroll_down, Qscroll_command;
Lisp_Object Qwindow_size_fixed;
extern Lisp_Object Qleft_margin, Qright_margin;
Lisp_Object Vscroll_preserve_screen_position;
-/* List of commands affected by `Vscroll_preserve_screen_position'. */
-
-Lisp_Object Vscroll_preserve_screen_position_commands;
-
/* Non-nil means that text is inserted before window's markers. */
Lisp_Object Vwindow_point_insertion_type;
if (!NILP (Vscroll_preserve_screen_position))
{
/* We preserve the goal pixel coordinate across consecutive
- calls to scroll-up or scroll-down. This avoids the
+ calls to scroll-up, scroll-down and other commands that
+ have the `scroll-command' property. This avoids the
possibility of point becoming "stuck" on a tall line when
scrolling by one line. */
if (window_scroll_pixel_based_preserve_y < 0
- || NILP (Fmemq (current_kboard->Vlast_command,
- Vscroll_preserve_screen_position_commands)))
+ || !SYMBOLP (current_kboard->Vlast_command)
+ || NILP (Fget (current_kboard->Vlast_command, Qscroll_command)))
{
start_display (&it, w, start);
move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS);
if (!NILP (Vscroll_preserve_screen_position))
{
if (window_scroll_preserve_vpos <= 0
- || NILP (Fmemq (current_kboard->Vlast_command,
- Vscroll_preserve_screen_position_commands)))
+ || !SYMBOLP (current_kboard->Vlast_command)
+ || NILP (Fget (current_kboard->Vlast_command, Qscroll_command)))
{
struct position posit
= *compute_motion (startpos, 0, 0, 0,
Qscroll_down = intern_c_string ("scroll-down");
staticpro (&Qscroll_down);
+ Qscroll_command = intern_c_string ("scroll-command");
+ staticpro (&Qscroll_command);
+
+ Fput (Qscroll_up, Qscroll_command, Qt);
+ Fput (Qscroll_down, Qscroll_command, Qt);
+
Qwindow_size_fixed = intern_c_string ("window-size-fixed");
staticpro (&Qwindow_size_fixed);
Fset (Qwindow_size_fixed, Qnil);
command moved it vertically out of the window, e.g. when scrolling
by full screens.
Any other value means point always keeps its screen position.
-Scroll commands are defined by the variable
-`scroll-preserve-screen-position-commands'. */);
+Scroll commands should have the `scroll-command' property
+on their symbols to be controlled by this variable. */);
Vscroll_preserve_screen_position = Qnil;
- DEFVAR_LISP ("scroll-preserve-screen-position-commands",
- &Vscroll_preserve_screen_position_commands,
- doc: /* A list of commands whose scrolling should keep screen position unchanged.
-This list defines the names of scroll commands affected by the variable
-`scroll-preserve-screen-position'. */);
- Vscroll_preserve_screen_position_commands =
- Fcons (Qscroll_down, Fcons (Qscroll_up, Qnil));
-
DEFVAR_LISP ("window-point-insertion-type", &Vwindow_point_insertion_type,
doc: /* Type of marker to use for `window-point'. */);
Vwindow_point_insertion_type = Qnil;