10
|
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 vhdl-mode.info
|
|
8 @settitle VHDL-MODE Version 2 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{vhdl-mode.el} version 2
|
|
20 @comment manual version: 2.1
|
|
21 @comment adapted from the cc-mode texinfo manual by Barry A. Warsaw
|
|
22 @comment <bwarsaw@cnri.reston.va.us>
|
|
23 @comment
|
|
24 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
25
|
|
26
|
|
27 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
28 @comment The following line inserts the copyright notice
|
|
29 @comment into the Info file.
|
|
30 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
31
|
|
32 @ifinfo
|
|
33 Copyright @copyright{} 1995 Rodney J. Whitby
|
|
34 @end ifinfo
|
|
35
|
|
36 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
37 @comment !!!The titlepage section does not appear in the Info file.!!!
|
|
38 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
39
|
|
40 @titlepage
|
|
41 @sp 10
|
|
42
|
|
43
|
|
44 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
45 @comment The title is printed in a large font.
|
|
46 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
47
|
|
48 @center @titlefont{VHDL-MODE Version 2}
|
|
49 @sp 2
|
|
50 @center A GNU Emacs mode for editing VHDL code.
|
|
51 @center (manual revision: 2.1)
|
|
52 @sp 2
|
|
53 @center Rod Whitby
|
|
54 @center @code{rwhitby@@asc.corp.mot.com}
|
|
55
|
|
56
|
|
57 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
58 @comment The following two commands start the copyright page
|
|
59 @comment for the printed manual. This will not appear in the Info file.
|
|
60 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
61
|
|
62 @page
|
|
63 @vskip 0pt plus 1filll
|
|
64 Copyright @copyright{} 1995 Rodney J. Whitby
|
|
65 @end titlepage
|
|
66
|
|
67
|
|
68 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
69 @comment The Top node contains the master menu for the Info file.
|
|
70 @comment This appears only in the Info file, not the printed manual.
|
|
71 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
72
|
|
73 @node Top, Introduction, (dir), (dir)
|
|
74 @comment node-name, next, previous, up
|
|
75
|
|
76
|
|
77 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
78 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
79
|
|
80 @menu
|
|
81 * Introduction::
|
|
82 * Getting Connected::
|
|
83 * New Indentation Engine::
|
|
84 * Customizing Indentation::
|
|
85 * Syntactic Symbols::
|
|
86 * Indentation Commands::
|
|
87 * Frequently Asked Questions::
|
|
88 * Getting the latest vhdl-mode release::
|
|
89 * Sample .emacs File::
|
|
90 * Requirements::
|
|
91 * Limitations and Known Bugs::
|
|
92 * Mailing Lists and Submitting Bug Reports::
|
|
93 * Concept Index::
|
|
94 * Command Index:: Command Index
|
|
95 * Key Index:: Key Index
|
|
96 * Variable Index:: Variable Index
|
|
97 @end menu
|
|
98
|
|
99 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
100 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
101
|
|
102 @node Introduction, Getting Connected, Top, Top
|
|
103 @comment node-name, next, previous, up
|
|
104 @chapter Introduction
|
|
105 @cindex Introduction
|
|
106
|
|
107 Welcome to @code{vhdl-mode}, version 2. This is a GNU Emacs mode for
|
|
108 editing files containing VHDL code.
|
|
109
|
|
110 This manual will describe the following:
|
|
111
|
|
112 @itemize @bullet
|
|
113 @item
|
|
114 How to get started using @code{vhdl-mode}.
|
|
115
|
|
116 @item
|
|
117 How the new indentation engine works.
|
|
118
|
|
119 @item
|
|
120 How to customize the new indentation engine.
|
|
121
|
|
122 @end itemize
|
|
123
|
|
124 @findex vhdl-version
|
|
125 The major version number was incremented to 2 with the addition of the
|
|
126 new indentation engine. To find the minor revision number of this
|
|
127 release, use @kbd{M-x vhdl-version RET}.
|
|
128
|
|
129 A special word of thanks goes to Barry Warsaw, who wrote the
|
|
130 @code{cc-mode} indentation engine that formed the basis of the
|
|
131 @code{vhdl-mode} indentation engine. This manual is also based upon the
|
|
132 manual for @code{cc-mode}.
|
|
133
|
|
134
|
|
135 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
136
|
|
137 @node Getting Connected, New Indentation Engine, Introduction, Top
|
|
138 @comment node-name, next, previous, up
|
|
139 @chapter Getting Connected
|
|
140 @cindex Getting Connected
|
|
141
|
|
142 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
143
|
|
144 @file{vhdl-mode.el} works well with the 3 main branches of Emacs 19:
|
|
145 XEmacs, Win-Emacs (which has the same heritage as XEmacs) and the Emacs
|
|
146 19 maintained by the FSF. FSF's Emacs 19 users will want to use Emacs
|
|
147 version 19.21 or better, Win-Emacs users will want 1.35 or better, and
|
|
148 XEmacs users will want 19.6 or better. Earlier versions of these
|
|
149 Emacsen have deficiencies and/or bugs which will adversely affect the
|
|
150 performance and usability of @code{vhdl-mode}.
|
|
151
|
|
152 @cindex .emacs file
|
|
153 The first thing you will want to do is put @file{vhdl-mode.el} somewhere
|
|
154 on your @code{load-path} so Emacs can find it. Do a @kbd{C-h v
|
|
155 load-path RET} to see all the directories Emacs looks at when loading a
|
|
156 file. If none of these directories are appropriate, create a new
|
|
157 directory and add it to your @code{load-path}:
|
|
158
|
|
159 @noindent
|
|
160 @emph{[in the shell]}
|
|
161 @example
|
|
162 @group
|
|
163
|
|
164 % cd
|
|
165 % mkdir mylisp
|
|
166 % mv vhdl-mode.el mylisp
|
|
167 % cd mylisp
|
|
168
|
|
169 @end group
|
|
170 @end example
|
|
171
|
|
172 @noindent
|
|
173 @emph{[in your .emacs file add]}
|
|
174 @example
|
|
175
|
|
176 (setq load-path (cons "~/mylisp" load-path))
|
|
177
|
|
178 @end example
|
|
179
|
|
180 @cindex byte compile
|
|
181 Next you want to @dfn{byte compile} @file{vhdl-mode.el}. The mode uses a
|
|
182 lot of macros so if you don't byte compile it, things will be unbearably
|
|
183 slow. @emph{You can ignore all byte-compiler warnings!} They are the
|
|
184 result of the supporting different versions of Emacs, and none of the
|
|
185 warnings have any effect on operation. Let me say this again:
|
|
186 @strong{You really can ignore all byte-compiler warnings!}
|
|
187
|
|
188 Here's what to do to byte-compile the file [in emacs]:
|
|
189 @example
|
|
190
|
|
191 M-x byte-compile-file RET ~/mylisp/vhdl-mode.el RET
|
|
192
|
|
193 @end example
|
|
194
|
|
195 Now add the following autoloads to your @file{.emacs} file so that
|
|
196 @code{vhdl-mode} gets loaded at the right time:
|
|
197 @example
|
|
198
|
|
199 (autoload 'vhdl-mode "vhdl-mode" "VHDL Editing Mode" t)
|
|
200
|
|
201 @end example
|
|
202
|
|
203 Alternatively, if you want to make sure @code{vhdl-mode} is loaded when
|
|
204 Emacs starts up, you could use this line instead of the autoload above:
|
|
205 @example
|
|
206
|
|
207 (require 'vhdl-mode)
|
|
208
|
|
209 @end example
|
|
210
|
|
211 Next, you will want to set up Emacs so that it edits VHDL files in
|
|
212 @code{vhdl-mode}. All users should add the following to their
|
|
213 @file{.emacs} file. Note that this assumes you'll be editing @code{.vhd}
|
|
214 and files as VHDL. YMMV:
|
|
215 @example
|
|
216 @group
|
|
217
|
|
218 (setq auto-mode-alist
|
|
219 (append
|
|
220 '(("\\.vhd$" . vhdl-mode)
|
|
221 ) auto-mode-alist))
|
|
222
|
|
223 @end group
|
|
224 @end example
|
|
225
|
|
226 That's all you need -- I know, I know, it sounds like a lot @code{:-)},
|
|
227 but after you've done all this, you should only need to quit and restart
|
|
228 Emacs. The next time you visit a VHDL file you should be using
|
|
229 @code{vhdl-mode}. You can check this easily by hitting @kbd{M-x
|
|
230 vhdl-version RET} in the @code{vhdl-mode} buffer. You should see this
|
|
231 message in the echo area:
|
|
232 @example
|
|
233
|
|
234 Using @code{vhdl-mode} version 2.@var{XXX}
|
|
235
|
|
236 @end example
|
|
237
|
|
238 @noindent
|
|
239 where @var{XXX} will be some minor revision number.
|
|
240
|
|
241 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
242
|
|
243 @node New Indentation Engine, Indentation Commands, Getting Connected, Top
|
|
244 @comment node-name, next, previous,up
|
|
245
|
|
246 @chapter New Indentation Engine
|
|
247 @cindex New Indentation Engine
|
|
248
|
|
249 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
250
|
|
251 @code{vhdl-mode} has a new indentation engine, providing a simplified, yet
|
|
252 flexible and general mechanism for customizing indentation. It breaks
|
|
253 indentation calculation into two steps. First for the line of code being
|
|
254 indented, @code{vhdl-mode} analyzes what kind of language construct it's
|
|
255 looking at, then it applies user defined offsets to the current line
|
|
256 based on this analysis.
|
|
257
|
|
258 This section will briefly cover how indentation is calculated in
|
|
259 @code{vhdl-mode}. It is important to understand the indentation model
|
|
260 being used so that you will know how to customize @code{vhdl-mode} for
|
|
261 your personal coding style.
|
|
262
|
|
263 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
264 @menu
|
|
265 * Syntactic Analysis:: Step 1 -- Syntactic Analysis
|
|
266 * Indentation Calculation:: Step 2 -- Indentation Calculation
|
|
267 @end menu
|
|
268 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
269
|
|
270 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
271 @node Syntactic Analysis, Indentation Calculation, , New Indentation Engine
|
|
272 @comment node-name, next, previous,up
|
|
273 @section Syntactic Analysis
|
|
274 @cindex Syntactic Analysis
|
|
275 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
276
|
|
277 @vindex vhdl-offsets-alist
|
|
278 @vindex offsets-alist (vhdl-)
|
|
279 @cindex relative buffer position
|
|
280 @cindex syntactic symbol
|
|
281 @cindex syntactic component
|
|
282 @cindex syntactic component list
|
|
283 @cindex relative buffer position
|
|
284 The first thing @code{vhdl-mode} does when indenting a line of code, is
|
|
285 to analyze the line, determining the @dfn{syntactic component list} of
|
|
286 the construct on that line. A @dfn{syntactic component} consists of a
|
|
287 pair of information (in lisp parlance, a @emph{cons cell}), where the
|
|
288 first part is a @dfn{syntactic symbol}, and the second part is a
|
|
289 @dfn{relative buffer position}. Syntactic symbols describe elements of
|
|
290 VHDL code, e.g. @code{statement}, @code{comment}, @code{block-open},
|
|
291 @code{block-close}, etc. @xref{Syntactic Symbols}, for a complete list
|
|
292 of currently recognized syntactic symbols and their semantics. Also,
|
|
293 the variable @code{vhdl-offsets-alist} contains the list of currently
|
|
294 supported syntactic symbols.
|
|
295
|
|
296 Conceptually, a line of VHDL code is always indented relative to the
|
|
297 indentation of some line higher up in the buffer. This is represented
|
|
298 by the relative buffer position in the syntactic component.
|
|
299
|
|
300 It might help to see an example. Suppose we had the following code as
|
|
301 the only thing in a @code{vhdl-mode} buffer @footnote{The line numbers
|
|
302 in this and future examples don't actually appear in the buffer.}:
|
|
303 @example
|
|
304 @group
|
|
305
|
|
306 1: inverter : process
|
|
307 2: begin
|
|
308 3: q <= not d;
|
|
309 4: wait on d;
|
|
310 5: end inverter;
|
|
311
|
|
312 @end group
|
|
313 @end example
|
|
314
|
|
315 @kindex C-c C-s
|
|
316 @findex vhdl-show-syntactic-information
|
|
317 @findex show-syntactic-information (vhdl-)
|
|
318 We can use the command @kbd{C-c C-s}
|
|
319 (@code{vhdl-show-syntactic-information}) to simply report what the
|
|
320 syntactic analysis is for the current line. Running this command on
|
|
321 line 4 of example 1, we'd see in the echo area:
|
|
322 @example
|
|
323
|
|
324 ((statement . 28))
|
|
325
|
|
326 @end example
|
|
327
|
|
328 This tells us that the line is a statement and it is indented relative
|
|
329 to buffer position 28, which happens to be the @samp{q} on line 3. If
|
|
330 you were to move point to line 3 and hit @kbd{C-c C-s}, you would see:
|
|
331 @example
|
|
332
|
|
333 ((statement-block-intro . 20))
|
|
334
|
|
335 @end example
|
|
336
|
|
337 This indicates that line 3 is the first statement in a block, and is
|
|
338 indented relative to buffer position 20, which is the @samp{b} in the
|
|
339 @code{begin} keyword on line 2.
|
|
340
|
|
341 @cindex comment only line
|
|
342 Syntactic component lists can contain more than one component, and
|
|
343 individual syntactic compenents need not have relative buffer positions.
|
|
344 The most common example of this is a line that contains a @dfn{comment
|
|
345 only line}.
|
|
346 @example
|
|
347 @group
|
|
348
|
|
349 %%% TBD %%%
|
|
350
|
|
351 @end group
|
|
352 @end example
|
|
353
|
|
354 @noindent
|
|
355 Hitting @kbd{C-c C-s} on line 3 of the example gives us:
|
|
356 @example
|
|
357
|
|
358 ((comment-intro) (block-intro . 46))
|
|
359
|
|
360 @end example
|
|
361
|
|
362 @noindent
|
|
363 so you can see that the syntactic component list contains two syntactic
|
|
364 components. Also notice that the first component,
|
|
365 @samp{(comment-intro)} has no relative buffer position.
|
|
366
|
|
367 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
368 @node Indentation Calculation, , Syntactic Analysis, New Indentation Engine
|
|
369 @comment node-name, next, previous,up
|
|
370 @section Indentation Calculation
|
|
371 @cindex Indentation Calculation
|
|
372 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
373
|
|
374 @vindex vhdl-offsets-alist
|
|
375 @vindex offsets-alist (vhdl-)
|
|
376 Indentation for the current line is calculated using the syntactic
|
|
377 component list derived in step 1 above (see @ref{Syntactic
|
|
378 Analysis}). Each component contributes to the final total indentation
|
|
379 of the line in two ways.
|
|
380
|
|
381 First, the syntactic symbols are looked up in the @code{vhdl-offsets-alist}
|
|
382 variable, which is an association list of syntactic symbols and the
|
|
383 offsets to apply for those symbols. These offsets are added to the
|
|
384 running total.
|
|
385
|
|
386 Second, if the component has a relative buffer position, @code{vhdl-mode}
|
|
387 adds the column number of that position to the running total. By adding
|
|
388 up the offsets and columns for every syntactic component on the list,
|
|
389 the final total indentation for the current line is computed.
|
|
390
|
|
391 Let's use our code example above to see how this works. Here is our
|
|
392 example again.
|
|
393 @example
|
|
394 @group
|
|
395
|
|
396 1: inverter : process
|
|
397 2: begin
|
|
398 3: q <= not d;
|
|
399 4: wait on d;
|
|
400 5: end inverter;
|
|
401
|
|
402 @end group
|
|
403 @end example
|
|
404
|
|
405 @kindex TAB
|
|
406 Let's say point is on line 3 and we hit the @key{TAB} key to re-indent
|
|
407 the line. Remember that the syntactic component list for that
|
|
408 line is:
|
|
409 @example
|
|
410
|
|
411 ((statement-block-intro . 20))
|
|
412
|
|
413 @end example
|
|
414
|
|
415 @noindent
|
|
416 @code{vhdl-mode} looks up @code{statement-block-intro} in the
|
|
417 @code{vhdl-offsets-alist} variable. Let's say it finds the value @samp{2};
|
|
418 it adds this to the running total (initialized to zero), yielding a
|
|
419 running total indentation of 2 spaces.
|
|
420
|
|
421 Next @code{vhdl-mode} goes to buffer position 20 and asks for the
|
|
422 current column. Since the @code{begin} keyword at buffer position 20 is
|
|
423 in column zero, it adds @samp{0} to the running total. Since there is
|
|
424 only one syntactic component on the list for this line, indentation
|
|
425 calculation is complete, and the total indentation for the line is 2
|
|
426 spaces.
|
|
427 Simple, huh?
|
|
428
|
|
429 Actually, the mode usually just does The Right Thing without you having
|
|
430 to think about it in this much detail. But when customizing
|
|
431 indentation, it's helpful to understand the general indentation model
|
|
432 being used.
|
|
433
|
|
434 @vindex vhdl-echo-syntactic-information-p
|
|
435 @vindex echo-syntactic-information-p (vhdl-)
|
|
436 @cindex TAB
|
|
437 To help you configure @code{vhdl-mode}, you can set the variable
|
|
438 @code{vhdl-echo-syntactic-information-p} to non-@code{nil} so that the
|
|
439 syntactic component list and calculated offset will always be echoed in
|
|
440 the minibuffer when you hit @kbd{TAB}.
|
|
441
|
|
442
|
|
443 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
444 @node Indentation Commands, Customizing Indentation, New Indentation Engine, Top
|
|
445 @comment node-name, next, previous,up
|
|
446
|
|
447 @chapter Indentation Commands
|
|
448 @cindex Indentation Commands
|
|
449 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
450
|
|
451 @strong{<TBD>}
|
|
452
|
|
453 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
454 @node Customizing Indentation, Syntactic Symbols, Indentation Commands, Top
|
|
455 @comment node-name, next, previous,up
|
|
456
|
|
457 @chapter Customizing Indentation
|
|
458 @cindex Customizing Indentation
|
|
459 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
460
|
|
461 @cindex vhdl-set-offset
|
|
462 @cindex set-offset (vhdl-)
|
|
463 The @code{vhdl-offsets-alist} variable is where you customize all your
|
|
464 indentations. You simply need to decide what additional offset you want
|
|
465 to add for every syntactic symbol. You can use the command @kbd{C-c
|
|
466 C-o} (@code{vhdl-set-offset}) as the way to set offsets, both
|
|
467 interactively and from your mode hook. Also, you can set up
|
|
468 @emph{styles} of indentation. Most likely, you'll find one of the
|
|
469 pre-defined styles will suit your needs, but if not, this section will
|
|
470 describe how to set up basic editing configurations. @xref{Styles} for
|
|
471 an explanation of how to set up named styles.
|
|
472
|
|
473 @cindex vhdl-basic-offset
|
|
474 @cindex basic-offset (vhdl-)
|
|
475 As mentioned previously, the variable @code{vhdl-offsets-alist} is an
|
|
476 association list between syntactic symbols and the offsets to be applied
|
|
477 for those symbols. In fact, these offset values can be an integer, a
|
|
478 function or variable name, or one of the following symbols: @code{+},
|
|
479 @code{-}, @code{++}, @code{--}, @code{*}, or @code{/}. The symbol
|
|
480 values have the following meanings:
|
|
481
|
|
482 @itemize @bullet
|
|
483
|
|
484 @item
|
|
485 @code{+} -- 1 x @code{vhdl-basic-offset}
|
|
486 @item
|
|
487 @code{-} -- -1 x @code{vhdl-basic-offset}
|
|
488 @item
|
|
489 @code{++} -- 2 x @code{vhdl-basic-offset}
|
|
490 @item
|
|
491 @code{--} -- -2 x @code{vhdl-basic-offset}
|
|
492 @item
|
|
493 @code{*} -- 0.5 x @code{vhdl-basic-offset}
|
|
494 @item
|
|
495 @code{/} -- -0.5 x @code{vhdl-basic-offset}
|
|
496
|
|
497 @end itemize
|
|
498
|
|
499 @noindent
|
|
500 So, for example, because most of the default offsets are defined in
|
|
501 terms of @code{+}, @code{-}, and @code{0}, if you like the general
|
|
502 indentation style, but you use 2 spaces instead of 4 spaces per level,
|
|
503 you can probably achieve your style just by changing
|
|
504 @code{vhdl-basic-offset} like so (in your @file{.emacs} file):
|
|
505 @example
|
|
506
|
|
507 (setq vhdl-basic-offset 2)
|
|
508
|
|
509 @end example
|
|
510
|
|
511 To change indentation styles more radically, you will want to change the
|
|
512 value associated with the syntactic symbols in the
|
|
513 @code{vhdl-offsets-alist} variable. First, I'll show you how to do that
|
|
514 interactively, then I'll describe how to make changes to your
|
|
515 @file{.emacs} file so that your changes are more permanent.
|
|
516
|
|
517 @menu
|
|
518 * Interactive Customization::
|
|
519 * Permanent Customization::
|
|
520 * Styles::
|
|
521 * Advanced Customizations::
|
|
522 @end menu
|
|
523
|
|
524 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
525 @node Interactive Customization, Permanent Customization, , Customizing Indentation
|
|
526 @comment node-name, next, previous,up
|
|
527
|
|
528 @section Interactive Customization
|
|
529 @cindex Interactive Customization
|
|
530 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
531
|
|
532 As an example of how to customize indentation, let's change the
|
|
533 style of the example above from:
|
|
534 @example
|
|
535 @group
|
|
536
|
|
537 1: inverter : process
|
|
538 2: begin
|
|
539 3: q <= not d;
|
|
540 4: wait on d;
|
|
541 5: end inverter;
|
|
542
|
|
543 @end group
|
|
544 @end example
|
|
545 @noindent
|
|
546 to:
|
|
547 @example
|
|
548 @group
|
|
549
|
|
550 1: inverter : process
|
|
551 2: begin
|
|
552 3: q <= not d;
|
|
553 4: wait on d;
|
|
554 5: end inverter;
|
|
555
|
|
556 @end group
|
|
557 @end example
|
|
558
|
|
559 In other words, we want to change the indentation of the statments
|
|
560 inside the inverter process. Notice that the construct we want to
|
|
561 change starts on line 3. To change the indentation of a line, we need
|
|
562 to see which syntactic component affect the offset calculations for that
|
|
563 line. Hitting @kbd{C-c C-s} on line 3 yields:
|
|
564 @example
|
|
565
|
|
566 ((statement-block-intro . 20))
|
|
567
|
|
568 @end example
|
|
569
|
|
570 @findex vhdl-set-offset
|
|
571 @findex set-offset (vhdl-)
|
|
572 @kindex C-c C-o
|
|
573 @noindent
|
|
574 So we know that to change the offset of the first signal assignment, we need to
|
|
575 change the indentation for the @code{statement-block-intro} syntactic
|
|
576 symbol. To do this interactively, just hit @kbd{C-c C-o}
|
|
577 (@code{vhdl-set-offset}). This prompts you for the syntactic symbol to
|
|
578 change, providing a reasonable default. In this case, the default is
|
|
579 @code{statement-block-intro}, which is just the syntactic symbol we want to
|
|
580 change!
|
|
581
|
|
582 After you hit return, @code{vhdl-mode} will then prompt you for the new
|
|
583 offset value, with the old value as the default. The default in this
|
|
584 case is @samp{+}, so hit backspace to delete the @samp{+}, then hit
|
|
585 @samp{++} and @kbd{RET}. This will associate an offset of twice the
|
|
586 basic indent with the syntactic symbol @code{statement-block-intro} in
|
|
587 the @code{vhdl-offsets-alist} variable.
|
|
588
|
|
589 @findex vhdl-indent-defun
|
|
590 @findex indent-defun (vhdl-)
|
|
591 @kindex C-c C-q
|
|
592 To check your changes quickly, just hit @kbd{C-c C-q}
|
|
593 (@code{vhdl-indent-defun}) to reindent the entire function. The example
|
|
594 should now look like:
|
|
595 @example
|
|
596 @group
|
|
597
|
|
598 1: inverter : process
|
|
599 2: begin
|
|
600 3: q <= not d;
|
|
601 4: wait on d;
|
|
602 5: end inverter;
|
|
603
|
|
604 @end group
|
|
605 @end example
|
|
606
|
|
607 Notice how just changing the offset on line 3 is all we needed to do.
|
|
608 Since the other affected lines are indented relative to line 3, they are
|
|
609 automatically indented the way you'd expect. For more complicated
|
|
610 examples, this may not always work. The general approach to take is to
|
|
611 always start adjusting offsets for lines higher up in the file, then
|
|
612 re-indent and see if any following lines need further adjustments.
|
|
613
|
|
614 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
615 @node Permanent Customization, Styles, Interactive Customization, Customizing Indentation
|
|
616 @comment node-name, next, previous,up
|
|
617
|
|
618 @section Permanent Indentation
|
|
619 @cindex Permanent Indentation
|
|
620 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
621
|
|
622 @vindex vhdl-mode-hook
|
|
623 @cindex hooks
|
|
624 To make this change permanent, you need to add some lisp code to your
|
|
625 @file{.emacs} file. @code{vhdl-mode} provides a @code{vhdl-mode-hook}
|
|
626 that you can use to customize your language editing styles. This hook
|
|
627 gets run as the last thing when you enter @code{vhdl-mode}.
|
|
628
|
|
629 Here's a simplified example of what you can add to your @file{.emacs}
|
|
630 file to make the changes described in the previous section
|
|
631 (@ref{Interactive Customization}) more permanent. See the Emacs
|
|
632 manuals for more information on customizing Emacs via hooks.
|
|
633 @xref{Sample .emacs File} for a more complete sample @file{.emacs} file.
|
|
634 @footnote{The use of @code{add-hook} in this example only works for
|
|
635 Emacs 19. Workarounds are available if you are using Emacs 18, but this
|
|
636 just points out another reason for you to upgrade to Emacs 19!
|
|
637 @code{:-)}}
|
|
638 @example
|
|
639 @group
|
|
640
|
|
641 (defun my-vhdl-mode-hook ()
|
|
642 ;; my customizations for all of vhdl-mode
|
|
643 (vhdl-set-offset 'statement-block-intro '++)
|
|
644 ;; other customizations can go here
|
|
645 )
|
|
646 (add-hook 'vhdl-mode-hook 'my-vhdl-mode-hook)
|
|
647
|
|
648 @end group
|
|
649 @end example
|
|
650
|
|
651 For complex customizations, you will probably want to set up a
|
|
652 @emph{style} that groups all your customizations under a single
|
|
653 name. @xref{Styles} for details.
|
|
654
|
|
655 The offset value can also be a function, and this is how power users
|
|
656 gain enormous flexibility in customizing indentation. @xref{Advanced
|
|
657 Customizations} for details.
|
|
658
|
|
659 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
660 @node Styles, Advanced Customizations, Permanent Customization, Customizing Indentation
|
|
661 @comment node-name, next, previous,up
|
|
662
|
|
663 @section Styles
|
|
664 @cindex Styles
|
|
665 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
666
|
|
667 Most people only need to edit code formatted in just a few well-defined
|
|
668 and consistent styles. For example, their organization might impose a
|
|
669 ``blessed'' style that all its programmers must conform to. Similarly,
|
|
670 people who work on GNU software will have to use the GNU coding style on
|
|
671 C code. Some shops are more lenient, allowing some variety of coding
|
|
672 styles, and as programmers come and go, there could be a number of
|
|
673 styles in use. For this reason, @code{vhdl-mode} makes it convenient for
|
|
674 you to set up logical groupings of customizations called @dfn{styles},
|
|
675 associate a single name for any particular style, and pretty easily
|
|
676 start editing new or existing code using these styles. This chapter
|
|
677 describes how to set up styles and how to edit your C code using styles.
|
|
678
|
|
679 @menu
|
|
680 * Built-in Styles::
|
|
681 * Adding Styles::
|
|
682 * File Styles::
|
|
683 @end menu
|
|
684
|
|
685
|
|
686 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
687 @node Built-in Styles, Adding Styles, , Styles
|
|
688 @comment node-name, next, previous,up
|
|
689
|
|
690 @subsection Built-in Styles
|
|
691 @cindex Built-in Styles
|
|
692 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
693
|
|
694 If you're lucky, one of @code{vhdl-mode}'s built-in styles might be just
|
|
695 what you're looking for. Some of the most common VHDL styles are
|
|
696 already built-in. These include:
|
|
697
|
|
698 @itemize @bullet
|
|
699 @item
|
|
700 @cindex IEEE style
|
|
701 @code{GNU} -- the coding style in the IEEE Language Reference Manual.
|
|
702
|
|
703 @end itemize
|
|
704
|
|
705 @findex vhdl-set-style
|
|
706 @findex set-style (vhdl-)
|
|
707 If you'd like to experiment with these built-in styles you can simply
|
|
708 type the following in a @code{vhdl-mode} buffer:
|
|
709 @example
|
|
710 @group
|
|
711
|
|
712 @kbd{M-x vhdl-set-style RET}.
|
|
713
|
|
714 @end group
|
|
715 @end example
|
|
716 @noindent
|
|
717 You will be prompted for one of the above styles (with completion).
|
|
718 Enter one of the styles and hit @kbd{RET}. Note however that setting a
|
|
719 style in this way does @emph{not} automatically re-indent your file.
|
|
720 For commands that you can use to view the effect of your changes, see
|
|
721 @ref{Indentation Commands}.
|
|
722
|
|
723 Once you find a built-in style you like, you can make the change
|
|
724 permanent by adding a call to your @file{.emacs} file. Let's say for
|
|
725 example that you want to use the @code{IEEE} style in all your
|
|
726 files. You would add this:
|
|
727 @example
|
|
728 @group
|
|
729
|
|
730 (defun my-vhdl-mode-hook ()
|
|
731 ;; use IEEE style for all VHDL code
|
|
732 (vhdl-set-style "IEEE")
|
|
733 ;; other customizations can go here
|
|
734 )
|
|
735 (add-hook 'vhdl-mode-hook 'my-vhdl-mode-hook)
|
|
736
|
|
737 @end group
|
|
738 @end example
|
|
739
|
|
740 @noindent
|
|
741 @xref{Permanent Customization}.
|
|
742
|
|
743 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
744 @node Adding Styles, File Styles, Built-in Styles, Styles
|
|
745 @comment node-name, next, previous,up
|
|
746
|
|
747 @subsection Adding Styles
|
|
748 @cindex Adding Styles
|
|
749 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
750
|
|
751 @vindex vhdl-style-alist
|
|
752 @vindex style-alist (vhdl-)
|
|
753 @findex vhdl-add-style
|
|
754 @findex add-style (vhdl-)
|
|
755 If none of the built-in styles is appropriate, you'll probably want to
|
|
756 add a new style definition. Styles are kept in the @code{vhdl-style-alist}
|
|
757 variable, but you probably won't want to modify this variable directly.
|
|
758 @code{vhdl-mode} provides a function, called @code{vhdl-add-style}, that you
|
|
759 can use to easily add new styles or update existing styles. This
|
|
760 function takes two arguments, a @var{stylename} string, and an
|
|
761 association list @var{description} of style customizations. If
|
|
762 @var{stylename} is not already in @code{vhdl-style-alist}, the new style is
|
|
763 added, otherwise the style already associated with @var{stylename} is
|
|
764 changed to the new @var{description}. This function also takes an
|
|
765 optional third argument, which if non-@code{nil}, automatically
|
|
766 institutes the new style in the current buffer.
|
|
767
|
|
768 The sample @file{.emacs} file provides a concrete example of how a new
|
|
769 style can be added and automatically set. @xref{Sample .emacs File}.
|
|
770
|
|
771 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
772 @node File Styles, , Adding Styles, Styles
|
|
773 @comment node-name, next, previous,up
|
|
774
|
|
775 @subsection File Styles
|
|
776 @cindex File Styles
|
|
777 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
778
|
|
779 @cindex local variables
|
|
780 The Emacs manual describes how you can customize certain variables on a
|
|
781 per-file basis by including a @dfn{Local Variable} block at the end of
|
|
782 the file. So far, you've only seen a functional interface to
|
|
783 @code{vhdl-mode}, which is highly inconvenient for use in a Local Variable
|
|
784 block. @code{vhdl-mode} provides two variables that make it easier for
|
|
785 you to customize your style on a per-file basis.
|
|
786
|
|
787 @vindex vhdl-file-style
|
|
788 @vindex file-style (vhdl-)
|
|
789 @vindex vhdl-file-offsets
|
|
790 @vindex file-offsets (vhdl-)
|
|
791
|
|
792 The variable @code{vhdl-file-style} can be set to a style name string as
|
|
793 described in @ref{Built-in Styles}. When the file is visited,
|
|
794 @code{vhdl-mode} will automatically set the file's style to this style
|
|
795 using @code{vhdl-set-style}.
|
|
796
|
|
797 @vindex vhdl-offsets-alist
|
|
798 @vindex offsets-alist (vhdl-)
|
|
799 @findex vhdl-set-offset
|
|
800 @findex set-offset (vhdl-)
|
|
801 Another variable, @code{vhdl-file-offsets}, takes an association list
|
|
802 similar to what is allowed in @code{vhdl-offsets-alist}. When the file is
|
|
803 visited, @code{vhdl-mode} will automatically institute these offets using
|
|
804 @code{vhdl-set-offset}. @xref{Customizing Indentation}.
|
|
805
|
|
806 Note that file style settings (i.e. @code{vhdl-file-style}) are applied
|
|
807 before file offset settings (i.e. @code{vhdl-file-offsets}).
|
|
808
|
|
809
|
|
810 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
811 @node Advanced Customizations, , Styles, Customizing Indentation
|
|
812 @comment node-name, next, previous,up
|
|
813
|
|
814 @section Advanced Customizations
|
|
815 @cindex Advanced Customizations
|
|
816 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
817
|
|
818 @vindex vhdl-style-alist
|
|
819 @vindex style-alist (vhdl-)
|
|
820 @vindex vhdl-basic-offset
|
|
821 @vindex basic-offset (vhdl-)
|
|
822 For most users, @code{vhdl-mode} will support their coding styles with
|
|
823 very little need for customizations. Usually, one of the standard
|
|
824 styles defined in @code{vhdl-style-alist} will do the trick. Sometimes,
|
|
825 one of the syntactic symbol offsets will need to be tweeked slightly, or
|
|
826 perhaps @code{vhdl-basic-offset} will need to be changed. However, some
|
|
827 styles require a more advanced ability for customization, and one of the
|
|
828 real strengths of @code{vhdl-mode} is that the syntactic analysis model
|
|
829 provides a very flexible framework for customizing indentation. This
|
|
830 allows you to perform special indentation calculations for situations
|
|
831 not handled by the mode directly.
|
|
832
|
|
833 @menu
|
|
834 * Custom Indentation Functions::
|
|
835 * Other Special Indentations::
|
|
836 @end menu
|
|
837
|
|
838 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
839 @node Custom Indentation Functions, Other Special Indentations, , Advanced Customizations
|
|
840 @comment node-name, next, previous,up
|
|
841
|
|
842 @subsection Custom Indentation Functions
|
|
843 @cindex Custom Indentation Functions
|
|
844 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
845
|
|
846 @cindex custom indentation functions
|
|
847 One of the most common ways to customize @code{vhdl-mode} is by writing
|
|
848 @dfn{custom indentation functions} and associating them with specific
|
|
849 syntactic symbols (see @ref{Syntactic Symbols}). @code{vhdl-mode} itself
|
|
850 uses custom indentation functions to provide more sophisticated
|
|
851 indentation, for example when lining up selected signal assignments:
|
|
852 @example
|
|
853 @group
|
|
854
|
|
855 %%% TBD %%%
|
|
856
|
|
857 @end group
|
|
858 @end example
|
|
859
|
|
860 In this example, the @code{statement-cont} syntactic symbol has an
|
|
861 offset of @code{+}, and @code{vhdl-basic-offset} is 2, so lines 4
|
|
862 through 6 are simply indented two spaces to the right of line 3. But
|
|
863 perhaps we'd like @code{vhdl-mode} to be a little more intelligent so
|
|
864 that it offsets the waveform descriptions relative to the signal
|
|
865 assignment operator in line 3. To do this, we have to write a custom
|
|
866 indentation function which finds the column of signal assignment
|
|
867 operator on the first line of the statement. Here is the lisp code
|
|
868 (from the @file{vhdl-mode.el} source file) that implements this:
|
|
869 @example
|
|
870 @group
|
|
871
|
|
872 (defun vhdl-lineup-statement-cont (langelem)
|
|
873 ;; line up statement-cont after the assignment operator
|
|
874 (save-excursion
|
|
875 (let* ((relpos (cdr langelem))
|
|
876 (assignp (save-excursion
|
|
877 (goto-char (vhdl-point 'boi))
|
|
878 (and (re-search-forward "\\(<\\|:\\)="
|
|
879 (vhdl-point 'eol) t)
|
|
880 (- (point) (vhdl-point 'boi)))))
|
|
881 (curcol (progn
|
|
882 (goto-char relpos)
|
|
883 (current-column)))
|
|
884 foundp)
|
|
885 (while (and (not foundp)
|
|
886 (< (point) (vhdl-point 'eol)))
|
|
887 (re-search-forward "\\(<\\|:\\)=\\|(" (vhdl-point 'eol) 'move)
|
|
888 (if (vhdl-in-literal (cdr langelem))
|
|
889 (forward-char)
|
|
890 (if (= (preceding-char) ?\()
|
|
891 ;; skip over any parenthesized expressions
|
|
892 (goto-char (min (vhdl-point 'eol)
|
|
893 (scan-lists (point) 1 1)))
|
|
894 ;; found an assignment operator (not at eol)
|
|
895 (setq foundp (not (looking-at "\\s-*$"))))))
|
|
896 (if (not foundp)
|
|
897 ;; there's no assignment operator on the line
|
|
898 vhdl-basic-offset
|
|
899 ;; calculate indentation column after assign and ws, unless
|
|
900 ;; our line contains an assignment operator
|
|
901 (if (not assignp)
|
|
902 (progn
|
|
903 (forward-char)
|
|
904 (skip-chars-forward " \t")
|
|
905 (setq assignp 0)))
|
|
906 (- (current-column) assignp curcol))
|
|
907 )))
|
|
908
|
|
909 @end group
|
|
910 @end example
|
|
911 @noindent
|
|
912 Custom indent functions take a single argument, which is a syntactic
|
|
913 component cons cell (see @ref{Syntactic Analysis}). The
|
|
914 function returns an integer offset value that will be added to the
|
|
915 running total indentation for the lne. Note that what actually gets
|
|
916 returned is the difference between the column that the signal assignment
|
|
917 operator is on, and the column of the buffer relative position passed in
|
|
918 the function's argument. Remember that @code{vhdl-mode} automatically
|
|
919 adds in the column of the component's relative buffer position and we
|
|
920 don't want that value added into the final total twice.
|
|
921
|
|
922 @cindex statement-cont syntactic symbol
|
|
923 @findex vhdl-lineup-statement-cont
|
|
924 @findex lineup-statement-cont (vhdl-)
|
|
925 Now, to associate the function @code{vhdl-lineup-statement-cont} with the
|
|
926 @code{statement-cont} syntactic symbol, we can add something like the
|
|
927 following to our @code{vhdl-mode-hook}:
|
|
928 @example
|
|
929
|
|
930 (vhdl-set-offset 'statement-cont 'vhdl-lineup-statement-cont)
|
|
931
|
|
932 @end example
|
|
933
|
|
934 @kindex C-c C-q
|
|
935 Now the function looks like this after re-indenting (using @kbd{C-c
|
|
936 C-q}):
|
|
937 @example
|
|
938 @group
|
|
939
|
|
940 %%% TBD %%%
|
|
941
|
|
942 @end group
|
|
943 @end example
|
|
944
|
|
945 @vindex vhdl-offsets-alist
|
|
946 @vindex offsets-alist (vhdl-)
|
|
947 Custom indentation functions can be as simple or as complex as you like,
|
|
948 and any syntactic symbol that appears in @code{vhdl-offsets-alist} can have
|
|
949 a custom indentation function associated with it. Note however that
|
|
950 using many custom indentation functions may have a performance impact on
|
|
951 @code{vhdl-mode}.
|
|
952
|
|
953 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
954 @node Other Special Indentations, , Custom Indentation Functions, Advanced Customizations
|
|
955 @comment node-name, next, previous,up
|
|
956
|
|
957 @subsection Other Special Indentations
|
|
958 @cindex Other Special Indentations
|
|
959 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
960
|
|
961 @vindex vhdl-special-indent-hook
|
|
962 @vindex special-indent-hook (vhdl-)
|
|
963 One other variable is available for you to customize @code{vhdl-mode}:
|
|
964 @code{vhdl-special-indent-hook}. This is a standard hook variable that
|
|
965 is called after every line is indented by @code{vhdl-mode}. You can use
|
|
966 it to do any special indentation or line adjustments your style
|
|
967 dictates, such as adding extra indentation to the port map clause in a
|
|
968 component instantiation, etc. Note however, that you should not change
|
|
969 @code{point} or @code{mark} inside your @code{vhdl-special-indent-hook}
|
|
970 functions.
|
|
971
|
|
972
|
|
973 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
974 @node Syntactic Symbols, Frequently Asked Questions, Customizing Indentation, Top
|
|
975 @comment node-name, next, previous,up
|
|
976
|
|
977 @chapter Syntactic Symbols
|
|
978 @cindex Syntactic Symbols
|
|
979 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
980
|
|
981 @vindex vhdl-offsets-alist
|
|
982 The complete list of recognized syntactic symbols is described in the
|
|
983 @code{vhdl-offsets-alist} variable. This chapter will provide some
|
|
984 examples to help clarify these symbols.
|
|
985
|
|
986 @cindex -open syntactic symbols
|
|
987 @cindex -close syntactic symbols
|
|
988 Most syntactic symbol names follow a general naming convention. When a
|
|
989 line begins with a @code{begin} or @code{end} keyword, the syntactic
|
|
990 symbol will contain the suffix @code{-open} or @code{-close}
|
|
991 respectively.
|
|
992
|
|
993 @cindex -intro syntactic symbols
|
|
994 @cindex -cont syntactic symbols
|
|
995 @cindex -block-intro syntactic symbols
|
|
996 Usually, a distinction is made between the first line that introduces a
|
|
997 construct and lines that continue a construct, and the syntactic symbols
|
|
998 that represent these lines will contain the suffix @code{-intro} or
|
|
999 @code{-cont} respectively. As a sub-classification of this scheme, a
|
|
1000 line which is the first of a particular block construct will contain the
|
|
1001 suffix @code{-block-intro}.
|
|
1002
|
|
1003 @strong{<TBD> include the name and a brief example of every syntactic
|
|
1004 symbol currently recognized}
|
|
1005
|
|
1006 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1007 @node Frequently Asked Questions, Getting the latest vhdl-mode release, Syntactic Symbols, Top
|
|
1008 @comment node-name, next, previous,up
|
|
1009
|
|
1010 @chapter Frequently Asked Questions
|
|
1011 @cindex Frequently Asked Questions
|
|
1012 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1013
|
|
1014 @kindex C-x h
|
|
1015 @kindex ESC C-\
|
|
1016 @kindex C-c C-q
|
|
1017 @kindex ESC C-q
|
|
1018 @kindex ESC C-u
|
|
1019 @kindex RET
|
|
1020 @kindex LFD
|
|
1021 @findex newline-and-indent
|
|
1022 @quotation
|
|
1023
|
|
1024 @strong{Q.} @emph{How do I re-indent the whole file?}
|
|
1025
|
|
1026 @strong{A.} Visit the file and hit @kbd{C-x h} to mark the whole
|
|
1027 buffer. Then hit @kbd{@key{ESC} C-\} to re-indent the entire region
|
|
1028 which you've just marked.
|
|
1029 @sp 2
|
|
1030
|
|
1031 @strong{Q.} @emph{How do I re-indent the entire function?}
|
|
1032
|
|
1033 @strong{A.} Hit @kbd{@key{ESC} C-h} to mark the entire function. Then
|
|
1034 hit @kbd{@key{ESC} C-\} to re-indent the entire region which you've just
|
|
1035 marked.
|
|
1036 @sp 2
|
|
1037
|
|
1038 @strong{Q.} @emph{How do I re-indent the current block?}
|
|
1039
|
|
1040 @strong{A.} First move to the brace which opens the block with
|
|
1041 @kbd{@key{ESC} C-u}, then re-indent that expression with
|
|
1042 @kbd{@key{ESC} C-q}.
|
|
1043 @sp 2
|
|
1044
|
|
1045 @strong{Q.} @emph{How do I re-indent the current statement?}
|
|
1046
|
|
1047 @strong{A.} First move to the beginning of the statement with
|
|
1048 @kbd{@key{ESC} a}, then re-indent that expression with @kbd{@key{ESC}
|
|
1049 C-q}.
|
|
1050 @sp 2
|
|
1051
|
|
1052 @strong{Q.} @emph{Why doesn't the @key{RET} key indent the line to
|
|
1053 where the new text should go after inserting the newline?}
|
|
1054
|
|
1055 @strong{A.} Emacs' convention is that @key{RET} just adds a newline,
|
|
1056 and that @key{LFD} adds a newline and indents it. You can make
|
|
1057 @key{RET} do this too by adding this to your
|
|
1058 @code{vhdl-mode-hook} (see the sample @file{.emacs} file
|
|
1059 @ref{Sample .emacs File}):
|
|
1060 @example
|
|
1061
|
|
1062 (define-key vhdl-mode-map "\C-m" 'newline-and-indent)
|
|
1063
|
|
1064 @end example
|
|
1065
|
|
1066 This is a very common question. @code{:-)} If you want this to be the
|
|
1067 default behavior, don't lobby me, lobby RMS!
|
|
1068 @sp 2
|
|
1069
|
|
1070 @strong{Q.} @emph{I put @code{(vhdl-set-offset 'statement-cont 0)}
|
|
1071 in my @file{.emacs} file but I get an error saying that
|
|
1072 @code{vhdl-set-offset}'s function definition is void.}
|
|
1073
|
|
1074 @strong{A.} This means that @code{vhdl-mode} wasn't loaded into your
|
|
1075 Emacs session by the time the @code{vhdl-set-offset} call was reached,
|
|
1076 mostly likely because @code{vhdl-mode} is being autoloaded. Instead
|
|
1077 of putting the @code{vhdl-set-offset} line in your top-level
|
|
1078 @file{.emacs} file, put it in your @code{vhdl-mode-hook}, or
|
|
1079 simply add the following to the top of your @file{.emacs} file:
|
|
1080 @example
|
|
1081
|
|
1082 (require 'vhdl-mode)
|
|
1083
|
|
1084 @end example
|
|
1085
|
|
1086 See the sample @file{.emacs} file @ref{Sample .emacs File} for
|
|
1087 details.
|
|
1088
|
|
1089 @end quotation
|
|
1090
|
|
1091
|
|
1092 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1093 @node Getting the latest vhdl-mode release, Sample .emacs File, Frequently Asked Questions, Top
|
|
1094 @comment node-name, next, previous,up
|
|
1095
|
|
1096 @chapter Getting the latest @code{vhdl-mode} release
|
|
1097 @cindex Getting the latest @code{vhdl-mode} release
|
|
1098 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1099
|
|
1100 The best way to be sure you always have the latest @code{vhdl-mode}
|
|
1101 release is to join the @code{vhdl-mode-announce} mailing list. If you
|
|
1102 are a brave soul, and wish to participate in beta testing of new
|
|
1103 releases of @code{vhdl-mode}, you may also join the
|
|
1104 @code{vhdl-mode-victims} mailing list. Send email to the author to join
|
|
1105 either of these lists.
|
|
1106
|
|
1107 The canonical anonymous FTP URL for @code{vhdl-mode} is
|
|
1108 @code{ftp://ftp.eda.com.au/pub/emacs/vhdl-mode.tar.gz}. Special thanks
|
|
1109 to Ken Wood <ken@@eda.com.au> for providing an FTP repository for
|
|
1110 @code{vhdl-mode}.
|
|
1111
|
|
1112 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1113 @node Sample .emacs File, Requirements, Getting the latest vhdl-mode release, Top
|
|
1114 @comment node-name, next, previous,up
|
|
1115
|
|
1116 @chapter Sample @file{.emacs} file
|
|
1117 @cindex Sample @file{.emacs} file
|
|
1118 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1119
|
|
1120 @example
|
|
1121 ;; Here's a sample .emacs file that might help you along the way. Just
|
|
1122 ;; copy this region and paste it into your .emacs file. You may want to
|
|
1123 ;; change some of the actual values.
|
|
1124
|
|
1125 (defconst my-vhdl-style
|
|
1126 '((vhdl-tab-always-indent . t)
|
|
1127 (vhdl-comment-only-line-offset . 4)
|
|
1128 (vhdl-offsets-alist . ((arglist-close . vhdl-lineup-arglist)
|
|
1129 (statement-cont . 0)
|
|
1130 (case-alternative . 4)
|
|
1131 (block-open . 0)))
|
|
1132 (vhdl-echo-syntactic-information-p . t)
|
|
1133 )
|
|
1134 "My VHDL Programming Style")
|
|
1135
|
|
1136 ;; Customizations for vhdl-mode
|
|
1137 (defun my-vhdl-mode-hook ()
|
|
1138 ;; add my personal style and set it for the current buffer
|
|
1139 (vhdl-add-style "PERSONAL" my-vhdl-style t)
|
|
1140 ;; offset customizations not in my-vhdl-style
|
|
1141 (vhdl-set-offset 'statement-case-intro '++)
|
|
1142 ;; other customizations
|
|
1143 (setq tab-width 8
|
|
1144 ;; this will make sure spaces are used instead of tabs
|
|
1145 indent-tabs-mode nil)
|
|
1146 ;; keybindings for VHDL are put in vhdl-mode-map
|
|
1147 (define-key vhdl-mode-map "\C-m" 'newline-and-indent)
|
|
1148 )
|
|
1149
|
|
1150 ;; the following only works in Emacs 19
|
|
1151 ;; Emacs 18ers can use (setq vhdl-mode-hook 'my-vhdl-mode-hook)
|
|
1152 (add-hook 'vhdl-mode-hook 'my-vhdl-mode-hook)
|
|
1153 @end example
|
|
1154
|
|
1155 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1156 @node Requirements, Limitations and Known Bugs, Sample .emacs File, Top
|
|
1157 @comment node-name, next, previous,up
|
|
1158 @chapter Requirements
|
|
1159 @cindex Requirements
|
|
1160 @comment * Requirements
|
|
1161 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1162
|
|
1163 @cindex reporter.el
|
|
1164 @file{vhdl-mode.el} requires @file{reporter.el} for submission of bug
|
|
1165 reports. @file{reporter.el} is distributed with the latest FSF and
|
|
1166 XEmacs 19's. Here is the Emacs Lisp Archive anonymous ftp'ing
|
|
1167 record for those of you who are using older Emacsen.
|
|
1168
|
|
1169 @comment * Here's the Emacs Lisp Archive information for @file{reporter.el}:
|
|
1170 @example
|
|
1171
|
|
1172 GNU Emacs Lisp Code Directory Apropos -- "reporter"
|
|
1173 "~/" refers to archive.cis.ohio-state.edu:/pub/gnu/emacs/elisp-archive/
|
|
1174
|
|
1175 reporter (2.12) 06-Jul-1994
|
|
1176 Barry A. Warsaw, <bwarsaw@@cen.com>
|
|
1177 ~/misc/reporter.el.Z
|
|
1178 Customizable bug reporting of lisp programs.
|
|
1179
|
|
1180 @end example
|
|
1181
|
|
1182 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1183 @node Limitations and Known Bugs, Mailing Lists and Submitting Bug Reports, Requirements, Top
|
|
1184 @comment node-name, next, previous,up
|
|
1185 @chapter Limitations and Known Bugs
|
|
1186 @cindex Limitations and Known Bugs
|
|
1187 @comment * Limitations and Known Bugs
|
|
1188 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1189
|
|
1190 @itemize @bullet
|
|
1191 @item
|
|
1192 Re-indenting large regions or expressions can be slow.
|
|
1193
|
|
1194 @item
|
|
1195 Use with Emacs 18 can be slow and annoying. You should seriously
|
|
1196 consider upgrading to Emacs 19.
|
|
1197
|
|
1198 @end itemize
|
|
1199
|
|
1200 @node Mailing Lists and Submitting Bug Reports, Concept Index, Limitations and Known Bugs, Top
|
|
1201 @comment node-name, next, previous,up
|
|
1202 @chapter Mailing Lists and Submitting Bug Reports
|
|
1203 @cindex Mailing Lists and Submitting Bug Reports
|
|
1204 @comment * Mailing Lists and Submitting Bug Reports
|
|
1205
|
|
1206 @kindex C-c C-b
|
|
1207 @findex vhdl-submit-bug-report
|
|
1208 @findex submit-bug-report (vhdl-)
|
|
1209 @cindex beta testers mailing list
|
|
1210 @cindex announcement mailing list
|
|
1211 To report bugs, use the @kbd{C-c C-b} (@code{vhdl-submit-bug-report})
|
|
1212 command. This provides vital information I need to reproduce your
|
|
1213 problem. Make sure you include a concise, but complete code example.
|
|
1214 Please try to boil your example down to just the essential code needed
|
|
1215 to reproduce the problem, and include an exact recipe of steps needed to
|
|
1216 expose the bug. Be especially sure to include any code that appears
|
|
1217 @emph{before} your bug example.
|
|
1218
|
|
1219 For other help or suggestions, send a message to
|
|
1220 @code{rwhitby@@asc.corp.mot.com}.
|
|
1221
|
|
1222 Send an add message to @code{rwhitby@@asc.corp.mot.com} to get on the
|
|
1223 @code{vhdl-mode-victims} beta testers list where beta releases of
|
|
1224 @code{vhdl-mode} are posted. Note that you shouldn't expect beta
|
|
1225 releases to be as stable as public releases.
|
|
1226
|
|
1227 There is also an announce only list where the latest public releases of
|
|
1228 @code{vhdl-mode} are posted. Send an add message to
|
|
1229 @code{rwhitby@@asc.corp.mot.com} to be added to this list.
|
|
1230
|
|
1231 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1232 @node Concept Index, Command Index, Mailing Lists and Submitting Bug Reports, Top
|
|
1233 @comment node-name, next, previous, up
|
|
1234 @unnumbered Concept Index
|
|
1235 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1236
|
|
1237 @printindex cp
|
|
1238
|
|
1239
|
|
1240 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1241 @node Command Index, Key Index, Concept Index, Top
|
|
1242 @comment node-name, next, previous, up
|
|
1243 @unnumbered Command Index
|
|
1244 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1245
|
|
1246 @ifinfo
|
|
1247
|
|
1248 @end ifinfo
|
|
1249 Since all @code{vhdl-mode} commands are prepended with the string
|
|
1250 @samp{vhdl-}, each appears under its @code{vhdl-<thing>} name and its
|
|
1251 @code{<thing> (vhdl-)} name.
|
|
1252 @iftex
|
|
1253 @sp 2
|
|
1254 @end iftex
|
|
1255 @printindex fn
|
|
1256
|
|
1257
|
|
1258 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1259 @node Key Index, Variable Index, Command Index, Top
|
|
1260 @comment node-name, next, previous, up
|
|
1261 @unnumbered Key Index
|
|
1262 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1263
|
|
1264 @printindex ky
|
|
1265
|
|
1266
|
|
1267 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1268 @node Variable Index, , Key Index, Top
|
|
1269 @comment node-name, next, previous, up
|
|
1270 @unnumbered Variable Index
|
|
1271 @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
1272
|
|
1273 @ifinfo
|
|
1274
|
|
1275 @end ifinfo
|
|
1276 Since all @code{vhdl-mode} variables are prepended with the string
|
|
1277 @samp{vhdl-}, each appears under its @code{vhdl-<thing>} name and its
|
|
1278 @code{<thing> (vhdl-)} name.
|
|
1279 @iftex
|
|
1280 @sp 2
|
|
1281 @end iftex
|
|
1282 @printindex vr
|
|
1283 @summarycontents
|
|
1284 @contents
|
|
1285 @bye
|