From a4b000fb3dc67a7eedc388acf47c2002b4918665 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Fri, 16 Apr 2010 02:51:12 +0300 Subject: [PATCH] Add the `scroll-command' property. * window.c: Add Qscroll_command. Remove Vscroll_preserve_screen_position_commands. (window_scroll_pixel_based, window_scroll_line_based): Check the `scroll-command' property on the last command instead of searching the last command in Vscroll_preserve_screen_position_commands. (syms_of_window): Initialize and staticpro `Qscroll_command'. Put Qscroll_command property on Qscroll_up and Qscroll_down. (scroll-preserve-screen-position): Doc fix. (Vscroll_preserve_screen_position_commands): Remove variable. * simple.el (scroll-up-command, scroll-down-command) (scroll-up-line, scroll-down-line): Put `scroll-command' property on the these symbols. Remove them from `scroll-preserve-screen-position-commands'. * mwheel.el (mwheel-scroll): Put `scroll-command' and `isearch-scroll' properties on the `mwheel-scroll' symbol. Remove it from `scroll-preserve-screen-position-commands'. * isearch.el (isearch-allow-scroll): Doc fix. --- etc/NEWS | 4 ++-- lisp/ChangeLog | 13 +++++++++++++ lisp/isearch.el | 2 +- lisp/mwheel.el | 3 ++- lisp/simple.el | 8 ++++---- src/ChangeLog | 12 ++++++++++++ src/window.c | 35 +++++++++++++++-------------------- 7 files changed, 49 insertions(+), 28 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 6bb48fe59b0..e08dabbea1e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -76,8 +76,8 @@ when a new variable `scroll-error-top-bottom' is non-nil. ** New scrolling commands `scroll-up-line' and `scroll-down-line' scroll a line instead of full screen. -** New variable `scroll-preserve-screen-position-commands' defines -a list of scroll command affected by `scroll-preserve-screen-position. +** New property `scroll-command' should be set on a command's symbol to +define it as a scroll command affected by `scroll-preserve-screen-position. * Editing Changes in Emacs 24.1 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5ac0723343b..6aeb1b1f1c2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,16 @@ +2010-04-15 Juri Linkov + + * simple.el (scroll-up-command, scroll-down-command) + (scroll-up-line, scroll-down-line): Put `scroll-command' + property on the these symbols. Remove them from + `scroll-preserve-screen-position-commands'. + + * mwheel.el (mwheel-scroll): Put `scroll-command' and + `isearch-scroll' properties on the `mwheel-scroll' symbol. + Remove it from `scroll-preserve-screen-position-commands'. + + * isearch.el (isearch-allow-scroll): Doc fix. + 2010-04-15 Michael Albinus * net/tramp.el (tramp-error-with-buffer): Don't show the diff --git a/lisp/isearch.el b/lisp/isearch.el index d0ad330c5c0..3684c8e320a 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -1757,7 +1757,7 @@ Scroll-bar or mode-line events are processed appropriately." "Whether scrolling is allowed during incremental search. If non-nil, scrolling commands can be used in Isearch mode. However, the current match will never scroll offscreen. -If nil, scolling commands will first cancel Isearch mode." +If nil, scrolling commands will first cancel Isearch mode." :type 'boolean :group 'isearch) diff --git a/lisp/mwheel.el b/lisp/mwheel.el index f88b2e86503..224920e515f 100644 --- a/lisp/mwheel.el +++ b/lisp/mwheel.el @@ -246,7 +246,8 @@ This should only be bound to mouse buttons 4 and 5." (run-with-timer mouse-wheel-inhibit-click-time nil 'mwheel-inhibit-click-timeout)))) -(add-to-list 'scroll-preserve-screen-position-commands 'mwheel-scroll) +(put 'mwheel-scroll 'scroll-command t) +(put 'mwheel-scroll 'isearch-scroll t) (defvar mwheel-installed-bindings nil) diff --git a/lisp/simple.el b/lisp/simple.el index d071c76e2b1..bb8f1b65651 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -4792,8 +4792,8 @@ If ARG is the atom `-', scroll downward by nearly full screen." ;; 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. @@ -4825,8 +4825,8 @@ If ARG is the atom `-', scroll upward by nearly full screen." ;; 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. @@ -4837,8 +4837,8 @@ This is different from `scroll-up-command' that scrolls a 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. @@ -4847,8 +4847,8 @@ This is different from `scroll-down-command' that scrolls a full screen." (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) (defun scroll-other-window-down (lines) diff --git a/src/ChangeLog b/src/ChangeLog index 0ab926b8bb3..9d89f51001a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2010-04-15 Juri Linkov + + * window.c: Add Qscroll_command. + Remove Vscroll_preserve_screen_position_commands. + (window_scroll_pixel_based, window_scroll_line_based): Check the + `scroll-command' property on the last command instead of searching + the last command in Vscroll_preserve_screen_position_commands. + (syms_of_window): Initialize and staticpro `Qscroll_command'. + Put Qscroll_command property on Qscroll_up and Qscroll_down. + (scroll-preserve-screen-position): Doc fix. + (Vscroll_preserve_screen_position_commands): Remove variable. + 2010-04-15 Dan Nicolaescu * xdisp.c (message): Do not use NO_ARG_ARRAY. diff --git a/src/window.c b/src/window.c index b9683fbbca8..882f76d9758 100644 --- a/src/window.c +++ b/src/window.c @@ -54,7 +54,7 @@ along with GNU Emacs. If not, see . */ 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; @@ -168,10 +168,6 @@ static Lisp_Object Vwindow_configuration_change_hook; 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; @@ -4946,12 +4942,13 @@ window_scroll_pixel_based (window, n, whole, noerror) 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); @@ -5211,8 +5208,8 @@ window_scroll_line_based (window, n, whole, noerror) 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, @@ -7180,6 +7177,12 @@ syms_of_window () 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); @@ -7270,18 +7273,10 @@ A value of t means point keeps its screen position if the scroll 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; -- 2.39.2