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: Wed Aug 01, 2018 10:10PM 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,rOBlock "#.*" 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 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 " When a roxygen block has a title and additional content, the title 75 " consists of one or more roxygen lines (as little as possible are matched), 76 " followed either by an empty roxygen line 77 syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 78 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 79 80 " or by a roxygen tag (we match everything starting with @ but not @@ which is used as escape sequence for a literal @). 81 syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 82 syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold 83 84 " If a block contains an @rdname, @describeIn tag, it may have paragraph breaks, but does not have a title 85 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 86 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 87 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 88 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 89 90 " A title as part of a block is always at the beginning of the block, i.e. 91 " either at the start of a file or after a completely empty line. 92 syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag 93 syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag 94 syn match rOTitleTag contained "@title" 95 96 syn match rOCommentKey "^\s*#\{1,2}'" contained 97 syn region rOExamples start="^#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold 98 99 " rOTag list generated from the lists in 100 " https://github.com/klutometis/roxygen/R/rd.R and 101 " https://github.com/klutometis/roxygen/R/namespace.R 102 " using s/^ \([A-Za-z0-9]*\) = .*/ syn match rOTag contained "@\1"/ 103 " Plus we need the @include tag 104 105 " rd.R 106 syn match rOTag contained "@aliases" 107 syn match rOTag contained "@author" 108 syn match rOTag contained "@backref" 109 syn match rOTag contained "@concept" 110 syn match rOTag contained "@describeIn" 111 syn match rOTag contained "@description" 112 syn match rOTag contained "@details" 113 syn match rOTag contained "@docType" 114 syn match rOTag contained "@encoding" 115 syn match rOTag contained "@evalRd" 116 syn match rOTag contained "@example" 117 syn match rOTag contained "@examples" 118 syn match rOTag contained "@family" 119 syn match rOTag contained "@field" 120 syn match rOTag contained "@format" 121 syn match rOTag contained "@inherit" 122 syn match rOTag contained "@inheritParams" 123 syn match rOTag contained "@inheritDotParams" 124 syn match rOTag contained "@inheritSection" 125 syn match rOTag contained "@keywords" 126 syn match rOTag contained "@method" 127 syn match rOTag contained "@name" 128 syn match rOTag contained "@md" 129 syn match rOTag contained "@noMd" 130 syn match rOTag contained "@noRd" 131 syn match rOTag contained "@note" 132 syn match rOTag contained "@param" 133 syn match rOTag contained "@rdname" 134 syn match rOTag contained "@rawRd" 135 syn match rOTag contained "@references" 136 syn match rOTag contained "@return" 137 syn match rOTag contained "@section" 138 syn match rOTag contained "@seealso" 139 syn match rOTag contained "@slot" 140 syn match rOTag contained "@source" 141 syn match rOTag contained "@template" 142 syn match rOTag contained "@templateVar" 143 syn match rOTag contained "@title" 144 syn match rOTag contained "@usage" 145 " namespace.R 146 syn match rOTag contained "@export" 147 syn match rOTag contained "@exportClass" 148 syn match rOTag contained "@exportMethod" 149 syn match rOTag contained "@exportPattern" 150 syn match rOTag contained "@import" 151 syn match rOTag contained "@importClassesFrom" 152 syn match rOTag contained "@importFrom" 153 syn match rOTag contained "@importMethodsFrom" 154 syn match rOTag contained "@rawNamespace" 155 syn match rOTag contained "@S3method" 156 syn match rOTag contained "@useDynLib" 157 " other 158 syn match rOTag contained "@include" 159endif 160 161 162if &filetype == "rhelp" 163 " string enclosed in double quotes 164 syn region rString contains=rSpecial,@Spell start=/"/ skip=/\\\\\|\\"/ end=/"/ 165 " string enclosed in single quotes 166 syn region rString contains=rSpecial,@Spell start=/'/ skip=/\\\\\|\\'/ end=/'/ 167else 168 " string enclosed in double quotes 169 syn region rString contains=rSpecial,rStrError,@Spell start=/"/ skip=/\\\\\|\\"/ end=/"/ 170 " string enclosed in single quotes 171 syn region rString contains=rSpecial,rStrError,@Spell start=/'/ skip=/\\\\\|\\'/ end=/'/ 172endif 173 174syn match rStrError display contained "\\." 175 176 177" New line, carriage return, tab, backspace, bell, feed, vertical tab, backslash 178syn match rSpecial display contained "\\\(n\|r\|t\|b\|a\|f\|v\|'\|\"\)\|\\\\" 179 180" Hexadecimal and Octal digits 181syn match rSpecial display contained "\\\(x\x\{1,2}\|[0-8]\{1,3}\)" 182 183" Unicode characters 184syn match rSpecial display contained "\\u\x\{1,4}" 185syn match rSpecial display contained "\\U\x\{1,8}" 186syn match rSpecial display contained "\\u{\x\{1,4}}" 187syn match rSpecial display contained "\\U{\x\{1,8}}" 188 189" Statement 190syn keyword rStatement break next return 191syn keyword rConditional if else 192syn keyword rRepeat for in repeat while 193 194" Constant (not really) 195syn keyword rConstant T F LETTERS letters month.abb month.name pi 196syn keyword rConstant R.version.string 197 198syn keyword rNumber NA_integer_ NA_real_ NA_complex_ NA_character_ 199 200" Constants 201syn keyword rConstant NULL 202syn keyword rBoolean FALSE TRUE 203syn keyword rNumber NA Inf NaN 204 205" integer 206syn match rInteger "\<\d\+L" 207syn match rInteger "\<0x\([0-9]\|[a-f]\|[A-F]\)\+L" 208syn match rInteger "\<\d\+[Ee]+\=\d\+L" 209 210" number with no fractional part or exponent 211syn match rNumber "\<\d\+\>" 212" hexadecimal number 213syn match rNumber "\<0x\([0-9]\|[a-f]\|[A-F]\)\+" 214 215" floating point number with integer and fractional parts and optional exponent 216syn match rFloat "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\=" 217" floating point number with no integer part and optional exponent 218syn match rFloat "\<\.\d\+\([Ee][-+]\=\d\+\)\=" 219" floating point number with no fractional part and optional exponent 220syn match rFloat "\<\d\+[Ee][-+]\=\d\+" 221 222" complex number 223syn match rComplex "\<\d\+i" 224syn match rComplex "\<\d\++\d\+i" 225syn match rComplex "\<0x\([0-9]\|[a-f]\|[A-F]\)\+i" 226syn match rComplex "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\=i" 227syn match rComplex "\<\.\d\+\([Ee][-+]\=\d\+\)\=i" 228syn match rComplex "\<\d\+[Ee][-+]\=\d\+i" 229 230syn match rAssign '=' 231syn match rOperator "&" 232syn match rOperator '-' 233syn match rOperator '\*' 234syn match rOperator '+' 235if &filetype != "rmd" && &filetype != "rrst" 236 syn match rOperator "[|!<>^~/:]" 237else 238 syn match rOperator "[|!<>^~`/:]" 239endif 240syn match rOperator "%\{2}\|%\S\{-}%" 241syn match rOperator '\([!><]\)\@<==' 242syn match rOperator '==' 243syn match rOpError '\*\{3}' 244syn match rOpError '//' 245syn match rOpError '&&&' 246syn match rOpError '|||' 247syn match rOpError '<<' 248syn match rOpError '>>' 249 250syn match rAssign "<\{1,2}-" 251syn match rAssign "->\{1,2}" 252 253" Special 254syn match rDelimiter "[,;:]" 255 256" Error 257if exists("g:r_syntax_folding") 258 syn region rRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold 259 syn region rRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError fold 260 syn region rRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError fold 261 syn region rSection matchgroup=Title start=/^#.*[-=#]\{4,}/ end=/^#.*[-=#]\{4,}/ms=s-2,me=s-1 transparent contains=ALL fold 262else 263 syn region rRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError 264 syn region rRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError 265 syn region rRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError 266endif 267 268syn match rError "[)\]}]" 269syn match rBraceError "[)}]" contained 270syn match rCurlyError "[)\]]" contained 271syn match rParenError "[\]}]" contained 272 273" Use Nvim-R to highlight functions dynamically if it is installed 274if !exists("g:r_syntax_fun_pattern") 275 let s:ff = split(substitute(globpath(&rtp, "R/functions.vim"), "functions.vim", "", "g"), "\n") 276 if len(s:ff) > 0 277 let g:r_syntax_fun_pattern = 0 278 else 279 let g:r_syntax_fun_pattern = 1 280 endif 281endif 282 283" Only use Nvim-R to highlight functions if they should not be highlighted 284" according to a generic pattern 285if g:r_syntax_fun_pattern == 1 286 syn match rFunction '[0-9a-zA-Z_\.]\+\s*\ze(' 287else 288 " Nvim-R: 289 runtime R/functions.vim 290endif 291 292syn match rDollar display contained "\$" 293syn match rDollar display contained "@" 294 295" List elements will not be highlighted as functions: 296syn match rLstElmt "\$[a-zA-Z0-9\\._]*" contains=rDollar 297syn match rLstElmt "@[a-zA-Z0-9\\._]*" contains=rDollar 298 299" Functions that may add new objects 300syn keyword rPreProc library require attach detach source 301 302if &filetype == "rhelp" 303 syn match rHelpIdent '\\method' 304 syn match rHelpIdent '\\S4method' 305endif 306 307" Type 308syn keyword rType array category character complex double function integer list logical matrix numeric vector data.frame 309 310" Name of object with spaces 311if &filetype != "rmd" && &filetype != "rrst" 312 syn region rNameWSpace start="`" end="`" contains=rSpaceFun 313endif 314 315if &filetype == "rhelp" 316 syn match rhPreProc "^#ifdef.*" 317 syn match rhPreProc "^#endif.*" 318 syn match rhSection "\\dontrun\>" 319endif 320 321if exists("r_syntax_minlines") 322 exe "syn sync minlines=" . r_syntax_minlines 323else 324 syn sync minlines=40 325endif 326 327" Define the default highlighting. 328hi def link rAssign Statement 329hi def link rBoolean Boolean 330hi def link rBraceError Error 331hi def link rComment Comment 332hi def link rTodoParen Comment 333hi def link rTodoInfo SpecialComment 334hi def link rCommentTodo Todo 335hi def link rTodoKeyw Todo 336hi def link rComplex Number 337hi def link rConditional Conditional 338hi def link rConstant Constant 339hi def link rCurlyError Error 340hi def link rDelimiter Delimiter 341hi def link rDollar SpecialChar 342hi def link rError Error 343hi def link rFloat Float 344hi def link rFunction Function 345hi def link rSpaceFun Function 346hi def link rHelpIdent Identifier 347hi def link rhPreProc PreProc 348hi def link rhSection PreCondit 349hi def link rInteger Number 350hi def link rLstElmt Normal 351hi def link rNameWSpace Normal 352hi def link rNumber Number 353hi def link rOperator Operator 354hi def link rOpError Error 355hi def link rParenError Error 356hi def link rPreProc PreProc 357hi def link rRepeat Repeat 358hi def link rSpecial SpecialChar 359hi def link rStatement Statement 360hi def link rString String 361hi def link rStrError Error 362hi def link rType Type 363if g:r_syntax_hl_roxygen 364 hi def link rOTitleTag Operator 365 hi def link rOTag Operator 366 hi def link rOTitleBlock Title 367 hi def link rOBlock Comment 368 hi def link rOBlockNoTitle Comment 369 hi def link rOTitle Title 370 hi def link rOCommentKey Comment 371 hi def link rOExamples SpecialComment 372endif 373 374let b:current_syntax="r" 375 376" vim: ts=8 sw=2 377