annotate runtime/autoload/dist/vimindent.vim @ 32836:f0854888250f

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