Mercurial > vim
comparison runtime/indent/meson.vim @ 18456:6d11fc4aa683
Update runtime files
Commit: https://github.com/vim/vim/commit/96f45c0b6fc9e9d404e6805593ed1e0e6795e470
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Oct 26 19:53:45 2019 +0200
Update runtime files
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 26 Oct 2019 20:00:04 +0200 |
parents | |
children | 840665e74421 |
comparison
equal
deleted
inserted
replaced
18455:3c98dfd2380c | 18456:6d11fc4aa683 |
---|---|
1 " Vim indent file | |
2 " Language: Meson | |
3 " License: VIM License | |
4 " Maintainer: Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | |
5 " Original Authors: David Bustos <bustos@caltech.edu> | |
6 " Bram Moolenaar <Bram@vim.org> | |
7 " Last Change: 2019 Oct 18 | |
8 | |
9 " Only load this indent file when no other was loaded. | |
10 if exists("b:did_indent") | |
11 finish | |
12 endif | |
13 let b:did_indent = 1 | |
14 | |
15 " Some preliminary settings | |
16 setlocal nolisp " Make sure lisp indenting doesn't supersede us | |
17 setlocal autoindent " indentexpr isn't much help otherwise | |
18 | |
19 setlocal indentexpr=GetMesonIndent(v:lnum) | |
20 setlocal indentkeys+==elif,=else,=endforeach,=endif,0) | |
21 | |
22 " Only define the function once. | |
23 if exists("*GetMesonIndent") | |
24 finish | |
25 endif | |
26 let s:keepcpo= &cpo | |
27 set cpo&vim | |
28 | |
29 " Come here when loading the script the first time. | |
30 | |
31 let s:maxoff = 50 " maximum number of lines to look backwards for () | |
32 | |
33 function GetMesonIndent(lnum) | |
34 echom getline(line(".")) | |
35 | |
36 " If this line is explicitly joined: If the previous line was also joined, | |
37 " line it up with that one, otherwise add two 'shiftwidth' | |
38 if getline(a:lnum - 1) =~ '\\$' | |
39 if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$' | |
40 return indent(a:lnum - 1) | |
41 endif | |
42 return indent(a:lnum - 1) + (exists("g:mesonindent_continue") ? eval(g:mesonindent_continue) : (shiftwidth() * 2)) | |
43 endif | |
44 | |
45 " If the start of the line is in a string don't change the indent. | |
46 if has('syntax_items') | |
47 \ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$" | |
48 return -1 | |
49 endif | |
50 | |
51 " Search backwards for the previous non-empty line. | |
52 let plnum = prevnonblank(v:lnum - 1) | |
53 | |
54 if plnum == 0 | |
55 " This is the first non-empty line, use zero indent. | |
56 return 0 | |
57 endif | |
58 | |
59 " If the previous line is inside parenthesis, use the indent of the starting | |
60 " line. | |
61 " Trick: use the non-existing "dummy" variable to break out of the loop when | |
62 " going too far back. | |
63 call cursor(plnum, 1) | |
64 let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', | |
65 \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :" | |
66 \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" | |
67 \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") | |
68 if parlnum > 0 | |
69 let plindent = indent(parlnum) | |
70 let plnumstart = parlnum | |
71 else | |
72 let plindent = indent(plnum) | |
73 let plnumstart = plnum | |
74 endif | |
75 | |
76 | |
77 " When inside parenthesis: If at the first line below the parenthesis add | |
78 " a 'shiftwidth', otherwise same as previous line. | |
79 " i = (a | |
80 " + b | |
81 " + c) | |
82 call cursor(a:lnum, 1) | |
83 let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', | |
84 \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" | |
85 \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" | |
86 \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") | |
87 if p > 0 | |
88 if p == plnum | |
89 " When the start is inside parenthesis, only indent one 'shiftwidth'. | |
90 let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', | |
91 \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" | |
92 \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" | |
93 \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") | |
94 if pp > 0 | |
95 return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth()) | |
96 endif | |
97 return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : shiftwidth()) | |
98 endif | |
99 if plnumstart == p | |
100 return indent(plnum) | |
101 endif | |
102 return plindent | |
103 endif | |
104 | |
105 | |
106 " Get the line and remove a trailing comment. | |
107 " Use syntax highlighting attributes when possible. | |
108 let pline = getline(plnum) | |
109 let pline_len = strlen(pline) | |
110 if has('syntax_items') | |
111 " If the last character in the line is a comment, do a binary search for | |
112 " the start of the comment. synID() is slow, a linear search would take | |
113 " too long on a long line. | |
114 if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$" | |
115 let min = 1 | |
116 let max = pline_len | |
117 while min < max | |
118 let col = (min + max) / 2 | |
119 if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$" | |
120 let max = col | |
121 else | |
122 let min = col + 1 | |
123 endif | |
124 endwhile | |
125 let pline = strpart(pline, 0, min - 1) | |
126 endif | |
127 else | |
128 let col = 0 | |
129 while col < pline_len | |
130 if pline[col] == '#' | |
131 let pline = strpart(pline, 0, col) | |
132 break | |
133 endif | |
134 let col = col + 1 | |
135 endwhile | |
136 endif | |
137 | |
138 " If the previous line ended the conditional/loop | |
139 if getline(plnum) =~ '^\s*\(endif\|endforeach\)\>\s*' | |
140 " Maintain indent | |
141 return -1 | |
142 endif | |
143 | |
144 " If the previous line ended with a builtin, indent this line | |
145 if pline =~ '^\s*\(foreach\|if\|else\|elif\)\>\s*' | |
146 return plindent + shiftwidth() | |
147 endif | |
148 | |
149 " If the current line begins with a header keyword, deindent | |
150 if getline(a:lnum) =~ '^\s*\(else\|elif\|endif\|endforeach\)' | |
151 | |
152 " Unless the previous line was a one-liner | |
153 if getline(plnumstart) =~ '^\s*\(foreach\|if\)\>\s*' | |
154 return plindent | |
155 endif | |
156 | |
157 " Or the user has already dedented | |
158 if indent(a:lnum) <= plindent - shiftwidth() | |
159 return -1 | |
160 endif | |
161 | |
162 return plindent - shiftwidth() | |
163 endif | |
164 | |
165 " When after a () construct we probably want to go back to the start line. | |
166 " a = (b | |
167 " + c) | |
168 " here | |
169 if parlnum > 0 | |
170 return plindent | |
171 endif | |
172 | |
173 return -1 | |
174 | |
175 endfunction | |
176 | |
177 let &cpo = s:keepcpo | |
178 unlet s:keepcpo | |
179 | |
180 " vim:sw=2 |