mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	Problem:  Modula2 filetype support lacking
Solution: Improve the Modula-2 runtime support, add additional modula2
          dialects, add compiler plugin, update syntax highlighting,
          include syntax tests, update Makefiles (Doug Kearns)
closes: vim/vim#6796
closes: vim/vim#8115
68a8947069
- Luaify the detection script:
  - Split the `(*!m2foo*)` and `(*!m2foo+bar*)` detection into two Lua patterns,
    as Lua capture groups cannot be used with `?` and friends (as they only work
    on character classes).
  - Use `vim.api.nvim_buf_call()` (ew) to call `modula2#SetDialect()` to ensure
    `b:modula2` is set for the given bufnr.
- Skip the syntax screendump tests. (A shame as they test some of the detection
  from `(*!m2foo+bar*)` tags, but I tested this locally and it seems to work)
- Port the synmenu.vim changes from Vim9 script. (Also tested this locally)
- (And also add the missing comma for `b:browsefilter` from earlier.)
Co-authored-by: Doug Kearns <dougkearns@gmail.com>
		
	
		
			
				
	
	
		
			378 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			378 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" Vim syntax file
 | 
						|
" Language:    Modula-2 (PIM)
 | 
						|
" Maintainer:  B.Kowarsch <trijezdci@moc.liamg>
 | 
						|
" Last Change: 2016 August 22
 | 
						|
 | 
						|
" ----------------------------------------------------
 | 
						|
" THIS FILE IS LICENSED UNDER THE VIM LICENSE
 | 
						|
" see https://github.com/vim/vim/blob/master/LICENSE
 | 
						|
" ----------------------------------------------------
 | 
						|
 | 
						|
" Remarks:
 | 
						|
" Vim Syntax files are available for the following Modula-2 dialects:
 | 
						|
" * for the PIM dialect : m2pim.vim (this file)
 | 
						|
" * for the ISO dialect : m2iso.vim
 | 
						|
" * for the R10 dialect : m2r10.vim
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" This syntax description follows the 3rd and 4th editions of N.Wirth's Book
 | 
						|
" Programming in Modula-2 (aka PIM) plus the following language extensions:
 | 
						|
" * non-leading, non-trailing, non-consecutive lowlines _ in identifiers
 | 
						|
" * widely supported non-standard types BYTE, LONGCARD and LONGBITSET
 | 
						|
" * non-nesting code disabling tags ?< and >? at the start of a line
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
 | 
						|
" Parameters:
 | 
						|
"
 | 
						|
" Vim's filetype script recognises Modula-2 dialect tags within the first 200
 | 
						|
" lines of Modula-2 .def and .mod input files.  The script sets filetype and
 | 
						|
" dialect automatically when a valid dialect tag is found in the input file.
 | 
						|
" The dialect tag for the PIM dialect is (*!m2pim*).  It is recommended to put
 | 
						|
" the tag immediately after the module header in the Modula-2 input file.
 | 
						|
"
 | 
						|
" Example:
 | 
						|
"  DEFINITION MODULE Foolib; (*!m2pim*)
 | 
						|
"
 | 
						|
" Variable g:modula2_default_dialect sets the default Modula-2 dialect when the
 | 
						|
" dialect cannot be determined from the contents of the Modula-2 input file:
 | 
						|
" if defined and set to 'm2pim', the default dialect is PIM.
 | 
						|
"
 | 
						|
" Variable g:modula2_pim_allow_lowline controls support for lowline in identifiers:
 | 
						|
" if defined and set to a non-zero value, they are recognised, otherwise not
 | 
						|
"
 | 
						|
" Variable g:modula2_pim_disallow_octals controls the rendering of octal literals:
 | 
						|
" if defined and set to a non-zero value, they are rendered as errors.
 | 
						|
"
 | 
						|
" Variable g:modula2_pim_disallow_synonyms controls the rendering of & and ~:
 | 
						|
