kautz@EDDIE.MIT.EDU (Henry Kautz) (03/17/89)
Is there a function to determine the line point is on relative to the current top of window? E.g., so that (move-to-window-line (foobar)) would be a no-op. Using count-lines to count between (window-start) and (point) fails in case long lines are wrapped. ---- Henry Kautz :uucp: allegra!kautz :arpa/internet: kautz%research.att.com :csnet: kautz%research.att.com@RELAY.CS.NET :old csnet: kautz%allegra@btl.csnet :mail: AT&T Bell Laboratories Room 3C-402A 600 Mountain Ave. Murray Hill, N.J. 07974 :telephone: (201) 582-2815
paul@MEDIA-LAB.MEDIA.MIT.EDU (Paul Dworkin) (03/19/89)
Date: Thu, 16 Mar 89 18:21:25 EST From: allegra!kautz@eddie.mit.edu (Henry Kautz) Subject: determining current window line? Is there a function to determine the line point is on relative to the current top of window? E.g., so that (move-to-window-line (foobar)) would be a no-op. Using count-lines to count between (window-start) and (point) fails in case long lines are wrapped. OK. You finally made me do it. I went wandering through the source and tried to make some sense of all the motion commands. The results are below, but I ain't proud. It turns out there are three different types of information you might want to know: - cursor position in the window's text, ignoring screen wdith current-line, current-column - cursor position relative to the top right corner of the window current-window-line, current-window-column - cursor position relative to the top right corner of the screen current-screen-line, current-screen-column Of these, current-column already existed. I know these could be made better/more efficient, but I don't think I can work on this for one more second without getting ill. Others are welcome to go at it. current-window-line gets its info iteratively. Blech. current-window-column is a major hack. Now people can go ahead and tell me which of these functions already existed. -Paul Dworkin paul@media-lab.media.mit.edu (617) 253-0668, 0664 Media Labs, E15-318 M.I.T., Cambridge MA 02139 ----------- (defun current-line () "Return the vertical position of point in the current window. Top line is 0. Counts each text line only once, even if it wraps." (+ (count-lines (window-start) (point)) (if (= (current-column) 0) 1 0) -1)) ; current-column already exists. (defun current-window-line () "Return the vertical distance between the top of the window and the point. Differs from current-line in that it returns a value based solely on screen position, unrelated to the text underneath. I.e. wrapped lines get counted multiple times." (save-excursion (vertical-motion 0) (let ((p (point)) (lines 0)) (goto-char (window-start)) (while (< (point) p) (vertical-motion 1) (setq lines (1+ lines))) lines))) ; This is a hack. It should be done better than all this guessing. (defun current-window-column () "Return the horizontal distance between the left edge of the window and the point. Differs from current-column in that it returns a value based solely on screen position, unrelated to the text underneath." (let ((col (+ (% (current-column) (1- (window-width)))))) (cond ((or truncate-lines (and truncate-partial-width-windows (< (window-width) (screen-width)))) (if (>= (current-column) (1- (window-width))) (1- (window-width)) col)) ((or (/= col 0) (= (current-column) 0)) col) (t (save-excursion (let ((p (point))) (end-of-line) (if (= p (point)) (1- (window-width)) 0))))))) (defun current-screen-line () "Return the horizontal position of the point on the screen. Top is 0. This is absolute screen position, unrelated to the screen's contents." (+ (car (cdr (window-edges))) (current-window-line))) (defun current-screen-column () "Return the vertical position of the point on the screen. Left is 0. This is absolute screen position, unrelated to the screen's contents." (+ (car (window-edges)) (current-window-column)))