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