" if defined and set to a non-zero value, they are rendered as errors.
 | 
						|
"
 | 
						|
" Variables may be defined in Vim startup file .vimrc
 | 
						|
"
 | 
						|
" Examples:
 | 
						|
"  let g:modula2_default_dialect = 'm2pim'
 | 
						|
"  let g:modula2_pim_allow_lowline = 1
 | 
						|
"  let g:modula2_pim_disallow_octals = 1
 | 
						|
"  let g:modula2_pim_disallow_synonyms = 1
 | 
						|
 | 
						|
 | 
						|
if exists("b:current_syntax")
 | 
						|
  finish
 | 
						|
endif
 | 
						|
 | 
						|
" Modula-2 is case sensitive
 | 
						|
syn case match
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Reserved Words
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2Resword AND ARRAY BEGIN BY CASE CONST DEFINITION DIV DO ELSE
 | 
						|
syn keyword modula2Resword ELSIF EXIT EXPORT FOR FROM IF IMPLEMENTATION IMPORT
 | 
						|
syn keyword modula2Resword IN LOOP MOD NOT OF OR POINTER QUALIFIED RECORD REPEAT
 | 
						|
syn keyword modula2Resword RETURN SET THEN TO TYPE UNTIL VAR WHILE WITH
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Builtin Constant Identifiers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2ConstIdent FALSE NIL TRUE
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Builtin Type Identifiers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2TypeIdent BITSET BOOLEAN CHAR PROC
 | 
						|
syn keyword modula2TypeIdent CARDINAL INTEGER LONGINT REAL LONGREAL
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Builtin Procedure and Function Identifiers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2ProcIdent CAP DEC EXCL HALT INC INCL
 | 
						|
syn keyword modula2FuncIdent ABS CHR FLOAT HIGH MAX MIN ODD ORD SIZE TRUNC VAL
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Wirthian Macro Identifiers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2MacroIdent NEW DISPOSE
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Unsafe Facilities via Pseudo-Module SYSTEM
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2UnsafeIdent ADDRESS PROCESS WORD
 | 
						|
syn keyword modula2UnsafeIdent ADR TSIZE NEWPROCESS TRANSFER SYSTEM
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Non-Portable Language Extensions
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2NonPortableIdent BYTE LONGCARD LONGBITSET
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" User Defined Identifiers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn match modula2Ident "[a-zA-Z][a-zA-Z0-9]*\(_\)\@!"
 | 
						|
syn match modula2LowLineIdent "[a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)\+"
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" String Literals
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn region modula2String start=/"/ end=/"/ oneline
 | 
						|
syn region modula2String start=/'/ end=/'/ oneline
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Numeric Literals
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn match modula2Num
 | 
						|
  \ "\(\([0-7]\+\)[BC]\@!\|[89]\)[0-9]*\(\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?\)\?"
 | 
						|
syn match modula2Num "[0-9A-F]\+H"
 | 
						|
syn match modula2Octal "[0-7]\+[BC]"
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Punctuation
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn match modula2Punctuation
 | 
						|
  \ "\.\|[,:;]\|\*\|[/+-]\|\#\|[=<>]\|\^\|\[\|\]\|(\(\*\)\@!\|[){}]"
 | 
						|
syn match modula2Synonym "[&~]"
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Pragmas
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn region modula2Pragma start="(\*\$" end="\*)"
 | 
						|
syn match modula2DialectTag "(\*!m2pim\(+[a-z0-9]\+\)\?\*)"
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Block Comments
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn region modula2Comment start="(\*\(\$\|!m2pim\(+[a-z0-9]\+\)\?\*)\)\@!" end="\*)"
 | 
						|
  \ contains = modula2Comment, modula2CommentKey, modula2TechDebtMarker
 | 
						|
syn match modula2CommentKey "[Aa]uthor[s]\?\|[Cc]opyright\|[Ll]icense\|[Ss]ynopsis"
 | 
						|
