blob: de4ff83efb661ec467185c3515ddfba96ca28644 [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
9
10/*
11 * digraph.c: code for digraphs
12 */
13
14#include "vim.h"
15
16#if defined(FEAT_DIGRAPHS) || defined(PROTO)
17
Bram Moolenaar071d4272004-06-13 20:20:40 +000018typedef int result_T;
Bram Moolenaar071d4272004-06-13 20:20:40 +000019
20typedef struct digraph
21{
22 char_u char1;
23 char_u char2;
24 result_T result;
25} digr_T;
26
Bram Moolenaareae8ae12018-12-14 18:53:02 +010027static void printdigraph(digr_T *dp, result_T *previous);
Bram Moolenaar071d4272004-06-13 20:20:40 +000028
Bram Moolenaar5d18efe2019-12-01 21:11:22 +010029// digraphs added by the user
Bram Moolenaar0ab2a882009-05-13 10:51:08 +000030static garray_T user_digraphs = {0, 0, (int)sizeof(digr_T), 10, NULL};
Bram Moolenaar071d4272004-06-13 20:20:40 +000031
32/*
33 * Note: Characters marked with XX are not included literally, because some
34 * compilers cannot handle them (Amiga SAS/C is the most picky one).
35 */
Bram Moolenaar6c0b44b2005-06-01 21:56:33 +000036static digr_T digraphdefault[] =
Bram Moolenaar071d4272004-06-13 20:20:40 +000037
Bram Moolenaare3f915d2020-07-14 23:02:44 +020038#ifdef HPUX_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +000039 /*
40 * different HPUX digraphs
41 */
Bram Moolenaar5d18efe2019-12-01 21:11:22 +010042 {{'A', '`', 161}, // ¡
43 {'A', '^', 162}, // ¢
44 {'E', '`', 163}, // £
45 {'E', '^', 164}, // ¤
46 {'E', '"', 165}, // ¥
47 {'I', '^', 166}, // ¦
48 {'I', '"', 167}, // §
49 {'\'', '\'', 168}, // ¨
50 {'`', '`', 169}, // ©
51 {'^', '^', 170}, // ª
52 {'"', '"', 171}, // «
53 {'~', '~', 172}, // ¬
54 {'U', '`', 173}, // ­
55 {'U', '^', 174}, // ®
56 {'L', '=', 175}, // ¯
57 {'~', '_', 176}, // °
58 {'Y', '\'', 177}, // ±
59 {'y', '\'', 178}, // ²
60 {'~', 'o', 179}, // ³
61 {'C', ',', 180}, // ´
62 {'c', ',', 181}, // µ
63 {'N', '~', 182}, // ¶
64 {'n', '~', 183}, // ·
65 {'~', '!', 184}, // ¸
66 {'~', '?', 185}, // ¹
67 {'o', 'x', 186}, // º
68 {'L', '-', 187}, // »
69 {'Y', '=', 188}, // ¼
70 {'p', 'p', 189}, // ½
71 {'f', 'l', 190}, // ¾
72 {'c', '|', 191}, // ¿
73 {'a', '^', 192}, // À
74 {'e', '^', 193}, // Á
75 {'o', '^', 194}, // Â
76 {'u', '^', 195}, // Ã
77 {'a', '\'', 196}, // Ä
78 {'e', '\'', 197}, // Å
79 {'o', '\'', 198}, // Æ
80 {'u', '\'', 199}, // Ç
81 {'a', '`', 200}, // È
82 {'e', '`', 201}, // É
83 {'o', '`', 202}, // Ê
84 {'u', '`', 203}, // Ë
85 {'a', '"', 204}, // Ì
86 {'e', '"', 205}, // Í
87 {'o', '"', 206}, // Î
88 {'u', '"', 207}, // Ï
89 {'A', 'o', 208}, // Ð
90 {'i', '^', 209}, // Ñ
91 {'O', '/', 210}, // Ò
92 {'A', 'E', 211}, // Ó
93 {'a', 'o', 212}, // Ô
94 {'i', '\'', 213}, // Õ
95 {'o', '/', 214}, // Ö
96 {'a', 'e', 215}, // ×
97 {'A', '"', 216}, // Ø
98 {'i', '`', 217}, // Ù
99 {'O', '"', 218}, // Ú
100 {'U', '"', 219}, // Û
101 {'E', '\'', 220}, // Ü
102 {'i', '"', 221}, // Ý
103 {'s', 's', 222}, // Þ
104 {'O', '^', 223}, // ß
105 {'A', '\'', 224}, // à
106 {'A', '~', 225}, // á
107 {'a', '~', 226}, // â
108 {'D', '-', 227}, // ã
109 {'d', '-', 228}, // ä
110 {'I', '\'', 229}, // å
111 {'I', '`', 230}, // æ
112 {'O', '\'', 231}, // ç
113 {'O', '`', 232}, // è
114 {'O', '~', 233}, // é
115 {'o', '~', 234}, // ê
116 {'S', '~', 235}, // ë
117 {'s', '~', 236}, // ì
118 {'U', '\'', 237}, // í
119 {'Y', '"', 238}, // î
120 {'y', '"', 239}, // ï
121 {'p', '-', 240}, // ð
122 {'p', '~', 241}, // ñ
123 {'~', '.', 242}, // ò
124 {'j', 'u', 243}, // ó
125 {'P', 'p', 244}, // ô
126 {'3', '4', 245}, // õ
127 {'-', '-', 246}, // ö
128 {'1', '4', 247}, // ÷
129 {'1', '2', 248}, // ø
130 {'a', '_', 249}, // ù
131 {'o', '_', 250}, // ú
132 {'<', '<', 251}, // û
133 {'x', 'x', 252}, // ü
134 {'>', '>', 253}, // ý
135 {'+', '-', 254}, // þ
136 {'n', 'u', 255}, // x XX
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137 {NUL, NUL, NUL}
138 };
139
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200140#else // !HPUX_DIGRAPHS
Bram Moolenaar424bcae2022-01-31 14:59:41 +0000141# ifdef OLD_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142
143 /*
144 * digraphs compatible with Vim 5.x
145 */
Bram Moolenaar5d18efe2019-12-01 21:11:22 +0100146 {{'~', '!', 161}, // ¡
147 {'c', '|', 162}, // ¢
148 {'$', '$', 163}, // £
149 {'o', 'x', 164}, // ¤ - currency symbol in ISO 8859-1
150 {'e', '=', 164}, // ¤ - euro symbol in ISO 8859-15
151 {'Y', '-', 165}, // ¥
152 {'|', '|', 166}, // ¦
153 {'p', 'a', 167}, // §
154 {'"', '"', 168}, // ¨
155 {'c', 'O', 169}, // ©
156 {'a', '-', 170}, // ª
157 {'<', '<', 171}, // «
158 {'-', ',', 172}, // ¬
159 {'-', '-', 173}, // ­
160 {'r', 'O', 174}, // ®
161 {'-', '=', 175}, // ¯
162 {'~', 'o', 176}, // °
163 {'+', '-', 177}, // ±
164 {'2', '2', 178}, // ²
165 {'3', '3', 179}, // ³
166 {'\'', '\'', 180}, // ´
167 {'j', 'u', 181}, // µ
168 {'p', 'p', 182}, // ¶
169 {'~', '.', 183}, // ·
170 {',', ',', 184}, // ¸
171 {'1', '1', 185}, // ¹
172 {'o', '-', 186}, // º
173 {'>', '>', 187}, // »
174 {'1', '4', 188}, // ¼
175 {'1', '2', 189}, // ½
176 {'3', '4', 190}, // ¾
177 {'~', '?', 191}, // ¿
178 {'A', '`', 192}, // À
179 {'A', '\'', 193}, // Á
180 {'A', '^', 194}, // Â
181 {'A', '~', 195}, // Ã
182 {'A', '"', 196}, // Ä
183 {'A', '@', 197}, // Å
184 {'A', 'A', 197}, // Å
185 {'A', 'E', 198}, // Æ
186 {'C', ',', 199}, // Ç
187 {'E', '`', 200}, // È
188 {'E', '\'', 201}, // É
189 {'E', '^', 202}, // Ê
190 {'E', '"', 203}, // Ë
191 {'I', '`', 204}, // Ì
192 {'I', '\'', 205}, // Í
193 {'I', '^', 206}, // Î
194 {'I', '"', 207}, // Ï
195 {'D', '-', 208}, // Ð
196 {'N', '~', 209}, // Ñ
197 {'O', '`', 210}, // Ò
198 {'O', '\'', 211}, // Ó
199 {'O', '^', 212}, // Ô
200 {'O', '~', 213}, // Õ
201 {'O', '"', 214}, // Ö
202 {'/', '\\', 215}, // × - multiplication symbol in ISO 8859-1
203 {'O', 'E', 215}, // × - OE in ISO 8859-15
204 {'O', '/', 216}, // Ø
205 {'U', '`', 217}, // Ù
206 {'U', '\'', 218}, // Ú
207 {'U', '^', 219}, // Û
208 {'U', '"', 220}, // Ü
209 {'Y', '\'', 221}, // Ý
210 {'I', 'p', 222}, // Þ
211 {'s', 's', 223}, // ß
212 {'a', '`', 224}, // à
213 {'a', '\'', 225}, // á
214 {'a', '^', 226}, // â
215 {'a', '~', 227}, // ã
216 {'a', '"', 228}, // ä
217 {'a', '@', 229}, // å
218 {'a', 'a', 229}, // å
219 {'a', 'e', 230}, // æ
220 {'c', ',', 231}, // ç
221 {'e', '`', 232}, // è
222 {'e', '\'', 233}, // é
223 {'e', '^', 234}, // ê
224 {'e', '"', 235}, // ë
225 {'i', '`', 236}, // ì
226 {'i', '\'', 237}, // í
227 {'i', '^', 238}, // î
228 {'i', '"', 239}, // ï
229 {'d', '-', 240}, // ð
230 {'n', '~', 241}, // ñ
231 {'o', '`', 242}, // ò
232 {'o', '\'', 243}, // ó
233 {'o', '^', 244}, // ô
234 {'o', '~', 245}, // õ
235 {'o', '"', 246}, // ö
236 {':', '-', 247}, // ÷ - division symbol in ISO 8859-1
237 {'o', 'e', 247}, // ÷ - oe in ISO 8859-15
238 {'o', '/', 248}, // ø
239 {'u', '`', 249}, // ù
240 {'u', '\'', 250}, // ú
241 {'u', '^', 251}, // û
242 {'u', '"', 252}, // ü
243 {'y', '\'', 253}, // ý
244 {'i', 'p', 254}, // þ
245 {'y', '"', 255}, // x XX
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 {NUL, NUL, NUL}
247 };
Bram Moolenaar424bcae2022-01-31 14:59:41 +0000248# else // OLD_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249
250 /*
251 * digraphs for Unicode from RFC1345
252 * (also work for ISO-8859-1 aka latin1)
253 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000254 {
Bram Moolenaar5d18efe2019-12-01 21:11:22 +0100255 {'N', 'U', 0x0a}, // LF for NUL
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256 {'S', 'H', 0x01},
257 {'S', 'X', 0x02},
258 {'E', 'X', 0x03},
259 {'E', 'T', 0x04},
260 {'E', 'Q', 0x05},
261 {'A', 'K', 0x06},
262 {'B', 'L', 0x07},
263 {'B', 'S', 0x08},
264 {'H', 'T', 0x09},
265 {'L', 'F', 0x0a},
266 {'V', 'T', 0x0b},
267 {'F', 'F', 0x0c},
268 {'C', 'R', 0x0d},
269 {'S', 'O', 0x0e},
270 {'S', 'I', 0x0f},
271 {'D', 'L', 0x10},
272 {'D', '1', 0x11},
273 {'D', '2', 0x12},
274 {'D', '3', 0x13},
275 {'D', '4', 0x14},
276 {'N', 'K', 0x15},
277 {'S', 'Y', 0x16},
278 {'E', 'B', 0x17},
279 {'C', 'N', 0x18},
280 {'E', 'M', 0x19},
281 {'S', 'B', 0x1a},
282 {'E', 'C', 0x1b},
283 {'F', 'S', 0x1c},
284 {'G', 'S', 0x1d},
285 {'R', 'S', 0x1e},
286 {'U', 'S', 0x1f},
287 {'S', 'P', 0x20},
288 {'N', 'b', 0x23},
289 {'D', 'O', 0x24},
290 {'A', 't', 0x40},
291 {'<', '(', 0x5b},
292 {'/', '/', 0x5c},
293 {')', '>', 0x5d},
294 {'\'', '>', 0x5e},
295 {'\'', '!', 0x60},
296 {'(', '!', 0x7b},
297 {'!', '!', 0x7c},
298 {'!', ')', 0x7d},
299 {'\'', '?', 0x7e},
300 {'D', 'T', 0x7f},
301 {'P', 'A', 0x80},
302 {'H', 'O', 0x81},
303 {'B', 'H', 0x82},
304 {'N', 'H', 0x83},
305 {'I', 'N', 0x84},
306 {'N', 'L', 0x85},
307 {'S', 'A', 0x86},
308 {'E', 'S', 0x87},
309 {'H', 'S', 0x88},
310 {'H', 'J', 0x89},
311 {'V', 'S', 0x8a},
312 {'P', 'D', 0x8b},
313 {'P', 'U', 0x8c},
314 {'R', 'I', 0x8d},
315 {'S', '2', 0x8e},
316 {'S', '3', 0x8f},
317 {'D', 'C', 0x90},
318 {'P', '1', 0x91},
319 {'P', '2', 0x92},
320 {'T', 'S', 0x93},
321 {'C', 'C', 0x94},
322 {'M', 'W', 0x95},
323 {'S', 'G', 0x96},
324 {'E', 'G', 0x97},
325 {'S', 'S', 0x98},
326 {'G', 'C', 0x99},
327 {'S', 'C', 0x9a},
328 {'C', 'I', 0x9b},
329 {'S', 'T', 0x9c},
330 {'O', 'C', 0x9d},
331 {'P', 'M', 0x9e},
332 {'A', 'C', 0x9f},
333 {'N', 'S', 0xa0},
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200334# define DG_START_LATIN 0xa1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335 {'!', 'I', 0xa1},
Bram Moolenaar41193092019-08-24 21:53:31 +0200336 {'~', '!', 0xa1}, // ¡ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337 {'C', 't', 0xa2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200338 {'c', '|', 0xa2}, // ¢ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339 {'P', 'd', 0xa3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200340 {'$', '$', 0xa3}, // £ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000341 {'C', 'u', 0xa4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200342 {'o', 'x', 0xa4}, // ¤ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343 {'Y', 'e', 0xa5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200344 {'Y', '-', 0xa5}, // ¥ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000345 {'B', 'B', 0xa6},
Bram Moolenaar41193092019-08-24 21:53:31 +0200346 {'|', '|', 0xa6}, // ¦ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347 {'S', 'E', 0xa7},
348 {'\'', ':', 0xa8},
349 {'C', 'o', 0xa9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200350 {'c', 'O', 0xa9}, // © Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000351 {'-', 'a', 0xaa},
352 {'<', '<', 0xab},
353 {'N', 'O', 0xac},
Bram Moolenaar41193092019-08-24 21:53:31 +0200354 {'-', ',', 0xac}, // ¬ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355 {'-', '-', 0xad},
356 {'R', 'g', 0xae},
357 {'\'', 'm', 0xaf},
Bram Moolenaar41193092019-08-24 21:53:31 +0200358 {'-', '=', 0xaf}, // ¯ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359 {'D', 'G', 0xb0},
Bram Moolenaar41193092019-08-24 21:53:31 +0200360 {'~', 'o', 0xb0}, // ° Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361 {'+', '-', 0xb1},
362 {'2', 'S', 0xb2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200363 {'2', '2', 0xb2}, // ² Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364 {'3', 'S', 0xb3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200365 {'3', '3', 0xb3}, // ³ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366 {'\'', '\'', 0xb4},
367 {'M', 'y', 0xb5},
368 {'P', 'I', 0xb6},
Bram Moolenaar41193092019-08-24 21:53:31 +0200369 {'p', 'p', 0xb6}, // ¶ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370 {'.', 'M', 0xb7},
Bram Moolenaar41193092019-08-24 21:53:31 +0200371 {'~', '.', 0xb7}, // · Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372 {'\'', ',', 0xb8},
373 {'1', 'S', 0xb9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200374 {'1', '1', 0xb9}, // ¹ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375 {'-', 'o', 0xba},
376 {'>', '>', 0xbb},
377 {'1', '4', 0xbc},
378 {'1', '2', 0xbd},
379 {'3', '4', 0xbe},
380 {'?', 'I', 0xbf},
Bram Moolenaar41193092019-08-24 21:53:31 +0200381 {'~', '?', 0xbf}, // ¿ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382 {'A', '!', 0xc0},
Bram Moolenaar41193092019-08-24 21:53:31 +0200383 {'A', '`', 0xc0}, // À Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384 {'A', '\'', 0xc1},
385 {'A', '>', 0xc2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200386 {'A', '^', 0xc2}, // Â Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000387 {'A', '?', 0xc3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200388 {'A', '~', 0xc3}, // Ã Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000389 {'A', ':', 0xc4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200390 {'A', '"', 0xc4}, // Ä Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 {'A', 'A', 0xc5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200392 {'A', '@', 0xc5}, // Å Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000393 {'A', 'E', 0xc6},
394 {'C', ',', 0xc7},
395 {'E', '!', 0xc8},
Bram Moolenaar41193092019-08-24 21:53:31 +0200396 {'E', '`', 0xc8}, // È Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397 {'E', '\'', 0xc9},
398 {'E', '>', 0xca},
Bram Moolenaar41193092019-08-24 21:53:31 +0200399 {'E', '^', 0xca}, // Ê Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000400 {'E', ':', 0xcb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200401 {'E', '"', 0xcb}, // Ë Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000402 {'I', '!', 0xcc},
Bram Moolenaar41193092019-08-24 21:53:31 +0200403 {'I', '`', 0xcc}, // Ì Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404 {'I', '\'', 0xcd},
405 {'I', '>', 0xce},
Bram Moolenaar41193092019-08-24 21:53:31 +0200406 {'I', '^', 0xce}, // Î Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000407 {'I', ':', 0xcf},
Bram Moolenaar41193092019-08-24 21:53:31 +0200408 {'I', '"', 0xcf}, // Ï Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000409 {'D', '-', 0xd0},
410 {'N', '?', 0xd1},
Bram Moolenaar41193092019-08-24 21:53:31 +0200411 {'N', '~', 0xd1}, // Ñ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412 {'O', '!', 0xd2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200413 {'O', '`', 0xd2}, // Ò Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000414 {'O', '\'', 0xd3},
415 {'O', '>', 0xd4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200416 {'O', '^', 0xd4}, // Ô Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000417 {'O', '?', 0xd5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200418 {'O', '~', 0xd5}, // Õ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000419 {'O', ':', 0xd6},
420 {'*', 'X', 0xd7},
Bram Moolenaar41193092019-08-24 21:53:31 +0200421 {'/', '\\', 0xd7}, // × Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422 {'O', '/', 0xd8},
423 {'U', '!', 0xd9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200424 {'U', '`', 0xd9}, // Ù Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425 {'U', '\'', 0xda},
426 {'U', '>', 0xdb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200427 {'U', '^', 0xdb}, // Û Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000428 {'U', ':', 0xdc},
429 {'Y', '\'', 0xdd},
430 {'T', 'H', 0xde},
Bram Moolenaar41193092019-08-24 21:53:31 +0200431 {'I', 'p', 0xde}, // Þ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432 {'s', 's', 0xdf},
433 {'a', '!', 0xe0},
Bram Moolenaar41193092019-08-24 21:53:31 +0200434 {'a', '`', 0xe0}, // à Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000435 {'a', '\'', 0xe1},
436 {'a', '>', 0xe2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200437 {'a', '^', 0xe2}, // â Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438 {'a', '?', 0xe3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200439 {'a', '~', 0xe3}, // ã Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000440 {'a', ':', 0xe4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200441 {'a', '"', 0xe4}, // ä Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442 {'a', 'a', 0xe5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200443 {'a', '@', 0xe5}, // å Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444 {'a', 'e', 0xe6},
445 {'c', ',', 0xe7},
446 {'e', '!', 0xe8},
Bram Moolenaar41193092019-08-24 21:53:31 +0200447 {'e', '`', 0xe8}, // è Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000448 {'e', '\'', 0xe9},
449 {'e', '>', 0xea},
Bram Moolenaar41193092019-08-24 21:53:31 +0200450 {'e', '^', 0xea}, // ê Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451 {'e', ':', 0xeb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200452 {'e', '"', 0xeb}, // ë Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000453 {'i', '!', 0xec},
Bram Moolenaar41193092019-08-24 21:53:31 +0200454 {'i', '`', 0xec}, // ì Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000455 {'i', '\'', 0xed},
456 {'i', '>', 0xee},
Bram Moolenaar41193092019-08-24 21:53:31 +0200457 {'i', '^', 0xee}, // î Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000458 {'i', ':', 0xef},
459 {'d', '-', 0xf0},
460 {'n', '?', 0xf1},
Bram Moolenaar41193092019-08-24 21:53:31 +0200461 {'n', '~', 0xf1}, // ñ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000462 {'o', '!', 0xf2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200463 {'o', '`', 0xf2}, // ò Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464 {'o', '\'', 0xf3},
465 {'o', '>', 0xf4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200466 {'o', '^', 0xf4}, // ô Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467 {'o', '?', 0xf5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200468 {'o', '~', 0xf5}, // õ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469 {'o', ':', 0xf6},
470 {'-', ':', 0xf7},
471 {'o', '/', 0xf8},
472 {'u', '!', 0xf9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200473 {'u', '`', 0xf9}, // ù Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000474 {'u', '\'', 0xfa},
475 {'u', '>', 0xfb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200476 {'u', '^', 0xfb}, // û Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477 {'u', ':', 0xfc},
478 {'y', '\'', 0xfd},
479 {'t', 'h', 0xfe},
480 {'y', ':', 0xff},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100481 {'y', '"', 0xff}, // x XX Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200483# define USE_UNICODE_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000484
485 {'A', '-', 0x0100},
486 {'a', '-', 0x0101},
487 {'A', '(', 0x0102},
488 {'a', '(', 0x0103},
489 {'A', ';', 0x0104},
490 {'a', ';', 0x0105},
491 {'C', '\'', 0x0106},
492 {'c', '\'', 0x0107},
493 {'C', '>', 0x0108},
494 {'c', '>', 0x0109},
495 {'C', '.', 0x010a},
496 {'c', '.', 0x010b},
497 {'C', '<', 0x010c},
498 {'c', '<', 0x010d},
499 {'D', '<', 0x010e},
500 {'d', '<', 0x010f},
501 {'D', '/', 0x0110},
502 {'d', '/', 0x0111},
503 {'E', '-', 0x0112},
504 {'e', '-', 0x0113},
505 {'E', '(', 0x0114},
506 {'e', '(', 0x0115},
507 {'E', '.', 0x0116},
508 {'e', '.', 0x0117},
509 {'E', ';', 0x0118},
510 {'e', ';', 0x0119},
511 {'E', '<', 0x011a},
512 {'e', '<', 0x011b},
513 {'G', '>', 0x011c},
514 {'g', '>', 0x011d},
515 {'G', '(', 0x011e},
516 {'g', '(', 0x011f},
517 {'G', '.', 0x0120},
518 {'g', '.', 0x0121},
519 {'G', ',', 0x0122},
520 {'g', ',', 0x0123},
521 {'H', '>', 0x0124},
522 {'h', '>', 0x0125},
523 {'H', '/', 0x0126},
524 {'h', '/', 0x0127},
525 {'I', '?', 0x0128},
526 {'i', '?', 0x0129},
527 {'I', '-', 0x012a},
528 {'i', '-', 0x012b},
529 {'I', '(', 0x012c},
530 {'i', '(', 0x012d},
531 {'I', ';', 0x012e},
532 {'i', ';', 0x012f},
533 {'I', '.', 0x0130},
534 {'i', '.', 0x0131},
535 {'I', 'J', 0x0132},
536 {'i', 'j', 0x0133},
537 {'J', '>', 0x0134},
538 {'j', '>', 0x0135},
539 {'K', ',', 0x0136},
540 {'k', ',', 0x0137},
541 {'k', 'k', 0x0138},
542 {'L', '\'', 0x0139},
543 {'l', '\'', 0x013a},
544 {'L', ',', 0x013b},
545 {'l', ',', 0x013c},
546 {'L', '<', 0x013d},
547 {'l', '<', 0x013e},
548 {'L', '.', 0x013f},
549 {'l', '.', 0x0140},
550 {'L', '/', 0x0141},
551 {'l', '/', 0x0142},
552 {'N', '\'', 0x0143},
553 {'n', '\'', 0x0144},
554 {'N', ',', 0x0145},
555 {'n', ',', 0x0146},
556 {'N', '<', 0x0147},
557 {'n', '<', 0x0148},
558 {'\'', 'n', 0x0149},
559 {'N', 'G', 0x014a},
560 {'n', 'g', 0x014b},
561 {'O', '-', 0x014c},
562 {'o', '-', 0x014d},
563 {'O', '(', 0x014e},
564 {'o', '(', 0x014f},
565 {'O', '"', 0x0150},
566 {'o', '"', 0x0151},
567 {'O', 'E', 0x0152},
568 {'o', 'e', 0x0153},
569 {'R', '\'', 0x0154},
570 {'r', '\'', 0x0155},
571 {'R', ',', 0x0156},
572 {'r', ',', 0x0157},
573 {'R', '<', 0x0158},
574 {'r', '<', 0x0159},
575 {'S', '\'', 0x015a},
576 {'s', '\'', 0x015b},
577 {'S', '>', 0x015c},
578 {'s', '>', 0x015d},
579 {'S', ',', 0x015e},
580 {'s', ',', 0x015f},
581 {'S', '<', 0x0160},
582 {'s', '<', 0x0161},
583 {'T', ',', 0x0162},
584 {'t', ',', 0x0163},
585 {'T', '<', 0x0164},
586 {'t', '<', 0x0165},
587 {'T', '/', 0x0166},
588 {'t', '/', 0x0167},
589 {'U', '?', 0x0168},
590 {'u', '?', 0x0169},
591 {'U', '-', 0x016a},
592 {'u', '-', 0x016b},
593 {'U', '(', 0x016c},
594 {'u', '(', 0x016d},
595 {'U', '0', 0x016e},
596 {'u', '0', 0x016f},
597 {'U', '"', 0x0170},
598 {'u', '"', 0x0171},
599 {'U', ';', 0x0172},
600 {'u', ';', 0x0173},
601 {'W', '>', 0x0174},
602 {'w', '>', 0x0175},
603 {'Y', '>', 0x0176},
604 {'y', '>', 0x0177},
605 {'Y', ':', 0x0178},
606 {'Z', '\'', 0x0179},
607 {'z', '\'', 0x017a},
608 {'Z', '.', 0x017b},
609 {'z', '.', 0x017c},
610 {'Z', '<', 0x017d},
611 {'z', '<', 0x017e},
612 {'O', '9', 0x01a0},
613 {'o', '9', 0x01a1},
614 {'O', 'I', 0x01a2},
615 {'o', 'i', 0x01a3},
616 {'y', 'r', 0x01a6},
617 {'U', '9', 0x01af},
618 {'u', '9', 0x01b0},
619 {'Z', '/', 0x01b5},
620 {'z', '/', 0x01b6},
621 {'E', 'D', 0x01b7},
622 {'A', '<', 0x01cd},
623 {'a', '<', 0x01ce},
624 {'I', '<', 0x01cf},
625 {'i', '<', 0x01d0},
626 {'O', '<', 0x01d1},
627 {'o', '<', 0x01d2},
628 {'U', '<', 0x01d3},
629 {'u', '<', 0x01d4},
630 {'A', '1', 0x01de},
631 {'a', '1', 0x01df},
632 {'A', '7', 0x01e0},
633 {'a', '7', 0x01e1},
634 {'A', '3', 0x01e2},
635 {'a', '3', 0x01e3},
636 {'G', '/', 0x01e4},
637 {'g', '/', 0x01e5},
638 {'G', '<', 0x01e6},
639 {'g', '<', 0x01e7},
640 {'K', '<', 0x01e8},
641 {'k', '<', 0x01e9},
642 {'O', ';', 0x01ea},
643 {'o', ';', 0x01eb},
644 {'O', '1', 0x01ec},
645 {'o', '1', 0x01ed},
646 {'E', 'Z', 0x01ee},
647 {'e', 'z', 0x01ef},
648 {'j', '<', 0x01f0},
649 {'G', '\'', 0x01f4},
650 {'g', '\'', 0x01f5},
651 {';', 'S', 0x02bf},
652 {'\'', '<', 0x02c7},
653 {'\'', '(', 0x02d8},
654 {'\'', '.', 0x02d9},
655 {'\'', '0', 0x02da},
656 {'\'', ';', 0x02db},
657 {'\'', '"', 0x02dd},
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200658# define DG_START_GREEK 0x0386
Bram Moolenaar071d4272004-06-13 20:20:40 +0000659 {'A', '%', 0x0386},
660 {'E', '%', 0x0388},
661 {'Y', '%', 0x0389},
662 {'I', '%', 0x038a},
663 {'O', '%', 0x038c},
664 {'U', '%', 0x038e},
665 {'W', '%', 0x038f},
666 {'i', '3', 0x0390},
667 {'A', '*', 0x0391},
668 {'B', '*', 0x0392},
669 {'G', '*', 0x0393},
670 {'D', '*', 0x0394},
671 {'E', '*', 0x0395},
672 {'Z', '*', 0x0396},
673 {'Y', '*', 0x0397},
674 {'H', '*', 0x0398},
675 {'I', '*', 0x0399},
676 {'K', '*', 0x039a},
677 {'L', '*', 0x039b},
678 {'M', '*', 0x039c},
679 {'N', '*', 0x039d},
680 {'C', '*', 0x039e},
681 {'O', '*', 0x039f},
682 {'P', '*', 0x03a0},
683 {'R', '*', 0x03a1},
684 {'S', '*', 0x03a3},
685 {'T', '*', 0x03a4},
686 {'U', '*', 0x03a5},
687 {'F', '*', 0x03a6},
688 {'X', '*', 0x03a7},
689 {'Q', '*', 0x03a8},
690 {'W', '*', 0x03a9},
691 {'J', '*', 0x03aa},
692 {'V', '*', 0x03ab},
693 {'a', '%', 0x03ac},
694 {'e', '%', 0x03ad},
695 {'y', '%', 0x03ae},
696 {'i', '%', 0x03af},
697 {'u', '3', 0x03b0},
698 {'a', '*', 0x03b1},
699 {'b', '*', 0x03b2},
700 {'g', '*', 0x03b3},
701 {'d', '*', 0x03b4},
702 {'e', '*', 0x03b5},
703 {'z', '*', 0x03b6},
704 {'y', '*', 0x03b7},
705 {'h', '*', 0x03b8},
706 {'i', '*', 0x03b9},
707 {'k', '*', 0x03ba},
708 {'l', '*', 0x03bb},
709 {'m', '*', 0x03bc},
710 {'n', '*', 0x03bd},
711 {'c', '*', 0x03be},
712 {'o', '*', 0x03bf},
713 {'p', '*', 0x03c0},
714 {'r', '*', 0x03c1},
715 {'*', 's', 0x03c2},
716 {'s', '*', 0x03c3},
717 {'t', '*', 0x03c4},
718 {'u', '*', 0x03c5},
719 {'f', '*', 0x03c6},
720 {'x', '*', 0x03c7},
721 {'q', '*', 0x03c8},
722 {'w', '*', 0x03c9},
723 {'j', '*', 0x03ca},
724 {'v', '*', 0x03cb},
725 {'o', '%', 0x03cc},
726 {'u', '%', 0x03cd},
727 {'w', '%', 0x03ce},
728 {'\'', 'G', 0x03d8},
729 {',', 'G', 0x03d9},
730 {'T', '3', 0x03da},
731 {'t', '3', 0x03db},
732 {'M', '3', 0x03dc},
733 {'m', '3', 0x03dd},
734 {'K', '3', 0x03de},
735 {'k', '3', 0x03df},
736 {'P', '3', 0x03e0},
737 {'p', '3', 0x03e1},
738 {'\'', '%', 0x03f4},
739 {'j', '3', 0x03f5},
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200740# define DG_START_CYRILLIC 0x0401
Bram Moolenaar071d4272004-06-13 20:20:40 +0000741 {'I', 'O', 0x0401},
742 {'D', '%', 0x0402},
743 {'G', '%', 0x0403},
744 {'I', 'E', 0x0404},
745 {'D', 'S', 0x0405},
746 {'I', 'I', 0x0406},
747 {'Y', 'I', 0x0407},
748 {'J', '%', 0x0408},
749 {'L', 'J', 0x0409},
750 {'N', 'J', 0x040a},
751 {'T', 's', 0x040b},
752 {'K', 'J', 0x040c},
753 {'V', '%', 0x040e},
754 {'D', 'Z', 0x040f},
755 {'A', '=', 0x0410},
756 {'B', '=', 0x0411},
757 {'V', '=', 0x0412},
758 {'G', '=', 0x0413},
759 {'D', '=', 0x0414},
760 {'E', '=', 0x0415},
761 {'Z', '%', 0x0416},
762 {'Z', '=', 0x0417},
763 {'I', '=', 0x0418},
764 {'J', '=', 0x0419},
765 {'K', '=', 0x041a},
766 {'L', '=', 0x041b},
767 {'M', '=', 0x041c},
768 {'N', '=', 0x041d},
769 {'O', '=', 0x041e},
770 {'P', '=', 0x041f},
771 {'R', '=', 0x0420},
772 {'S', '=', 0x0421},
773 {'T', '=', 0x0422},
774 {'U', '=', 0x0423},
775 {'F', '=', 0x0424},
776 {'H', '=', 0x0425},
777 {'C', '=', 0x0426},
778 {'C', '%', 0x0427},
779 {'S', '%', 0x0428},
780 {'S', 'c', 0x0429},
781 {'=', '"', 0x042a},
782 {'Y', '=', 0x042b},
783 {'%', '"', 0x042c},
784 {'J', 'E', 0x042d},
785 {'J', 'U', 0x042e},
786 {'J', 'A', 0x042f},
787 {'a', '=', 0x0430},
788 {'b', '=', 0x0431},
789 {'v', '=', 0x0432},
790 {'g', '=', 0x0433},
791 {'d', '=', 0x0434},
792 {'e', '=', 0x0435},
793 {'z', '%', 0x0436},
794 {'z', '=', 0x0437},
795 {'i', '=', 0x0438},
796 {'j', '=', 0x0439},
797 {'k', '=', 0x043a},
798 {'l', '=', 0x043b},
799 {'m', '=', 0x043c},
800 {'n', '=', 0x043d},
801 {'o', '=', 0x043e},
802 {'p', '=', 0x043f},
803 {'r', '=', 0x0440},
804 {'s', '=', 0x0441},
805 {'t', '=', 0x0442},
806 {'u', '=', 0x0443},
807 {'f', '=', 0x0444},
808 {'h', '=', 0x0445},
809 {'c', '=', 0x0446},
810 {'c', '%', 0x0447},
811 {'s', '%', 0x0448},
812 {'s', 'c', 0x0449},
813 {'=', '\'', 0x044a},
814 {'y', '=', 0x044b},
815 {'%', '\'', 0x044c},
816 {'j', 'e', 0x044d},
817 {'j', 'u', 0x044e},
818 {'j', 'a', 0x044f},
819 {'i', 'o', 0x0451},
820 {'d', '%', 0x0452},
821 {'g', '%', 0x0453},
822 {'i', 'e', 0x0454},
823 {'d', 's', 0x0455},
824 {'i', 'i', 0x0456},
825 {'y', 'i', 0x0457},
826 {'j', '%', 0x0458},
827 {'l', 'j', 0x0459},
828 {'n', 'j', 0x045a},
829 {'t', 's', 0x045b},
830 {'k', 'j', 0x045c},
831 {'v', '%', 0x045e},
832 {'d', 'z', 0x045f},
833 {'Y', '3', 0x0462},
834 {'y', '3', 0x0463},
835 {'O', '3', 0x046a},
836 {'o', '3', 0x046b},
837 {'F', '3', 0x0472},
838 {'f', '3', 0x0473},
839 {'V', '3', 0x0474},
840 {'v', '3', 0x0475},
841 {'C', '3', 0x0480},
842 {'c', '3', 0x0481},
843 {'G', '3', 0x0490},
844 {'g', '3', 0x0491},
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200845# define DG_START_HEBREW 0x05d0
Bram Moolenaar071d4272004-06-13 20:20:40 +0000846 {'A', '+', 0x05d0},
847 {'B', '+', 0x05d1},
848 {'G', '+', 0x05d2},
849 {'D', '+', 0x05d3},
850 {'H', '+', 0x05d4},
851 {'W', '+', 0x05d5},
852 {'Z', '+', 0x05d6},
853 {'X', '+', 0x05d7},
854 {'T', 'j', 0x05d8},
855 {'J', '+', 0x05d9},
856 {'K', '%', 0x05da},
857 {'K', '+', 0x05db},
858 {'L', '+', 0x05dc},
859 {'M', '%', 0x05dd},
860 {'M', '+', 0x05de},
861 {'N', '%', 0x05df},
862 {'N', '+', 0x05e0},
863 {'S', '+', 0x05e1},
864 {'E', '+', 0x05e2},
865 {'P', '%', 0x05e3},
866 {'P', '+', 0x05e4},
867 {'Z', 'j', 0x05e5},
868 {'Z', 'J', 0x05e6},
869 {'Q', '+', 0x05e7},
870 {'R', '+', 0x05e8},
871 {'S', 'h', 0x05e9},
872 {'T', '+', 0x05ea},
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200873# define DG_START_ARABIC 0x060c
Bram Moolenaar071d4272004-06-13 20:20:40 +0000874 {',', '+', 0x060c},
875 {';', '+', 0x061b},
876 {'?', '+', 0x061f},
877 {'H', '\'', 0x0621},
878 {'a', 'M', 0x0622},
879 {'a', 'H', 0x0623},
880 {'w', 'H', 0x0624},
881 {'a', 'h', 0x0625},
882 {'y', 'H', 0x0626},
883 {'a', '+', 0x0627},
884 {'b', '+', 0x0628},
885 {'t', 'm', 0x0629},
886 {'t', '+', 0x062a},
887 {'t', 'k', 0x062b},
888 {'g', '+', 0x062c},
889 {'h', 'k', 0x062d},
890 {'x', '+', 0x062e},
891 {'d', '+', 0x062f},
892 {'d', 'k', 0x0630},
893 {'r', '+', 0x0631},
894 {'z', '+', 0x0632},
895 {'s', '+', 0x0633},
896 {'s', 'n', 0x0634},
897 {'c', '+', 0x0635},
898 {'d', 'd', 0x0636},
899 {'t', 'j', 0x0637},
900 {'z', 'H', 0x0638},
901 {'e', '+', 0x0639},
902 {'i', '+', 0x063a},
903 {'+', '+', 0x0640},
904 {'f', '+', 0x0641},
905 {'q', '+', 0x0642},
906 {'k', '+', 0x0643},
907 {'l', '+', 0x0644},
908 {'m', '+', 0x0645},
909 {'n', '+', 0x0646},
910 {'h', '+', 0x0647},
911 {'w', '+', 0x0648},
912 {'j', '+', 0x0649},
913 {'y', '+', 0x064a},
914 {':', '+', 0x064b},
915 {'"', '+', 0x064c},
916 {'=', '+', 0x064d},
917 {'/', '+', 0x064e},
918 {'\'', '+', 0x064f},
919 {'1', '+', 0x0650},
920 {'3', '+', 0x0651},
921 {'0', '+', 0x0652},
922 {'a', 'S', 0x0670},
923 {'p', '+', 0x067e},
924 {'v', '+', 0x06a4},
925 {'g', 'f', 0x06af},
926 {'0', 'a', 0x06f0},
927 {'1', 'a', 0x06f1},
928 {'2', 'a', 0x06f2},
929 {'3', 'a', 0x06f3},
930 {'4', 'a', 0x06f4},
931 {'5', 'a', 0x06f5},
932 {'6', 'a', 0x06f6},
933 {'7', 'a', 0x06f7},
934 {'8', 'a', 0x06f8},
935 {'9', 'a', 0x06f9},
Bram Moolenaare3f915d2020-07-14 23:02:44 +0200936# define DG_START_LATIN_EXTENDED 0x1e02
Bram Moolenaar071d4272004-06-13 20:20:40 +0000937 {'B', '.', 0x1e02},
938 {'b', '.', 0x1e03},
939 {'B', '_', 0x1e06},
940 {'b', '_', 0x1e07},
941 {'D', '.', 0x1e0a},
942 {'d', '.', 0x1e0b},
943 {'D', '_', 0x1e0e},
944 {'d', '_', 0x1e0f},
945 {'D', ',', 0x1e10},
946 {'d', ',', 0x1e11},
947 {'F', '.', 0x1e1e},
948 {'f', '.', 0x1e1f},
949 {'G', '-', 0x1e20},
950 {'g', '-', 0x1e21},
951 {'H', '.', 0x1e22},
952 {'h', '.', 0x1e23},
953 {'H', ':', 0x1e26},
954 {'h', ':', 0x1e27},
955 {'H', ',', 0x1e28},
956 {'h', ',', 0x1e29},
957 {'K', '\'', 0x1e30},
958 {'k', '\'', 0x1e31},
959 {'K', '_', 0x1e34},
960 {'k', '_', 0x1e35},
961 {'L', '_', 0x1e3a},
962 {'l', '_', 0x1e3b},
963 {'M', '\'', 0x1e3e},
964 {'m', '\'', 0x1e3f},
965 {'M', '.', 0x1e40},
966 {'m', '.', 0x1e41},
967 {'N', '.', 0x1e44},
968 {'n', '.', 0x1e45},
969 {'N', '_', 0x1e48},
970 {'n', '_', 0x1e49},
971 {'P', '\'', 0x1e54},
972 {'p', '\'', 0x1e55},
973 {'P', '.', 0x1e56},
974 {'p', '.', 0x1e57},
975 {'R', '.', 0x1e58},
976 {'r', '.', 0x1e59},
977 {'R', '_', 0x1e5e},
978 {'r', '_', 0x1e5f},
979 {'S', '.', 0x1e60},
980 {'s', '.', 0x1e61},
981 {'T', '.', 0x1e6a},
982 {'t', '.', 0x1e6b},
983 {'T', '_', 0x1e6e},
984 {'t', '_', 0x1e6f},
985 {'V', '?', 0x1e7c},
986 {'v', '?', 0x1e7d},
987 {'W', '!', 0x1e80},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100988 {'W', '`', 0x1e80}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989 {'w', '!', 0x1e81},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100990 {'w', '`', 0x1e81}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +0000991 {'W', '\'', 0x1e82},
992 {'w', '\'', 0x1e83},
993 {'W', ':', 0x1e84},
994 {'w', ':', 0x1e85},
995 {'W', '.', 0x1e86},
996 {'w', '.', 0x1e87},
997 {'X', '.', 0x1e8a},
998 {'x', '.', 0x1e8b},
999 {'X', ':', 0x1e8c},
1000 {'x', ':', 0x1e8d},
1001 {'Y', '.', 0x1e8e},
1002 {'y', '.', 0x1e8f},
1003 {'Z', '>', 0x1e90},
1004 {'z', '>', 0x1e91},
1005 {'Z', '_', 0x1e94},
1006 {'z', '_', 0x1e95},
1007 {'h', '_', 0x1e96},
1008 {'t', ':', 0x1e97},
1009 {'w', '0', 0x1e98},
1010 {'y', '0', 0x1e99},
1011 {'A', '2', 0x1ea2},
1012 {'a', '2', 0x1ea3},
1013 {'E', '2', 0x1eba},
1014 {'e', '2', 0x1ebb},
1015 {'E', '?', 0x1ebc},
1016 {'e', '?', 0x1ebd},
1017 {'I', '2', 0x1ec8},
1018 {'i', '2', 0x1ec9},
1019 {'O', '2', 0x1ece},
1020 {'o', '2', 0x1ecf},
1021 {'U', '2', 0x1ee6},
1022 {'u', '2', 0x1ee7},
1023 {'Y', '!', 0x1ef2},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001024 {'Y', '`', 0x1ef2}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +00001025 {'y', '!', 0x1ef3},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001026 {'y', '`', 0x1ef3}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +00001027 {'Y', '2', 0x1ef6},
1028 {'y', '2', 0x1ef7},
1029 {'Y', '?', 0x1ef8},
1030 {'y', '?', 0x1ef9},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001031# define DG_START_GREEK_EXTENDED 0x1f00
Bram Moolenaar071d4272004-06-13 20:20:40 +00001032 {';', '\'', 0x1f00},
1033 {',', '\'', 0x1f01},
1034 {';', '!', 0x1f02},
1035 {',', '!', 0x1f03},
1036 {'?', ';', 0x1f04},
1037 {'?', ',', 0x1f05},
1038 {'!', ':', 0x1f06},
1039 {'?', ':', 0x1f07},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001040# define DG_START_PUNCTUATION 0x2002
Bram Moolenaar071d4272004-06-13 20:20:40 +00001041 {'1', 'N', 0x2002},
1042 {'1', 'M', 0x2003},
1043 {'3', 'M', 0x2004},
1044 {'4', 'M', 0x2005},
1045 {'6', 'M', 0x2006},
1046 {'1', 'T', 0x2009},
1047 {'1', 'H', 0x200a},
1048 {'-', '1', 0x2010},
1049 {'-', 'N', 0x2013},
1050 {'-', 'M', 0x2014},
1051 {'-', '3', 0x2015},
1052 {'!', '2', 0x2016},
1053 {'=', '2', 0x2017},
1054 {'\'', '6', 0x2018},
1055 {'\'', '9', 0x2019},
1056 {'.', '9', 0x201a},
1057 {'9', '\'', 0x201b},
1058 {'"', '6', 0x201c},
1059 {'"', '9', 0x201d},
1060 {':', '9', 0x201e},
1061 {'9', '"', 0x201f},
1062 {'/', '-', 0x2020},
1063 {'/', '=', 0x2021},
Bram Moolenaar57ad94c2020-09-08 19:06:30 +02001064 {'o', 'o', 0x2022},
Bram Moolenaar071d4272004-06-13 20:20:40 +00001065 {'.', '.', 0x2025},
Bram Moolenaar81615512016-11-04 22:17:16 +01001066 {',', '.', 0x2026},
Bram Moolenaar071d4272004-06-13 20:20:40 +00001067 {'%', '0', 0x2030},
1068 {'1', '\'', 0x2032},
1069 {'2', '\'', 0x2033},
1070 {'3', '\'', 0x2034},
1071 {'1', '"', 0x2035},
1072 {'2', '"', 0x2036},
1073 {'3', '"', 0x2037},
1074 {'C', 'a', 0x2038},
1075 {'<', '1', 0x2039},
1076 {'>', '1', 0x203a},
1077 {':', 'X', 0x203b},
1078 {'\'', '-', 0x203e},
1079 {'/', 'f', 0x2044},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001080# define DG_START_SUB_SUPER 0x2070
Bram Moolenaar071d4272004-06-13 20:20:40 +00001081 {'0', 'S', 0x2070},
1082 {'4', 'S', 0x2074},
1083 {'5', 'S', 0x2075},
1084 {'6', 'S', 0x2076},
1085 {'7', 'S', 0x2077},
1086 {'8', 'S', 0x2078},
1087 {'9', 'S', 0x2079},
1088 {'+', 'S', 0x207a},
1089 {'-', 'S', 0x207b},
1090 {'=', 'S', 0x207c},
1091 {'(', 'S', 0x207d},
1092 {')', 'S', 0x207e},
1093 {'n', 'S', 0x207f},
1094 {'0', 's', 0x2080},
1095 {'1', 's', 0x2081},
1096 {'2', 's', 0x2082},
1097 {'3', 's', 0x2083},
1098 {'4', 's', 0x2084},
1099 {'5', 's', 0x2085},
1100 {'6', 's', 0x2086},
1101 {'7', 's', 0x2087},
1102 {'8', 's', 0x2088},
1103 {'9', 's', 0x2089},
1104 {'+', 's', 0x208a},
1105 {'-', 's', 0x208b},
1106 {'=', 's', 0x208c},
1107 {'(', 's', 0x208d},
1108 {')', 's', 0x208e},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001109# define DG_START_CURRENCY 0x20a4
Bram Moolenaar071d4272004-06-13 20:20:40 +00001110 {'L', 'i', 0x20a4},
1111 {'P', 't', 0x20a7},
1112 {'W', '=', 0x20a9},
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001113 {'=', 'e', 0x20ac}, // euro
1114 {'E', 'u', 0x20ac}, // euro
1115 {'=', 'R', 0x20bd}, // rouble
1116 {'=', 'P', 0x20bd}, // rouble
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001117# define DG_START_OTHER1 0x2103
Bram Moolenaar071d4272004-06-13 20:20:40 +00001118 {'o', 'C', 0x2103},
1119 {'c', 'o', 0x2105},
1120 {'o', 'F', 0x2109},
1121 {'N', '0', 0x2116},
1122 {'P', 'O', 0x2117},
1123 {'R', 'x', 0x211e},
1124 {'S', 'M', 0x2120},
1125 {'T', 'M', 0x2122},
1126 {'O', 'm', 0x2126},
1127 {'A', 'O', 0x212b},
1128 {'1', '3', 0x2153},
1129 {'2', '3', 0x2154},
1130 {'1', '5', 0x2155},
1131 {'2', '5', 0x2156},
1132 {'3', '5', 0x2157},
1133 {'4', '5', 0x2158},
1134 {'1', '6', 0x2159},
1135 {'5', '6', 0x215a},
1136 {'1', '8', 0x215b},
1137 {'3', '8', 0x215c},
1138 {'5', '8', 0x215d},
1139 {'7', '8', 0x215e},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001140# define DG_START_ROMAN 0x2160
Bram Moolenaar071d4272004-06-13 20:20:40 +00001141 {'1', 'R', 0x2160},
1142 {'2', 'R', 0x2161},
1143 {'3', 'R', 0x2162},
1144 {'4', 'R', 0x2163},
1145 {'5', 'R', 0x2164},
1146 {'6', 'R', 0x2165},
1147 {'7', 'R', 0x2166},
1148 {'8', 'R', 0x2167},
1149 {'9', 'R', 0x2168},
1150 {'a', 'R', 0x2169},
1151 {'b', 'R', 0x216a},
1152 {'c', 'R', 0x216b},
1153 {'1', 'r', 0x2170},
1154 {'2', 'r', 0x2171},
1155 {'3', 'r', 0x2172},
1156 {'4', 'r', 0x2173},
1157 {'5', 'r', 0x2174},
1158 {'6', 'r', 0x2175},
1159 {'7', 'r', 0x2176},
1160 {'8', 'r', 0x2177},
1161 {'9', 'r', 0x2178},
1162 {'a', 'r', 0x2179},
1163 {'b', 'r', 0x217a},
1164 {'c', 'r', 0x217b},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001165# define DG_START_ARROWS 0x2190
Bram Moolenaar071d4272004-06-13 20:20:40 +00001166 {'<', '-', 0x2190},
1167 {'-', '!', 0x2191},
1168 {'-', '>', 0x2192},
1169 {'-', 'v', 0x2193},
1170 {'<', '>', 0x2194},
1171 {'U', 'D', 0x2195},
1172 {'<', '=', 0x21d0},
1173 {'=', '>', 0x21d2},
1174 {'=', '=', 0x21d4},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001175# define DG_START_MATH 0x2200
Bram Moolenaar071d4272004-06-13 20:20:40 +00001176 {'F', 'A', 0x2200},
1177 {'d', 'P', 0x2202},
1178 {'T', 'E', 0x2203},
1179 {'/', '0', 0x2205},
1180 {'D', 'E', 0x2206},
1181 {'N', 'B', 0x2207},
1182 {'(', '-', 0x2208},
1183 {'-', ')', 0x220b},
1184 {'*', 'P', 0x220f},
1185 {'+', 'Z', 0x2211},
1186 {'-', '2', 0x2212},
1187 {'-', '+', 0x2213},
1188 {'*', '-', 0x2217},
1189 {'O', 'b', 0x2218},
1190 {'S', 'b', 0x2219},
1191 {'R', 'T', 0x221a},
1192 {'0', '(', 0x221d},
1193 {'0', '0', 0x221e},
1194 {'-', 'L', 0x221f},
1195 {'-', 'V', 0x2220},
1196 {'P', 'P', 0x2225},
1197 {'A', 'N', 0x2227},
1198 {'O', 'R', 0x2228},
1199 {'(', 'U', 0x2229},
1200 {')', 'U', 0x222a},
1201 {'I', 'n', 0x222b},
1202 {'D', 'I', 0x222c},
1203 {'I', 'o', 0x222e},
1204 {'.', ':', 0x2234},
1205 {':', '.', 0x2235},
1206 {':', 'R', 0x2236},
1207 {':', ':', 0x2237},
1208 {'?', '1', 0x223c},
1209 {'C', 'G', 0x223e},
1210 {'?', '-', 0x2243},
1211 {'?', '=', 0x2245},
1212 {'?', '2', 0x2248},
1213 {'=', '?', 0x224c},
1214 {'H', 'I', 0x2253},
1215 {'!', '=', 0x2260},
1216 {'=', '3', 0x2261},
1217 {'=', '<', 0x2264},
1218 {'>', '=', 0x2265},
1219 {'<', '*', 0x226a},
1220 {'*', '>', 0x226b},
1221 {'!', '<', 0x226e},
1222 {'!', '>', 0x226f},
1223 {'(', 'C', 0x2282},
1224 {')', 'C', 0x2283},
1225 {'(', '_', 0x2286},
1226 {')', '_', 0x2287},
1227 {'0', '.', 0x2299},
1228 {'0', '2', 0x229a},
1229 {'-', 'T', 0x22a5},
1230 {'.', 'P', 0x22c5},
1231 {':', '3', 0x22ee},
1232 {'.', '3', 0x22ef},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001233# define DG_START_TECHNICAL 0x2302
Bram Moolenaar071d4272004-06-13 20:20:40 +00001234 {'E', 'h', 0x2302},
1235 {'<', '7', 0x2308},
1236 {'>', '7', 0x2309},
1237 {'7', '<', 0x230a},
1238 {'7', '>', 0x230b},
1239 {'N', 'I', 0x2310},
1240 {'(', 'A', 0x2312},
1241 {'T', 'R', 0x2315},
1242 {'I', 'u', 0x2320},
1243 {'I', 'l', 0x2321},
1244 {'<', '/', 0x2329},
1245 {'/', '>', 0x232a},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001246# define DG_START_OTHER2 0x2423
Bram Moolenaar071d4272004-06-13 20:20:40 +00001247 {'V', 's', 0x2423},
1248 {'1', 'h', 0x2440},
1249 {'3', 'h', 0x2441},
1250 {'2', 'h', 0x2442},
1251 {'4', 'h', 0x2443},
1252 {'1', 'j', 0x2446},
1253 {'2', 'j', 0x2447},
1254 {'3', 'j', 0x2448},
1255 {'4', 'j', 0x2449},
1256 {'1', '.', 0x2488},
1257 {'2', '.', 0x2489},
1258 {'3', '.', 0x248a},
1259 {'4', '.', 0x248b},
1260 {'5', '.', 0x248c},
1261 {'6', '.', 0x248d},
1262 {'7', '.', 0x248e},
1263 {'8', '.', 0x248f},
1264 {'9', '.', 0x2490},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001265# define DG_START_DRAWING 0x2500
Bram Moolenaar071d4272004-06-13 20:20:40 +00001266 {'h', 'h', 0x2500},
1267 {'H', 'H', 0x2501},
1268 {'v', 'v', 0x2502},
1269 {'V', 'V', 0x2503},
1270 {'3', '-', 0x2504},
1271 {'3', '_', 0x2505},
1272 {'3', '!', 0x2506},
1273 {'3', '/', 0x2507},
1274 {'4', '-', 0x2508},
1275 {'4', '_', 0x2509},
1276 {'4', '!', 0x250a},
1277 {'4', '/', 0x250b},
1278 {'d', 'r', 0x250c},
1279 {'d', 'R', 0x250d},
1280 {'D', 'r', 0x250e},
1281 {'D', 'R', 0x250f},
1282 {'d', 'l', 0x2510},
1283 {'d', 'L', 0x2511},
1284 {'D', 'l', 0x2512},
1285 {'L', 'D', 0x2513},
1286 {'u', 'r', 0x2514},
1287 {'u', 'R', 0x2515},
1288 {'U', 'r', 0x2516},
1289 {'U', 'R', 0x2517},
1290 {'u', 'l', 0x2518},
1291 {'u', 'L', 0x2519},
1292 {'U', 'l', 0x251a},
1293 {'U', 'L', 0x251b},
1294 {'v', 'r', 0x251c},
1295 {'v', 'R', 0x251d},
1296 {'V', 'r', 0x2520},
1297 {'V', 'R', 0x2523},
1298 {'v', 'l', 0x2524},
1299 {'v', 'L', 0x2525},
1300 {'V', 'l', 0x2528},
1301 {'V', 'L', 0x252b},
1302 {'d', 'h', 0x252c},
1303 {'d', 'H', 0x252f},
1304 {'D', 'h', 0x2530},
1305 {'D', 'H', 0x2533},
1306 {'u', 'h', 0x2534},
1307 {'u', 'H', 0x2537},
1308 {'U', 'h', 0x2538},
1309 {'U', 'H', 0x253b},
1310 {'v', 'h', 0x253c},
1311 {'v', 'H', 0x253f},
1312 {'V', 'h', 0x2542},
1313 {'V', 'H', 0x254b},
1314 {'F', 'D', 0x2571},
1315 {'B', 'D', 0x2572},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001316# define DG_START_BLOCK 0x2580
Bram Moolenaar071d4272004-06-13 20:20:40 +00001317 {'T', 'B', 0x2580},
1318 {'L', 'B', 0x2584},
1319 {'F', 'B', 0x2588},
1320 {'l', 'B', 0x258c},
1321 {'R', 'B', 0x2590},
1322 {'.', 'S', 0x2591},
1323 {':', 'S', 0x2592},
1324 {'?', 'S', 0x2593},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001325# define DG_START_SHAPES 0x25a0
Bram Moolenaar071d4272004-06-13 20:20:40 +00001326 {'f', 'S', 0x25a0},
1327 {'O', 'S', 0x25a1},
1328 {'R', 'O', 0x25a2},
1329 {'R', 'r', 0x25a3},
1330 {'R', 'F', 0x25a4},
1331 {'R', 'Y', 0x25a5},
1332 {'R', 'H', 0x25a6},
1333 {'R', 'Z', 0x25a7},
1334 {'R', 'K', 0x25a8},
1335 {'R', 'X', 0x25a9},
1336 {'s', 'B', 0x25aa},
1337 {'S', 'R', 0x25ac},
1338 {'O', 'r', 0x25ad},
1339 {'U', 'T', 0x25b2},
1340 {'u', 'T', 0x25b3},
1341 {'P', 'R', 0x25b6},
1342 {'T', 'r', 0x25b7},
1343 {'D', 't', 0x25bc},
1344 {'d', 'T', 0x25bd},
1345 {'P', 'L', 0x25c0},
1346 {'T', 'l', 0x25c1},
1347 {'D', 'b', 0x25c6},
1348 {'D', 'w', 0x25c7},
1349 {'L', 'Z', 0x25ca},
1350 {'0', 'm', 0x25cb},
1351 {'0', 'o', 0x25ce},
1352 {'0', 'M', 0x25cf},
1353 {'0', 'L', 0x25d0},
1354 {'0', 'R', 0x25d1},
1355 {'S', 'n', 0x25d8},
1356 {'I', 'c', 0x25d9},
1357 {'F', 'd', 0x25e2},
1358 {'B', 'd', 0x25e3},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001359# define DG_START_SYMBOLS 0x2605
Bram Moolenaar071d4272004-06-13 20:20:40 +00001360 {'*', '2', 0x2605},
1361 {'*', '1', 0x2606},
1362 {'<', 'H', 0x261c},
1363 {'>', 'H', 0x261e},
1364 {'0', 'u', 0x263a},
1365 {'0', 'U', 0x263b},
1366 {'S', 'U', 0x263c},
1367 {'F', 'm', 0x2640},
1368 {'M', 'l', 0x2642},
1369 {'c', 'S', 0x2660},
1370 {'c', 'H', 0x2661},
1371 {'c', 'D', 0x2662},
1372 {'c', 'C', 0x2663},
1373 {'M', 'd', 0x2669},
1374 {'M', '8', 0x266a},
1375 {'M', '2', 0x266b},
1376 {'M', 'b', 0x266d},
1377 {'M', 'x', 0x266e},
1378 {'M', 'X', 0x266f},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001379# define DG_START_DINGBATS 0x2713
Bram Moolenaar071d4272004-06-13 20:20:40 +00001380 {'O', 'K', 0x2713},
1381 {'X', 'X', 0x2717},
1382 {'-', 'X', 0x2720},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001383# define DG_START_CJK_SYMBOLS 0x3000
Bram Moolenaar071d4272004-06-13 20:20:40 +00001384 {'I', 'S', 0x3000},
1385 {',', '_', 0x3001},
1386 {'.', '_', 0x3002},
1387 {'+', '"', 0x3003},
1388 {'+', '_', 0x3004},
1389 {'*', '_', 0x3005},
1390 {';', '_', 0x3006},
1391 {'0', '_', 0x3007},
1392 {'<', '+', 0x300a},
1393 {'>', '+', 0x300b},
1394 {'<', '\'', 0x300c},
1395 {'>', '\'', 0x300d},
1396 {'<', '"', 0x300e},
1397 {'>', '"', 0x300f},
1398 {'(', '"', 0x3010},
1399 {')', '"', 0x3011},
1400 {'=', 'T', 0x3012},
1401 {'=', '_', 0x3013},
1402 {'(', '\'', 0x3014},
1403 {')', '\'', 0x3015},
1404 {'(', 'I', 0x3016},
1405 {')', 'I', 0x3017},
1406 {'-', '?', 0x301c},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001407# define DG_START_HIRAGANA 0x3041
Bram Moolenaar071d4272004-06-13 20:20:40 +00001408 {'A', '5', 0x3041},
1409 {'a', '5', 0x3042},
1410 {'I', '5', 0x3043},
1411 {'i', '5', 0x3044},
1412 {'U', '5', 0x3045},
1413 {'u', '5', 0x3046},
1414 {'E', '5', 0x3047},
1415 {'e', '5', 0x3048},
1416 {'O', '5', 0x3049},
1417 {'o', '5', 0x304a},
1418 {'k', 'a', 0x304b},
1419 {'g', 'a', 0x304c},
1420 {'k', 'i', 0x304d},
1421 {'g', 'i', 0x304e},
1422 {'k', 'u', 0x304f},
1423 {'g', 'u', 0x3050},
1424 {'k', 'e', 0x3051},
1425 {'g', 'e', 0x3052},
1426 {'k', 'o', 0x3053},
1427 {'g', 'o', 0x3054},
1428 {'s', 'a', 0x3055},
1429 {'z', 'a', 0x3056},
1430 {'s', 'i', 0x3057},
1431 {'z', 'i', 0x3058},
1432 {'s', 'u', 0x3059},
1433 {'z', 'u', 0x305a},
1434 {'s', 'e', 0x305b},
1435 {'z', 'e', 0x305c},
1436 {'s', 'o', 0x305d},
1437 {'z', 'o', 0x305e},
1438 {'t', 'a', 0x305f},
1439 {'d', 'a', 0x3060},
1440 {'t', 'i', 0x3061},
1441 {'d', 'i', 0x3062},
1442 {'t', 'U', 0x3063},
1443 {'t', 'u', 0x3064},
1444 {'d', 'u', 0x3065},
1445 {'t', 'e', 0x3066},
1446 {'d', 'e', 0x3067},
1447 {'t', 'o', 0x3068},
1448 {'d', 'o', 0x3069},
1449 {'n', 'a', 0x306a},
1450 {'n', 'i', 0x306b},
1451 {'n', 'u', 0x306c},
1452 {'n', 'e', 0x306d},
1453 {'n', 'o', 0x306e},
1454 {'h', 'a', 0x306f},
1455 {'b', 'a', 0x3070},
1456 {'p', 'a', 0x3071},
1457 {'h', 'i', 0x3072},
1458 {'b', 'i', 0x3073},
1459 {'p', 'i', 0x3074},
1460 {'h', 'u', 0x3075},
1461 {'b', 'u', 0x3076},
1462 {'p', 'u', 0x3077},
1463 {'h', 'e', 0x3078},
1464 {'b', 'e', 0x3079},
1465 {'p', 'e', 0x307a},
1466 {'h', 'o', 0x307b},
1467 {'b', 'o', 0x307c},
1468 {'p', 'o', 0x307d},
1469 {'m', 'a', 0x307e},
1470 {'m', 'i', 0x307f},
1471 {'m', 'u', 0x3080},
1472 {'m', 'e', 0x3081},
1473 {'m', 'o', 0x3082},
1474 {'y', 'A', 0x3083},
1475 {'y', 'a', 0x3084},
1476 {'y', 'U', 0x3085},
1477 {'y', 'u', 0x3086},
1478 {'y', 'O', 0x3087},
1479 {'y', 'o', 0x3088},
1480 {'r', 'a', 0x3089},
1481 {'r', 'i', 0x308a},
1482 {'r', 'u', 0x308b},
1483 {'r', 'e', 0x308c},
1484 {'r', 'o', 0x308d},
1485 {'w', 'A', 0x308e},
1486 {'w', 'a', 0x308f},
1487 {'w', 'i', 0x3090},
1488 {'w', 'e', 0x3091},
1489 {'w', 'o', 0x3092},
1490 {'n', '5', 0x3093},
1491 {'v', 'u', 0x3094},
1492 {'"', '5', 0x309b},
1493 {'0', '5', 0x309c},
1494 {'*', '5', 0x309d},
1495 {'+', '5', 0x309e},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001496# define DG_START_KATAKANA 0x30a1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001497 {'a', '6', 0x30a1},
1498 {'A', '6', 0x30a2},
1499 {'i', '6', 0x30a3},
1500 {'I', '6', 0x30a4},
1501 {'u', '6', 0x30a5},
1502 {'U', '6', 0x30a6},
1503 {'e', '6', 0x30a7},
1504 {'E', '6', 0x30a8},
1505 {'o', '6', 0x30a9},
1506 {'O', '6', 0x30aa},
1507 {'K', 'a', 0x30ab},
1508 {'G', 'a', 0x30ac},
1509 {'K', 'i', 0x30ad},
1510 {'G', 'i', 0x30ae},
1511 {'K', 'u', 0x30af},
1512 {'G', 'u', 0x30b0},
1513 {'K', 'e', 0x30b1},
1514 {'G', 'e', 0x30b2},
1515 {'K', 'o', 0x30b3},
1516 {'G', 'o', 0x30b4},
1517 {'S', 'a', 0x30b5},
1518 {'Z', 'a', 0x30b6},
1519 {'S', 'i', 0x30b7},
1520 {'Z', 'i', 0x30b8},
1521 {'S', 'u', 0x30b9},
1522 {'Z', 'u', 0x30ba},
1523 {'S', 'e', 0x30bb},
1524 {'Z', 'e', 0x30bc},
1525 {'S', 'o', 0x30bd},
1526 {'Z', 'o', 0x30be},
1527 {'T', 'a', 0x30bf},
1528 {'D', 'a', 0x30c0},
1529 {'T', 'i', 0x30c1},
1530 {'D', 'i', 0x30c2},
1531 {'T', 'U', 0x30c3},
1532 {'T', 'u', 0x30c4},
1533 {'D', 'u', 0x30c5},
1534 {'T', 'e', 0x30c6},
1535 {'D', 'e', 0x30c7},
1536 {'T', 'o', 0x30c8},
1537 {'D', 'o', 0x30c9},
1538 {'N', 'a', 0x30ca},
1539 {'N', 'i', 0x30cb},
1540 {'N', 'u', 0x30cc},
1541 {'N', 'e', 0x30cd},
1542 {'N', 'o', 0x30ce},
1543 {'H', 'a', 0x30cf},
1544 {'B', 'a', 0x30d0},
1545 {'P', 'a', 0x30d1},
1546 {'H', 'i', 0x30d2},
1547 {'B', 'i', 0x30d3},
1548 {'P', 'i', 0x30d4},
1549 {'H', 'u', 0x30d5},
1550 {'B', 'u', 0x30d6},
1551 {'P', 'u', 0x30d7},
1552 {'H', 'e', 0x30d8},
1553 {'B', 'e', 0x30d9},
1554 {'P', 'e', 0x30da},
1555 {'H', 'o', 0x30db},
1556 {'B', 'o', 0x30dc},
1557 {'P', 'o', 0x30dd},
1558 {'M', 'a', 0x30de},
1559 {'M', 'i', 0x30df},
1560 {'M', 'u', 0x30e0},
1561 {'M', 'e', 0x30e1},
1562 {'M', 'o', 0x30e2},
1563 {'Y', 'A', 0x30e3},
1564 {'Y', 'a', 0x30e4},
1565 {'Y', 'U', 0x30e5},
1566 {'Y', 'u', 0x30e6},
1567 {'Y', 'O', 0x30e7},
1568 {'Y', 'o', 0x30e8},
1569 {'R', 'a', 0x30e9},
1570 {'R', 'i', 0x30ea},
1571 {'R', 'u', 0x30eb},
1572 {'R', 'e', 0x30ec},
1573 {'R', 'o', 0x30ed},
1574 {'W', 'A', 0x30ee},
1575 {'W', 'a', 0x30ef},
1576 {'W', 'i', 0x30f0},
1577 {'W', 'e', 0x30f1},
1578 {'W', 'o', 0x30f2},
1579 {'N', '6', 0x30f3},
1580 {'V', 'u', 0x30f4},
1581 {'K', 'A', 0x30f5},
1582 {'K', 'E', 0x30f6},
1583 {'V', 'a', 0x30f7},
1584 {'V', 'i', 0x30f8},
1585 {'V', 'e', 0x30f9},
1586 {'V', 'o', 0x30fa},
1587 {'.', '6', 0x30fb},
1588 {'-', '6', 0x30fc},
1589 {'*', '6', 0x30fd},
1590 {'+', '6', 0x30fe},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001591# define DG_START_BOPOMOFO 0x3105
Bram Moolenaar071d4272004-06-13 20:20:40 +00001592 {'b', '4', 0x3105},
1593 {'p', '4', 0x3106},
1594 {'m', '4', 0x3107},
1595 {'f', '4', 0x3108},
1596 {'d', '4', 0x3109},
1597 {'t', '4', 0x310a},
1598 {'n', '4', 0x310b},
1599 {'l', '4', 0x310c},
1600 {'g', '4', 0x310d},
1601 {'k', '4', 0x310e},
1602 {'h', '4', 0x310f},
1603 {'j', '4', 0x3110},
1604 {'q', '4', 0x3111},
1605 {'x', '4', 0x3112},
1606 {'z', 'h', 0x3113},
1607 {'c', 'h', 0x3114},
1608 {'s', 'h', 0x3115},
1609 {'r', '4', 0x3116},
1610 {'z', '4', 0x3117},
1611 {'c', '4', 0x3118},
1612 {'s', '4', 0x3119},
1613 {'a', '4', 0x311a},
1614 {'o', '4', 0x311b},
1615 {'e', '4', 0x311c},
1616 {'a', 'i', 0x311e},
1617 {'e', 'i', 0x311f},
1618 {'a', 'u', 0x3120},
1619 {'o', 'u', 0x3121},
1620 {'a', 'n', 0x3122},
1621 {'e', 'n', 0x3123},
1622 {'a', 'N', 0x3124},
1623 {'e', 'N', 0x3125},
1624 {'e', 'r', 0x3126},
1625 {'i', '4', 0x3127},
1626 {'u', '4', 0x3128},
1627 {'i', 'u', 0x3129},
1628 {'v', '4', 0x312a},
1629 {'n', 'G', 0x312b},
1630 {'g', 'n', 0x312c},
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001631# define DG_START_OTHER3 0x3220
Bram Moolenaar071d4272004-06-13 20:20:40 +00001632 {'1', 'c', 0x3220},
1633 {'2', 'c', 0x3221},
1634 {'3', 'c', 0x3222},
1635 {'4', 'c', 0x3223},
1636 {'5', 'c', 0x3224},
1637 {'6', 'c', 0x3225},
1638 {'7', 'c', 0x3226},
1639 {'8', 'c', 0x3227},
1640 {'9', 'c', 0x3228},
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001641 // code points 0xe000 - 0xefff excluded, they have no assigned
1642 // characters, only used in proposals.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001643 {'f', 'f', 0xfb00},
1644 {'f', 'i', 0xfb01},
1645 {'f', 'l', 0xfb02},
1646 {'f', 't', 0xfb05},
1647 {'s', 't', 0xfb06},
Bram Moolenaar5f91c0c2008-01-03 16:54:33 +00001648
Bram Moolenaar071d4272004-06-13 20:20:40 +00001649 {NUL, NUL, NUL}
1650 };
1651
Bram Moolenaar424bcae2022-01-31 14:59:41 +00001652# endif // OLD_DIGRAPHS
Bram Moolenaare3f915d2020-07-14 23:02:44 +02001653#endif // !HPUX_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +00001654
1655/*
1656 * handle digraphs after typing a character
1657 */
1658 int
Bram Moolenaar7454a062016-01-30 15:14:10 +01001659do_digraph(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001660{
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001661 static int backspaced; // character before K_BS
1662 static int lastchar; // last typed character
Bram Moolenaar071d4272004-06-13 20:20:40 +00001663
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001664 if (c == -1) // init values
Bram Moolenaar071d4272004-06-13 20:20:40 +00001665 {
1666 backspaced = -1;
1667 }
1668 else if (p_dg)
1669 {
1670 if (backspaced >= 0)
h-east29b85712021-07-26 21:54:04 +02001671 c = digraph_get(backspaced, c, FALSE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001672 backspaced = -1;
1673 if ((c == K_BS || c == Ctrl_H) && lastchar >= 0)
1674 backspaced = lastchar;
1675 }
1676 lastchar = c;
1677 return c;
1678}
1679
1680/*
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001681 * Find a digraph for "val". If found return the string to display it.
1682 * If not found return NULL.
1683 */
1684 char_u *
Bram Moolenaarbc5020a2018-06-16 17:25:22 +02001685get_digraph_for_char(int val_arg)
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001686{
Bram Moolenaarbc5020a2018-06-16 17:25:22 +02001687 int val = val_arg;
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001688 int i;
1689 int use_defaults;
1690 digr_T *dp;
1691 static char_u r[3];
1692
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001693#if defined(USE_UNICODE_DIGRAPHS)
Bram Moolenaarbc5020a2018-06-16 17:25:22 +02001694 if (!enc_utf8)
1695 {
1696 char_u buf[6], *to;
1697 vimconv_T vc;
1698
1699 // convert the character from 'encoding' to Unicode
1700 i = mb_char2bytes(val, buf);
1701 vc.vc_type = CONV_NONE;
1702 if (convert_setup(&vc, p_enc, (char_u *)"utf-8") == OK)
1703 {
1704 vc.vc_fail = TRUE;
1705 to = string_convert(&vc, buf, &i);
1706 if (to != NULL)
1707 {
1708 val = utf_ptr2char(to);
1709 vim_free(to);
1710 }
1711 (void)convert_setup(&vc, NULL, NULL);
1712 }
1713 }
1714#endif
1715
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001716 for (use_defaults = 0; use_defaults <= 1; use_defaults++)
1717 {
1718 if (use_defaults == 0)
1719 dp = (digr_T *)user_digraphs.ga_data;
1720 else
1721 dp = digraphdefault;
1722 for (i = 0; use_defaults ? dp->char1 != NUL
1723 : i < user_digraphs.ga_len; ++i)
1724 {
1725 if (dp->result == val)
1726 {
1727 r[0] = dp->char1;
1728 r[1] = dp->char2;
1729 r[2] = NUL;
1730 return r;
1731 }
1732 ++dp;
1733 }
1734 }
1735 return NULL;
1736}
1737
1738/*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001739 * Get a digraph. Used after typing CTRL-K on the command line or in normal
1740 * mode.
1741 * Returns composed character, or NUL when ESC was used.
1742 */
1743 int
Bram Moolenaar7454a062016-01-30 15:14:10 +01001744get_digraph(
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001745 int cmdline) // TRUE when called from the cmdline
Bram Moolenaar071d4272004-06-13 20:20:40 +00001746{
1747 int c, cc;
1748
1749 ++no_mapping;
1750 ++allow_keys;
Bram Moolenaar61abfd12007-09-13 16:26:47 +00001751 c = plain_vgetc();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001752 --no_mapping;
1753 --allow_keys;
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001754 if (c != ESC) // ESC cancels CTRL-K
Bram Moolenaar071d4272004-06-13 20:20:40 +00001755 {
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001756 if (IS_SPECIAL(c)) // insert special key code
Bram Moolenaar071d4272004-06-13 20:20:40 +00001757 return c;
1758 if (cmdline)
1759 {
1760 if (char2cells(c) == 1
1761#if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
1762 && cmdline_star == 0
1763#endif
1764 )
1765 putcmdline(c, TRUE);
1766 }
1767#ifdef FEAT_CMDL_INFO
1768 else
1769 add_to_showcmd(c);
1770#endif
1771 ++no_mapping;
1772 ++allow_keys;
Bram Moolenaar61abfd12007-09-13 16:26:47 +00001773 cc = plain_vgetc();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001774 --no_mapping;
1775 --allow_keys;
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001776 if (cc != ESC) // ESC cancels CTRL-K
h-east29b85712021-07-26 21:54:04 +02001777 return digraph_get(c, cc, TRUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001778 }
1779 return NUL;
1780}
1781
1782/*
1783 * Lookup the pair "char1", "char2" in the digraph tables.
1784 * If no match, return "char2".
Bram Moolenaar70b2a562012-01-10 22:26:17 +01001785 * If "meta_char" is TRUE and "char1" is a space, return "char2" | 0x80.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001786 */
1787 static int
Bram Moolenaar7454a062016-01-30 15:14:10 +01001788getexactdigraph(int char1, int char2, int meta_char)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001789{
1790 int i;
1791 int retval = 0;
1792 digr_T *dp;
1793
1794 if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
1795 return char2;
1796
1797 /*
1798 * Search user digraphs first.
1799 */
1800 dp = (digr_T *)user_digraphs.ga_data;
1801 for (i = 0; i < user_digraphs.ga_len; ++i)
1802 {
1803 if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1804 {
1805 retval = dp->result;
1806 break;
1807 }
1808 ++dp;
1809 }
1810
1811 /*
1812 * Search default digraphs.
1813 */
1814 if (retval == 0)
1815 {
1816 dp = digraphdefault;
1817 for (i = 0; dp->char1 != 0; ++i)
1818 {
1819 if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1820 {
1821 retval = dp->result;
1822 break;
1823 }
1824 ++dp;
1825 }
1826 }
Bram Moolenaar13505972019-01-24 15:04:48 +01001827#ifdef USE_UNICODE_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +00001828 if (retval != 0 && !enc_utf8)
1829 {
1830 char_u buf[6], *to;
1831 vimconv_T vc;
1832
1833 /*
1834 * Convert the Unicode digraph to 'encoding'.
1835 */
1836 i = utf_char2bytes(retval, buf);
1837 retval = 0;
1838 vc.vc_type = CONV_NONE;
1839 if (convert_setup(&vc, (char_u *)"utf-8", p_enc) == OK)
1840 {
1841 vc.vc_fail = TRUE;
1842 to = string_convert(&vc, buf, &i);
1843 if (to != NULL)
1844 {
1845 retval = (*mb_ptr2char)(to);
1846 vim_free(to);
1847 }
1848 (void)convert_setup(&vc, NULL, NULL);
1849 }
1850 }
Bram Moolenaar13505972019-01-24 15:04:48 +01001851#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001852
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001853 // Ignore multi-byte characters when not in multi-byte mode.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001854 if (!has_mbyte && retval > 0xff)
1855 retval = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001856
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001857 if (retval == 0) // digraph deleted or not found
Bram Moolenaar071d4272004-06-13 20:20:40 +00001858 {
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001859 if (char1 == ' ' && meta_char) // <space> <char> --> meta-char
Bram Moolenaar071d4272004-06-13 20:20:40 +00001860 return (char2 | 0x80);
1861 return char2;
1862 }
1863 return retval;
1864}
1865
1866/*
1867 * Get digraph.
1868 * Allow for both char1-char2 and char2-char1
1869 */
1870 int
h-east29b85712021-07-26 21:54:04 +02001871digraph_get(int char1, int char2, int meta_char)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001872{
1873 int retval;
1874
Bram Moolenaar70b2a562012-01-10 22:26:17 +01001875 if (((retval = getexactdigraph(char1, char2, meta_char)) == char2)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001876 && (char1 != char2)
Bram Moolenaar70b2a562012-01-10 22:26:17 +01001877 && ((retval = getexactdigraph(char2, char1, meta_char)) == char1))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001878 return char2;
1879 return retval;
1880}
1881
1882/*
mityu61065042021-07-19 20:07:21 +02001883 * Add a digraph to the digraph table.
1884 */
1885 static void
1886registerdigraph(int char1, int char2, int n)
1887{
1888 int i;
1889 digr_T *dp;
1890
1891 // If the digraph already exists, replace "result".
1892 dp = (digr_T *)user_digraphs.ga_data;
1893 for (i = 0; i < user_digraphs.ga_len; ++i)
1894 {
1895 if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1896 {
1897 dp->result = n;
1898 return;
1899 }
1900 ++dp;
1901 }
1902
1903 // Add a new digraph to the table.
1904 if (ga_grow(&user_digraphs, 1) == OK)
1905 {
1906 dp = (digr_T *)user_digraphs.ga_data + user_digraphs.ga_len;
1907 dp->char1 = char1;
1908 dp->char2 = char2;
1909 dp->result = n;
1910 ++user_digraphs.ga_len;
1911 }
1912}
1913
1914/*
1915 * Check the characters are valid for a digraph.
1916 * If they are valid, returns TRUE; otherwise, give an error message and
1917 * returns FALSE.
1918 */
Yegappan Lakshmanan8ee52af2021-08-09 19:59:06 +02001919 static int
mityu61065042021-07-19 20:07:21 +02001920check_digraph_chars_valid(int char1, int char2)
1921{
1922 if (char2 == 0)
1923 {
1924 char_u msg[MB_MAXBYTES + 1];
1925
1926 msg[mb_char2bytes(char1, msg)] = NUL;
1927
1928 semsg(_(e_digraph_must_be_just_two_characters_str), msg);
1929 return FALSE;
1930 }
1931 if (char1 == ESC || char2 == ESC)
1932 {
Bram Moolenaare1242042021-12-16 20:56:57 +00001933 emsg(_(e_escape_not_allowed_in_digraph));
mityu61065042021-07-19 20:07:21 +02001934 return FALSE;
1935 }
1936 return TRUE;
1937}
1938
1939
1940
1941/*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001942 * Add the digraphs in the argument to the digraph table.
1943 * format: {c1}{c2} char {c1}{c2} char ...
1944 */
1945 void
Bram Moolenaar7454a062016-01-30 15:14:10 +01001946putdigraph(char_u *str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001947{
1948 int char1, char2, n;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001949
1950 while (*str != NUL)
1951 {
1952 str = skipwhite(str);
1953 if (*str == NUL)
1954 return;
1955 char1 = *str++;
1956 char2 = *str++;
mityu61065042021-07-19 20:07:21 +02001957
1958 if (!check_digraph_chars_valid(char1, char2))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001959 return;
mityu61065042021-07-19 20:07:21 +02001960
Bram Moolenaar071d4272004-06-13 20:20:40 +00001961 str = skipwhite(str);
1962 if (!VIM_ISDIGIT(*str))
1963 {
Bram Moolenaare29a27f2021-07-20 21:07:36 +02001964 emsg(_(e_number_expected));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001965 return;
1966 }
1967 n = getdigits(&str);
1968
mityu61065042021-07-19 20:07:21 +02001969 registerdigraph(char1, char2, n);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001970 }
1971}
1972
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001973#if defined(USE_UNICODE_DIGRAPHS)
1974 static void
1975digraph_header(char *msg)
1976{
1977 if (msg_col > 0)
1978 msg_putchar('\n');
1979 msg_outtrans_attr((char_u *)msg, HL_ATTR(HLF_CM));
1980 msg_putchar('\n');
1981}
1982#endif
1983
Bram Moolenaar071d4272004-06-13 20:20:40 +00001984 void
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001985listdigraphs(int use_headers)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001986{
1987 int i;
1988 digr_T *dp;
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001989 result_T previous = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001990
1991 msg_putchar('\n');
1992
1993 dp = digraphdefault;
1994 for (i = 0; dp->char1 != NUL && !got_int; ++i)
1995 {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001996#if defined(USE_UNICODE_DIGRAPHS)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001997 digr_T tmp;
1998
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01001999 // May need to convert the result to 'encoding'.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002000 tmp.char1 = dp->char1;
2001 tmp.char2 = dp->char2;
2002 tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
2003 if (tmp.result != 0 && tmp.result != tmp.char2
2004 && (has_mbyte || tmp.result <= 255))
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002005 printdigraph(&tmp, use_headers ? &previous : NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002006#else
2007
2008 if (getexactdigraph(dp->char1, dp->char2, FALSE) == dp->result
Bram Moolenaar13505972019-01-24 15:04:48 +01002009 && (has_mbyte || dp->result <= 255))
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002010 printdigraph(dp, use_headers ? &previous : NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002011#endif
2012 ++dp;
2013 ui_breakcheck();
2014 }
2015
2016 dp = (digr_T *)user_digraphs.ga_data;
2017 for (i = 0; i < user_digraphs.ga_len && !got_int; ++i)
2018 {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002019#if defined(USE_UNICODE_DIGRAPHS)
2020 if (previous >= 0 && use_headers)
2021 digraph_header(_("Custom"));
2022 previous = -1;
2023#endif
2024 printdigraph(dp, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002025 ui_breakcheck();
2026 ++dp;
2027 }
Bram Moolenaara4d158b2022-08-14 14:17:45 +01002028
2029 // clear screen, because some digraphs may be wrong, in which case we
2030 // messed up ScreenLines
2031 must_redraw = UPD_CLEAR;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002032}
2033
mityu61065042021-07-19 20:07:21 +02002034 static void
h-east29b85712021-07-26 21:54:04 +02002035digraph_getlist_appendpair(digr_T *dp, list_T *l)
mityu61065042021-07-19 20:07:21 +02002036{
2037 char_u buf[30];
2038 char_u *p;
2039 list_T *l2;
2040 listitem_T *li, *li2;
2041
2042
2043 li = listitem_alloc();
2044 if (li == NULL)
2045 return;
2046 list_append(l, li);
2047 li->li_tv.v_type = VAR_LIST;
2048 li->li_tv.v_lock = 0;
2049
2050 l2 = list_alloc();
2051 li->li_tv.vval.v_list = l2;
2052 if (l2 == NULL)
2053 return;
2054 ++l2->lv_refcount;
2055
2056 li2 = listitem_alloc();
2057 if (li2 == NULL)
2058 return;
2059 list_append(l2, li2);
2060 li2->li_tv.v_type = VAR_STRING;
2061 li2->li_tv.v_lock = 0;
2062
2063 buf[0] = dp->char1;
2064 buf[1] = dp->char2;
2065 buf[2] = NUL;
2066 li2->li_tv.vval.v_string = vim_strsave(&buf[0]);
2067
2068 li2 = listitem_alloc();
2069 if (li2 == NULL)
2070 return;
2071 list_append(l2, li2);
2072 li2->li_tv.v_type = VAR_STRING;
2073 li2->li_tv.v_lock = 0;
2074
2075 p = buf;
2076 if (has_mbyte)
2077 p += (*mb_char2bytes)(dp->result, p);
2078 else
2079 *p++ = (char_u)dp->result;
2080 *p = NUL;
2081
2082 li2->li_tv.vval.v_string = vim_strsave(buf);
2083}
2084
Yegappan Lakshmanan8ee52af2021-08-09 19:59:06 +02002085 static void
h-east29b85712021-07-26 21:54:04 +02002086digraph_getlist_common(int list_all, typval_T *rettv)
mityu61065042021-07-19 20:07:21 +02002087{
2088 int i;
2089 digr_T *dp;
2090
2091 if (rettv_list_alloc(rettv) == FAIL)
2092 return;
2093
2094 if (list_all)
2095 {
2096 dp = digraphdefault;
2097 for (i = 0; dp->char1 != NUL && !got_int; ++i)
2098 {
2099#ifdef USE_UNICODE_DIGRAPHS
2100 digr_T tmp;
2101
2102 tmp.char1 = dp->char1;
2103 tmp.char2 = dp->char2;
2104 tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
2105 if (tmp.result != 0 && tmp.result != tmp.char2
2106 && (has_mbyte || tmp.result <= 255))
h-east29b85712021-07-26 21:54:04 +02002107 digraph_getlist_appendpair(&tmp, rettv->vval.v_list);
mityu61065042021-07-19 20:07:21 +02002108#else
2109 if (getexactdigraph(dp->char1, dp->char2, FALSE) == dp->result
2110 && (has_mbyte || dp->result <= 255))
h-east29b85712021-07-26 21:54:04 +02002111 digraph_getlist_appendpair(dp, rettv->vval.v_list);
mityu61065042021-07-19 20:07:21 +02002112#endif
2113 ++dp;
2114 }
2115 }
2116
2117 dp = (digr_T *)user_digraphs.ga_data;
2118 for (i = 0; i < user_digraphs.ga_len && !got_int; ++i)
2119 {
h-east29b85712021-07-26 21:54:04 +02002120 digraph_getlist_appendpair(dp, rettv->vval.v_list);
mityu61065042021-07-19 20:07:21 +02002121 ++dp;
2122 }
2123}
2124
Bram Moolenaar5843f5f2019-08-20 20:13:45 +02002125static struct dg_header_entry {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002126 int dg_start;
2127 char *dg_header;
2128} header_table[] = {
2129 {DG_START_LATIN, N_("Latin supplement")},
2130 {DG_START_GREEK, N_("Greek and Coptic")},
2131 {DG_START_CYRILLIC, N_("Cyrillic")},
2132 {DG_START_HEBREW, N_("Hebrew")},
2133 {DG_START_ARABIC, N_("Arabic")},
2134 {DG_START_LATIN_EXTENDED, N_("Latin extended")},
2135 {DG_START_GREEK_EXTENDED, N_("Greek extended")},
2136 {DG_START_PUNCTUATION, N_("Punctuation")},
2137 {DG_START_SUB_SUPER, N_("Super- and subscripts")},
2138 {DG_START_CURRENCY, N_("Currency")},
2139 {DG_START_OTHER1, N_("Other")},
2140 {DG_START_ROMAN, N_("Roman numbers")},
2141 {DG_START_ARROWS, N_("Arrows")},
2142 {DG_START_MATH, N_("Mathematical operators")},
2143 {DG_START_TECHNICAL, N_("Technical")},
2144 {DG_START_OTHER2, N_("Other")},
2145 {DG_START_DRAWING, N_("Box drawing")},
2146 {DG_START_BLOCK, N_("Block elements")},
2147 {DG_START_SHAPES, N_("Geometric shapes")},
2148 {DG_START_SYMBOLS, N_("Symbols")},
2149 {DG_START_DINGBATS, N_("Dingbats")},
2150 {DG_START_CJK_SYMBOLS, N_("CJK symbols and punctuation")},
2151 {DG_START_HIRAGANA, N_("Hiragana")},
2152 {DG_START_KATAKANA, N_("Katakana")},
2153 {DG_START_BOPOMOFO, N_("Bopomofo")},
2154 {DG_START_OTHER3, N_("Other")},
2155 {0xfffffff, NULL},
2156};
2157
Bram Moolenaar071d4272004-06-13 20:20:40 +00002158 static void
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002159printdigraph(digr_T *dp, result_T *previous)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002160{
2161 char_u buf[30];
2162 char_u *p;
2163
2164 int list_width;
2165
Bram Moolenaar13505972019-01-24 15:04:48 +01002166 if ((dy_flags & DY_UHEX) || has_mbyte)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002167 list_width = 13;
2168 else
2169 list_width = 11;
2170
2171 if (dp->result != 0)
2172 {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002173#if defined(USE_UNICODE_DIGRAPHS)
2174 if (previous != NULL)
2175 {
2176 int i;
2177
2178 for (i = 0; header_table[i].dg_header != NULL; ++i)
2179 if (*previous < header_table[i].dg_start
2180 && dp->result >= header_table[i].dg_start
2181 && dp->result < header_table[i + 1].dg_start)
2182 {
2183 digraph_header(_(header_table[i].dg_header));
2184 break;
2185 }
2186 *previous = dp->result;
2187 }
2188#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002189 if (msg_col > Columns - list_width)
2190 msg_putchar('\n');
2191 if (msg_col)
2192 while (msg_col % list_width != 0)
2193 msg_putchar(' ');
2194
2195 p = buf;
2196 *p++ = dp->char1;
2197 *p++ = dp->char2;
2198 *p++ = ' ';
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002199 *p = NUL;
2200 msg_outtrans(buf);
2201 p = buf;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002202 if (has_mbyte)
2203 {
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002204 // add a space to draw a composing char on
Bram Moolenaar071d4272004-06-13 20:20:40 +00002205 if (enc_utf8 && utf_iscomposing(dp->result))
2206 *p++ = ' ';
2207 p += (*mb_char2bytes)(dp->result, p);
2208 }
2209 else
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002210 *p++ = (char_u)dp->result;
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002211 *p = NUL;
2212 msg_outtrans_attr(buf, HL_ATTR(HLF_8));
2213 p = buf;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002214 if (char2cells(dp->result) == 1)
2215 *p++ = ' ';
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002216 vim_snprintf((char *)p, sizeof(buf) - (p - buf), " %3d", dp->result);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002217 msg_outtrans(buf);
2218 }
2219}
2220
mityu61065042021-07-19 20:07:21 +02002221# ifdef FEAT_EVAL
2222/*
2223 * Get the two digraph characters from a typval.
2224 * Return OK or FAIL.
2225 */
2226 static int
2227get_digraph_chars(typval_T *arg, int *char1, int *char2)
2228{
2229 char_u buf_chars[NUMBUFLEN];
2230 char_u *chars = tv_get_string_buf_chk(arg, buf_chars);
2231 char_u *p = chars;
2232
2233 if (p != NULL)
2234 {
2235 if (*p != NUL)
2236 {
2237 *char1 = mb_cptr2char_adv(&p);
2238 if (*p != NUL)
2239 {
2240 *char2 = mb_cptr2char_adv(&p);
2241 if (*p == NUL)
2242 {
2243 if (check_digraph_chars_valid(*char1, *char2))
2244 return OK;
2245 return FAIL;
2246 }
2247 }
2248 }
2249 }
2250 semsg(_(e_digraph_must_be_just_two_characters_str), chars);
2251 return FAIL;
2252}
2253
2254 static int
h-east29b85712021-07-26 21:54:04 +02002255digraph_set_common(typval_T *argchars, typval_T *argdigraph)
mityu61065042021-07-19 20:07:21 +02002256{
2257 int char1, char2;
2258 char_u *digraph;
2259 char_u *p;
2260 char_u buf_digraph[NUMBUFLEN];
2261 varnumber_T n;
2262
2263 if (get_digraph_chars(argchars, &char1, &char2) == FAIL)
2264 return FALSE;
2265
2266 digraph = tv_get_string_buf_chk(argdigraph, buf_digraph);
2267 if (digraph == NULL)
2268 return FALSE;
2269 p = digraph;
2270 n = mb_cptr2char_adv(&p);
2271 if (*p != NUL)
2272 {
2273 semsg(_(e_digraph_argument_must_be_one_character_str), digraph);
2274 return FALSE;
2275 }
2276
2277 registerdigraph(char1, char2, (int)n);
2278 return TRUE;
2279}
2280# endif
2281
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002282#endif // FEAT_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +00002283
mityu61065042021-07-19 20:07:21 +02002284#if defined(FEAT_EVAL) || defined(PROTO)
2285/*
h-east29b85712021-07-26 21:54:04 +02002286 * "digraph_get()" function
mityu61065042021-07-19 20:07:21 +02002287 */
2288 void
h-east29b85712021-07-26 21:54:04 +02002289f_digraph_get(typval_T *argvars, typval_T *rettv)
mityu61065042021-07-19 20:07:21 +02002290{
2291# ifdef FEAT_DIGRAPHS
2292 int code;
2293 char_u buf[NUMBUFLEN];
2294 char_u *digraphs;
2295
2296 rettv->v_type = VAR_STRING;
2297 rettv->vval.v_string = NULL; // Return empty string for failure
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +02002298
2299 if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
2300 return;
2301
mityu61065042021-07-19 20:07:21 +02002302 digraphs = tv_get_string_chk(&argvars[0]);
2303
2304 if (digraphs == NULL)
2305 return;
2306 else if (STRLEN(digraphs) != 2)
2307 {
2308 semsg(_(e_digraph_must_be_just_two_characters_str), digraphs);
2309 return;
2310 }
h-east29b85712021-07-26 21:54:04 +02002311 code = digraph_get(digraphs[0], digraphs[1], FALSE);
mityu61065042021-07-19 20:07:21 +02002312
2313 if (has_mbyte)
2314 buf[(*mb_char2bytes)(code, buf)] = NUL;
2315 else {
2316 buf[0] = code;
2317 buf[1] = NUL;
2318 }
2319
2320 rettv->vval.v_string = vim_strsave(buf);
2321# else
2322 emsg(_(e_no_digraphs_version));
2323# endif
2324}
2325
2326/*
h-east29b85712021-07-26 21:54:04 +02002327 * "digraph_getlist()" function
mityu61065042021-07-19 20:07:21 +02002328 */
2329 void
h-east29b85712021-07-26 21:54:04 +02002330f_digraph_getlist(typval_T *argvars, typval_T *rettv)
mityu61065042021-07-19 20:07:21 +02002331{
2332# ifdef FEAT_DIGRAPHS
2333 int flag_list_all;
2334
Yegappan Lakshmananfc3b7752021-09-08 14:57:42 +02002335 if (in_vim9script() && check_for_opt_bool_arg(argvars, 0) == FAIL)
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +02002336 return;
2337
mityu61065042021-07-19 20:07:21 +02002338 if (argvars[0].v_type == VAR_UNKNOWN)
2339 flag_list_all = FALSE;
2340 else
2341 {
Bram Moolenaar6ed545e2022-05-09 20:09:23 +01002342 int error = FALSE;
mityu61065042021-07-19 20:07:21 +02002343 varnumber_T flag = tv_get_number_chk(&argvars[0], &error);
Bram Moolenaar6ed545e2022-05-09 20:09:23 +01002344
mityu61065042021-07-19 20:07:21 +02002345 if (error)
2346 return;
2347 flag_list_all = flag ? TRUE : FALSE;
2348 }
2349
h-east29b85712021-07-26 21:54:04 +02002350 digraph_getlist_common(flag_list_all, rettv);
mityu61065042021-07-19 20:07:21 +02002351# else
2352 emsg(_(e_no_digraphs_version));
2353# endif
2354}
2355
2356/*
h-east29b85712021-07-26 21:54:04 +02002357 * "digraph_set()" function
mityu61065042021-07-19 20:07:21 +02002358 */
2359 void
h-east29b85712021-07-26 21:54:04 +02002360f_digraph_set(typval_T *argvars, typval_T *rettv)
mityu61065042021-07-19 20:07:21 +02002361{
2362# ifdef FEAT_DIGRAPHS
2363 rettv->v_type = VAR_BOOL;
2364 rettv->vval.v_number = VVAL_FALSE;
2365
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +02002366 if (in_vim9script()
2367 && (check_for_string_arg(argvars, 0) == FAIL
Yegappan Lakshmananfc3b7752021-09-08 14:57:42 +02002368 || check_for_string_arg(argvars, 1) == FAIL))
Yegappan Lakshmanan4490ec42021-07-27 22:00:44 +02002369 return;
2370
h-east29b85712021-07-26 21:54:04 +02002371 if (!digraph_set_common(&argvars[0], &argvars[1]))
mityu61065042021-07-19 20:07:21 +02002372 return;
2373
2374 rettv->vval.v_number = VVAL_TRUE;
2375# else
2376 emsg(_(e_no_digraphs_version));
2377# endif
2378}
2379
2380/*
h-east29b85712021-07-26 21:54:04 +02002381 * "digraph_setlist()" function
mityu61065042021-07-19 20:07:21 +02002382 */
2383 void
h-east29b85712021-07-26 21:54:04 +02002384f_digraph_setlist(typval_T * argvars, typval_T *rettv)
mityu61065042021-07-19 20:07:21 +02002385{
2386# ifdef FEAT_DIGRAPHS
2387 list_T *pl, *l;
2388 listitem_T *pli;
2389
2390 rettv->v_type = VAR_BOOL;
2391 rettv->vval.v_number = VVAL_FALSE;
2392
2393 if (argvars[0].v_type != VAR_LIST)
2394 {
h-east29b85712021-07-26 21:54:04 +02002395 emsg(_(e_digraph_setlist_argument_must_be_list_of_lists_with_two_items));
mityu61065042021-07-19 20:07:21 +02002396 return;
2397 }
2398
2399 pl = argvars[0].vval.v_list;
2400 if (pl == NULL)
2401 {
2402 // Empty list always results in success.
2403 rettv->vval.v_number = VVAL_TRUE;
2404 return;
2405 }
2406
2407 FOR_ALL_LIST_ITEMS(pl, pli)
2408 {
2409 if (pli->li_tv.v_type != VAR_LIST)
2410 {
h-east29b85712021-07-26 21:54:04 +02002411 emsg(_(e_digraph_setlist_argument_must_be_list_of_lists_with_two_items));
mityu61065042021-07-19 20:07:21 +02002412 return;
2413 }
2414
2415 l = pli->li_tv.vval.v_list;
2416 if (l == NULL || l->lv_len != 2)
2417 {
h-east29b85712021-07-26 21:54:04 +02002418 emsg(_(e_digraph_setlist_argument_must_be_list_of_lists_with_two_items));
mityu61065042021-07-19 20:07:21 +02002419 return;
2420 }
2421
h-east29b85712021-07-26 21:54:04 +02002422 if (!digraph_set_common(&l->lv_first->li_tv,
mityu61065042021-07-19 20:07:21 +02002423 &l->lv_first->li_next->li_tv))
2424 return;
2425 }
2426 rettv->vval.v_number = VVAL_TRUE;
2427# else
2428 emsg(_(e_no_digraphs_version));
2429# endif
2430}
2431
2432#endif // FEAT_EVAL
2433
2434
Bram Moolenaar071d4272004-06-13 20:20:40 +00002435#if defined(FEAT_KEYMAP) || defined(PROTO)
2436
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002437// structure used for b_kmap_ga.ga_data
Bram Moolenaar071d4272004-06-13 20:20:40 +00002438typedef struct
2439{
2440 char_u *from;
2441 char_u *to;
2442} kmap_T;
2443
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002444#define KMAP_MAXLEN 20 // maximum length of "from" or "to"
Bram Moolenaar071d4272004-06-13 20:20:40 +00002445
Bram Moolenaarf28dbce2016-01-29 22:03:47 +01002446static void keymap_unload(void);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002447
2448/*
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002449 * Set up key mapping tables for the 'keymap' option.
2450 * Returns NULL if OK, an error message for failure. This only needs to be
2451 * used when setting the option, not later when the value has already been
2452 * checked.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002453 */
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002454 char *
Bram Moolenaar7454a062016-01-30 15:14:10 +01002455keymap_init(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002456{
2457 curbuf->b_kmap_state &= ~KEYMAP_INIT;
2458
2459 if (*curbuf->b_p_keymap == NUL)
2460 {
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002461 // Stop any active keymap and clear the table. Also remove
2462 // b:keymap_name, as no keymap is active now.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002463 keymap_unload();
Bram Moolenaarbf444172007-07-07 11:58:28 +00002464 do_cmdline_cmd((char_u *)"unlet! b:keymap_name");
Bram Moolenaar071d4272004-06-13 20:20:40 +00002465 }
2466 else
2467 {
2468 char_u *buf;
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002469 size_t buflen;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002470
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002471 // Source the keymap file. It will contain a ":loadkeymap" command
2472 // which will call ex_loadkeymap() below.
Bram Moolenaar13505972019-01-24 15:04:48 +01002473 buflen = STRLEN(curbuf->b_p_keymap) + STRLEN(p_enc) + 14;
Bram Moolenaar964b3742019-05-24 18:54:09 +02002474 buf = alloc(buflen);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002475 if (buf == NULL)
Bram Moolenaare29a27f2021-07-20 21:07:36 +02002476 return e_out_of_memory;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002477
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002478 // try finding "keymap/'keymap'_'encoding'.vim" in 'runtimepath'
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002479 vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
2480 curbuf->b_p_keymap, p_enc);
Bram Moolenaar7f8989d2016-03-12 22:11:39 +01002481 if (source_runtime(buf, 0) == FAIL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002482 {
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002483 // try finding "keymap/'keymap'.vim" in 'runtimepath'
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002484 vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
2485 curbuf->b_p_keymap);
Bram Moolenaar7f8989d2016-03-12 22:11:39 +01002486 if (source_runtime(buf, 0) == FAIL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002487 {
2488 vim_free(buf);
Bram Moolenaar1d423ef2022-01-02 21:26:16 +00002489 return N_(e_keymap_file_not_found);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002490 }
2491 }
2492 vim_free(buf);
2493 }
2494
2495 return NULL;
2496}
2497
2498/*
2499 * ":loadkeymap" command: load the following lines as the keymap.
2500 */
2501 void
Bram Moolenaar7454a062016-01-30 15:14:10 +01002502ex_loadkeymap(exarg_T *eap)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002503{
2504 char_u *line;
2505 char_u *p;
2506 char_u *s;
2507 kmap_T *kp;
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002508#define KMAP_LLEN 200 // max length of "to" and "from" together
Bram Moolenaar071d4272004-06-13 20:20:40 +00002509 char_u buf[KMAP_LLEN + 11];
2510 int i;
2511 char_u *save_cpo = p_cpo;
2512
Yegappan Lakshmanan36a5b682022-03-19 12:56:51 +00002513 if (!sourcing_a_script(eap))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002514 {
Bram Moolenaare1242042021-12-16 20:56:57 +00002515 emsg(_(e_using_loadkeymap_not_in_sourced_file));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002516 return;
2517 }
2518
2519 /*
2520 * Stop any active keymap and clear the table.
2521 */
2522 keymap_unload();
2523
2524 curbuf->b_kmap_state = 0;
Bram Moolenaar04935fb2022-01-08 16:19:22 +00002525 ga_init2(&curbuf->b_kmap_ga, sizeof(kmap_T), 20);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002526
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002527 // Set 'cpoptions' to "C" to avoid line continuation.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002528 p_cpo = (char_u *)"C";
2529
2530 /*
2531 * Get each line of the sourced file, break at the end.
2532 */
2533 for (;;)
2534 {
Bram Moolenaare96a2492019-06-25 04:12:16 +02002535 line = eap->getline(0, eap->cookie, 0, TRUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002536 if (line == NULL)
2537 break;
2538
2539 p = skipwhite(line);
2540 if (*p != '"' && *p != NUL && ga_grow(&curbuf->b_kmap_ga, 1) == OK)
2541 {
2542 kp = (kmap_T *)curbuf->b_kmap_ga.ga_data + curbuf->b_kmap_ga.ga_len;
2543 s = skiptowhite(p);
Bram Moolenaardf44a272020-06-07 20:49:05 +02002544 kp->from = vim_strnsave(p, s - p);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002545 p = skipwhite(s);
2546 s = skiptowhite(p);
Bram Moolenaardf44a272020-06-07 20:49:05 +02002547 kp->to = vim_strnsave(p, s - p);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002548
2549 if (kp->from == NULL || kp->to == NULL
Bram Moolenaar57657d82006-04-21 22:12:41 +00002550 || STRLEN(kp->from) + STRLEN(kp->to) >= KMAP_LLEN
2551 || *kp->from == NUL || *kp->to == NUL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002552 {
Bram Moolenaar57657d82006-04-21 22:12:41 +00002553 if (kp->to != NULL && *kp->to == NUL)
Bram Moolenaar677658a2022-01-05 16:09:06 +00002554 emsg(_(e_empty_keymap_entry));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002555 vim_free(kp->from);
2556 vim_free(kp->to);
2557 }
2558 else
Bram Moolenaar071d4272004-06-13 20:20:40 +00002559 ++curbuf->b_kmap_ga.ga_len;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002560 }
2561 vim_free(line);
2562 }
2563
2564 /*
2565 * setup ":lnoremap" to map the keys
2566 */
2567 for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
2568 {
Bram Moolenaar555b2802005-05-19 21:08:39 +00002569 vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s",
Bram Moolenaar071d4272004-06-13 20:20:40 +00002570 ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from,
2571 ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to);
zeertzjq44068e92022-06-16 11:14:55 +01002572 (void)do_map(MAPTYPE_NOREMAP, buf, MODE_LANGMAP, FALSE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002573 }
2574
2575 p_cpo = save_cpo;
2576
2577 curbuf->b_kmap_state |= KEYMAP_LOADED;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002578 status_redraw_curbuf();
Bram Moolenaar071d4272004-06-13 20:20:40 +00002579}
2580
2581/*
2582 * Stop using 'keymap'.
2583 */
2584 static void
Bram Moolenaar7454a062016-01-30 15:14:10 +01002585keymap_unload(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002586{
2587 char_u buf[KMAP_MAXLEN + 10];
2588 int i;
2589 char_u *save_cpo = p_cpo;
Bram Moolenaar8c8de832008-06-24 22:58:06 +00002590 kmap_T *kp;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002591
2592 if (!(curbuf->b_kmap_state & KEYMAP_LOADED))
2593 return;
2594
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002595 // Set 'cpoptions' to "C" to avoid line continuation.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002596 p_cpo = (char_u *)"C";
2597
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002598 // clear the ":lmap"s
Bram Moolenaar8c8de832008-06-24 22:58:06 +00002599 kp = (kmap_T *)curbuf->b_kmap_ga.ga_data;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002600 for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
2601 {
Bram Moolenaar8c8de832008-06-24 22:58:06 +00002602 vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s", kp[i].from);
zeertzjq44068e92022-06-16 11:14:55 +01002603 (void)do_map(MAPTYPE_UNMAP, buf, MODE_LANGMAP, FALSE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002604 }
Bram Moolenaar50138322018-01-28 17:05:16 +01002605 keymap_clear(&curbuf->b_kmap_ga);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002606
2607 p_cpo = save_cpo;
2608
2609 ga_clear(&curbuf->b_kmap_ga);
2610 curbuf->b_kmap_state &= ~KEYMAP_LOADED;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002611 status_redraw_curbuf();
Bram Moolenaar071d4272004-06-13 20:20:40 +00002612}
2613
Bram Moolenaar50138322018-01-28 17:05:16 +01002614 void
2615keymap_clear(garray_T *kmap)
2616{
2617 int i;
2618 kmap_T *kp = (kmap_T *)kmap->ga_data;
2619
2620 for (i = 0; i < kmap->ga_len; ++i)
2621 {
2622 vim_free(kp[i].from);
2623 vim_free(kp[i].to);
2624 }
2625}
Bram Moolenaar5d18efe2019-12-01 21:11:22 +01002626#endif // FEAT_KEYMAP