2

I'm interested in the region of a buffer that is visible on-screen.

How do you get the current scroll position of a buffer? I.e. the line number of the topmost line in the viewable area? (Given that I can use window-height to find the bottommost visible line of the buffer.)

(The point-min and point-max functions give the min and max buffer positions, but those might be offscreen. I want to know the min and max on-screen buffer positions.)

Drew
  • 77,472
  • 10
  • 114
  • 243
jcarpenter2
  • 227
  • 1
  • 6
  • This is actually much more complex than it seems because window-start and window-end cannot be known with a 100% degree of accuracy until the end of the redisplay cycle. line-number-at-pos is too slow in large buffers, and (string-to-number (format-mode-line "%l")) has some limitations: https://emacs.stackexchange.com/questions/3821/a-faster-method-to-obtain-line-number-at-pos-in-large-buffers For a few functions that require speed in large buffers, I have used (save-excursion (goto-char) (string-to-number (format-mode-line "%l"))). – lawlist Oct 30 '17 at 14:08
  • A combination of the post-command-hook and window-scroll-functions hook can be used to obtain window-start and window-end in about 90% of the situations, but the latter fires several times under certain circumstances before the final values will be almost accurate. There is an option argument for window-end to update the value. Due to the present impossibility of ascertain the correct window-start/window-end values with 100% accuracy, I have been implementing my own feature requests written in C as part of the redisplay cycle, which of course is not the answer you seek ... :) – lawlist Oct 30 '17 at 14:12
  • @lawlist Thanks for the answers and information! It is good to know that window-start and window-end are not 100% accurate and I should consider the redisplay cycle when using them. Can you link me to any threads on the cases where window-start and window-end don't work? Also, (string-to-number (format-mode-line "%l")) appears to only give me the line number of point, from which I cannot tell the top visible line in the window. However, thanks again :) – jcarpenter2 Oct 30 '17 at 21:37
  • To get the line number at window-start, you could use (save-excursion (goto-char (window-start (selected-window))) (format-mode-line "%l")). To get a line at window-end, you could use (save-excursion (goto-char (window-end (selected-window) 'force)) (format-mode-line "%l")). Add string-to-number if so desired. Beware of certain limitations discussed in the comments of the linked thread hereinabove. Here is a link to a thread where I began my journey: https://stackoverflow.com/questions/23923371/emacs-calculating-new-window-start-end-without-redisplay – lawlist Oct 30 '17 at 22:05
  • To follow my journey, you may wish to read through feature request 22404: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22404 And see also Eli Z.'s comment regarding bug 22637: https://lists.gnu.org/archive/html/bug-gnu-emacs/2016-02/msg00952.html – lawlist Oct 30 '17 at 22:09

1 Answers1

2
(line-number-at-pos (window-start))

should do what you asked.

siehe-falz
  • 201
  • 1
  • 1