1071d4279SBram Moolenaar" VIM syntax file 2071d4279SBram Moolenaar" Language: nroff/groff 3*dad4473fSBram Moolenaar" Maintainer: John Marshall <[email protected]> 4*dad4473fSBram Moolenaar" Previous Maintainer: Pedro Alejandro López-Valencia <[email protected]> 5*dad4473fSBram Moolenaar" Previous Maintainer: Jérôme Plût <[email protected]> 6*dad4473fSBram Moolenaar" Last Change: 2021 Mar 28 7071d4279SBram Moolenaar" 8071d4279SBram Moolenaar" {{{1 Todo 9071d4279SBram Moolenaar" 10071d4279SBram Moolenaar" TODO: 11071d4279SBram Moolenaar" 12071d4279SBram Moolenaar" * Write syntax highlighting files for the preprocessors, 13071d4279SBram Moolenaar" and integrate with nroff.vim. 14071d4279SBram Moolenaar" 15071d4279SBram Moolenaar" 16071d4279SBram Moolenaar" {{{1 Start syntax highlighting. 17071d4279SBram Moolenaar" 1889bcfda6SBram Moolenaar" quit when a syntax file was already loaded 19071d4279SBram Moolenaar" 2089bcfda6SBram Moolenaarif exists("b:current_syntax") 21071d4279SBram Moolenaar finish 22071d4279SBram Moolenaarendif 23071d4279SBram Moolenaar 24b8ff1fb5SBram Moolenaarlet s:cpo_save = &cpo 25b8ff1fb5SBram Moolenaarset cpo&vim 26b8ff1fb5SBram Moolenaar 27*dad4473fSBram Moolenaarif exists("nroff_is_groff") 28*dad4473fSBram Moolenaar let b:nroff_is_groff = 1 29*dad4473fSBram Moolenaarendif 30*dad4473fSBram Moolenaar 31*dad4473fSBram Moolenaarsyn spell toplevel 32*dad4473fSBram Moolenaarsyn case match 33*dad4473fSBram Moolenaar 34071d4279SBram Moolenaar" 35071d4279SBram Moolenaar" {{{1 plugin settings... 36071d4279SBram Moolenaar" 37071d4279SBram Moolenaar" {{{2 enable spacing error highlighting 38071d4279SBram Moolenaar" 39071d4279SBram Moolenaarif exists("nroff_space_errors") 40071d4279SBram Moolenaar syn match nroffError /\s\+$/ 41071d4279SBram Moolenaar syn match nroffSpaceError /[.,:;!?]\s\{2,}/ 42071d4279SBram Moolenaarendif 43071d4279SBram Moolenaar" 44071d4279SBram Moolenaar" 45071d4279SBram Moolenaar" {{{1 Special file settings 46071d4279SBram Moolenaar" 47071d4279SBram Moolenaar" {{{2 ms exdented paragraphs are not in the default paragraphs list. 48071d4279SBram Moolenaar" 49071d4279SBram Moolenaarsetlocal paragraphs+=XP 50071d4279SBram Moolenaar" 51*dad4473fSBram Moolenaar" {{{2 Activate navigation to preprocessor sections. 52071d4279SBram Moolenaar" 53071d4279SBram Moolenaarif exists("b:preprocs_as_sections") 54071d4279SBram Moolenaar setlocal sections=EQTSPS[\ G1GS 55071d4279SBram Moolenaarendif 56071d4279SBram Moolenaar 57071d4279SBram Moolenaar" {{{1 Escape sequences 58071d4279SBram Moolenaar" ------------------------------------------------------------ 59071d4279SBram Moolenaar 60071d4279SBram Moolenaarsyn match nroffEscChar /\\[CN]/ nextgroup=nroffEscCharArg 61071d4279SBram Moolenaarsyn match nroffEscape /\\[*fgmnYV]/ nextgroup=nroffEscRegPar,nroffEscRegArg 62071d4279SBram Moolenaarsyn match nroffEscape /\\s[+-]\=/ nextgroup=nroffSize 63071d4279SBram Moolenaarsyn match nroffEscape /\\[$AbDhlLRvxXZ]/ nextgroup=nroffEscPar,nroffEscArg 64071d4279SBram Moolenaar 65071d4279SBram Moolenaarsyn match nroffEscRegArg /./ contained 66071d4279SBram Moolenaarsyn match nroffEscRegArg2 /../ contained 67071d4279SBram Moolenaarsyn match nroffEscRegPar /(/ contained nextgroup=nroffEscRegArg2 68071d4279SBram Moolenaarsyn match nroffEscArg /./ contained 69071d4279SBram Moolenaarsyn match nroffEscArg2 /../ contained 70071d4279SBram Moolenaarsyn match nroffEscPar /(/ contained nextgroup=nroffEscArg2 71071d4279SBram Moolenaarsyn match nroffSize /\((\d\)\=\d/ contained 72071d4279SBram Moolenaar 73071d4279SBram Moolenaarsyn region nroffEscCharArg start=/'/ end=/'/ contained 74071d4279SBram Moolenaarsyn region nroffEscArg start=/'/ end=/'/ contained contains=nroffEscape,@nroffSpecial 75071d4279SBram Moolenaar 76071d4279SBram Moolenaarif exists("b:nroff_is_groff") 77071d4279SBram Moolenaar syn region nroffEscRegArg matchgroup=nroffEscape start=/\[/ end=/\]/ contained oneline 78071d4279SBram Moolenaar syn region nroffSize matchgroup=nroffEscape start=/\[/ end=/\]/ contained 79071d4279SBram Moolenaarendif 80071d4279SBram Moolenaar 81071d4279SBram Moolenaarsyn match nroffEscape /\\[adprtu{}]/ 82071d4279SBram Moolenaarsyn match nroffEscape /\\$/ 83071d4279SBram Moolenaarsyn match nroffEscape /\\\$[@*]/ 84071d4279SBram Moolenaar 85071d4279SBram Moolenaar" {{{1 Strings and special characters 86071d4279SBram Moolenaar" ------------------------------------------------------------ 87071d4279SBram Moolenaar 88071d4279SBram Moolenaarsyn match nroffSpecialChar /\\[\\eE?!-]/ 89071d4279SBram Moolenaarsyn match nroffSpace "\\[&%~|^0)/,]" 90071d4279SBram Moolenaarsyn match nroffSpecialChar /\\(../ 91071d4279SBram Moolenaar 92071d4279SBram Moolenaarif exists("b:nroff_is_groff") 93071d4279SBram Moolenaar syn match nroffSpecialChar /\\\[[^]]*]/ 94071d4279SBram Moolenaar syn region nroffPreserve matchgroup=nroffSpecialChar start=/\\?/ end=/\\?/ oneline 95071d4279SBram Moolenaarendif 96071d4279SBram Moolenaar 97071d4279SBram Moolenaarsyn region nroffPreserve matchgroup=nroffSpecialChar start=/\\!/ end=/$/ oneline 98071d4279SBram Moolenaar 99071d4279SBram Moolenaarsyn cluster nroffSpecial contains=nroffSpecialChar,nroffSpace 100071d4279SBram Moolenaar 101071d4279SBram Moolenaar 102071d4279SBram Moolenaarsyn region nroffString start=/"/ end=/"/ skip=/\\$/ contains=nroffEscape,@nroffSpecial contained 103071d4279SBram Moolenaarsyn region nroffString start=/'/ end=/'/ skip=/\\$/ contains=nroffEscape,@nroffSpecial contained 104071d4279SBram Moolenaar 105071d4279SBram Moolenaar 106071d4279SBram Moolenaar" {{{1 Numbers and units 107071d4279SBram Moolenaar" ------------------------------------------------------------ 108071d4279SBram Moolenaarsyn match nroffNumBlock /[0-9.]\a\=/ contained contains=nroffNumber 109071d4279SBram Moolenaarsyn match nroffNumber /\d\+\(\.\d*\)\=/ contained nextgroup=nroffUnit,nroffBadChar 110071d4279SBram Moolenaarsyn match nroffNumber /\.\d\+)/ contained nextgroup=nroffUnit,nroffBadChar 111071d4279SBram Moolenaarsyn match nroffBadChar /./ contained 112071d4279SBram Moolenaarsyn match nroffUnit /[icpPszmnvMu]/ contained 113071d4279SBram Moolenaar 114071d4279SBram Moolenaar 115071d4279SBram Moolenaar" {{{1 Requests 116071d4279SBram Moolenaar" ------------------------------------------------------------ 117071d4279SBram Moolenaar 118071d4279SBram Moolenaar" Requests begin with . or ' at the beginning of a line, or 119071d4279SBram Moolenaar" after .if or .ie. 120071d4279SBram Moolenaar 121071d4279SBram Moolenaarsyn match nroffReqLeader /^[.']/ nextgroup=nroffReqName skipwhite 122071d4279SBram Moolenaarsyn match nroffReqLeader /[.']/ contained nextgroup=nroffReqName skipwhite 123071d4279SBram Moolenaar 124071d4279SBram Moolenaarif exists("b:nroff_is_groff") 125071d4279SBram Moolenaar" 126071d4279SBram Moolenaar" GNU troff allows long request names 127071d4279SBram Moolenaar" 128071d4279SBram Moolenaar syn match nroffReqName /[^\t \\\[?]\+/ contained nextgroup=nroffReqArg 129071d4279SBram Moolenaarelse 130071d4279SBram Moolenaar syn match nroffReqName /[^\t \\\[?]\{1,2}/ contained nextgroup=nroffReqArg 131071d4279SBram Moolenaarendif 132071d4279SBram Moolenaar 1339e54a0e7SBram Moolenaarsyn region nroffReqArg start=/\S/ skip=/\\$/ end=/$/ contained contains=nroffEscape,@nroffSpecial,nroffString,nroffError,nroffSpaceError,nroffNumBlock,nroffComment 134071d4279SBram Moolenaar 135071d4279SBram Moolenaar" {{{2 Conditional: .if .ie .el 136071d4279SBram Moolenaarsyn match nroffReqName /\(if\|ie\)/ contained nextgroup=nroffCond skipwhite 137071d4279SBram Moolenaarsyn match nroffReqName /el/ contained nextgroup=nroffReqLeader skipwhite 138071d4279SBram Moolenaarsyn match nroffCond /\S\+/ contained nextgroup=nroffReqLeader skipwhite 139071d4279SBram Moolenaar 140071d4279SBram Moolenaar" {{{2 String definition: .ds .as 141071d4279SBram Moolenaarsyn match nroffReqname /[da]s/ contained nextgroup=nroffDefIdent skipwhite 142071d4279SBram Moolenaarsyn match nroffDefIdent /\S\+/ contained nextgroup=nroffDefinition skipwhite 143071d4279SBram Moolenaarsyn region nroffDefinition matchgroup=nroffSpecialChar start=/"/ matchgroup=NONE end=/\\"/me=e-2 skip=/\\$/ start=/\S/ end=/$/ contained contains=nroffDefSpecial 144071d4279SBram Moolenaarsyn match nroffDefSpecial /\\$/ contained 145071d4279SBram Moolenaarsyn match nroffDefSpecial /\\\((.\)\=./ contained 146071d4279SBram Moolenaar 147071d4279SBram Moolenaarif exists("b:nroff_is_groff") 148071d4279SBram Moolenaar syn match nroffDefSpecial /\\\[[^]]*]/ contained 149071d4279SBram Moolenaarendif 150071d4279SBram Moolenaar 151071d4279SBram Moolenaar" {{{2 Macro definition: .de .am, also diversion: .di 152071d4279SBram Moolenaarsyn match nroffReqName /\(d[ei]\|am\)/ contained nextgroup=nroffIdent skipwhite 153071d4279SBram Moolenaarsyn match nroffIdent /[^[?( \t]\+/ contained 154071d4279SBram Moolenaarif exists("b:nroff_is_groff") 155071d4279SBram Moolenaar syn match nroffReqName /als/ contained nextgroup=nroffIdent skipwhite 156071d4279SBram Moolenaarendif 157071d4279SBram Moolenaar 158071d4279SBram Moolenaar" {{{2 Register definition: .rn .rr 159071d4279SBram Moolenaarsyn match nroffReqName /[rn]r/ contained nextgroup=nroffIdent skipwhite 160071d4279SBram Moolenaarif exists("b:nroff_is_groff") 161071d4279SBram Moolenaar syn match nroffReqName /\(rnn\|aln\)/ contained nextgroup=nroffIdent skipwhite 162071d4279SBram Moolenaarendif 163071d4279SBram Moolenaar 164071d4279SBram Moolenaar 165071d4279SBram Moolenaar" {{{1 eqn/tbl/pic 166071d4279SBram Moolenaar" ------------------------------------------------------------ 167071d4279SBram Moolenaar" <jp> 168071d4279SBram Moolenaar" XXX: write proper syntax highlight for eqn / tbl / pic ? 169071d4279SBram Moolenaar" <jp /> 170071d4279SBram Moolenaar 171071d4279SBram Moolenaarsyn region nroffEquation start=/^\.\s*EQ\>/ end=/^\.\s*EN\>/ 172*dad4473fSBram Moolenaarsyn region nroffTable start=/^\.\s*TS\>/ end=/^\.\s*TE\>/ contains=@Spell 173071d4279SBram Moolenaarsyn region nroffPicture start=/^\.\s*PS\>/ end=/^\.\s*PE\>/ 174*dad4473fSBram Moolenaarsyn region nroffRefer start=/^\.\s*\[\>/ end=/^\.\s*\]\>/ contains=@Spell 175071d4279SBram Moolenaarsyn region nroffGrap start=/^\.\s*G1\>/ end=/^\.\s*G2\>/ 176071d4279SBram Moolenaarsyn region nroffGremlin start=/^\.\s*GS\>/ end=/^\.\s*GE|GF\>/ 177071d4279SBram Moolenaar 178071d4279SBram Moolenaar" {{{1 Comments 179071d4279SBram Moolenaar" ------------------------------------------------------------ 180071d4279SBram Moolenaar 181071d4279SBram Moolenaarsyn region nroffIgnore start=/^[.']\s*ig/ end=/^['.]\s*\./ 182*dad4473fSBram Moolenaarsyn match nroffComment /\(^[.']\s*\)\=\\".*/ contains=nroffTodo,@Spell 183*dad4473fSBram Moolenaarsyn match nroffComment /^'''.*/ contains=nroffTodo,@Spell 184071d4279SBram Moolenaar 185071d4279SBram Moolenaarif exists("b:nroff_is_groff") 186*dad4473fSBram Moolenaar syn match nroffComment "\\#.*$" contains=nroffTodo,@Spell 187071d4279SBram Moolenaarendif 188071d4279SBram Moolenaar 189071d4279SBram Moolenaarsyn keyword nroffTodo TODO XXX FIXME contained 190071d4279SBram Moolenaar 191071d4279SBram Moolenaar" {{{1 Hilighting 192071d4279SBram Moolenaar" ------------------------------------------------------------ 193071d4279SBram Moolenaar" 194071d4279SBram Moolenaar 195071d4279SBram Moolenaar" 196071d4279SBram Moolenaar" Define the default highlighting. 19789bcfda6SBram Moolenaar" Only when an item doesn't have highlighting yet 198071d4279SBram Moolenaar" 199071d4279SBram Moolenaar 200f37506f6SBram Moolenaarhi def link nroffEscChar nroffSpecialChar 201*dad4473fSBram Moolenaarhi def link nroffEscCharArg nroffSpecialChar 202f37506f6SBram Moolenaarhi def link nroffSpecialChar SpecialChar 203f37506f6SBram Moolenaarhi def link nroffSpace Delimiter 204071d4279SBram Moolenaar 205f37506f6SBram Moolenaarhi def link nroffEscRegArg2 nroffEscRegArg 206f37506f6SBram Moolenaarhi def link nroffEscRegArg nroffIdent 207071d4279SBram Moolenaar 208f37506f6SBram Moolenaarhi def link nroffEscArg2 nroffEscArg 209f37506f6SBram Moolenaarhi def link nroffEscPar nroffEscape 210071d4279SBram Moolenaar 211f37506f6SBram Moolenaarhi def link nroffEscRegPar nroffEscape 212f37506f6SBram Moolenaarhi def link nroffEscArg nroffEscape 213f37506f6SBram Moolenaarhi def link nroffSize nroffEscape 214*dad4473fSBram Moolenaarhi def link nroffEscape PreProc 215071d4279SBram Moolenaar 216f37506f6SBram Moolenaarhi def link nroffIgnore Comment 217f37506f6SBram Moolenaarhi def link nroffComment Comment 218f37506f6SBram Moolenaarhi def link nroffTodo Todo 219071d4279SBram Moolenaar 220f37506f6SBram Moolenaarhi def link nroffReqLeader nroffRequest 221f37506f6SBram Moolenaarhi def link nroffReqName nroffRequest 222f37506f6SBram Moolenaarhi def link nroffRequest Statement 223f37506f6SBram Moolenaarhi def link nroffCond PreCondit 224f37506f6SBram Moolenaarhi def link nroffDefIdent nroffIdent 225f37506f6SBram Moolenaarhi def link nroffIdent Identifier 226071d4279SBram Moolenaar 227f37506f6SBram Moolenaarhi def link nroffEquation PreProc 228f37506f6SBram Moolenaarhi def link nroffTable PreProc 229f37506f6SBram Moolenaarhi def link nroffPicture PreProc 230f37506f6SBram Moolenaarhi def link nroffRefer PreProc 231f37506f6SBram Moolenaarhi def link nroffGrap PreProc 232f37506f6SBram Moolenaarhi def link nroffGremlin PreProc 233071d4279SBram Moolenaar 234f37506f6SBram Moolenaarhi def link nroffNumber Number 235f37506f6SBram Moolenaarhi def link nroffBadChar nroffError 236f37506f6SBram Moolenaarhi def link nroffSpaceError nroffError 237f37506f6SBram Moolenaarhi def link nroffError Error 238071d4279SBram Moolenaar 239f37506f6SBram Moolenaarhi def link nroffPreserve String 240f37506f6SBram Moolenaarhi def link nroffString String 241f37506f6SBram Moolenaarhi def link nroffDefinition String 242f37506f6SBram Moolenaarhi def link nroffDefSpecial Special 243071d4279SBram Moolenaar 244071d4279SBram Moolenaar 245071d4279SBram Moolenaarlet b:current_syntax = "nroff" 246071d4279SBram Moolenaar 247b8ff1fb5SBram Moolenaarlet &cpo = s:cpo_save 248b8ff1fb5SBram Moolenaarunlet s:cpo_save 249071d4279SBram Moolenaar" vim600: set fdm=marker fdl=2: 250