unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH 1/3] lisp/progmodes/etags.el clean up code by removing a temporary
@ 2019-03-16  1:53 Konstantin Kharlamov
  2019-03-16  1:53 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
                   ` (2 more replies)
  0 siblings, 3 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16  1:53 UTC (permalink / raw)
  To: emacs-devel

---
 lisp/progmodes/etags.el | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index c2715be5370..05dc7aa1baf 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1351,7 +1351,7 @@ etags-goto-tag-location
 hits the start of file."
   (let ((startpos (cdr (cdr tag-info)))
 	(line (car (cdr tag-info)))
-	offset found pat)
+	offset pat)
     (if (eq (car tag-info) t)
 	;; Direct file tag.
 	(cond (line (progn (goto-char (point-min))
@@ -1363,7 +1363,6 @@ etags-goto-tag-location
       ;; since just going around the loop once probably
       ;; costs about as much as searching 2000 chars.
       (setq offset 1000
-	    found nil
 	    pat (concat (if (eq selective-display t)
 			    "\\(^\\|\^m\\)" "^")
 			(regexp-quote (car tag-info))))
@@ -1385,19 +1384,16 @@ etags-goto-tag-location
 				    (point)))))
       (or startpos
 	  (setq startpos (point-min)))
-      ;; First see if the tag is right at the specified location.
+
       (goto-char startpos)
-      (setq found (looking-at pat))
-      (while (and (not found)
-		  (progn
-		    (goto-char (- startpos offset))
-		    (not (bobp))))
-	(setq found
-	      (re-search-forward pat (+ startpos offset) t)
-	      offset (* 3 offset)))	; expand search window
-      (or found
-	  (re-search-forward pat nil t)
-	  (user-error "Rerun etags: `%s' not found in %s"
+      (or (looking-at pat) ; Is tag at the specified location?
+          (while (progn
+                   (goto-char (- startpos offset))
+                   (and (not (bobp))
+                        (not (re-search-forward pat (+ startpos offset) t))))
+            (setq offset (* 3 offset))) ; expand search window
+          (re-search-forward pat nil t)
+          (user-error "Rerun etags: `%s' not found in %s"
                       pat buffer-file-name)))
     ;; Position point at the right place
     ;; if the search string matched an extra Ctrl-m at the beginning.
-- 
2.21.0




^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16  1:53 [PATCH 1/3] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov
@ 2019-03-16  1:53 ` Konstantin Kharlamov
  2019-03-16 12:43   ` Eli Zaretskii
  2019-03-16  1:53 ` [PATCH 3/3] lisp/progmodes/etags.el improve match by string trimming Konstantin Kharlamov
  2019-03-19  6:55 ` [PATCH v2] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov
  2 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16  1:53 UTC (permalink / raw)
  To: emacs-devel

---
 lisp/progmodes/etags.el | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 05dc7aa1baf..62637414ef8 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1395,11 +1395,6 @@ etags-goto-tag-location
           (re-search-forward pat nil t)
           (user-error "Rerun etags: `%s' not found in %s"
                       pat buffer-file-name)))
-    ;; Position point at the right place
-    ;; if the search string matched an extra Ctrl-m at the beginning.
-    (and (eq selective-display t)
-	 (looking-at "\^m")
-	 (forward-char 1))
     (beginning-of-line)))
 
 (defun etags-list-tags (file) ; Doc string?
-- 
2.21.0




^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH 3/3] lisp/progmodes/etags.el improve match by string trimming
  2019-03-16  1:53 [PATCH 1/3] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov
  2019-03-16  1:53 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
@ 2019-03-16  1:53 ` Konstantin Kharlamov
  2019-03-16  2:13   ` [PATCH v2] " Konstantin Kharlamov
  2019-03-19  6:55 ` [PATCH v2] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov
  2 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16  1:53 UTC (permalink / raw)
  To: emacs-devel

Not only this improves general usability, but also works around existing
bug in anjuta-tags¹

1: https://gitlab.gnome.org/GNOME/anjuta/issues/8
---
 lisp/progmodes/etags.el | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 62637414ef8..e8b67cf10f4 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1363,9 +1363,10 @@ etags-goto-tag-location
       ;; since just going around the loop once probably
       ;; costs about as much as searching 2000 chars.
       (setq offset 1000
-	    pat (concat (if (eq selective-display t)
-			    "\\(^\\|\^m\\)" "^")
-			(regexp-quote (car tag-info))))
+            ;; Improve the match by trimming the pattern. It's
+            ;; impossible anyway that 2 tags would only differ by
+            ;; trailing whitespace.
+	    pat (string-trim (regexp-quote (car tag-info))))
       ;; The character position in the tags table is 0-origin and counts CRs.
       ;; Convert it to a 1-origin Emacs character position.
       (when startpos
@@ -1386,8 +1387,7 @@ etags-goto-tag-location
 	  (setq startpos (point-min)))
 
       (goto-char startpos)
-      (or (looking-at pat) ; Is tag at the specified location?
-          (while (progn
+      (or (while (progn
                    (goto-char (- startpos offset))
                    (and (not (bobp))
                         (not (re-search-forward pat (+ startpos offset) t))))
-- 
2.21.0




^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v2] lisp/progmodes/etags.el improve match by string trimming
  2019-03-16  1:53 ` [PATCH 3/3] lisp/progmodes/etags.el improve match by string trimming Konstantin Kharlamov
@ 2019-03-16  2:13   ` Konstantin Kharlamov
  2019-03-16 12:46     ` Eli Zaretskii
  2019-03-17  2:38     ` [PATCH v3] " Konstantin Kharlamov
  0 siblings, 2 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16  2:13 UTC (permalink / raw)
  To: emacs-devel

Not only this improves general usability, but also works around existing
bug in anjuta-tags¹

1: https://gitlab.gnome.org/GNOME/anjuta/issues/8
---

Sorry, I didn't test the last change on (looking-at pat) removal, it
still does matching. Fixed here.

 lisp/progmodes/etags.el | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 62637414ef8..0e0e649a5d5 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1363,9 +1363,10 @@ etags-goto-tag-location
       ;; since just going around the loop once probably
       ;; costs about as much as searching 2000 chars.
       (setq offset 1000
-	    pat (concat (if (eq selective-display t)
-			    "\\(^\\|\^m\\)" "^")
-			(regexp-quote (car tag-info))))
+            ;; Improve the match by trimming the pattern. It's
+            ;; impossible anyway that 2 tags would only differ by
+            ;; trailing whitespace.
+	    pat (string-trim (regexp-quote (car tag-info))))
       ;; The character position in the tags table is 0-origin and counts CRs.
       ;; Convert it to a 1-origin Emacs character position.
       (when startpos
-- 
2.21.0




^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16  1:53 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
@ 2019-03-16 12:43   ` Eli Zaretskii
  2019-03-16 15:42     ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-16 12:43 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> From: Konstantin Kharlamov <Hi-Angel@yandex.ru>
> Date: Sat, 16 Mar 2019 04:53:13 +0300
> 
> diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
> index 05dc7aa1baf..62637414ef8 100644
> --- a/lisp/progmodes/etags.el
> +++ b/lisp/progmodes/etags.el
> @@ -1395,11 +1395,6 @@ etags-goto-tag-location
>            (re-search-forward pat nil t)
>            (user-error "Rerun etags: `%s' not found in %s"
>                        pat buffer-file-name)))
> -    ;; Position point at the right place
> -    ;; if the search string matched an extra Ctrl-m at the beginning.
> -    (and (eq selective-display t)
> -	 (looking-at "\^m")
> -	 (forward-char 1))
>      (beginning-of-line)))

Did you actually try this change with selective-display in effect?
Because I'm not sure it is correct in that case.

Thanks.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v2] lisp/progmodes/etags.el improve match by string trimming
  2019-03-16  2:13   ` [PATCH v2] " Konstantin Kharlamov
@ 2019-03-16 12:46     ` Eli Zaretskii
  2019-03-16 15:38       ` Konstantin Kharlamov
  2019-03-17  2:38     ` [PATCH v3] " Konstantin Kharlamov
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-16 12:46 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> From: Konstantin Kharlamov <Hi-Angel@yandex.ru>
> Date: Sat, 16 Mar 2019 05:13:33 +0300
> 
> Not only this improves general usability, but also works around existing
> bug in anjuta-tags¹
> 
> 1: https://gitlab.gnome.org/GNOME/anjuta/issues/8
> ---
> 
> Sorry, I didn't test the last change on (looking-at pat) removal, it
> still does matching. Fixed here.

Please explain more about the original problem.  The proposed change
looks like it removes the support for selective-display, or am I
missing something?

IOW, why is the regexp including the CR character a problem?

Thanks.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v2] lisp/progmodes/etags.el improve match by string trimming
  2019-03-16 12:46     ` Eli Zaretskii
@ 2019-03-16 15:38       ` Konstantin Kharlamov
  2019-03-16 16:29         ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16 15:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Сб, мар 16, 2019 at 3:46 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  From: Konstantin Kharlamov <Hi-Angel@yandex.ru>
>>  Date: Sat, 16 Mar 2019 05:13:33 +0300
>> 
>>  Not only this improves general usability, but also works around 
>> existing
>>  bug in anjuta-tags¹
>> 
>>  1: https://gitlab.gnome.org/GNOME/anjuta/issues/8
>>  ---
>> 
>>  Sorry, I didn't test the last change on (looking-at pat) removal, it
>>  still does matching. Fixed here.
> 
> Please explain more about the original problem.

The pattern that this functions searches for determines the tag 
uniquely. But here's a catch: no programming language creates distinc 
entities (ones that end up in the tag), based only on trailing space. 
I.e. "foo()" and "    foo()   " always refer to the same thing.

So this change gives 2 improvements:
1. Emacs gonna stop failing finding a tag when someone simply 
reindented the sources
2. As a side effect, this works around a problem, when a 
tags-generating program trimmed the whitespace (the commit has a link 
to anjuta-tags bugreport about that).

 > The proposed change
> looks like it removes the support for selective-display, or am I
> missing something?
> 
> IOW, why is the regexp including the CR character a problem?
> 
> Thanks.

"CR" is part of the whitespace, so per description above comparison to 
it is simply unnecessary.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16 12:43   ` Eli Zaretskii
@ 2019-03-16 15:42     ` Konstantin Kharlamov
  2019-03-16 16:00       ` Stefan Monnier
  2019-03-16 16:26       ` Eli Zaretskii
  0 siblings, 2 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16 15:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Сб, мар 16, 2019 at 3:43 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  From: Konstantin Kharlamov <Hi-Angel@yandex.ru>