syn match modula2CommentKey "\([Pp]re\|[Pp]ost\|[Ee]rror\)\-condition[s]\?:"
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Technical Debt Markers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn keyword modula2TechDebtMarker contained DEPRECATED FIXME
 | 
						|
syn match modula2TechDebtMarker "TODO[:]\?" contained
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Disabled Code Sections
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
syn region modula2DisabledCode start="^?<" end="^>?"
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Headers
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" !!! this section must be second last !!!
 | 
						|
 | 
						|
" new module header
 | 
						|
syn match modula2ModuleHeader
 | 
						|
  \ "MODULE\( [A-Z][a-zA-Z0-9]*\)\?"
 | 
						|
  \ contains = modula2ReswordModule, modula2ModuleIdent
 | 
						|
 | 
						|
syn match modula2ModuleIdent
 | 
						|
  \ "[A-Z][a-zA-Z0-9]*" contained
 | 
						|
 | 
						|
syn match modula2ModuleTail
 | 
						|
  \ "END [A-Z][a-zA-Z0-9]*\.$"
 | 
						|
  \ contains = modula2ReswordEnd, modula2ModuleIdent, modula2Punctuation
 | 
						|
 | 
						|
" new procedure header
 | 
						|
syn match modula2ProcedureHeader
 | 
						|
  \ "PROCEDURE\( [a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)*\)\?"
 | 
						|
  \ contains = modula2ReswordProcedure,
 | 
						|
  \ modula2ProcedureIdent, modula2ProcedureLowlineIdent, modula2IllegalChar, modula2IllegalIdent
 | 
						|
 | 
						|
syn match modula2ProcedureIdent
 | 
						|
  \ "\([a-zA-Z]\)\([a-zA-Z0-9]*\)" contained
 | 
						|
 | 
						|
syn match modula2ProcedureLowlineIdent
 | 
						|
  \ "[a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)\+" contained
 | 
						|
 | 
						|
syn match modula2ProcedureTail
 | 
						|
  \ "END\( \([a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)*\)[.;]$\)\?"
 | 
						|
  \ contains = modula2ReswordEnd,
 | 
						|
  \ modula2ProcedureIdent, modula2ProcedureLowLineIdent,
 | 
						|
  \ modula2Punctuation, modula2IllegalChar, modula2IllegalIdent
 | 
						|
 | 
						|
syn keyword modula2ReswordModule contained MODULE
 | 
						|
syn keyword modula2ReswordProcedure contained PROCEDURE
 | 
						|
syn keyword modula2ReswordEnd contained END
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Illegal Symbols
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" !!! this section must be last !!!
 | 
						|
 | 
						|
" any '`' '!' '@ ''$' '%' or '\'
 | 
						|
syn match modula2IllegalChar "[`!@$%\\]"
 | 
						|
 | 
						|
" any solitary sequence of '_'
 | 
						|
syn match modula2IllegalChar "\<_\+\>"
 | 
						|
 | 
						|
" any '?' at start of line if not followed by '<'
 | 
						|
syn match modula2IllegalChar "^?\(<\)\@!"
 | 
						|
 | 
						|
" any '?' not following '>' at start of line
 | 
						|
syn match modula2IllegalChar "\(\(^>\)\|\(^\)\)\@<!?"
 | 
						|
 | 
						|
" any identifiers with leading occurrences of '_'
 | 
						|
syn match modula2IllegalIdent "_\+[a-zA-Z][a-zA-Z0-9]*\(_\+[a-zA-Z0-9]*\)*"
 | 
						|
 | 
						|
" any identifiers containing consecutive occurences of '_'
 | 
						|
syn match modula2IllegalIdent
 | 
						|
  \ "[a-zA-Z][a-zA-Z0-9]*\(_[a-zA-Z0-9]\+\)*\(__\+[a-zA-Z0-9]\+\(_[a-zA-Z0-9]\+\)*\)\+"
 | 
						|
 | 
						|
