all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: help-gnu-emacs@gnu.org
Subject: Re: Problem with parenthesis matching and autoindentation in MacOS X version of emacs
Date: Wed, 17 Dec 2008 16:29:00 +0000	[thread overview]
Message-ID: <20081217162900.GA7290@muc.de> (raw)
In-Reply-To: <rAT1l.199$e9.187@read4.inet.fi>

Hi, again!

On Tue, Dec 16, 2008 at 07:46:31PM +0000, Juha Nieminen wrote:
> Alan Mackenzie wrote:
> > Yes.  There're bugs in C++ Mode to do with template brackets (who on
> > earth "designed" this feature in C++?).  C++ Mode is probably marking
> > your (newly typed) "<" and ">" as template delimiters, than unmarking
> > the ">" as soon as it has become a ">=".

>   It behaves very erratically (although predictably). For example if I
> start typing this:

>     if(x < 0)

> then the parenthesis matching works ok. However, if I know delete the )
> and change it to:

>     if(x < 0>

> it will now match the "closing angle bracket" to the <. Ok, fine, I
> suppose. However, now it's when it becomes weird. If I now delete the <
> and replace it again with ), that is:

>     if(x < 0)

> in other words, it's now exactly like the first version above, it will
> mismatch the ) with the <, and indentation goes haywire. It will keep
> this erroneous matching mode until I delete everything from the 'x'
> forward and write it again. It's rather annoying.

It's very annoying indeed.

> I really don't want to sound rude, but given how usual expressions like
> "x < something || x > something_else" are, how come this problem got
> into a released version?

No, that's fine.  This is one of the worst things to have got into a
released version since I've been here.  Sometimes it just happens - C
is a horrendously complex language for an editor to parse, and C++ and
Java take it a further degree.  Mainly, neither my predecessor (Martin
Stjernholm) nor I are heavy C++ hackers, and neither of us realised the
complexity and bugs that this thing would cause.  So sorry!  But I am
fixing it.

On the other hand, I doubt your rudeness comes close to what I feel about
the designers who decided to use "<" and ">" as template delimiters, thus
leaving the language so highly unparseable.  Why, oh why, couldn't they
have used, say, "{[" and "]}", or something similar?  Just as an exercise
for the reader, how many parameters are there in the parentheses in the
following:

    foo (a < b, c > d);

? 

> OTOH, who am I to talk? I have been using emacs for something like 10
> years to write C++, and only now do I notice this problem. I suppose I
> don't use that kind of expression all that often, after all.

But when it does bite, it's painful in the extreme.

>   How recently was this new parenthesis matching code introduced into
>   emacs?

I think it was new in CC Mode 5.30, so would first have been in Emacs
22.1.

>   Would it be a great loss if the <> "brackets" were not included in the
> matching logic at all?

It would be a loss, yes.  Maybe not that great, but it would be a loss in
consistency, since paren matching should match any sort of
parens/braces/brackets, etc.

>   Is there a way to turn the matching off for <>?

The following quick fix in your .emacs, an unofficial workaround, should
do the trick.  (Please forgive me not having tested it, though).  I think
it might have adverse effects in the font locking and even the
indentation of template structures, though.

(defun jn-disable-<> ()
  (setq c-recognize-<>-arglists nil))
(add-hook 'c++-mode-hook 'jn-disable-<>)

I hope you'll be volunteering to test the full fix to the problem when
I've finished it (hopefully in January or February 2009).  ;-)

> >> (As said, this doesn't happen in linux nor Windows.)

> > I suspect this isn't actually the case.  Whether or not problems appear
> > is highly dependent on the order you type the characters.  Anyhow, I'm
> > trying to fix the cause of the problem by always marking "<" and ">" as
> > parens in matching pairs.

> > Could you please check again, typing the EXACT SAME sequence of
> > characters on the Mac and either GNU/Linux or Windows, whether you
> > actually do get different results on different systems.  Thanks in
> > advance!

>   It's strange. I have been using emacs for years to write C++ in both
> linux and windows, and only now do I notice this problem happening there
> as well. I assumed there was no problem because I had never noticed
> before. However, now that I try it in linux, it also happens there.

Oh, good!  ;-)

-- 
Alan Mackenzie (Nuremberg, Germany).




  reply	other threads:[~2008-12-17 16:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-15 11:18 Problem with parenthesis matching and autoindentation in MacOS X version of emacs Juha Nieminen
2008-12-15 18:39 ` Alan Mackenzie
     [not found] ` <mailman.2805.1229365442.26697.help-gnu-emacs@gnu.org>
2008-12-16 19:46   ` Juha Nieminen
2008-12-17 16:29     ` Alan Mackenzie [this message]
     [not found]     ` <mailman.2957.1229530429.26697.help-gnu-emacs@gnu.org>
2008-12-18  0:32       ` Juha Nieminen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20081217162900.GA7290@muc.de \
    --to=acm@muc.de \
    --cc=help-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.