>>  Date: Sat, 16 Mar 2019 04:53:13 +0300
>> 
>>  diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
>>  index 05dc7aa1baf..62637414ef8 100644
>>  --- a/lisp/progmodes/etags.el
>>  +++ b/lisp/progmodes/etags.el
>>  @@ -1395,11 +1395,6 @@ etags-goto-tag-location
>>             (re-search-forward pat nil t)
>>             (user-error "Rerun etags: `%s' not found in %s"
>>                         pat buffer-file-name)))
>>  -    ;; Position point at the right place
>>  -    ;; if the search string matched an extra Ctrl-m at the 
>> beginning.
>>  -    (and (eq selective-display t)
>>  -	 (looking-at "\^m")
>>  -	 (forward-char 1))
>>       (beginning-of-line)))
> 
> Did you actually try this change with selective-display in effect?
> Because I'm not sure it is correct in that case.
> 
> Thanks.

Hmm… I will try a bit later, but the code seems really 
straightforward:
	1. if current character is ^M, then step forward
	2. step to the beginnig of the line

The 2 undoes 1.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16 15:42     ` Konstantin Kharlamov
@ 2019-03-16 16:00       ` Stefan Monnier
  2019-03-16 16:26       ` Eli Zaretskii
  1 sibling, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2019-03-16 16:00 UTC (permalink / raw)
  To: emacs-devel

> Hmm… I will try a bit later, but the code seems really straightforward:
> 	1. if current character is ^M, then step forward
> 	2. step to the beginnig of the line
>
> The 2 undoes 1.

When selective-display is t I think 2 does not undo 1.


        Stefan "who'd be happy to see the t value of selective-display
                officially deprecated and obsoleted"




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16 15:42     ` Konstantin Kharlamov
  2019-03-16 16:00       ` Stefan Monnier
@ 2019-03-16 16:26       ` Eli Zaretskii
  2019-03-16 21:12         ` Konstantin Kharlamov
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-16 16:26 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sat, 16 Mar 2019 18:42:44 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> >>  -    (and (eq selective-display t)
> >>  -	 (looking-at "\^m")
> >>  -	 (forward-char 1))
> >>       (beginning-of-line)))
> > 
> > Did you actually try this change with selective-display in effect?
> > Because I'm not sure it is correct in that case.
> > 
> > Thanks.
> 
> Hmm… I will try a bit later, but the code seems really 
> straightforward:
> 	1. if current character is ^M, then step forward
> 	2. step to the beginnig of the line
> 
> The 2 undoes 1.

^M has special meaning in selective-display mode.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v2] lisp/progmodes/etags.el improve match by string trimming
  2019-03-16 15:38       ` Konstantin Kharlamov
@ 2019-03-16 16:29         ` Eli Zaretskii
  0 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-16 16:29 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sat, 16 Mar 2019 18:38:32 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> "CR" is part of the whitespace, so per description above comparison to 
> it is simply unnecessary.

CR is treated specially when selective-display is in effect, it's not
just any whitespace.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16 16:26       ` Eli Zaretskii
@ 2019-03-16 21:12         ` Konstantin Kharlamov
  2019-03-16 21:47           ` Konstantin Kharlamov
  2019-03-17  3:36           ` Eli Zaretskii
  0 siblings, 2 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16 21:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Сб, мар 16, 2019 at 7:26 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Sat, 16 Mar 2019 18:42:44 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  >>  -    (and (eq selective-display t)
>>  >>  -	 (looking-at "\^m")
>>  >>  -	 (forward-char 1))
>>  >>       (beginning-of-line)))
>>  >
>>  > Did you actually try this change with selective-display in effect?
>>  > Because I'm not sure it is correct in that case.
>>  >
>>  > Thanks.
>> 
>>  Hmm… I will try a bit later, but the code seems really
>>  straightforward:
>>  	1. if current character is ^M, then step forward
>>  	2. step to the beginnig of the line
>> 
>>  The 2 undoes 1.
> 
> ^M has special meaning in selective-display mode.

Thanks, so, I just tried playing with the mode, and I haven't even 
found ^M anywhere. I wonder if the ^M being added by the mode is in the 
past, that just no longer happening.

Specifically, I did:

1. wrote in scratch buffer
test
 test
  test
2. evaluated (set-selective-display 1) which transformed the look of 
the text to
test...
3.α Tried searching for ^M by pressing C-s C-q C-m. It's failing to 
find anything.
3.β Put the caret before the triple dot, as in "test|...", and 
evaluated (char-after (point)) and (char-after (+ 1 (point))). The 
first returns "C-j" character, i.e. a newline; the second returns 
"space character". They're both the exact characters that actually are 
in text, as if I didn't enable selective-display.

So, even disregarding my patches (because I haven't managed to test 
this possible corner-case), the need for ^M workarounds is just no 
longer needed.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16 21:12         ` Konstantin Kharlamov
@ 2019-03-16 21:47           ` Konstantin Kharlamov
  2019-03-17  3:36           ` Eli Zaretskii
  1 sibling, 0 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-16 21:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вс, мар 17, 2019 at 12:12 ДП (AM), Konstantin Kharlamov 
<hi-angel@yandex.ru> написал:
> 
> 
> В Сб, мар 16, 2019 at 7:26 ПП (PM), Eli Zaretskii 
> <eliz@gnu.org> написал:
>>>  Date: Sat, 16 Mar 2019 18:42:44 +0300
>>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>>  Cc: emacs-devel@gnu.org
>>> 
>>>  >>  -    (and (eq selective-display t)
>>>  >>  -	 (looking-at "\^m")
>>>  >>  -	 (forward-char 1))
>>>  >>       (beginning-of-line)))
>>>  >
>>>  > Did you actually try this change with selective-display in 
>>> effect?
>>>  > Because I'm not sure it is correct in that case.
>>>  >
>>>  > Thanks.
>>> 
>>>  Hmm… I will try a bit later, but the code seems really
>>>  straightforward:
>>>  	1. if current character is ^M, then step forward
>>>  	2. step to the beginnig of the line
>>> 
>>>  The 2 undoes 1.
>> 
>> ^M has special meaning in selective-display mode.
> 
> Thanks, so, I just tried playing with the mode, and I haven't even 
> found ^M anywhere. I wonder if the ^M being added by the mode is in 
> the past, that just no longer happening.
> 
> Specifically, I did:
> 
> 1. wrote in scratch buffer
> test
> test
>  test
> 2. evaluated (set-selective-display 1) which transformed the look of 
> the text to
> test...
> 3.α Tried searching for ^M by pressing C-s C-q C-m. It's failing to 
> find anything.
> 3.β Put the caret before the triple dot, as in "test|...", and 
> evaluated (char-after (point)) and (char-after (+ 1 (point))). The 
> first returns "C-j" character, i.e. a newline; the second returns 
> "space character". They're both the exact characters that actually 
> are in text, as if I didn't enable selective-display.
> 
> So, even disregarding my patches (because I haven't managed to test 
> this possible corner-case), the need for ^M workarounds is just no 
> longer needed.

That said, would be nice if somebody could confirm my findings, because 
I can not find whether my current Emacs built from vanilla branch or 
the harf-buzz one; and I'm a bit worrying that this could've been 
change specific to harf-buzz branch.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* [PATCH v3] lisp/progmodes/etags.el improve match by string trimming
  2019-03-16  2:13   ` [PATCH v2] " Konstantin Kharlamov
  2019-03-16 12:46     ` Eli Zaretskii
@ 2019-03-17  2:38     ` Konstantin Kharlamov
  1 sibling, 0 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17  2:38 UTC (permalink / raw)
  To: emacs-devel

Not only this improves general usability, but also works around existing
bug in anjuta-tags¹

1: https://gitlab.gnome.org/GNOME/anjuta/issues/8
---

v3: swap regexp-quote and string-trim, that works faster

 lisp/progmodes/etags.el | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 62637414ef8..d5162f01e47 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1363,9 +1363,10 @@ etags-goto-tag-location
       ;; since just going around the loop once probably
       ;; costs about as much as searching 2000 chars.
       (setq offset 1000
-	    pat (concat (if (eq selective-display t)
-			    "\\(^\\|\^m\\)" "^")
-			(regexp-quote (car tag-info))))
+            ;; Improve the match by trimming the pattern. It's
+            ;; impossible anyway that 2 tags would only differ by
+            ;; trailing whitespace.
+	    pat (regexp-quote (string-trim (car tag-info))))
       ;; The character position in the tags table is 0-origin and counts CRs.
       ;; Convert it to a 1-origin Emacs character position.
       (when startpos
-- 
2.21.0




^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-16 21:12         ` Konstantin Kharlamov
  2019-03-16 21:47           ` Konstantin Kharlamov
@ 2019-03-17  3:36           ` Eli Zaretskii
  2019-03-17  3:41             ` Konstantin Kharlamov
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-17  3:36 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sun, 17 Mar 2019 00:12:36 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> > ^M has special meaning in selective-display mode.
> 
> Thanks, so, I just tried playing with the mode, and I haven't even 
> found ^M anywhere. I wonder if the ^M being added by the mode is in the 
> past, that just no longer happening.
> 
> Specifically, I did:
> 
> 1. wrote in scratch buffer
> test
>  test
>   test
> 2. evaluated (set-selective-display 1) which transformed the look of 
> the text to
> test...
> 3.α Tried searching for ^M by pressing C-s C-q C-m. It's failing to 
> find anything.

The ^M character is what causes that "..." ellipsis.  You cannot
search for it interactively because Emacs prevents that, but the
character is there in the buffer text.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17  3:36           ` Eli Zaretskii
@ 2019-03-17  3:41             ` Konstantin Kharlamov
  2019-03-17 15:17               ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17  3:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вс, мар 17, 2019 at 6:36 ДП (AM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Sun, 17 Mar 2019 00:12:36 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  > ^M has special meaning in selective-display mode.
>> 
>>  Thanks, so, I just tried playing with the mode, and I haven't even
>>  found ^M anywhere. I wonder if the ^M being added by the mode is in 
>> the
>>  past, that just no longer happening.
>> 
>>  Specifically, I did:
>> 
>>  1. wrote in scratch buffer
>>  test
>>   test
>>    test
>>  2. evaluated (set-selective-display 1) which transformed the look of
>>  the text to
>>  test...
>>  3.α Tried searching for ^M by pressing C-s C-q C-m. It's failing to
>>  find anything.
> 
> The ^M character is what causes that "..." ellipsis.  You cannot
> search for it interactively because Emacs prevents that, but the
> character is there in the buffer text.

Okay, well, I couldn't find it by evaluating (re-search-forward "^M") 
either.

So, given the character can't be inspected, the old code couldn't even 
do anything :)





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17  3:41             ` Konstantin Kharlamov
@ 2019-03-17 15:17               ` Eli Zaretskii
  2019-03-17 15:52                 ` Stefan Monnier
  2019-03-17 19:06                 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
  0 siblings, 2 replies; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-17 15:17 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sun, 17 Mar 2019 06:41:41 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> > The ^M character is what causes that "..." ellipsis.  You cannot
