From: Alan M. <ac...@mu...> - 2013-03-19 11:46:54
|
Hello, Paul. On Mon, Mar 18, 2013 at 04:05:57PM -0400, Paul Smith wrote: > Hi all (does anyone have any pointers to an archive of this mailing list > that does NOT use SF's obscene mailing list archive site?) There's gmane at http://news.gmane.org/gmane.emacs.cc-mode.general. What's so obscene about SourceForge's archive? (Though I admit, I don't like its UI either). > I'm working on a codebase which uses macros to hide some loop details, > including providing the open and close braces, like this: > #define FOR_OPEN(T,a) { for (T...) { T *a = ...; > #define FOR_CLOSE }} > then in the code we have things like: > FOR_OPEN(SomeType, var) > statement1(var); > statement2(var); > FOR_CLOSE > I know this is somewhat gross, but it's widespread. > Obviously, cc-mode doesn't format this the way I want since it can't see > the braces. > Is there any capability in cc-mode to assign attributes to given > keywords, such that I could tell cc-mode that FOR_OPEN() had an > "open-brace" attribute, and FOR_CLOSE had a "close-brace" attribute? There's no way of "assigning brace attributes" to keywords. > Or something like that? What I would suggest is writing a `c-special-indent-hook' function (see the CC Mode manual, page "Other Special Indentations"). This function should check `c-syntactic-context' to see whether the current line is a 'statement, and if so, check whether its anchor-point is at a "FOR_OPEN", and in that case give the statement an extra `c-basic-offset' columns of indentation. Similarly, if the 'statement is a "FOR_CLOSE", it needs `c-basic-offset' taken off. There'll be a special case of no statements between the "FOR_OPEN" and "FOR_CLOSE" to take account of. Before doing this, I strongly recommend you to register "FOR_OPEN" and "FOR_CLOSE" as having their own semicolons (see page "Macros with Semicolons" in the manual). If you get stuck, or your Emacs Lisp isn't up to the task, get back to me and I'll see what I can do for you. > Cheers! -- Alan Mackenzie (Nuremberg, Germany). |