Bram Moolenaar | 544d3bc | 2017-02-05 21:14:50 +0100 | [diff] [blame] | 1 | " Functions about view shared by several tests |
| 2 | |
Bram Moolenaar | 0aa398f | 2017-09-30 21:23:55 +0200 | [diff] [blame] | 3 | " Only load this script once. |
Bram Moolenaar | 7a39dd7 | 2019-06-23 00:50:15 +0200 | [diff] [blame] | 4 | if exists('*Screenline') |
Bram Moolenaar | 0aa398f | 2017-09-30 21:23:55 +0200 | [diff] [blame] | 5 | finish |
| 6 | endif |
| 7 | |
Bram Moolenaar | 7a39dd7 | 2019-06-23 00:50:15 +0200 | [diff] [blame] | 8 | " Get line "lnum" as displayed on the screen. |
| 9 | " Trailing white space is trimmed. |
| 10 | func Screenline(lnum) |
| 11 | let chars = [] |
| 12 | for c in range(1, winwidth(0)) |
| 13 | call add(chars, nr2char(screenchar(a:lnum, c))) |
| 14 | endfor |
| 15 | let line = join(chars, '') |
| 16 | return matchstr(line, '^.\{-}\ze\s*$') |
| 17 | endfunc |
| 18 | |
Bram Moolenaar | 2912abb | 2019-03-29 14:16:42 +0100 | [diff] [blame] | 19 | " Get text on the screen, including composing characters. |
| 20 | " ScreenLines(lnum, width) or |
| 21 | " ScreenLines([start, end], width) |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 22 | func ScreenLines(lnum, width) abort |
Bram Moolenaar | 2912abb | 2019-03-29 14:16:42 +0100 | [diff] [blame] | 23 | redraw! |
| 24 | if type(a:lnum) == v:t_list |
| 25 | let start = a:lnum[0] |
| 26 | let end = a:lnum[1] |
| 27 | else |
| 28 | let start = a:lnum |
| 29 | let end = a:lnum |
| 30 | endif |
| 31 | let lines = [] |
| 32 | for l in range(start, end) |
| 33 | let lines += [join(map(range(1, a:width), 'screenstring(l, v:val)'), '')] |
| 34 | endfor |
| 35 | return lines |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 36 | endfunc |
Bram Moolenaar | 2912abb | 2019-03-29 14:16:42 +0100 | [diff] [blame] | 37 | |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 38 | func ScreenAttrs(lnum, width) abort |
Bram Moolenaar | 0aa398f | 2017-09-30 21:23:55 +0200 | [diff] [blame] | 39 | redraw! |
| 40 | if type(a:lnum) == v:t_list |
| 41 | let start = a:lnum[0] |
| 42 | let end = a:lnum[1] |
| 43 | else |
| 44 | let start = a:lnum |
| 45 | let end = a:lnum |
| 46 | endif |
| 47 | let attrs = [] |
| 48 | for l in range(start, end) |
| 49 | let attrs += [map(range(1, a:width), 'screenattr(l, v:val)')] |
| 50 | endfor |
| 51 | return attrs |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 52 | endfunc |
Bram Moolenaar | 0aa398f | 2017-09-30 21:23:55 +0200 | [diff] [blame] | 53 | |
Bram Moolenaar | a9a6b03 | 2023-02-05 18:00:42 +0000 | [diff] [blame] | 54 | " Create a new window with the requested size and fix it. |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 55 | func NewWindow(height, width) abort |
Bram Moolenaar | 544d3bc | 2017-02-05 21:14:50 +0100 | [diff] [blame] | 56 | exe a:height . 'new' |
| 57 | exe a:width . 'vsp' |
Bram Moolenaar | bffba7f | 2019-09-20 17:00:17 +0200 | [diff] [blame] | 58 | set winfixwidth winfixheight |
Bram Moolenaar | 544d3bc | 2017-02-05 21:14:50 +0100 | [diff] [blame] | 59 | redraw! |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 60 | endfunc |
Bram Moolenaar | 544d3bc | 2017-02-05 21:14:50 +0100 | [diff] [blame] | 61 | |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 62 | func CloseWindow() abort |
Bram Moolenaar | 544d3bc | 2017-02-05 21:14:50 +0100 | [diff] [blame] | 63 | bw! |
| 64 | redraw! |
Bram Moolenaar | 97f0eb1 | 2022-10-06 19:49:13 +0100 | [diff] [blame] | 65 | endfunc |
Bram Moolenaar | 64fabf3 | 2022-11-27 13:51:22 +0000 | [diff] [blame] | 66 | |
| 67 | |
| 68 | " When using RunVimInTerminal() we expect modifyOtherKeys level 2 to be enabled |
| 69 | " automatically. The key + modifier Escape codes must then use the |
| 70 | " modifyOtherKeys encoding. They are recognized anyway, thus it's safer to use |
| 71 | " than the raw code. |
| 72 | |
| 73 | " Return the modifyOtherKeys level 2 encoding for "key" with "modifier" |
Oleg Goncharov | 56904f9 | 2024-07-23 20:34:15 +0200 | [diff] [blame] | 74 | " (number value, e.g. CTRL is 5, Shift is 2, Alt is 3). |
Bram Moolenaar | 64fabf3 | 2022-11-27 13:51:22 +0000 | [diff] [blame] | 75 | func GetEscCodeCSI27(key, modifier) |
| 76 | let key = printf("%d", char2nr(a:key)) |
| 77 | let mod = printf("%d", a:modifier) |
| 78 | return "\<Esc>[27;" .. mod .. ';' .. key .. '~' |
| 79 | endfunc |
| 80 | |
| 81 | " Return the modifyOtherKeys level 2 encoding for "key" with "modifier" |
| 82 | " (character value, e.g. CTRL is "C"). |
| 83 | func GetEscCodeWithModifier(modifier, key) |
| 84 | let modifier = get({'C': 5}, a:modifier, '') |
| 85 | if modifier == '' |
| 86 | echoerr 'Unknown modifier: ' .. a:modifier |
| 87 | endif |
| 88 | return GetEscCodeCSI27(a:key, modifier) |
| 89 | endfunc |
| 90 | |
| 91 | " Return the kitty keyboard protocol encoding for "key" with "modifier" |
| 92 | " (number value, e.g. CTRL is 5). |
| 93 | func GetEscCodeCSIu(key, modifier) |
| 94 | let key = printf("%d", char2nr(a:key)) |
| 95 | let mod = printf("%d", a:modifier) |
| 96 | return "\<Esc>[" .. key .. ';' .. mod .. 'u' |
| 97 | endfunc |
| 98 | |
Bram Moolenaar | 1a17340 | 2022-12-02 12:28:47 +0000 | [diff] [blame] | 99 | " Return the kitty keyboard protocol encoding for a function key: |
| 100 | " CSI {key} |
| 101 | " CSS 1;{modifier} {key} |
| 102 | func GetEscCodeFunckey(key, modifier) |
| 103 | if a:modifier == 0 |
| 104 | return "\<Esc>[" .. a:key |
| 105 | endif |
| 106 | |
| 107 | let mod = printf("%d", a:modifier) |
| 108 | return "\<Esc>[1;".. mod .. a:key |
| 109 | endfunc |
| 110 | |
Bram Moolenaar | 64fabf3 | 2022-11-27 13:51:22 +0000 | [diff] [blame] | 111 | " Return the kitty keyboard protocol encoding for "key" without a modifier. |
| 112 | " Used for the Escape key. |
| 113 | func GetEscCodeCSIuWithoutModifier(key) |
| 114 | let key = printf("%d", char2nr(a:key)) |
| 115 | return "\<Esc>[" .. key .. 'u' |
| 116 | endfunc |
| 117 | |