blob: f2d34a3f32968e00d71befe11c63d00aab6dace2 [file] [log] [blame]
Bram Moolenaardb6ea062014-07-10 22:01:47 +02001" Vim indent file
2" Language: Rmd
Christian Brabandtf9ca1392024-02-19 20:37:11 +01003" Maintainer: This runtime file is looking for a new maintainer.
4" Former Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
5" Former Repository: https://github.com/jalvesaq/R-Vim-runtime
6" Last Change: 2022 Nov 09 09:44PM
7" 2024 Feb 19 by Vim Project (announce adoption)
Bram Moolenaardb6ea062014-07-10 22:01:47 +02008
9
10" Only load this indent file when no other was loaded.
11if exists("b:did_indent")
12 finish
13endif
14runtime indent/r.vim
15let s:RIndent = function(substitute(&indentexpr, "()", "", ""))
16let b:did_indent = 1
17
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020018setlocal indentkeys=0{,0},<:>,!^F,o,O,e
Bram Moolenaardb6ea062014-07-10 22:01:47 +020019setlocal indentexpr=GetRmdIndent()
20
Bram Moolenaardd60c362023-02-27 15:49:53 +000021let b:undo_indent = "setl inde< indk<"
22
Bram Moolenaardb6ea062014-07-10 22:01:47 +020023if exists("*GetRmdIndent")
24 finish
25endif
26
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020027let s:cpo_save = &cpo
28set cpo&vim
29
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020030" Simple Python indentation algorithm
31function s:GetPyIndent()
32 let plnum = prevnonblank(v:lnum - 1)
33 let pline = getline(plnum)
34 let cline = getline(v:lnum)
35 if pline =~ '^s```\s*{\s*python '
36 return 0
37 elseif pline =~ ':$'
38 return indent(plnum) + &shiftwidth
39 elseif cline =~ 'else:$'
40 return indent(plnum) - &shiftwidth
41 endif
42 return indent(plnum)
43endfunction
44
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020045function s:GetMdIndent()
Bram Moolenaardb6ea062014-07-10 22:01:47 +020046 let pline = getline(v:lnum - 1)
47 let cline = getline(v:lnum)
48 if prevnonblank(v:lnum - 1) < v:lnum - 1 || cline =~ '^\s*[-\+\*]\s' || cline =~ '^\s*\d\+\.\s\+'
49 return indent(v:lnum)
50 elseif pline =~ '^\s*[-\+\*]\s'
51 return indent(v:lnum - 1) + 2
52 elseif pline =~ '^\s*\d\+\.\s\+'
53 return indent(v:lnum - 1) + 3
Bram Moolenaardd60c362023-02-27 15:49:53 +000054 elseif pline =~ '^\[\^\S\+\]: '
55 return indent(v:lnum - 1) + shiftwidth()
Bram Moolenaardb6ea062014-07-10 22:01:47 +020056 endif
57 return indent(prevnonblank(v:lnum - 1))
58endfunction
59
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020060function s:GetYamlIndent()
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020061 let plnum = prevnonblank(v:lnum - 1)
62 let pline = getline(plnum)
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020063 if pline =~ ':\s*$'
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020064 return indent(plnum) + shiftwidth()
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020065 elseif pline =~ '^\s*- '
66 return indent(v:lnum) + 2
67 endif
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020068 return indent(plnum)
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020069endfunction
70
Bram Moolenaardb6ea062014-07-10 22:01:47 +020071function GetRmdIndent()
Bram Moolenaar541f92d2015-06-19 13:27:23 +020072 if getline(".") =~ '^[ \t]*```{r .*}$' || getline(".") =~ '^[ \t]*```$'
Bram Moolenaardb6ea062014-07-10 22:01:47 +020073 return 0
74 endif
Bram Moolenaar541f92d2015-06-19 13:27:23 +020075 if search('^[ \t]*```{r', "bncW") > search('^[ \t]*```$', "bncW")
Bram Moolenaardb6ea062014-07-10 22:01:47 +020076 return s:RIndent()
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020077 elseif v:lnum > 1 && (search('^---$', "bnW") == 1 &&
78 \ (search('^---$', "nW") > v:lnum || search('^\.\.\.$', "nW") > v:lnum))
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020079 return s:GetYamlIndent()
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +020080 elseif search('^[ \t]*```{python', "bncW") > search('^[ \t]*```$', "bncW")
81 return s:GetPyIndent()
Bram Moolenaardb6ea062014-07-10 22:01:47 +020082 else
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020083 return s:GetMdIndent()
Bram Moolenaardb6ea062014-07-10 22:01:47 +020084 endif
85endfunction
86
Bram Moolenaarfc65cab2018-08-28 22:58:02 +020087let &cpo = s:cpo_save
88unlet s:cpo_save
89
Bram Moolenaardb6ea062014-07-10 22:01:47 +020090" vim: sw=2