Skip to content

Commit d0b1d71

Browse files
committed
Merge pull request #98 from vhda/generic/review_variables
Generic: Review use of variables in plugin
2 parents 4677b7a + 5a6a19e commit d0b1d71

7 files changed

+109
-128
lines changed

autoload/verilog_systemverilog.vim

+50-22
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ endfunction
441441
" Verbose messaging
442442
" Only displays messages if b:verilog_verbose or g:verilog_verbose is defined
443443
function verilog_systemverilog#Verbose(message)
444-
if exists("b:verilog_verbose") || exists("g:verilog_verbose")
444+
if verilog_systemverilog#VariableExists("verilog_verbose")
445445
echom a:message
446446
endif
447447
endfunction
@@ -450,22 +450,58 @@ endfunction
450450
" Pushes value to list only if new
451451
" Based on: http://vi.stackexchange.com/questions/6619/append-to-global-variable-and-completion
452452
function verilog_systemverilog#PushToVariable(variable, value)
453-
if exists(a:variable) && len(split(a:variable, ',')) > 0
454-
exec 'let ' . a:variable . ' .= ",' . a:value . '"'
455-
else
456-
exec 'let ' . a:variable . ' = "' . a:value . '"'
453+
let list = verilog_systemverilog#VariableGetValue(a:variable)
454+
if (count(list, a:value) == 0)
455+
call add(list, a:value)
457456
endif
457+
call verilog_systemverilog#VariableSetValue(a:variable, list)
458458
endfunction
459459

460460
function verilog_systemverilog#PopFromVariable(variable, value)
461-
if exists(a:variable)
462-
exec 'let list = split(' . a:variable . ', ",")'
463-
if len(list) > 0
464-
exec 'let ' . a:variable . ' = "' . join(filter(list, 'v:val !=# a:value'), ',') . '"'
465-
else
466-
exec 'let ' . a:variable . ' = "' . a:value . '"'
467-
endif
461+
let list = verilog_systemverilog#VariableGetValue(a:variable)
462+
call verilog_systemverilog#VariableSetValue(a:variable, filter(list, "v:val !=# a:value"))
463+
endfunction
464+
465+
" Get variable value
466+
" Searches for both b:variable and g:variable, with this priority.
467+
" If the variable name includes '_lst' it is automatically split into a
468+
" list.
469+
function verilog_systemverilog#VariableGetValue(variable)
470+
if exists('b:' . a:variable)
471+
let value = eval('b:' . a:variable)
472+
elseif exists('g:' . a:variable)
473+
let value = eval('g:' . a:variable)
474+
else
475+
let value = ''
476+
endif
477+
if a:variable =~ '_lst'
478+
return split(value, ',')
479+
else
480+
return value
481+
endif
482+
endfunction
483+
484+
" Set variable value
485+
" Searches for both b:variable and g:variable, with this priority.
486+
" If none exists, g: will be used
487+
" If the variable name includes '_lst' the value argument is assumed to
488+
" be a list.
489+
function verilog_systemverilog#VariableSetValue(variable, value)
490+
if a:variable =~ '_lst'
491+
let value = join(a:value, ',')
492+
else
493+
let value = a:value
468494
endif
495+
if exists('b:' . a:variable)
496+
exec 'let b:' . a:variable . ' = value'
497+
else
498+
exec 'let g:' . a:variable . ' = value'
499+
endif
500+
endfunction
501+
502+
" Checks for variable existence
503+
function verilog_systemverilog#VariableExists(variable)
504+
return exists('b:' . a:variable) || exists('g:' . a:variable)
469505
endfunction
470506
" }}}
471507

@@ -475,17 +511,9 @@ endfunction
475511
function verilog_systemverilog#CompleteCommand(lead, command, cursor)
476512
" Get list with current values in variable
477513
if (a:command =~ 'Folding')
478-
if exists('g:verilog_syntax_fold')
479-
let current_values = split(g:verilog_syntax_fold, ',')
480-
else
481-
let current_values = []
482-
endif
514+
let current_values = verilog_systemverilog#VariableGetValue("verilog_syntax_fold_lst")
483515
elseif (a:command =~ 'Indent')
484-
if exists('g:verilog_disable_indent')
485-
let current_values = split(g:verilog_disable_indent, ',')
486-
else
487-
let current_values = []
488-
endif
516+
let current_values = verilog_systemverilog#VariableGetValue("verilog_disable_indent_lst")
489517
endif
490518

491519
" Create list with valid completion values depending on command type

doc/tags

