annotate runtime/autoload/racket.vim @ 34653:8079960136db v9.1.0211

patch 9.1.0211: page-wise scrolling does not support smooth-scrolling Commit: https://github.com/vim/vim/commit/b9f5b95b7bec2414a5a96010514702d99afea18e Author: Luuk van Baal <luukvbaal@gmail.com> Date: Tue Mar 26 18:46:45 2024 +0100 patch 9.1.0211: page-wise scrolling does not support smooth-scrolling Problem: Page-wise scrolling with Ctrl-F/Ctrl-B implements it's own logic to change the topline and cursor. In doing so, skipcol is not handled properly for 'smoothscroll', and virtual lines. Solution: Re-use the logic from Ctrl-E/Ctrl-Y while staying backward compatible as much as possible. closes: #14268 Signed-off-by: Luuk van Baal <luukvbaal@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 26 Mar 2024 19:00:04 +0100
parents e0535b3b9d77
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33956
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
1 " Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
2 " URL: https://github.com/benknoble/vim-racket
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
3 " Last Change: 2023 Sep 22
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
4 vim9script
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
5
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
6 def MakePatternFromLiterals(xs: list<string>): string
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
7 return printf('\V%s', xs->mapnew((_, v) => escape(v, '\'))->join('\|'))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
8 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
9
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
10 const openers = ['(', '[', '{']
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
11 const closers = {'(': ')', '[': ']', '{': '}'}
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
12 const brackets_pattern: string = closers->items()->flattennew()->MakePatternFromLiterals()
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
13
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
14 # transliterated from a modified copy of src/indent.c
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
15
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
16 export def Indent(): number
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
17 if InHerestring(v:lnum)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
18 return -1
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
19 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
20 # Indent from first column to avoid odd results from nested forms.
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
21 cursor(v:lnum, 1)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
22 const bracket = FindBracket()
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
23 if bracket == null_dict || !bracket.found
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
24 return -1
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
25 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
26
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
27 # assert_report(printf('{lnum: %d, str: %s, found: %s, line: %d, column: %d}',
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
28 # v:lnum, getline(bracket.line)[bracket.column - 1], bracket.found, bracket.line, bracket.column))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
29 # N.B. Column =/= Line Index; Columns start at 1
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
30 const amount: number = bracket.column
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
31 const line = getline(bracket.line)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
32
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
33 const lw = Lispword(line[bracket.column :])
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
34 if !IsForFold(lw) # skip: see comments about for/fold special case below
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
35 # "Extra trick"
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
36 var current = prevnonblank(v:lnum - 1)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
37 while current > bracket.line
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
38 cursor(current, 1)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
39 if getline(current) !~# '^\s*;' && synID(current, 1, 0)->synIDattr('name') !~? 'string' && FindBracket() == bracket
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
40 return indent(current)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
41 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
42 current = prevnonblank(current - 1)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
43 endwhile
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
44 cursor(v:lnum, 1)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
45 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
46
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
47 if index(openers, line[bracket.column - 1]) >= 0 && !empty(lw)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
48 # Special case for/fold &co. The iterator clause (2nd form) is indented
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
49 # under the accumulator clause (1st form). Everything else is standard.
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
50 const start_of_first_form = match(line[bracket.column :], MakePatternFromLiterals(openers))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
51 # assert_report(printf('{line: %s}', line))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
52 # assert_report(printf('{start: %s}', start_of_first_form >= 0 ? line[bracket.column + start_of_first_form :] : '<NULL>'))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
53 if IsForFold(lw) && IsSecondForm(bracket.line, bracket.column, v:lnum) && start_of_first_form >= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
54 return amount + start_of_first_form
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
55 else
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
56 # Lispword, but not for/fold second form (or first form couldn't be
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
57 # found): indent like define or lambda.
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
58 # 2 extra indent, but subtract 1 for columns starting at 1.
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
59 # Current vim9 doesn't constant fold "x + 2 - 1", so write "x + 1"
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
60 return amount + 1
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
61 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
62 else
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
63 # assert_report(printf('{line: %s}', line[bracket.column :]))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
64 return amount + IndentForContinuation(bracket.line, bracket.column, line[bracket.column :])
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
65 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
66 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
67
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
68 def InHerestring(start: number): bool
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
69 return synID(start, col([start, '$']) - 1, 0)->synIDattr('name') =~? 'herestring'
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
70 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
71
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
72 def FindBracket(): dict<any>
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
73 const paren = FindMatch('(', ')')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
74 const square = FindMatch('\[', ']')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
75 const curly = FindMatch('{', '}')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
76 return null_dict
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
77 ->MatchMax(paren)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
78 ->MatchMax(square)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
79 ->MatchMax(curly)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
80 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
81
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
82 def Lispword(line: string): string
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
83 # assume keyword on same line as opener
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
84 const word: string = matchstr(line, '^\s*\k\+\>')->trim()
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
85 # assert_report(printf('line: %s; word: %s', line, word))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
86 # assert_report(&l:lispwords->split(',')->index(word) >= 0 ? 't' : 'f')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
87 return &l:lispwords->split(',')->index(word) >= 0 ? word : ''
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
88 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
89
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
90 # line contains everything on line_nr after column
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
91 def IndentForContinuation(line_nr: number, column: number, line: string): number
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
92 const end = len(line)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
93 var indent = match(line, '[^[:space:]]')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
94 # first word is a string or some other literal (or maybe a form); assume that
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
95 # the current line is outside such a thing
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
96 if indent < end && ['"', '#']->index(line[indent]) >= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
97 return indent
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
98 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
99 if indent < end && ["'", '`']->index(line[indent]) >= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
100 # could be a form or a word. Advance one and see.
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
101 ++indent
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
102 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
103 if indent < end && ['(', '[', '{']->index(line[indent]) >= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
104 # there's a form; assume outside, but need to skip it to see if any others
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
105 cursor(line_nr, column + indent + 1)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
106 # assert_report(getline(line_nr)[column + indent :])
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
107 normal! %
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
108 const [_, matched_line, matched_col, _, _] = getcursorcharpos()
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
109 if line_nr != matched_line || matched_col == column + indent + 1
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
110 return indent
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
111 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
112 indent = matched_col - column
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
113 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
114 var in_delim: bool
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
115 var quoted: bool
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
116 while indent < end && (line[indent] !~# '\s' || in_delim || quoted)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
117 if line[indent] == '\' && !in_delim
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
118 quoted = true
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
119 else
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
120 quoted = false
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
121 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
122 if line[indent] == '|' && !quoted
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
123 in_delim = !in_delim
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
124 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
125 ++indent
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
126 endwhile
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
127 # not handling newlines in first words
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
128 if quoted || in_delim
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
129 return 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
130 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
131 # no other word on this line
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
132 if indent == end
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
133 return 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
134 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
135 # find beginning of next word
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
136 indent += match(line[indent :], '[^[:space:]]')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
137 return indent
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
138 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
139
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
140 def FindMatch(start: string, end: string): dict<any>
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
141 # TODO too slow…
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
142 # could try replicating C? might have false positives. Or make "100"
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
143 # configurable number: for amounts of indent bodies, we're still fast enough…
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
144 const [linenr, column] = searchpairpos(start, '', end, 'bnzW',
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
145 () =>
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
146 synID(line('.'), col('.'), 0)->synIDattr('name') =~? 'char\|string\|comment',
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
147 line('.') > 100 ? line('.') - 100 : 0)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
148 if linenr > 0 && column > 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
149 return {found: true, line: linenr, column: column}
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
150 else
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
151 return {found: false, line: linenr, column: column}
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
152 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
153 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
154
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
155 def MatchMax(left: dict<any>, right: dict<any>): dict<any>
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
156 if left == null_dict || !left.found
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
157 return right
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
158 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
159 if right == null_dict || !right.found
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
160 return left
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
161 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
162 # left and right non-null, both found
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
163 return PosLT(left, right) ? right : left
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
164 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
165
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
166 def PosLT(left: dict<any>, right: dict<any>): bool
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
167 return left.line != right.line
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
168 \ ? left.line < right.line
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
169 \ : (left.column != right.column && left.column < right.column)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
170 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
171
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
172 def IsForFold(word: string): bool
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
173 return ['for/fold', 'for/foldr', 'for*/fold', 'for*/foldr']->index(word) >= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
174 enddef
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
175
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
176 def IsSecondForm(blnum: number, bcol: number, vlnum: number): bool
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
177 var forms_seen: number # "top-level" (inside for/fold) counter only
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
178 var [lnum, col] = [blnum, bcol + 1]
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
179 cursor(lnum, col)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
180 var stack: list<string> = []
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
181
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
182 while lnum <= vlnum
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
183 const found = search(brackets_pattern, '', vlnum, 0, () =>
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
184 synID(line('.'), col('.'), 0)->synIDattr('name') =~? 'char\|string\|comment')
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
185 if found <= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
186 break
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
187 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
188 const pos = getcursorcharpos()
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
189 lnum = pos[1]
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
190 col = pos[2]
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
191 var current_char = getline(lnum)[col - 1]
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
192 # assert_report(printf('search: %d, %d: %s', lnum, col, current_char))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
193 # assert_report(printf('forms seen post-search: %d', forms_seen))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
194 if index(openers, current_char) >= 0
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
195 insert(stack, current_char)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
196 elseif !empty(stack) && current_char ==# closers[stack[0]]
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
197 stack = stack[1 :]
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
198 if empty(stack)
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
199 ++forms_seen
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
200 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
201 else
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
202 # parse failure of some kind: not an opener or not the correct closer
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
203 return false
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
204 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
205 # assert_report(printf('forms seen pre-check: %d', forms_seen))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
206 if forms_seen > 2
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
207 return false
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
208 endif
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
209 endwhile
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
210
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
211 # assert_report(printf('forms seen pre-return: %d', forms_seen))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
212 return forms_seen == 2 || (forms_seen == 1 && !empty(stack))
e0535b3b9d77 runtime(racket): update Racket runtime files (#13693)
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
213 enddef