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