mirror of
https://github.com/neovim/neovim.git
synced 2025-12-09 08:02:38 +00:00
Problem: filetype: Erlang lexical files are not recognized
Solution: Detect *.xrl files as leex filetype, include syntax and
filetype plugins (Jon Parise).
leex is the lexical analyzer generator for Erlang. Its input file format
follows a section-based structure and uses the `.xrl` file extension.
This initial work includes file detection, an ftplugin (which inherits
the Erlang configuration), and a syntax definition.
Reference:
- https://www.erlang.org/doc/apps/parsetools/leex.html
related: vim/vim#18819
closes: vim/vim#18832
b087c5452b
Co-authored-by: Jon Parise <jon@indelible.org>
64 lines
2.6 KiB
VimL
64 lines
2.6 KiB
VimL
" Vim syntax file
|
|
" Language: Leex (Erlang Lexical Analyzer Generator)
|
|
" Maintainer: Jon Parise <jon@indelible.org>
|
|
" Last Change: 2025 Nov 30
|
|
" Filenames: *.xrl
|
|
"
|
|
" References:
|
|
" - https://www.erlang.org/doc/apps/parsetools/leex.html
|
|
|
|
if exists('b:current_syntax')
|
|
finish
|
|
endif
|
|
|
|
syn include @leexErlang syntax/erlang.vim
|
|
unlet! b:current_syntax
|
|
|
|
syn match leexComment "%.*$" contains=@Spell display
|
|
|
|
syn match leexRegexOperator "[|*+?]" contained display
|
|
syn match leexRegexDelimiter "[()[\]]" contained display
|
|
syn match leexRegexSpecial "[.^$\\]" contained display
|
|
syn match leexRegexEscape '\\\%([bfnrtevsd]\|\o\{1,3}\|x\x\{2}\|x{\x\+}\|.\)' contained display
|
|
syn match leexRegexRange "\[[^\]]*\]" contains=leexRegexDelimiter,leexRegexEscape contained display
|
|
|
|
" Macro definitions: NAME = VALUE
|
|
syn match leexMacroName "^\s*\zs\h\w*\ze\s\+=\s\+" contained nextgroup=leexMacroEquals skipwhite display
|
|
syn match leexMacroEquals "=" contained nextgroup=leexMacroValue skipwhite display
|
|
syn match leexMacroValue "\S\+" contained contains=leexRegexOperator,leexRegexDelimiter,leexRegexSpecial,leexRegexEscape,leexRegexRange,leexMacroRef display
|
|
syn match leexMacroRef "{\h\w*}" contained display
|
|
|
|
" Rule definitions: <Regexp> : <Erlang code>.
|
|
syn match leexRuleRegex "^\s*\zs[^%].\{-}\ze\s\+:" contained contains=leexRegexOperator,leexRegexDelimiter,leexRegexSpecial,leexRegexEscape,leexRegexRange,leexMacroRef nextgroup=leexRuleColon skipwhite display
|
|
syn match leexRuleColon ":" contained nextgroup=leexRuleCode skipwhite skipnl display
|
|
syn region leexRuleCode start="" end="\.\s*\%(%.*\)\?$" skip="^\s*%.*$" contained contains=@leexErlang keepend skipnl skipwhite
|
|
|
|
" Sections
|
|
syn match leexHeading "^\%(Definitions\|Rules\|Erlang code\)\.$" contained display
|
|
syn region leexDefinitions start="^Definitions\.$" end="^[A-Z][A-Za-z ]*\.$"me=s-1 end="\%$" keepend fold
|
|
\ contains=leexHeading,leexComment,leexMacroName
|
|
syn region leexRules start="^Rules\.$" end="^[A-Z][A-Za-z ]*\.$"me=s-1 end="\%$" keepend fold
|
|
\ contains=leexHeading,leexComment,leexRuleRegex
|
|
syn region leexErlangCode start="^Erlang code\.$" end="^[A-Z][A-Za-z ]*\.$"me=s-1 end="\%$" keepend fold
|
|
\ contains=leexHeading,@leexErlang
|
|
|
|
hi def link leexComment Comment
|
|
hi def link leexHeading PreProc
|
|
|
|
hi def link leexRegexOperator Operator
|
|
hi def link leexRegexDelimiter Delimiter
|
|
hi def link leexRegexSpecial Special
|
|
hi def link leexRegexRange String
|
|
hi def link leexRegexEscape SpecialChar
|
|
|
|
hi def link leexMacroName Identifier
|
|
hi def link leexMacroEquals Operator
|
|
hi def link leexMacroValue String
|
|
hi def link leexMacroRef Macro
|
|
|
|
hi def link leexRuleColon Operator
|
|
|
|
syn sync fromstart
|
|
|
|
let b:current_syntax = 'leex'
|