Mercurial > vim
comparison runtime/indent/verilog.vim @ 7:3fc0f57ecb91 v7.0001
updated for version 7.0001
author | vimboss |
---|---|
date | Sun, 13 Jun 2004 20:20:40 +0000 |
parents | |
children | 8b8ef1fed009 |
comparison
equal
deleted
inserted
replaced
6:c2daee826b8f | 7:3fc0f57ecb91 |
---|---|
1 " Language: Verilog HDL | |
2 " Maintainer: Chih-Tsun Huang <cthuang@larc.ee.nthu.edu.tw> | |
3 " Last Change: Wed Oct 31 16:13:11 CST 2001 | |
4 " URL: http://larc.ee.nthu.edu.tw/~cthuang/vim/indent/verilog.vim | |
5 " | |
6 " Credits: | |
7 " Suggestions for improvement, bug reports by | |
8 " Leo Butlero <lbutler@brocade.com> | |
9 " | |
10 " Buffer Variables: | |
11 " b:verilog_indent_modules : indenting after the declaration | |
12 " of module blocks | |
13 " b:verilog_indent_width : indenting width | |
14 " b:verilog_indent_verbose : verbose to each indenting | |
15 " | |
16 | |
17 " Only load this indent file when no other was loaded. | |
18 if exists("b:did_indent") | |
19 finish | |
20 endif | |
21 let b:did_indent = 1 | |
22 | |
23 setlocal indentexpr=GetVerilogIndent() | |
24 setlocal indentkeys=!^F,o,O,0),=begin,=end,=join,=endcase | |
25 setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify | |
26 setlocal indentkeys+==`else,=`endif | |
27 | |
28 " Only define the function once. | |
29 if exists("*GetVerilogIndent") | |
30 finish | |
31 endif | |
32 | |
33 set cpo-=C | |
34 | |
35 function GetVerilogIndent() | |
36 | |
37 if exists('b:verilog_indent_width') | |
38 let offset = b:verilog_indent_width | |
39 else | |
40 let offset = &sw | |
41 endif | |
42 if exists('b:verilog_indent_modules') | |
43 let indent_modules = offset | |
44 else | |
45 let indent_modules = 0 | |
46 endif | |
47 | |
48 " Find a non-blank line above the current line. | |
49 let lnum = prevnonblank(v:lnum - 1) | |
50 | |
51 " At the start of the file use zero indent. | |
52 if lnum == 0 | |
53 return 0 | |
54 endif | |
55 | |
56 let lnum2 = prevnonblank(lnum - 1) | |
57 let curr_line = getline(v:lnum) | |
58 let last_line = getline(lnum) | |
59 let last_line2 = getline(lnum2) | |
60 let ind = indent(lnum) | |
61 let ind2 = indent(lnum - 1) | |
62 let offset_comment1 = 1 | |
63 " Define the condition of an open statement | |
64 " Exclude the match of //, /* or */ | |
65 let vlog_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)' | |
66 " Define the condition when the statement ends with a one-line comment | |
67 let vlog_comment = '\(//.*\|/\*.*\*/\s*\)' | |
68 if exists('b:verilog_indent_verbose') | |
69 let vverb_str = 'INDENT VERBOSE:' | |
70 let vverb = 1 | |
71 else | |
72 let vverb = 0 | |
73 endif | |
74 | |
75 " Indent accoding to last line | |
76 " End of multiple-line comment | |
77 if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/' | |
78 let ind = ind - offset_comment1 | |
79 if vverb | |
80 echo vverb_str "De-indent after a multiple-line comment." | |
81 endif | |
82 | |
83 " Indent after if/else/for/case/always/initial/specify/fork blocks | |
84 elseif last_line =~ '`\@<!\<\(if\|else\)\>' || | |
85 \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\)\>' || | |
86 \ last_line =~ '^\s*\<\(always\|initial\)\>' || | |
87 \ last_line =~ '^\s*\<\(specify\|fork\)\>' | |
88 if last_line !~ '\(;\|\<end\>\)\s*' . vlog_comment . '*$' || | |
89 \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$' | |
90 let ind = ind + offset | |
91 if vverb | echo vverb_str "Indent after a block statement." | endif | |
92 endif | |
93 " Indent after function/task blocks | |
94 elseif last_line =~ '^\s*\<\(function\|task\)\>' | |
95 if last_line !~ '\<end\>\s*' . vlog_comment . '*$' || | |
96 \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$' | |
97 let ind = ind + offset | |
98 if vverb | |
99 echo vverb_str "Indent after function/task block statement." | |
100 endif | |
101 endif | |
102 | |
103 " Indent after module/function/task/specify/fork blocks | |
104 elseif last_line =~ '^\s*\<module\>' | |
105 let ind = ind + indent_modules | |
106 if vverb && indent_modules | |
107 echo vverb_str "Indent after module statement." | |
108 endif | |
109 if last_line =~ '[(,]\s*' . vlog_comment . '*$' && | |
110 \ last_line !~ '\(//\|/\*\).*[(,]\s*' . vlog_comment . '*$' | |
111 let ind = ind + offset | |
112 if vverb | |
113 echo vverb_str "Indent after a multiple-line module statement." | |
114 endif | |
115 endif | |
116 | |
117 " Indent after a 'begin' statement | |
118 elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . vlog_comment . '*$' && | |
119 \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' && | |
120 \ ( last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' || | |
121 \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . vlog_comment . '*$' ) | |
122 let ind = ind + offset | |
123 if vverb | echo vverb_str "Indent after begin statement." | endif | |
124 | |
125 " De-indent for the end of one-line block | |
126 elseif ( last_line !~ '\<begin\>' || | |
127 \ last_line =~ '\(//\|/\*\).*\<begin\>' ) && | |
128 \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>.*' . | |
129 \ vlog_comment . '*$' && | |
130 \ last_line2 !~ | |
131 \ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>' && | |
132 \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' && | |
133 \ ( last_line2 !~ '\<begin\>' || | |
134 \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) | |
135 let ind = ind - offset | |
136 if vverb | |
137 echo vverb_str "De-indent after the end of one-line statement." | |
138 endif | |
139 | |
140 " Multiple-line statement (including case statement) | |
141 " Open statement | |
142 " Ident the first open line | |
143 elseif last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' && | |
144 \ last_line !~ '\(//\|/\*\).*' . vlog_openstat . '\s*$' && | |
145 \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' | |
146 let ind = ind + offset | |
147 if vverb | echo vverb_str "Indent after an open statement." | endif | |
148 | |
149 " Close statement | |
150 " De-indent for an optional close parenthesis and a semicolon, and only | |
151 " if there exists precedent non-whitespace char | |
152 elseif last_line =~ ')*\s*;\s*' . vlog_comment . '*$' && | |
153 \ last_line !~ '^\s*)*\s*;\s*' . vlog_comment . '*$' && | |
154 \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . vlog_comment . '*$' && | |
155 \ ( last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' && | |
156 \ last_line2 !~ ';\s*//.*$') && | |
157 \ last_line2 !~ '^\s*' . vlog_comment . '$' | |
158 let ind = ind - offset | |
159 if vverb | echo vverb_str "De-indent after a close statement." | endif | |
160 | |
161 " `ifdef and `else | |
162 elseif last_line =~ '^\s*`\<\(ifdef\|else\)\>' | |
163 let ind = ind + offset | |
164 if vverb | |
165 echo vverb_str "Indent after a `ifdef or `else statement." | |
166 endif | |
167 | |
168 endif | |
169 | |
170 " Re-indent current line | |
171 | |
172 " De-indent on the end of the block | |
173 " join/end/endcase/endfunction/endtask/endspecify | |
174 if curr_line =~ '^\s*\<\(join\|end\|endcase\)\>' || | |
175 \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>' | |
176 let ind = ind - offset | |
177 if vverb | echo vverb_str "De-indent the end of a block." | endif | |
178 elseif curr_line =~ '^\s*\<endmodule\>' | |
179 let ind = ind - indent_modules | |
180 if vverb && indent_modules | |
181 echo vverb_str "De-indent the end of a module." | |
182 endif | |
183 | |
184 " De-indent on a stand-alone 'begin' | |
185 elseif curr_line =~ '^\s*\<begin\>' | |
186 if last_line !~ '^\s*\<\(function\|task\|specify\|module\)\>' && | |
187 \ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . vlog_comment . '*$' && | |
188 \ ( last_line =~ | |
189 \ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\)\>' || | |
190 \ last_line =~ ')\s*' . vlog_comment . '*$' || | |
191 \ last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' ) | |
192 let ind = ind - offset | |
193 if vverb | |
194 echo vverb_str "De-indent a stand alone begin statement." | |
195 endif | |
196 endif | |
197 | |
198 " De-indent after the end of multiple-line statement | |
199 elseif curr_line =~ '^\s*)' && | |
200 \ ( last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' || | |
201 \ last_line !~ vlog_openstat . '\s*' . vlog_comment . '*$' && | |
202 \ last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' ) | |
203 let ind = ind - offset | |
204 if vverb | |
205 echo vverb_str "De-indent the end of a multiple statement." | |
206 endif | |
207 | |
208 " De-indent `else and `endif | |
209 elseif curr_line =~ '^\s*`\<\(else\|endif\)\>' | |
210 let ind = ind - offset | |
211 if vverb | echo vverb_str "De-indent `else and `endif statement." | endif | |
212 | |
213 endif | |
214 | |
215 " Return the indention | |
216 return ind | |
217 endfunction | |
218 | |
219 " vim:sw=2 |