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