# HG changeset patch # User Juri Linkov # Date 1271203881 -10800 # Node ID 4abde609aac9761ad6005247cd3a28063102f001 # Parent 2a74858bccc030193abaebd8e8e9672d167276cf Add variable `scroll-preserve-screen-position-commands'. http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00403.html * window.c (Vscroll_preserve_screen_position_commands): New variable with the default value as the list of Qscroll_down and Qscroll_up. (window_scroll_pixel_based, window_scroll_line_based): Search the last command in the list Vscroll_preserve_screen_position_commands instead of comparing with Qscroll_up and Qscroll_down. * mwheel.el (scroll-preserve-screen-position-commands): Add mwheel-scroll to this list of commands. * simple.el (scroll-preserve-screen-position-commands): Add scroll-up-command, scroll-down-command, scroll-up-line, scroll-down-line to this list of commands. diff -r 2a74858bccc0 -r 4abde609aac9 etc/NEWS --- a/etc/NEWS Tue Apr 13 17:16:42 2010 +0200 +++ b/etc/NEWS Wed Apr 14 03:11:21 2010 +0300 @@ -75,6 +75,9 @@ ** 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. + * Editing Changes in Emacs 24.1 diff -r 2a74858bccc0 -r 4abde609aac9 lisp/ChangeLog --- a/lisp/ChangeLog Tue Apr 13 17:16:42 2010 +0200 +++ b/lisp/ChangeLog Wed Apr 14 03:11:21 2010 +0300 @@ -1,3 +1,12 @@ +2010-04-14 Juri Linkov + + * mwheel.el (scroll-preserve-screen-position-commands): + Add mwheel-scroll to this list of commands. + + * simple.el (scroll-preserve-screen-position-commands): + Add scroll-up-command, scroll-down-command, scroll-up-line, + scroll-down-line to this list of commands. + 2010-04-13 Stefan Monnier * obsolete/complete.el: Move from lisp/complete.el. diff -r 2a74858bccc0 -r 4abde609aac9 lisp/mwheel.el --- a/lisp/mwheel.el Tue Apr 13 17:16:42 2010 +0200 +++ b/lisp/mwheel.el Wed Apr 14 03:11:21 2010 +0300 @@ -246,6 +246,8 @@ (run-with-timer mouse-wheel-inhibit-click-time nil 'mwheel-inhibit-click-timeout)))) +(add-to-list 'scroll-preserve-screen-position-commands 'mwheel-scroll) + (defvar mwheel-installed-bindings nil) ;; preloaded ;;;###autoload diff -r 2a74858bccc0 -r 4abde609aac9 lisp/simple.el --- a/lisp/simple.el Tue Apr 13 17:16:42 2010 +0200 +++ b/lisp/simple.el Wed Apr 14 03:11:21 2010 +0300 @@ -4771,6 +4771,7 @@ (goto-char (point-max)))))))) (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. @@ -4799,6 +4800,7 @@ (goto-char (point-min)))))))) (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. @@ -4810,6 +4812,7 @@ (scroll-up (or arg 1))) (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. @@ -4819,6 +4822,7 @@ (scroll-down (or arg 1))) (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 -r 2a74858bccc0 -r 4abde609aac9 src/ChangeLog --- a/src/ChangeLog Tue Apr 13 17:16:42 2010 +0200 +++ b/src/ChangeLog Wed Apr 14 03:11:21 2010 +0300 @@ -1,3 +1,11 @@ +2010-04-14 Juri Linkov + + * window.c (Vscroll_preserve_screen_position_commands): New variable + with the default value as the list of Qscroll_down and Qscroll_up. + (window_scroll_pixel_based, window_scroll_line_based): Search the + last command in the list Vscroll_preserve_screen_position_commands + instead of comparing with Qscroll_up and Qscroll_down. + 2010-04-13 Jan Djärv * gtkutil.c (xg_set_geometry): Set geometry for PPosition also. diff -r 2a74858bccc0 -r 4abde609aac9 src/window.c --- a/src/window.c Tue Apr 13 17:16:42 2010 +0200 +++ b/src/window.c Wed Apr 14 03:11:21 2010 +0300 @@ -168,6 +168,10 @@ 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,8 +4950,8 @@ possibility of point becoming "stuck" on a tall line when scrolling by one line. */ if (window_scroll_pixel_based_preserve_y < 0 - || (!EQ (current_kboard->Vlast_command, Qscroll_up) - && !EQ (current_kboard->Vlast_command, Qscroll_down))) + || NILP (Fmemq (current_kboard->Vlast_command, + Vscroll_preserve_screen_position_commands))) { start_display (&it, w, start); move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS); @@ -5207,8 +5211,8 @@ if (!NILP (Vscroll_preserve_screen_position)) { if (window_scroll_preserve_vpos <= 0 - || (!EQ (current_kboard->Vlast_command, Qscroll_up) - && !EQ (current_kboard->Vlast_command, Qscroll_down))) + || NILP (Fmemq (current_kboard->Vlast_command, + Vscroll_preserve_screen_position_commands))) { struct position posit = *compute_motion (startpos, 0, 0, 0, @@ -7265,9 +7269,19 @@ 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. */); +Any other value means point always keeps its screen position. +Scroll commands are defined by the variable +`scroll-preserve-screen-position-commands'. */); 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;