Subject: 31.0.50; view-mode un-expected jump-overs
From: Tomas Nordin <[email-masked]>
To: [email-masked]
Date: Sun, 09 Feb 2025 22:09:42 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello

View-mode has less like features like View-search-regexp-forward (/) and
View-search-last-regexp-forward (n). Using them I do some un-expected
observations. Here is a repro:

$ echo 1 word > words
$ echo 2 >> words
$ for n in $(seq 3 6); do echo $n word >> words; done
$ emacs -Q words
M-x view-mode
/ word
n                               ; until on line 6
p                               ; as far up as possible

The observation is that searching backwards jumps over every second
search hit when matches occur on consecutive lines.

Now do

/ !drow

And play with n and p. The bang tells to match every line that does
not match the regex. Again every second expected match is "jumped"
over. In this case also when searching forward. (Expected is that
every line is a search hit).

Maybe not many people use view-mode and it's less-like search
features, and so this was never complained about.

I find that the attached patch solves the problem. What do you think?

In GNU Emacs 31.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
 3.24.38, cairo version 1.16.0) of 2025-02-09 built on fliptop2
Repository revision: 7e60ceeccbca1b9f67297ad7e9f11fd498b28d4d
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12101007
System Description: Debian GNU/Linux 12 (bookworm)

From 130cf266748c16601041990e49335b9e828a0c54 Mon Sep 17 00:00:00 2001
From: Tomas Nordin <[email-masked]>
Date: Sun, 9 Feb 2025 22:39:58 +0100
Subject: [PATCH] Start search from beginning or end of line

* lisp/view.el (view-search):
Go to beginning-of-line or end-of-line instead of previous or
next line before the search.
---
 lisp/view.el | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lisp/view.el b/lisp/view.el
index dc157d8996a..e1d6fb74c79 100644
--- a/lisp/view.el
+++ b/lisp/view.el
@@ -885,7 +885,8 @@ view-search
      (t (error "No previous View-mode search")))
     (save-excursion
       (if end (goto-char (if (< times 0) (point-max) (point-min)))
-	(forward-line (if (< times 0) -1 1)))
+        (if (< times 0) (beginning-of-line)
+          (end-of-line)))
       (if (if no (view-search-no-match-lines times regexp)
 	    (re-search-forward regexp nil t times))
 	  (setq where (point))))
-- 
2.39.5