Mercurial > vim
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 |
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 |