" any identifiers with trailing occurrences of '_'
 | 
						|
syn match modula2IllegalIdent "[a-zA-Z][a-zA-Z0-9]*\(_\+[a-zA-Z0-9]\+\)*_\+\>"
 | 
						|
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Define Rendering Styles
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
 | 
						|
" highlight default link modula2PredefIdentStyle Keyword
 | 
						|
" highlight default link modula2ConstIdentStyle modula2PredefIdentStyle
 | 
						|
" highlight default link modula2TypeIdentStyle modula2PredefIdentStyle
 | 
						|
" highlight default link modula2ProcIdentStyle modula2PredefIdentStyle
 | 
						|
" highlight default link modula2FuncIdentStyle modula2PredefIdentStyle
 | 
						|
" highlight default link modula2MacroIdentStyle modula2PredefIdentStyle
 | 
						|
 | 
						|
highlight default link modula2ConstIdentStyle Constant
 | 
						|
highlight default link modula2TypeIdentStyle Type
 | 
						|
highlight default link modula2ProcIdentStyle Function
 | 
						|
highlight default link modula2FuncIdentStyle Function
 | 
						|
highlight default link modula2MacroIdentStyle Function
 | 
						|
highlight default link modula2UnsafeIdentStyle Question
 | 
						|
highlight default link modula2NonPortableIdentStyle Question
 | 
						|
highlight default link modula2StringLiteralStyle String
 | 
						|
highlight default link modula2CommentStyle Comment
 | 
						|
highlight default link modula2PragmaStyle PreProc
 | 
						|
highlight default link modula2DialectTagStyle SpecialComment
 | 
						|
highlight default link modula2TechDebtMarkerStyle SpecialComment
 | 
						|
highlight default link modula2ReswordStyle Keyword
 | 
						|
highlight default link modula2HeaderIdentStyle Function
 | 
						|
highlight default link modula2UserDefIdentStyle Normal
 | 
						|
highlight default link modula2NumericLiteralStyle Number
 | 
						|
highlight default link modula2PunctuationStyle Delimiter
 | 
						|
highlight default link modula2CommentKeyStyle SpecialComment
 | 
						|
highlight default link modula2DisabledCodeStyle NonText
 | 
						|
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
" Assign Rendering Styles
 | 
						|
" -----------------------------------------------------------------------------
 | 
						|
 | 
						|
" headers
 | 
						|
highlight default link modula2ModuleIdent modula2HeaderIdentStyle
 | 
						|
highlight default link modula2ProcedureIdent modula2HeaderIdentStyle
 | 
						|
highlight default link modula2ModuleHeader Normal
 | 
						|
highlight default link modula2ModuleTail Normal
 | 
						|
highlight default link modula2ProcedureHeader Normal
 | 
						|
highlight default link modula2ProcedureTail Normal
 | 
						|
 | 
						|
" lowline identifiers are rendered as errors if g:modula2_pim_allow_lowline is unset
 | 
						|
if exists("g:modula2_pim_allow_lowline")
 | 
						|
  if g:modula2_pim_allow_lowline != 0
 | 
						|
    highlight default link modula2ProcedureLowlineIdent modula2HeaderIdentStyle
 | 
						|
  else
 | 
						|
    highlight default link modula2ProcedureLowlineIdent Error
 | 
						|
  endif
 | 
						|
else
 | 
						|
  highlight default link modula2ProcedureLowlineIdent Error
 | 
						|
endif
 | 
						|
 | 
						|
" reserved words
 | 
						|
highlight default link modula2Resword modula2ReswordStyle
 | 
						|
highlight default link modula2ReswordModule modula2ReswordStyle
 | 
						|
highlight default link modula2ReswordProcedure modula2ReswordStyle
 | 
						|
highlight default link modula2ReswordEnd modula2ReswordStyle
 | 
						|
 | 
						|
" predefined identifiers
 | 
						|
highlight default link modula2ConstIdent modula2ConstIdentStyle
 | 
						|
