diff options
-rw-r--r-- | runtime/autoload/dist/ft.vim | 11 | ||||
-rw-r--r-- | runtime/autoload/python.vim | 71 | ||||
-rw-r--r-- | runtime/doc/help.txt | 1 | ||||
-rw-r--r-- | runtime/doc/options.txt | 7 | ||||
-rw-r--r-- | runtime/doc/usr_41.txt | 6 | ||||
-rw-r--r-- | runtime/ftplugin/abaqus.vim | 48 | ||||
-rw-r--r-- | runtime/ftplugin/php.vim | 151 | ||||
-rw-r--r-- | runtime/ftplugin/vim.vim | 4 | ||||
-rw-r--r-- | runtime/indent/lisp.vim | 4 | ||||
-rw-r--r-- | runtime/indent/systemverilog.vim | 176 | ||||
-rw-r--r-- | runtime/indent/testdir/python.in | 68 | ||||
-rw-r--r-- | runtime/indent/testdir/python.ok | 68 | ||||
-rw-r--r-- | runtime/lua/vim/filetype/detect.lua | 15 | ||||
-rw-r--r-- | runtime/pack/dist/opt/matchit/doc/matchit.txt | 3 | ||||
-rw-r--r-- | runtime/syntax/abaqus.vim | 7 |
15 files changed, 457 insertions, 183 deletions
diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index a2f485dd67..77140d62b1 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -348,7 +348,7 @@ func dist#ft#FTidl() setf idl endfunc -" Distinguish between "default" and Cproto prototype file. */ +" Distinguish between "default", Prolog and Cproto prototype file. */ func dist#ft#ProtoCheck(default) " Cproto files have a comment in the first line and a function prototype in " the second line, it always ends in ";". Indent files may also have @@ -358,7 +358,14 @@ func dist#ft#ProtoCheck(default) if getline(2) =~ '.;$' setf cpp else - exe 'setf ' . a:default + " recognize Prolog by specific text in the first non-empty line + " require a blank after the '%' because Perl uses "%list" and "%translate" + let l = getline(nextnonblank(1)) + if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-' + setf prolog + else + exe 'setf ' .. a:default + endif endif endfunc diff --git a/runtime/autoload/python.vim b/runtime/autoload/python.vim index 7e7bca6fb6..4b220708cf 100644 --- a/runtime/autoload/python.vim +++ b/runtime/autoload/python.vim @@ -3,13 +3,28 @@ let s:keepcpo= &cpo set cpo&vim +" searchpair() can be slow, limit the time to 150 msec or what is put in +" g:pyindent_searchpair_timeout +let s:searchpair_timeout = get(g:, 'pyindent_searchpair_timeout', 150) + +" Identing inside parentheses can be very slow, regardless of the searchpair() +" timeout, so let the user disable this feature if he doesn't need it +let s:disable_parentheses_indenting = get(g:, 'pyindent_disable_parentheses_indenting', v:false) + +let s:maxoff = 50 " maximum number of lines to look backwards for () + +function s:SearchBracket(fromlnum, flags) + return searchpairpos('[[({]', '', '[])}]', a:flags, + \ {-> synID('.', col('.'), v:true)->synIDattr('name') + \ =~ '\%(Comment\|Todo\|String\)$'}, + \ [0, a:fromlnum - s:maxoff]->max(), s:searchpair_timeout) +endfunction + " See if the specified line is already user-dedented from the expected value. function s:Dedented(lnum, expected) return indent(a:lnum) <= a:expected - shiftwidth() endfunction -let s:maxoff = 50 " maximum number of lines to look backwards for () - " Some other filetypes which embed Python have slightly different indent " rules (e.g. bitbake). Those filetypes can pass an extra funcref to this " function which is evaluated below. @@ -39,30 +54,30 @@ function python#GetIndent(lnum, ...) return 0 endif - call cursor(plnum, 1) - - " Identing inside parentheses can be very slow, regardless of the searchpair() - " timeout, so let the user disable this feature if he doesn't need it - let disable_parentheses_indenting = get(g:, "pyindent_disable_parentheses_indenting", 0) - - if disable_parentheses_indenting == 1 + if s:disable_parentheses_indenting == 1 let plindent = indent(plnum) let plnumstart = plnum else - " searchpair() can be slow sometimes, limit the time to 150 msec or what is - " put in g:pyindent_searchpair_timeout - let searchpair_stopline = 0 - let searchpair_timeout = get(g:, 'pyindent_searchpair_timeout', 150) + " Indent inside parens. + " Align with the open paren unless it is at the end of the line. + " E.g. + " open_paren_not_at_EOL(100, + " (200, + " 300), + " 400) + " open_paren_at_EOL( + " 100, 200, 300, 400) + call cursor(a:lnum, 1) + let [parlnum, parcol] = s:SearchBracket(a:lnum, 'nbW') + if parlnum > 0 && parcol != col([parlnum, '$']) - 1 + return parcol + endif + + call cursor(plnum, 1) " If the previous line is inside parenthesis, use the indent of the starting " line. - " Trick: use the non-existing "dummy" variable to break out of the loop when - " going too far back. - let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', - \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|Todo\\|String\\)$'", - \ searchpair_stopline, searchpair_timeout) + let [parlnum, _] = s:SearchBracket(plnum, 'nbW') if parlnum > 0 if a:0 > 0 && ExtraFunc(parlnum) " We may have found the opening brace of a bitbake Python task, e.g. 'python do_task {' @@ -85,11 +100,7 @@ function python#GetIndent(lnum, ...) " + b " + c) call cursor(a:lnum, 1) - let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|Todo\\|String\\)$'", - \ searchpair_stopline, searchpair_timeout) + let [p, _] = s:SearchBracket(a:lnum, 'bW') if p > 0 if a:0 > 0 && ExtraFunc(p) " Currently only used by bitbake @@ -109,11 +120,7 @@ function python#GetIndent(lnum, ...) else if p == plnum " When the start is inside parenthesis, only indent one 'shiftwidth'. - let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|Todo\\|String\\)$'", - \ searchpair_stopline, searchpair_timeout) + let [pp, _] = s:SearchBracket(a:lnum, 'bW') if pp > 0 return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth()) endif @@ -136,12 +143,12 @@ function python#GetIndent(lnum, ...) " If the last character in the line is a comment, do a binary search for " the start of the comment. synID() is slow, a linear search would take " too long on a long line. - if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$" + if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)" let min = 1 let max = pline_len while min < max let col = (min + max) / 2 - if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$" + if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)" let max = col else let min = col + 1 diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt index 2a7125a044..e9fd2888ac 100644 --- a/runtime/doc/help.txt +++ b/runtime/doc/help.txt @@ -25,6 +25,7 @@ Get specific help: It is possible to go directly to whatever you want help Option ' :help 'textwidth' Regular expression / :help /[ See |help-summary| for more contexts and an explanation. + See |notation| for an explanation of the help syntax. Search for help: Type ":help word", then hit CTRL-D to see matching help entries for "word". diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index f0977c91de..f8e60f0d0d 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1325,7 +1325,8 @@ A jump table for the options with a short description can be found at |Q_op|. page can have a different value. When 'cmdheight' is zero, there is no command-line unless it is being - used. Any messages will cause the |hit-enter| prompt. + used. Some informative messages will not be displayed, any other + messages will cause the |hit-enter| prompt. *'cmdwinheight'* *'cwh'* 'cmdwinheight' 'cwh' number (default 7) @@ -3735,8 +3736,8 @@ A jump table for the options with a short description can be found at |Q_op|. *'lispwords'* *'lw'* 'lispwords' 'lw' string (default is very long) global or local to buffer |global-local| - Comma-separated list of words that influence the Lisp indenting. - |'lisp'| + Comma-separated list of words that influence the Lisp indenting when + enabled with the |'lisp'| option. *'list'* *'nolist'* 'list' boolean (default off) diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index bc2f7f077b..af5ef0ab2d 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -202,9 +202,9 @@ message when it doesn't, append !: > :unlet! s:count -When a script finishes, the local variables used there will not be -automatically freed. The next time the script executes, it can still use the -old value. Example: > +When a script has been processed to the end, the local variables declared +there will not be deleted. Functions defined in the script can use them. +Example: :if !exists("s:call_count") : let s:call_count = 0 diff --git a/runtime/ftplugin/abaqus.vim b/runtime/ftplugin/abaqus.vim index 5ce565ef3f..3faeff621a 100644 --- a/runtime/ftplugin/abaqus.vim +++ b/runtime/ftplugin/abaqus.vim @@ -1,7 +1,7 @@ " Vim filetype plugin file " Language: Abaqus finite element input file (www.abaqus.com) -" Maintainer: Carl Osterwisch <osterwischc@asme.org> -" Last Change: 2022 May 09 +" Maintainer: Carl Osterwisch <costerwi@gmail.com> +" Last Change: 2022 Aug 03 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") | finish | endif @@ -46,7 +46,7 @@ if has("folding") endif " Set the file browse filter (currently only supported under Win32 gui) -if has("gui_win32") && !exists("b:browsefilter") +if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") let b:browsefilter = "Abaqus Input Files (*.inp *.inc)\t*.inp;*.inc\n" . \ "Abaqus Results (*.dat)\t*.dat\n" . \ "Abaqus Messages (*.pre *.msg *.sta)\t*.pre;*.msg;*.sta\n" . @@ -57,7 +57,7 @@ endif " Define patterns for the matchit plugin if exists("loaded_matchit") && !exists("b:match_words") let b:match_ignorecase = 1 - let b:match_words = + let b:match_words = \ '\*part:\*end\s*part,' . \ '\*assembly:\*end\s*assembly,' . \ '\*instance:\*end\s*instance,' . @@ -65,25 +65,27 @@ if exists("loaded_matchit") && !exists("b:match_words") let b:undo_ftplugin .= "|unlet! b:match_ignorecase b:match_words" endif -" Define keys used to move [count] keywords backward or forward. -noremap <silent><buffer> [[ ?^\*\a<CR>:nohlsearch<CR> -noremap <silent><buffer> ]] /^\*\a<CR>:nohlsearch<CR> - -" Define key to toggle commenting of the current line or range -noremap <silent><buffer> <LocalLeader><LocalLeader> - \ :call <SID>Abaqus_ToggleComment()<CR>j -function! <SID>Abaqus_ToggleComment() range - if strpart(getline(a:firstline), 0, 2) == "**" - " Un-comment all lines in range - silent execute a:firstline . ',' . a:lastline . 's/^\*\*//' - else - " Comment all lines in range - silent execute a:firstline . ',' . a:lastline . 's/^/**/' - endif -endfunction - -let b:undo_ftplugin .= "|unmap <buffer> [[|unmap <buffer> ]]" - \ . "|unmap <buffer> <LocalLeader><LocalLeader>" +if !exists("no_plugin_maps") && !exists("no_abaqus_maps") + " Define keys used to move [count] keywords backward or forward. + noremap <silent><buffer> [[ ?^\*\a<CR>:nohlsearch<CR> + noremap <silent><buffer> ]] /^\*\a<CR>:nohlsearch<CR> + + " Define key to toggle commenting of the current line or range + noremap <silent><buffer> <LocalLeader><LocalLeader> + \ :call <SID>Abaqus_ToggleComment()<CR>j + function! <SID>Abaqus_ToggleComment() range + if strpart(getline(a:firstline), 0, 2) == "**" + " Un-comment all lines in range + silent execute a:firstline . ',' . a:lastline . 's/^\*\*//' + else + " Comment all lines in range + silent execute a:firstline . ',' . a:lastline . 's/^/**/' + endif + endfunction + + let b:undo_ftplugin .= "|unmap <buffer> [[|unmap <buffer> ]]" + \ . "|unmap <buffer> <LocalLeader><LocalLeader>" +endif " Undo must be done in nocompatible mode for <LocalLeader>. let b:undo_ftplugin = "let b:cpo_save = &cpoptions|" diff --git a/runtime/ftplugin/php.vim b/runtime/ftplugin/php.vim index 2824a5853b..540653e030 100644 --- a/runtime/ftplugin/php.vim +++ b/runtime/ftplugin/php.vim @@ -1,12 +1,12 @@ " Vim filetype plugin file -" Language: php -" -" This runtime file is looking for a new maintainer. -" -" Former maintainer: Dan Sharp -" Last Changed: 20 Jan 2009 +" Language: PHP +" Maintainer: Doug Kearns <dougkearns@gmail.com> +" Previous Maintainer: Dan Sharp +" Last Changed: 2022 Jul 20 -if exists("b:did_ftplugin") | finish | endif +if exists("b:did_ftplugin") + finish +endif " Make sure the continuation lines below do not cause problems in " compatibility mode. @@ -15,8 +15,8 @@ set cpo&vim " Define some defaults in case the included ftplugins don't set them. let s:undo_ftplugin = "" -let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" . - \ "All Files (*.*)\t*.*\n" +let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .. + \ "All Files (*.*)\t*.*\n" let s:match_words = "" runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim @@ -24,63 +24,130 @@ let b:did_ftplugin = 1 " Override our defaults if these were set by an included ftplugin. if exists("b:undo_ftplugin") - let s:undo_ftplugin = b:undo_ftplugin +" let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions< omnifunc<" + let s:undo_ftplugin = b:undo_ftplugin endif if exists("b:browsefilter") - let s:browsefilter = b:browsefilter +" let b:undo_ftplugin ..= " | unlet! b:browsefilter b:html_set_browsefilter" + let s:browsefilter = b:browsefilter endif if exists("b:match_words") - let s:match_words = b:match_words +" let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:html_set_match_words" + let s:match_words = b:match_words endif if exists("b:match_skip") - unlet b:match_skip + unlet b:match_skip endif -" Change the :browse e filter to primarily show PHP-related files. -if has("gui_win32") - let b:browsefilter="PHP Files (*.php)\t*.php\n" . s:browsefilter +setlocal comments=s1:/*,mb:*,ex:*/,://,:# +setlocal commentstring=/*%s*/ +setlocal formatoptions+=l formatoptions-=t + +if get(g:, "php_autocomment", 1) + setlocal formatoptions+=croq + " NOTE: set g:PHP_autoformatcomment = 0 to prevent the indent plugin from + " overriding this 'comments' value + setlocal comments-=:# + " space after # comments to exclude attributes + setlocal comments+=b:# endif +if exists('&omnifunc') + setlocal omnifunc=phpcomplete#CompletePHP +endif + +setlocal suffixesadd=.php + " ### " Provided by Mikolaj Machowski <mikmach at wp dot pl> setlocal include=\\\(require\\\|include\\\)\\\(_once\\\)\\\? " Disabled changing 'iskeyword', it breaks a command such as "*" " setlocal iskeyword+=$ -if exists("loaded_matchit") - let b:match_words = '<?php:?>,\<switch\>:\<endswitch\>,' . - \ '\<if\>:\<elseif\>:\<else\>:\<endif\>,' . - \ '\<while\>:\<endwhile\>,' . - \ '\<do\>:\<while\>,' . - \ '\<for\>:\<endfor\>,' . - \ '\<foreach\>:\<endforeach\>,' . - \ '(:),[:],{:},' . - \ s:match_words +let b:undo_ftplugin = "setlocal include< suffixesadd<" + +if exists("loaded_matchit") && exists("b:html_set_match_words") + let b:match_ignorecase = 1 + let b:match_words = 'PhpMatchWords()' + + if !exists("*PhpMatchWords") + function! PhpMatchWords() + " The PHP syntax file uses the Delimiter syntax group for the phpRegion + " matchgroups, without a "php" prefix, so use the stack to test for the + " outer phpRegion group. This also means the closing ?> tag which is + " outside of the matched region just uses the Delimiter group for the + " end match. + let stack = synstack(line('.'), col('.')) + let php_region = !empty(stack) && synIDattr(stack[0], "name") =~# '\<php' + if php_region || getline(".") =~ '.\=\%.c\&?>' + let b:match_skip = "PhpMatchSkip('html')" + return '<?php\|<?=\=:?>,' .. + \ '\<if\>:\<elseif\>:\<else\>:\<endif\>,' .. + \ '\<switch\>:\<case\>:\<break\>:\<continue\>:\<endswitch\>,' .. + \ '\<while\>.\{-})\s*\::\<break\>:\<continue\>:\<endwhile\>,' .. + \ '\<do\>:\<break\>:\<continue\>:\<while\>,' .. + \ '\<for\>:\<break\>:\<continue\>:\<endfor\>,' .. + \ '\<foreach\>:\<break\>:\<continue\>:\<endforeach\>,' .. + \ '\%(<<<\s*\)\@<=''\=\(\h\w*\)''\=:^\s*\1\>' + + " TODO: these probably aren't worth adding and really need syntax support + " '<\_s*script\_s*language\_s*=\_s*[''"]\=\_s*php\_s*[''"]\=\_s*>:<\_s*\_s*/\_s*script\_s*>,' .. + " '<%:%>,' .. + else + let b:match_skip = "PhpMatchSkip('php')" + return s:match_words + endif + endfunction + endif + if !exists("*PhpMatchSkip") + function! PhpMatchSkip(skip) + let name = synIDattr(synID(line('.'), col('.'), 1), 'name') + if a:skip == "html" + " ?> in line comments will also be correctly matched as Delimiter + return name =~? 'comment\|string' || name !~? 'php\|delimiter' + else " php + return name =~? 'comment\|string\|php' + endif + endfunction + endif + let b:undo_ftplugin ..= " | unlet! b:match_skip" endif " ### -if exists('&omnifunc') - setlocal omnifunc=phpcomplete#CompletePHP +" Change the :browse e filter to primarily show PHP-related files. +if (has("gui_win32") || has("gui_gtk")) && exists("b:html_set_browsefilter") + let b:browsefilter = "PHP Files (*.php)\t*.php\n" .. + \ "PHP Test Files (*.phpt)\t*.phpt\n" .. + \ s:browsefilter endif -" Section jumping: [[ and ]] provided by Antony Scriven <adscriven at gmail dot com> -let s:function = '\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function' -let s:class = '\(abstract\s\+\|final\s\+\)*class' -let s:interface = 'interface' -let s:section = '\(.*\%#\)\@!\_^\s*\zs\('.s:function.'\|'.s:class.'\|'.s:interface.'\)' -exe 'nno <buffer> <silent> [[ ?' . escape(s:section, '|') . '?<CR>:nohls<CR>' -exe 'nno <buffer> <silent> ]] /' . escape(s:section, '|') . '/<CR>:nohls<CR>' -exe 'ono <buffer> <silent> [[ ?' . escape(s:section, '|') . '?<CR>:nohls<CR>' -exe 'ono <buffer> <silent> ]] /' . escape(s:section, '|') . '/<CR>:nohls<CR>' +if !exists("no_plugin_maps") && !exists("no_php_maps") + " Section jumping: [[ and ]] provided by Antony Scriven <adscriven at gmail dot com> + let s:function = '\%(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function' + let s:class = '\%(abstract\s\+\|final\s\+\)*class' + let s:section = escape('^\s*\zs\%(' .. s:function .. '\|' .. s:class .. '\|interface\|trait\|enum\)\>', "|") -setlocal suffixesadd=.php -setlocal commentstring=/*%s*/ + function! s:Jump(pattern, count, flags) + normal! m' + for i in range(a:count) + if !search(a:pattern, a:flags) + break + endif + endfor + endfunction -" Undo the stuff we changed. -let b:undo_ftplugin = "setlocal suffixesadd< commentstring< include< omnifunc<" . - \ " | unlet! b:browsefilter b:match_words | " . - \ s:undo_ftplugin + for mode in ["n", "o", "x"] + exe mode .. "noremap <buffer> <silent> ]] <Cmd>call <SID>Jump('" .. s:section .. "', v:count1, 'W')<CR>" + exe mode .. "noremap <buffer> <silent> [[ <Cmd>call <SID>Jump('" .. s:section .. "', v:count1, 'bW')<CR>" + let b:undo_ftplugin ..= " | sil! exe '" .. mode .. "unmap <buffer> ]]'" .. + \ " | sil! exe '" .. mode .. "unmap <buffer> [['" + endfor +endif + +let b:undo_ftplugin ..= " | " .. s:undo_ftplugin " Restore the saved compatibility options. let &cpo = s:keepcpo unlet s:keepcpo + +" vim: nowrap sw=2 sts=2 ts=8 noet: diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim index 64b64b45e3..772899cb42 100644 --- a/runtime/ftplugin/vim.vim +++ b/runtime/ftplugin/vim.vim @@ -1,7 +1,7 @@ " Vim filetype plugin " Language: Vim " Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2021 Apr 11 +" Last Change: 2022 Aug 4 " Only do this when not done yet for this buffer if exists("b:did_ftplugin") @@ -109,7 +109,7 @@ if exists("loaded_matchit") " - set spl=de,en " - au! FileType javascript syntax region foldBraces start=/{/ end=/}/ … let b:match_skip = 'synIDattr(synID(line("."),col("."),1),"name") - \ =~? "comment\\|string\\|vimSynReg\\|vimSet"' + \ =~? "comment\\|string\\|vimLetHereDoc\\|vimSynReg\\|vimSet"' endif let &cpo = s:cpo_save diff --git a/runtime/indent/lisp.vim b/runtime/indent/lisp.vim index b0c4eed1bd..1bce39510c 100644 --- a/runtime/indent/lisp.vim +++ b/runtime/indent/lisp.vim @@ -1,7 +1,7 @@ " Vim indent file " Language: Lisp -" Maintainer: Sergey Khorev <sergey.khorev@gmail.com> -" URL: http://sites.google.com/site/khorser/opensource/vim +" Maintainer: Sergey Khorev <sergey.khorev@gmail.com> +" URL: http://sites.google.com/site/khorser/opensource/vim " Last Change: 2012 Jan 10 " Only load this indent file when no other was loaded. diff --git a/runtime/indent/systemverilog.vim b/runtime/indent/systemverilog.vim index f6114dc1fd..a5f4d5b90d 100644 --- a/runtime/indent/systemverilog.vim +++ b/runtime/indent/systemverilog.vim @@ -2,7 +2,7 @@ " Language: SystemVerilog " Maintainer: kocha <kocha.lsifrontend@gmail.com> " Last Change: 05-Feb-2017 by Bilal Wasim -" 2022 April: b:undo_indent added by Doug Kearns +" 03-Aug-2022 Improved indent " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -15,7 +15,7 @@ setlocal indentkeys=!^F,o,O,0),0},=begin,=end,=join,=endcase,=join_any,=join_non setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify setlocal indentkeys+==endclass,=endpackage,=endsequence,=endclocking setlocal indentkeys+==endinterface,=endgroup,=endprogram,=endproperty,=endchecker -setlocal indentkeys+==`else,=`endif +setlocal indentkeys+==`else,=`elsif,=`endif let b:undo_indent = "setl inde< indk<" @@ -27,6 +27,9 @@ endif let s:cpo_save = &cpo set cpo&vim +let s:multiple_comment = 0 +let s:open_statement = 0 + function SystemVerilogIndent() if exists('b:systemverilog_indent_width') @@ -40,6 +43,12 @@ function SystemVerilogIndent() let indent_modules = 0 endif + if exists('b:systemverilog_indent_ifdef_off') + let indent_ifdef = 0 + else + let indent_ifdef = 1 + endif + " Find a non-blank line above the current line. let lnum = prevnonblank(v:lnum - 1) @@ -54,48 +63,55 @@ function SystemVerilogIndent() 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 sv_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)' " Define the condition when the statement ends with a one-line comment let sv_comment = '\(//.*\|/\*.*\*/\s*\)' - if exists('b:verilog_indent_verbose') - let vverb_str = 'INDENT VERBOSE:' + if exists('b:systemverilog_indent_verbose') + let vverb_str = 'INDENT VERBOSE: '. v:lnum .":" 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 + " Multiple-line comment count + if curr_line =~ '^\s*/\*' && curr_line !~ '/\*.\{-}\*/' + let s:multiple_comment += 1 + if vverb | echom vverb_str "Start of multiple-line commnt" | endif + elseif curr_line =~ '\*/\s*$' && curr_line !~ '/\*.\{-}\*/' + let s:multiple_comment -= 1 + if vverb | echom vverb_str "End of multiple-line commnt" | endif + return ind + endif + " Maintain indentation during commenting. + if s:multiple_comment > 0 + return ind + endif " Indent after if/else/for/case/always/initial/specify/fork blocks - elseif last_line =~ '`\@<!\<\(if\|else\)\>' || - \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\|do\|foreach\|forever\|randcase\)\>' || + if last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' || + \ last_line =~ '^\s*\<\(for\|while\|repeat\|case\%[[zx]]\|do\|foreach\|forever\|randcase\)\>' || \ last_line =~ '^\s*\<\(always\|always_comb\|always_ff\|always_latch\)\>' || \ last_line =~ '^\s*\<\(initial\|specify\|fork\|final\)\>' - if last_line !~ '\(;\|\<end\>\)\s*' . sv_comment . '*$' || + if last_line !~ '\(;\|\<end\>\|\*/\)\s*' . sv_comment . '*$' || \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$' let ind = ind + offset - if vverb | echo vverb_str "Indent after a block statement." | endif + if vverb | echom vverb_str "Indent after a block statement." | endif endif " Indent after function/task/class/package/sequence/clocking/ " interface/covergroup/property/checkerprogram blocks elseif last_line =~ '^\s*\<\(function\|task\|class\|package\)\>' || \ last_line =~ '^\s*\<\(sequence\|clocking\|interface\)\>' || \ last_line =~ '^\s*\(\w\+\s*:\)\=\s*\<covergroup\>' || - \ last_line =~ '^\s*\<\(property\|checker\|program\)\>' + \ last_line =~ '^\s*\<\(property\|checker\|program\)\>' || + \ ( last_line =~ '^\s*\<virtual\>' && last_line =~ '\<\(function\|task\|class\|interface\)\>' ) || + \ ( last_line =~ '^\s*\<pure\>' && last_line =~ '\<virtual\>' && last_line =~ '\<\(function\|task\)\>' ) if last_line !~ '\<end\>\s*' . sv_comment . '*$' || \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$' let ind = ind + offset if vverb - echo vverb_str "Indent after function/task/class block statement." + echom vverb_str "Indent after function/task/class block statement." endif endif @@ -103,13 +119,13 @@ function SystemVerilogIndent() elseif last_line =~ '^\s*\(\<extern\>\s*\)\=\<module\>' let ind = ind + indent_modules if vverb && indent_modules - echo vverb_str "Indent after module statement." + echom vverb_str "Indent after module statement." endif if last_line =~ '[(,]\s*' . sv_comment . '*$' && \ last_line !~ '\(//\|/\*\).*[(,]\s*' . sv_comment . '*$' let ind = ind + offset if vverb - echo vverb_str "Indent after a multiple-line module statement." + echom vverb_str "Indent after a multiple-line module statement." endif endif @@ -119,7 +135,7 @@ function SystemVerilogIndent() \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' || \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' ) let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif + if vverb | echom vverb_str "Indent after begin statement." | endif " Indent after a '{' or a '(' elseif last_line =~ '[{(]' . sv_comment . '*$' && @@ -127,7 +143,21 @@ function SystemVerilogIndent() \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' || \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' ) let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif + if vverb | echom vverb_str "Indent after begin statement." | endif + + " Ignore de-indent for the end of one-line block + elseif ( last_line !~ '\<begin\>' || + \ last_line =~ '\(//\|/\*\).*\<begin\>' ) && + \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>.*' . + \ sv_comment . '*$' && + \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>' && + \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' && + \ ( last_line2 !~ '\<begin\>' || + \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) && + \ last_line2 =~ ')*\s*;\s*' . sv_comment . '*$' + if vverb + echom vverb_str "Ignore de-indent after the end of one-line statement." + endif " De-indent for the end of one-line block elseif ( last_line !~ '\<begin\>' || @@ -136,39 +166,29 @@ function SystemVerilogIndent() \ sv_comment . '*$' && \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>' && \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' && + \ last_line2 !~ '\(;\|\<end\>\|\*/\)\s*' . sv_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." + echom 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 =~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*' . sv_openstat . '\s*$' && - \ last_line2 !~ sv_openstat . '\s*' . sv_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*' . sv_comment . '*$' && - \ last_line !~ '^\s*)*\s*;\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . sv_comment . '*$' && - \ ( last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line2 !~ ';\s*//.*$') && - \ last_line2 !~ '^\s*' . sv_comment . '$' - let ind = ind - offset - if vverb | echo vverb_str "De-indent after a close statement." | endif + " Multiple-line statement (including case statement) + " Open statement + " Ident the first open line + elseif last_line =~ sv_openstat . '\s*' . sv_comment . '*$' && + \ last_line !~ '\(//\|/\*\).*' . sv_openstat . '\s*$' && + \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' + let ind = ind + offset + let s:open_statement = 1 + if vverb | echom vverb_str "Indent after an open statement." | endif - " `ifdef and `else - elseif last_line =~ '^\s*`\<\(ifdef\|else\)\>' + " `ifdef or `ifndef or `elsif or `else + elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>' && indent_ifdef let ind = ind + offset if vverb - echo vverb_str "Indent after a `ifdef or `else statement." + echom vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement." endif endif @@ -177,17 +197,21 @@ function SystemVerilogIndent() " De-indent on the end of the block " join/end/endcase/endfunction/endtask/endspecify - if curr_line =~ '^\s*\<\(join\|join_any\|join_none\|\|end\|endcase\|while\)\>' || + if curr_line =~ '^\s*\<\(join\|join_any\|join_none\|\|end\|endcase\)\>' || \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\|endclass\)\>' || \ curr_line =~ '^\s*\<\(endpackage\|endsequence\|endclocking\|endinterface\)\>' || - \ curr_line =~ '^\s*\<\(endgroup\|endproperty\|endchecker\|endprogram\)\>' || - \ curr_line =~ '^\s*}' + \ curr_line =~ '^\s*\<\(endgroup\|endproperty\|endchecker\|endprogram\)\>' let ind = ind - offset - if vverb | echo vverb_str "De-indent the end of a block." | endif + if vverb | echom vverb_str "De-indent the end of a block." | endif + if s:open_statement == 1 + let ind = ind - offset + let s:open_statement = 0 + if vverb | echom vverb_str "De-indent the close statement." | endif + 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." + echom vverb_str "De-indent the end of a module." endif " De-indent on a stand-alone 'begin' @@ -202,25 +226,46 @@ function SystemVerilogIndent() \ last_line =~ sv_openstat . '\s*' . sv_comment . '*$' ) let ind = ind - offset if vverb - echo vverb_str "De-indent a stand alone begin statement." + echom vverb_str "De-indent a stand alone begin statement." + endif + if s:open_statement == 1 + let ind = ind - offset + let s:open_statement = 0 + if vverb | echom vverb_str "De-indent the close statement." | endif endif endif - " De-indent after the end of multiple-line statement - elseif curr_line =~ '^\s*)' && - \ ( last_line =~ sv_openstat . '\s*' . sv_comment . '*$' || - \ last_line !~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent the end of a multiple 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*' . sv_comment . '*$' && + " \ last_line !~ '^\s*)*\s*;\s*' . sv_comment . '*$' && + " \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . sv_comment . '*$' && + " \ ( last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' && + " \ last_line2 !~ ';\s*//.*$') && + " \ last_line2 !~ '^\s*' . sv_comment . '$' + " let ind = ind - offset + " if vverb | echom vverb_str "De-indent after a close statement." | endif - " De-indent `else and `endif - elseif curr_line =~ '^\s*`\<\(else\|endif\)\>' - let ind = ind - offset - if vverb | echo vverb_str "De-indent `else and `endif statement." | endif + " " De-indent after the end of multiple-line statement + " elseif curr_line =~ '^\s*)' && + " \ ( last_line =~ sv_openstat . '\s*' . sv_comment . '*$' || + " \ last_line !~ sv_openstat . '\s*' . sv_comment . '*$' && + " \ last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' ) + " let ind = ind - offset + " if vverb + " echom 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\)\>' && indent_ifdef + let ind = ind - offset + if vverb | echom vverb_str "De-indent `elsif or `else or `endif statement." | endif + if b:systemverilog_open_statement == 1 + let ind = ind - offset + let b:systemverilog_open_statement = 0 + if vverb | echom vverb_str "De-indent the open statement." | endif + endif endif " Return the indentation @@ -231,3 +276,4 @@ let &cpo = s:cpo_save unlet s:cpo_save " vim:sw=2 + diff --git a/runtime/indent/testdir/python.in b/runtime/indent/testdir/python.in new file mode 100644 index 0000000000..868a63622b --- /dev/null +++ b/runtime/indent/testdir/python.in @@ -0,0 +1,68 @@ +" vim: set ft=python sw=4 et: + +" START_INDENT +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +open_paren_not_at_EOL(100, +(200, +300), +400) + +open_paren_at_EOL( +100, 200, 300, 400) + +" END_INDENT diff --git a/runtime/indent/testdir/python.ok b/runtime/indent/testdir/python.ok new file mode 100644 index 0000000000..c0c08af4b9 --- /dev/null +++ b/runtime/indent/testdir/python.ok @@ -0,0 +1,68 @@ +" vim: set ft=python sw=4 et: + +" START_INDENT +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +open_paren_not_at_EOL(100, + (200, + 300), + 400) + +open_paren_at_EOL( + 100, 200, 300, 400) + +" END_INDENT diff --git a/runtime/lua/vim/filetype/detect.lua b/runtime/lua/vim/filetype/detect.lua index 14f076717f..2be9dcff88 100644 --- a/runtime/lua/vim/filetype/detect.lua +++ b/runtime/lua/vim/filetype/detect.lua @@ -930,7 +930,7 @@ function M.progress_pascal(bufnr) return 'progress' end --- Distinguish between "default" and Cproto prototype file. +-- Distinguish between "default", Prolog and Cproto prototype file. function M.proto(bufnr, default) -- Cproto files have a comment in the first line and a function prototype in -- the second line, it always ends in ";". Indent files may also have @@ -940,7 +940,18 @@ function M.proto(bufnr, default) if getlines(bufnr, 2):find('.;$') then return 'cpp' else - return default + -- Recognize Prolog by specific text in the first non-empty line; + -- require a blank after the '%' because Perl uses "%list" and "%translate" + local line = nextnonblank(bufnr, 1) + if + line and line:find(':%-') + or matchregex(line, [[\c\<prolog\>]]) + or findany(line, { '^%s*%%+%s', '^%s*%%+$', '^%s*/%*' }) + then + return 'prolog' + else + return default + end end end diff --git a/runtime/pack/dist/opt/matchit/doc/matchit.txt b/runtime/pack/dist/opt/matchit/doc/matchit.txt index 553359ffaf..45033ce3f1 100644 --- a/runtime/pack/dist/opt/matchit/doc/matchit.txt +++ b/runtime/pack/dist/opt/matchit/doc/matchit.txt @@ -243,9 +243,6 @@ Examples: comment character) you can > :let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%' < - See the $VIMRUNTIME/ftplugin/vim.vim for an example that uses both - syntax and a regular expression. - ============================================================================== 4. Supporting a New Language *matchit-newlang* *b:match_words* diff --git a/runtime/syntax/abaqus.vim b/runtime/syntax/abaqus.vim index db2717f818..e6f025d8f4 100644 --- a/runtime/syntax/abaqus.vim +++ b/runtime/syntax/abaqus.vim @@ -1,6 +1,6 @@ " Vim syntax file " Language: Abaqus finite element input file (www.hks.com) -" Maintainer: Carl Osterwisch <osterwischc@asme.org> +" Maintainer: Carl Osterwisch <costerwi@gmail.com> " Last Change: 2002 Feb 24 " Remark: Huge improvement in folding performance--see filetype plugin @@ -28,8 +28,7 @@ syn match abaqusBadLine "^\s\+\*.*" display hi def link abaqusComment Comment hi def link abaqusKeyword Statement hi def link abaqusParameter Identifier -hi def link abaqusValue Constant -hi def link abaqusBadLine Error - +hi def link abaqusValue Constant +hi def link abaqusBadLine Error let b:current_syntax = "abaqus" |