1" Vim syntax file 2" Language: R (GNU S) 3" Maintainer: Jakson Aquino <[email protected]> 4" Former Maintainers: Vaidotas Zemlys <[email protected]> 5" Tom Payne <[email protected]> 6" Contributor: Johannes Ranke <[email protected]> 7" Homepage: https://github.com/jalvesaq/R-Vim-runtime 8" Last Change: Sun Mar 28, 2021 01:47PM 9" Filenames: *.R *.r *.Rhistory *.Rt 10" 11" NOTE: The highlighting of R functions might be defined in 12" runtime files created by a filetype plugin, if installed. 13" 14" CONFIGURATION: 15" Syntax folding can be turned on by 16" 17" let r_syntax_folding = 1 18" 19" ROxygen highlighting can be turned off by 20" 21" let r_syntax_hl_roxygen = 0 22" 23" Some lines of code were borrowed from Zhuojun Chen. 24 25if exists("b:current_syntax") 26 finish 27endif 28 29if has("patch-7.4.1142") 30 syn iskeyword @,48-57,_,. 31else 32 setlocal iskeyword=@,48-57,_,. 33endif 34 35" The variables g:r_hl_roxygen and g:r_syn_minlines were renamed on April 8, 2017. 36if exists("g:r_hl_roxygen") 37 let g:r_syntax_hl_roxygen = g:r_hl_roxygen 38endif 39if exists("g:r_syn_minlines") 40 let g:r_syntax_minlines = g:r_syn_minlines 41endif 42 43if exists("g:r_syntax_folding") && g:r_syntax_folding 44 setlocal foldmethod=syntax 45endif 46 47let g:r_syntax_hl_roxygen = get(g:, 'r_syntax_hl_roxygen', 1) 48 49syn case match 50 51" Comment 52syn match rCommentTodo contained "\(BUG\|FIXME\|NOTE\|TODO\):" 53syn match rTodoParen contained "\(BUG\|FIXME\|NOTE\|TODO\)\s*(.\{-})\s*:" contains=rTodoKeyw,rTodoInfo transparent 54syn keyword rTodoKeyw BUG FIXME NOTE TODO contained 55syn match rTodoInfo "(\zs.\{-}\ze)" contained 56syn match rComment contains=@Spell,rCommentTodo,rTodoParen "#.*" 57 58" Roxygen 59if g:r_syntax_hl_roxygen 60 " A roxygen block can start at the beginning of a file (first version) and 61 " after a blank line (second version). It ends when a line appears that does not 62 " contain a roxygen comment. In the following comments, any line containing 63 " a roxygen comment marker (one or two hash signs # followed by a single 64 " quote ' and preceded only by whitespace) is called a roxygen line. A 65 " roxygen line containing only a roxygen comment marker, optionally followed 66 " by whitespace is called an empty roxygen line. 67 68 " First we match all roxygen blocks as containing only a title. In case an 69 " empty roxygen line ending the title or a tag is found, this will be 70 " overridden later by the definitions of rOBlock. 71 syn match rOTitleBlock "\%^\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag 72 syn match rOTitleBlock "^\s*\n\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag 73 74 " A title as part of a block is always at the beginning of the block, i.e. 75 " either at the start of a file or after a completely empty line. 76 syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag 77 syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag 78 syn match rOTitleTag contained "@title" 79 80 " When a roxygen block has a title and additional content, the title 81 " consists of one or more roxygen lines (as little as possible are matched), 82 " followed either by an empty roxygen line 83 syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 84 syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 85 86 " or by a roxygen tag (we match everything starting with @ but not @@ which is used as escape sequence for a literal @). 87 syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 88 syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 89 90 " If a block contains an @rdname, @describeIn tag, it may have paragraph breaks, but does not have a title 91 syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold 92 syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold 93 syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold 94 syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold 95 96 syn match rOCommentKey "^\s*#\{1,2}'" contained 97 syn region rOExamples start="^\s*#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold 98 99 " R6 classes may contain roxygen lines independent of roxygen blocks 100 syn region rOR6Class start=/R6Class(/ end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold 101 syn match rOR6Block "#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained 102 syn match rOR6Block "^\s*#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained 103 104 " rOTag list originally generated from the lists that were available in 105 " https://github.com/klutometis/roxygen/R/rd.R and 106 " https://github.com/klutometis/roxygen/R/namespace.R 107 " using s/^ \([A-Za-z0-9]*\) = .*/ syn match rOTag contained "@\1"/ 108 " Plus we need the @include tag 109 110 " rd.R 111 syn match rOTag contained "@aliases" 112 syn match rOTag contained "@author" 113 syn match rOTag contained "@backref" 114 syn match rOTag contained "@concept" 115 syn match rOTag contained "@describeIn" 116 syn match rOTag contained "@description" 117 syn match rOTag contained "@details" 118 syn match rOTag contained "@docType" 119 syn match rOTag contained "@encoding" 120 syn match rOTag contained "@evalRd" 121 syn match rOTag contained "@example" 122 syn match rOTag contained "@examples" 123 syn match rOTag contained "@family" 124 syn match rOTag contained "@field" 125 syn match rOTag contained "@format" 126 syn match rOTag contained "@inherit" 127 syn match rOTag contained "@inheritParams" 128 syn match rOTag contained "@inheritDotParams" 129 syn match rOTag contained "@inheritSection" 130 syn match rOTag contained "@keywords" 131 syn match rOTag contained "@method" 132 syn match rOTag contained "@name" 133 syn match rOTag contained "@md" 134 syn match rOTag contained "@noMd" 135 syn match rOTag contained "@noRd" 136 syn match rOTag contained "@note" 137 syn match rOTag contained "@param" 138 syn match rOTag contained "@rdname" 139 syn match rOTag contained "@rawRd" 140 syn match rOTag contained "@references" 141 syn match rOTag contained "@return" 142 syn match rOTag contained "@section" 143 syn match rOTag contained "@seealso" 144 syn match rOTag contained "@slot" 145 syn match rOTag contained "@source" 146 syn match rOTag contained "@template" 147 syn match rOTag contained "@templateVar" 148 syn match rOTag contained "@title" 149 syn match rOTag contained "@usage" 150 " namespace.R 151 syn match rOTag contained "@export" 152 syn match rOTag contained "@exportClass" 153 syn match rOTag contained "@exportMethod" 154 syn match rOTag contained "@exportPattern" 155 syn match rOTag contained "@import" 156 syn match rOTag contained "@importClassesFrom" 157 syn match rOTag contained "@importFrom" 158 syn match rOTag contained "@importMethodsFrom" 159 syn match rOTag contained "@rawNamespace" 160 syn match rOTag contained "@S3method" 161 syn match rOTag contained "@useDynLib" 162 " other 163 syn match rOTag contained "@eval" 164 syn match rOTag contained "@include" 165 syn match rOTag contained "@includeRmd" 166 syn match rOTag contained "@order" 167endif 168 169 170if &filetype == "rhelp" 171 " string enclosed in double quotes 172 syn region rString contains=rSpecial,@Spell start=/"/ skip=/\\\\\|\\"/ end=/"/ 173 " string enclosed in single quotes 174 syn region rString contains=rSpecial,@Spell start=/'/ skip=/\\\\\|\\'/ end=/'/ 175else 176 " string enclosed in double quotes 177 syn region rString contains=rSpecial,rStrError,@Spell start=/"/ skip=/\\\\\|\\"/ end=/"/ 178 " string enclosed in single quotes 179 syn region rString contains=rSpecial,rStrError,@Spell start=/'/ skip=/\\\\\|\\'/ end=/'/ 180endif 181 182syn match rStrError display contained "\\." 183 184 185" New line, carriage return, tab, backspace, bell, feed, vertical tab, backslash 186syn match rSpecial display contained "\\\(n\|r\|t\|b\|a\|f\|v\|'\|\"\)\|\\\\" 187 188" Hexadecimal and Octal digits 189syn match rSpecial display contained "\\\(x\x\{1,2}\|[0-8]\{1,3}\)" 190 191" Unicode characters 192syn match rSpecial display contained "\\u\x\{1,4}" 193syn match rSpecial display contained "\\U\x\{1,8}" 194syn match rSpecial display contained "\\u{\x\{1,4}}" 195syn match rSpecial display contained "\\U{\x\{1,8}}" 196 197" Raw string 198syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\)(/ end=/)\z2\z1/ keepend 199syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\){/ end=/}\z2\z1/ keepend 200syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\)\[/ end=/\]\z2\z1/ keepend 201 202" Statement 203syn keyword rStatement break next return 204syn keyword rConditional if else 205syn keyword rRepeat for in repeat while 206 207" Constant (not really) 208syn keyword rConstant T F LETTERS letters month.abb month.name pi 209syn keyword rConstant R.version.string 210 211syn keyword rNumber NA_integer_ NA_real_ NA_complex_ NA_character_ 212 213" Constants 214syn keyword rConstant NULL 215syn keyword rBoolean FALSE TRUE 216syn keyword rNumber NA Inf NaN 217 218" integer 219syn match rInteger "\<\d\+L" 220syn match rInteger "\<0x\([0-9]\|[a-f]\|[A-F]\)\+L" 221syn match rInteger "\<\d\+[Ee]+\=\d\+L" 222 223" number with no fractional part or exponent 224syn match rNumber "\<\d\+\>" 225" hexadecimal number 226syn match rNumber "\<0x\([0-9]\|[a-f]\|[A-F]\)\+" 227 228" floating point number with integer and fractional parts and optional exponent 229syn match rFloat "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\=" 230" floating point number with no integer part and optional exponent 231syn match rFloat "\<\.\d\+\([Ee][-+]\=\d\+\)\=" 232" floating point number with no fractional part and optional exponent 233syn match rFloat "\<\d\+[Ee][-+]\=\d\+" 234 235" complex number 236syn match rComplex "\<\d\+i" 237syn match rComplex "\<\d\++\d\+i" 238syn match rComplex "\<0x\([0-9]\|[a-f]\|[A-F]\)\+i" 239syn match rComplex "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\=i" 240syn match rComplex "\<\.\d\+\([Ee][-+]\=\d\+\)\=i" 241syn match rComplex "\<\d\+[Ee][-+]\=\d\+i" 242 243syn match rAssign '=' 244syn match rOperator "&" 245syn match rOperator '-' 246syn match rOperator '\*' 247syn match rOperator '+' 248if &filetype != "rmd" && &filetype != "rrst" 249 syn match rOperator "[|!<>^~/:]" 250else 251 syn match rOperator "[|!<>^~`/:]" 252endif 253syn match rOperator "%\{2}\|%\S\{-}%" 254syn match rOperator '\([!><]\)\@<==' 255syn match rOperator '==' 256syn match rOpError '\*\{3}' 257syn match rOpError '//' 258syn match rOpError '&&&' 259syn match rOpError '|||' 260syn match rOpError '<<' 261syn match rOpError '>>' 262 263syn match rAssign "<\{1,2}-" 264syn match rAssign "->\{1,2}" 265 266" Special 267syn match rDelimiter "[,;:]" 268 269" Error 270if exists("g:r_syntax_folding") 271 syn region rRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold 272 syn region rRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError fold 273 syn region rRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError fold 274 syn region rSection matchgroup=Title start=/^#.*[-=#]\{4,}/ end=/^#.*[-=#]\{4,}/ms=s-2,me=s-1 transparent contains=ALL fold 275else 276 syn region rRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError 277 syn region rRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError 278 syn region rRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError 279endif 280 281syn match rError "[)\]}]" 282syn match rBraceError "[)}]" contained 283syn match rCurlyError "[)\]]" contained 284syn match rParenError "[\]}]" contained 285 286" Use Nvim-R to highlight functions dynamically if it is installed 287if !exists("g:r_syntax_fun_pattern") 288 let s:ff = split(substitute(globpath(&rtp, "R/functions.vim"), "functions.vim", "", "g"), "\n") 289 if len(s:ff) > 0 290 let g:r_syntax_fun_pattern = 0 291 else 292 let g:r_syntax_fun_pattern = 1 293 endif 294endif 295 296" Only use Nvim-R to highlight functions if they should not be highlighted 297" according to a generic pattern 298if g:r_syntax_fun_pattern == 1 299 syn match rFunction '[0-9a-zA-Z_\.]\+\s*\ze(' 300else 301 " Nvim-R: 302 runtime R/functions.vim 303endif 304 305syn match rDollar display contained "\$" 306syn match rDollar display contained "@" 307 308" List elements will not be highlighted as functions: 309syn match rLstElmt "\$[a-zA-Z0-9\\._]*" contains=rDollar 310syn match rLstElmt "@[a-zA-Z0-9\\._]*" contains=rDollar 311 312" Functions that may add new objects 313syn keyword rPreProc library require attach detach source 314 315if &filetype == "rhelp" 316 syn match rHelpIdent '\\method' 317 syn match rHelpIdent '\\S4method' 318endif 319 320" Type 321syn keyword rType array category character complex double function integer list logical matrix numeric vector data.frame 322 323" Name of object with spaces 324if &filetype != "rmd" && &filetype != "rrst" 325 syn region rNameWSpace start="`" end="`" contains=rSpaceFun 326endif 327 328if &filetype == "rhelp" 329 syn match rhPreProc "^#ifdef.*" 330 syn match rhPreProc "^#endif.*" 331 syn match rhSection "\\dontrun\>" 332endif 333 334if exists("r_syntax_minlines") 335 exe "syn sync minlines=" . r_syntax_minlines 336else 337 syn sync minlines=40 338endif 339 340" Define the default highlighting. 341hi def link rAssign Statement 342hi def link rBoolean Boolean 343hi def link rBraceError Error 344hi def link rComment Comment 345hi def link rTodoParen Comment 346hi def link rTodoInfo SpecialComment 347hi def link rCommentTodo Todo 348hi def link rTodoKeyw Todo 349hi def link rComplex Number 350hi def link rConditional Conditional 351hi def link rConstant Constant 352hi def link rCurlyError Error 353hi def link rDelimiter Delimiter 354hi def link rDollar SpecialChar 355hi def link rError Error 356hi def link rFloat Float 357hi def link rFunction Function 358hi def link rSpaceFun Function 359hi def link rHelpIdent Identifier 360hi def link rhPreProc PreProc 361hi def link rhSection PreCondit 362hi def link rInteger Number 363hi def link rLstElmt Normal 364hi def link rNameWSpace Normal 365hi def link rNumber Number 366hi def link rOperator Operator 367hi def link rOpError Error 368hi def link rParenError Error 369hi def link rPreProc PreProc 370hi def link rRawString String 371hi def link rRawStrDelim Delimiter 372hi def link rRepeat Repeat 373hi def link rSpecial SpecialChar 374hi def link rStatement Statement 375hi def link rString String 376hi def link rStrError Error 377hi def link rType Type 378if g:r_syntax_hl_roxygen 379 hi def link rOTitleTag Operator 380 hi def link rOTag Operator 381 hi def link rOTitleBlock Title 382 hi def link rOBlock Comment 383 hi def link rOBlockNoTitle Comment 384 hi def link rOR6Block Comment 385 hi def link rOTitle Title 386 hi def link rOCommentKey Comment 387 hi def link rOExamples SpecialComment 388endif 389 390let b:current_syntax="r" 391 392" vim: ts=8 sw=2 393