highlight default link modula2TypeIdent modula2TypeIdentStyle
 | 
						|
highlight default link modula2ProcIdent modula2ProcIdentStyle
 | 
						|
highlight default link modula2FuncIdent modula2FuncIdentStyle
 | 
						|
highlight default link modula2MacroIdent modula2MacroIdentStyle
 | 
						|
 | 
						|
" unsafe and non-portable identifiers
 | 
						|
highlight default link modula2UnsafeIdent modula2UnsafeIdentStyle
 | 
						|
highlight default link modula2NonPortableIdent modula2NonPortableIdentStyle
 | 
						|
 | 
						|
" user defined identifiers
 | 
						|
highlight default link modula2Ident modula2UserDefIdentStyle
 | 
						|
 | 
						|
" lowline identifiers are rendered as errors if g:modula2_pim_allow_lowline is unset
 | 
						|
if exists("g:modula2_pim_allow_lowline")
 | 
						|
  if g:modula2_pim_allow_lowline != 0
 | 
						|
    highlight default link modula2LowLineIdent modula2UserDefIdentStyle
 | 
						|
  else
 | 
						|
    highlight default link modula2LowLineIdent Error
 | 
						|
  endif
 | 
						|
else
 | 
						|
  highlight default link modula2LowLineIdent Error
 | 
						|
endif
 | 
						|
 | 
						|
" literals
 | 
						|
highlight default link modula2String modula2StringLiteralStyle
 | 
						|
highlight default link modula2Num modula2NumericLiteralStyle
 | 
						|
 | 
						|
" octal literals are rendered as errors if g:modula2_pim_disallow_octals is set
 | 
						|
if exists("g:modula2_pim_disallow_octals")
 | 
						|
  if g:modula2_pim_disallow_octals != 0
 | 
						|
    highlight default link modula2Octal Error
 | 
						|
  else
 | 
						|
    highlight default link modula2Octal modula2NumericLiteralStyle
 | 
						|
  endif
 | 
						|
else
 | 
						|
  highlight default link modula2Octal modula2NumericLiteralStyle
 | 
						|
endif
 | 
						|
 | 
						|
" punctuation
 | 
						|
highlight default link modula2Punctuation modula2PunctuationStyle
 | 
						|
 | 
						|
" synonyms & and ~ are rendered as errors if g:modula2_pim_disallow_synonyms is set
 | 
						|
if exists("g:modula2_pim_disallow_synonyms")
 | 
						|
  if g:modula2_pim_disallow_synonyms != 0
 | 
						|
    highlight default link modula2Synonym Error
 | 
						|
  else
 | 
						|
    highlight default link modula2Synonym modula2PunctuationStyle
 | 
						|
  endif
 | 
						|
else
 | 
						|
  highlight default link modula2Synonym modula2PunctuationStyle
 | 
						|
endif
 | 
						|
 | 
						|
" pragmas
 | 
						|
highlight default link modula2Pragma modula2PragmaStyle
 | 
						|
highlight default link modula2DialectTag modula2DialectTagStyle
 | 
						|
 | 
						|
" comments
 | 
						|
highlight default link modula2Comment modula2CommentStyle
 | 
						|
highlight default link modula2CommentKey modula2CommentKeyStyle
 | 
						|
 | 
						|
" technical debt markers
 | 
						|
highlight default link modula2TechDebtMarker modula2TechDebtMarkerStyle
 | 
						|
 | 
						|
" disabled code
 | 
						|
highlight default link modula2DisabledCode modula2DisabledCodeStyle
 | 
						|
 | 
						|
" illegal symbols
 | 
						|
highlight default link modula2IllegalChar Error
 | 
						|
highlight default link modula2IllegalIdent Error
 | 
						|
 | 
						|
 | 
						|
let b:current_syntax = "modula2"
 | 
						|
 | 
						|
" vim: ts=4
 | 
						|
 | 
						|
" END OF FILE
 |