Mercurial > hg > xemacs-beta
comparison man/cc-mode.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 \input texinfo @c -*- texinfo -*- | |
2 | |
3 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
4 @comment %**start of header (This is for running Texinfo on a region) | |
5 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
6 | |
7 @setfilename ../info/cc-mode.info | |
8 @settitle CC-MODE Version 4 Documentation | |
9 @footnotestyle end | |
10 | |
11 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
12 @comment @setchapternewpage odd !! we don't want blank pages !! | |
13 @comment %**end of header (This is for running Texinfo on a region) | |
14 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
15 | |
16 | |
17 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
18 @comment | |
19 @comment texinfo manual for @file{cc-mode.el} version 4 | |
20 @comment manual version: 2.35 | |
21 @comment generated from the original README file by Krishna Padmasola | |
22 @comment <krishna@earth-gw.njit.edu> | |
23 @comment | |
24 @comment Barry A. Warsaw <bwarsaw@cnri.reston.va.us> | |
25 @comment Last modification: 1996/01/19 20:50:48 | |
26 @comment | |
27 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
28 | |
29 | |
30 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
31 @comment The following line inserts the copyright notice | |
32 @comment into the Info file. | |
33 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
34 | |
35 @ifinfo | |
36 Copyright @copyright{} 1995 Free Software Foundation, Inc. | |
37 @end ifinfo | |
38 | |
39 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
40 @comment !!!The titlepage section does not appear in the Info file.!!! | |
41 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
42 | |
43 @titlepage | |
44 @sp 10 | |
45 | |
46 | |
47 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
48 @comment The title is printed in a large font. | |
49 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
50 | |
51 @center @titlefont{CC-MODE Version 4} | |
52 @sp 2 | |
53 @center A GNU Emacs mode for editing C, C++, and Objective-C code. | |
54 @center (manual revision: 2.35) | |
55 @sp 2 | |
56 @center Barry A. Warsaw | |
57 | |
58 | |
59 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
60 @comment The following two commands start the copyright page | |
61 @comment for the printed manual. This will not appear in the Info file. | |
62 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
63 | |
64 @page | |
65 @vskip 0pt plus 1filll | |
66 Copyright @copyright{} 1995 Free Software Foundation, Inc. | |
67 @end titlepage | |
68 | |
69 | |
70 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
71 @comment The Top node contains the master menu for the Info file. | |
72 @comment This appears only in the Info file, not the printed manual. | |
73 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
74 | |
75 @node Top, Introduction, (dir), (dir) | |
76 @comment node-name, next, previous, up | |
77 | |
78 | |
79 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
80 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
81 | |
82 @menu | |
83 * Introduction:: | |
84 * Getting Connected:: | |
85 * New Indentation Engine:: | |
86 * Minor Modes:: | |
87 * Indentation Commands:: | |
88 * Customizing Indentation:: | |
89 * Syntactic Symbols:: | |
90 * Performance Issues:: | |
91 * Frequently Asked Questions:: | |
92 * Getting the latest cc-mode release:: | |
93 * Sample .emacs File:: | |
94 * Requirements:: | |
95 * Limitations and Known Bugs:: | |
96 * Mailing Lists and Submitting Bug Reports:: | |
97 * Concept Index:: | |
98 * Command Index:: Command Index | |
99 * Key Index:: Key Index | |
100 * Variable Index:: Variable Index | |
101 @end menu | |
102 | |
103 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
104 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
105 | |
106 @node Introduction, Getting Connected, Top, Top | |
107 @comment node-name, next, previous, up | |
108 @chapter Introduction | |
109 @cindex Introduction | |
110 | |
111 @cindex BOCM | |
112 Welcome to @code{cc-mode}, version 4. This is a GNU Emacs mode for | |
113 editing files containing C, C++, Objective-C, and Java code. | |
114 This incarnation of the mode is descendant from @file{c-mode.el} (also | |
115 called "Boring Old C Mode" or BOCM @code{:-)}, and @file{c++-mode.el} | |
116 version 2, which I have been maintaining since 1992. @code{cc-mode} | |
117 represents a significant milestone in the mode's life. It has been | |
118 fully merged back with Emacs 19's @file{c-mode.el}. Also a new, more | |
119 intuitive and flexible mechanism for controlling indentation has been | |
120 developed. | |
121 | |
122 @code{cc-mode} version 4 supports the editing of K&R and ANSI C, | |
123 @dfn{ARM} @footnote{i.e. ``The Annotated C++ Reference Manual'', by | |
124 Ellis and Stroustrup.} C++, Objective-C, and Java files. In this way, | |
125 you can easily set up consistent coding styles for use in editing all C, | |
126 C++, Objective-C, and Java programs. | |
127 | |
128 This manual will describe the following: | |
129 | |
130 @itemize @bullet | |
131 @item | |
132 How to get started using @code{cc-mode}. | |
133 | |
134 @item | |
135 How the new indentation engine works. | |
136 | |
137 @item | |
138 How to customize the new indentation engine. | |
139 | |
140 @end itemize | |
141 | |
142 Note that the name of this file is @file{cc-mode.el}, and I'll often | |
143 refer to the package as @code{cc-mode}, but there really is no top level | |
144 @code{cc-mode} entry point. I call it @code{cc-mode} simply to | |
145 differentiate it from @file{c-mode.el}. All of the variables, commands, | |
146 and functions in @code{cc-mode} are prefixed with @code{c-<thing>}, and | |
147 @code{c-mode}, @code{c++-mode}, @code{objc-mode}, and @code{java-mode} | |
148 entry points are provided. This file is intended to be a replacement | |
149 for @file{c-mode.el} and @file{c++-mode.el}. | |
150 | |
151 @findex c-version | |
152 The major version number was incremented to 4 with the addition of | |
153 @code{objc-mode}. To find the minor revision number of this release, use | |
154 @kbd{M-x c-version RET}. Work has already begun on @code{cc-mode} | |
155 version 5, in which Emacs 18 will not be supported. | |
156 | |
157 As of this writing (19-Jan-1996), both Emacs 19.30 and XEmacs 19.13 are | |
158 distributed with @code{cc-mode}. Emacs 19.31 and XEmacs 19.14 will both | |
159 contain the latest version of cc-mode when it is released. If you are | |
160 running older versions of these Emacsen, you may want to upgrade your | |
161 copy of @code{cc-mode}. See @ref{Getting the latest cc-mode release}. | |
162 | |
163 @cindex @file{cc-compat.el} file | |
164 This distribution also contains a file called @file{cc-compat.el} | |
165 which should ease your transition from BOCM to @code{cc-mode}. It | |
166 currently comes unguaranteed and unsupported, but this may change for | |
167 future versions. | |
168 | |
169 A special word of thanks goes to Krishna Padmasola for his work in | |
170 converting the original @file{README} file to texinfo format. | |
171 @code{cc-mode} users have been clamoring for a manual for a long time, | |
172 and thanks to Krishna, it is now available <clap> <clap> <clap>! | |
173 @code{:-)} | |
174 | |
175 | |
176 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
177 | |
178 @node Getting Connected, New Indentation Engine, Introduction, Top | |
179 @comment node-name, next, previous, up | |
180 @chapter Getting Connected | |
181 @cindex Getting Connected | |
182 | |
183 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
184 | |
185 @file{cc-mode.el} works well with the 2 main branches of Emacs 19: | |
186 XEmacs and the Emacs 19 maintained by the FSF. Emacs 19 users will want | |
187 to use Emacs version 19.21 or better, XEmacs users will want 19.6 or | |
188 better. Earlier versions of these Emacsen have deficiencies and/or bugs | |
189 which will adversely affect the performance and usability of | |
190 @code{cc-mode}. | |
191 | |
192 @cindex @file{cc-mode-18.el} file | |
193 Similarly if you use the @file{cc-mode-18.el} compatibility file, | |
194 @file{cc-mode.el} will work with Emacs 18, but only moderately well. A | |
195 word of warning though, @emph{Emacs 18 lacks some fundamental | |
196 functionality and that ultimately means using Emacs 18 is a losing | |
197 battle}. Hence @code{cc-mode} under Emacs 18 is no longer supported and | |
198 it is highly recommended that you upgrade to Emacs 19. If you use | |
199 @code{cc-mode} under Emacs 18, you're on your own. With @code{cc-mode} | |
200 version 5, Emacs 18 support will be dropped altogether. | |
201 | |
202 Note that as of XEmacs 19.13 and Emacs 19.30, your Emacs already comes | |
203 with @code{cc-mode} version 4 preconfigured for your use. You should be | |
204 able to safely skip the rest of the setup information in this chapter. | |
205 | |
206 @cindex @file{.emacs} file | |
207 The first thing you will want to do is put @file{cc-mode.el} somewhere | |
208 on your @code{load-path} so Emacs can find it. Do a @kbd{C-h v | |
209 load-path RET} to see all the directories Emacs looks at when loading a | |
210 file. If none of these directories are appropriate, create a new | |
211 directory and add it to your @code{load-path}: | |
212 | |
213 @noindent | |
214 @emph{[in the shell]} | |
215 @example | |
216 @group | |
217 | |
218 % cd | |
219 % mkdir mylisp | |
220 % mv cc-mode.el mylisp | |
221 % cd mylisp | |
222 | |
223 @end group | |
224 @end example | |
225 | |
226 @noindent | |
227 @emph{[in your .emacs file add]} | |
228 @example | |
229 | |
230 (setq load-path (cons "~/mylisp" load-path)) | |
231 | |
232 @end example | |
233 | |
234 @cindex byte compile | |
235 Next you want to @dfn{byte compile} @file{cc-mode.el}. The mode uses a | |
236 lot of macros so if you don't byte compile it, things will be unbearably | |
237 slow. @emph{You can ignore all byte-compiler warnings!} They are the | |
238 result of the supporting different versions of Emacs, and none of the | |
239 warnings have any effect on operation. Let me say this again: | |
240 @strong{You really can ignore all byte-compiler warnings!} | |
241 | |
242 Here's what to do to byte-compile the file [in emacs]: | |
243 @example | |
244 | |
245 M-x byte-compile-file RET ~/mylisp/cc-mode.el RET | |
246 | |
247 @end example | |
248 | |
249 If you are running a version of Emacs or XEmacs that comes with | |
250 @code{cc-mode} by default, you can simply add the following to your | |
251 @file{.emacs} file in order to upgrade to the latest version of | |
252 @code{cc-mode}: | |
253 @example | |
254 | |
255 (load "cc-mode") | |
256 | |
257 @end example | |
258 | |
259 Users of even older versions of Emacs 19, Emacs 18, or of the older | |
260 Lucid Emacs will probably be running an Emacs that has BOCM | |
261 @file{c-mode.el} and possible @file{c++-mode.el} pre-dumped. If your | |
262 Emacs is dumped with either of these files you first need to make Emacs | |
263 ``forget'' about those older modes. | |
264 | |
265 If you can do a @kbd{C-h v c-mode-map RET} without getting an error, you | |
266 need to add these lines at the top of your @file{.emacs} file: | |
267 @example | |
268 @group | |
269 | |
270 (fmakunbound 'c-mode) | |
271 (makunbound 'c-mode-map) | |
272 (fmakunbound 'c++-mode) | |
273 (makunbound 'c++-mode-map) | |
274 (makunbound 'c-style-alist) | |
275 | |
276 @end group | |
277 @end example | |
278 | |
279 After those lines you will want to add the following autoloads to your | |
280 @file{.emacs} file so that @code{cc-mode} gets loaded at the right time: | |
281 @example | |
282 @group | |
283 | |
284 (autoload 'c++-mode "cc-mode" "C++ Editing Mode" t) | |
285 (autoload 'c-mode "cc-mode" "C Editing Mode" t) | |
286 (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t) | |
287 (autoload 'java-mode "cc-mode" "Java Editing Mode" t) | |
288 | |
289 @end group | |
290 @end example | |
291 | |
292 Alternatively, if you want to make sure @code{cc-mode} is loaded when | |
293 Emacs starts up, you could use this line instead of the three autoloads | |
294 above: | |
295 @example | |
296 | |
297 (require 'cc-mode) | |
298 | |
299 @end example | |
300 | |
301 Next, you will want to set up Emacs so that it edits C files in | |
302 @code{c-mode}, C++ files in @code{c++-mode}, and Objective-C files in | |
303 @code{objc-mode}. All users should add the following to their | |
304 @file{.emacs} file. Note that this assumes you'll be editing @code{.h} | |
305 and @code{.c} files as C, @code{.hh}, @code{.cc}, @code{.H}, and | |
306 @code{.C} files as C++, @code{.m} files as Objective-C, and @code{.java} | |
307 files as Java code. YMMV: | |
308 @example | |
309 @group | |
310 | |
311 (setq auto-mode-alist | |
312 (append | |
313 '(("\\.C$" . c++-mode) | |
314 ("\\.H$" . c++-mode) | |
315 ("\\.cc$" . c++-mode) | |
316 ("\\.hh$" . c++-mode) | |
317 ("\\.c$" . c-mode) | |
318 ("\\.h$" . c-mode) | |
319 ("\\.m$" . objc-mode) | |
320 ("\\.java$" . java-mode) | |
321 ) auto-mode-alist)) | |
322 | |
323 @end group | |
324 @end example | |
325 | |
326 You may already have some or all of these settings on your | |
327 @code{auto-mode-alist}, but it won't hurt to put them on there again. | |
328 | |
329 That's all you need -- I know, I know, it sounds like a lot @code{:-)}, | |
330 but after you've done all this, you should only need to quit and restart | |
331 Emacs. The next time you visit a C, C++, Objective-C, or Java file you | |
332 should be using @code{cc-mode}. You can check this easily by hitting | |
333 @kbd{M-x c-version RET} in the @code{c-mode}, @code{c++-mode}, or | |
334 @code{objc-mode} buffer. You should see this message in the echo area: | |
335 @example | |
336 | |
337 Using @code{cc-mode} version 4.@var{xxx} | |
338 | |
339 Where @var{xxx} is the latest release minor number. | |
340 | |
341 @end example | |
342 | |
343 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
344 | |
345 @menu | |
346 * Syntactic Analysis:: | |
347 * Indentation Calculation:: | |
348 @end menu | |
349 | |
350 @node New Indentation Engine, Minor Modes, Getting Connected, Top | |
351 @comment node-name, next, previous,up | |
352 | |
353 @chapter New Indentation Engine | |
354 @cindex New Indentation Engine | |
355 | |
356 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
357 | |
358 @code{cc-mode} has a new indentation engine, providing a simplified, yet | |
359 flexible and general mechanism for customizing indentation. It breaks | |
360 indentation calculation into two steps. First for the line of code being | |
361 indented, @code{cc-mode} analyzes what kind of language construct it's | |
362 looking at, then it applies user defined offsets to the current line | |
363 based on this analysis. | |
364 | |
365 This section will briefly cover how indentation is calculated in | |
366 @code{cc-mode}. It is important to understand the indentation model | |
367 being used so that you will know how to customize @code{cc-mode} for | |
368 your personal coding style. | |
369 | |
370 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
371 @menu | |
372 * Syntactic Analysis:: | |
373 * Indentation Calculation:: | |
374 @end menu | |
375 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
376 | |
377 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
378 @node Syntactic Analysis, Indentation Calculation, , New Indentation Engine | |
379 @comment node-name, next, previous,up | |
380 @section Syntactic Analysis | |
381 @cindex Syntactic Analysis | |
382 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
383 | |
384 @vindex c-offsets-alist | |
385 @vindex offsets-alist (c-) | |
386 @cindex relative buffer position | |
387 @cindex syntactic symbol | |
388 @cindex syntactic component | |
389 @cindex syntactic component list | |
390 @cindex relative buffer position | |
391 The first thing @code{cc-mode} does when indenting a line of code, is to | |
392 analyze the line, determining the @dfn{syntactic component list} of the | |
393 construct on that line. A @dfn{syntactic component} consists of a pair | |
394 of information (in lisp parlance, a @emph{cons cell}), where the first | |
395 part is a @dfn{syntactic symbol}, and the second part is a @dfn{relative | |
396 buffer position}. Syntactic symbols describe elements of C code | |
397 @footnote{or C++, Objective-C, or Java code. In general, for the rest | |
398 of this manual I'll use the term ``C code'' to refer to all the C-like | |
399 dialects, unless otherwise noted.}, e.g. @code{statement}, | |
400 @code{substatement}, @code{class-open}, @code{class-close}, etc. | |
401 @xref{Syntactic Symbols}, for a complete list of currently recognized | |
402 syntactic symbols and their semantics. The variable | |
403 @code{c-offsets-alist} also contains the list of currently supported | |
404 syntactic symbols. | |
405 | |
406 Conceptually, a line of C code is always indented relative to the | |
407 indentation of some line higher up in the buffer. This is represented | |
408 by the relative buffer position in the syntactic component. | |
409 | |
410 It might help to see an example. Suppose we had the following code as | |
411 the only thing in a @code{c++-mode} buffer @footnote{The line numbers in | |
412 this and future examples don't actually appear in the buffer, of course!}: | |
413 @example | |
414 @group | |
415 | |
416 1: void swap( int& a, int& b ) | |
417 2: @{ | |
418 3: int tmp = a; | |
419 4: a = b; | |
420 5: b = tmp; | |
421 6: @} | |
422 | |
423 @end group | |
424 @end example | |
425 | |
426 @kindex C-c C-s | |
427 @findex c-show-syntactic-information | |
428 @findex show-syntactic-information (c-) | |
429 We can use the command @kbd{C-c C-s} | |
430 (@code{c-show-syntactic-information}) to simply report what the | |
431 syntactic analysis is for the current line. Running this command on | |
432 line 4 this example, we'd see in the echo area: | |
433 @example | |
434 | |
435 ((statement . 35)) | |
436 | |
437 @end example | |
438 | |
439 This tells us that the line is a statement and it is indented relative | |
440 to buffer position 35, which happens to be the @samp{i} in @code{int} on | |
441 line 3. If you were to move point to line 3 and hit @kbd{C-c C-s}, you | |
442 would see: | |
443 @example | |
444 | |
445 ((defun-block-intro . 29)) | |
446 | |
447 @end example | |
448 | |
449 This indicates that the @samp{int} line is the first statement in a top | |
450 level function block, and is indented relative to buffer position 29, | |
451 which is the brace just after the function header. | |
452 | |
453 Here's another example: | |
454 @example | |
455 @group | |
456 | |
457 1: int add( int val, int incr, int doit ) | |
458 2: @{ | |
459 3: if( doit ) | |
460 4: @{ | |
461 5: return( val + incr ); | |
462 6: @} | |
463 7: return( val ); | |
464 8: @} | |
465 | |
466 @end group | |
467 @end example | |
468 | |
469 @noindent | |
470 Hitting @kbd{C-c C-s} on line 4 gives us: | |
471 @example | |
472 | |
473 ((substatement-open . 46)) | |
474 | |
475 @end example | |
476 | |
477 @cindex substatement | |
478 @cindex substatment block | |
479 @noindent | |
480 which tells us that this is a brace that @emph{opens} a substatement | |
481 block. @footnote{A @dfn{substatement} indicates the line after an | |
482 @code{if}, @code{else}, @code{while}, @code{do}, @code{switch}, or | |
483 @code{for} statement, and a @dfn{substatement block} is a brace block | |
484 following one of those constructs.} | |
485 | |
486 @cindex comment only line | |
487 Syntactic component lists can contain more than one component, and | |
488 individual syntactic components need not have relative buffer positions. | |
489 The most common example of this is a line that contains a @dfn{comment | |
490 only line}. | |
491 @example | |
492 @group | |
493 | |
494 1: void draw_list( List<Drawables>& drawables ) | |
495 2: @{ | |
496 3: // call the virtual draw() method on each element in list | |
497 4: for( int i=0; i < drawables.count(), ++i ) | |
498 5: @{ | |
499 6: drawables[i].draw(); | |
500 7: @} | |
501 8: @} | |
502 | |
503 @end group | |
504 @end example | |
505 | |
506 @noindent | |
507 Hitting @kbd{C-c C-s} on line 3 of example 3 gives us: | |
508 @example | |
509 | |
510 ((comment-intro) (defun-block-intro . 46)) | |
511 | |
512 @end example | |
513 | |
514 @noindent | |
515 so you can see that the syntactic component list contains two syntactic | |
516 components. Also notice that the first component, | |
517 @samp{(comment-intro)} has no relative buffer position. | |
518 | |
519 | |
520 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
521 @node Indentation Calculation, , Syntactic Analysis, New Indentation Engine | |
522 @comment node-name, next, previous,up | |
523 @section Indentation Calculation | |
524 @cindex Indentation Calculation | |
525 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
526 | |
527 @vindex c-offsets-alist | |
528 @vindex offsets-alist (c-) | |
529 Indentation for the current line is calculated using the syntactic | |
530 component list derived in step 1 above (see @ref{Syntactic Analysis}). | |
531 Each component contributes to the final total indentation of the line in | |
532 two ways. | |
533 | |
534 First, the syntactic symbols are looked up in the @code{c-offsets-alist} | |
535 variable, which is an association list of syntactic symbols and the | |
536 offsets to apply for those symbols. These offsets are added to the | |
537 running total. | |
538 | |
539 Second, if the component has a relative buffer position, @code{cc-mode} | |
540 adds the column number of that position to the running total. By adding | |
541 up the offsets and columns for every syntactic component on the list, | |
542 the final total indentation for the current line is computed. | |
543 | |
544 Let's use our two code examples above to see how this works. Here is | |
545 our first example again: | |
546 @example | |
547 @group | |
548 | |
549 1: void swap( int& a, int& b ) | |
550 2: @{ | |
551 3: int tmp = a; | |
552 4: a = b; | |
553 5: b = tmp; | |
554 6: @} | |
555 | |
556 @end group | |
557 @end example | |
558 | |
559 @kindex TAB | |
560 Let's say point is on line 3 and we hit the @key{TAB} key to re-indent | |
561 the line. Remember that the syntactic component list for that | |
562 line is: | |
563 @example | |
564 | |
565 ((defun-block-intro . 29)) | |
566 | |
567 @end example | |
568 | |
569 @noindent | |
570 @code{cc-mode} looks up @code{defun-block-intro} in the | |
571 @code{c-offsets-alist} variable. Let's say it finds the value @samp{4}; | |
572 it adds this to the running total (initialized to zero), yielding a | |
573 running total indentation of 4 spaces. | |
574 | |
575 Next @code{cc-mode} goes to buffer position 29 and asks for the current | |
576 column. Since the brace at buffer position 29 is in column zero, it | |
577 adds @samp{0} to the running total. Since there is only one syntactic | |
578 component on the list for this line, indentation calculation is | |
579 complete, and the total indentation for the line | |
580 is 4 spaces. | |
581 | |
582 Here's another example: | |
583 @example | |
584 @group | |
585 | |
586 1: int add( int val, int incr, int doit ) | |
587 2: @{ | |
588 3: if( doit ) | |
589 4: @{ | |
590 5: return( val + incr ); | |
591 6: @} | |
592 7: return( val ); | |
593 8: @} | |
594 | |
595 @end group | |
596 @end example | |
597 | |
598 If we were to hit @kbd{TAB} on line 4 in the above example, the same | |
599 basic process is performed, despite the differences in the syntactic | |
600 component list. Remember that the list for this line is: | |
601 @example | |
602 | |
603 ((substatement-open . 46)) | |
604 | |
605 @end example | |
606 | |
607 Here, @code{cc-mode} first looks up the @code{substatement-open} symbol | |
608 in @code{c-offsets-alist}. Let's say it finds the value @samp{4}. This | |
609 yields a running total of 4. @code{cc-mode} then goes to | |
610 buffer position 46, which is the @samp{i} in @code{if} on line 3. This | |
611 character is in the fourth column on that line so adding this to the | |
612 running total yields an indentation for the line of 8 spaces. | |
613 | |
614 Simple, huh? | |
615 | |
616 Actually, the mode usually just does The Right Thing without you having | |
617 to think about it in this much detail. But when customizing | |
618 indentation, it's helpful to understand the general indentation model | |
619 being used. | |
620 | |
621 @vindex c-echo-syntactic-information-p | |
622 @vindex echo-syntactic-information-p (c-) | |
623 @cindex TAB | |
624 To help you configure @code{cc-mode}, you can set the variable | |
625 @code{c-echo-syntactic-information-p} to non-@code{nil} so that the | |
626 syntactic component list and calculated offset will always be echoed in | |
627 the minibuffer when you hit @kbd{TAB}. | |
628 | |
629 | |
630 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
631 @node Minor Modes, Indentation Commands, New Indentation Engine, Top | |
632 @comment node-name, next, previous,up | |
633 | |
634 @chapter Minor Modes | |
635 @cindex Minor Modes | |
636 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
637 | |
638 @code{cc-mode} contains two minor-mode-like features that you should | |
639 find useful while you enter new C code. The first is called | |
640 @dfn{auto-newline} mode, and the second is called @dfn{hungry-delete} | |
641 mode. These minor modes can be toggled on and off independently, and | |
642 @code{cc-mode} can be configured so that it comes up with any | |
643 combination of these minor modes. By default, both of these minor modes | |
644 are turned off. | |
645 | |
646 The state of the minor modes is always reflected in the minor mode list | |
647 on the modeline of the @code{cc-mode} buffer. When auto-newline mode is | |
648 enabled, you will see @samp{C/a} on the mode line @footnote{Remember | |
649 that the @samp{C} would be replaced with @samp{C++} or @samp{ObjC} if | |
650 you were editing C++ or Objective-C code.}. When hungry delete mode is | |
651 enabled you would see @samp{C/h} and when both modes are enabled, you'd | |
652 see @samp{C/ah}. | |
653 | |
654 @kindex C-c C-a | |
655 @kindex C-c C-d | |
656 @kindex C-c C-t | |
657 @findex c-toggle-hungry-state | |
658 @findex c-toggle-auto-state | |
659 @findex c-toggle-auto-hungry-state | |
660 @findex toggle-hungry-state (c-) | |
661 @findex toggle-auto-state (c-) | |
662 @findex toggle-auto-hungry-state (c-) | |
663 @code{cc-mode} provides keybindings which allow you to toggle the minor | |
664 modes while editing code on the fly. To toggle just the auto-newline | |
665 state, hit @kbd{C-c C-a} (@code{c-toggle-auto-state}). When you do | |
666 this, you should see the @samp{a} indicator either appear or disappear | |
667 on the modeline. Similarly, to toggle just the hungry-delete state, use | |
668 @kbd{C-c C-d} (@code{c-toggle-hungry-state}), and to toggle both states | |
669 together, use @kbd{C-c C-t} (@code{c-toggle-auto-hungry-state}). | |
670 | |
671 To set up the auto-newline and hungry-delete states to your preferred | |
672 values, you would need to add some lisp to your @file{.emacs} file that | |
673 called one of the @code{c-toggle-*-state} functions directly. When | |
674 called programmatically, each function takes a numeric value, where | |
675 a positive number enables the minor mode, a negative number disables the | |
676 mode, and zero toggles the current state of the mode. | |
677 | |
678 So for example, if you wanted to enable both auto-newline and | |
679 hungry-delete for all your C file editing, you could add the following | |
680 to your @file{.emacs} file: | |
681 @example | |
682 | |
683 (add-hook 'c-mode-common-hook '(lambda () (c-toggle-auto-hungry-state 1))) | |
684 | |
685 @end example | |
686 | |
687 | |
688 @cindex electric characters | |
689 | |
690 @menu | |
691 * Auto-newline insertion:: | |
692 * Hungry-deletion of whitespace:: | |
693 @end menu | |
694 | |
695 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
696 @node Auto-newline insertion, Hungry-deletion of whitespace, , Minor Modes | |
697 @comment node-name, next, previous,up | |
698 | |
699 @section Auto-newline insertion | |
700 @cindex Auto-newline insertion | |
701 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
702 | |
703 @cindex electric commands | |
704 Auto-newline minor mode works by enabling certain @dfn{electric | |
705 commands}. Electric commands are typically bound to special characters | |
706 such as the left and right braces, colons, semi-colons, etc., which when | |
707 typed, perform some magic formatting in addition to inserting the typed | |
708 character. As a general rule, electric commands are only electric when | |
709 the following conditions apply: | |
710 | |
711 @itemize @bullet | |
712 @item | |
713 Auto-newline minor mode is enabled, as evidenced by a @samp{C/a} or | |
714 @samp{C/ah} indicator on the modeline. | |
715 | |
716 @cindex literal | |
717 @cindex syntactic whitespace | |
718 @item | |
719 The character was not typed inside of a literal @footnote{A | |
720 @dfn{literal} is defined in @code{cc-mode} as any comment, | |
721 string, or cpp macro definition. These constructs are also known as | |
722 @dfn{syntactic whitespace} since they are usually ignored when scanning | |
723 C code.}. | |
724 | |
725 @item | |
726 @kindex C-u | |
727 No numeric argument was supplied to the command (i.e. it was typed as | |
728 normal, with no @kbd{C-u} prefix). | |
729 | |
730 @end itemize | |
731 | |
732 Certain other conditions may apply on a language specific basis. For | |
733 example, the second slash (@kbd{/}) of a C++ style line comment is | |
734 electric in @code{c++-mode}, @code{objc-mode}, and @code{java-mode}, but | |
735 not in @code{c-mode}. | |
736 | |
737 | |
738 @menu | |
739 * Hanging Braces:: | |
740 * Hanging Colons:: | |
741 * Hanging Semi-colons and commas:: | |
742 * Other electric commands:: | |
743 * Clean-ups:: | |
744 @end menu | |
745 | |
746 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
747 @node Hanging Braces, Hanging Colons, , Auto-newline insertion | |
748 @comment node-name, next, previous,up | |
749 | |
750 @subsection Hanging Braces | |
751 @cindex Hanging Braces | |
752 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
753 | |
754 @findex c-electric-brace | |
755 @findex electric-brace (c-) | |
756 @vindex c-hanging-braces-alist | |
757 @vindex hanging-braces-alist (c-) | |
758 @vindex c-offsets-alist | |
759 @vindex offsets-alist (c-) | |
760 When you type either an open or close brace (i.e. @kbd{@{} or @kbd{@}}), | |
761 the electric command @code{c-electric-brace} gets run. This command has | |
762 two electric formatting behaviors. First, it will perform some | |
763 re-indentation of the line the brace was typed on, and second, it will | |
764 add various newlines before and/or after the typed brace. | |
765 Re-indentation occurs automatically whenever the electric behavior is | |
766 enabled. If the brace ends up on a line other than the one it was typed | |
767 on, then that line is on is also indented according to | |
768 @code{c-offsets-alist}. | |
769 | |
770 @cindex class-open syntactic symbol | |
771 @cindex class-close syntactic symbol | |
772 @cindex defun-open syntactic symbol | |
773 @cindex defun-close syntactic symbol | |
774 @cindex inline-open syntactic symbol | |
775 @cindex inline-close syntactic symbol | |
776 @cindex brace-list-open syntactic symbol | |
777 @cindex brace-list-close syntactic symbol | |
778 @cindex brace-list-intro syntactic symbol | |
779 @cindex brace-list-entry syntactic symbol | |
780 @cindex block-open syntactic symbol | |
781 @cindex block-close syntactic symbol | |
782 @cindex substatement-open syntactic symbol | |
783 @cindex statement-case-open syntactic symbol | |
784 | |
785 The insertion of newlines is controlled by the | |
786 @code{c-hanging-braces-alist} variable. This variable contains a | |
787 mapping between syntactic symbols related to braces, and a list of | |
788 places to insert a newline. The syntactic symbols that are useful for | |
789 this list are: @code{class-open}, @code{class-close}, @code{defun-open}, | |
790 @code{defun-close}, @code{inline-open}, @code{inline-close}, | |
791 @code{brace-list-open}, @code{brace-list-close}, | |
792 @code{brace-list-intro}, @code{brace-list-entry}, @code{block-open}, | |
793 @code{block-close}, @code{substatement-open}, and | |
794 @code{statement-case-open}. @xref{Syntactic Symbols} for a more | |
795 detailed description of these syntactic symbols. | |
796 | |
797 @cindex custom indentation function | |
798 The value associated with each syntactic symbol in this association list | |
799 is called an @var{ACTION} which can be either a function or a list. | |
800 @xref{Custom Brace and Colon Hanging} for a more detailed discussion of | |
801 using a function as a brace hanging @var{ACTION}. | |
802 | |
803 When @var{ACTION} is a list, it can contain any combination of the | |
804 symbols @code{before} or @code{after}, directing @code{cc-mode} where to | |
805 put newlines in relationship to the brace being inserted. Thus, if the | |
806 list contains only the symbol @code{after}, then the brace is said to | |
807 @dfn{hang} on the right side of the line, as in: | |
808 @example | |
809 @group | |
810 | |
811 // here, open braces always `hang' | |
812 void spam( int i ) @{ | |
813 if( i == 7 ) @{ | |
814 dosomething(i); | |
815 @} | |
816 @} | |
817 | |
818 | |
819 @end group | |
820 @end example | |
821 | |
822 When the list contains both @code{after} and @code{before}, the braces | |
823 will appear on a line by themselves, as shown by the close braces in the | |
824 above example. The list can also be empty, in which case no newlines | |
825 are added either before or after the brace. | |
826 | |
827 For example, the default value of @code{c-hanging-braces-alist} is: | |
828 @example | |
829 @group | |
830 | |
831 (defvar c-hanging-braces-alist '((brace-list-open) | |
832 (substatement-open after) | |
833 (block-close . c-snug-do-while))) | |
834 | |
835 @end group | |
836 @end example | |
837 | |
838 @noindent | |
839 which says that @code{brace-list-open} braces should both hang on the | |
840 right side, and allow subsequent text to follow on the same line as the | |
841 brace. Also, @code{substatement-open} braces should hang on the right | |
842 side, but subsequent text should follow on the next line. Here, in the | |
843 @code{block-close} entry, you also see an example of using a function as | |
844 an @var{ACTION}. | |
845 | |
846 | |
847 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
848 @node Hanging Colons, Hanging Semi-colons and commas, Hanging Braces, Auto-newline insertion | |
849 @comment node-name, next, previous,up | |
850 | |
851 @subsection Hanging Colons | |
852 @cindex Hanging Colons | |
853 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
854 | |
855 @vindex hanging-colons-alist (c-) | |
856 @vindex c-hanging-colons-alist | |
857 Using a mechanism similar to brace hanging (see @ref{Hanging Braces}), | |
858 colons can also be made to hang using the variable | |
859 @code{c-hanging-colons-alist}. The syntactic symbols appropriate for | |
860 this assocation list are: @code{case-label}, @code{label}, | |
861 @code{access-label}, @code{member-init-intro}, and @code{inher-intro}. | |
862 @xref{Hanging Braces} and @ref{Custom Brace and Colon Hanging} for | |
863 details. Note however, that @code{c-hanging-colons-alist} does not | |
864 implement functions as @var{ACTION}s. | |
865 | |
866 @cindex clean-ups | |
867 In C++, double-colons are used as a scope operator but because these | |
868 colons always appear right next to each other, newlines before and after | |
869 them are controlled by a different mechanism, called @dfn{clean-ups} in | |
870 @code{cc-mode}. @xref{Clean-ups} for details. | |
871 | |
872 | |
873 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
874 @node Hanging Semi-colons and commas, Other electric commands, Hanging Colons, Auto-newline insertion | |
875 @comment node-name, next, previous,up | |
876 | |
877 @subsection Hanging Semi-colons and commas | |
878 @cindex Hanging Semi-colons and commas | |
879 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
880 | |
881 Semicolons and commas are also electric in @code{cc-mode}, but since | |
882 these characters do not correspond directly to syntactic symbols, a | |
883 different mechanism is used to determine whether newlines should be | |
884 automatically inserted after these characters. @xref{Customizing | |
885 Semi-colons and Commas} for details. | |
886 | |
887 | |
888 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
889 @node Other electric commands, Clean-ups, Hanging Semi-colons and commas, Auto-newline insertion | |
890 @comment node-name, next, previous,up | |
891 | |
892 @subsection Other electric commands | |
893 @cindex Other electric commands | |
894 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
895 | |
896 @kindex # | |
897 @findex c-electric-pound | |
898 @vindex c-electric-pound-behavior | |
899 @findex electric-pound (c-) | |
900 @vindex electric-pound-behavior (c-) | |
901 @vindex c-offsets-alist | |
902 @vindex offsets-alist (c-) | |
903 A few other keys also provide electric behavior. For example the | |
904 @kbd{#} key (@code{c-electric-pound}) is electric when it is typed as | |
905 the first non-whitespace character on a line. In this case, the | |
906 variable @code{c-electric-pound-behavior} is consulted for the electric | |
907 behavior. This variable takes a list value, although the only element | |
908 currently defined is @code{alignleft}, which tells this command to force | |
909 the @samp{#} character into column zero. This is useful for entering | |
910 cpp macro definitions. | |
911 | |
912 @findex c-electric-star | |
913 @findex c-electric-slash | |
914 @findex electric-star (c-) | |
915 @findex electric-slash (c-) | |
916 @cindex comment-only line | |
917 Stars and slashes (i.e. @kbd{*} and @kbd{/}) are also electric under | |
918 certain circumstances. If a star is inserted as the second character of | |
919 a C style block comment on a @dfn{comment-only} line, then the comment | |
920 delimiter is indented as defined by @code{c-offsets-alist}. A | |
921 comment-only line is defined as a line which contains only a comment, as | |
922 in: | |
923 @example | |
924 @group | |
925 | |
926 void spam( int i ) | |
927 @{ | |
928 // this is a comment-only line... | |
929 if( i == 7 ) // but this is not | |
930 @{ | |
931 dosomething(i); | |
932 @} | |
933 @} | |
934 | |
935 @end group | |
936 @end example | |
937 | |
938 Likewise, if a slash is inserted as the second slash in a C++ style line | |
939 comment (also only on a comment-only line), then the line is indented as | |
940 defined by @code{c-offsets-alist}. | |
941 | |
942 | |
943 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
944 @node Clean-ups, , Other electric commands, Auto-newline insertion | |
945 @comment node-name, next, previous,up | |
946 | |
947 @subsection Clean-ups | |
948 @cindex Clean-ups | |
949 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
950 | |
951 @dfn{Clean-ups} are a mechanism complementary to colon and brace | |
952 hanging. On the surface, it would seem that clean-ups overlap the | |
953 functionality provided by the @code{c-hanging-*-alist} variables, and | |
954 similarly, clean-ups are only enabled when auto-newline minor mode is | |
955 enabled. Clean-ups are used however to adjust code ``after-the-fact'', | |
956 i.e. to eliminate some whitespace that isn't inserted by electric | |
957 commands, or whitespace that contains intervening constructs. | |
958 | |
959 @cindex literal | |
960 You can configure @code{cc-mode}'s clean-ups by setting the variable | |
961 @code{c-cleanup-list}, which is a list of clean-up symbols. By default, | |
962 @code{cc-mode} cleans up only the @code{scope-operator} construct, which | |
963 is necessary for proper C++ support. Note that clean-ups are only | |
964 performed when the construct does not occur within a literal (see | |
965 @ref{Auto-newline insertion}), and when there is nothing but whitespace | |
966 appearing between the individual components of the construct. | |
967 | |
968 @vindex c-cleanup-list | |
969 @vindex cleanup-list (c-) | |
970 There are currently only five specific constructs that @code{cc-mode} | |
971 can clean up, as indicated by these symbols: | |
972 | |
973 @itemize @bullet | |
974 @item | |
975 @code{brace-else-brace} -- cleans up @samp{@} else @{} constructs by | |
976 placing the entire construct on a single line. Clean-up occurs when the | |
977 open brace after the @samp{else} is typed. So for example, this: | |
978 @example | |
979 @group | |
980 | |
981 void spam(int i) | |
982 @{ | |
983 if( i==7 ) | |
984 @{ | |
985 dosomething(); | |
986 @} | |
987 else | |
988 @{ | |
989 | |
990 @end group | |
991 @end example | |
992 @noindent | |
993 appears like this after the open brace is typed: | |
994 @example | |
995 @group | |
996 | |
997 void spam(int i) | |
998 @{ | |
999 if( i==7 ) @{ | |
1000 dosomething(); | |
1001 @} else @{ | |
1002 | |
1003 @end group | |
1004 @end example | |
1005 | |
1006 @item | |
1007 @code{empty-defun-braces} -- cleans up braces following a top-level | |
1008 function or class definition that contains no body. Clean up occurs | |
1009 when the closing brace is typed. Thus the following: | |
1010 @example | |
1011 @group | |
1012 | |
1013 class Spam | |
1014 @{ | |
1015 @} | |
1016 | |
1017 @end group | |
1018 @end example | |
1019 @noindent | |
1020 is transformed into this when the close brace is typed: | |
1021 @example | |
1022 @group | |
1023 | |
1024 class Spam | |
1025 @{@} | |
1026 | |
1027 @end group | |
1028 @end example | |
1029 | |
1030 @item | |
1031 @code{defun-close-semi} -- cleans up the terminating semi-colon on | |
1032 top-level function or class definitions when they follow a close | |
1033 brace. Clean up occurs when the semi-colon is typed. | |
1034 So for example, the following: | |
1035 @example | |
1036 @group | |
1037 | |
1038 class Spam | |
1039 @{ | |
1040 @} | |
1041 ; | |
1042 | |
1043 @end group | |
1044 @end example | |
1045 @noindent | |
1046 is transformed into this when the semi-colon is typed: | |
1047 | |
1048 @example | |
1049 @group | |
1050 | |
1051 class Spam | |
1052 @{ | |
1053 @}; | |
1054 | |
1055 @end group | |
1056 @end example | |
1057 | |
1058 @item | |
1059 @code{list-close-comma} -- cleans up commas following braces in array | |
1060 and aggregate initializers. Clean up occurs when the comma is typed. | |
1061 | |
1062 @item | |
1063 @code{scope-operator} -- cleans up double colons which may designate a | |
1064 C++ scope operator split across multiple lines@footnote{Certain C++ | |
1065 constructs introduce ambiguous situations, so @code{scope-operator} | |
1066 clean-ups may not always be correct. This usually only occurs when | |
1067 scoped identifiers appear in switch label tags.}. Clean up occurs when | |
1068 the second colon is typed. You will always want @code{scope-operator} | |
1069 in the @code{c-cleanup-list} when you are editing C++ code. | |
1070 | |
1071 @end itemize | |
1072 | |
1073 | |
1074 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1075 @node Hungry-deletion of whitespace, , Auto-newline insertion, Minor Modes | |
1076 @comment node-name, next, previous,up | |
1077 | |
1078 @section Hungry-deletion of whitespace | |
1079 @cindex Hungry-deletion of whitespace | |
1080 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1081 | |
1082 Hungry deletion of whitespace, or as it more commonly called, | |
1083 @dfn{hungry-delete mode}, is a simple feature that some people find | |
1084 extremely useful. In fact, you might find yourself wanting | |
1085 hungry-delete in @strong{all} your editing modes! | |
1086 | |
1087 @kindex DEL | |
1088 In a nutshell, when hungry-delete mode is enabled, hitting the @kbd{DEL} | |
1089 character will consume all preceding whitespace, including newlines and | |
1090 tabs. This can really cut down on the number of @kbd{DEL}'s you have to | |
1091 type if, for example you made a mistake on the preceding line. | |
1092 | |
1093 @findex c-electric-delete | |
1094 @findex electric-delete (c-) | |
1095 @vindex c-delete-function | |
1096 @vindex delete-function (c-) | |
1097 @cindex literal | |
1098 By default, @code{cc-mode} actually runs the command | |
1099 @code{c-electric-delete} when you hit @kbd{DEL}. When this command is | |
1100 used to delete a single character (i.e. when it is called interactively | |
1101 with no numeric argument), it really runs the function contained in the | |
1102 variable @code{c-delete-function}. This function is called with a | |
1103 single argument, which is the number of characters to delete. | |
1104 @code{c-delete-function} is also called when the @kbd{DEL} key is typed | |
1105 inside a literal (see @ref{Auto-newline insertion}. Inside a literal, | |
1106 @code{c-electric-delete} is not electric, which is typical of all the | |
1107 so-called electric commands. | |
1108 | |
1109 | |
1110 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1111 @node Indentation Commands, Customizing Indentation, Minor Modes, Top | |
1112 @comment node-name, next, previous,up | |
1113 | |
1114 @chapter Indentation Commands | |
1115 @cindex Indentation Commands | |
1116 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1117 | |
1118 @findex c-set-style | |
1119 @findex set-style (c-) | |
1120 Various commands are provided which allow you to conveniently re-indent | |
1121 C constructs, and these are outlined below. There are several things to | |
1122 note about these indentation commands. First, when you | |
1123 change your programming style, either though @code{c-set-style} or some | |
1124 other means, your file does @emph{not} automatically get re-indented. | |
1125 When you change style parameters, you will typically need to reformat | |
1126 the line, expression, or buffer to see the effects of your changes. | |
1127 | |
1128 @cindex c-hanging- functions | |
1129 @findex c-hanging-braces-alist | |
1130 @findex hanging-braces-alist (c-) | |
1131 Second, changing some variables have no effect on existing code, even | |
1132 when you do re-indent. For example, the @code{c-hanging-*} variables and | |
1133 @code{c-cleanup-list} only affect newly entered code. So for example, | |
1134 changing @code{c-hanging-braces-alist} and re-indenting the buffer will | |
1135 not adjust placement of braces already in the file. | |
1136 | |
1137 @vindex c-progress-interval | |
1138 @vindex progress-interval (c-) | |
1139 Third, re-indenting large portions of code is currently rather | |
1140 inefficient. Improvements have been made since previous releases of | |
1141 @code{cc-mode}, and much more radical improvements will be made for the | |
1142 next release, but for now you need to be aware of this @footnote{In | |
1143 particular, I have had people complain about the speed that | |
1144 @code{cc-mode} re-indents @code{lex(1)} output. Lex, yacc, and other | |
1145 code generators usually output some pretty perverse code. @emph{Don't} | |
1146 try to indent this stuff with @code{cc-mode}!}. Some provision has been | |
1147 made to at least inform you as to the progress of your large | |
1148 re-indentation command. The variable @code{c-progress-interval} | |
1149 controls how often a progress message is displayed. Set this variable | |
1150 to @code{nil} to inhibit progress messages. Note that this feature only | |
1151 works with Emacs 19. | |
1152 | |
1153 Also, except as noted below, re-indentation is always driven by the | |
1154 same mechanisms that control on-the-fly indentation of code. @xref{New | |
1155 Indentation Engine} for details. | |
1156 | |
1157 @findex c-indent-command | |
1158 @findex indent-command (c-) | |
1159 @vindex c-tab-always-indent | |
1160 @vindex tab-always-indent (c-) | |
1161 @kindex TAB | |
1162 @cindex literal | |
1163 To indent a single line of code, use @kbd{TAB} | |
1164 (@code{c-indent-command}). The behavior of this command is controlled | |
1165 by the variable @code{c-tab-always-indent}. When this variable is | |
1166 @code{t}, @kbd{TAB} always just indents the current line. When | |
1167 @code{nil}, the line is indented only if point is at the left | |
1168 margin, or on or before the first non-whitespace character on the line, | |
1169 otherwise a real tab character is inserted. If this variable's value is | |
1170 something other that @code{t} or @code{nil} (e.g. @code{'other}), then a | |
1171 real tab character is inserted only when point is inside a | |
1172 literal (see @ref{Auto-newline insertion}), otherwise the line is | |
1173 indented. | |
1174 | |
1175 @kindex M-C-q | |
1176 @findex c-indent-exp | |
1177 @findex indent-exp (c-) | |
1178 To indent an entire balanced brace or parenthesis expression, use | |
1179 @kbd{M-C-q} (@code{c-indent-exp}). Note that point should be on | |
1180 the opening brace or parenthesis of the expression you want to indent. | |
1181 | |
1182 @kindex C-c C-q | |
1183 @findex c-indent-defun | |
1184 @findex indent-defun (c-) | |
1185 Another very convenient keystroke is @kbd{C-c C-q} | |
1186 (@code{c-indent-defun}) when re-indents the entire top-level function or | |
1187 class definition that encompases point. It leaves point at the | |
1188 same position within the buffer. | |
1189 | |
1190 @kindex M-C-\ | |
1191 @findex indent-region | |
1192 To indent any arbitrary region of code, use @kbd{M-C-\} | |
1193 (@code{indent-region}). This is a standard Emacs command, specially | |
1194 tailored for C code in a @code{cc-mode} buffer. Note that of course, | |
1195 point and mark must delineate the region you | |
1196 want to indent. | |
1197 | |
1198 @kindex M-C-h | |
1199 @findex c-mark-function | |
1200 @findex mark-function (c-) | |
1201 While not strictly an indentation function, @kbd{M-C-h} | |
1202 (@code{c-mark-function}) is useful for marking the current top-level | |
1203 function or class definition as the current region. | |
1204 | |
1205 | |
1206 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1207 @node Customizing Indentation, Syntactic Symbols, Indentation Commands, Top | |
1208 @comment node-name, next, previous,up | |
1209 | |
1210 @chapter Customizing Indentation | |
1211 @cindex Customizing Indentation | |
1212 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1213 | |
1214 @cindex c-set-offset | |
1215 @cindex set-offset (c-) | |
1216 The @code{c-offsets-alist} variable is where you customize all your | |
1217 indentations. You simply need to decide what additional offset you want | |
1218 to add for every syntactic symbol. You can use the command @kbd{C-c | |
1219 C-o} (@code{c-set-offset}) as the way to set offsets, both interactively | |
1220 and from your mode hook. Also, you can set up @emph{styles} of | |
1221 indentation just like in BOCM. Most likely, you'll | |
1222 find one of the pre-defined styles will suit your needs, but if not, | |
1223 this section will describe how to set up basic editing configurations. | |
1224 @xref{Styles} for an explanation of how to set up named styles. | |
1225 | |
1226 @cindex c-basic-offset | |
1227 @cindex basic-offset (c-) | |
1228 As mentioned previously, the variable @code{c-offsets-alist} is an | |
1229 association list between syntactic symbols and the offsets to be applied | |
1230 for those symbols. In fact, these offset values can be an integer, a | |
1231 function or variable name, or one of the following symbols: @code{+}, | |
1232 @code{-}, @code{++}, @code{--}, @code{*}, or @code{/}. These symbols | |
1233 describe offset in multiples of the value of the variable | |
1234 @code{c-basic-offset}. By defining a style's indentation in terms of | |
1235 this fundamental variable, you can change the amount of whitespace given | |
1236 to an indentation level while leaving the same relationship between | |
1237 levels. Here are multiples of @code{c-basic-offset} that the special | |
1238 symbols correspond to: | |
1239 | |
1240 @itemize @bullet | |
1241 | |
1242 @item | |
1243 @code{+ } = @code{c-basic-offset} times 1 | |
1244 @item | |
1245 @code{- } = @code{c-basic-offset} times -1 | |
1246 @item | |
1247 @code{++} = @code{c-basic-offset} times 2 | |
1248 @item | |
1249 @code{--} = @code{c-basic-offset} times -2 | |
1250 @item | |
1251 @code{* } = @code{c-basic-offset} times 0.5 | |
1252 @item | |
1253 @code{/ } = @code{c-basic-offset} times -0.5 | |
1254 | |
1255 @end itemize | |
1256 | |
1257 @noindent | |
1258 So, for example, because most of the default offsets are defined in | |
1259 terms of @code{+}, @code{-}, and @code{0}, if you like the general | |
1260 indentation style, but you use 4 spaces instead of 2 spaces per level, | |
1261 you can probably achieve your style just by changing | |
1262 @code{c-basic-offset} like so (in your @file{.emacs} file)@footnote{The | |
1263 reason you need to use @code{setq-default} instead of @code{setq} is | |
1264 that @code{c-basic-offset} is a buffer local variable, as are most of | |
1265 the @code{cc-mode} configuration variables. If you were to put this | |
1266 code in, e.g. your @code{c-mode-common-hook} function, you could use | |
1267 @code{setq}.}: | |
1268 @example | |
1269 | |
1270 (setq-default c-basic-offset 4) | |
1271 | |
1272 @end example | |
1273 | |
1274 @noindent | |
1275 This would change | |
1276 @example | |
1277 @group | |
1278 | |
1279 int add( int val, int incr, int doit ) | |
1280 @{ | |
1281 if( doit ) | |
1282 @{ | |
1283 return( val + incr ); | |
1284 @} | |
1285 return( val ); | |
1286 @} | |
1287 | |
1288 @end group | |
1289 @end example | |
1290 | |
1291 @noindent | |
1292 to | |
1293 @example | |
1294 @group | |
1295 | |
1296 int add( int val, int incr, int doit ) | |
1297 @{ | |
1298 if( doit ) | |
1299 @{ | |
1300 return( val + incr ); | |
1301 @} | |
1302 return( val ); | |
1303 @} | |
1304 | |
1305 @end group | |
1306 @end example | |
1307 | |
1308 To change indentation styles more radically, you will want to change the | |
1309 value associated with the syntactic symbols in the | |
1310 @code{c-offsets-alist} variable. First, I'll show you how to do that | |
1311 interactively, then I'll describe how to make changes to your | |
1312 @file{.emacs} file so that your changes are more permanent. | |
1313 | |
1314 @menu | |
1315 * Interactive Customization:: | |
1316 * Permanent Customization:: | |
1317 * Styles:: | |
1318 * Advanced Customizations:: | |
1319 @end menu | |
1320 | |
1321 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1322 @node Interactive Customization, Permanent Customization, , Customizing Indentation | |
1323 @comment node-name, next, previous,up | |
1324 | |
1325 @section Interactive Customization | |
1326 @cindex Interactive Customization | |
1327 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1328 | |
1329 As an example of how to customize indentation, let's change the | |
1330 style of example 2 above from: | |
1331 @example | |
1332 @group | |
1333 | |
1334 1: int add( int val, int incr, int doit ) | |
1335 2: @{ | |
1336 3: if( doit ) | |
1337 4: @{ | |
1338 5: return( val + incr ); | |
1339 6: @} | |
1340 7: return( val ); | |
1341 8: @} | |
1342 | |
1343 @end group | |
1344 @end example | |
1345 @noindent | |
1346 to: | |
1347 @example | |
1348 @group | |
1349 | |
1350 1: int add( int val, int incr, int doit ) | |
1351 2: @{ | |
1352 3: if( doit ) | |
1353 4: @{ | |
1354 5: return( val + incr ); | |
1355 6: @} | |
1356 7: return( val ); | |
1357 8: @} | |
1358 | |
1359 @end group | |
1360 @end example | |
1361 | |
1362 In other words, we want to change the indentation of braces that open a | |
1363 block following a condition so that the braces line up under the | |
1364 conditional, instead of being indented. Notice that the construct we | |
1365 want to change starts on line 4. To change the indentation of a line, | |
1366 we need to see which syntactic component affect the offset calculations | |
1367 for that line. Hitting @kbd{C-c C-s} on line 4 yields: | |
1368 @example | |
1369 | |
1370 ((substatement-open . 46)) | |
1371 | |
1372 @end example | |
1373 | |
1374 @findex c-set-offset | |
1375 @findex set-offset (c-) | |
1376 @kindex C-c C-o | |
1377 @noindent | |
1378 so we know that to change the offset of the open brace, we need to | |
1379 change the indentation for the @code{substatement-open} syntactic | |
1380 symbol. To do this interactively, just hit @kbd{C-c C-o} | |
1381 (@code{c-set-offset}). This prompts you for the syntactic symbol to | |
1382 change, providing a reasonable default. In this case, the default is | |
1383 @code{substatement-open}, which is just the syntactic symbol we want to | |
1384 change! | |
1385 | |
1386 After you hit return, @code{cc-mode} will then prompt you for the new | |
1387 offset value, with the old value as the default. The default in this | |
1388 case is @samp{+}, so hit backspace to delete the @samp{+}, then hit | |
1389 @samp{0} and @kbd{RET}. This will associate the offset 0 with the | |
1390 syntactic symbol @code{substatement-open} in the @code{c-offsets-alist} | |
1391 variable. | |
1392 | |
1393 @findex c-indent-defun | |
1394 @findex indent-defun (c-) | |
1395 @kindex C-c C-q | |
1396 To check your changes quickly, just hit @kbd{C-c C-q} | |
1397 (@code{c-indent-defun}) to reindent the entire function. The example | |
1398 should now look like: | |
1399 @example | |
1400 @group | |
1401 | |
1402 1: int add( int val, int incr, int doit ) | |
1403 2: @{ | |
1404 3: if( doit ) | |
1405 4: @{ | |
1406 5: return( val + incr ); | |
1407 6: @} | |
1408 7: return( val ); | |
1409 8: @} | |
1410 | |
1411 @end group | |
1412 @end example | |
1413 | |
1414 Notice how just changing the open brace offset on line 4 is all we | |
1415 needed to do. Since the other affected lines are indented relative to | |
1416 line 4, they are automatically indented the way you'd expect. For more | |
1417 complicated examples, this may not always work. The general approach to | |
1418 take is to always start adjusting offsets for lines higher up in the | |
1419 file, then re-indent and see if any following lines need further | |
1420 adjustments. | |
1421 | |
1422 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1423 @node Permanent Customization, Styles, Interactive Customization, Customizing Indentation | |
1424 @comment node-name, next, previous,up | |
1425 | |
1426 @section Permanent Indentation | |
1427 @cindex Permanent Indentation | |
1428 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1429 | |
1430 @vindex c-mode-common-hook | |
1431 @vindex c-mode-hook | |
1432 @vindex c++-mode-hook | |
1433 @vindex objc-mode-hook | |
1434 @vindex java-mode-hook | |
1435 @cindex hooks | |
1436 To make this change permanent, you need to add some lisp code to your | |
1437 @file{.emacs} file. @code{cc-mode} provides four hooks that you can use | |
1438 to customize your language editing styles. Four language specific hooks | |
1439 are provided, according to Emacs major mode conventions: | |
1440 @code{c-mode-hook}, @code{c++-mode-hook}, @code{objc-mode-hook}, and | |
1441 @code{java-mode-hook}. These get run as the last thing when you enter | |
1442 @code{c-mode}, @code{c++-mode}, @code{objc-mode}, or | |
1443 @code{java-mode-hook} respectively. @code{cc-mode} also provides a hook | |
1444 called @code{c-mode-common-hook} which is run by all three modes | |
1445 @emph{before} the language specific hook. Thus, to make changes | |
1446 consistently across all supported @code{cc-mode} modes, use | |
1447 @code{c-mode-common-hook}. Most of the examples in this section will | |
1448 assume you are using the common hook. | |
1449 | |
1450 Here's a simplified example of what you can add to your @file{.emacs} | |
1451 file to make the changes described in the previous section | |
1452 (@ref{Interactive Customization}) more permanent. See the Emacs | |
1453 manuals for more information on customizing Emacs via hooks. | |
1454 @xref{Sample .emacs File} for a more complete sample @file{.emacs} file. | |
1455 @footnote{The use of @code{add-hook} in this example only works for | |
1456 Emacs 19. Workarounds are available if you are using Emacs 18.} | |
1457 @example | |
1458 @group | |
1459 | |
1460 (defun my-c-mode-common-hook () | |
1461 ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode | |
1462 (c-set-offset 'substatement-open 0) | |
1463 ;; other customizations can go here | |
1464 ) | |
1465 (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) | |
1466 | |
1467 @end group | |
1468 @end example | |
1469 | |
1470 For complex customizations, you will probably want to set up a | |
1471 @emph{style} that groups all your customizations under a single | |
1472 name. | |
1473 | |
1474 The offset value can also be a function, and this is how power users | |
1475 gain enormous flexibility in customizing indentation. @xref{Advanced | |
1476 Customizations} for details. | |
1477 | |
1478 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1479 @node Styles, Advanced Customizations, Permanent Customization, Customizing Indentation | |
1480 @comment node-name, next, previous,up | |
1481 | |
1482 @section Styles | |
1483 @cindex Styles | |
1484 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1485 | |
1486 Most people only need to edit code formatted in just a few well-defined | |
1487 and consistent styles. For example, their organization might impose a | |
1488 ``blessed'' style that all its programmers must conform to. Similarly, | |
1489 people who work on GNU software will have to use the GNU coding style on | |
1490 C code. Some shops are more lenient, allowing some variety of coding | |
1491 styles, and as programmers come and go, there could be a number of | |
1492 styles in use. For this reason, @code{cc-mode} makes it convenient for | |
1493 you to set up logical groupings of customizations called @dfn{styles}, | |
1494 associate a single name for any particular style, and pretty easily | |
1495 start editing new or existing code using these styles. This chapter | |
1496 describes how to set up styles and how to edit your C code using styles. | |
1497 | |
1498 @menu | |
1499 * Built-in Styles:: | |
1500 * Adding Styles:: | |
1501 * File Styles:: | |
1502 @end menu | |
1503 | |
1504 | |
1505 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1506 @node Built-in Styles, Adding Styles, , Styles | |
1507 @comment node-name, next, previous,up | |
1508 | |
1509 @subsection Built-in Styles | |
1510 @cindex Built-in Styles | |
1511 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1512 | |
1513 If you're lucky, one of @code{cc-mode}'s built-in styles might be just | |
1514 what you're looking for. Some of the most common C and C++ styles are | |
1515 already built-in. These include: | |
1516 | |
1517 @itemize @bullet | |
1518 @item | |
1519 @cindex GNU style | |
1520 @code{gnu} -- coding style blessed by the Free Software Foundation | |
1521 for C code in GNU programs. | |
1522 | |
1523 @item | |
1524 @cindex K&R style | |
1525 @code{k&r} -- The classic Kernighan and Ritchie style for C code. | |
1526 | |
1527 @item | |
1528 @cindex BSD style | |
1529 @code{bsd} -- @strong{<TBD> Anybody know anything about the history of | |
1530 this style?} | |
1531 | |
1532 @item | |
1533 @cindex Stroustrup style | |
1534 @code{stroustrup} -- The classic Stroustrup style for C++ code. | |
1535 | |
1536 @item | |
1537 @cindex Whitesmith style | |
1538 @code{whitesmith} -- @strong{<TBD> Anybody know anything about the history of | |
1539 this style?} | |
1540 | |
1541 @item | |
1542 @cindex Ellemtel style | |
1543 @code{ellemtel} -- Popular C++ coding standards as defined by | |
1544 ``Programming in C++, Rules and Recommendations'', Erik Nyquist and Mats | |
1545 Henricson, Ellemtel @footnote{This document is ftp'able from | |
1546 @code{euagate.eua.ericsson.se}}. | |
1547 | |
1548 @item | |
1549 @cindex Java style | |
1550 @cindex java-mode | |
1551 @code{java} -- The style for editing Java code. Note that this style is | |
1552 automatically installed when you enter @code{java-mode}. | |
1553 | |
1554 @item | |
1555 @cindex CC-MODE style | |
1556 @code{CC-MODE} -- Style that encapsulates the default values of the | |
1557 @code{cc-mode} variables. See below for details. | |
1558 | |
1559 @end itemize | |
1560 | |
1561 @findex c-set-style | |
1562 @findex set-style (c-) | |
1563 If you'd like to experiment with these built-in styles you can simply | |
1564 type the following in a @code{cc-mode} buffer: | |
1565 @example | |
1566 @group | |
1567 | |
1568 @kbd{M-x c-set-style RET @var{STYLE-NAME} RET} | |
1569 | |
1570 @end group | |
1571 @end example | |
1572 @noindent | |
1573 Note that all style names are case insensitive, even the ones you define. | |
1574 | |
1575 Setting a style in this way does @emph{not} automatically re-indent your | |
1576 file. For commands that you can use to view the effect of your changes, | |
1577 see @ref{Indentation Commands}. | |
1578 | |
1579 Once you find a built-in style you like, you can make the change | |
1580 permanent by adding a call to your @file{.emacs} file. Let's say for | |
1581 example that you want to use the @code{ellemtel} style in all your | |
1582 files. You would add this: | |
1583 @example | |
1584 @group | |
1585 | |
1586 (defun my-c-mode-common-hook () | |
1587 ;; use Ellemtel style for all C, C++, and Objective-C code | |
1588 (c-set-style "ellemtel") | |
1589 ;; other customizations can go here | |
1590 ) | |
1591 (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) | |
1592 | |
1593 @end group | |
1594 @end example | |
1595 | |
1596 There is one other special style you can use, called @code{CC-MODE}. | |
1597 This is a style that is calculated by @code{cc-mode} when it starts up. | |
1598 The @code{CC-MODE} style is also special because all other styles | |
1599 implicitly inherit from it; in other words, whenever you set a style, | |
1600 @code{cc-mode} first re-instates the @code{CC-MODE} style, then applies | |
1601 your new style configurations. | |
1602 | |
1603 The @code{CC-MODE} style exists because once @code{cc-mode} initializes, | |
1604 it institutes the @code{gnu} style for compatibility with BOCM's | |
1605 defaults. Any customizations you make in mode hooks will be based on | |
1606 the @code{gnu} style, unless you first do a @code{c-set-style} to | |
1607 @code{CC-MODE} or some other built-in style. | |
1608 | |
1609 | |
1610 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1611 @node Adding Styles, File Styles, Built-in Styles, Styles | |
1612 @comment node-name, next, previous,up | |
1613 | |
1614 @subsection Adding Styles | |
1615 @cindex Adding Styles | |
1616 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1617 | |
1618 @vindex c-style-alist | |
1619 @vindex style-alist (c-) | |
1620 @findex c-add-style | |
1621 @findex add-style (c-) | |
1622 If none of the built-in styles is appropriate, you'll probably want to | |
1623 add a new style definition. Styles are kept in the @code{c-style-alist} | |
1624 variable, but you probably won't want to modify this variable directly. | |
1625 @code{cc-mode} provides a function, called @code{c-add-style}, that you | |
1626 can use to easily add new styles or update existing styles. This | |
1627 function takes two arguments, a @var{stylename} string, and an | |
1628 association list @var{description} of style customizations. If | |
1629 @var{stylename} is not already in @code{c-style-alist}, the new style is | |
1630 added, otherwise the style already associated with @var{stylename} is | |
1631 changed to the new @var{description}. This function also takes an | |
1632 optional third argument, which if non-@code{nil}, automatically | |
1633 institutes the new style in the current buffer. | |
1634 | |
1635 The sample @file{.emacs} file provides a concrete example of how a new | |
1636 style can be added and automatically set. @xref{Sample .emacs File}. | |
1637 | |
1638 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1639 @node File Styles, , Adding Styles, Styles | |
1640 @comment node-name, next, previous,up | |
1641 | |
1642 @subsection File Styles | |
1643 @cindex File Styles | |
1644 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1645 | |
1646 @cindex local variables | |
1647 The Emacs manual describes how you can customize certain variables on a | |
1648 per-file basis by including a @dfn{Local Variable} block at the end of | |
1649 the file. So far, you've only seen a functional interface to | |
1650 @code{cc-mode}, which is highly inconvenient for use in a Local Variable | |
1651 block. @code{cc-mode} provides two variables that make it easier for | |
1652 you to customize your style on a per-file basis. | |
1653 | |
1654 @vindex c-file-style | |
1655 @vindex file-style (c-) | |
1656 @vindex c-file-offsets | |
1657 @vindex file-offsets (c-) | |
1658 | |
1659 The variable @code{c-file-style} can be set to a style name string as | |
1660 described in @ref{Built-in Styles}. When the file is visited, | |
1661 @code{cc-mode} will automatically set the file's style to this style | |
1662 using @code{c-set-style}. | |
1663 | |
1664 @vindex c-offsets-alist | |
1665 @vindex offsets-alist (c-) | |
1666 @findex c-set-offset | |
1667 @findex set-offset (c-) | |
1668 Another variable, @code{c-file-offsets}, takes an association list | |
1669 similar to what is allowed in @code{c-offsets-alist}. When the file is | |
1670 visited, @code{cc-mode} will automatically institute these offets using | |
1671 @code{c-set-offset}. | |
1672 | |
1673 Note that file style settings (i.e. @code{c-file-style}) are applied | |
1674 before file offset settings (i.e. @code{c-file-offsets}). | |
1675 | |
1676 | |
1677 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1678 @node Advanced Customizations, , Styles, Customizing Indentation | |
1679 @comment node-name, next, previous,up | |
1680 | |
1681 @section Advanced Customizations | |
1682 @cindex Advanced Customizations | |
1683 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1684 | |
1685 @vindex c-style-alist | |
1686 @vindex style-alist (c-) | |
1687 @vindex c-basic-offset | |
1688 @vindex basic-offset (c-) | |
1689 For most users, @code{cc-mode} will support their coding styles with | |
1690 very little need for customizations. Usually, one of the standard | |
1691 styles defined in @code{c-style-alist} will do the trick. At most, | |
1692 perhaps one of the syntactic symbol offsets will need to be tweaked | |
1693 slightly, or maybe @code{c-basic-offset} will need to be changed. | |
1694 However, some styles require a more advanced ability for customization, | |
1695 and one of the real strengths of @code{cc-mode} is that the syntactic | |
1696 analysis model provides a very flexible framework for customizing | |
1697 indentation. This allows you to perform special indentation calculations | |
1698 for situations not handled by the mode directly. | |
1699 | |
1700 @menu | |
1701 * Custom Indentation Functions:: | |
1702 * Custom Brace and Colon Hanging:: | |
1703 * Customizing Semi-colons and Commas:: | |
1704 * Other Special Indentations:: | |
1705 @end menu | |
1706 | |
1707 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1708 @node Custom Indentation Functions, Custom Brace and Colon Hanging, , Advanced Customizations | |
1709 @comment node-name, next, previous,up | |
1710 | |
1711 @subsection Custom Indentation Functions | |
1712 @cindex Custom Indentation Functions | |
1713 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1714 | |
1715 @cindex custom indentation functions | |
1716 One of the most common ways to customize @code{cc-mode} is by writing | |
1717 @dfn{custom indentation functions} and associating them with specific | |
1718 syntactic symbols (see @ref{Syntactic Symbols}). @code{cc-mode} itself | |
1719 uses custom indentation functions to provide more sophisticated | |
1720 indentation, for example when lining up C++ stream operator blocks: | |
1721 @example | |
1722 @group | |
1723 | |
1724 1: void main(int argc, char**) | |
1725 2: @{ | |
1726 3: cout << "There were " | |
1727 4: << argc | |
1728 5: << "arguments passed to the program" | |
1729 6: << endl; | |
1730 7: @} | |
1731 | |
1732 @end group | |
1733 @end example | |
1734 | |
1735 In this example, lines 4 through 6 are assigned the @code{stream-op} | |
1736 syntactic symbol. If @code{stream-op} had an offset of @code{+}, and | |
1737 @code{c-basic-offset} was 2, lines 4 through 6 would simply be indented | |
1738 two spaces to the right of line 3. But perhaps we'd like @code{cc-mode} | |
1739 to be a little more intelligent so that it offsets the stream operators | |
1740 under the operator in line 3. To do this, we have to write a custom | |
1741 indentation function which finds the column of first stream operator on | |
1742 the first line of the statement. Here is the lisp code (from the | |
1743 @file{cc-mode.el} source file) that implements this: | |
1744 @example | |
1745 @group | |
1746 | |
1747 (defun c-lineup-streamop (langelem) | |
1748 ;; lineup stream operators | |
1749 (save-excursion | |
1750 (let* ((relpos (cdr langelem)) | |
1751 (curcol (progn (goto-char relpos) | |
1752 (current-column)))) | |
1753 (re-search-forward "<<\\|>>" (c-point 'eol) 'move) | |
1754 (goto-char (match-beginning 0)) | |
1755 (- (current-column) curcol)))) | |
1756 | |
1757 @end group | |
1758 @end example | |
1759 @noindent | |
1760 Custom indent functions take a single argument, which is a syntactic | |
1761 component cons cell (see @ref{Syntactic Analysis}). The | |
1762 function returns an integer offset value that will be added to the | |
1763 running total indentation for the lne. Note that what actually gets | |
1764 returned is the difference between the column that the first stream | |
1765 operator is on, and the column of the buffer relative position passed in | |
1766 the function's argument. Remember that @code{cc-mode} automatically | |
1767 adds in the column of the component's relative buffer position and we | |
1768 don't want that value added into the final total twice. | |
1769 | |
1770 @cindex stream-op syntactic symbol | |
1771 @findex c-lineup-streamop | |
1772 @findex lineup-streamop (c-) | |
1773 Now, to associate the function @code{c-lineup-streamop} with the | |
1774 @code{stream-op} syntactic symbol, we can add something like the | |
1775 following to our @code{c++-mode-hook}@footnote{It probably makes more | |
1776 sense to add this to @code{c++-mode-hook} than @code{c-mode-common-hook} | |
1777 since stream operators are only relevent for C++.}: | |
1778 @example | |
1779 | |
1780 (c-set-offset 'stream-op 'c-lineup-streamop) | |
1781 | |
1782 @end example | |
1783 | |
1784 @kindex C-c C-q | |
1785 Now the function looks like this after re-indenting (using @kbd{C-c | |
1786 C-q}): | |
1787 @example | |
1788 @group | |
1789 | |
1790 1: void main(int argc, char**) | |
1791 2: @{ | |
1792 3: cout << "There were " | |
1793 4: << argc | |
1794 5: << "arguments passed to the program" | |
1795 6: << endl; | |
1796 7: @} | |
1797 | |
1798 @end group | |
1799 @end example | |
1800 | |
1801 @vindex c-offsets-alist | |
1802 @vindex offsets-alist (c-) | |
1803 Custom indentation functions can be as simple or as complex as you like, | |
1804 and any syntactic symbol that appears in @code{c-offsets-alist} can have | |
1805 a custom indentation function associated with it. | |
1806 | |
1807 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1808 @node Custom Brace and Colon Hanging, Customizing Semi-colons and Commas, Custom Indentation Functions, Advanced Customizations | |
1809 @comment node-name, next, previous,up | |
1810 | |
1811 @subsection Custom Brace and Colon Hanging | |
1812 @cindex Custom Brace and Colon Hanging | |
1813 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1814 | |
1815 @vindex c-hanging-braces-alist | |
1816 @vindex hanging-braces-alist (c-) | |
1817 Syntactic symbols aren't the only place where you can customize | |
1818 @code{cc-mode} with the lisp equivalent of callback functions. Brace | |
1819 hanginess can also be determined by custom functions associated with | |
1820 syntactic symbols on the @code{c-hanging-braces-alist} variable. | |
1821 Remember that @var{ACTION}'s are typically a list containing some | |
1822 combination of the symbols @code{before} and @code{after} (see | |
1823 @ref{Hanging Braces}). However, an @var{ACTION} can also be a function | |
1824 symbol which gets called when a brace matching that syntactic symbol is | |
1825 typed. | |
1826 | |
1827 @cindex customizing brace hanging | |
1828 These @var{ACTION} functions are called with two arguments: the | |
1829 syntactic symbol for the brace, and the buffer position at which the | |
1830 brace was inserted. The @var{ACTION} function is expected to return a | |
1831 list containing some combination of @code{before} and @code{after}. The | |
1832 function can also return @code{nil}. This return value has the normal | |
1833 brace hanging semantics described in @ref{Hanging Braces}. | |
1834 | |
1835 As an example, @code{cc-mode} itself uses this feature to dynamically | |
1836 determine the hanginess of braces which close @samp{do-while} | |
1837 constructs: | |
1838 @example | |
1839 @group | |
1840 | |
1841 void do_list( int count, char** atleast_one_string ) | |
1842 @{ | |
1843 int i=0; | |
1844 do @{ | |
1845 handle_string( atleast_one_string( i )); | |
1846 i++; | |
1847 @} while( i < count ); | |
1848 @} | |
1849 | |
1850 @end group | |
1851 @end example | |
1852 | |
1853 @findex c-snug-do-while | |
1854 @findex snug-do-while (c-) | |
1855 @code{cc-mode} assigns the @code{block-close} syntactic symbol to the | |
1856 brace that closes the @code{do} construct, and normally we'd like the | |
1857 line that follows a @code{block-close} brace to begin on a separate | |
1858 line. However, with @samp{do-while} constructs, we want the | |
1859 @code{while} clause to follow the closing brace. To do this, we | |
1860 associate the @code{block-close} symbol with the @var{ACTION} function | |
1861 @code{c-snug-do-while}: | |
1862 @example | |
1863 | |
1864 (defun c-snug-do-while (syntax pos) | |
1865 "Dynamically calculate brace hanginess for do-while statements. | |
1866 Using this function, `while' clauses that end a `do-while' block will | |
1867 remain on the same line as the brace that closes that block. | |
1868 | |
1869 See `c-hanging-braces-alist' for how to utilize this function as an | |
1870 ACTION associated with `block-close' syntax." | |
1871 (save-excursion | |
1872 (let (langelem) | |
1873 (if (and (eq syntax 'block-close) | |
1874 (setq langelem (assq 'block-close c-syntactic-context)) | |
1875 (progn (goto-char (cdr langelem)) | |
1876 (if (= (following-char) ?@{) | |
1877 (forward-sexp -1)) | |
1878 (looking-at "\\<do\\>[^_]"))) | |
1879 '(before) | |
1880 '(before after))))) | |
1881 | |
1882 @end example | |
1883 | |
1884 This function simply looks to see if the brace closes a @samp{do-while} | |
1885 clause and if so, returns the list @samp{@code{(before)}} indicating | |
1886 that a newline should be inserted before the brace, but not after it. | |
1887 In all other cases, it returns the list @samp{@code{(before after)}} so | |
1888 that the brace appears on a line by itself. | |
1889 | |
1890 @vindex c-syntactic-context | |
1891 @vindex syntactic-context (c-) | |
1892 During the call to the brace hanging @var{ACTION} function, the variable | |
1893 @code{c-syntactic-context} is bound to the full syntactic analysis list. | |
1894 | |
1895 @cindex customizing colon hanging | |
1896 @vindex c-hanging-colon-alist | |
1897 @vindex hanging-colon-alist (c-) | |
1898 Note that for symmetry, colon hanginess should be customizable by | |
1899 allowing function symbols as @var{ACTION}s on the | |
1900 @code{c-hanging-colon-alist} variable. Since no use has actually been | |
1901 found for this feature, it isn't currently implemented. | |
1902 | |
1903 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1904 @node Customizing Semi-colons and Commas, Other Special Indentations, Custom Brace and Colon Hanging, Advanced Customizations | |
1905 @comment node-name, next, previous,up | |
1906 | |
1907 @subsection Customizing Semi-colons and Commas | |
1908 @cindex Customizing Semi-colons and Commas | |
1909 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1910 | |
1911 @cindex customizing semi-colons and commas | |
1912 @vindex c-hanging-semi&comma-criteria | |
1913 @vindex hanging-semi&comma-criteria (c-) | |
1914 You can also customize the insertion of newlines after semi-colons and | |
1915 commas, when the auto-newline minor mode is enabled (see @ref{Minor | |
1916 Modes}). This is controlled by the variable | |
1917 @code{c-hanging-semi&comma-criteria}, which contains a list of functions | |
1918 that are called in the order they appear. Each function is called with | |
1919 zero arguments, and is expected to return one of the following values: | |
1920 | |
1921 @itemize @bullet | |
1922 @item | |
1923 non-@code{nil} -- A newline is inserted, and no more functions from the | |
1924 list are called. | |
1925 | |
1926 @item | |
1927 @code{stop} -- No more functions from the list are called, but no | |
1928 newline is inserted. | |
1929 | |
1930 @item | |
1931 @code{nil} -- No determination is made, and the next function in the | |
1932 list is called. | |
1933 | |
1934 @end itemize | |
1935 | |
1936 If every function in the list is called without a determination being | |
1937 made, then no newline is added. The default value for this variable is a | |
1938 list containing a single function which inserts newlines only after | |
1939 semi-colons which do not appear inside parenthesis lists (i.e. those | |
1940 that separate @code{for}-clause statements). | |
1941 | |
1942 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1943 @node Other Special Indentations, , Customizing Semi-colons and Commas, Advanced Customizations | |
1944 @comment node-name, next, previous,up | |
1945 | |
1946 @subsection Other Special Indentations | |
1947 @cindex Customizing Semi-colons and Commas | |
1948 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1949 | |
1950 @vindex c-special-indent-hook | |
1951 @vindex special-indent-hook (c-) | |
1952 One other customization variable is available in @code{cc-mode}: | |
1953 @code{c-special-indent-hook}. This is a standard hook variable that is | |
1954 called after every line is indented by @code{cc-mode}. You can use it | |
1955 to do any special indentation or line adjustments your style dictates, | |
1956 such as adding extra indentation to constructors or destructor | |
1957 declarations in a class definition, etc. Note however, that you should | |
1958 not change point or mark inside your @code{c-special-indent-hook} | |
1959 functions (i.e. you'll probably want to wrap your function in a | |
1960 @code{save-excursion}). | |
1961 | |
1962 | |
1963 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1964 @node Syntactic Symbols, Performance Issues, Customizing Indentation, Top | |
1965 @comment node-name, next, previous,up | |
1966 | |
1967 @chapter Syntactic Symbols | |
1968 @cindex Syntactic Symbols | |
1969 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
1970 | |
1971 @vindex c-offsets-alist | |
1972 @vindex offsets-alist (c-) | |
1973 The complete list of recognized syntactic symbols is described in the | |
1974 @code{c-offsets-alist} variable. This chapter will provide some | |
1975 examples to help clarify these symbols. | |
1976 | |
1977 @cindex -open syntactic symbols | |
1978 @cindex -close syntactic symbols | |
1979 Most syntactic symbol names follow a general naming convention. When a | |
1980 line begins with an open or close brace, the syntactic symbol will | |
1981 contain the suffix @code{-open} or @code{-close} respectively. | |
1982 | |
1983 @cindex -intro syntactic symbols | |
1984 @cindex -cont syntactic symbols | |
1985 @cindex -block-intro syntactic symbols | |
1986 Usually, a distinction is made between the first line that introduces a | |
1987 construct and lines that continue a construct, and the syntactic symbols | |
1988 that represent these lines will contain the suffix @code{-intro} or | |
1989 @code{-cont} respectively. As a sub-classification of this scheme, a | |
1990 line which is the first of a particular brace block construct will | |
1991 contain the suffix @code{-block-intro}. | |
1992 | |
1993 @kindex C-c C-s | |
1994 Let's look at some examples to understand how this works. Remember that | |
1995 you can check the syntax of any line by using @kbd{C-c C-s}. | |
1996 @example | |
1997 @group | |
1998 | |
1999 1: void | |
2000 2: swap( int& a, int& b ) | |
2001 3: @{ | |
2002 4: int tmp = a; | |
2003 5: a = b; | |
2004 6: b = tmp; | |
2005 7: int ignored = | |
2006 8: a + b; | |
2007 9: @} | |
2008 | |
2009 @end group | |
2010 @end example | |
2011 | |
2012 Line 1 shows a @code{topmost-intro} since it is the first line that | |
2013 introduces a top-level construct. Line 2 is a continuation of the | |
2014 top-level construct introduction so it has the syntax | |
2015 @code{topmost-intro-cont}. Line 3 shows a @code{defun-open} since it is | |
2016 the brace that opens a top-level function definition. Line 9 is a | |
2017 @code{defun-close} since it contains the brace that closes the top-level | |
2018 function definition. Line 4 is a @code{defun-block-intro}, i.e. it is | |
2019 the first line of a brace-block, which happens to be enclosed in a | |
2020 top-level function definition. | |
2021 | |
2022 Lines 5, 6, and 7 are all given @code{statement} syntax since there | |
2023 isn't much special about them. Note however that line 8 is given | |
2024 @code{statement-cont} syntax since it continues the statement begun | |
2025 on the previous line. | |
2026 | |
2027 Here's another example, which illustrates some C++ class syntactic | |
2028 symbols: | |
2029 @example | |
2030 @group | |
2031 | |
2032 1: class Bass | |
2033 2: : public Guitar, | |
2034 3: public Amplifiable | |
2035 4: @{ | |
2036 5: public: | |
2037 6: Bass() | |
2038 7: : eString( new BassString( 0.105 )), | |
2039 8: aString( new BassString( 0.085 )), | |
2040 9: dString( new BassString( 0.065 )), | |
2041 10: gString( new BassString( 0.045 )) | |
2042 11: @{ | |
2043 12: eString.tune( 'E' ); | |
2044 13: aString.tune( 'A' ); | |
2045 14: dString.tune( 'D' ); | |
2046 15: gString.tune( 'G' ); | |
2047 16: @} | |
2048 17: @} | |
2049 | |
2050 @end group | |
2051 @end example | |
2052 | |
2053 As in the previous example, line 1 has the @code{topmost-intro} syntax. | |
2054 Here however, the brace that opens a C++ class definition on line 4 is | |
2055 assigned the @code{class-open} syntax. Note that in C++, structs and | |
2056 unions are essentially equivalent syntactically (and are very similar | |
2057 semantically), so replacing the @code{class} keyword in the example | |
2058 above with @code{struct} or @code{union} would still result in a syntax | |
2059 of @code{class-open} for line 4 @footnote{This is the case even for C | |
2060 and Objective-C. For consistency, structs in all three languages are | |
2061 syntactically equivalent to classes. Note however that the keyword | |
2062 @code{class} is meaningless in C and Objective-C.}. Similarly, line 17 | |
2063 is assigned @code{class-close} syntax. | |
2064 | |
2065 Line 2 introduces the inheritance list for the class so it is assigned | |
2066 the @code{inher-intro} syntax, and line 3, which continues the | |
2067 inheritance list is given @code{inher-cont} syntax. | |
2068 | |
2069 Things get interesting at line 5. The primary syntactic symbol for this | |
2070 line is @code{access-label} since this a label keyword that specifies | |
2071 access protection in C++. However, this line actually shows two | |
2072 syntactic symbols when you hit @kbd{C-c C-s}. This is because it is | |
2073 also a top-level construct inside a class definition. Thus the other | |
2074 syntactic symbol assigned to this line is @code{inclass}. Similarly, | |
2075 line 6 is given both @code{inclass} and @code{topmost-intro} syntax. | |
2076 | |
2077 Line 7 introduces a C++ member initialization list and as such is given | |
2078 @code{member-init-intro} syntax. Note that in this case it is | |
2079 @emph{not} assigned @code{inclass} since this is not considered a | |
2080 top-level construct. Lines 8 through 10 are all assigned | |
2081 @code{member-init-cont} since they continue the member initialization | |
2082 list started on line 7. | |
2083 | |
2084 @cindex in-class inline methods | |
2085 Line 11 is assigned @code{inline-open} because it opens an | |
2086 @dfn{in-class} C++ inline method definition. This is distinct from, but | |
2087 related to, the C++ notion of an inline function in that its definition | |
2088 occurs inside an enclosing class definition, which in C++ implies that | |
2089 the function should be inlined. For example, if the definition of the | |
2090 @code{Bass} constructor appeared outside the class definition, line 11 | |
2091 would be given the @code{defun-open} syntax, even if the keyword | |
2092 @code{inline} appeared before the method name, as in: | |
2093 @example | |
2094 @group | |
2095 | |
2096 class Bass | |
2097 : public Guitar, | |
2098 public Amplifiable | |
2099 @{ | |
2100 public: | |
2101 Bass(); | |
2102 @} | |
2103 | |
2104 inline | |
2105 Bass::Bass() | |
2106 : eString( new BassString( 0.105 )), | |
2107 aString( new BassString( 0.085 )), | |
2108 dString( new BassString( 0.065 )), | |
2109 gString( new BassString( 0.045 )) | |
2110 @{ | |
2111 eString.tune( 'E' ); | |
2112 aString.tune( 'A' ); | |
2113 dString.tune( 'D' ); | |
2114 gString.tune( 'G' ); | |
2115 @} | |
2116 | |
2117 @end group | |
2118 @end example | |
2119 | |
2120 @noindent | |
2121 Similarly, line 16 is given @code{inline-close} syntax. | |
2122 | |
2123 As in the first example above, line 12 is given @code{defun-block-open} | |
2124 syntax and lines 13 through 15 are all given @code{statement} syntax. | |
2125 | |
2126 Here is another (totally contrived) example which illustrates how syntax | |
2127 is assigned to various conditional constructs: | |
2128 @example | |
2129 @group | |
2130 | |
2131 1: void spam( int index ) | |
2132 2: @{ | |
2133 3: for( int i=0; i<index; i++ ) | |
2134 4: @{ | |
2135 5: if( i == 10 ) | |
2136 6: @{ | |
2137 7: do_something_special(); | |
2138 8: @} | |
2139 9: else | |
2140 10: do_something( i ); | |
2141 11: @} | |
2142 12: do @{ | |
2143 13: another_thing( i-- ); | |
2144 14: @} | |
2145 15: while( i > 0 ); | |
2146 16: @} | |
2147 | |
2148 | |
2149 @end group | |
2150 @end example | |
2151 | |
2152 @noindent | |
2153 Only the lines that illustrate new syntactic symbols will be discussed. | |
2154 | |
2155 Line 4 has a brace which opens a conditional's substatement block. It | |
2156 is thus assigned @code{substatement-open} syntax, and since line 5 is | |
2157 the first line in the substatement block, it is assigned | |
2158 @code{substatement-block-intro} syntax. Lines 6 and 7 are assigned | |
2159 similar syntax. Line 8 contains the brace that closes the inner | |
2160 substatement block. It is given the generic syntax @code{block-close}, | |
2161 as are lines 11 and 14. | |
2162 | |
2163 Line 9 is a little different -- since it contains the keyword | |
2164 @code{else} matching the @code{if} statement introduced on line 5; it is | |
2165 given the @code{else-clause} syntax. Note also that line 10 is slightly | |
2166 different too. Because @code{else} is considered a conditional | |
2167 introducing keyword @footnote{The list of conditional keywords are (in | |
2168 C, Objective-C and C++): @code{for}, @code{if}, @code{do}, @code{else}, | |
2169 @code{while}, and @code{switch}. C++ has two additional conditional | |
2170 keywords: @code{try} and @code{catch}.}, and because the following | |
2171 substatement is not a brace block, line 10 is assigned the | |
2172 @code{substatement} syntax. | |
2173 | |
2174 One other difference is seen on line 15. The @code{while} construct | |
2175 that closes a @code{do} conditional is given the special syntax | |
2176 @code{do-while-closure} if it appears on a line by itself. Note that if | |
2177 the @code{while} appeared on the same line as the preceding close brace, | |
2178 that line would have been assigned @code{block-close} syntax instead. | |
2179 | |
2180 Switch statements have their own set of syntactic symbols. Here's an | |
2181 example: | |
2182 @example | |
2183 @group | |
2184 | |
2185 1: void spam( enum Ingredient i ) | |
2186 2: @{ | |
2187 3: switch( i ) @{ | |
2188 4: case Ham: | |
2189 5: be_a_pig(); | |
2190 6: break; | |
2191 7: case Salt: | |
2192 8: drink_some_water(); | |
2193 9: break; | |
2194 10: default: | |
2195 11: @{ | |
2196 12: what_is_it(); | |
2197 13: break; | |
2198 14: @} | |
2199 15: @} | |
2200 14: @} | |
2201 | |
2202 @end group | |
2203 @end example | |
2204 | |
2205 Here, lines 4, 7, and 10 are all assigned @code{case-label} syntax, | |
2206 while lines 5 and 8 are assigned @code{statement-case-intro}. Line 11 | |
2207 is treated slightly differently since it contains a brace that opens a | |
2208 block -- it is given @code{statement-case-open} syntax. | |
2209 | |
2210 @cindex brace lists | |
2211 There are a set of syntactic symbols that are used to recognize | |
2212 constructs inside of brace lists. A brace list is defined as an | |
2213 @code{enum} or aggregate initializer list, such as might statically | |
2214 initialize an array of structs. For example: | |
2215 @example | |
2216 @group | |
2217 | |
2218 1: static char* ingredients[] = | |
2219 2: @{ | |
2220 3: "Ham", | |
2221 4: "Salt", | |
2222 5: NULL | |
2223 6: @} | |
2224 | |
2225 @end group | |
2226 @end example | |
2227 | |
2228 Following convention, line 2 in this example is assigned | |
2229 @code{brace-list-open} syntax, and line 3 is assigned | |
2230 @code{brace-list-intro} syntax. Likewise, line 6 is assigned | |
2231 @code{brace-list-close} syntax. Lines 4 and 5 however, are assigned | |
2232 @code{brace-list-entry} syntax, as would all subsequent lines in this | |
2233 initializer list. | |
2234 | |
2235 A number of syntactic symbols are associated with parenthesis lists, | |
2236 a.k.a argument lists, as found in function declarations and function | |
2237 calls. This example illustrates these: | |
2238 @example | |
2239 @group | |
2240 | |
2241 1: void a_function( int line1, | |
2242 2: int line2 ); | |
2243 3: | |
2244 4: void a_longer_function( | |
2245 5: int line1, | |
2246 6: int line2 | |
2247 7: ); | |
2248 8: | |
2249 9: void call_them( int line1, int line2 ) | |
2250 10: @{ | |
2251 11: a_function( | |
2252 12: line1, | |
2253 13: line2 | |
2254 14: ); | |
2255 15: | |
2256 16: a_longer_function( line1, | |
2257 17: line2 ); | |
2258 18: @} | |
2259 | |
2260 @end group | |
2261 @end example | |
2262 | |
2263 Lines 5 and 12 are assigned @code{arglist-intro} syntax since they are | |
2264 the first line following the open parenthesis, and lines 7 and 14 are | |
2265 assigned @code{arglist-close} syntax since they contain the parenthesis | |
2266 that closes the argument list. | |
2267 | |
2268 The other lines with relevant syntactic symbols include lines 2 and 17 | |
2269 which are assigned @code{arglist-cont-nonempty} syntax. What this means | |
2270 is that they continue an argument list, but that the line containing the | |
2271 parenthesis that opens the list is @emph{non-empty} following the open | |
2272 parenthesis. Contrast this against lines 6 and 13 which are assigned | |
2273 @code{arglist-cont} syntax. This is because the parenthesis that opens | |
2274 their argument lists is the last character on that line @footnote{The | |
2275 need for this somewhat confusing arrangement is that the typical | |
2276 indentation desired for these lines is calculated very differently. | |
2277 This should be simplified in version 5 of @code{cc-mode}, along with the | |
2278 added distinction between argument lists in function declarations, and | |
2279 argument lists in function calls.}. | |
2280 | |
2281 Note that there is no @code{arglist-open} syntax. This is because any | |
2282 parenthesis that opens an argument list, appearing on a separate line, | |
2283 is assigned the @code{statement-cont} syntax instead. | |
2284 | |
2285 A few miscellaneous syntactic symbols that haven't been previously | |
2286 covered are illustrated by this example: | |
2287 @example | |
2288 @group | |
2289 | |
2290 1: void Bass::play( int volume ) | |
2291 2: const | |
2292 3: @{ | |
2293 4: /* this line starts a multi-line | |
2294 5: * comment. This line should get `c' syntax */ | |
2295 6: | |
2296 7: char* a_long_multiline_string = "This line starts a multi-line \ | |
2297 8: string. This line should get `string' syntax."; | |
2298 9: | |
2299 10: note: | |
2300 11: @{ | |
2301 12: #ifdef LOCK | |
2302 13: Lock acquire(); | |
2303 14: #endif // LOCK | |
2304 15: slap_pop(); | |
2305 16: cout << "I played " | |
2306 17: << "a note\n"; | |
2307 18: @} | |
2308 19: @} | |
2309 | |
2310 @end group | |
2311 @end example | |
2312 | |
2313 @cindex modifier syntactic symbol | |
2314 The lines to note in this example include: | |
2315 | |
2316 @itemize @bullet | |
2317 | |
2318 @item | |
2319 line 2 which is assigned the @code{ansi-funcdecl-cont} syntax; | |
2320 | |
2321 @item | |
2322 line 4 which is assigned both @code{defun-block-intro} @emph{and} | |
2323 @code{comment-intro} syntax @footnote{The @code{comment-intro} syntactic | |
2324 symbol is known generically as a @dfn{modifier} since it always appears | |
2325 on a syntactic analysis list with other symbols, and never has a | |
2326 relative buffer position.}; | |
2327 | |
2328 @item | |
2329 line 5 which is assigned @code{c} syntax; | |
2330 | |
2331 @item | |
2332 @cindex syntactic whitespace | |
2333 line 6 which, even though it contains nothing but whitespace, is | |
2334 assigned @code{defun-block-intro}. Note that the appearance of the | |
2335 comment on lines 4 and 5 do not cause line 6 to be assigned | |
2336 @code{statement} syntax because comments are considered to be | |
2337 @dfn{syntactic whitespace}, which are essentially ignored when analyzing | |
2338 code; | |
2339 | |
2340 @item | |
2341 line 8 which is assigned @code{string} syntax; | |
2342 | |
2343 @item | |
2344 line 10 which is assigned @code{label} syntax; | |
2345 | |
2346 @item | |
2347 line 11 which is assigned @code{block-open} syntax; | |
2348 | |
2349 @item | |
2350 lines 12 and 14 which are assigned @code{cpp-macro} syntax; | |
2351 | |
2352 @item | |
2353 line 17 which is assigned @code{stream-op} syntax @footnote{In C++ only.}. | |
2354 | |
2355 @end itemize | |
2356 | |
2357 In Objective-C buffers, there are three additional syntactic symbols | |
2358 assigned to various message calling constructs. Here's an example | |
2359 illustrating these: | |
2360 @example | |
2361 @group | |
2362 | |
2363 1: - (void)setDelegate:anObject | |
2364 2: withStuff:stuff | |
2365 3: @{ | |
2366 4: [delegate masterWillRebind:self | |
2367 5: toDelegate:anObject | |
2368 6: withExtraStuff:stuff]; | |
2369 7: @} | |
2370 | |
2371 @end group | |
2372 @end example | |
2373 | |
2374 Here, line 1 is assigned @code{objc-method-intro} syntax, and line 2 is | |
2375 assigned @code{objc-method-args-cont} syntax. Lines 5 and 6 are both | |
2376 assigned @code{objc-method-call-cont} syntax. | |
2377 | |
2378 Other syntactic symbols may be recognized by @code{cc-mode}, but these | |
2379 are more obscure and so I haven't included examples of them. These | |
2380 include: @code{knr-argdecl-intro}, @code{knr-argdecl}, and the | |
2381 @code{friend} modifier. | |
2382 | |
2383 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2384 @node Performance Issues, Frequently Asked Questions, Syntactic Symbols, Top | |
2385 @comment node-name, next, previous,up | |
2386 | |
2387 @chapter Performance Issues | |
2388 @cindex Performance Issues | |
2389 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2390 | |
2391 C and it's derivative languages are highly complex creatures. Often, | |
2392 ambiguous code situations arise that require @code{cc-mode} to scan | |
2393 large portions of the buffer to determine syntactic context. Some | |
2394 pathological code can cause @code{cc-mode} to slow down considerably. | |
2395 This section identifies some of the coding styles to watch out for, and | |
2396 suggests some workarounds that you can use to improve performance. | |
2397 | |
2398 Note that this is an area that will get a lot of attention in | |
2399 @code{cc-mode} version 5. The mode should end up being much faster, at | |
2400 the expense of dropping Emacs 18 support, owing to the implementation of | |
2401 syntactic analysis caching. This is the last release of @code{cc-mode} | |
2402 that will be compatible with Emacs 18. | |
2403 | |
2404 Because @code{cc-mode} has to scan the buffer backwards from the current | |
2405 insertion point, and because C's syntax is fairly difficult to parse in | |
2406 the backwards direction, @code{cc-mode} often tries to find the nearest | |
2407 position higher up in the buffer from which to begin a forward scan. | |
2408 The farther this position is from the current insertion point, the | |
2409 slower the mode gets. Some coding styles can even force @code{cc-mode} | |
2410 to scan from the beginning of the buffer! | |
2411 | |
2412 @findex beginning-of-defun | |
2413 @findex defun-prompt-regexp | |
2414 One of the simplest things you can do to reduce scan time, is make sure | |
2415 any brace that opens a top-level block construct always appears in the | |
2416 leftmost column. This is actually an Emacs constraint, as embodied in | |
2417 the @code{beginning-of-defun} function which @code{cc-mode} uses | |
2418 heavily. If you insist on hanging top-level open braces on the right | |
2419 side of the line, then you should set the variable | |
2420 @code{defun-prompt-regexp} to something reasonable @footnote{Note that | |
2421 this variable is only defined in Emacs 19.}, however that ``something | |
2422 reasonable'' is difficult to define, so @code{cc-mode} doesn't do it | |
2423 for you. | |
2424 | |
2425 @cindex @file{cc-lobotomy.el} file | |
2426 You will probably notice pathological behavior from @code{cc-mode} when | |
2427 working in files containing large amounts of cpp macros. This is | |
2428 because @code{cc-mode} cannot quickly skip backwards over these lines, | |
2429 which do not contribute to the syntactic calculations. You'll probably | |
2430 also have problems if you are editing ``K&R'' C code, i.e. C code that | |
2431 does not use function prototypes. This is because there are ambiguities | |
2432 in the C syntax when K&R style argument lists are used, and | |
2433 @code{cc-mode} has to use a slower scan to determine what it's looking | |
2434 at. | |
2435 | |
2436 @vindex c-recognize-knr-p | |
2437 @vindex recognize-knr-p (c-) | |
2438 For the latter problem, I would suggest converting to ANSI style | |
2439 protocols, and turning the variable @code{c-recognize-knr-p} to | |
2440 @code{nil} (this is it's default value for all modes). | |
2441 | |
2442 @vindex cc-lobotomy-pith-list | |
2443 For the former problem, you might want to investigate some of the | |
2444 speed-ups provided for you in the file @file{cc-lobotomy.el}, which | |
2445 is part of the canonical @code{cc-mode} distribution. As mentioned | |
2446 previous, @code{cc-mode} always trades accuracy for speed, however it is | |
2447 recognized that sometimes you need speed and can sacrifice some accuracy | |
2448 in indentation. The file @file{cc-lobotomy.el} contains hacks that | |
2449 will ``dumb down'' @code{cc-mode} in some specific ways, making that | |
2450 trade-off of speed for accuracy. I won't go into details of its use | |
2451 here; you should read the comments at the top of the file, and look at | |
2452 the variable @code{cc-lobotomy-pith-list} for details. | |
2453 | |
2454 | |
2455 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2456 @node Frequently Asked Questions, Getting the latest cc-mode release, Performance Issues, Top | |
2457 @comment node-name, next, previous,up | |
2458 | |
2459 @chapter Frequently Asked Questions | |
2460 @cindex Frequently Asked Questions | |
2461 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2462 | |
2463 @kindex C-x h | |
2464 @kindex ESC C-\ | |
2465 @kindex ESC C-x | |
2466 @kindex C-c C-q | |
2467 @kindex ESC C-q | |
2468 @kindex ESC C-u | |
2469 @kindex RET | |
2470 @kindex LFD | |
2471 @findex newline-and-indent | |
2472 @quotation | |
2473 | |
2474 @strong{Q.} @emph{How do I re-indent the whole file?} | |
2475 | |
2476 @strong{A.} Visit the file and hit @kbd{C-x h} to mark the whole | |
2477 buffer. Then hit @kbd{@key{ESC} C-\}. | |
2478 @sp 2 | |
2479 | |
2480 @strong{Q.} @emph{How do I re-indent the entire function? | |
2481 @kbd{@key{ESC} C-x} doesn't work.} | |
2482 | |
2483 @strong{A.} @kbd{@key{ESC} C-x} is reserved for future Emacs use. | |
2484 To re-indent the entire function hit @kbd{C-c C-q}. | |
2485 @sp 2 | |
2486 | |
2487 @strong{Q.} @emph{How do I re-indent the current block?} | |
2488 | |
2489 @strong{A.} First move to the brace which opens the block with | |
2490 @kbd{@key{ESC} C-u}, then re-indent that expression with | |
2491 @kbd{@key{ESC} C-q}. | |
2492 @sp 2 | |
2493 | |
2494 @strong{Q.} @emph{Why doesn't the @key{RET} key indent the line to | |
2495 where the new text should go after inserting the newline?} | |
2496 | |
2497 @strong{A.} Emacs' convention is that @key{RET} just adds a newline, | |
2498 and that @key{LFD} adds a newline and indents it. You can make | |
2499 @key{RET} do this too by adding this to your | |
2500 @code{c-mode-common-hook} (see the sample @file{.emacs} file | |
2501 @ref{Sample .emacs File}): | |
2502 @example | |
2503 | |
2504 (define-key c-mode-map "\C-m" 'newline-and-indent) | |
2505 | |
2506 @end example | |
2507 | |
2508 This is a very common question. @code{:-)} If you want this to be the | |
2509 default behavior, don't lobby me, lobby RMS! | |
2510 @sp 2 | |
2511 | |
2512 @strong{Q.} @emph{I put @code{(c-set-offset 'substatement-open 0)} | |
2513 in my @file{.emacs} file but I get an error saying that | |
2514 @code{c-set-offset}'s function definition is void.} | |
2515 | |
2516 @strong{A.} This means that @code{cc-mode} wasn't loaded into your | |
2517 Emacs session by the time the @code{c-set-offset} call was reached, | |
2518 mostly likely because @code{cc-mode} is being autoloaded. Instead | |
2519 of putting the @code{c-set-offset} line in your top-level | |
2520 @file{.emacs} file, put it in your @code{c-mode-common-hook}, or | |
2521 simply add the following to the top of your @file{.emacs} file: | |
2522 @example | |
2523 | |
2524 (require 'cc-mode) | |
2525 | |
2526 @end example | |
2527 | |
2528 See the sample @file{.emacs} file @ref{Sample .emacs File} for | |
2529 details. | |
2530 | |
2531 @strong{Q.} @emph{How do I make strings, comments, keywords, and other | |
2532 constructs appear in different colors, or in bold face, etc.?} | |
2533 | |
2534 @strong{A.} ``Syntax Colorization'' is an Emacs 19 feature, controlled | |
2535 by @code{font-lock-mode}. It is not part of @code{cc-mode}. | |
2536 | |
2537 @end quotation | |
2538 | |
2539 | |
2540 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2541 @node Getting the latest cc-mode release, Sample .emacs File, Frequently Asked Questions, Top | |
2542 @comment node-name, next, previous,up | |
2543 | |
2544 @chapter Getting the latest @code{cc-mode} release | |
2545 @cindex Getting the latest @code{cc-mode} release | |
2546 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2547 | |
2548 @code{cc-mode} is now distributed with both Emacs 19 and XEmacs 19, so | |
2549 you would typically just use the version that comes with your Emacs. | |
2550 Users of older versions of Emacs can get the latest release from this | |
2551 URL: | |
2552 | |
2553 @example | |
2554 | |
2555 @code{ftp://ftp.python.org/pub/emacs/cc-mode.tar.gz} | |
2556 | |
2557 @end example | |
2558 | |
2559 Note that this is a ``gzipped'' tar file. | |
2560 | |
2561 If you do not have anonymous ftp access, you can get the distribution | |
2562 through an anonymous ftp-to-mail gateway, such as the one run by DEC at | |
2563 @code{ftpmail@@decwrl.dec.com}. To get @code{cc-mode} via email, send | |
2564 the following message in the body of your mail to that address: | |
2565 @example | |
2566 | |
2567 reply <a valid net address back to you> | |
2568 connect ftp.python.org | |
2569 binary | |
2570 uuencode | |
2571 chdir pub/emacs | |
2572 get cc-mode.tar.gz | |
2573 | |
2574 @end example | |
2575 @noindent | |
2576 or just send the message "help" for more information on ftpmail. | |
2577 Response times will vary with the number of requests in the queue. | |
2578 | |
2579 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2580 @node Sample .emacs File, Requirements, Getting the latest cc-mode release, Top | |
2581 @comment node-name, next, previous,up | |
2582 | |
2583 @chapter Sample @file{.emacs} file | |
2584 @cindex Sample @file{.emacs} file | |
2585 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2586 | |
2587 @example | |
2588 ;; Here's a sample .emacs file that might help you along the way. Just | |
2589 ;; copy this region and paste it into your .emacs file. You may want to | |
2590 ;; change some of the actual values. | |
2591 | |
2592 (defconst my-c-style | |
2593 '((c-tab-always-indent . t) | |
2594 (c-comment-only-line-offset . 4) | |
2595 (c-hanging-braces-alist . ((substatement-open after) | |
2596 (brace-list-open))) | |
2597 (c-hanging-colons-alist . ((member-init-intro before) | |
2598 (inher-intro) | |
2599 (case-label after) | |
2600 (label after) | |
2601 (access-label after))) | |
2602 (c-cleanup-list . (scope-operator | |
2603 empty-defun-braces | |
2604 defun-close-semi)) | |
2605 (c-offsets-alist . ((arglist-close . c-lineup-arglist) | |
2606 (substatement-open . 0) | |
2607 (case-label . 4) | |
2608 (block-open . 0) | |
2609 (knr-argdecl-intro . -))) | |
2610 (c-echo-syntactic-information-p . t) | |
2611 ) | |
2612 "My C Programming Style") | |
2613 | |
2614 ;; Customizations for all of c-mode, c++-mode, and objc-mode | |
2615 (defun my-c-mode-common-hook () | |
2616 ;; add my personal style and set it for the current buffer | |
2617 (c-add-style "PERSONAL" my-c-style t) | |
2618 ;; offset customizations not in my-c-style | |
2619 (c-set-offset 'member-init-intro '++) | |
2620 ;; other customizations | |
2621 (setq tab-width 8 | |
2622 ;; this will make sure spaces are used instead of tabs | |
2623 indent-tabs-mode nil) | |
2624 ;; we like auto-newline and hungry-delete | |
2625 (c-toggle-auto-hungry-state 1) | |
2626 ;; keybindings for C, C++, and Objective-C. We can put these in | |
2627 ;; c-mode-map because c++-mode-map and objc-mode-map inherit it | |
2628 (define-key c-mode-map "\C-m" 'newline-and-indent) | |
2629 ) | |
2630 | |
2631 ;; the following only works in Emacs 19 | |
2632 ;; Emacs 18ers can use (setq c-mode-common-hook 'my-c-mode-common-hook) | |
2633 (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) | |
2634 @end example | |
2635 | |
2636 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2637 @node Requirements, Limitations and Known Bugs, Sample .emacs File, Top | |
2638 @comment node-name, next, previous,up | |
2639 @chapter Requirements | |
2640 @cindex Requirements | |
2641 @comment * Requirements | |
2642 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2643 | |
2644 @cindex reporter.el | |
2645 @file{cc-mode.el} requires @file{reporter.el} for submission of bug | |
2646 reports. @file{reporter.el} is distributed with the latest Emacs 19s. | |
2647 Here is the Emacs Lisp Archive anonymous ftp'ing record for those of you | |
2648 who are using older Emacsen. | |
2649 | |
2650 @comment * Here's the Emacs Lisp Archive information for @file{reporter.el}: | |
2651 @example | |
2652 | |
2653 GNU Emacs Lisp Code Directory Apropos -- "reporter" | |
2654 "~/" refers to archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive/ | |
2655 | |
2656 reporter (2.12) 06-Jul-1994 | |
2657 Barry A. Warsaw, <bwarsaw@@cnri.reston.va.us> | |
2658 ~/misc/reporter.el.Z | |
2659 Customizable bug reporting of lisp programs. | |
2660 | |
2661 @end example | |
2662 | |
2663 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2664 @node Limitations and Known Bugs, Mailing Lists and Submitting Bug Reports, Requirements, Top | |
2665 @comment node-name, next, previous,up | |
2666 @chapter Limitations and Known Bugs | |
2667 @cindex Limitations and Known Bugs | |
2668 @comment * Limitations and Known Bugs | |
2669 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2670 | |
2671 @itemize @bullet | |
2672 @item | |
2673 Multi-line macros are not handled properly. | |
2674 | |
2675 @item | |
2676 Re-indenting large regions or expressions can be slow. | |
2677 | |
2678 @item | |
2679 Use with Emacs 18 can be slow and annoying. You should seriously | |
2680 consider upgrading to Emacs 19. | |
2681 | |
2682 @item | |
2683 There is still some weird behavior when filling C block comments. | |
2684 My suggestion is to check out add-on fill packages such as | |
2685 @code{filladapt}, available at the elisp archive. | |
2686 | |
2687 @cindex inline-close | |
2688 @kindex TAB | |
2689 @item | |
2690 Lines following @code{inline-close} braces which hang ``after'' do not | |
2691 line up correctly. Hit @kbd{TAB} to reindent the line. | |
2692 | |
2693 @end itemize | |
2694 | |
2695 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2696 @node Mailing Lists and Submitting Bug Reports, Concept Index, Limitations and Known Bugs, Top | |
2697 @comment node-name, next, previous,up | |
2698 @chapter Mailing Lists and Submitting Bug Reports | |
2699 @cindex Mailing Lists and Submitting Bug Reports | |
2700 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2701 | |
2702 @kindex C-c C-b | |
2703 @findex c-submit-bug-report | |
2704 @findex submit-bug-report (c-) | |
2705 @cindex beta testers mailing list | |
2706 @cindex announcement mailing list | |
2707 To report bugs, use the @kbd{C-c C-b} (@code{c-submit-bug-report}) | |
2708 command. This provides vital information I need to reproduce your | |
2709 problem. Make sure you include a concise, but complete code example. | |
2710 Please try to boil your example down to just the essential code needed | |
2711 to reproduce the problem, and include an exact recipe of steps needed to | |
2712 expose the bug. Be especially sure to include any code that appears | |
2713 @emph{before} your bug example. | |
2714 | |
2715 Bug reports are now to be sent to @code{bug-gnu-emacs@@prep.ai.mit.edu} | |
2716 which is mirrored on the Usenet newsgroup @code{gnu.emacs.bug}. Other | |
2717 questions and suggestions should be mailed to | |
2718 @code{help-gnu-emacs@@prep.ai.mit.edu} which is mirrored on | |
2719 @code{gnu.emacs.help}. | |
2720 | |
2721 Note that the @code{cc-mode} Majordomo mailing lists have been | |
2722 disbanded! With the inclusion of @code{cc-mode} in both of the latest | |
2723 flavors of Emacs 19, the need for them has ended. | |
2724 | |
2725 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2726 @node Concept Index, Command Index, Mailing Lists and Submitting Bug Reports, Top | |
2727 @comment node-name, next, previous, up | |
2728 @unnumbered Concept Index | |
2729 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2730 | |
2731 @printindex cp | |
2732 | |
2733 | |
2734 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2735 @node Command Index, Key Index, Concept Index, Top | |
2736 @comment node-name, next, previous, up | |
2737 @unnumbered Command Index | |
2738 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2739 | |
2740 @ifinfo | |
2741 | |
2742 @end ifinfo | |
2743 Since all @code{cc-mode} commands are prepended with the string | |
2744 @samp{c-}, each appears under its @code{c-<thing>} name and its | |
2745 @code{<thing> (c-)} name. | |
2746 @iftex | |
2747 @sp 2 | |
2748 @end iftex | |
2749 @printindex fn | |
2750 | |
2751 | |
2752 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2753 @node Key Index, Variable Index, Command Index, Top | |
2754 @comment node-name, next, previous, up | |
2755 @unnumbered Key Index | |
2756 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2757 | |
2758 @printindex ky | |
2759 | |
2760 | |
2761 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2762 @node Variable Index, , Key Index, Top | |
2763 @comment node-name, next, previous, up | |
2764 @unnumbered Variable Index | |
2765 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
2766 | |
2767 @ifinfo | |
2768 | |
2769 @end ifinfo | |
2770 Since all @code{cc-mode} variables are prepended with the string | |
2771 @samp{c-}, each appears under its @code{c-<thing>} name and its | |
2772 @code{<thing> (c-)} name. | |
2773 @iftex | |
2774 @sp 2 | |
2775 @end iftex | |
2776 @printindex vr | |
2777 @summarycontents | |
2778 @contents | |
2779 @bye |