mirror of
https://github.com/neovim/neovim.git
synced 2026-01-02 17:36:56 +10:00
This reverts commits:
- 6b652a785033fd4164e049492a7327c1ed7c3e5f
- 2f689d5abde0ccddca9e20d8c93a0299bd054e32
- a025a46d4169587145fb54f04af349cd05cb6122
Several email addresses that are known to be valid caused bounces
due to an issue with my email setup. The previous commits incorrectly
marked these addresses as invalid. So revert the whole thing again.
62d8f3dab5
N/A patch:
vim-patch:2f689d5: runtime: mark more invalid email addresses
Co-authored-by: Christian Brabandt <cb@256bit.org>
233 lines
8.1 KiB
VimL
233 lines
8.1 KiB
VimL
" Language: Verilog HDL
|
|
" Maintainer: Chih-Tsun Huang <cthuang@cs.nthu.edu.tw>
|
|
" Last Change: 2017 Aug 25 by Chih-Tsun Huang
|
|
" 2023 Aug 28 by Vim Project (undo_indent)
|
|
" URL: http://www.cs.nthu.edu.tw/~cthuang/vim/indent/verilog.vim
|
|
"
|
|
" Credits:
|
|
" Suggestions for improvement, bug reports by
|
|
" Takuya Fujiwara <tyru.exe@gmail.com>
|
|
" Thilo Six <debian@Xk2c.de>
|
|
" Leo Butlero <lbutler@brocade.com>
|
|
"
|
|
" Buffer Variables:
|
|
" b:verilog_indent_modules : indenting after the declaration
|
|
" of module blocks
|
|
" b:verilog_indent_width : indenting width
|
|
" b:verilog_indent_verbose : verbose to each indenting
|
|
"
|
|
|
|
" Only load this indent file when no other was loaded.
|
|
if exists("b:did_indent")
|
|
finish
|
|
endif
|
|
let b:did_indent = 1
|
|
|
|
setlocal indentexpr=GetVerilogIndent()
|
|
setlocal indentkeys=!^F,o,O,0),=begin,=end,=join,=endcase
|
|
setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify
|
|
setlocal indentkeys+==endconfig,=endgenerate,=endprimitive,=endtable
|
|
setlocal indentkeys+==`else,=`elsif,=`endif
|
|
|
|
let b:undo_indent = "setlocal indentexpr< indentkeys<"
|
|
|
|
" Only define the function once.
|
|
if exists("*GetVerilogIndent")
|
|
finish
|
|
endif
|
|
|
|
let s:cpo_save = &cpo
|
|
set cpo&vim
|
|
|
|
function GetVerilogIndent()
|
|
|
|
if exists('b:verilog_indent_width')
|
|
let offset = b:verilog_indent_width
|
|
else
|
|
let offset = shiftwidth()
|
|
endif
|
|
if exists('b:verilog_indent_modules')
|
|
let indent_modules = offset
|
|
else
|
|
let indent_modules = 0
|
|
endif
|
|
|
|
" Find a non-blank line above the current line.
|
|
let lnum = prevnonblank(v:lnum - 1)
|
|
|
|
" At the start of the file use zero indent.
|
|
if lnum == 0
|
|
return 0
|
|
endif
|
|
|
|
let lnum2 = prevnonblank(lnum - 1)
|
|
let curr_line = getline(v:lnum)
|
|
let last_line = getline(lnum)
|
|
let last_line2 = getline(lnum2)
|
|
let ind = indent(lnum)
|
|
let ind2 = indent(lnum - 1)
|
|
let offset_comment1 = 1
|
|
" Define the condition of an open statement
|
|
" Exclude the match of //, /* or */
|
|
let vlog_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)'
|
|
" Define the condition when the statement ends with a one-line comment
|
|
let vlog_comment = '\(//.*\|/\*.*\*/\s*\)'
|
|
if exists('b:verilog_indent_verbose')
|
|
let vverb_str = 'INDENT VERBOSE:'
|
|
let vverb = 1
|
|
else
|
|
let vverb = 0
|
|
endif
|
|
|
|
" Indent according to last line
|
|
" End of multiple-line comment
|
|
if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/'
|
|
let ind = ind - offset_comment1
|
|
if vverb
|
|
echo vverb_str "De-indent after a multiple-line comment."
|
|
endif
|
|
|
|
" Indent after if/else/for/case/always/initial/specify/fork blocks
|
|
" Note: We exclude '`if' or '`else' and consider 'end else'
|
|
" 'end if' is redundant here
|
|
elseif last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' ||
|
|
\ last_line =~ '^\s*\<\(for\|case\%[[zx]]\)\>' ||
|
|
\ last_line =~ '^\s*\<\(always\|initial\)\>' ||
|
|
\ last_line =~ '^\s*\<\(specify\|fork\)\>'
|
|
if last_line !~ '\(;\|\<end\>\)\s*' . vlog_comment . '*$' ||
|
|
\ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'
|
|
let ind = ind + offset
|
|
if vverb | echo vverb_str "Indent after a block statement." | endif
|
|
endif
|
|
" Indent after function/task/config/generate/primitive/table blocks
|
|
elseif last_line =~ '^\s*\<\(function\|task\|config\|generate\|primitive\|table\)\>'
|
|
if last_line !~ '\<end\>\s*' . vlog_comment . '*$' ||
|
|
\ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'
|
|
let ind = ind + offset
|
|
if vverb
|
|
echo vverb_str "Indent after function/task block statement."
|
|
endif
|
|
endif
|
|
|
|
" Indent after module/function/task/specify/fork blocks
|
|
elseif last_line =~ '^\s*\<module\>'
|
|
let ind = ind + indent_modules
|
|
if vverb && indent_modules
|
|
echo vverb_str "Indent after module statement."
|
|
endif
|
|
if last_line =~ '[(,]\s*' . vlog_comment . '*$' &&
|
|
\ last_line !~ '\(//\|/\*\).*[(,]\s*' . vlog_comment . '*$'
|
|
let ind = ind + offset
|
|
if vverb
|
|
echo vverb_str "Indent after a multiple-line module statement."
|
|
endif
|
|
endif
|
|
|
|
" Indent after a 'begin' statement
|
|
elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . vlog_comment . '*$' &&
|
|
\ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' &&
|
|
\ ( last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' ||
|
|
\ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . vlog_comment . '*$' )
|
|
let ind = ind + offset
|
|
if vverb | echo vverb_str "Indent after begin statement." | endif
|
|
|
|
" De-indent for the end of one-line block
|
|
elseif ( last_line !~ '\<begin\>' ||
|
|
\ last_line =~ '\(//\|/\*\).*\<begin\>' ) &&
|
|
\ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>.*' .
|
|
\ vlog_comment . '*$' &&
|
|
\ last_line2 !~
|
|
\ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>' &&
|
|
\ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
|
|
\ ( last_line2 !~ '\<begin\>' ||
|
|
\ last_line2 =~ '\(//\|/\*\).*\<begin\>' )
|
|
let ind = ind - offset
|
|
if vverb
|
|
echo vverb_str "De-indent after the end of one-line statement."
|
|
endif
|
|
|
|
" Multiple-line statement (including case statement)
|
|
" Open statement
|
|
" Ident the first open line
|
|
elseif last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
|
|
\ last_line !~ '\(//\|/\*\).*' . vlog_openstat . '\s*$' &&
|
|
\ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$'
|
|
let ind = ind + offset
|
|
if vverb | echo vverb_str "Indent after an open statement." | endif
|
|
|
|
" Close statement
|
|
" De-indent for an optional close parenthesis and a semicolon, and only
|
|
" if there exists precedent non-whitespace char
|
|
elseif last_line =~ ')*\s*;\s*' . vlog_comment . '*$' &&
|
|
\ last_line !~ '^\s*)*\s*;\s*' . vlog_comment . '*$' &&
|
|
\ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . vlog_comment . '*$' &&
|
|
\ ( last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
|
|
\ last_line2 !~ ';\s*//.*$') &&
|
|
\ last_line2 !~ '^\s*' . vlog_comment . '$'
|
|
let ind = ind - offset
|
|
if vverb | echo vverb_str "De-indent after a close statement." | endif
|
|
|
|
" `ifdef or `ifndef or `elsif or `else
|
|
elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>'
|
|
let ind = ind + offset
|
|
if vverb
|
|
echo vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement."
|
|
endif
|
|
|
|
endif
|
|
|
|
" Re-indent current line
|
|
|
|
" De-indent on the end of the block
|
|
" join/end/endcase/endfunction/endtask/endspecify
|
|
if curr_line =~ '^\s*\<\(join\|end\|endcase\)\>' ||
|
|
\ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>' ||
|
|
\ curr_line =~ '^\s*\<\(endconfig\|endgenerate\|endprimitive\|endtable\)\>'
|
|
let ind = ind - offset
|
|
if vverb | echo vverb_str "De-indent the end of a block." | endif
|
|
elseif curr_line =~ '^\s*\<endmodule\>'
|
|
let ind = ind - indent_modules
|
|
if vverb && indent_modules
|
|
echo vverb_str "De-indent the end of a module."
|
|
endif
|
|
|
|
" De-indent on a stand-alone 'begin'
|
|
elseif curr_line =~ '^\s*\<begin\>'
|
|
if last_line !~ '^\s*\<\(function\|task\|specify\|module\|config\|generate\|primitive\|table\)\>' &&
|
|
\ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . vlog_comment . '*$' &&
|
|
\ ( last_line =~
|
|
\ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\)\>' ||
|
|
\ last_line =~ ')\s*' . vlog_comment . '*$' ||
|
|
\ last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' )
|
|
let ind = ind - offset
|
|
if vverb
|
|
echo vverb_str "De-indent a stand alone begin statement."
|
|
endif
|
|
endif
|
|
|
|
" De-indent after the end of multiple-line statement
|
|
elseif curr_line =~ '^\s*)' &&
|
|
\ ( last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' ||
|
|
\ last_line !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
|
|
\ last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' )
|
|
let ind = ind - offset
|
|
if vverb
|
|
echo vverb_str "De-indent the end of a multiple statement."
|
|
endif
|
|
|
|
" De-indent `elsif or `else or `endif
|
|
elseif curr_line =~ '^\s*`\<\(elsif\|else\|endif\)\>'
|
|
let ind = ind - offset
|
|
if vverb | echo vverb_str "De-indent `elsif or `else or `endif statement." | endif
|
|
|
|
endif
|
|
|
|
" Return the indentation
|
|
return ind
|
|
endfunction
|
|
|
|
let &cpo = s:cpo_save
|
|
unlet s:cpo_save
|
|
|
|
" vim:sw=2
|