* Parenthesis matching should consider the kind of parenthesis during pair-search
@ 2024-02-12 11:49 Herman, Géza
2024-02-12 12:34 ` Joost Kremers
2024-02-12 12:58 ` Alan Mackenzie
0 siblings, 2 replies; 8+ messages in thread
From: Herman, Géza @ 2024-02-12 11:49 UTC (permalink / raw)
To: emacs-devel
Hi all,
Emacs parenthesis matching works differently than I'd have
expected (what show-paren-mode shows). As I understand it, it
searches for the matching pair by not considering the kind of the
parenthesis (no matter whether it's a curly/square/etc bracket).
And after it found it, then it considers the kind, and if there is
a mismatch then it is shown in red. Usually this is not a
problem, because parentheses come in pairs which are usually
nested. But if this is not true, then Emacs works unexpectedly in
my opinion. See this Makefile example: "$(info })" (this prints a
} to stdout). In this case, emacs shows } as the "matching" pair
of the (. And as the kind doesn't match, it's a mismatch. But
I'd have expected that the pair of ( is the ), and } doesn't have
a matching pair (because this is what actually happens in this
example).
What do you think, shouldn't Emacs consider the kind of
parenthesis when during searching for a pair? (in other words, it
should ignore all other kinds of parentheses when it searches for
a pair)
Thanks,
Geza
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 11:49 Parenthesis matching should consider the kind of parenthesis during pair-search Herman, Géza
@ 2024-02-12 12:34 ` Joost Kremers
2024-02-12 12:58 ` Alan Mackenzie
1 sibling, 0 replies; 8+ messages in thread
From: Joost Kremers @ 2024-02-12 12:34 UTC (permalink / raw)
To: Herman, Géza; +Cc: emacs-devel
On Mon, Feb 12 2024, Herman, Géza wrote:
[...]
> this is not true, then Emacs works unexpectedly in my opinion. See this
> Makefile example: "$(info })" (this prints a } to stdout). In this case, emacs
[...]
> What do you think, shouldn't Emacs consider the kind of parenthesis when during
> searching for a pair? (in other words, it should ignore all other kinds of
> parentheses when it searches for a pair)
In my opinion, it should not consider the type of parenthesis, because I mess up
my parentheses much more often than I run into cases where I'm using a
parenthesis that is not part of a pair and where it's impossible to escape it.
--
Joost Kremers
Life has its moments
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 11:49 Parenthesis matching should consider the kind of parenthesis during pair-search Herman, Géza
2024-02-12 12:34 ` Joost Kremers
@ 2024-02-12 12:58 ` Alan Mackenzie
2024-02-12 13:10 ` Herman, Géza
1 sibling, 1 reply; 8+ messages in thread
From: Alan Mackenzie @ 2024-02-12 12:58 UTC (permalink / raw)
To: Herman, Géza; +Cc: emacs-devel
Hello, Géza.
On Mon, Feb 12, 2024 at 12:49:03 +0100, Herman, Géza wrote:
> Hi all,
> Emacs parenthesis matching works differently than I'd have
> expected (what show-paren-mode shows). As I understand it, it
> searches for the matching pair by not considering the kind of the
> parenthesis (no matter whether it's a curly/square/etc bracket).
The low level routines like scan-lists work by scanning over text
counting the nesting level of open and close parentheses, "ignoring"
comments and strings as it goes. (That "ignoring" is somewhat
complicated.) When the depth of nesting gets back to zero, that's where
the matching close paren is.
> And after it found it, then it considers the kind, and if there is
> a mismatch then it is shown in red. Usually this is not a
> problem, because parentheses come in pairs which are usually
> nested. But if this is not true, then Emacs works unexpectedly in
> my opinion. See this Makefile example: "$(info })" (this prints a
> } to stdout). In this case, emacs shows } as the "matching" pair
> of the (. And as the kind doesn't match, it's a mismatch. But
> I'd have expected that the pair of ( is the ), and } doesn't have
> a matching pair (because this is what actually happens in this
> example).
> What do you think, shouldn't Emacs consider the kind of
> parenthesis when during searching for a pair? (in other words, it
> should ignore all other kinds of parentheses when it searches for
> a pair)
No, I don't think that. ;-) A lot of the time (?most of the time), we
want Emacs to point out paren mismatch errors, and that alternative way
of scanning parens would prevent this.
If you have a specific need to consider only ( and ) as the balancing
parens, ignoring [, ], {, }, etc., you can achieve this by removing the
open/close syntax-table entries from these characters first. See the
chapter "Syntax Tables" in the Elisp manual for details. Be aware that
swapping syntax tables repeatedly can slow your program down, since it
clears useful caches in doing so.
> Thanks,
> Geza
--
Alan Mackenzie (Nuremberg, Germany).
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 12:58 ` Alan Mackenzie
@ 2024-02-12 13:10 ` Herman, Géza
2024-02-12 14:07 ` Alan Mackenzie
0 siblings, 1 reply; 8+ messages in thread
From: Herman, Géza @ 2024-02-12 13:10 UTC (permalink / raw)
To: Alan Mackenzie; +Cc: Herman, Géza, emacs-devel
Alan Mackenzie <acm@muc.de> writes:
>> What do you think, shouldn't Emacs consider the kind of
>> parenthesis when during searching for a pair? (in other words,
>> it
>> should ignore all other kinds of parentheses when it searches
>> for
>> a pair)
>
> No, I don't think that. ;-) A lot of the time (?most of the
> time), we
> want Emacs to point out paren mismatch errors, and that
> alternative way
> of scanning parens would prevent this.
The only gain with the current way is that Emacs will point out
the mismatch (considering my Makefile example), if the cursor is
on the opening '('. With my suggested method, it's not the
mismatch which would be shown, but the pair of '(' would (which is
actually a correct behavior in this case, the pair of '(' is
indeed the ')' ). All the other interactions would be the same.
If you put the cursor on the '}', Emacs would still show that it
is a paren without a pair, just like now (but instead of saying
that its "pair" is the '(', it wouldn't show anything, because '}'
doesn't have a pair.
Why is it a desired thing that Emacs should show some mismatching
paren if the cursor is on a completely unrelated paren?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 13:10 ` Herman, Géza
@ 2024-02-12 14:07 ` Alan Mackenzie
2024-02-12 14:10 ` Herman, Géza
0 siblings, 1 reply; 8+ messages in thread
From: Alan Mackenzie @ 2024-02-12 14:07 UTC (permalink / raw)
To: Herman, Géza; +Cc: emacs-devel
Hello, Géza
On Mon, Feb 12, 2024 at 14:10:06 +0100, Herman, Géza wrote:
> Alan Mackenzie <acm@muc.de> writes:
> >> What do you think, shouldn't Emacs consider the kind of parenthesis
> >> when during searching for a pair? (in other words, it should ignore
> >> all other kinds of parentheses when it searches for a pair)
> > No, I don't think that. ;-) A lot of the time (?most of the time),
> > we want Emacs to point out paren mismatch errors, and that
> > alternative way of scanning parens would prevent this.
> The only gain with the current way is that Emacs will point out
> the mismatch (considering my Makefile example), if the cursor is
> on the opening '('. With my suggested method, it's not the
> mismatch which would be shown, but the pair of '(' would (which is
> actually a correct behavior in this case, the pair of '(' is
> indeed the ')' ).
OK, I don't agree with some of the things you're saying, but why don't
you implement your idea so that we can try it out?
> All the other interactions would be the same.
That's a bold thing to say, indeed!
> If you put the cursor on the '}', Emacs would still show that it
> is a paren without a pair, just like now (but instead of saying
> that its "pair" is the '(', it wouldn't show anything, because '}'
> doesn't have a pair.
What if earlier on in the file there were a
({)
? Should your new way of matching find that {? Or would the enclosing
( and ) prevent this being a match? If so, what are the exact criteria?
> Why is it a desired thing that Emacs should show some mismatching
> paren if the cursor is on a completely unrelated paren?
Emacs doesn't have the facilities to determine that the mismatching
paren is "completely unrelated". It's fairly likely to be a typo. For
example, on some keyboard layouts (including British English), ] and }
are on the same key. It's easy to mistype } as ] and not notice right
away. The show-paren-mode mismatch facility helps notice it sooner.
But, as I say, the best way to go from here would be to implement your
new matching scheme and then we can try it out. I can think of some
uses for it, for example for commands like `occur' on M-s o, where a
regexp gets entered into the minibuffer. Regexps frequently have
unmatched parens.
--
Alan Mackenzie (Nuremberg, Germany).
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 14:07 ` Alan Mackenzie
@ 2024-02-12 14:10 ` Herman, Géza
2024-02-12 15:57 ` Alan Mackenzie
0 siblings, 1 reply; 8+ messages in thread
From: Herman, Géza @ 2024-02-12 14:10 UTC (permalink / raw)
To: Alan Mackenzie; +Cc: Herman, Géza, emacs-devel
>> The only gain with the current way is that Emacs will point out
>> the mismatch (considering my Makefile example), if the cursor
>> is
>> on the opening '('. With my suggested method, it's not the
>> mismatch which would be shown, but the pair of '(' would (which
>> is
>> actually a correct behavior in this case, the pair of '(' is
>> indeed the ')' ).
>
> OK, I don't agree with some of the things you're saying
I think I just wrote facts here. If the matching algorithm were
modified in the way I described, that would be the result. Which
parts do you not agree with?
> but why don't you implement your idea so that we can try it out?
If it's an easy thing to do for someone who doesn't really know
Emacs's codebase too much, I can do that. But, tbh, it shouldn't
be too hard to imagine how it worked. Also, all the other editors
I know works similarly like I described. So it's easy to try this
out with other editors.
>> If you put the cursor on the '}', Emacs would still show that
>> it
>> is a paren without a pair, just like now (but instead of saying
>> that its "pair" is the '(', it wouldn't show anything, because
>> '}'
>> doesn't have a pair.
>
> What if earlier on in the file there were a
>
> ({)
>
> ? Should your new way of matching find that {? Or would the
> enclosing
> ( and ) prevent this being a match? If so, what are the exact
> criteria?
It would find it. My suggested algorithm is simple: when
searching for a pair of '{', the algorithm should only consider
'{' and '}'. All the other kind of parens should be ignored.
That's it.
>> Why is it a desired thing that Emacs should show some
>> mismatching
>> paren if the cursor is on a completely unrelated paren?
>
> Emacs doesn't have the facilities to determine that the
> mismatching
> paren is "completely unrelated".
Emacs already tells that '(' and '}' are unrelated, because it
shows them as mismatching. I don't think that there should be any
sophisticated facilities to determine unrelatedness. If the paren
Emacs find is a mismatching one, then it should continue finding
the proper pair, that's it.
> It's fairly likely to be a typo.
Yes, that is an example that I can accept. But I don't think that
this is a very common thing. At least, for me, this Emacs
behavior was never useful. But it annoys me that sometimes I
cannot move to the pair of a paren because of this behavior.
But thinking about it further, maybe this problem shouldn't be
solved like this, because there is a better solution:
makefile-mode should be more clever - if it is possible - to not
mark } as a paren in my example case, because from the semantics
of the Makefile viewpoint, it is not actually a paren, '}' should
behave like if it were in a string.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 14:10 ` Herman, Géza
@ 2024-02-12 15:57 ` Alan Mackenzie
2024-02-12 16:05 ` Herman, Géza
0 siblings, 1 reply; 8+ messages in thread
From: Alan Mackenzie @ 2024-02-12 15:57 UTC (permalink / raw)
To: Herman, Géza; +Cc: emacs-devel
Hello, Géza.
On Mon, Feb 12, 2024 at 15:10:12 +0100, Herman, Géza wrote:
> >> The only gain with the current way is that Emacs will point out the
> >> mismatch (considering my Makefile example), if the cursor is on the
> >> opening '('. With my suggested method, it's not the mismatch which
> >> would be shown, but the pair of '(' would (which is actually a
> >> correct behavior in this case, the pair of '(' is indeed the ')' ).
> > OK, I don't agree with some of the things you're saying
> I think I just wrote facts here.
Well, you wrote "All the other interactions would be the same.", which is
not yet an established fact.
> If the matching algorithm were modified in the way I described, that
> would be the result. Which parts do you not agree with?
> > but why don't you implement your idea so that we can try it out?
> If it's an easy thing to do for someone who doesn't really know Emacs's
> codebase too much, I can do that. But, tbh, it shouldn't be too hard
> to imagine how it worked. Also, all the other editors I know works
> similarly like I described. So it's easy to try this out with other
> editors.
I would say the exercise is moderately difficult for somebody who hasn't
worked with the Emacs codebase before. But experience indicates that
none of the other readers of emacs-devel is likely to be enthused enough
by your suggestion actually to take it up and implement it. If you want
to see it in Emacs, you're going to have to implement it yourself. But
help would be available on the list.
> >> If you put the cursor on the '}', Emacs would still show that it is
> >> a paren without a pair, just like now (but instead of saying that
> >> its "pair" is the '(', it wouldn't show anything, because '}'
> >> doesn't have a pair.
> > What if earlier on in the file there were a
> > ({)
> > ? Should your new way of matching find that {? Or would the
> > enclosing ( and ) prevent this being a match? If so, what are the
> > exact criteria?
> It would find it. My suggested algorithm is simple: when
> searching for a pair of '{', the algorithm should only consider
> '{' and '}'. All the other kind of parens should be ignored.
> That's it.
OK, I understand.
> >> Why is it a desired thing that Emacs should show some mismatching
> >> paren if the cursor is on a completely unrelated paren?
> > Emacs doesn't have the facilities to determine that the mismatching
> > paren is "completely unrelated".
> Emacs already tells that '(' and '}' are unrelated, because it
> shows them as mismatching. I don't think that there should be any
> sophisticated facilities to determine unrelatedness. If the paren
> Emacs find is a mismatching one, then it should continue finding
> the proper pair, that's it.
OK.
> > It's fairly likely to be a typo.
> Yes, that is an example that I can accept. But I don't think that this
> is a very common thing. At least, for me, this Emacs behavior was
> never useful.
For editing files written in C or C++, all of (), {}, [], and (in C++)
<> are used as paren pairs. They've got to match properly. After
killing and yanking a large chunk of text, the current paren matching is
useful to indicate any "missing" parens at the start or end of the region
just yanked, for example.
> But it annoys me that sometimes I cannot move to the pair of a paren
> because of this behavior.
To be honest, things like that annoy me a bit, too, like when typing in a
regexp into the minibuffer. But it would annoy me more not to have any
mismatches highlighted in a C buffer.
> But thinking about it further, maybe this problem shouldn't be solved
> like this, because there is a better solution: makefile-mode should be
> more clever - if it is possible - to not mark } as a paren in my
> example case, because from the semantics of the Makefile viewpoint, it
> is not actually a paren, '}' should behave like if it were in a string.
Yes, this would be possible too, but likely quite a bit more complicated.
--
Alan Mackenzie (Nuremberg, Germany).
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Parenthesis matching should consider the kind of parenthesis during pair-search
2024-02-12 15:57 ` Alan Mackenzie
@ 2024-02-12 16:05 ` Herman, Géza
0 siblings, 0 replies; 8+ messages in thread
From: Herman, Géza @ 2024-02-12 16:05 UTC (permalink / raw)
To: Alan Mackenzie; +Cc: Herman, Géza, emacs-devel
Alan Mackenzie <acm@muc.de> writes:
>> I think I just wrote facts here.
>
> Well, you wrote "All the other interactions would be the same.",
> which is
> not yet an established fact.
Maybe I wasn't clear enough, I meant that this is true for this
example. And I think this is true, it's easy to verify.
> If you want to see it in Emacs, you're going to have to
> implement it yourself. But help would be available on the list.
Thanks! I'll check this out. As I see this is a little bit more
complicated, because this thing uses a more general scanner
function (called scan_list). I think it's easy to hack something
so it works for my case, but it can easily break other part of
Emacs.
> For editing files written in C or C++, all of (), {}, [], and
> (in C++)
> <> are used as paren pairs. They've got to match properly.
> After
> killing and yanking a large chunk of text, the current paren
> matching is
> useful to indicate any "missing" parens at the start or end of
> the region
> just yanked, for example.
Yes, but you need to move the cursor over some paren, right?
Otherwise there is no paren-related info shown. Supposedly the
first or last paren is a good candidate for this. But I think
that with my suggested method, problems are detected as well.
Maybe there are different cases where each method fails, but I
don't see any of the methods significantly better than the other
in this regard.
But, tbh, I think it would be better if Emacs simply had (and
maybe it does have) a functionality which simply checks that all
the parens are OK. Without ever having to move the point over some
paren. I find it a hacky, if one, after some copy-pasting, moves
the cursor over the first or last copied paren, and if there is no
mismatch detected, then considers that the copy-paste was surely
fine. Maybe that's true, but I have to think hard to confirm
this.
>> But it annoys me that sometimes I cannot move to the pair of a
>> paren
>> because of this behavior.
>
> To be honest, things like that annoy me a bit, too, like when
> typing in a
> regexp into the minibuffer. But it would annoy me more not to
> have any
> mismatches highlighted in a C buffer.
Just to clarify, with my suggestion, missing parens are still
highlighted. Only "mismatching" parens are not. But I don't
think that "mismatching" parens should be a thing. I think that
except very beginners, people simply don't write mismatching
parens by mistake. So there is no need to detect that. I admit
that it can be typo. But if that's a typo, the mistake will still
be detected by my suggested method.
>> But thinking about it further, maybe this problem shouldn't be
>> solved
>> like this, because there is a better solution: makefile-mode
>> should be
>> more clever - if it is possible - to not mark } as a paren in
>> my
>> example case, because from the semantics of the Makefile
>> viewpoint, it
>> is not actually a paren, '}' should behave like if it were in a
>> string.
>
> Yes, this would be possible too, but likely quite a bit more
> complicated.
The more I think about it, the clearer that this is the correct
solution for this problem. But I agree, it may need way to much
of work to solve such a tiny problem.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-02-12 16:05 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-12 11:49 Parenthesis matching should consider the kind of parenthesis during pair-search Herman, Géza
2024-02-12 12:34 ` Joost Kremers
2024-02-12 12:58 ` Alan Mackenzie
2024-02-12 13:10 ` Herman, Géza
2024-02-12 14:07 ` Alan Mackenzie
2024-02-12 14:10 ` Herman, Géza
2024-02-12 15:57 ` Alan Mackenzie
2024-02-12 16:05 ` Herman, Géza
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).