+7-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
:VerilogFollowInstance verilog_systemverilog.txt /*:VerilogFollowInstance*
77
:VerilogFollowPort verilog_systemverilog.txt /*:VerilogFollowPort*
88
:VerilogGotoInstanceStart verilog_systemverilog.txt /*:VerilogGotoInstanceStart*
9+
b:verilog_disable_indent_lst verilog_systemverilog.txt /*b:verilog_disable_indent_lst*
910
b:verilog_dont_deindent_eos verilog_systemverilog.txt /*b:verilog_dont_deindent_eos*
1011
b:verilog_indent_assign_fix verilog_systemverilog.txt /*b:verilog_indent_assign_fix*
11-
b:verilog_indent_modules verilog_systemverilog.txt /*b:verilog_indent_modules*
12-
b:verilog_indent_preproc verilog_systemverilog.txt /*b:verilog_indent_preproc*
1312
b:verilog_indent_width verilog_systemverilog.txt /*b:verilog_indent_width*
13+
b:verilog_syntax_fold_lst verilog_systemverilog.txt /*b:verilog_syntax_fold_lst*
1414
b:verilog_verbose verilog_systemverilog.txt /*b:verilog_verbose*
15-
g:verilog_disable_indent verilog_systemverilog.txt /*g:verilog_disable_indent*
16-
g:verilog_syntax_fold verilog_systemverilog.txt /*g:verilog_syntax_fold*
15+
g:verilog_disable_indent_lst verilog_systemverilog.txt /*g:verilog_disable_indent_lst*
16+
g:verilog_dont_deindent_eos verilog_systemverilog.txt /*g:verilog_dont_deindent_eos*
17+
g:verilog_indent_assign_fix verilog_systemverilog.txt /*g:verilog_indent_assign_fix*
18+
g:verilog_indent_width verilog_systemverilog.txt /*g:verilog_indent_width*
19+
g:verilog_syntax_fold_lst verilog_systemverilog.txt /*g:verilog_syntax_fold_lst*
1720
g:verilog_verbose verilog_systemverilog.txt /*g:verilog_verbose*
1821
verilog-about verilog_systemverilog.txt /*verilog-about*
1922
verilog-commands verilog_systemverilog.txt /*verilog-commands*

doc/verilog_systemverilog.txt

+37-59
Original file line numberDiff line numberDiff line change
@@ -303,8 +303,9 @@ following mappings are added to your |vimrc|.
303303
------------------------------------------------------------------------------
304304
INDENT CONFIGURATION *verilog-config-indent*
305305

306-
*b:verilog_indent_width*
306+
*b:verilog_indent_width* *g:verilog_indent_width*
307307
b:verilog_indent_width~
308+
g:verilog_indent_width~
308309
Default: undefined
309310

310311
Override normal |'shiftwidth'|.
@@ -314,47 +315,9 @@ Example:
314315
let b:verilog_indent_width = 8
315316
<
316317

317-
*b:verilog_indent_modules*
318-
b:verilog_indent_modules~
319-
Default: undefined
320-
321-
Increment indentation level after module port list. By default no
322-
indentation exists and code is aligned with the {module} declaration at
323-
column 0.
324-
325-
Example:
326-
>
327-
let b:verilog_indent_modules = 1
328-
<
329-
330-
*b:verilog_indent_preproc*
331-
b:verilog_indent_preproc~
332-
Default: undefined
333-
334-
Increment indentation level after preprocessor conditional ifdef/ifndef.
335-
If disabled (default), code following these statements has the same
336-
indentation level.
337-
By default:
338-
>
339-
`ifdef DEFINITION
340-
assign a = b;
341-
`endif
342-
<
343-
When enbled:
344-
>
345-
`ifdef DEFINITION
346-
assign a = b;
347-
`endif
348-
<
349-
350-
Example:
351-
352-
>
353-
let b:verilog_indent_preproc = 1
354-
<
355-
356-
*b:verilog_dont_deindent_eos*
318+
*b:verilog_dont_deindent_eos* *g:verilog_dont_deindent_eos*
357319
b:verilog_dont_deindent_eos~
320+
g:verilog_dont_deindent_eos~
358321
Default: undefined
359322

360323
Disable de-indentation of the close parentheses of modules, functions,
@@ -379,8 +342,9 @@ Example:
379342
let b:verilog_dont_deindent_eos = 1
380343
<
381344

382-
*b:verilog_indent_assign_fix*
345+
*b:verilog_indent_assign_fix* *g:verilog_indent_assign_fix*
383346
b:verilog_indent_assign_fix~
347+
g:verilog_indent_assign_fix~
384348
Default: undefined
385349

386350
Always indent lines following an assignment by a fixed amount.
@@ -406,8 +370,9 @@ Example:
406370
let b:verilog_indent_assign_fix = 1
407371
<
408372

409-
*g:verilog_disable_indent*
410-
g:verilog_disable_indent~
373+
*b:verilog_disable_indent_lst* *g:verilog_disable_indent_lst*
374+
b:verilog_disable_indent_lst~
375+
g:verilog_disable_indent_lst~
411376
Default: undefined
412377

413378
Disables indent for specific Verilog/SystemVerilog contexts.
@@ -446,8 +411,9 @@ Example:
446411
------------------------------------------------------------------------------
447412
SYNTAX CONFIGURATION *verilog-config-syntax*
448413

449-
*g:verilog_syntax_fold*
450-
g:verilog_syntax_fold~
414+
*b:verilog_syntax_fold_lst* *g:verilog_syntax_fold_lst*
415+
b:verilog_syntax_fold_lst~
416+
g:verilog_syntax_fold_lst~
451417
Default: undefined
452418

453419
Enables syntax folding according to the configured values.
@@ -501,22 +467,34 @@ Example:
501467
6. Frequently Asked Questions *verilog-faq*
502468

503469
------------------------------------------------------------------------------
504-
How to enable/disable indenting in modules?
505-
506-
There are two config variables for this. |b:verilog_indent_modules| (which
507-
will be eventually deprecated) and the newer |g:verilog_disable_indent|.
508-
Because of the existence of |b:verilog_indent_modules|, indenting in modules
509-
is disabled by default. As well as this, because |b:verilog_indent_modules| is
510-
a buffer variable, to ensure indenting in modules is always enabled you must
511-
add the following to your |.vimrc|:
470+
How to configure certain features only on some files?
471+
472+
Many configurations support both buffer local and global variables, allowing
473+
using default configurations together with local expections. This provides the
474+
simplicity of using global variables that do not require |:autocmd| for users
475+
that do not require exceptions, together with the versatily of buffer local
476+
variables for those that need it.
477+
478+
The following example allows using different settings for Verilog and
479+
SystemVerilog files:
480+
512481
>
513-
augroup systemverilog_settings_1
514-
au!
515-
au Filetype verilog_systemverilog let b:verilog_indent_modules = 1
482+
let g:verilog_dont_deindent_eos=1
483+
augroup verilog_dont_deindent_eos
484+
autocmd!
485+
autocmd BufNewFile,BufRead *.sv let b:verilog_dont_deindent_eos=0
486+
augroup END
487+
<
488+
Another example that uses a different configuration for files inside a
489+
specific folder:
490+
>
491+
let g:verilog_dont_deindent_eos=1
492+
augroup verilog_dont_deindent_eos
493+
autocmd!
494+
autocmd BufNewFile,BufRead */test/*.sv let b:verilog_dont_deindent_eos=0
516495
augroup END
517496
<
518-
The same also applies for |b:verilog_indent_preproc| (indentation of
519-
preprocessor statements).
497+
For more information regarding supported patterns check |autocmd-patterns|.
520498

521499
------------------------------------------------------------------------------
522500
Why is opening verilog/systemverilog files so slow?

indent/verilog_systemverilog.vim

+5-27
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,6 @@
77
" Inspired from script originally created by
88
" Chih-Tsun Huang <[email protected]>
99
"
10-
" Buffer Variables:
11-
" b:verilog_indent_width : Indenting width.
12-
" b:verilog_indent_modules : Indentation within module blocks.
13-
" b:verilog_indent_preproc : Indent preprocessor statements.
14-
" b:verilog_dont_deindent_eos : Don't de-indent the ); line in port lists
15-
" and instances.
16-
" b:verilog_indent_assign_fix : Indent assignments by fixed amount.
1710

1811
" Only load this indent file when no other was loaded.
1912
if exists("b:did_indent")
@@ -70,24 +63,10 @@ set cpo-=C
7063

7164
function! GetVerilogSystemVerilogIndent()
7265

73-
if exists("g:verilog_disable_indent")
74-
let s:verilog_disable_indent = split(g:verilog_disable_indent, ",")
75-
else
76-
let s:verilog_disable_indent = []
77-
endif
78-
79-
if !exists('b:verilog_indent_modules') &&
80-
\ index(s:verilog_disable_indent, 'module') < 0
81-
let s:verilog_disable_indent += ['module']
82-
endif
83-
84-
if !exists('b:verilog_indent_preproc') &&
85-
\ index(s:verilog_disable_indent, 'preproc') < 0
86-
let s:verilog_disable_indent += ['preproc']
87-
endif
66+
let s:verilog_disable_indent = verilog_systemverilog#VariableGetValue('verilog_disable_indent_lst')
8867

89-
if exists('b:verilog_indent_width')
90-
let s:offset = b:verilog_indent_width
68+
if verilog_systemverilog#VariableExists('verilog_indent_width')
69+
let s:offset = verilog_systemverilog#VariableGetValue('verilog_indent_width')
9170
else
9271
let s:offset = &sw
9372
endif
@@ -102,8 +81,7 @@ function! GetVerilogSystemVerilogIndent()
10281
if s:curr_line =~ '^\s*)'
10382
let l:extra_offset = 0
10483
if s:curr_line =~ '^\s*);\s*$' &&
105-
\ (exists('b:verilog_dont_deindent_eos') ||
106-
\ exists('g:verilog_dont_deindent_eos'))
84+
\ verilog_systemverilog#VariableExists('verilog_dont_deindent_eos')
10785
let l:extra_offset = s:offset
10886
endif
10987
call verilog_systemverilog#Verbose("Indenting )")
@@ -261,7 +239,7 @@ function! s:GetContextIndent()
261239
\ s:curr_line !~ s:vlog_comment && !s:IsComment(v:lnum)
262240
let l:open_offset = s:offset
263241
call verilog_systemverilog#Verbose("Increasing indent for an open statement.")
264-
if (!exists("b:verilog_indent_assign_fix"))
242+
if (!verilog_systemverilog#VariableExists("verilog_indent_assign_fix"))
265243
let l:look_for_open_assign = 1
266244
endif
267245
endif

plugin/verilog_systemverilog.vim

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ command! VerilogFollowPort call verilog_systemverilog#FollowInstanceSea
77
command! VerilogGotoInstanceStart call verilog_systemverilog#GotoInstanceStart(line('.'), col('.'))
88
command! -nargs=+ -complete=customlist,verilog_systemverilog#CompleteCommand
99
\ VerilogFoldingAdd
10-
\ call verilog_systemverilog#PushToVariable('g:verilog_syntax_fold', '<args>')
10+
\ call verilog_systemverilog#PushToVariable('verilog_syntax_fold_lst', '<args>')
1111
command! -nargs=+ -complete=customlist,verilog_systemverilog#CompleteCommand
1212
\ VerilogFoldingRemove
13-
\ call verilog_systemverilog#PopFromVariable('g:verilog_syntax_fold', '<args>')
13+
\ call verilog_systemverilog#PopFromVariable('verilog_syntax_fold_lst', '<args>')
1414
command! -nargs=+ -complete=customlist,verilog_systemverilog#CompleteCommand
1515
\ VerilogDisableIndentAdd
16-
\ call verilog_systemverilog#PushToVariable('g:verilog_disable_indent', '<args>')
16+
\ call verilog_systemverilog#PushToVariable('verilog_disable_indent_lst', '<args>')
1717
command! -nargs=+ -complete=customlist,verilog_systemverilog#CompleteCommand
1818
\ VerilogDisableIndentRemove
19-
\ call verilog_systemverilog#PopFromVariable('g:verilog_disable_indent', '<args>')
19+
\ call verilog_systemverilog#PopFromVariable('verilog_disable_indent_lst', '<args>')
2020

2121
" Configure tagbar
2222
" This requires a recent version of universal-ctags

syntax/verilog_systemverilog.vim

+2-6
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,8 @@ endif
131131
syn keyword verilogObject super
132132
syn match verilogObject "\<\w\+\ze\(::\|\.\)" contains=verilogNumber
133133

134-
" Only enable folding if g:verilog_syntax_fold is defined
135-
if exists("g:verilog_syntax_fold")
136-
let s:verilog_syntax_fold=split(g:verilog_syntax_fold, ",")
137-
else
138-
let s:verilog_syntax_fold=[]
139-
endif
134+
" Only enable folding if verilog_syntax_fold_lst is defined
135+
let s:verilog_syntax_fold=verilog_systemverilog#VariableGetValue("verilog_syntax_fold_lst")
140136

141137
if index(s:verilog_syntax_fold, "task") >= 0 || index(s:verilog_syntax_fold, "all") >= 0
142138
syn region verilogFold

0 commit comments

Comments
 (0)