xref: /vim-8.2.3635/runtime/syntax/r.vim (revision e30d1025)
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