annotate runtime/autoload/dist/vimindent.vim @ 34311:5b46a975e48a

runtime(vim): Fix indent after line with literal dict Commit: https://github.com/vim/vim/commit/415a5a951ba6a827ecafc2e13bf341ed4e124ad6 Author: Andrew Radev <andrey.radev@gmail.com> Date: Fri Feb 9 19:44:28 2024 +0100 runtime(vim): Fix indent after line with literal dict closes: https://github.com/vim/vim/issues/13966 Signed-off-by: Andrew Radev <andrey.radev@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Fri, 09 Feb 2024 20:00:04 +0100
parents 94f4a488412e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 vim9script
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 # Language: Vim script
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 # Maintainer: github user lacygoill
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
5 # Last Change: 2023 Jun 29
34311
5b46a975e48a runtime(vim): Fix indent after line with literal dict
Christian Brabandt <cb@256bit.org>
parents: 32721
diff changeset
6 #
5b46a975e48a runtime(vim): Fix indent after line with literal dict
Christian Brabandt <cb@256bit.org>
parents: 32721
diff changeset
7 # Includes Changes from Vim:
5b46a975e48a runtime(vim): Fix indent after line with literal dict
Christian Brabandt <cb@256bit.org>
parents: 32721
diff changeset
8 # - 2024 Feb 09: Fix indent after literal Dict (A. Radev via #13966)
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
30634
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
10 # NOTE: Whenever you change the code, make sure the tests are still passing:
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
11 #
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
12 # $ cd runtime/indent/
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
13 # $ make clean; make test || vimdiff testdir/vim.{ok,fail}
30634
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
14
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15 # Config {{{1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 const TIMEOUT: number = get(g:, 'vim_indent', {})
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 ->get('searchpair_timeout', 100)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 def IndentMoreInBracketBlock(): number # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 if get(g:, 'vim_indent', {})
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 ->get('more_in_bracket_block', false)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 return shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29 def IndentMoreLineContinuation(): number # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 var n: any = get(g:, 'vim_indent', {})
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 # We inspect `g:vim_indent_cont` to stay backward compatible.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 ->get('line_continuation', get(g:, 'vim_indent_cont', shiftwidth() * 3))
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 if n->typename() == 'string'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 return n->eval()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 return n
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 # }}}2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 # Init {{{1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 var patterns: list<string>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 # Tokens {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 # BAR_SEPARATION {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 const BAR_SEPARATION: string = '[^|\\]\@1<=|'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 # OPENING_BRACKET {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 const OPENING_BRACKET: string = '[[{(]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 # CLOSING_BRACKET {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 const CLOSING_BRACKET: string = '[]})]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 # NON_BRACKET {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 const NON_BRACKET: string = '[^[\]{}()]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 # LIST_OR_DICT_CLOSING_BRACKET {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 const LIST_OR_DICT_CLOSING_BRACKET: string = '[]}]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 # LIST_OR_DICT_OPENING_BRACKET {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 const LIST_OR_DICT_OPENING_BRACKET: string = '[[{]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 # CHARACTER_UNDER_CURSOR {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 const CHARACTER_UNDER_CURSOR: string = '\%.c.'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 # INLINE_COMMENT {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 # TODO: It is not required for an inline comment to be surrounded by whitespace.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
76 # But it might help against false positives.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77 # To be more reliable, we should inspect the syntax, and only require whitespace
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 # before the `#` comment leader. But that might be too costly (because of
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79 # `synstack()`).
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 const INLINE_COMMENT: string = '\s[#"]\%(\s\|[{}]\{3}\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82 # INLINE_VIM9_COMMENT {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84 const INLINE_VIM9_COMMENT: string = '\s#'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
85
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
86 # COMMENT {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
87
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88 # TODO: Technically, `"\s` is wrong.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 # First, whitespace is not required.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 # Second, in Vim9, a string might appear at the start of the line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
92 # To be sure, we should also inspect the syntax.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93 # We can't use `INLINE_COMMENT` here. {{{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
95 # const COMMENT: string = $'^\s*{INLINE_COMMENT}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 # ^------------^
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 # ✘
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 # Because `INLINE_COMMENT` asserts the presence of a whitespace before the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 # comment leader. This assertion is not satisfied for a comment starting at the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
101 # start of the line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 #}}}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 const COMMENT: string = '^\s*\%(#\|"\\\=\s\).*$'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
104
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
105 # DICT_KEY {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107 const DICT_KEY: string = '^\s*\%('
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
108 .. '\%(\w\|-\)\+'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 .. '\|'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
110 .. '"[^"]*"'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
111 .. '\|'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 .. "'[^']*'"
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
113 .. '\|'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
114 .. '\[[^]]\+\]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
115 .. '\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
116 .. ':\%(\s\|$\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
117
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118 # END_OF_COMMAND {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
120 const END_OF_COMMAND: string = $'\s*\%($\|||\@!\|{INLINE_COMMENT}\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 # END_OF_LINE {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
123
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
124 const END_OF_LINE: string = $'\s*\%($\|{INLINE_COMMENT}\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
125
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 # END_OF_VIM9_LINE {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128 const END_OF_VIM9_LINE: string = $'\s*\%($\|{INLINE_VIM9_COMMENT}\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
130 # OPERATOR {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
131
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
132 const OPERATOR: string = '\%(^\|\s\)\%([-+*/%]\|\.\.\|||\|&&\|??\|?\|<<\|>>\|\%([=!]=\|[<>]=\=\|[=!]\~\|is\|isnot\)[?#]\=\)\%(\s\|$\)\@=\%(\s*[|<]\)\@!'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 # assignment operators
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
134 .. '\|' .. '\s\%([-+*/%]\|\.\.\)\==\%(\s\|$\)\@='
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
135 # support `:` when used inside conditional operator `?:`
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
136 .. '\|' .. '\%(\s\|^\):\%(\s\|$\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
137
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138 # HEREDOC_OPERATOR {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
140 const HEREDOC_OPERATOR: string = '\s=<<\s\@=\%(\s\+\%(trim\|eval\)\)\{,2}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
141
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
142 # PATTERN_DELIMITER {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
143
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
144 # A better regex would be:
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
146 # [^-+*/%.:# \t[:alnum:]\"|]\@=.\|->\@!\%(=\s\)\@!\|[+*/%]\%(=\s\)\@!
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
147 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
148 # But sometimes, it can be too costly and cause `E363` to be given.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 const PATTERN_DELIMITER: string = '[-+*/%]\%(=\s\)\@!'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150 # }}}2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151 # Syntaxes {{{2
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
152 # BLOCKS {{{3
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
154 const BLOCKS: list<list<string>> = [
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
155 ['if', 'el\%[se]', 'elseif\=', 'en\%[dif]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
156 ['for', 'endfor\='],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
157 ['wh\%[ile]', 'endw\%[hile]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
158 ['try', 'cat\%[ch]', 'fina\|finally\=', 'endt\%[ry]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
159 ['def', 'enddef'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
160 ['fu\%[nction](\@!', 'endf\%[unction]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
161 ['class', 'endclass'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
162 ['interface', 'endinterface'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
163 ['enum', 'endenum'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
164 ['aug\%[roup]\%(\s\+[eE][nN][dD]\)\@!\s\+\S\+', 'aug\%[roup]\s\+[eE][nN][dD]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
165 ]
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
166
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
167 # MODIFIERS {{{3
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
169 # some keywords can be prefixed by modifiers (e.g. `def` can be prefixed by `export`)
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
170 const MODIFIERS: dict<string> = {
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
171 def: ['export', 'static'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
172 class: ['export', 'abstract', 'export abstract'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
173 interface: ['export'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
174 }
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
175 # ...
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
176 # class: ['export', 'abstract', 'export abstract'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
177 # ...
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
178 # →
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
179 # ...
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
180 # class: '\%(export\|abstract\|export\s\+abstract\)\s\+',
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
181 # ...
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
182 ->map((_, mods: list<string>): string =>
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
183 '\%(' .. mods
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
184 ->join('\|')
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
185 ->substitute('\s\+', '\\s\\+', 'g')
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
186 .. '\)' .. '\s\+')
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 # HIGHER_ORDER_COMMAND {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 patterns =<< trim eval END
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 argdo\>!\=
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 bufdo\>!\=
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 cdo\>!\=
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 folddoc\%[losed]\>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 foldd\%[oopen]\>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 ldo\=\>!\=
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 tabdo\=\>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 windo\>
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
199 au\%[tocmd]\>!\=.*
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
200 com\%[mand]\>!\=.*
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 g\%[lobal]!\={PATTERN_DELIMITER}.*
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 v\%[global]!\={PATTERN_DELIMITER}.*
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 END
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
205 const HIGHER_ORDER_COMMAND: string = $'\%(^\|{BAR_SEPARATION}\)\s*\<\%({patterns->join('\|')}\)\%(\s\|$\)\@='
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
206
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
207 # START_MIDDLE_END {{{3
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
209 # Let's derive this constant from `BLOCKS`:
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
210 #
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
211 # [['if', 'el\%[se]', 'elseif\=', 'en\%[dif]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
212 # ['for', 'endfor\='],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
213 # ...,
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
214 # [...]]
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
215 # →
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
216 # {
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
217 # 'for': ['for', '', 'endfor\='],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
218 # 'endfor': ['for', '', 'endfor\='],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
219 # 'if': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
220 # 'else': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
221 # 'elseif': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
222 # 'endif': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
223 # ...
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
224 # }
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
225 var START_MIDDLE_END: dict<list<string>>
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
227 def Unshorten(kwd: string): string
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
228 return BlockStartKeyword(kwd)
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
229 enddef
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
231 def BlockStartKeyword(line: string): string
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
232 var kwd: string = line->matchstr('\l\+')
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
233 return fullcommand(kwd, false)
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
234 enddef
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
235
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
236 {
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
237 for kwds: list<string> in BLOCKS
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
238 var [start: string, middle: string, end: string] = [kwds[0], '', kwds[-1]]
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
239 if MODIFIERS->has_key(start->Unshorten())
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
240 start = $'\%({MODIFIERS[start]}\)\={start}'
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
241 endif
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
242 if kwds->len() > 2
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
243 middle = kwds[1 : -2]->join('\|')
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
244 endif
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
245 for kwd: string in kwds
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
246 START_MIDDLE_END->extend({[kwd->Unshorten()]: [start, middle, end]})
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
247 endfor
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
248 endfor
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
249 }
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
250
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
251 START_MIDDLE_END = START_MIDDLE_END
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
252 ->map((_, kwds: list<string>) =>
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
253 kwds->map((_, kwd: string) => kwd == ''
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
254 ? ''
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
255 : $'\%(^\|{BAR_SEPARATION}\|\<sil\%[ent]\|{HIGHER_ORDER_COMMAND}\)\s*'
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
256 .. $'\<\%({kwd}\)\>\%(\s\|$\|!\)\@=\%(\s*{OPERATOR}\)\@!'))
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
257
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
258 lockvar! START_MIDDLE_END
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260 # ENDS_BLOCK {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
261
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 const ENDS_BLOCK: string = '^\s*\%('
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
263 .. BLOCKS
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
264 ->copy()
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
265 ->map((_, kwds: list<string>): string => kwds[-1])
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
266 ->join('\|')
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
267 .. '\|' .. CLOSING_BRACKET
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268 .. $'\){END_OF_COMMAND}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
269
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270 # ENDS_BLOCK_OR_CLAUSE {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
272 patterns = BLOCKS
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
273 ->copy()
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
274 ->map((_, kwds: list<string>) => kwds[1 :])
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
275 ->flattennew()
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
276 # `catch` and `elseif` need to be handled as special cases
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
277 ->filter((_, pat: string): bool => pat->Unshorten() !~ '^\%(catch\|elseif\)\>')
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 const ENDS_BLOCK_OR_CLAUSE: string = '^\s*\%(' .. patterns->join('\|') .. $'\){END_OF_COMMAND}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 .. $'\|^\s*cat\%[ch]\%(\s\+\({PATTERN_DELIMITER}\).*\1\)\={END_OF_COMMAND}'
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
281 .. $'\|^\s*elseif\=\>\%(\s\|$\)\@=\%(\s*{OPERATOR}\)\@!'
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
282
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
283 # STARTS_NAMED_BLOCK {{{3
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
284
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
285 patterns = []
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
286 {
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
287 for kwds: list<string> in BLOCKS
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
288 for kwd: string in kwds[0 : -2]
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
289 if MODIFIERS->has_key(kwd->Unshorten())
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
290 patterns += [$'\%({MODIFIERS[kwd]}\)\={kwd}']
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
291 else
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
292 patterns += [kwd]
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
293 endif
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
294 endfor
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
295 endfor
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
296 }
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
297
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
298 const STARTS_NAMED_BLOCK: string = $'^\s*\%(sil\%[ent]\s\+\)\=\%({patterns->join('\|')}\)\>\%(\s\|$\|!\)\@='
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
299
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 # STARTS_CURLY_BLOCK {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 # TODO: `{` alone on a line is not necessarily the start of a block.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 # It could be a dictionary if the previous line ends with a binary/ternary
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
304 # operator. This can cause an issue whenever we use `STARTS_CURLY_BLOCK` or
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305 # `LINE_CONTINUATION_AT_EOL`.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 const STARTS_CURLY_BLOCK: string = '\%('
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
307 .. '^\s*{'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
308 .. '\|' .. '^.*\zs\s=>\s\+{'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
309 .. '\|' .. $'^\%(\s*\|.*{BAR_SEPARATION}\s*\)\%(com\%[mand]\|au\%[tocmd]\).*\zs\s{{'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
310 .. '\)' .. END_OF_COMMAND
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
311
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 # STARTS_FUNCTION {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
313
32721
94f4a488412e Updated runtime files
Christian Brabandt <cb@256bit.org>
parents: 32061
diff changeset
314 const STARTS_FUNCTION: string = $'^\s*\%({MODIFIERS.def}\)\=def\>!\=\s\@='
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316 # ENDS_FUNCTION {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
318 const ENDS_FUNCTION: string = $'^\s*enddef\>{END_OF_COMMAND}'
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
319
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
320 # ASSIGNS_HEREDOC {{{3
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
321
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
322 const ASSIGNS_HEREDOC: string = $'^\%({COMMENT}\)\@!.*\%({HEREDOC_OPERATOR}\)\s\+\zs[A-Z]\+{END_OF_LINE}'
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
323
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
324 # PLUS_MINUS_COMMAND {{{3
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
326 # In legacy, the `:+` and `:-` commands are not required to be preceded by a colon.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
327 # As a result, when `+` or `-` is alone on a line, there is ambiguity.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
328 # It might be an operator or a command.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
329 # To not break the indentation in legacy scripts, we might need to consider such
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
330 # lines as commands.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
331 const PLUS_MINUS_COMMAND: string = '^\s*[+-]\s*$'
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
332
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
333 # TRICKY_COMMANDS {{{3
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
335 # Some commands are tricky because they accept an argument which can be
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
336 # conflated with an operator. Examples:
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
337 #
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
338 # argdelete *
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
339 # cd -
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
340 # normal! ==
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
341 # nunmap <buffer> (
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
342 #
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
343 # TODO: Other commands might accept operators as argument. Handle them too.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
344 patterns =<< trim eval END
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
345 {'\'}<argd\%[elete]\s\+\*\s*$
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
346 \<[lt]\=cd!\=\s\+-\s*$
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
347 \<norm\%[al]!\=\s*\S\+$
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
348 \%(\<sil\%[ent]!\=\s\+\)\=\<[nvxsoilct]\=\%(nore\|un\)map!\=\s
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
349 {PLUS_MINUS_COMMAND}
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
350 END
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
351
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
352 const TRICKY_COMMANDS: string = patterns->join('\|')
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 # }}}2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 # EOL {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355 # OPENING_BRACKET_AT_EOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
356
30634
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
357 const OPENING_BRACKET_AT_EOL: string = OPENING_BRACKET .. END_OF_VIM9_LINE
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
359 # CLOSING_BRACKET_AT_EOL {{{3
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
360
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
361 const CLOSING_BRACKET_AT_EOL: string = CLOSING_BRACKET .. END_OF_VIM9_LINE
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
362
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
363 # COMMA_AT_EOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 const COMMA_AT_EOL: string = $',{END_OF_VIM9_LINE}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 # COMMA_OR_DICT_KEY_AT_EOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369 const COMMA_OR_DICT_KEY_AT_EOL: string = $'\%(,\|{DICT_KEY}\){END_OF_VIM9_LINE}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
370
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 # LAMBDA_ARROW_AT_EOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 const LAMBDA_ARROW_AT_EOL: string = $'\s=>{END_OF_VIM9_LINE}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
374
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 # LINE_CONTINUATION_AT_EOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
376
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
377 const LINE_CONTINUATION_AT_EOL: string = '\%('
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 .. ','
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 .. '\|' .. OPERATOR
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380 .. '\|' .. '\s=>'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
381 .. '\|' .. '[^=]\zs[[(]'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
382 .. '\|' .. DICT_KEY
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
383 # `{` is ambiguous.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
384 # It can be the start of a dictionary or a block.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 # We only want to match the former.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 .. '\|' .. $'^\%({STARTS_CURLY_BLOCK}\)\@!.*\zs{{'
34311
5b46a975e48a runtime(vim): Fix indent after line with literal dict
Christian Brabandt <cb@256bit.org>
parents: 32721
diff changeset
387 .. '\)\s*\%(\s#[^{].*\)\=$'
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
388 # }}}2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 # SOL {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390 # BACKSLASH_AT_SOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
391
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
392 const BACKSLASH_AT_SOL: string = '^\s*\%(\\\|[#"]\\ \)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 # CLOSING_BRACKET_AT_SOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 const CLOSING_BRACKET_AT_SOL: string = $'^\s*{CLOSING_BRACKET}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 # LINE_CONTINUATION_AT_SOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 const LINE_CONTINUATION_AT_SOL: string = '^\s*\%('
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 .. '\\'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 .. '\|' .. '[#"]\\ '
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 .. '\|' .. OPERATOR
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 .. '\|' .. '->\s*\h'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 .. '\|' .. '\.\h' # dict member
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 .. '\|' .. '|'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 # TODO: `}` at the start of a line is not necessarily a line continuation.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408 # Could be the end of a block.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409 .. '\|' .. CLOSING_BRACKET
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 .. '\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 # RANGE_AT_SOL {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414 const RANGE_AT_SOL: string = '^\s*:\S'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 # }}}1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 # Interface {{{1
30875
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
417 export def Expr(lnum = v:lnum): number # {{{2
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 # line which is indented
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 var line_A: dict<any> = {text: getline(lnum), lnum: lnum}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 # line above, on which we'll base the indent of line A
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421 var line_B: dict<any>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 if line_A->AtStartOf('HereDoc')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 line_A->CacheHeredoc()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 elseif line_A.lnum->IsInside('HereDoc')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 return line_A.text->HereDocIndent()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427 elseif line_A.lnum->IsRightBelow('HereDoc')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428 var ind: number = b:vimindent.startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 unlet! b:vimindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 return ind
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
432
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 # Don't move this block after the function header one.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434 # Otherwise, we might clear the cache too early if the line following the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 # header is a comment.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 if line_A.text =~ COMMENT
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 return CommentIndent()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440 line_B = PrevCodeLine(line_A.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 if line_A.text =~ BACKSLASH_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442 if line_B.text =~ BACKSLASH_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443 return Indent(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 return Indent(line_B.lnum) + IndentMoreLineContinuation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 if line_A->AtStartOf('FuncHeader')
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
450 && !IsInInterface()
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 line_A.lnum->CacheFuncHeader()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452 elseif line_A.lnum->IsInside('FuncHeader')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 return b:vimindent.startindent + 2 * shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 elseif line_A.lnum->IsRightBelow('FuncHeader')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 var startindent: number = b:vimindent.startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456 unlet! b:vimindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457 if line_A.text =~ ENDS_FUNCTION
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 return startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 return startindent + shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
464 var past_bracket_block: dict<any>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 if exists('b:vimindent')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 && b:vimindent->has_key('is_BracketBlock')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 past_bracket_block = RemovePastBracketBlock(line_A)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 if line_A->AtStartOf('BracketBlock')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470 line_A->CacheBracketBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 if line_A.lnum->IsInside('BracketBlock')
30875
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
473 var is_in_curly_block: bool = IsInCurlyBlock()
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 for block: dict<any> in b:vimindent.block_stack
30634
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
475 if line_A.lnum <= block.startlnum
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
476 continue
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
477 endif
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
478 if !block->has_key('startindent')
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
479 block.startindent = Indent(block.startlnum)
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
480 endif
30875
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
481 if !is_in_curly_block
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 return BracketBlockIndent(line_A, block)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 endfor
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 if line_A.text->ContinuesBelowBracketBlock(line_B, past_bracket_block)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 && line_A.text !~ CLOSING_BRACKET_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 return past_bracket_block.startindent
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
489 + (past_bracket_block.startline =~ STARTS_NAMED_BLOCK ? 2 * shiftwidth() : 0)
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 # Problem: If we press `==` on the line right below the start of a multiline
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 # lambda (split after its arrow `=>`), the indent is not correct.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 # Solution: Indent relative to the line above.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 if line_B->EndsWithLambdaArrow()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 return Indent(line_B.lnum) + shiftwidth() + IndentMoreInBracketBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 endif
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
498 # FIXME: Similar issue here:
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
499 #
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
500 # var x = []
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
501 # ->filter((_, _) =>
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
502 # true)
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
503 # ->items()
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
504 #
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
505 # Press `==` on last line.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
506 # Expected: The `->items()` line is indented like `->filter(...)`.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
507 # Actual: It's indented like `true)`.
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
508 # Is it worth fixing? `=ip` gives the correct indentation, because then the
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
509 # cache is used.
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 # Don't move this block before the heredoc one.{{{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513 # A heredoc might be assigned on the very first line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 # And if it is, we need to cache some info.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 #}}}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 # Don't move it before the function header and bracket block ones either.{{{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518 # You could, because these blocks of code deal with construct which can only
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 # appear in a Vim9 script. And in a Vim9 script, the first line is
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 # `vim9script`. Or maybe some legacy code/comment (see `:help vim9-mix`).
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 # But you can't find a Vim9 function header or Vim9 bracket block on the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 # first line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 # Anyway, even if you could, don't. First, it would be inconsistent.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 # Second, it could give unexpected results while we're trying to fix some
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526 # failing test.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 #}}}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 if line_A.lnum == 1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 # Don't do that:
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533 # if line_A.text !~ '\S'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 # return -1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 # endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 # It would prevent a line from being automatically indented when using the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
537 # normal command `o`.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
538 # TODO: Can we write a test for this?
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 if line_B.text =~ STARTS_CURLY_BLOCK
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 return Indent(line_B.lnum) + shiftwidth() + IndentMoreInBracketBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 elseif line_A.text =~ CLOSING_BRACKET_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 var start: number = MatchingOpenBracket(line_A)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 if start <= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
546 return -1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 return Indent(start) + IndentMoreInBracketBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 elseif line_A.text =~ ENDS_BLOCK_OR_CLAUSE
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 && !line_B->EndsWithLineContinuation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 var kwd: string = BlockStartKeyword(line_A.text)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 if !START_MIDDLE_END->has_key(kwd)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 return -1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
556
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 # If the cursor is after the match for the end pattern, we won't find
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
558 # the start of the block. Let's make sure that doesn't happen.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
559 cursor(line_A.lnum, 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 var [start: string, middle: string, end: string] = START_MIDDLE_END[kwd]
30634
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
562 var block_start: number = SearchPairStart(start, middle, end)
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 if block_start > 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 return Indent(block_start)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 return -1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 var base_ind: number
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 if line_A->IsFirstLineOfCommand(line_B)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572 line_A.isfirst = true
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 line_B = line_B->FirstLinePreviousCommand()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 base_ind = Indent(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 if line_B->EndsWithCurlyBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 && !line_A->IsInThisBlock(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 return base_ind
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 line_A.isfirst = false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 base_ind = Indent(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 var line_C: dict<any> = PrevCodeLine(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 if !line_B->IsFirstLineOfCommand(line_C) || line_C.lnum <= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 return base_ind
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 var ind: number = base_ind + Offset(line_A, line_B)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
592 return [ind, 0]->max()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595 def g:GetVimIndent(): number # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 # for backward compatibility
30875
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
597 return Expr()
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 # }}}1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 # Core {{{1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601 def Offset( # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 # we indent this line ...
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 line_A: dict<any>,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604 # ... relatively to this line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 line_B: dict<any>,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 ): number
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
608 if line_B->AtStartOf('FuncHeader')
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
609 && IsInInterface()
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
610 return 0
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
611
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 # increase indentation inside a block
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
613 elseif line_B.text =~ STARTS_NAMED_BLOCK
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
614 || line_B->EndsWithCurlyBlock()
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 # But don't indent if the line starting the block also closes it.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 if line_B->AlsoClosesBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 # Indent twice for a line continuation in the block header itself, so that
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619 # we can easily distinguish the end of the block header from the start of
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
620 # the block body.
30634
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
621 elseif (line_B->EndsWithLineContinuation()
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
622 && !line_A.isfirst)
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
623 || (line_A.text =~ LINE_CONTINUATION_AT_SOL
f68f43043842 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30547
diff changeset
624 && line_A.text !~ PLUS_MINUS_COMMAND)
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625 || line_A.text->Is_IN_KeywordForLoop(line_B.text)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 return 2 * shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 return shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 # increase indentation of a line if it's the continuation of a command which
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 # started on a previous line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 elseif !line_A.isfirst
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 && (line_B->EndsWithLineContinuation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 || line_A.text =~ LINE_CONTINUATION_AT_SOL)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 return shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 def HereDocIndent(line_A: string): number # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 # at the end of a heredoc
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 if line_A =~ $'^\s*{b:vimindent.endmarker}$'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 # `END` must be at the very start of the line if the heredoc is not trimmed
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 if !b:vimindent.is_trimmed
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 # We can't invalidate the cache just yet.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648 # The indent of `END` is meaningless; it's always 0. The next line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 # will need to be indented relative to the start of the heredoc. It
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 # must know where it starts; it needs the cache.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 var ind: number = b:vimindent.startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 # invalidate the cache so that it's not used for the next heredoc
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 unlet! b:vimindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656 return ind
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660 # In a non-trimmed heredoc, all of leading whitespace is semantic.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 # Leave it alone.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 if !b:vimindent.is_trimmed
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 # But do save the indent of the assignment line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 if !b:vimindent->has_key('startindent')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 b:vimindent.startindent = b:vimindent.startlnum->Indent()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 return -1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 # In a trimmed heredoc, *some* of the leading whitespace is semantic.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 # We want to preserve it, so we can't just indent relative to the assignment
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 # line. That's because we're dealing with data, not with code.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 # Instead, we need to compute by how much the indent of the assignment line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 # was increased or decreased. Then, we need to apply that same change to
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 # every line inside the body.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 var offset: number
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 if !b:vimindent->has_key('offset')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 var old_startindent: number = b:vimindent.startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 var new_startindent: number = b:vimindent.startlnum->Indent()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 offset = new_startindent - old_startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 # If all the non-empty lines in the body have a higher indentation relative
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 # to the assignment, there is no need to indent them more.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 # But if at least one of them does have the same indentation level (or a
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 # lower one), then we want to indent it further (and the whole block with it).
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 # This way, we can clearly distinguish the heredoc block from the rest of
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 # the code.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 var end: number = search($'^\s*{b:vimindent.endmarker}$', 'nW')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 var should_indent_more: bool = range(v:lnum, end - 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 ->indexof((_, lnum: number): bool => Indent(lnum) <= old_startindent && getline(lnum) != '') >= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 if should_indent_more
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 offset += shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 b:vimindent.offset = offset
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 b:vimindent.startindent = new_startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 return [0, Indent(v:lnum) + b:vimindent.offset]->max()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 def CommentIndent(): number # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703 var line_B: dict<any>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 line_B.lnum = prevnonblank(v:lnum - 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 line_B.text = getline(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 if line_B.text =~ COMMENT
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 return Indent(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 var next: number = NextCodeLine()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 if next == 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 var vimindent_save: dict<any> = get(b:, 'vimindent', {})->deepcopy()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 var ind: number = next->Expr()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 # The previous `Expr()` might have set or deleted `b:vimindent`.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717 # This could cause issues (e.g. when indenting 2 commented lines above a
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 # heredoc). Let's make sure the state of the variable is not altered.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 if vimindent_save->empty()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 unlet! b:vimindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 b:vimindent = vimindent_save
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 if getline(next) =~ ENDS_BLOCK
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 return ind + shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 return ind
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 def BracketBlockIndent(line_A: dict<any>, block: dict<any>): number # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 var ind: number = block.startindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 if line_A.text =~ CLOSING_BRACKET_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 if b:vimindent.is_on_named_block_line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 ind += 2 * shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 return ind + IndentMoreInBracketBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 var startline: dict<any> = {
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742 text: block.startline,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743 lnum: block.startlnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 }
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 if startline->EndsWithComma()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 || startline->EndsWithLambdaArrow()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 || (startline->EndsWithOpeningBracket()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 # TODO: Is that reliable?
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 && block.startline !~
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 $'^\s*{NON_BRACKET}\+{LIST_OR_DICT_CLOSING_BRACKET},\s\+{LIST_OR_DICT_OPENING_BRACKET}')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 ind += shiftwidth() + IndentMoreInBracketBlock()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754 if b:vimindent.is_on_named_block_line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 ind += shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
758 if block.is_dict
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 && line_A.text !~ DICT_KEY
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 ind += shiftwidth()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 return ind
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 def CacheHeredoc(line_A: dict<any>) # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
767 var endmarker: string = line_A.text->matchstr(ASSIGNS_HEREDOC)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 var endlnum: number = search($'^\s*{endmarker}$', 'nW')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
769 var is_trimmed: bool = line_A.text =~ $'.*\s\%(trim\%(\s\+eval\)\=\)\s\+[A-Z]\+{END_OF_LINE}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770 b:vimindent = {
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
771 is_HereDoc: true,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
772 startlnum: line_A.lnum,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 endlnum: endlnum,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 endmarker: endmarker,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 is_trimmed: is_trimmed,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776 }
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
777 if is_trimmed
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 b:vimindent.startindent = Indent(line_A.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 RegisterCacheInvalidation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 def CacheFuncHeader(startlnum: number) # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 cursor(startlnum, 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 if search('(', 'W', startlnum) <= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 return
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
788 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 var endlnum: number = SearchPair('(', '', ')', 'nW')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791 if endlnum == startlnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 return
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 b:vimindent = {
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 is_FuncHeader: true,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 startindent: startlnum->Indent(),
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 endlnum: endlnum,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 }
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 RegisterCacheInvalidation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 def CacheBracketBlock(line_A: dict<any>) # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 var opening: string = line_A.text->matchstr(CHARACTER_UNDER_CURSOR)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 var closing: string = {'[': ']', '{': '}', '(': ')'}[opening]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 var endlnum: number = SearchPair(opening, '', closing, 'nW')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 if endlnum <= line_A.lnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810 return
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 if !exists('b:vimindent')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 b:vimindent = {
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 is_BracketBlock: true,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 is_on_named_block_line: line_A.text =~ STARTS_NAMED_BLOCK,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 block_stack: [],
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 }
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 var is_dict: bool
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 var is_curly_block: bool
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 if opening == '{'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 if line_A.text =~ STARTS_CURLY_BLOCK
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 [is_dict, is_curly_block] = [false, true]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 else
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 [is_dict, is_curly_block] = [true, false]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830 b:vimindent.block_stack->insert({
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 is_dict: is_dict,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 is_curly_block: is_curly_block,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833 startline: line_A.text,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 startlnum: line_A.lnum,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 endlnum: endlnum,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 })
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 RegisterCacheInvalidation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 def RegisterCacheInvalidation() # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 # invalidate the cache so that it's not used for the next `=` normal command
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 autocmd_add([{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 cmd: 'unlet! b:vimindent',
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845 event: 'ModeChanged',
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 group: '__VimIndent__',
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847 once: true,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 pattern: '*:n',
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 replace: true,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 }])
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853 def RemovePastBracketBlock(line_A: dict<any>): dict<any> # {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 var stack: list<dict<any>> = b:vimindent.block_stack
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 var removed: dict<any>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 if line_A.lnum > stack[0].endlnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 removed = stack[0]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861 stack->filter((_, block: dict<any>): bool => line_A.lnum <= block.endlnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862 if stack->empty()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 unlet! b:vimindent
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
864 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 return removed
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867 # }}}1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868 # Util {{{1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 # Get {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 def Indent(lnum: number): number # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 if lnum <= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
872 # Don't return `-1`. It could cause `Expr()` to return a non-multiple of `'shiftwidth'`.{{{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
873 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
874 # It would be OK if we were always returning `Indent()` directly. But
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 # we don't. Most of the time, we include it in some computation
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 # like `Indent(...) + shiftwidth()`. If `'shiftwidth'` is `4`, and
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 # `Indent()` returns `-1`, `Expr()` will end up returning `3`.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 #}}}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 return indent(lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884 def MatchingOpenBracket(line: dict<any>): number # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 var end: string = line.text->matchstr(CLOSING_BRACKET)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 var start: string = {']': '[', '}': '{', ')': '('}[end]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 cursor(line.lnum, 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 return SearchPairStart(start, '', end)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 def FirstLinePreviousCommand(line: dict<any>): dict<any> # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 var line_B: dict<any> = line
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 while line_B.lnum > 1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895 var code_line_above: dict<any> = PrevCodeLine(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897 if line_B.text =~ CLOSING_BRACKET_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 var n: number = MatchingOpenBracket(line_B)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 if n <= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 break
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 line_B.lnum = n
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 line_B.text = getline(line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
906 continue
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 elseif line_B->IsFirstLineOfCommand(code_line_above)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 break
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 line_B = code_line_above
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 endwhile
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 return line_B
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 def PrevCodeLine(lnum: number): dict<any> # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 var line: string = getline(lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920 if line =~ '^\s*[A-Z]\+$'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921 var endmarker: string = line->matchstr('[A-Z]\+')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923 cursor(lnum, 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924 var n: number = search(ASSIGNS_HEREDOC, 'bnW')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926 if n > 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 line = getline(n)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 if line =~ $'{HEREDOC_OPERATOR}\s\+{endmarker}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929 return {lnum: n, text: line}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 var n: number = prevnonblank(lnum - 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935 line = getline(n)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 while line =~ COMMENT && n > 1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 n = prevnonblank(n - 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 line = getline(n)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 endwhile
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 # If we get back to the first line, we return 1 no matter what; even if it's a
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 # commented line. That should not cause an issue though. We just want to
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 # avoid a commented line above which there is a line of code which is more
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943 # relevant. There is nothing above the first line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 return {lnum: n, text: line}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947 def NextCodeLine(): number # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 var last: number = line('$')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949 if v:lnum == last
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 var lnum: number = v:lnum + 1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 while lnum <= last
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 var line: string = getline(lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 if line != '' && line !~ COMMENT
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 return lnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 ++lnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 endwhile
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 return 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 def SearchPair( # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 start: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 middle: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 end: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 flags: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 stopline = 0,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 ): number
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 var s: string = start
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 var e: string = end
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 if start == '[' || start == ']'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975 s = s->escape('[]')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977 if end == '[' || end == ']'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 e = e->escape('[]')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 endif
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
980 return searchpair('\C' .. s, (middle == '' ? '' : '\C' .. middle), '\C' .. e,
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
981 flags, (): bool => InCommentOrString(), stopline, TIMEOUT)
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 def SearchPairStart( # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 start: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 middle: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 end: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 ): number
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 return SearchPair(start, middle, end, 'bnW')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992 def SearchPairEnd( # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 start: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 middle: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 end: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 stopline = 0,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 ): number
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 return SearchPair(start, middle, end, 'nW', stopline)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 # }}}2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001 # Test {{{2
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 def AtStartOf(line_A: dict<any>, syntax: string): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 if syntax == 'BracketBlock'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 return AtStartOfBracketBlock(line_A)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007 var pat: string = {
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 HereDoc: ASSIGNS_HEREDOC,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 FuncHeader: STARTS_FUNCTION
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 }[syntax]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 return line_A.text =~ pat
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 && (!exists('b:vimindent') || !b:vimindent->has_key('is_HereDoc'))
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 def AtStartOfBracketBlock(line_A: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 # We ignore bracket blocks while we're indenting a function header
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 # because it makes the logic simpler. It might mean that we don't
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 # indent correctly a multiline bracket block inside a function header,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 # but that's a corner case for which it doesn't seem worth making the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 # code more complex.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 if exists('b:vimindent')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 && !b:vimindent->has_key('is_BracketBlock')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 cursor(line_A.lnum, [line_A.lnum, '$']->col())
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 if SearchPair(OPENING_BRACKET, '', CLOSING_BRACKET, 'bcW', line_A.lnum) <= 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 # Don't restore the cursor position.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 # It needs to be on a bracket for `CacheBracketBlock()` to work as intended.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036 return line_A->EndsWithOpeningBracket()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 || line_A->EndsWithCommaOrDictKey()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038 || line_A->EndsWithLambdaArrow()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 def ContinuesBelowBracketBlock( # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 line_A: string,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 line_B: dict<any>,
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 block: dict<any>
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 ): bool
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 return !block->empty()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 && (line_A =~ LINE_CONTINUATION_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 || line_B->EndsWithLineContinuation())
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 def IsInside(lnum: number, syntax: string): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 if !exists('b:vimindent')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 || !b:vimindent->has_key($'is_{syntax}')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 if syntax == 'BracketBlock'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 if !b:vimindent->has_key('block_stack')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 || b:vimindent.block_stack->empty()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1061 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 return lnum <= b:vimindent.block_stack[0].endlnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 return lnum <= b:vimindent.endlnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069 def IsRightBelow(lnum: number, syntax: string): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 return exists('b:vimindent')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071 && b:vimindent->has_key($'is_{syntax}')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 && lnum > b:vimindent.endlnum
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1074
30875
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
1075 def IsInCurlyBlock(): bool # {{{3
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
1076 return b:vimindent.block_stack
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
1077 ->indexof((_, block: dict<any>): bool => block.is_curly_block) >= 0
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
1078 enddef
3295247d97a5 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 30634
diff changeset
1079
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 def IsInThisBlock(line_A: dict<any>, lnum: number): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 cursor(lnum, [lnum, '$']->col())
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 var end: number = SearchPairEnd('{', '', '}')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086 return line_A.lnum <= end
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1089 def IsInInterface(): bool # {{{3
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1090 return SearchPair('interface', '', 'endinterface', 'nW') > 0
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1091 enddef
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1092
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 def IsFirstLineOfCommand(line_1: dict<any>, line_2: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 if line_1.text->Is_IN_KeywordForLoop(line_2.text)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 if line_1.text =~ RANGE_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 || line_1.text =~ PLUS_MINUS_COMMAND
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 return true
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1101 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1103 if line_2.text =~ DICT_KEY
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 && !line_1->IsInThisBlock(line_2.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 return true
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 var line_1_is_good: bool = line_1.text !~ COMMENT
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 && line_1.text !~ DICT_KEY
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1110 && line_1.text !~ LINE_CONTINUATION_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1111
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112 var line_2_is_good: bool = !line_2->EndsWithLineContinuation()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1113
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 return line_1_is_good && line_2_is_good
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1115 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1116
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1117 def Is_IN_KeywordForLoop(line_1: string, line_2: string): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 return line_2 =~ '^\s*for\s'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1119 && line_1 =~ '^\s*in\s'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122 def InCommentOrString(): bool # {{{3
32061
b2412874362f Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 31885
diff changeset
1123 return synstack('.', col('.'))
b2412874362f Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 31885
diff changeset
1124 ->indexof((_, id: number): bool => synIDattr(id, 'name') =~ '\ccomment\|string\|heredoc') >= 0
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1127 def AlsoClosesBlock(line_B: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1128 # We know that `line_B` opens a block.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 # Let's see if it also closes that block.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 var kwd: string = BlockStartKeyword(line_B.text)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 if !START_MIDDLE_END->has_key(kwd)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135 var [start: string, middle: string, end: string] = START_MIDDLE_END[kwd]
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 cursor(line_B.lnum, 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 var block_end: number = SearchPairEnd(start, middle, end, line_B.lnum)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 return block_end > 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 def EndsWithComma(line: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 return NonCommentedMatch(line, COMMA_AT_EOL)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 def EndsWithCommaOrDictKey(line_A: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 return NonCommentedMatch(line_A, COMMA_OR_DICT_KEY_AT_EOL)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 def EndsWithCurlyBlock(line_B: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1153 return NonCommentedMatch(line_B, STARTS_CURLY_BLOCK)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 def EndsWithLambdaArrow(line_A: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 return NonCommentedMatch(line_A, LAMBDA_ARROW_AT_EOL)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160 def EndsWithLineContinuation(line_B: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 return NonCommentedMatch(line_B, LINE_CONTINUATION_AT_EOL)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1164 def EndsWithOpeningBracket(line: dict<any>): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165 return NonCommentedMatch(line, OPENING_BRACKET_AT_EOL)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1168 def EndsWithClosingBracket(line: dict<any>): bool # {{{3
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1169 return NonCommentedMatch(line, CLOSING_BRACKET_AT_EOL)
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1170 enddef
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1171
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 def NonCommentedMatch(line: dict<any>, pat: string): bool # {{{3
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 # Could happen if there is no code above us, and we're not on the 1st line.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 # In that case, `PrevCodeLine()` returns `{lnum: 0, line: ''}`.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 if line.lnum == 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 # Technically, that's wrong. A line might start with a range and end with a
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 # line continuation symbol. But it's unlikely. And it's useful to assume the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 # opposite because it prevents us from conflating a mark with an operator or
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 # the start of a list:
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 # not a comparison operator
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 # v
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 # :'< mark <
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 # :'< mark [
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 # ^
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 # not the start of a list
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190 if line.text =~ RANGE_AT_SOL
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 # that's not an arithmetic operator
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 # v
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 # catch /pattern /
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 # When `/` is used as a pattern delimiter, it's always present twice.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 # And usually, the first occurrence is in the middle of a sequence of
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 # non-whitespace characters. If we can find such a `/`, we assume that the
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 # trailing `/` is not an operator.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 # Warning: Here, don't use a too complex pattern.{{{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 # In particular, avoid backreferences.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 # For example, this would be too costly:
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 # if line.text =~ $'\%(\S*\({PATTERN_DELIMITER}\)\S\+\|\S\+\({PATTERN_DELIMITER}\)\S*\)'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 # .. $'\s\+\1{END_OF_COMMAND}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 # Sometimes, it could even give `E363`.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 #}}}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 var delim: string = line.text
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 ->matchstr($'\s\+\zs{PATTERN_DELIMITER}\ze{END_OF_COMMAND}')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 if !delim->empty()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 delim = $'\V{delim}\m'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 if line.text =~ $'\%(\S*{delim}\S\+\|\S\+{delim}\S*\)\s\+{delim}{END_OF_COMMAND}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220 # TODO: We might still miss some corner cases:{{{
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222 # conflated with arithmetic division
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 # v
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224 # substitute/pat / rep /
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 # echo
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226 # ^--^
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 # ✘
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229 # A better way to handle all these corner cases, would be to inspect the top
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230 # of the syntax stack:
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 # :echo synID('.', col('.'), v:false)->synIDattr('name')
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233 #
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 # Unfortunately, the legacy syntax plugin is not accurate enough.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 # For example, it doesn't highlight a slash as an operator.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 # }}}
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 # `%` at the end of a line is tricky.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239 # It might be the modulo operator or the current file (e.g. `edit %`).
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 # Let's assume it's the latter.
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241 if line.text =~ $'%{END_OF_COMMAND}'
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244
31885
cc751d944b7e Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 31671
diff changeset
1245 if line.text =~ TRICKY_COMMANDS
30547
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 return false
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 endif
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 var pos: list<number> = getcurpos()
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 cursor(line.lnum, 1)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 var match_lnum: number = search(pat, 'cnW', line.lnum, TIMEOUT, (): bool => InCommentOrString())
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252 setpos('.', pos)
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 return match_lnum > 0
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 enddef
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 # }}}1
1e91e26ceebf Update runtime files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 # vim:sw=4