> > search for it interactively because Emacs prevents that, but the
> > character is there in the buffer text.
> 
> Okay, well, I couldn't find it by evaluating (re-search-forward "^M") 
> either.
> 
> So, given the character can't be inspected, the old code couldn't even 
> do anything :)

I suggest to read the node "Selective Display" in the ELisp manual
about this feature, and how the ^M characters come into play.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 15:17               ` Eli Zaretskii
@ 2019-03-17 15:52                 ` Stefan Monnier
  2019-03-17 16:13                   ` Eli Zaretskii
  2019-03-17 19:06                 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
  1 sibling, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2019-03-17 15:52 UTC (permalink / raw)
  To: emacs-devel

> I suggest to read the node "Selective Display" in the ELisp manual
> about this feature, and how the ^M characters come into play.

Could we declare the t value of selective-display deprecated
(recommending the use of the `invisible` property instead)?


        Stefan




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 15:52                 ` Stefan Monnier
@ 2019-03-17 16:13                   ` Eli Zaretskii
  2019-03-17 17:36                     ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-17 16:13 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Sun, 17 Mar 2019 11:52:53 -0400
> 
> Could we declare the t value of selective-display deprecated
> (recommending the use of the `invisible` property instead)?

We already do, see the node "Selective Display".  And you already
asked this several years ago ;-)

  http://lists.gnu.org/archive/html/emacs-devel/2016-01/msg00371.html



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 16:13                   ` Eli Zaretskii
@ 2019-03-17 17:36                     ` Stefan Monnier
  2019-03-17 21:14                       ` Eradicating selective-display == t (was: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line) Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2019-03-17 17:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

> We already do, see the node "Selective Display".  And you already
> asked this several years ago ;-)
>   http://lists.gnu.org/archive/html/emacs-devel/2016-01/msg00371.html

Great!
So now let's get rid of all uses of it.

AFAICT within Emacs's `master` it was only used in Dired and
Ebrowse, so I just pushed a change to get rid of it in Dired.


        Stefan



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 15:17               ` Eli Zaretskii
  2019-03-17 15:52                 ` Stefan Monnier
@ 2019-03-17 19:06                 ` Konstantin Kharlamov
  2019-03-17 19:22                   ` Eli Zaretskii
  1 sibling, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17 19:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вс, мар 17, 2019 at 6:17 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Sun, 17 Mar 2019 06:41:41 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  > The ^M character is what causes that "..." ellipsis.  You cannot
>>  > search for it interactively because Emacs prevents that, but the
>>  > character is there in the buffer text.
>> 
>>  Okay, well, I couldn't find it by evaluating (re-search-forward 
>> "^M")
>>  either.
>> 
>>  So, given the character can't be inspected, the old code couldn't 
>> even
>>  do anything :)
> 
> I suggest to read the node "Selective Display" in the ELisp manual
> about this feature, and how the ^M characters come into play.

Ok, the docs say that every newline in "invisible part" is replaced 
with ^M.

But this doesn't change the fact this ^M can't be inspected, in 
particular by (looking-at "\^m") that the 2-nd patch removes. I just 
tested that.

Oh well, whatever, I'm not really motivated to discuss that, let's just 
drop 2-nd patch. Are patches 1 and 3 okay?





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 19:06                 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
@ 2019-03-17 19:22                   ` Eli Zaretskii
  2019-03-17 19:29                     ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-17 19:22 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sun, 17 Mar 2019 22:06:26 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> Are patches 1 and 3 okay?

Part 3 has the same problem as part 2, and I think I already responded
to it.

Part 1 I need to look closer, will do soon.

Thanks.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 19:22                   ` Eli Zaretskii
@ 2019-03-17 19:29                     ` Konstantin Kharlamov
  2019-03-17 20:21                       ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17 19:29 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вс, мар 17, 2019 at 10:22 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Sun, 17 Mar 2019 22:06:26 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  Are patches 1 and 3 okay?
> 
> Part 3 has the same problem as part 2, and I think I already responded
> to it.

Ah, sorry, I thought that was a general comment, i.e. a reply to my 
mail but not specific to the patch.

Okay, so: ^M appears in selective-display-mode only in the end of a 
line. So, matching the ^M have been relevant before the patch: we 
wanted to match beginning of the line, which is defined by ^M character.

But after my patch applied we do not match beginning of the line 
anymore, at all, not in any mode. We only match the exact tag, with 
trimmed space. I.e. matching for ^ in usual mode and for ^M in 
selective-display-mode is no longer needed.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 19:29                     ` Konstantin Kharlamov
@ 2019-03-17 20:21                       ` Eli Zaretskii
  2019-03-17 20:27                         ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-17 20:21 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sun, 17 Mar 2019 22:29:55 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> Okay, so: ^M appears in selective-display-mode only in the end of a 
> line.

No, ^M _replaces_ newline characters, so what was previously several
lines is now a single long line.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 20:21                       ` Eli Zaretskii
@ 2019-03-17 20:27                         ` Konstantin Kharlamov
  2019-03-17 20:40                           ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17 20:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вс, мар 17, 2019 at 11:21 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Sun, 17 Mar 2019 22:29:55 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  Okay, so: ^M appears in selective-display-mode only in the end of a
>>  line.
> 
> No, ^M _replaces_ newline characters, so what was previously several
> lines is now a single long line.

Sure, but after the patch we don't match the whole line anymore. We 
only match the tag. We don't care if it's at the beginning of the line 
or in the middle of it. We only look for the tag. So we don't care if 
line has a newline character or ^M.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 20:27                         ` Konstantin Kharlamov
@ 2019-03-17 20:40                           ` Eli Zaretskii
  2019-03-17 20:44                             ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-17 20:40 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sun, 17 Mar 2019 23:27:30 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> >>  Okay, so: ^M appears in selective-display-mode only in the end of a
> >>  line.
> > 
> > No, ^M _replaces_ newline characters, so what was previously several
> > lines is now a single long line.
> 
> Sure, but after the patch we don't match the whole line anymore. We 
> only match the tag. We don't care if it's at the beginning of the line 
> or in the middle of it. We only look for the tag. So we don't care if 
> line has a newline character or ^M.

But that's incorrect: a tag in a tags table always begins at the
beginning of a line, so it must be a search anchored at the beginning
of the line.  And in selective-display mode ^M counts as the beginning
of a line.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 20:40                           ` Eli Zaretskii
@ 2019-03-17 20:44                             ` Konstantin Kharlamov
  2019-03-18  3:34                               ` Eli Zaretskii
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17 20:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вс, мар 17, 2019 at 11:40 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Sun, 17 Mar 2019 23:27:30 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  >>  Okay, so: ^M appears in selective-display-mode only in the end 
>> of a
>>  >>  line.
>>  >
>>  > No, ^M _replaces_ newline characters, so what was previously 
>> several
>>  > lines is now a single long line.
>> 
>>  Sure, but after the patch we don't match the whole line anymore. We
>>  only match the tag. We don't care if it's at the beginning of the 
>> line
>>  or in the middle of it. We only look for the tag. So we don't care 
>> if
>>  line has a newline character or ^M.
> 
> But that's incorrect: a tag in a tags table always begins at the
> beginning of a line, so it must be a search anchored at the beginning
> of the line.  And in selective-display mode ^M counts as the beginning
> of a line.

Great, now that we established that part, to reply your question why we 
don't care about the beginnging of the line let me quote my other mail:

 > The pattern that this functions searches for determines the tag 
uniquely. But here's a catch: no programming language creates distinc 
entities (ones that end up in the tag), based only on trailing space. 
I.e. "foo()" and " foo() " always refer to the same thing.
 >
 > So this change gives 2 improvements:
 > 1. Emacs gonna stop failing finding a tag when someone simply 
reindented the sources
 > 2. As a side effect, this works around a problem, when a 
tags-generating program trimmed the whitespace (the commit has a link 
to anjuta-tags bugreport about that).






^ permalink raw reply	[flat|nested] 45+ messages in thread

* Eradicating selective-display == t (was: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line)
  2019-03-17 17:36                     ` Stefan Monnier
@ 2019-03-17 21:14                       ` Stefan Monnier
  2019-03-17 21:32                         ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2019-03-17 21:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

> AFAICT within Emacs's `master` it was only used in Dired and
> Ebrowse, so I just pushed a change to get rid of it in Dired.

I have a patch for Ebrowse as well, but I can't test it, cause I have no
C++ code at hand to play with.

Can someone help me test the patch below?


        Stefan


diff --git a/lisp/progmodes/ebrowse.el b/lisp/progmodes/ebrowse.el
index f501f7353b..5bdc7b2bfb 100644
--- a/lisp/progmodes/ebrowse.el
+++ b/lisp/progmodes/ebrowse.el
@@ -1,4 +1,4 @@
-;;; ebrowse.el --- Emacs C++ class browser & tags facility
+;;; ebrowse.el --- Emacs C++ class browser & tags facility  -*- lexical-binding:t -*-
 
 ;; Copyright (C) 1992-2019 Free Software Foundation, Inc.
 
@@ -233,30 +233,12 @@ ebrowse-position
     found))
 
 
-(defmacro ebrowse-output (&rest body)
-  "Eval BODY with a writable current buffer.
-Preserve buffer's modified state."
-  (declare (indent 0) (debug t))
-  (let ((modified (make-symbol "--ebrowse-output--")))
-    `(let (buffer-read-only (,modified (buffer-modified-p)))
-       (unwind-protect
-	   (progn ,@body)
-	 (set-buffer-modified-p ,modified)))))
-
-
 (defmacro ebrowse-ignoring-completion-case (&rest body)
   "Eval BODY with `completion-ignore-case' bound to t."
   (declare (indent 0) (debug t))
   `(let ((completion-ignore-case t))
      ,@body))
 
-(defmacro ebrowse-save-selective (&rest body)
-  "Eval BODY with `selective-display' restored at the end."
-  (declare (indent 0) (debug t))
-  ;; FIXME: Don't use selective-display.
-  `(let ((selective-display selective-display))
-     ,@body))
-
 (defmacro ebrowse-for-all-trees (spec &rest body)
   "For all trees in SPEC, eval BODY."
   (declare (indent 1) (debug ((sexp form) body)))
@@ -303,7 +285,7 @@ ebrowse-rename-buffer
 (defun ebrowse-trim-string (string)
   "Return a copy of STRING with leading white space removed.
 Replace sequences of newlines with a single space."
-  (when (string-match "^[ \t\n\r]+" string)
+  (when (string-match "^[ \t\n]+" string)
     (setq string (substring string (match-end 0))))
   (cl-loop while (string-match "[\n]+" string)
            finally return string do
@@ -688,7 +670,7 @@ ebrowse-files-list
   "Return a list containing all files mentioned in a tree.
 MARKED-ONLY non-nil means include marked classes only."
   (let (list)
-    (maphash (lambda (file _dummy) (setq list (cons file list)))
+    (maphash (lambda (file _dummy) (push file list))
 	     (ebrowse-files-table marked-only))
     list))
 
@@ -865,7 +847,7 @@ ebrowse-read
     ;; Read Lisp objects.  Temporarily increase `gc-cons-threshold' to
     ;; prevent a GC that would not free any memory.
     (let ((gc-cons-threshold 2000000))
-      (while (not (progn (skip-chars-forward " \t\n\r") (eobp)))
+      (while (not (progn (skip-chars-forward " \t\n") (eobp)))
 	(let* ((root (read (current-buffer)))
 	       (old-root-ptr (ebrowse-class-in-tree root tree)))
 	  (ebrowse-show-progress "Reading data" (null tree))
@@ -996,7 +978,6 @@ ebrowse-insert-supers
                               (ebrowse-qualified-class-name
                                (ebrowse-ts-class (car subclass)))
                               classes)
-                    as next = nil
                     do
                     ;; Replace the subclass tree with the one found in
                     ;; CLASSES if there is already an entry for that class
@@ -1096,8 +1077,7 @@ ebrowse-tree-mode
     (set (make-local-variable 'ebrowse--frozen-flag) nil)
     (setq mode-line-buffer-identification ident)
     (setq buffer-read-only t)
-    (setq selective-display t)
-    (setq selective-display-ellipses t)
+    (add-to-invisibility-spec '(ebrowse . t))
     (set (make-local-variable 'revert-buffer-function)
          #'ebrowse-revert-tree-buffer-from-file)
     (set (make-local-variable 'ebrowse--header) header)
@@ -1107,7 +1087,7 @@ ebrowse-tree-mode
          (and tree (ebrowse-build-tree-obarray tree)))
     (set (make-local-variable 'ebrowse--frozen-flag) nil)
 
-    (add-hook 'write-file-functions 'ebrowse-write-file-hook-fn nil t)
+    (add-hook 'write-file-functions #'ebrowse-write-file-hook-fn nil t)
     (modify-syntax-entry ?_ (char-to-string (char-syntax ?a)))
     (when tree
       (ebrowse-redraw-tree)
@@ -1184,7 +1164,7 @@ ebrowse-toggle-mark-at-point
       ;; by a regexp replace over the whole buffer. The reason for this
       ;; is that classes might have multiple base classes. If this is
       ;; the case, they are displayed more than once in the tree.
-      (ebrowse-output
+      (with-silent-modifications
 	(cl-loop
          for tree in to-change
          as regexp = (concat "^.*\\b"
@@ -1213,7 +1193,7 @@ ebrowse-redraw-marks
   "Display class marker signs in the tree between START and END."
   (interactive)
   (save-excursion
-    (ebrowse-output
+    (with-silent-modifications
       (catch 'end
 	(goto-char (point-min))
 	(dolist (root ebrowse--tree)
@@ -1242,8 +1222,8 @@ ebrowse-show-file-name-at-point
 With PREFIX, insert that many filenames."
   (interactive "p")
   (unless ebrowse--show-file-names-flag
-    (ebrowse-output
-      (dotimes (i prefix)
+    (with-silent-modifications
+      (dotimes (_ prefix)
 	(let ((tree (ebrowse-tree-at-point))
 	      start
 	      file-name-existing)
@@ -1393,6 +1373,18 @@ ebrowse-pop-to-browser-buffer
 
 
 \f
+;;; Functions to hide/unhide text
+
+(defun ebrowse--hidden-p (&optional pos)
+  (eq (get-char-property (or pos (point)) 'invisible) 'ebrowse))
+
+(defun ebrowse--hide (start end)
+  (put-text-property start end 'invisible 'ebrowse))
+
+(defun ebrowse--unhide (start end)
+  ;; FIXME: This also removes other invisible properties!
+  (remove-text-properties start end '(invisible)))
+
 ;;; Misc tree buffer commands
 
 (defun ebrowse-set-tree-indentation ()
@@ -1418,16 +1410,14 @@ ebrowse-read-class-name-and-go
       (setf class
 	    (completing-read "Goto class: "
 			     (ebrowse-tree-obarray-as-alist) nil t)))
-    (ebrowse-save-selective
-      (goto-char (point-min))
-      (widen)
-      (setf selective-display nil)
-      (setq ebrowse--last-regexp (concat "\\b" class "\\b"))
-      (if (re-search-forward ebrowse--last-regexp nil t)
-	  (progn
-	    (goto-char (match-beginning 0))
-	    (ebrowse-unhide-base-classes))
-	(error "Not found")))))
+    (goto-char (point-min))
+    (widen)
+    (setq ebrowse--last-regexp (concat "\\b" class "\\b"))
+    (if (re-search-forward ebrowse--last-regexp nil t)
+	(progn
+	  (goto-char (match-beginning 0))
+	  (ebrowse-unhide-base-classes))
+      (error "Not found"))))
 
 
 \f
@@ -1556,7 +1546,7 @@ ebrowse-view-exit-fn
       (setq original-frame-configuration ebrowse--frame-configuration
 	    exit-action ebrowse--view-exit-action))
     ;; Delete the frame in which we viewed.
-    (mapc 'delete-frame
+    (mapc #'delete-frame
 	  (cl-loop for frame in (frame-list)
                    when (not (assq frame original-frame-configuration))
                    collect frame))
@@ -1610,9 +1600,7 @@ ebrowse-view/find-file-and-search-pattern
   (cond (view
 	 (setf ebrowse-temp-position-to-view struc
 	       ebrowse-temp-info-to-view info)
-	 (unless (boundp 'view-mode-hook)
-	   (setq view-mode-hook nil))
-	 (push 'ebrowse-find-pattern view-mode-hook)
+         (add-hook 'view-mode-hook #'ebrowse-find-pattern)
 	 (pcase where
 	   ('other-window (view-file-other-window file))
 	   ('other-frame  (ebrowse-view-file-other-frame file))
@@ -1676,7 +1664,7 @@ ebrowse-pp-define-regexp
 
 INFO is a list (TREE-HEADER TREE-OR-MEMBER MEMBER-LIST)."
   (unless position
-    (pop view-mode-hook)
+    (remove-hook 'view-mode-hook #'ebrowse-find-pattern)
     (setf viewing t
 	  position ebrowse-temp-position-to-view
 	  info ebrowse-temp-info-to-view))
@@ -1685,7 +1673,7 @@ ebrowse-pp-define-regexp
 	 (start (ebrowse-bs-point position))
 	 (offset 100)
 	 found)
-    (pcase-let ((`(,header ,class-or-member ,member-list) info))
+    (pcase-let ((`(,_header ,class-or-member ,member-list) info))
       ;; If no pattern is specified, construct one from the member name.
       (when (stringp pattern)
 	(setq pattern (concat "^.*" (regexp-quote pattern))))
@@ -1749,7 +1737,7 @@ ebrowse-redraw-tree
   (interactive)
   (or quietly (message "Displaying..."))
   (save-excursion
-    (ebrowse-output
+    (with-silent-modifications
       (erase-buffer)
       (ebrowse-draw-tree-fn)))
   (ebrowse-update-tree-buffer-mode-line)
@@ -1816,7 +1804,8 @@ ebrowse-set-mark-props
                    (nconc (copy-sequence (ebrowse-ts-subclasses tree)) stack2)
                    stack1
                    (nconc (make-list (length (ebrowse-ts-subclasses tree))
-                                     (1+ level)) stack1)))))
+                                     (1+ level))
+                          stack1)))))
 
 
 \f
@@ -1844,69 +1833,60 @@ ebrowse-expand-all
   "Expand or fold all trees in the buffer.
 COLLAPSE non-nil means fold them."
   (interactive "P")
-  (let ((line-end  (if collapse "^\n" "^\r"))
-	(insertion (if collapse "\r"  "\n")))
-    (ebrowse-output
+  (with-silent-modifications
+    (if (not collapse)
+        (ebrowse--unhide (point-min) (point-max))
       (save-excursion
 	(goto-char (point-min))
-	(while (not (progn (skip-chars-forward line-end) (eobp)))
-	  (when (or (not collapse)
-		    (looking-at "\n "))
-	    (delete-char 1)
-	    (insert insertion))
-	  (when collapse
-	    (skip-chars-forward "\n ")))))))
+	(while (progn (end-of-line) (not (eobp)))
+	  (when (looking-at "\n ")
+            (ebrowse--hide (point) (line-end-position 2)))
+	  (skip-chars-forward "\n "))))))
 
 
 (defun ebrowse-unhide-base-classes ()
   "Unhide the line the cursor is on and all base classes."
-  (ebrowse-output
+  (with-silent-modifications
     (save-excursion
       (let (indent last-indent)
-	(skip-chars-backward "^\r\n")
-	(when (not (looking-at "[\r\n][^ \t]"))
-	  (skip-chars-forward "\r\n \t")
+	(forward-line 0)
+	(when (not (looking-at "\n[^ \t]"))
+	  (skip-chars-forward "\n \t")
 	  (while (and (or (null last-indent) ;first time
 			  (> indent 1))	;not root class
-		      (re-search-backward "[\r\n][ \t]*" nil t))
+		      (re-search-backward "\n[ \t]*" nil t))
 	    (setf indent (- (match-end 0)
 			    (match-beginning 0)))
 	    (when (or (null last-indent)
 		      (< indent last-indent))
 	      (setf last-indent indent)
-	      (when (looking-at "\r")
-		(delete-char 1)
-		(insert 10)))
-	    (backward-char 1)))))))
+	      (when (ebrowse--hidden-p)
+                (ebrowse--unhide (point) (line-end-position 2))))))))))
 
 
 (defun ebrowse-hide-line (collapse)
   "Hide/show a single line in the tree.
 COLLAPSE non-nil means hide."
-  (save-excursion
-    (ebrowse-output
-      (skip-chars-forward "^\r\n")
-      (delete-char 1)
-      (insert (if collapse 13 10)))))
+  (with-silent-modifications
+    (funcall (if collapse #'ebrowse--hide #'ebrowse--unhide)
+             (line-end-position) (line-end-position 2))))
 
 
 (defun ebrowse-collapse-fn (collapse)
   "Collapse or expand a branch of the tree.
 COLLAPSE non-nil means collapse the branch."
-  (ebrowse-output
+  (with-silent-modifications
     (save-excursion
       (beginning-of-line)
       (skip-chars-forward "> \t")
       (let ((indentation (current-column)))
 	(while (and (not (eobp))
 		    (save-excursion
-		      (skip-chars-forward "^\r\n")
-		      (goto-char (1+ (point)))
+		      (forward-line 1)
 		      (skip-chars-forward "> \t")
 		      (> (current-column) indentation)))
 	  (ebrowse-hide-line collapse)
-	  (skip-chars-forward "^\r\n")
-	  (goto-char (1+ (point))))))))
+	  (forward-line 1))))))
 
 \f
 ;;; Electric tree selection
@@ -2164,7 +2144,7 @@ ebrowse-choose-from-browser-buffers
 ;;;###autoload
 (define-derived-mode ebrowse-member-mode special-mode "Ebrowse-Members"
   "Major mode for Ebrowse member buffers."
-  (mapc 'make-local-variable
+  (mapc #'make-local-variable
 	'(ebrowse--decl-column	        ;display column
 	  ebrowse--n-columns		;number of short columns
 	  ebrowse--column-width	        ;width of columns above
@@ -2587,7 +2567,7 @@ ebrowse-redisplay-member-buffer
   (let ((display-fn (if ebrowse--long-display-flag
 			'ebrowse-draw-member-long-fn
 		      'ebrowse-draw-member-short-fn)))
-    (ebrowse-output
+    (with-silent-modifications
       (erase-buffer)
       ;; Show this class
       (ebrowse-draw-member-buffer-class-line)
@@ -2708,7 +2688,7 @@ ebrowse-draw-member-regexp
 (defun ebrowse-draw-member-long-fn (member-list tree)
   "Display member buffer for MEMBER-LIST in long form.
 TREE is the class tree of MEMBER-LIST."
-  (dolist (member-struc (mapcar 'ebrowse-member-display-p member-list))
+  (dolist (member-struc (mapcar #'ebrowse-member-display-p member-list))
     (when member-struc
       (let ((name (ebrowse-ms-name member-struc))
 	    (start (point)))
@@ -3243,7 +3223,8 @@ ebrowse-tags-read-name
 	(if members
 	    (let* ((name (ebrowse-ignoring-completion-case
 			   (completing-read prompt members nil nil member-name)))
-		   (completion-result (try-completion name members)))
+		   ;; (completion-result (try-completion name members))
+                   )
 	      ;; Cannot rely on `try-completion' returning t for exact
 	      ;; matches!  It returns the name as a string.
 	      (unless (gethash name members)
@@ -3794,14 +3775,13 @@ ebrowse-view/find-position
 	 (find-file (ebrowse-position-file-name position))
 	 (goto-char (ebrowse-position-point position)))
 	(t
-	 (unwind-protect
-	     (progn
-	       (push (function
-		      (lambda ()
-			(goto-char (ebrowse-position-point position))))
-		     view-mode-hook)
-	       (view-file (ebrowse-position-file-name position)))
-	   (pop view-mode-hook)))))
+         (let ((fn (lambda ()
+		     (goto-char (ebrowse-position-point position)))))
+	   (unwind-protect
+               (progn
+	         (add-hook 'view-mode-hook fn)
+	         (view-file (ebrowse-position-file-name position)))
+	     (remove-hook 'view-mode-hook fn))))))
 
 
 (defun ebrowse-push-position (marker info &optional target)
@@ -3904,6 +3884,7 @@ ebrowse-electric-position-mode
   (setq mode-line-buffer-identification "Electric Position Menu")
   (when (memq 'mode-name mode-line-format)
     (setq mode-line-format (copy-sequence mode-line-format))
+    ;; FIXME: Why not set `mode-name' to "Positions"?
     (setcar (memq 'mode-name mode-line-format) "Positions"))
   (set (make-local-variable 'Helper-return-blurb) "return to buffer editing")
   (setq truncate-lines t
@@ -4050,7 +4031,7 @@ ebrowse-save-tree-as
 	  (erase-buffer)
 	  (setf (ebrowse-hs-member-table header) nil)
 	  (insert (prin1-to-string header) " ")
-	  (mapc 'ebrowse-save-class tree)
+	  (mapc #'ebrowse-save-class tree)
 	  (write-file file-name)
 	  (message "Tree written to file `%s'" file-name))
       (kill-buffer temp-buffer)
@@ -4065,7 +4046,7 @@ ebrowse-save-class
   (insert "[ebrowse-ts ")
   (prin1 (ebrowse-ts-class class))	;class name
   (insert "(")				;list of subclasses
-  (mapc 'ebrowse-save-class (ebrowse-ts-subclasses class))
+  (mapc #'ebrowse-save-class (ebrowse-ts-subclasses class))
   (insert ")")
   (dolist (func ebrowse-member-list-accessors)
     (prin1 (funcall func class))
@@ -4252,12 +4233,12 @@ ebrowse-electric-buffer-list
   (unwind-protect
       (progn
 	(add-hook 'electric-buffer-menu-mode-hook
-		  'ebrowse-hack-electric-buffer-menu)
+		  #'ebrowse-hack-electric-buffer-menu)
 	(add-hook 'electric-buffer-menu-mode-hook
-		  'ebrowse-install-1-to-9-keys)
+		  #'ebrowse-install-1-to-9-keys)
 	(call-interactively 'electric-buffer-list))
     (remove-hook 'electric-buffer-menu-mode-hook
-		 'ebrowse-hack-electric-buffer-menu)))
+		 #'ebrowse-hack-electric-buffer-menu)))
 
 \f
 ;;; Mouse support
@@ -4400,8 +4381,7 @@ ebrowse-mouse-1-in-tree-buffer
     (pcase (event-click-count event)
       (2 (pcase property
 	   ('class-name
-	    (let ((collapsed (save-excursion (skip-chars-forward "^\r\n")
-					     (looking-at "\r"))))
+	    (let ((collapsed (ebrowse--hidden-p (line-end-position))))
 	      (ebrowse-collapse-fn (not collapsed))))
 	   ('mark
 	    (ebrowse-toggle-mark-at-point 1)))))))
@@ -4411,9 +4391,7 @@ ebrowse-mouse-1-in-tree-buffer
 (provide 'ebrowse)
 
 ;; Local variables:
-;; eval:(put 'ebrowse-output 'lisp-indent-hook 0)
 ;; eval:(put 'ebrowse-ignoring-completion-case 'lisp-indent-hook 0)
-;; eval:(put 'ebrowse-save-selective 'lisp-indent-hook 0)
 ;; eval:(put 'ebrowse-for-all-trees 'lisp-indent-hook 1)
 ;; End:
 



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Eradicating selective-display == t (was: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line)
  2019-03-17 21:14                       ` Eradicating selective-display == t (was: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line) Stefan Monnier
@ 2019-03-17 21:32                         ` Konstantin Kharlamov
  2019-03-18  1:12                           ` Eradicating selective-display == t Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-17 21:32 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, emacs-devel



В Пн, мар 18, 2019 at 12:14 ДП (AM), Stefan Monnier 
<monnier@iro.umontreal.ca> написал:
>>  AFAICT within Emacs's `master` it was only used in Dired and
>>  Ebrowse, so I just pushed a change to get rid of it in Dired.
> 
> I have a patch for Ebrowse as well, but I can't test it, cause I have 
> no
> C++ code at hand to play with.
> 
> Can someone help me test the patch below?

I can test, but only if you tell how. It's first time I hear of 
ebrowse, and from looking at manual and ebrowse-* commands it have vast 
functional, I don't know what to look at.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Eradicating selective-display == t
  2019-03-17 21:32                         ` Konstantin Kharlamov
@ 2019-03-18  1:12                           ` Stefan Monnier
  2019-03-18  9:16                             ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2019-03-18  1:12 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: Eli Zaretskii, emacs-devel

>>>  AFAICT within Emacs's `master` it was only used in Dired and
>>>  Ebrowse, so I just pushed a change to get rid of it in Dired.
>>
>> I have a patch for Ebrowse as well, but I can't test it, cause I have no
>> C++ code at hand to play with.
>>
>> Can someone help me test the patch below?
>
> I can test, but only if you tell how. It's first time I hear of ebrowse, and
> from looking at manual and ebrowse-* commands it have vast functional,
> I don't know what to look at.

I think the only things that need testing are the hide/unhide commands.


        Stefan



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-17 20:44                             ` Konstantin Kharlamov
@ 2019-03-18  3:34                               ` Eli Zaretskii
  2019-03-18  9:43                                 ` Konstantin Kharlamov
  0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-18  3:34 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Sun, 17 Mar 2019 23:44:28 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> > But that's incorrect: a tag in a tags table always begins at the
> > beginning of a line, so it must be a search anchored at the beginning
> > of the line.  And in selective-display mode ^M counts as the beginning
> > of a line.
> 
> Great, now that we established that part, to reply your question why we 
> don't care about the beginnging of the line let me quote my other mail:
> 
>  > The pattern that this functions searches for determines the tag 
> uniquely. But here's a catch: no programming language creates distinc 
> entities (ones that end up in the tag), based only on trailing space. 
> I.e. "foo()" and " foo() " always refer to the same thing.

I'm not talking about whitespace.  I'm talking about a tags table file
that names a symbol 'foobar', say.  If you search for a tag "bar" and
do not anchor the search at the beginning of a line, you will decide
that "bar" is present on the "foobar" line, although it really isn't.
Right?

If we want to solve a problem with variable leading whitespace, we
need a more sophisticated solution that just dropping the anchor.

Or did I miss something?



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Eradicating selective-display == t
  2019-03-18  1:12                           ` Eradicating selective-display == t Stefan Monnier
@ 2019-03-18  9:16                             ` Konstantin Kharlamov
  2019-03-18 12:10                               ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18  9:16 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Eli Zaretskii, emacs-devel



On Пн, Mar 18, 2019 at 04:12:09, Stefan Monnier 
<monnier@iro.umontreal.ca> wrote:
>>>>   AFAICT within Emacs's `master` it was only used in Dired and
>>>>   Ebrowse, so I just pushed a change to get rid of it in Dired.
>>> 
>>>  I have a patch for Ebrowse as well, but I can't test it, cause I 
>>> have no
>>>  C++ code at hand to play with.
>>> 
>>>  Can someone help me test the patch below?
>> 
>>  I can test, but only if you tell how. It's first time I hear of 
>> ebrowse, and
>>  from looking at manual and ebrowse-* commands it have vast 
>> functional,
>>  I don't know what to look at.
> 
> I think the only things that need testing are the hide/unhide 
> commands.

Ok, so, with the diff applied, ebrowse-collapse-branch and 
ebrowse-expand-all works fine for me.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18  3:34                               ` Eli Zaretskii
@ 2019-03-18  9:43                                 ` Konstantin Kharlamov
  2019-03-18  9:57                                   ` Konstantin Kharlamov
  2019-03-18 17:00                                   ` Eli Zaretskii
  0 siblings, 2 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18  9:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



On Пн, Mar 18, 2019 at 06:34:00, Eli Zaretskii <eliz@gnu.org> wrote:
>>  Date: Sun, 17 Mar 2019 23:44:28 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  > But that's incorrect: a tag in a tags table always begins at the
>>  > beginning of a line, so it must be a search anchored at the 
>> beginning
>>  > of the line.  And in selective-display mode ^M counts as the 
>> beginning
>>  > of a line.
>> 
>>  Great, now that we established that part, to reply your question 
>> why we
>>  don't care about the beginnging of the line let me quote my other 
>> mail:
>> 
>>   > The pattern that this functions searches for determines the tag
>>  uniquely. But here's a catch: no programming language creates 
>> distinc
>>  entities (ones that end up in the tag), based only on trailing 
>> space.
>>  I.e. "foo()" and " foo() " always refer to the same thing.
> 
> I'm not talking about whitespace.  I'm talking about a tags table file
> that names a symbol 'foobar', say.  If you search for a tag "bar" and
> do not anchor the search at the beginning of a line, you will decide
> that "bar" is present on the "foobar" line, although it really isn't.
> Right?

Not exactly. Here's an alternative bad situation: let's say you do 
anchor the text, and you search for tag 'foo'. And… you still match 
'foobar'!

Actually, it's interesting, that such name clashes are possible right 
now: let's say we have:

	#define FOO
	#define FOO_BAR

If source code is intact, you should get FOO. But if code changed, then 
emacs tries to find where did it go, and may as well stumble upon 
FOO_BAR.

So, I suggest an improvement to my patch: how about we

1. anchor the regexp to the end of the line also
2. replace trailing space with "any whitespace" regex '\s-*'

?





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18  9:43                                 ` Konstantin Kharlamov
@ 2019-03-18  9:57                                   ` Konstantin Kharlamov
  2019-03-18 17:00                                   ` Eli Zaretskii
  1 sibling, 0 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18  9:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



On Пн, Mar 18, 2019 at 12:43:16, Konstantin Kharlamov 
<hi-angel@yandex.ru> wrote:
> 
> 
> On Пн, Mar 18, 2019 at 06:34:00, Eli Zaretskii <eliz@gnu.org> wrote:
>>>  Date: Sun, 17 Mar 2019 23:44:28 +0300
>>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>>  Cc: emacs-devel@gnu.org
>>> 
>>>  > But that's incorrect: a tag in a tags table always begins at the
>>>  > beginning of a line, so it must be a search anchored at the 
>>> \x7f\x7fbeginning
>>>  > of the line.  And in selective-display mode ^M counts as the 
>>> \x7f\x7fbeginning
>>>  > of a line.
>>> 
>>>  Great, now that we established that part, to reply your question 
>>> \x7f\x7fwhy we
>>>  don't care about the beginnging of the line let me quote my other 
>>> \x7f\x7fmail:
>>> 
>>>   > The pattern that this functions searches for determines the tag
>>>  uniquely. But here's a catch: no programming language creates 
>>> \x7f\x7fdistinc
>>>  entities (ones that end up in the tag), based only on trailing 
>>> \x7f\x7fspace.
>>>  I.e. "foo()" and " foo() " always refer to the same thing.
>> 
>> I'm not talking about whitespace.  I'm talking about a tags table 
>> file
>> that names a symbol 'foobar', say.  If you search for a tag "bar" and
>> do not anchor the search at the beginning of a line, you will decide
>> that "bar" is present on the "foobar" line, although it really isn't.
>> Right?
> 
> Not exactly. Here's an alternative bad situation: let's say you do 
> anchor the text, and you search for tag 'foo'. And… you still match 
> 'foobar'!
> 
> Actually, it's interesting, that such name clashes are possible right 
> now: let's say we have:
> 
> 	#define FOO
> 	#define FOO_BAR
> 
> If source code is intact, you should get FOO. But if code changed, 
> then emacs tries to find where did it go, and may as well stumble 
> upon FOO_BAR.
> 
> So, I suggest an improvement to my patch: how about we
> 
> 1. anchor the regexp to the end of the line also
> 2. replace trailing space with "any whitespace" regex '\s-*'
> 
> ?

To be clear: I suggest that we keep anchoring to the beginning of a 
line in place, add anchoring to the end of line, and replace trailing 
whitespace with "any whitespace" regex.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Eradicating selective-display == t
  2019-03-18  9:16                             ` Konstantin Kharlamov
@ 2019-03-18 12:10                               ` Stefan Monnier
  0 siblings, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2019-03-18 12:10 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: Eli Zaretskii, emacs-devel

> Ok, so, with the diff applied, ebrowse-collapse-branch and
> ebrowse-expand-all works fine for me.

Great, thanks!


        Stefan



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18  9:43                                 ` Konstantin Kharlamov
  2019-03-18  9:57                                   ` Konstantin Kharlamov
@ 2019-03-18 17:00                                   ` Eli Zaretskii
  2019-03-18 19:15                                     ` Konstantin Kharlamov
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-18 17:00 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Mon, 18 Mar 2019 12:43:16 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> > I'm not talking about whitespace.  I'm talking about a tags table file
> > that names a symbol 'foobar', say.  If you search for a tag "bar" and
> > do not anchor the search at the beginning of a line, you will decide
> > that "bar" is present on the "foobar" line, although it really isn't.
> > Right?
> 
> Not exactly. Here's an alternative bad situation: let's say you do 
> anchor the text, and you search for tag 'foo'. And… you still match 
> 'foobar'!

That's expected, and how etags.el should work: it finds tags that
_begin_ with the specified text.  Partial matches are filtered out by
higher-level routines, if needed.

But with your proposed change the match will be in the middle of a
symbol as well, something the callers don't expect.

> 	#define FOO
> 	#define FOO_BAR
> 
> If source code is intact, you should get FOO. But if code changed, then 
> emacs tries to find where did it go, and may as well stumble upon 
> FOO_BAR.

That's okay, that's how this low-level stuff is supposed to work.

> So, I suggest an improvement to my patch: how about we
> 
> 1. anchor the regexp to the end of the line also
> 2. replace trailing space with "any whitespace" regex '\s-*'
> 
> ?

etags.el is used by/supports many major modes, and in general I don't
think we want to assume that whitespace in a tag is insignificant,
certainly not as a global change in behavior.

So I would actually suggest to make one step back and describe in more
detail the actual problem you had with the current code.  The anjuta
issue to which you pointed doesn't have enough details, like why the
change in leading whitespace was deemed a problem, and so I cannot
make up my mind what is the actual problem and why it should be fixed
in etags.el.

Can you provide those additional details?

TIA



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 17:00                                   ` Eli Zaretskii
@ 2019-03-18 19:15                                     ` Konstantin Kharlamov
  2019-03-18 19:25                                       ` Konstantin Kharlamov
  2019-03-18 20:16                                       ` Eli Zaretskii
  0 siblings, 2 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18 19:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Пн, мар 18, 2019 at 8:00 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Mon, 18 Mar 2019 12:43:16 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  > I'm not talking about whitespace.  I'm talking about a tags table 
>> file
>>  > that names a symbol 'foobar', say.  If you search for a tag "bar" 
>> and
>>  > do not anchor the search at the beginning of a line, you will 
>> decide
>>  > that "bar" is present on the "foobar" line, although it really 
>> isn't.
>>  > Right?
>> 
>>  Not exactly. Here's an alternative bad situation: let's say you do
>>  anchor the text, and you search for tag 'foo'. And… you still 
>> match
>>  'foobar'!
> 
> That's expected, and how etags.el should work: it finds tags that
> _begin_ with the specified text.  Partial matches are filtered out by
> higher-level routines, if needed.
> 
> But with your proposed change the match will be in the middle of a
> symbol as well, something the callers don't expect.
> 
>>  	#define FOO
>>  	#define FOO_BAR
>> 
>>  If source code is intact, you should get FOO. But if code changed, 
>> then
>>  emacs tries to find where did it go, and may as well stumble upon
>>  FOO_BAR.
> 
> That's okay, that's how this low-level stuff is supposed to work.
> 
>>  So, I suggest an improvement to my patch: how about we
>> 
>>  1. anchor the regexp to the end of the line also
>>  2. replace trailing space with "any whitespace" regex '\s-*'
>> 
>>  ?
> 
> etags.el is used by/supports many major modes, and in general I don't
> think we want to assume that whitespace in a tag is insignificant,
> certainly not as a global change in behavior.
> 
> So I would actually suggest to make one step back and describe in more
> detail the actual problem you had with the current code.  The anjuta
> issue to which you pointed doesn't have enough details, like why the
> change in leading whitespace was deemed a problem, and so I cannot
> make up my mind what is the actual problem and why it should be fixed
> in etags.el.
> 
> Can you provide those additional details?

I'm not sure what additional details you want. I found a usecase where 
heuristic for finding a tag can be improved. I can make even stronger 
statement: all whitespace within a tag is insignificant, not only the 
trailing part.

Let's make it the other way around: please, provide any language 
example, where having the trailing space may be significant for 
unambigiously determining the tag.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 19:15                                     ` Konstantin Kharlamov
@ 2019-03-18 19:25                                       ` Konstantin Kharlamov
  2019-03-18 20:16                                       ` Eli Zaretskii
  1 sibling, 0 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18 19:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Пн, мар 18, 2019 at 10:15 ПП (PM), Konstantin Kharlamov 
<hi-angel@yandex.ru> написал:
> 
> 
> В Пн, мар 18, 2019 at 8:00 ПП (PM), Eli Zaretskii 
> <eliz@gnu.org> написал:
>>>  Date: Mon, 18 Mar 2019 12:43:16 +0300
>>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>>  Cc: emacs-devel@gnu.org
>>> 
>>>  > I'm not talking about whitespace.  I'm talking about a tags 
>>> table \x7f\x7ffile
>>>  > that names a symbol 'foobar', say.  If you search for a tag 
>>> "bar" \x7f\x7fand
>>>  > do not anchor the search at the beginning of a line, you will 
>>> \x7f\x7fdecide
>>>  > that "bar" is present on the "foobar" line, although it really 
>>> \x7f\x7fisn't.
>>>  > Right?
>>> 
>>>  Not exactly. Here's an alternative bad situation: let's say you do
>>>  anchor the text, and you search for tag 'foo'. And… you still 
>>> \x7f\x7fmatch
>>>  'foobar'!
>> 
>> That's expected, and how etags.el should work: it finds tags that
>> _begin_ with the specified text.  Partial matches are filtered out by
>> higher-level routines, if needed.
>> 
>> But with your proposed change the match will be in the middle of a
>> symbol as well, something the callers don't expect.
>> 
>>>  	#define FOO
>>>  	#define FOO_BAR
>>> 
>>>  If source code is intact, you should get FOO. But if code changed, 
>>> \x7f\x7fthen
>>>  emacs tries to find where did it go, and may as well stumble upon
>>>  FOO_BAR.
>> 
>> That's okay, that's how this low-level stuff is supposed to work.
>> 
>>>  So, I suggest an improvement to my patch: how about we
>>> 
>>>  1. anchor the regexp to the end of the line also
>>>  2. replace trailing space with "any whitespace" regex '\s-*'
>>> 
>>>  ?
>> 
>> etags.el is used by/supports many major modes, and in general I don't
>> think we want to assume that whitespace in a tag is insignificant,
>> certainly not as a global change in behavior.
>> 
>> So I would actually suggest to make one step back and describe in 
>> more
>> detail the actual problem you had with the current code.  The anjuta
>> issue to which you pointed doesn't have enough details, like why the
>> change in leading whitespace was deemed a problem, and so I cannot
>> make up my mind what is the actual problem and why it should be fixed
>> in etags.el.
>> 
>> Can you provide those additional details?
> 
> I'm not sure what additional details you want. I found a usecase 
> where heuristic for finding a tag can be improved. I can make even 
> stronger statement: all whitespace within a tag is insignificant, not 
> only the trailing part.

…as long of course as word and symbols boundaries preserved. Just to 
make it more clear.

> Let's make it the other way around: please, provide any language 
> example, where having the trailing space may be significant for 
> unambigiously determining the tag.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 19:15                                     ` Konstantin Kharlamov
  2019-03-18 19:25                                       ` Konstantin Kharlamov
@ 2019-03-18 20:16                                       ` Eli Zaretskii
  2019-03-18 21:45                                         ` Konstantin Kharlamov
  1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-18 20:16 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Mon, 18 Mar 2019 22:15:27 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> > Can you provide those additional details?
> 
> I'm not sure what additional details you want.

OK, let me ask more specific questions:

  1. Why was the amount of whitespace in the tags table different from
     that in the source file?
  2. What command(s) was/were used to produce the tags table?
  3. Why are the issue and you talking about "trailing whitespace",
     while the difference between Expected and Actual in the issue is
     in leading whitespace, not trailing whitespace?

> Let's make it the other way around: please, provide any language 
> example, where having the trailing space may be significant for 
> unambigiously determining the tag.

etags.el doesn't understand any languages, that is the job of the
program that produces the tags table.  etags.el just follows the rules
for the format of tags in the tags table.  I don't know about trailing
whitespace, but tags for HTML files surely include embedded
whitespace, for example.

So once again, I suggest to focus on the particular problem you had,
because I'd like to find a solution for that without making
backward-incompatible changes in behavior of etags.el.

Thanks.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 20:16                                       ` Eli Zaretskii
@ 2019-03-18 21:45                                         ` Konstantin Kharlamov
  2019-03-18 23:13                                           ` Konstantin Kharlamov
  2019-03-19  6:47                                           ` Eli Zaretskii
  0 siblings, 2 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18 21:45 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Пн, мар 18, 2019 at 11:16 ПП (PM), Eli Zaretskii 
<eliz@gnu.org> написал:
>>  Date: Mon, 18 Mar 2019 22:15:27 +0300
>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>  Cc: emacs-devel@gnu.org
>> 
>>  > Can you provide those additional details?
>> 
>>  I'm not sure what additional details you want.
> 
> OK, let me ask more specific questions:
> 
>   1. Why was the amount of whitespace in the tags table different from
>      that in the source file?

It's a bug in anjuta-tags

>   2. What command(s) was/were used to produce the tags table?

anjuta-tags -e file.vala

>   3. Why are the issue and you talking about "trailing whitespace",
>      while the difference between Expected and Actual in the issue is
>      in leading whitespace, not trailing whitespace?

Sorry for confusion here, I was imagining: given a string, whitespace 
may "trail" on both sides of it. But I'm not a native speaker.

>>  Let's make it the other way around: please, provide any language
>>  example, where having the trailing space may be significant for
>>  unambigiously determining the tag.
> 
> etags.el doesn't understand any languages, that is the job of the
> program that produces the tags table.  etags.el just follows the rules
> for the format of tags in the tags table.  I don't know about trailing
> whitespace, but tags for HTML files surely include embedded
> whitespace, for example.
> 
> So once again, I suggest to focus on the particular problem you had,
> because I'd like to find a solution for that without making
> backward-incompatible changes in behavior of etags.el.

Okay, whatever. I get your position. Though I disagree, but we clearly 
have different priorities here: while I'm focusing on a Emacs user, 
you're focusing on technical correctness. I doubt this discussion can 
move anywhere further, let's leave it at it.

Can my 1-st patch from the series be merged though?

Thanks.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 21:45                                         ` Konstantin Kharlamov
@ 2019-03-18 23:13                                           ` Konstantin Kharlamov
  2019-03-18 23:38                                             ` Konstantin Kharlamov
  2019-03-19  6:47                                           ` Eli Zaretskii
  1 sibling, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18 23:13 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вт, мар 19, 2019 at 12:45 ДП (AM), Konstantin Kharlamov 
<hi-angel@yandex.ru> написал:
> 
> 
> В Пн, мар 18, 2019 at 11:16 ПП (PM), Eli Zaretskii 
> <eliz@gnu.org> написал:
>>>  Date: Mon, 18 Mar 2019 22:15:27 +0300
>>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>>  Cc: emacs-devel@gnu.org
>>> 
>>>  > Can you provide those additional details?
>>> 
>>>  I'm not sure what additional details you want.
>> 
>> OK, let me ask more specific questions:
>> 
>>   1. Why was the amount of whitespace in the tags table different 
>> from
>>      that in the source file?
> 
> It's a bug in anjuta-tags
> 
>>   2. What command(s) was/were used to produce the tags table?
> 
> anjuta-tags -e file.vala
> 
>>   3. Why are the issue and you talking about "trailing whitespace",
>>      while the difference between Expected and Actual in the issue is
>>      in leading whitespace, not trailing whitespace?
> 
> Sorry for confusion here, I was imagining: given a string, whitespace 
> may "trail" on both sides of it. But I'm not a native speaker.
> 
>>>  Let's make it the other way around: please, provide any language
>>>  example, where having the trailing space may be significant for
>>>  unambigiously determining the tag.
>> 
>> etags.el doesn't understand any languages, that is the job of the
>> program that produces the tags table.  etags.el just follows the 
>> rules
>> for the format of tags in the tags table.  I don't know about 
>> trailing
>> whitespace, but tags for HTML files surely include embedded
>> whitespace, for example.
>> 
>> So once again, I suggest to focus on the particular problem you had,
>> because I'd like to find a solution for that without making
>> backward-incompatible changes in behavior of etags.el.
> 
> Okay, whatever. I get your position. Though I disagree, but we 
> clearly have different priorities here: while I'm focusing on a Emacs 
> user, you're focusing on technical correctness. I doubt this 
> discussion can move anywhere further, let's leave it at it.
> 
> Can my 1-st patch from the series be merged though?

Oh, wait, I noticed despite going to a tag I'm getting "Rerun etags" 
message. Something is wrong, let me investigate.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 23:13                                           ` Konstantin Kharlamov
@ 2019-03-18 23:38                                             ` Konstantin Kharlamov
  2019-03-19  1:46                                               ` Stefan Monnier
  0 siblings, 1 reply; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-18 23:38 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



В Вт, мар 19, 2019 at 2:13 ДП (AM), Konstantin Kharlamov 
<hi-angel@yandex.ru> написал:
> 
> 
> В Вт, мар 19, 2019 at 12:45 ДП (AM), Konstantin Kharlamov 
> <hi-angel@yandex.ru> написал:
>> 
>> 
>> В Пн, мар 18, 2019 at 11:16 ПП (PM), Eli Zaretskii 
>> \x7f<eliz@gnu.org> написал:
>>>>  Date: Mon, 18 Mar 2019 22:15:27 +0300
>>>>  From: Konstantin Kharlamov <hi-angel@yandex.ru>
>>>>  Cc: emacs-devel@gnu.org
>>>> 
>>>>  > Can you provide those additional details?
>>>> 
>>>>  I'm not sure what additional details you want.
>>> 
>>> OK, let me ask more specific questions:
>>> 
>>>   1. Why was the amount of whitespace in the tags table different 
>>> \x7f\x7ffrom
>>>      that in the source file?
>> 
>> It's a bug in anjuta-tags
>> 
>>>   2. What command(s) was/were used to produce the tags table?
>> 
>> anjuta-tags -e file.vala
>> 
>>>   3. Why are the issue and you talking about "trailing whitespace",
>>>      while the difference between Expected and Actual in the issue 
>>> is
>>>      in leading whitespace, not trailing whitespace?
>> 
>> Sorry for confusion here, I was imagining: given a string, 
>> whitespace \x7fmay "trail" on both sides of it. But I'm not a native 
>> speaker.
>> 
>>>>  Let's make it the other way around: please, provide any language
>>>>  example, where having the trailing space may be significant for
>>>>  unambigiously determining the tag.
>>> 
>>> etags.el doesn't understand any languages, that is the job of the
>>> program that produces the tags table.  etags.el just follows the 
>>> \x7f\x7frules
>>> for the format of tags in the tags table.  I don't know about 
>>> \x7f\x7ftrailing
>>> whitespace, but tags for HTML files surely include embedded
>>> whitespace, for example.
>>> 
>>> So once again, I suggest to focus on the particular problem you had,
>>> because I'd like to find a solution for that without making
>>> backward-incompatible changes in behavior of etags.el.
>> 
>> Okay, whatever. I get your position. Though I disagree, but we 
>> \x7fclearly have different priorities here: while I'm focusing on a 
>> Emacs \x7fuser, you're focusing on technical correctness. I doubt this 
>> \x7fdiscussion can move anywhere further, let's leave it at it.
>> 
>> Can my 1-st patch from the series be merged though?
> 
> Oh, wait, I noticed despite going to a tag I'm getting "Rerun etags" 
> message. Something is wrong, let me investigate.

Oh, I found my bug, that sucks, don't know how I missed that, I've used 
that code for a while. I need to return t from the cycle. Basically, I 
need either "break", or recursion. The first isn't supported in Lisp, 
and the tail-recursion optimization is not supported in Emacs. So 
there's actually no way to improve this code.

The patch can be dropped too.





^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 23:38                                             ` Konstantin Kharlamov
@ 2019-03-19  1:46                                               ` Stefan Monnier
  0 siblings, 0 replies; 45+ messages in thread
From: Stefan Monnier @ 2019-03-19  1:46 UTC (permalink / raw)
  To: emacs-devel

> Oh, I found my bug, that sucks, don't know how I missed that, I've used that
> code for a while. I need to return t from the cycle. Basically, I need
> either "break", or recursion.

There's catch&throw which is a superset of what you can get with `break`.


        Stefan




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line
  2019-03-18 21:45                                         ` Konstantin Kharlamov
  2019-03-18 23:13                                           ` Konstantin Kharlamov
@ 2019-03-19  6:47                                           ` Eli Zaretskii
  1 sibling, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2019-03-19  6:47 UTC (permalink / raw)
  To: Konstantin Kharlamov; +Cc: emacs-devel

> Date: Tue, 19 Mar 2019 00:45:10 +0300
> From: Konstantin Kharlamov <hi-angel@yandex.ru>
> Cc: emacs-devel@gnu.org
> 
> >   1. Why was the amount of whitespace in the tags table different from
> >      that in the source file?
> 
> It's a bug in anjuta-tags

So if/when that bug is fixed (maybe it's fixed already), there will be
no reason to make changes in etags.el?

> >   3. Why are the issue and you talking about "trailing whitespace",
> >      while the difference between Expected and Actual in the issue is
> >      in leading whitespace, not trailing whitespace?
> 
> Sorry for confusion here, I was imagining: given a string, whitespace 
> may "trail" on both sides of it. But I'm not a native speaker.

OK, no problem.  I guessed something like that.

> Okay, whatever. I get your position. Though I disagree, but we clearly 
> have different priorities here: while I'm focusing on a Emacs user, 
> you're focusing on technical correctness.

It's not just technical correctness.  etags.el is used for a very
large number of different "languages" (some of them are not
programming languages at all, like HTML), so any syntactic change that
might be a no-brainer for programming languages could break some other
"language" we currently support.

> Can my 1-st patch from the series be merged though?

I will review that soon, please wait for a little bit longer.  I'm
somewhat hard-pressed for free time lately.  (Or maybe someone else
here could volunteer to review that sooner?)



^ permalink raw reply	[flat|nested] 45+ messages in thread

* [PATCH v2] lisp/progmodes/etags.el clean up code by removing a temporary
  2019-03-16  1:53 [PATCH 1/3] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov
  2019-03-16  1:53 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
  2019-03-16  1:53 ` [PATCH 3/3] lisp/progmodes/etags.el improve match by string trimming Konstantin Kharlamov
@ 2019-03-19  6:55 ` Konstantin Kharlamov
  2 siblings, 0 replies; 45+ messages in thread
From: Konstantin Kharlamov @ 2019-03-19  6:55 UTC (permalink / raw)
  To: emacs-devel

---

v2: I fixed a bug that I didn't return t from "while". The code does not
look as short now as I'd hoped for; it's a little less of the original
size. But I think it's still might be useful, because it refactors the
code to have the relevant functional closer, and removes a variable from
function's visibility scope.

 lisp/progmodes/etags.el | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index c2715be5370..0014c10eb81 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -1351,7 +1351,7 @@ etags-goto-tag-location
 hits the start of file."
   (let ((startpos (cdr (cdr tag-info)))
 	(line (car (cdr tag-info)))
-	offset found pat)
+	offset pat)
     (if (eq (car tag-info) t)
 	;; Direct file tag.
 	(cond (line (progn (goto-char (point-min))
@@ -1363,7 +1363,6 @@ etags-goto-tag-location
       ;; since just going around the loop once probably
       ;; costs about as much as searching 2000 chars.
       (setq offset 1000
-	    found nil
 	    pat (concat (if (eq selective-display t)
 			    "\\(^\\|\^m\\)" "^")
 			(regexp-quote (car tag-info))))
@@ -1385,19 +1384,19 @@ etags-goto-tag-location
 				    (point)))))
       (or startpos
 	  (setq startpos (point-min)))
-      ;; First see if the tag is right at the specified location.
       (goto-char startpos)
-      (setq found (looking-at pat))
-      (while (and (not found)
-		  (progn
-		    (goto-char (- startpos offset))
-		    (not (bobp))))
-	(setq found
-	      (re-search-forward pat (+ startpos offset) t)
-	      offset (* 3 offset)))	; expand search window
-      (or found
-	  (re-search-forward pat nil t)
-	  (user-error "Rerun etags: `%s' not found in %s"
+      (or (looking-at pat) ; Is tag at the specified location?
+          (catch 'found
+            (while (progn
+                     (goto-char (- startpos offset))
+                     (when (bobp)
+                       (throw 'found nil))
+                     (when (re-search-forward pat (+ startpos offset) t)
+                       (throw 'found t))
+                     t)
+              (setq offset (* 3 offset)))) ; expand search window
+          (re-search-forward pat nil t)
+          (user-error "Rerun etags: `%s' not found in %s"
                       pat buffer-file-name)))
     ;; Position point at the right place
     ;; if the search string matched an extra Ctrl-m at the beginning.
-- 
2.21.0




^ permalink raw reply related	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2019-03-19  6:55 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-16  1:53 [PATCH 1/3] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov
2019-03-16  1:53 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
2019-03-16 12:43   ` Eli Zaretskii
2019-03-16 15:42     ` Konstantin Kharlamov
2019-03-16 16:00       ` Stefan Monnier
2019-03-16 16:26       ` Eli Zaretskii
2019-03-16 21:12         ` Konstantin Kharlamov
2019-03-16 21:47           ` Konstantin Kharlamov
2019-03-17  3:36           ` Eli Zaretskii
2019-03-17  3:41             ` Konstantin Kharlamov
2019-03-17 15:17               ` Eli Zaretskii
2019-03-17 15:52                 ` Stefan Monnier
2019-03-17 16:13                   ` Eli Zaretskii
2019-03-17 17:36                     ` Stefan Monnier
2019-03-17 21:14                       ` Eradicating selective-display == t (was: [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line) Stefan Monnier
2019-03-17 21:32                         ` Konstantin Kharlamov
2019-03-18  1:12                           ` Eradicating selective-display == t Stefan Monnier
2019-03-18  9:16                             ` Konstantin Kharlamov
2019-03-18 12:10                               ` Stefan Monnier
2019-03-17 19:06                 ` [PATCH 2/3] lisp/progmodes/etags.el don't (forward-char) as it's overriden next line Konstantin Kharlamov
2019-03-17 19:22                   ` Eli Zaretskii
2019-03-17 19:29                     ` Konstantin Kharlamov
2019-03-17 20:21                       ` Eli Zaretskii
2019-03-17 20:27                         ` Konstantin Kharlamov
2019-03-17 20:40                           ` Eli Zaretskii
2019-03-17 20:44                             ` Konstantin Kharlamov
2019-03-18  3:34                               ` Eli Zaretskii
2019-03-18  9:43                                 ` Konstantin Kharlamov
2019-03-18  9:57                                   ` Konstantin Kharlamov
2019-03-18 17:00                                   ` Eli Zaretskii
2019-03-18 19:15                                     ` Konstantin Kharlamov
2019-03-18 19:25                                       ` Konstantin Kharlamov
2019-03-18 20:16                                       ` Eli Zaretskii
2019-03-18 21:45                                         ` Konstantin Kharlamov
2019-03-18 23:13                                           ` Konstantin Kharlamov
2019-03-18 23:38                                             ` Konstantin Kharlamov
2019-03-19  1:46                                               ` Stefan Monnier
2019-03-19  6:47                                           ` Eli Zaretskii
2019-03-16  1:53 ` [PATCH 3/3] lisp/progmodes/etags.el improve match by string trimming Konstantin Kharlamov
2019-03-16  2:13   ` [PATCH v2] " Konstantin Kharlamov
2019-03-16 12:46     ` Eli Zaretskii
2019-03-16 15:38       ` Konstantin Kharlamov
2019-03-16 16:29         ` Eli Zaretskii
2019-03-17  2:38     ` [PATCH v3] " Konstantin Kharlamov
2019-03-19  6:55 ` [PATCH v2] lisp/progmodes/etags.el clean up code by removing a temporary Konstantin Kharlamov

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).