blob: 758c23d36ca33391eb3eec926277e8b21c572c9e [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
29/* 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 Moolenaar13505972019-01-24 15:04:48 +010038#ifdef __MINT__
Bram Moolenaar071d4272004-06-13 20:20:40 +000039 /*
40 * ATARI digraphs
41 */
Bram Moolenaar071d4272004-06-13 20:20:40 +000042 {{'C', ',', 128}, /* ~@ XX */
Bram Moolenaar41193092019-08-24 21:53:31 +020043 {'u', '"', 129}, /*  */
44 {'e', '\'', 130}, /* ‚ */
45 {'a', '^', 131}, /* ƒ */
46 {'a', '"', 132}, /* „ */
47 {'a', '`', 133}, /* … */
48 {'a', '@', 134}, /* † */
Bram Moolenaar071d4272004-06-13 20:20:40 +000049 {'c', ',', 135}, /* ~G XX */
50 {'e', '^', 136}, /* ~H XX */
Bram Moolenaar41193092019-08-24 21:53:31 +020051 {'e', '"', 137}, /* ‰ */
52 {'e', '`', 138}, /* Š */
53 {'i', '"', 139}, /* ‹ */
54 {'i', '^', 140}, /* Œ */
55 {'i', '`', 141}, /*  */
56 {'A', '"', 142}, /* Ž */
57 {'A', '@', 143}, /*  */
58 {'E', '\'', 144}, /*  */
59 {'a', 'e', 145}, /* ‘ */
60 {'A', 'E', 146}, /* ’ */
61 {'o', '^', 147}, /* “ */
62 {'o', '"', 148}, /* ” */
63 {'o', '`', 149}, /* • */
64 {'u', '^', 150}, /* – */
65 {'u', '`', 151}, /* — */
66 {'y', '"', 152}, /* ˜ */
67 {'O', '"', 153}, /* ™ */
68 {'U', '"', 154}, /* š */
69 {'c', '|', 155}, /* › */
70 {'$', '$', 156}, /* œ */
Bram Moolenaar071d4272004-06-13 20:20:40 +000071 {'Y', '-', 157}, /* ~] XX */
Bram Moolenaar41193092019-08-24 21:53:31 +020072 {'s', 's', 158}, /* ž */
73 {'f', 'f', 159}, /* Ÿ */
74 {'a', '\'', 160}, /*   */
75 {'i', '\'', 161}, /* ¡ */
76 {'o', '\'', 162}, /* ¢ */
77 {'u', '\'', 163}, /* £ */
78 {'n', '~', 164}, /* ¤ */
79 {'N', '~', 165}, /* ¥ */
80 {'a', 'a', 166}, /* ¦ */
81 {'o', 'o', 167}, /* § */
82 {'~', '?', 168}, /* ¨ */
83 {'-', 'a', 169}, /* © */
84 {'a', '-', 170}, /* ª */
85 {'1', '2', 171}, /* « */
86 {'1', '4', 172}, /* ¬ */
87 {'~', '!', 173}, /* ­ */
88 {'<', '<', 174}, /* ® */
89 {'>', '>', 175}, /* ¯ */
90 {'j', 'u', 230}, /* æ */
91 {'o', '/', 237}, /* í */
92 {'+', '-', 241}, /* ñ */
93 {'>', '=', 242}, /* ò */
94 {'<', '=', 243}, /* ó */
95 {':', '-', 246}, /* ö */
96 {'~', '~', 247}, /* ÷ */
97 {'~', 'o', 248}, /* ø */
98 {'2', '2', 253}, /* ý */
Bram Moolenaar071d4272004-06-13 20:20:40 +000099 {NUL, NUL, NUL}
100 };
101
Bram Moolenaar48e330a2016-02-23 14:53:34 +0100102#else /* !__MINT__ */
103# ifdef HPUX_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000104
105 /*
106 * different HPUX digraphs
107 */
Bram Moolenaar41193092019-08-24 21:53:31 +0200108 {{'A', '`', 161}, /* ¡ */
109 {'A', '^', 162}, /* ¢ */
110 {'E', '`', 163}, /* £ */
111 {'E', '^', 164}, /* ¤ */
112 {'E', '"', 165}, /* ¥ */
113 {'I', '^', 166}, /* ¦ */
114 {'I', '"', 167}, /* § */
115 {'\'', '\'', 168}, /* ¨ */
116 {'`', '`', 169}, /* © */
117 {'^', '^', 170}, /* ª */
118 {'"', '"', 171}, /* « */
119 {'~', '~', 172}, /* ¬ */
120 {'U', '`', 173}, /* ­ */
121 {'U', '^', 174}, /* ® */
122 {'L', '=', 175}, /* ¯ */
123 {'~', '_', 176}, /* ° */
124 {'Y', '\'', 177}, /* ± */
125 {'y', '\'', 178}, /* ² */
126 {'~', 'o', 179}, /* ³ */
127 {'C', ',', 180}, /* ´ */
128 {'c', ',', 181}, /* µ */
129 {'N', '~', 182}, /* ¶ */
130 {'n', '~', 183}, /* · */
131 {'~', '!', 184}, /* ¸ */
132 {'~', '?', 185}, /* ¹ */
133 {'o', 'x', 186}, /* º */
134 {'L', '-', 187}, /* » */
135 {'Y', '=', 188}, /* ¼ */
136 {'p', 'p', 189}, /* ½ */
137 {'f', 'l', 190}, /* ¾ */
138 {'c', '|', 191}, /* ¿ */
139 {'a', '^', 192}, /* À */
140 {'e', '^', 193}, /* Á */
141 {'o', '^', 194}, /* Â */
142 {'u', '^', 195}, /* Ã */
143 {'a', '\'', 196}, /* Ä */
144 {'e', '\'', 197}, /* Å */
145 {'o', '\'', 198}, /* Æ */
146 {'u', '\'', 199}, /* Ç */
147 {'a', '`', 200}, /* È */
148 {'e', '`', 201}, /* É */
149 {'o', '`', 202}, /* Ê */
150 {'u', '`', 203}, /* Ë */
151 {'a', '"', 204}, /* Ì */
152 {'e', '"', 205}, /* Í */
153 {'o', '"', 206}, /* Î */
154 {'u', '"', 207}, /* Ï */
155 {'A', 'o', 208}, /* Ð */
156 {'i', '^', 209}, /* Ñ */
157 {'O', '/', 210}, /* Ò */
158 {'A', 'E', 211}, /* Ó */
159 {'a', 'o', 212}, /* Ô */
160 {'i', '\'', 213}, /* Õ */
161 {'o', '/', 214}, /* Ö */
162 {'a', 'e', 215}, /* × */
163 {'A', '"', 216}, /* Ø */
164 {'i', '`', 217}, /* Ù */
165 {'O', '"', 218}, /* Ú */
166 {'U', '"', 219}, /* Û */
167 {'E', '\'', 220}, /* Ü */
168 {'i', '"', 221}, /* Ý */
169 {'s', 's', 222}, /* Þ */
170 {'O', '^', 223}, /* ß */
171 {'A', '\'', 224}, /* à */
172 {'A', '~', 225}, /* á */
173 {'a', '~', 226}, /* â */
174 {'D', '-', 227}, /* ã */
175 {'d', '-', 228}, /* ä */
176 {'I', '\'', 229}, /* å */
177 {'I', '`', 230}, /* æ */
178 {'O', '\'', 231}, /* ç */
179 {'O', '`', 232}, /* è */
180 {'O', '~', 233}, /* é */
181 {'o', '~', 234}, /* ê */
182 {'S', '~', 235}, /* ë */
183 {'s', '~', 236}, /* ì */
184 {'U', '\'', 237}, /* í */
185 {'Y', '"', 238}, /* î */
186 {'y', '"', 239}, /* ï */
187 {'p', '-', 240}, /* ð */
188 {'p', '~', 241}, /* ñ */
189 {'~', '.', 242}, /* ò */
190 {'j', 'u', 243}, /* ó */
191 {'P', 'p', 244}, /* ô */
192 {'3', '4', 245}, /* õ */
193 {'-', '-', 246}, /* ö */
194 {'1', '4', 247}, /* ÷ */
195 {'1', '2', 248}, /* ø */
196 {'a', '_', 249}, /* ù */
197 {'o', '_', 250}, /* ú */
198 {'<', '<', 251}, /* û */
199 {'x', 'x', 252}, /* ü */
200 {'>', '>', 253}, /* ý */
201 {'+', '-', 254}, /* þ */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000202 {'n', 'u', 255}, /* x XX */
203 {NUL, NUL, NUL}
204 };
205
Bram Moolenaar48e330a2016-02-23 14:53:34 +0100206# else /* !HPUX_DIGRAPHS */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207
Bram Moolenaar48e330a2016-02-23 14:53:34 +0100208# ifdef EBCDIC
Bram Moolenaar071d4272004-06-13 20:20:40 +0000209
210 /*
211 * EBCDIC - ISO digraphs
212 * TODO: EBCDIC Table is Code-Page 1047
213 */
Bram Moolenaar41193092019-08-24 21:53:31 +0200214 {{'a', '^', 66}, /* â */
215 {'a', '"', 67}, /* ä */
216 {'a', '`', 68}, /* à */
217 {'a', '\'', 69}, /* á */
218 {'a', '~', 70}, /* ã */
219 {'a', '@', 71}, /* å */
220 {'a', 'a', 71}, /* å */
221 {'c', ',', 72}, /* ç */
222 {'n', '~', 73}, /* ñ */
223 {'c', '|', 74}, /* ¢ */
224 {'e', '\'', 81}, /* é */
225 {'e', '^', 82}, /* ê */
226 {'e', '"', 83}, /* ë */
227 {'e', '`', 84}, /* è */
228 {'i', '\'', 85}, /* í */
229 {'i', '^', 86}, /* î */
230 {'i', '"', 87}, /* ï */
231 {'i', '`', 88}, /* ì */
232 {'s', 's', 89}, /* ß */
233 {'A', '^', 98}, /* Â */
234 {'A', '"', 99}, /* Ä */
235 {'A', '`', 100}, /* À */
236 {'A', '\'', 101}, /* Á */
237 {'A', '~', 102}, /* Ã */
238 {'A', '@', 103}, /* Å */
239 {'A', 'A', 103}, /* Å */
240 {'C', ',', 104}, /* Ç */
241 {'N', '~', 105}, /* Ñ */
242 {'|', '|', 106}, /* ¦ */
243 {'o', '/', 112}, /* ø */
244 {'E', '\'', 113}, /* É */
245 {'E', '^', 114}, /* Ê */
246 {'E', '"', 115}, /* Ë */
247 {'E', '`', 116}, /* È */
248 {'I', '\'', 117}, /* Í */
249 {'I', '^', 118}, /* Î */
250 {'I', '"', 119}, /* Ï */
251 {'I', '`', 120}, /* Ì */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000252 {'O', '/', 128}, /* 0/ XX */
Bram Moolenaar41193092019-08-24 21:53:31 +0200253 {'<', '<', 138}, /* « */
254 {'>', '>', 139}, /* » */
255 {'d', '-', 140}, /* ð */
256 {'y', '\'', 141}, /* ý */
257 {'i', 'p', 142}, /* þ */
258 {'+', '-', 143}, /* ± */
259 {'~', 'o', 144}, /* ° */
260 {'a', '-', 154}, /* ª */
261 {'o', '-', 155}, /* º */
262 {'a', 'e', 156}, /* æ */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263 {',', ',', 157}, /* , XX */
Bram Moolenaar41193092019-08-24 21:53:31 +0200264 {'A', 'E', 158}, /* Æ */
265 {'o', 'x', 159}, /* ¤ - currency symbol in ISO 8859-1 */
266 {'e', '=', 159}, /* ¤ - euro symbol in ISO 8859-15 */
267 {'E', 'u', 159}, /* ¤ - euro symbol in ISO 8859-15 */
268 {'j', 'u', 160}, /* µ */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269 {'y', '"', 167}, /* x XX */
Bram Moolenaar41193092019-08-24 21:53:31 +0200270 {'~', '!', 170}, /* ¡ */
271 {'~', '?', 171}, /* ¿ */
272 {'D', '-', 172}, /* Ð */
273 {'I', 'p', 174}, /* Þ */
274 {'r', 'O', 175}, /* ® */
275 {'-', ',', 176}, /* ¬ */
276 {'$', '$', 177}, /* £ */
277 {'Y', '-', 178}, /* ¥ */
278 {'~', '.', 179}, /* · */
279 {'c', 'O', 180}, /* © */
280 {'p', 'a', 181}, /* § */
281 {'p', 'p', 182}, /* ¶ */
282 {'1', '4', 183}, /* ¼ */
283 {'1', '2', 184}, /* ½ */
284 {'3', '4', 185}, /* ¾ */
285 {'Y', '\'', 186}, /* Ý */
286 {'"', '"', 187}, /* ¨ */
287 {'-', '=', 188}, /* ¯ */
288 {'\'', '\'', 190}, /* ´ */
289 {'O', 'E', 191}, /* × - OE in ISO 8859-15 */
290 {'/', '\\', 191}, /* × - multiplication symbol in ISO 8859-1 */
291 {'-', '-', 202}, /* ­ */
292 {'o', '^', 203}, /* ô */
293 {'o', '"', 204}, /* ö */
294 {'o', '`', 205}, /* ò */
295 {'o', '\'', 206}, /* ó */
296 {'o', '~', 207}, /* õ */
297 {'1', '1', 218}, /* ¹ */
298 {'u', '^', 219}, /* û */
299 {'u', '"', 220}, /* ü */
300 {'u', '`', 221}, /* ù */
301 {'u', '\'', 222}, /* ú */
302 {':', '-', 225}, /* ÷ - division symbol in ISO 8859-1 */
303 {'o', 'e', 225}, /* ÷ - oe in ISO 8859-15 */
304 {'2', '2', 234}, /* ² */
305 {'O', '^', 235}, /* Ô */
306 {'O', '"', 236}, /* Ö */
307 {'O', '`', 237}, /* Ò */
308 {'O', '\'', 238}, /* Ó */
309 {'O', '~', 239}, /* Õ */
310 {'3', '3', 250}, /* ³ */
311 {'U', '^', 251}, /* Û */
312 {'U', '"', 252}, /* Ü */
313 {'U', '`', 253}, /* Ù */
314 {'U', '\'', 254}, /* Ú */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315 {NUL, NUL, NUL}
316 };
317
Bram Moolenaar48e330a2016-02-23 14:53:34 +0100318# else
Bram Moolenaar13505972019-01-24 15:04:48 +0100319# ifdef OLD_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320
321 /*
322 * digraphs compatible with Vim 5.x
323 */
Bram Moolenaar41193092019-08-24 21:53:31 +0200324 {{'~', '!', 161}, /* ¡ */
325 {'c', '|', 162}, /* ¢ */
326 {'$', '$', 163}, /* £ */
327 {'o', 'x', 164}, /* ¤ - currency symbol in ISO 8859-1 */
328 {'e', '=', 164}, /* ¤ - euro symbol in ISO 8859-15 */
329 {'Y', '-', 165}, /* ¥ */
330 {'|', '|', 166}, /* ¦ */
331 {'p', 'a', 167}, /* § */
332 {'"', '"', 168}, /* ¨ */
333 {'c', 'O', 169}, /* © */
334 {'a', '-', 170}, /* ª */
335 {'<', '<', 171}, /* « */
336 {'-', ',', 172}, /* ¬ */
337 {'-', '-', 173}, /* ­ */
338 {'r', 'O', 174}, /* ® */
339 {'-', '=', 175}, /* ¯ */
340 {'~', 'o', 176}, /* ° */
341 {'+', '-', 177}, /* ± */
342 {'2', '2', 178}, /* ² */
343 {'3', '3', 179}, /* ³ */
344 {'\'', '\'', 180}, /* ´ */
345 {'j', 'u', 181}, /* µ */
346 {'p', 'p', 182}, /* ¶ */
347 {'~', '.', 183}, /* · */
348 {',', ',', 184}, /* ¸ */
349 {'1', '1', 185}, /* ¹ */
350 {'o', '-', 186}, /* º */
351 {'>', '>', 187}, /* » */
352 {'1', '4', 188}, /* ¼ */
353 {'1', '2', 189}, /* ½ */
354 {'3', '4', 190}, /* ¾ */
355 {'~', '?', 191}, /* ¿ */
356 {'A', '`', 192}, /* À */
357 {'A', '\'', 193}, /* Á */
358 {'A', '^', 194}, /* Â */
359 {'A', '~', 195}, /* Ã */
360 {'A', '"', 196}, /* Ä */
361 {'A', '@', 197}, /* Å */
362 {'A', 'A', 197}, /* Å */
363 {'A', 'E', 198}, /* Æ */
364 {'C', ',', 199}, /* Ç */
365 {'E', '`', 200}, /* È */
366 {'E', '\'', 201}, /* É */
367 {'E', '^', 202}, /* Ê */
368 {'E', '"', 203}, /* Ë */
369 {'I', '`', 204}, /* Ì */
370 {'I', '\'', 205}, /* Í */
371 {'I', '^', 206}, /* Î */
372 {'I', '"', 207}, /* Ï */
373 {'D', '-', 208}, /* Ð */
374 {'N', '~', 209}, /* Ñ */
375 {'O', '`', 210}, /* Ò */
376 {'O', '\'', 211}, /* Ó */
377 {'O', '^', 212}, /* Ô */
378 {'O', '~', 213}, /* Õ */
379 {'O', '"', 214}, /* Ö */
380 {'/', '\\', 215}, /* × - multiplication symbol in ISO 8859-1 */
381 {'O', 'E', 215}, /* × - OE in ISO 8859-15 */
382 {'O', '/', 216}, /* Ø */
383 {'U', '`', 217}, /* Ù */
384 {'U', '\'', 218}, /* Ú */
385 {'U', '^', 219}, /* Û */
386 {'U', '"', 220}, /* Ü */
387 {'Y', '\'', 221}, /* Ý */
388 {'I', 'p', 222}, /* Þ */
389 {'s', 's', 223}, /* ß */
390 {'a', '`', 224}, /* à */
391 {'a', '\'', 225}, /* á */
392 {'a', '^', 226}, /* â */
393 {'a', '~', 227}, /* ã */
394 {'a', '"', 228}, /* ä */
395 {'a', '@', 229}, /* å */
396 {'a', 'a', 229}, /* å */
397 {'a', 'e', 230}, /* æ */
398 {'c', ',', 231}, /* ç */
399 {'e', '`', 232}, /* è */
400 {'e', '\'', 233}, /* é */
401 {'e', '^', 234}, /* ê */
402 {'e', '"', 235}, /* ë */
403 {'i', '`', 236}, /* ì */
404 {'i', '\'', 237}, /* í */
405 {'i', '^', 238}, /* î */
406 {'i', '"', 239}, /* ï */
407 {'d', '-', 240}, /* ð */
408 {'n', '~', 241}, /* ñ */
409 {'o', '`', 242}, /* ò */
410 {'o', '\'', 243}, /* ó */
411 {'o', '^', 244}, /* ô */
412 {'o', '~', 245}, /* õ */
413 {'o', '"', 246}, /* ö */
414 {':', '-', 247}, /* ÷ - division symbol in ISO 8859-1 */
415 {'o', 'e', 247}, /* ÷ - oe in ISO 8859-15 */
416 {'o', '/', 248}, /* ø */
417 {'u', '`', 249}, /* ù */
418 {'u', '\'', 250}, /* ú */
419 {'u', '^', 251}, /* û */
420 {'u', '"', 252}, /* ü */
421 {'y', '\'', 253}, /* ý */
422 {'i', 'p', 254}, /* þ */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000423 {'y', '"', 255}, /* x XX */
424 {NUL, NUL, NUL}
425 };
Bram Moolenaar13505972019-01-24 15:04:48 +0100426# else /* OLD_DIGRAPHS */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000427
428 /*
429 * digraphs for Unicode from RFC1345
430 * (also work for ISO-8859-1 aka latin1)
431 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432 {
433 {'N', 'U', 0x0a}, /* LF for NUL */
434 {'S', 'H', 0x01},
435 {'S', 'X', 0x02},
436 {'E', 'X', 0x03},
437 {'E', 'T', 0x04},
438 {'E', 'Q', 0x05},
439 {'A', 'K', 0x06},
440 {'B', 'L', 0x07},
441 {'B', 'S', 0x08},
442 {'H', 'T', 0x09},
443 {'L', 'F', 0x0a},
444 {'V', 'T', 0x0b},
445 {'F', 'F', 0x0c},
446 {'C', 'R', 0x0d},
447 {'S', 'O', 0x0e},
448 {'S', 'I', 0x0f},
449 {'D', 'L', 0x10},
450 {'D', '1', 0x11},
451 {'D', '2', 0x12},
452 {'D', '3', 0x13},
453 {'D', '4', 0x14},
454 {'N', 'K', 0x15},
455 {'S', 'Y', 0x16},
456 {'E', 'B', 0x17},
457 {'C', 'N', 0x18},
458 {'E', 'M', 0x19},
459 {'S', 'B', 0x1a},
460 {'E', 'C', 0x1b},
461 {'F', 'S', 0x1c},
462 {'G', 'S', 0x1d},
463 {'R', 'S', 0x1e},
464 {'U', 'S', 0x1f},
465 {'S', 'P', 0x20},
466 {'N', 'b', 0x23},
467 {'D', 'O', 0x24},
468 {'A', 't', 0x40},
469 {'<', '(', 0x5b},
470 {'/', '/', 0x5c},
471 {')', '>', 0x5d},
472 {'\'', '>', 0x5e},
473 {'\'', '!', 0x60},
474 {'(', '!', 0x7b},
475 {'!', '!', 0x7c},
476 {'!', ')', 0x7d},
477 {'\'', '?', 0x7e},
478 {'D', 'T', 0x7f},
479 {'P', 'A', 0x80},
480 {'H', 'O', 0x81},
481 {'B', 'H', 0x82},
482 {'N', 'H', 0x83},
483 {'I', 'N', 0x84},
484 {'N', 'L', 0x85},
485 {'S', 'A', 0x86},
486 {'E', 'S', 0x87},
487 {'H', 'S', 0x88},
488 {'H', 'J', 0x89},
489 {'V', 'S', 0x8a},
490 {'P', 'D', 0x8b},
491 {'P', 'U', 0x8c},
492 {'R', 'I', 0x8d},
493 {'S', '2', 0x8e},
494 {'S', '3', 0x8f},
495 {'D', 'C', 0x90},
496 {'P', '1', 0x91},
497 {'P', '2', 0x92},
498 {'T', 'S', 0x93},
499 {'C', 'C', 0x94},
500 {'M', 'W', 0x95},
501 {'S', 'G', 0x96},
502 {'E', 'G', 0x97},
503 {'S', 'S', 0x98},
504 {'G', 'C', 0x99},
505 {'S', 'C', 0x9a},
506 {'C', 'I', 0x9b},
507 {'S', 'T', 0x9c},
508 {'O', 'C', 0x9d},
509 {'P', 'M', 0x9e},
510 {'A', 'C', 0x9f},
511 {'N', 'S', 0xa0},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100512#define DG_START_LATIN 0xa1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000513 {'!', 'I', 0xa1},
Bram Moolenaar41193092019-08-24 21:53:31 +0200514 {'~', '!', 0xa1}, // ¡ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000515 {'C', 't', 0xa2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200516 {'c', '|', 0xa2}, // ¢ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000517 {'P', 'd', 0xa3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200518 {'$', '$', 0xa3}, // £ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519 {'C', 'u', 0xa4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200520 {'o', 'x', 0xa4}, // ¤ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000521 {'Y', 'e', 0xa5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200522 {'Y', '-', 0xa5}, // ¥ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000523 {'B', 'B', 0xa6},
Bram Moolenaar41193092019-08-24 21:53:31 +0200524 {'|', '|', 0xa6}, // ¦ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000525 {'S', 'E', 0xa7},
526 {'\'', ':', 0xa8},
527 {'C', 'o', 0xa9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200528 {'c', 'O', 0xa9}, // © Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000529 {'-', 'a', 0xaa},
530 {'<', '<', 0xab},
531 {'N', 'O', 0xac},
Bram Moolenaar41193092019-08-24 21:53:31 +0200532 {'-', ',', 0xac}, // ¬ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000533 {'-', '-', 0xad},
534 {'R', 'g', 0xae},
535 {'\'', 'm', 0xaf},
Bram Moolenaar41193092019-08-24 21:53:31 +0200536 {'-', '=', 0xaf}, // ¯ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000537 {'D', 'G', 0xb0},
Bram Moolenaar41193092019-08-24 21:53:31 +0200538 {'~', 'o', 0xb0}, // ° Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000539 {'+', '-', 0xb1},
540 {'2', 'S', 0xb2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200541 {'2', '2', 0xb2}, // ² Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000542 {'3', 'S', 0xb3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200543 {'3', '3', 0xb3}, // ³ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000544 {'\'', '\'', 0xb4},
545 {'M', 'y', 0xb5},
546 {'P', 'I', 0xb6},
Bram Moolenaar41193092019-08-24 21:53:31 +0200547 {'p', 'p', 0xb6}, // ¶ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000548 {'.', 'M', 0xb7},
Bram Moolenaar41193092019-08-24 21:53:31 +0200549 {'~', '.', 0xb7}, // · Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000550 {'\'', ',', 0xb8},
551 {'1', 'S', 0xb9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200552 {'1', '1', 0xb9}, // ¹ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000553 {'-', 'o', 0xba},
554 {'>', '>', 0xbb},
555 {'1', '4', 0xbc},
556 {'1', '2', 0xbd},
557 {'3', '4', 0xbe},
558 {'?', 'I', 0xbf},
Bram Moolenaar41193092019-08-24 21:53:31 +0200559 {'~', '?', 0xbf}, // ¿ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000560 {'A', '!', 0xc0},
Bram Moolenaar41193092019-08-24 21:53:31 +0200561 {'A', '`', 0xc0}, // À Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000562 {'A', '\'', 0xc1},
563 {'A', '>', 0xc2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200564 {'A', '^', 0xc2}, // Â Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000565 {'A', '?', 0xc3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200566 {'A', '~', 0xc3}, // Ã Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000567 {'A', ':', 0xc4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200568 {'A', '"', 0xc4}, // Ä Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569 {'A', 'A', 0xc5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200570 {'A', '@', 0xc5}, // Å Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000571 {'A', 'E', 0xc6},
572 {'C', ',', 0xc7},
573 {'E', '!', 0xc8},
Bram Moolenaar41193092019-08-24 21:53:31 +0200574 {'E', '`', 0xc8}, // È Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000575 {'E', '\'', 0xc9},
576 {'E', '>', 0xca},
Bram Moolenaar41193092019-08-24 21:53:31 +0200577 {'E', '^', 0xca}, // Ê Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000578 {'E', ':', 0xcb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200579 {'E', '"', 0xcb}, // Ë Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000580 {'I', '!', 0xcc},
Bram Moolenaar41193092019-08-24 21:53:31 +0200581 {'I', '`', 0xcc}, // Ì Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000582 {'I', '\'', 0xcd},
583 {'I', '>', 0xce},
Bram Moolenaar41193092019-08-24 21:53:31 +0200584 {'I', '^', 0xce}, // Î Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000585 {'I', ':', 0xcf},
Bram Moolenaar41193092019-08-24 21:53:31 +0200586 {'I', '"', 0xcf}, // Ï Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000587 {'D', '-', 0xd0},
588 {'N', '?', 0xd1},
Bram Moolenaar41193092019-08-24 21:53:31 +0200589 {'N', '~', 0xd1}, // Ñ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000590 {'O', '!', 0xd2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200591 {'O', '`', 0xd2}, // Ò Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000592 {'O', '\'', 0xd3},
593 {'O', '>', 0xd4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200594 {'O', '^', 0xd4}, // Ô Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000595 {'O', '?', 0xd5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200596 {'O', '~', 0xd5}, // Õ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000597 {'O', ':', 0xd6},
598 {'*', 'X', 0xd7},
Bram Moolenaar41193092019-08-24 21:53:31 +0200599 {'/', '\\', 0xd7}, // × Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000600 {'O', '/', 0xd8},
601 {'U', '!', 0xd9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200602 {'U', '`', 0xd9}, // Ù Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000603 {'U', '\'', 0xda},
604 {'U', '>', 0xdb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200605 {'U', '^', 0xdb}, // Û Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000606 {'U', ':', 0xdc},
607 {'Y', '\'', 0xdd},
608 {'T', 'H', 0xde},
Bram Moolenaar41193092019-08-24 21:53:31 +0200609 {'I', 'p', 0xde}, // Þ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000610 {'s', 's', 0xdf},
611 {'a', '!', 0xe0},
Bram Moolenaar41193092019-08-24 21:53:31 +0200612 {'a', '`', 0xe0}, // à Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000613 {'a', '\'', 0xe1},
614 {'a', '>', 0xe2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200615 {'a', '^', 0xe2}, // â Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000616 {'a', '?', 0xe3},
Bram Moolenaar41193092019-08-24 21:53:31 +0200617 {'a', '~', 0xe3}, // ã Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000618 {'a', ':', 0xe4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200619 {'a', '"', 0xe4}, // ä Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000620 {'a', 'a', 0xe5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200621 {'a', '@', 0xe5}, // å Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000622 {'a', 'e', 0xe6},
623 {'c', ',', 0xe7},
624 {'e', '!', 0xe8},
Bram Moolenaar41193092019-08-24 21:53:31 +0200625 {'e', '`', 0xe8}, // è Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000626 {'e', '\'', 0xe9},
627 {'e', '>', 0xea},
Bram Moolenaar41193092019-08-24 21:53:31 +0200628 {'e', '^', 0xea}, // ê Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000629 {'e', ':', 0xeb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200630 {'e', '"', 0xeb}, // ë Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000631 {'i', '!', 0xec},
Bram Moolenaar41193092019-08-24 21:53:31 +0200632 {'i', '`', 0xec}, // ì Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000633 {'i', '\'', 0xed},
634 {'i', '>', 0xee},
Bram Moolenaar41193092019-08-24 21:53:31 +0200635 {'i', '^', 0xee}, // î Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000636 {'i', ':', 0xef},
637 {'d', '-', 0xf0},
638 {'n', '?', 0xf1},
Bram Moolenaar41193092019-08-24 21:53:31 +0200639 {'n', '~', 0xf1}, // ñ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000640 {'o', '!', 0xf2},
Bram Moolenaar41193092019-08-24 21:53:31 +0200641 {'o', '`', 0xf2}, // ò Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000642 {'o', '\'', 0xf3},
643 {'o', '>', 0xf4},
Bram Moolenaar41193092019-08-24 21:53:31 +0200644 {'o', '^', 0xf4}, // ô Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000645 {'o', '?', 0xf5},
Bram Moolenaar41193092019-08-24 21:53:31 +0200646 {'o', '~', 0xf5}, // õ Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000647 {'o', ':', 0xf6},
648 {'-', ':', 0xf7},
649 {'o', '/', 0xf8},
650 {'u', '!', 0xf9},
Bram Moolenaar41193092019-08-24 21:53:31 +0200651 {'u', '`', 0xf9}, // ù Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000652 {'u', '\'', 0xfa},
653 {'u', '>', 0xfb},
Bram Moolenaar41193092019-08-24 21:53:31 +0200654 {'u', '^', 0xfb}, // û Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000655 {'u', ':', 0xfc},
656 {'y', '\'', 0xfd},
657 {'t', 'h', 0xfe},
658 {'y', ':', 0xff},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100659 {'y', '"', 0xff}, // x XX Vim 5.x compatible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000660
Bram Moolenaar071d4272004-06-13 20:20:40 +0000661# define USE_UNICODE_DIGRAPHS
662
663 {'A', '-', 0x0100},
664 {'a', '-', 0x0101},
665 {'A', '(', 0x0102},
666 {'a', '(', 0x0103},
667 {'A', ';', 0x0104},
668 {'a', ';', 0x0105},
669 {'C', '\'', 0x0106},
670 {'c', '\'', 0x0107},
671 {'C', '>', 0x0108},
672 {'c', '>', 0x0109},
673 {'C', '.', 0x010a},
674 {'c', '.', 0x010b},
675 {'C', '<', 0x010c},
676 {'c', '<', 0x010d},
677 {'D', '<', 0x010e},
678 {'d', '<', 0x010f},
679 {'D', '/', 0x0110},
680 {'d', '/', 0x0111},
681 {'E', '-', 0x0112},
682 {'e', '-', 0x0113},
683 {'E', '(', 0x0114},
684 {'e', '(', 0x0115},
685 {'E', '.', 0x0116},
686 {'e', '.', 0x0117},
687 {'E', ';', 0x0118},
688 {'e', ';', 0x0119},
689 {'E', '<', 0x011a},
690 {'e', '<', 0x011b},
691 {'G', '>', 0x011c},
692 {'g', '>', 0x011d},
693 {'G', '(', 0x011e},
694 {'g', '(', 0x011f},
695 {'G', '.', 0x0120},
696 {'g', '.', 0x0121},
697 {'G', ',', 0x0122},
698 {'g', ',', 0x0123},
699 {'H', '>', 0x0124},
700 {'h', '>', 0x0125},
701 {'H', '/', 0x0126},
702 {'h', '/', 0x0127},
703 {'I', '?', 0x0128},
704 {'i', '?', 0x0129},
705 {'I', '-', 0x012a},
706 {'i', '-', 0x012b},
707 {'I', '(', 0x012c},
708 {'i', '(', 0x012d},
709 {'I', ';', 0x012e},
710 {'i', ';', 0x012f},
711 {'I', '.', 0x0130},
712 {'i', '.', 0x0131},
713 {'I', 'J', 0x0132},
714 {'i', 'j', 0x0133},
715 {'J', '>', 0x0134},
716 {'j', '>', 0x0135},
717 {'K', ',', 0x0136},
718 {'k', ',', 0x0137},
719 {'k', 'k', 0x0138},
720 {'L', '\'', 0x0139},
721 {'l', '\'', 0x013a},
722 {'L', ',', 0x013b},
723 {'l', ',', 0x013c},
724 {'L', '<', 0x013d},
725 {'l', '<', 0x013e},
726 {'L', '.', 0x013f},
727 {'l', '.', 0x0140},
728 {'L', '/', 0x0141},
729 {'l', '/', 0x0142},
730 {'N', '\'', 0x0143},
731 {'n', '\'', 0x0144},
732 {'N', ',', 0x0145},
733 {'n', ',', 0x0146},
734 {'N', '<', 0x0147},
735 {'n', '<', 0x0148},
736 {'\'', 'n', 0x0149},
737 {'N', 'G', 0x014a},
738 {'n', 'g', 0x014b},
739 {'O', '-', 0x014c},
740 {'o', '-', 0x014d},
741 {'O', '(', 0x014e},
742 {'o', '(', 0x014f},
743 {'O', '"', 0x0150},
744 {'o', '"', 0x0151},
745 {'O', 'E', 0x0152},
746 {'o', 'e', 0x0153},
747 {'R', '\'', 0x0154},
748 {'r', '\'', 0x0155},
749 {'R', ',', 0x0156},
750 {'r', ',', 0x0157},
751 {'R', '<', 0x0158},
752 {'r', '<', 0x0159},
753 {'S', '\'', 0x015a},
754 {'s', '\'', 0x015b},
755 {'S', '>', 0x015c},
756 {'s', '>', 0x015d},
757 {'S', ',', 0x015e},
758 {'s', ',', 0x015f},
759 {'S', '<', 0x0160},
760 {'s', '<', 0x0161},
761 {'T', ',', 0x0162},
762 {'t', ',', 0x0163},
763 {'T', '<', 0x0164},
764 {'t', '<', 0x0165},
765 {'T', '/', 0x0166},
766 {'t', '/', 0x0167},
767 {'U', '?', 0x0168},
768 {'u', '?', 0x0169},
769 {'U', '-', 0x016a},
770 {'u', '-', 0x016b},
771 {'U', '(', 0x016c},
772 {'u', '(', 0x016d},
773 {'U', '0', 0x016e},
774 {'u', '0', 0x016f},
775 {'U', '"', 0x0170},
776 {'u', '"', 0x0171},
777 {'U', ';', 0x0172},
778 {'u', ';', 0x0173},
779 {'W', '>', 0x0174},
780 {'w', '>', 0x0175},
781 {'Y', '>', 0x0176},
782 {'y', '>', 0x0177},
783 {'Y', ':', 0x0178},
784 {'Z', '\'', 0x0179},
785 {'z', '\'', 0x017a},
786 {'Z', '.', 0x017b},
787 {'z', '.', 0x017c},
788 {'Z', '<', 0x017d},
789 {'z', '<', 0x017e},
790 {'O', '9', 0x01a0},
791 {'o', '9', 0x01a1},
792 {'O', 'I', 0x01a2},
793 {'o', 'i', 0x01a3},
794 {'y', 'r', 0x01a6},
795 {'U', '9', 0x01af},
796 {'u', '9', 0x01b0},
797 {'Z', '/', 0x01b5},
798 {'z', '/', 0x01b6},
799 {'E', 'D', 0x01b7},
800 {'A', '<', 0x01cd},
801 {'a', '<', 0x01ce},
802 {'I', '<', 0x01cf},
803 {'i', '<', 0x01d0},
804 {'O', '<', 0x01d1},
805 {'o', '<', 0x01d2},
806 {'U', '<', 0x01d3},
807 {'u', '<', 0x01d4},
808 {'A', '1', 0x01de},
809 {'a', '1', 0x01df},
810 {'A', '7', 0x01e0},
811 {'a', '7', 0x01e1},
812 {'A', '3', 0x01e2},
813 {'a', '3', 0x01e3},
814 {'G', '/', 0x01e4},
815 {'g', '/', 0x01e5},
816 {'G', '<', 0x01e6},
817 {'g', '<', 0x01e7},
818 {'K', '<', 0x01e8},
819 {'k', '<', 0x01e9},
820 {'O', ';', 0x01ea},
821 {'o', ';', 0x01eb},
822 {'O', '1', 0x01ec},
823 {'o', '1', 0x01ed},
824 {'E', 'Z', 0x01ee},
825 {'e', 'z', 0x01ef},
826 {'j', '<', 0x01f0},
827 {'G', '\'', 0x01f4},
828 {'g', '\'', 0x01f5},
829 {';', 'S', 0x02bf},
830 {'\'', '<', 0x02c7},
831 {'\'', '(', 0x02d8},
832 {'\'', '.', 0x02d9},
833 {'\'', '0', 0x02da},
834 {'\'', ';', 0x02db},
835 {'\'', '"', 0x02dd},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100836#define DG_START_GREEK 0x0386
Bram Moolenaar071d4272004-06-13 20:20:40 +0000837 {'A', '%', 0x0386},
838 {'E', '%', 0x0388},
839 {'Y', '%', 0x0389},
840 {'I', '%', 0x038a},
841 {'O', '%', 0x038c},
842 {'U', '%', 0x038e},
843 {'W', '%', 0x038f},
844 {'i', '3', 0x0390},
845 {'A', '*', 0x0391},
846 {'B', '*', 0x0392},
847 {'G', '*', 0x0393},
848 {'D', '*', 0x0394},
849 {'E', '*', 0x0395},
850 {'Z', '*', 0x0396},
851 {'Y', '*', 0x0397},
852 {'H', '*', 0x0398},
853 {'I', '*', 0x0399},
854 {'K', '*', 0x039a},
855 {'L', '*', 0x039b},
856 {'M', '*', 0x039c},
857 {'N', '*', 0x039d},
858 {'C', '*', 0x039e},
859 {'O', '*', 0x039f},
860 {'P', '*', 0x03a0},
861 {'R', '*', 0x03a1},
862 {'S', '*', 0x03a3},
863 {'T', '*', 0x03a4},
864 {'U', '*', 0x03a5},
865 {'F', '*', 0x03a6},
866 {'X', '*', 0x03a7},
867 {'Q', '*', 0x03a8},
868 {'W', '*', 0x03a9},
869 {'J', '*', 0x03aa},
870 {'V', '*', 0x03ab},
871 {'a', '%', 0x03ac},
872 {'e', '%', 0x03ad},
873 {'y', '%', 0x03ae},
874 {'i', '%', 0x03af},
875 {'u', '3', 0x03b0},
876 {'a', '*', 0x03b1},
877 {'b', '*', 0x03b2},
878 {'g', '*', 0x03b3},
879 {'d', '*', 0x03b4},
880 {'e', '*', 0x03b5},
881 {'z', '*', 0x03b6},
882 {'y', '*', 0x03b7},
883 {'h', '*', 0x03b8},
884 {'i', '*', 0x03b9},
885 {'k', '*', 0x03ba},
886 {'l', '*', 0x03bb},
887 {'m', '*', 0x03bc},
888 {'n', '*', 0x03bd},
889 {'c', '*', 0x03be},
890 {'o', '*', 0x03bf},
891 {'p', '*', 0x03c0},
892 {'r', '*', 0x03c1},
893 {'*', 's', 0x03c2},
894 {'s', '*', 0x03c3},
895 {'t', '*', 0x03c4},
896 {'u', '*', 0x03c5},
897 {'f', '*', 0x03c6},
898 {'x', '*', 0x03c7},
899 {'q', '*', 0x03c8},
900 {'w', '*', 0x03c9},
901 {'j', '*', 0x03ca},
902 {'v', '*', 0x03cb},
903 {'o', '%', 0x03cc},
904 {'u', '%', 0x03cd},
905 {'w', '%', 0x03ce},
906 {'\'', 'G', 0x03d8},
907 {',', 'G', 0x03d9},
908 {'T', '3', 0x03da},
909 {'t', '3', 0x03db},
910 {'M', '3', 0x03dc},
911 {'m', '3', 0x03dd},
912 {'K', '3', 0x03de},
913 {'k', '3', 0x03df},
914 {'P', '3', 0x03e0},
915 {'p', '3', 0x03e1},
916 {'\'', '%', 0x03f4},
917 {'j', '3', 0x03f5},
Bram Moolenaareae8ae12018-12-14 18:53:02 +0100918#define DG_START_CYRILLIC 0x0401
Bram Moolenaar071d4272004-06-13 20:20:40 +0000919 {'I', 'O', 0x0401},
920 {'D', '%', 0x0402},
921 {'G', '%', 0x0403},
922 {'I', 'E', 0x0404},
923 {'D', 'S', 0x0405},
924 {'I', 'I', 0x0406},
925 {'Y', 'I', 0x0407},
926 {'J', '%', 0x0408},
927 {'L', 'J', 0x0409},
928 {'N', 'J', 0x040a},
929 {'T', 's', 0x040b},
930 {'K', 'J', 0x040c},
931 {'V', '%', 0x040e},
932 {'D', 'Z', 0x040f},
933 {'A', '=', 0x0410},
934 {'B', '=', 0x0411},
935 {'V', '=', 0x0412},
936 {'G', '=', 0x0413},
937 {'D', '=', 0x0414},
938 {'E', '=', 0x0415},
939 {'Z', '%', 0x0416},
940 {'Z', '=', 0x0417},
941 {'I', '=', 0x0418},
942 {'J', '=', 0x0419},
943 {'K', '=', 0x041a},
944 {'L', '=', 0x041b},
945 {'M', '=', 0x041c},
946 {'N', '=', 0x041d},
947 {'O', '=', 0x041e},
948 {'P', '=', 0x041f},
949 {'R', '=', 0x0420},
950 {'S', '=', 0x0421},
951 {'T', '=', 0x0422},
952 {'U', '=', 0x0423},
953 {'F', '=', 0x0424},
954 {'H', '=', 0x0425},
955 {'C', '=', 0x0426},
956 {'C', '%', 0x0427},
957 {'S', '%', 0x0428},
958 {'S', 'c', 0x0429},
959 {'=', '"', 0x042a},
960 {'Y', '=', 0x042b},
961 {'%', '"', 0x042c},
962 {'J', 'E', 0x042d},
963 {'J', 'U', 0x042e},
964 {'J', 'A', 0x042f},
965 {'a', '=', 0x0430},
966 {'b', '=', 0x0431},
967 {'v', '=', 0x0432},
968 {'g', '=', 0x0433},
969 {'d', '=', 0x0434},
970 {'e', '=', 0x0435},
971 {'z', '%', 0x0436},
972 {'z', '=', 0x0437},
973 {'i', '=', 0x0438},
974 {'j', '=', 0x0439},
975 {'k', '=', 0x043a},
976 {'l', '=', 0x043b},
977 {'m', '=', 0x043c},
978 {'n', '=', 0x043d},
979 {'o', '=', 0x043e},
980 {'p', '=', 0x043f},
981 {'r', '=', 0x0440},
982 {'s', '=', 0x0441},
983 {'t', '=', 0x0442},
984 {'u', '=', 0x0443},
985 {'f', '=', 0x0444},
986 {'h', '=', 0x0445},
987 {'c', '=', 0x0446},
988 {'c', '%', 0x0447},
989 {'s', '%', 0x0448},
990 {'s', 'c', 0x0449},
991 {'=', '\'', 0x044a},
992 {'y', '=', 0x044b},
993 {'%', '\'', 0x044c},
994 {'j', 'e', 0x044d},
995 {'j', 'u', 0x044e},
996 {'j', 'a', 0x044f},
997 {'i', 'o', 0x0451},
998 {'d', '%', 0x0452},
999 {'g', '%', 0x0453},
1000 {'i', 'e', 0x0454},
1001 {'d', 's', 0x0455},
1002 {'i', 'i', 0x0456},
1003 {'y', 'i', 0x0457},
1004 {'j', '%', 0x0458},
1005 {'l', 'j', 0x0459},
1006 {'n', 'j', 0x045a},
1007 {'t', 's', 0x045b},
1008 {'k', 'j', 0x045c},
1009 {'v', '%', 0x045e},
1010 {'d', 'z', 0x045f},
1011 {'Y', '3', 0x0462},
1012 {'y', '3', 0x0463},
1013 {'O', '3', 0x046a},
1014 {'o', '3', 0x046b},
1015 {'F', '3', 0x0472},
1016 {'f', '3', 0x0473},
1017 {'V', '3', 0x0474},
1018 {'v', '3', 0x0475},
1019 {'C', '3', 0x0480},
1020 {'c', '3', 0x0481},
1021 {'G', '3', 0x0490},
1022 {'g', '3', 0x0491},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001023#define DG_START_HEBREW 0x05d0
Bram Moolenaar071d4272004-06-13 20:20:40 +00001024 {'A', '+', 0x05d0},
1025 {'B', '+', 0x05d1},
1026 {'G', '+', 0x05d2},
1027 {'D', '+', 0x05d3},
1028 {'H', '+', 0x05d4},
1029 {'W', '+', 0x05d5},
1030 {'Z', '+', 0x05d6},
1031 {'X', '+', 0x05d7},
1032 {'T', 'j', 0x05d8},
1033 {'J', '+', 0x05d9},
1034 {'K', '%', 0x05da},
1035 {'K', '+', 0x05db},
1036 {'L', '+', 0x05dc},
1037 {'M', '%', 0x05dd},
1038 {'M', '+', 0x05de},
1039 {'N', '%', 0x05df},
1040 {'N', '+', 0x05e0},
1041 {'S', '+', 0x05e1},
1042 {'E', '+', 0x05e2},
1043 {'P', '%', 0x05e3},
1044 {'P', '+', 0x05e4},
1045 {'Z', 'j', 0x05e5},
1046 {'Z', 'J', 0x05e6},
1047 {'Q', '+', 0x05e7},
1048 {'R', '+', 0x05e8},
1049 {'S', 'h', 0x05e9},
1050 {'T', '+', 0x05ea},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001051#define DG_START_ARABIC 0x060c
Bram Moolenaar071d4272004-06-13 20:20:40 +00001052 {',', '+', 0x060c},
1053 {';', '+', 0x061b},
1054 {'?', '+', 0x061f},
1055 {'H', '\'', 0x0621},
1056 {'a', 'M', 0x0622},
1057 {'a', 'H', 0x0623},
1058 {'w', 'H', 0x0624},
1059 {'a', 'h', 0x0625},
1060 {'y', 'H', 0x0626},
1061 {'a', '+', 0x0627},
1062 {'b', '+', 0x0628},
1063 {'t', 'm', 0x0629},
1064 {'t', '+', 0x062a},
1065 {'t', 'k', 0x062b},
1066 {'g', '+', 0x062c},
1067 {'h', 'k', 0x062d},
1068 {'x', '+', 0x062e},
1069 {'d', '+', 0x062f},
1070 {'d', 'k', 0x0630},
1071 {'r', '+', 0x0631},
1072 {'z', '+', 0x0632},
1073 {'s', '+', 0x0633},
1074 {'s', 'n', 0x0634},
1075 {'c', '+', 0x0635},
1076 {'d', 'd', 0x0636},
1077 {'t', 'j', 0x0637},
1078 {'z', 'H', 0x0638},
1079 {'e', '+', 0x0639},
1080 {'i', '+', 0x063a},
1081 {'+', '+', 0x0640},
1082 {'f', '+', 0x0641},
1083 {'q', '+', 0x0642},
1084 {'k', '+', 0x0643},
1085 {'l', '+', 0x0644},
1086 {'m', '+', 0x0645},
1087 {'n', '+', 0x0646},
1088 {'h', '+', 0x0647},
1089 {'w', '+', 0x0648},
1090 {'j', '+', 0x0649},
1091 {'y', '+', 0x064a},
1092 {':', '+', 0x064b},
1093 {'"', '+', 0x064c},
1094 {'=', '+', 0x064d},
1095 {'/', '+', 0x064e},
1096 {'\'', '+', 0x064f},
1097 {'1', '+', 0x0650},
1098 {'3', '+', 0x0651},
1099 {'0', '+', 0x0652},
1100 {'a', 'S', 0x0670},
1101 {'p', '+', 0x067e},
1102 {'v', '+', 0x06a4},
1103 {'g', 'f', 0x06af},
1104 {'0', 'a', 0x06f0},
1105 {'1', 'a', 0x06f1},
1106 {'2', 'a', 0x06f2},
1107 {'3', 'a', 0x06f3},
1108 {'4', 'a', 0x06f4},
1109 {'5', 'a', 0x06f5},
1110 {'6', 'a', 0x06f6},
1111 {'7', 'a', 0x06f7},
1112 {'8', 'a', 0x06f8},
1113 {'9', 'a', 0x06f9},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001114#define DG_START_LATIN_EXTENDED 0x1e02
Bram Moolenaar071d4272004-06-13 20:20:40 +00001115 {'B', '.', 0x1e02},
1116 {'b', '.', 0x1e03},
1117 {'B', '_', 0x1e06},
1118 {'b', '_', 0x1e07},
1119 {'D', '.', 0x1e0a},
1120 {'d', '.', 0x1e0b},
1121 {'D', '_', 0x1e0e},
1122 {'d', '_', 0x1e0f},
1123 {'D', ',', 0x1e10},
1124 {'d', ',', 0x1e11},
1125 {'F', '.', 0x1e1e},
1126 {'f', '.', 0x1e1f},
1127 {'G', '-', 0x1e20},
1128 {'g', '-', 0x1e21},
1129 {'H', '.', 0x1e22},
1130 {'h', '.', 0x1e23},
1131 {'H', ':', 0x1e26},
1132 {'h', ':', 0x1e27},
1133 {'H', ',', 0x1e28},
1134 {'h', ',', 0x1e29},
1135 {'K', '\'', 0x1e30},
1136 {'k', '\'', 0x1e31},
1137 {'K', '_', 0x1e34},
1138 {'k', '_', 0x1e35},
1139 {'L', '_', 0x1e3a},
1140 {'l', '_', 0x1e3b},
1141 {'M', '\'', 0x1e3e},
1142 {'m', '\'', 0x1e3f},
1143 {'M', '.', 0x1e40},
1144 {'m', '.', 0x1e41},
1145 {'N', '.', 0x1e44},
1146 {'n', '.', 0x1e45},
1147 {'N', '_', 0x1e48},
1148 {'n', '_', 0x1e49},
1149 {'P', '\'', 0x1e54},
1150 {'p', '\'', 0x1e55},
1151 {'P', '.', 0x1e56},
1152 {'p', '.', 0x1e57},
1153 {'R', '.', 0x1e58},
1154 {'r', '.', 0x1e59},
1155 {'R', '_', 0x1e5e},
1156 {'r', '_', 0x1e5f},
1157 {'S', '.', 0x1e60},
1158 {'s', '.', 0x1e61},
1159 {'T', '.', 0x1e6a},
1160 {'t', '.', 0x1e6b},
1161 {'T', '_', 0x1e6e},
1162 {'t', '_', 0x1e6f},
1163 {'V', '?', 0x1e7c},
1164 {'v', '?', 0x1e7d},
1165 {'W', '!', 0x1e80},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001166 {'W', '`', 0x1e80}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +00001167 {'w', '!', 0x1e81},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001168 {'w', '`', 0x1e81}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +00001169 {'W', '\'', 0x1e82},
1170 {'w', '\'', 0x1e83},
1171 {'W', ':', 0x1e84},
1172 {'w', ':', 0x1e85},
1173 {'W', '.', 0x1e86},
1174 {'w', '.', 0x1e87},
1175 {'X', '.', 0x1e8a},
1176 {'x', '.', 0x1e8b},
1177 {'X', ':', 0x1e8c},
1178 {'x', ':', 0x1e8d},
1179 {'Y', '.', 0x1e8e},
1180 {'y', '.', 0x1e8f},
1181 {'Z', '>', 0x1e90},
1182 {'z', '>', 0x1e91},
1183 {'Z', '_', 0x1e94},
1184 {'z', '_', 0x1e95},
1185 {'h', '_', 0x1e96},
1186 {'t', ':', 0x1e97},
1187 {'w', '0', 0x1e98},
1188 {'y', '0', 0x1e99},
1189 {'A', '2', 0x1ea2},
1190 {'a', '2', 0x1ea3},
1191 {'E', '2', 0x1eba},
1192 {'e', '2', 0x1ebb},
1193 {'E', '?', 0x1ebc},
1194 {'e', '?', 0x1ebd},
1195 {'I', '2', 0x1ec8},
1196 {'i', '2', 0x1ec9},
1197 {'O', '2', 0x1ece},
1198 {'o', '2', 0x1ecf},
1199 {'U', '2', 0x1ee6},
1200 {'u', '2', 0x1ee7},
1201 {'Y', '!', 0x1ef2},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001202 {'Y', '`', 0x1ef2}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +00001203 {'y', '!', 0x1ef3},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001204 {'y', '`', 0x1ef3}, // extra alternative, easier to remember
Bram Moolenaar071d4272004-06-13 20:20:40 +00001205 {'Y', '2', 0x1ef6},
1206 {'y', '2', 0x1ef7},
1207 {'Y', '?', 0x1ef8},
1208 {'y', '?', 0x1ef9},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001209#define DG_START_GREEK_EXTENDED 0x1f00
Bram Moolenaar071d4272004-06-13 20:20:40 +00001210 {';', '\'', 0x1f00},
1211 {',', '\'', 0x1f01},
1212 {';', '!', 0x1f02},
1213 {',', '!', 0x1f03},
1214 {'?', ';', 0x1f04},
1215 {'?', ',', 0x1f05},
1216 {'!', ':', 0x1f06},
1217 {'?', ':', 0x1f07},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001218#define DG_START_PUNCTUATION 0x2002
Bram Moolenaar071d4272004-06-13 20:20:40 +00001219 {'1', 'N', 0x2002},
1220 {'1', 'M', 0x2003},
1221 {'3', 'M', 0x2004},
1222 {'4', 'M', 0x2005},
1223 {'6', 'M', 0x2006},
1224 {'1', 'T', 0x2009},
1225 {'1', 'H', 0x200a},
1226 {'-', '1', 0x2010},
1227 {'-', 'N', 0x2013},
1228 {'-', 'M', 0x2014},
1229 {'-', '3', 0x2015},
1230 {'!', '2', 0x2016},
1231 {'=', '2', 0x2017},
1232 {'\'', '6', 0x2018},
1233 {'\'', '9', 0x2019},
1234 {'.', '9', 0x201a},
1235 {'9', '\'', 0x201b},
1236 {'"', '6', 0x201c},
1237 {'"', '9', 0x201d},
1238 {':', '9', 0x201e},
1239 {'9', '"', 0x201f},
1240 {'/', '-', 0x2020},
1241 {'/', '=', 0x2021},
1242 {'.', '.', 0x2025},
Bram Moolenaar81615512016-11-04 22:17:16 +01001243 {',', '.', 0x2026},
Bram Moolenaar071d4272004-06-13 20:20:40 +00001244 {'%', '0', 0x2030},
1245 {'1', '\'', 0x2032},
1246 {'2', '\'', 0x2033},
1247 {'3', '\'', 0x2034},
1248 {'1', '"', 0x2035},
1249 {'2', '"', 0x2036},
1250 {'3', '"', 0x2037},
1251 {'C', 'a', 0x2038},
1252 {'<', '1', 0x2039},
1253 {'>', '1', 0x203a},
1254 {':', 'X', 0x203b},
1255 {'\'', '-', 0x203e},
1256 {'/', 'f', 0x2044},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001257#define DG_START_SUB_SUPER 0x2070
Bram Moolenaar071d4272004-06-13 20:20:40 +00001258 {'0', 'S', 0x2070},
1259 {'4', 'S', 0x2074},
1260 {'5', 'S', 0x2075},
1261 {'6', 'S', 0x2076},
1262 {'7', 'S', 0x2077},
1263 {'8', 'S', 0x2078},
1264 {'9', 'S', 0x2079},
1265 {'+', 'S', 0x207a},
1266 {'-', 'S', 0x207b},
1267 {'=', 'S', 0x207c},
1268 {'(', 'S', 0x207d},
1269 {')', 'S', 0x207e},
1270 {'n', 'S', 0x207f},
1271 {'0', 's', 0x2080},
1272 {'1', 's', 0x2081},
1273 {'2', 's', 0x2082},
1274 {'3', 's', 0x2083},
1275 {'4', 's', 0x2084},
1276 {'5', 's', 0x2085},
1277 {'6', 's', 0x2086},
1278 {'7', 's', 0x2087},
1279 {'8', 's', 0x2088},
1280 {'9', 's', 0x2089},
1281 {'+', 's', 0x208a},
1282 {'-', 's', 0x208b},
1283 {'=', 's', 0x208c},
1284 {'(', 's', 0x208d},
1285 {')', 's', 0x208e},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001286#define DG_START_CURRENCY 0x20a4
Bram Moolenaar071d4272004-06-13 20:20:40 +00001287 {'L', 'i', 0x20a4},
1288 {'P', 't', 0x20a7},
1289 {'W', '=', 0x20a9},
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001290 {'=', 'e', 0x20ac}, /* euro */
Bram Moolenaarf75a9632005-09-13 21:20:47 +00001291 {'E', 'u', 0x20ac}, /* euro */
Bram Moolenaare8d1f202014-06-18 21:38:18 +02001292 {'=', 'R', 0x20bd}, /* rouble */
1293 {'=', 'P', 0x20bd}, /* rouble */
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001294#define DG_START_OTHER1 0x2103
Bram Moolenaar071d4272004-06-13 20:20:40 +00001295 {'o', 'C', 0x2103},
1296 {'c', 'o', 0x2105},
1297 {'o', 'F', 0x2109},
1298 {'N', '0', 0x2116},
1299 {'P', 'O', 0x2117},
1300 {'R', 'x', 0x211e},
1301 {'S', 'M', 0x2120},
1302 {'T', 'M', 0x2122},
1303 {'O', 'm', 0x2126},
1304 {'A', 'O', 0x212b},
1305 {'1', '3', 0x2153},
1306 {'2', '3', 0x2154},
1307 {'1', '5', 0x2155},
1308 {'2', '5', 0x2156},
1309 {'3', '5', 0x2157},
1310 {'4', '5', 0x2158},
1311 {'1', '6', 0x2159},
1312 {'5', '6', 0x215a},
1313 {'1', '8', 0x215b},
1314 {'3', '8', 0x215c},
1315 {'5', '8', 0x215d},
1316 {'7', '8', 0x215e},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001317#define DG_START_ROMAN 0x2160
Bram Moolenaar071d4272004-06-13 20:20:40 +00001318 {'1', 'R', 0x2160},
1319 {'2', 'R', 0x2161},
1320 {'3', 'R', 0x2162},
1321 {'4', 'R', 0x2163},
1322 {'5', 'R', 0x2164},
1323 {'6', 'R', 0x2165},
1324 {'7', 'R', 0x2166},
1325 {'8', 'R', 0x2167},
1326 {'9', 'R', 0x2168},
1327 {'a', 'R', 0x2169},
1328 {'b', 'R', 0x216a},
1329 {'c', 'R', 0x216b},
1330 {'1', 'r', 0x2170},
1331 {'2', 'r', 0x2171},
1332 {'3', 'r', 0x2172},
1333 {'4', 'r', 0x2173},
1334 {'5', 'r', 0x2174},
1335 {'6', 'r', 0x2175},
1336 {'7', 'r', 0x2176},
1337 {'8', 'r', 0x2177},
1338 {'9', 'r', 0x2178},
1339 {'a', 'r', 0x2179},
1340 {'b', 'r', 0x217a},
1341 {'c', 'r', 0x217b},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001342#define DG_START_ARROWS 0x2190
Bram Moolenaar071d4272004-06-13 20:20:40 +00001343 {'<', '-', 0x2190},
1344 {'-', '!', 0x2191},
1345 {'-', '>', 0x2192},
1346 {'-', 'v', 0x2193},
1347 {'<', '>', 0x2194},
1348 {'U', 'D', 0x2195},
1349 {'<', '=', 0x21d0},
1350 {'=', '>', 0x21d2},
1351 {'=', '=', 0x21d4},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001352#define DG_START_MATH 0x2200
Bram Moolenaar071d4272004-06-13 20:20:40 +00001353 {'F', 'A', 0x2200},
1354 {'d', 'P', 0x2202},
1355 {'T', 'E', 0x2203},
1356 {'/', '0', 0x2205},
1357 {'D', 'E', 0x2206},
1358 {'N', 'B', 0x2207},
1359 {'(', '-', 0x2208},
1360 {'-', ')', 0x220b},
1361 {'*', 'P', 0x220f},
1362 {'+', 'Z', 0x2211},
1363 {'-', '2', 0x2212},
1364 {'-', '+', 0x2213},
1365 {'*', '-', 0x2217},
1366 {'O', 'b', 0x2218},
1367 {'S', 'b', 0x2219},
1368 {'R', 'T', 0x221a},
1369 {'0', '(', 0x221d},
1370 {'0', '0', 0x221e},
1371 {'-', 'L', 0x221f},
1372 {'-', 'V', 0x2220},
1373 {'P', 'P', 0x2225},
1374 {'A', 'N', 0x2227},
1375 {'O', 'R', 0x2228},
1376 {'(', 'U', 0x2229},
1377 {')', 'U', 0x222a},
1378 {'I', 'n', 0x222b},
1379 {'D', 'I', 0x222c},
1380 {'I', 'o', 0x222e},
1381 {'.', ':', 0x2234},
1382 {':', '.', 0x2235},
1383 {':', 'R', 0x2236},
1384 {':', ':', 0x2237},
1385 {'?', '1', 0x223c},
1386 {'C', 'G', 0x223e},
1387 {'?', '-', 0x2243},
1388 {'?', '=', 0x2245},
1389 {'?', '2', 0x2248},
1390 {'=', '?', 0x224c},
1391 {'H', 'I', 0x2253},
1392 {'!', '=', 0x2260},
1393 {'=', '3', 0x2261},
1394 {'=', '<', 0x2264},
1395 {'>', '=', 0x2265},
1396 {'<', '*', 0x226a},
1397 {'*', '>', 0x226b},
1398 {'!', '<', 0x226e},
1399 {'!', '>', 0x226f},
1400 {'(', 'C', 0x2282},
1401 {')', 'C', 0x2283},
1402 {'(', '_', 0x2286},
1403 {')', '_', 0x2287},
1404 {'0', '.', 0x2299},
1405 {'0', '2', 0x229a},
1406 {'-', 'T', 0x22a5},
1407 {'.', 'P', 0x22c5},
1408 {':', '3', 0x22ee},
1409 {'.', '3', 0x22ef},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001410#define DG_START_TECHNICAL 0x2302
Bram Moolenaar071d4272004-06-13 20:20:40 +00001411 {'E', 'h', 0x2302},
1412 {'<', '7', 0x2308},
1413 {'>', '7', 0x2309},
1414 {'7', '<', 0x230a},
1415 {'7', '>', 0x230b},
1416 {'N', 'I', 0x2310},
1417 {'(', 'A', 0x2312},
1418 {'T', 'R', 0x2315},
1419 {'I', 'u', 0x2320},
1420 {'I', 'l', 0x2321},
1421 {'<', '/', 0x2329},
1422 {'/', '>', 0x232a},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001423#define DG_START_OTHER2 0x2423
Bram Moolenaar071d4272004-06-13 20:20:40 +00001424 {'V', 's', 0x2423},
1425 {'1', 'h', 0x2440},
1426 {'3', 'h', 0x2441},
1427 {'2', 'h', 0x2442},
1428 {'4', 'h', 0x2443},
1429 {'1', 'j', 0x2446},
1430 {'2', 'j', 0x2447},
1431 {'3', 'j', 0x2448},
1432 {'4', 'j', 0x2449},
1433 {'1', '.', 0x2488},
1434 {'2', '.', 0x2489},
1435 {'3', '.', 0x248a},
1436 {'4', '.', 0x248b},
1437 {'5', '.', 0x248c},
1438 {'6', '.', 0x248d},
1439 {'7', '.', 0x248e},
1440 {'8', '.', 0x248f},
1441 {'9', '.', 0x2490},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001442#define DG_START_DRAWING 0x2500
Bram Moolenaar071d4272004-06-13 20:20:40 +00001443 {'h', 'h', 0x2500},
1444 {'H', 'H', 0x2501},
1445 {'v', 'v', 0x2502},
1446 {'V', 'V', 0x2503},
1447 {'3', '-', 0x2504},
1448 {'3', '_', 0x2505},
1449 {'3', '!', 0x2506},
1450 {'3', '/', 0x2507},
1451 {'4', '-', 0x2508},
1452 {'4', '_', 0x2509},
1453 {'4', '!', 0x250a},
1454 {'4', '/', 0x250b},
1455 {'d', 'r', 0x250c},
1456 {'d', 'R', 0x250d},
1457 {'D', 'r', 0x250e},
1458 {'D', 'R', 0x250f},
1459 {'d', 'l', 0x2510},
1460 {'d', 'L', 0x2511},
1461 {'D', 'l', 0x2512},
1462 {'L', 'D', 0x2513},
1463 {'u', 'r', 0x2514},
1464 {'u', 'R', 0x2515},
1465 {'U', 'r', 0x2516},
1466 {'U', 'R', 0x2517},
1467 {'u', 'l', 0x2518},
1468 {'u', 'L', 0x2519},
1469 {'U', 'l', 0x251a},
1470 {'U', 'L', 0x251b},
1471 {'v', 'r', 0x251c},
1472 {'v', 'R', 0x251d},
1473 {'V', 'r', 0x2520},
1474 {'V', 'R', 0x2523},
1475 {'v', 'l', 0x2524},
1476 {'v', 'L', 0x2525},
1477 {'V', 'l', 0x2528},
1478 {'V', 'L', 0x252b},
1479 {'d', 'h', 0x252c},
1480 {'d', 'H', 0x252f},
1481 {'D', 'h', 0x2530},
1482 {'D', 'H', 0x2533},
1483 {'u', 'h', 0x2534},
1484 {'u', 'H', 0x2537},
1485 {'U', 'h', 0x2538},
1486 {'U', 'H', 0x253b},
1487 {'v', 'h', 0x253c},
1488 {'v', 'H', 0x253f},
1489 {'V', 'h', 0x2542},
1490 {'V', 'H', 0x254b},
1491 {'F', 'D', 0x2571},
1492 {'B', 'D', 0x2572},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001493#define DG_START_BLOCK 0x2580
Bram Moolenaar071d4272004-06-13 20:20:40 +00001494 {'T', 'B', 0x2580},
1495 {'L', 'B', 0x2584},
1496 {'F', 'B', 0x2588},
1497 {'l', 'B', 0x258c},
1498 {'R', 'B', 0x2590},
1499 {'.', 'S', 0x2591},
1500 {':', 'S', 0x2592},
1501 {'?', 'S', 0x2593},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001502#define DG_START_SHAPES 0x25a0
Bram Moolenaar071d4272004-06-13 20:20:40 +00001503 {'f', 'S', 0x25a0},
1504 {'O', 'S', 0x25a1},
1505 {'R', 'O', 0x25a2},
1506 {'R', 'r', 0x25a3},
1507 {'R', 'F', 0x25a4},
1508 {'R', 'Y', 0x25a5},
1509 {'R', 'H', 0x25a6},
1510 {'R', 'Z', 0x25a7},
1511 {'R', 'K', 0x25a8},
1512 {'R', 'X', 0x25a9},
1513 {'s', 'B', 0x25aa},
1514 {'S', 'R', 0x25ac},
1515 {'O', 'r', 0x25ad},
1516 {'U', 'T', 0x25b2},
1517 {'u', 'T', 0x25b3},
1518 {'P', 'R', 0x25b6},
1519 {'T', 'r', 0x25b7},
1520 {'D', 't', 0x25bc},
1521 {'d', 'T', 0x25bd},
1522 {'P', 'L', 0x25c0},
1523 {'T', 'l', 0x25c1},
1524 {'D', 'b', 0x25c6},
1525 {'D', 'w', 0x25c7},
1526 {'L', 'Z', 0x25ca},
1527 {'0', 'm', 0x25cb},
1528 {'0', 'o', 0x25ce},
1529 {'0', 'M', 0x25cf},
1530 {'0', 'L', 0x25d0},
1531 {'0', 'R', 0x25d1},
1532 {'S', 'n', 0x25d8},
1533 {'I', 'c', 0x25d9},
1534 {'F', 'd', 0x25e2},
1535 {'B', 'd', 0x25e3},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001536#define DG_START_SYMBOLS 0x2605
Bram Moolenaar071d4272004-06-13 20:20:40 +00001537 {'*', '2', 0x2605},
1538 {'*', '1', 0x2606},
1539 {'<', 'H', 0x261c},
1540 {'>', 'H', 0x261e},
1541 {'0', 'u', 0x263a},
1542 {'0', 'U', 0x263b},
1543 {'S', 'U', 0x263c},
1544 {'F', 'm', 0x2640},
1545 {'M', 'l', 0x2642},
1546 {'c', 'S', 0x2660},
1547 {'c', 'H', 0x2661},
1548 {'c', 'D', 0x2662},
1549 {'c', 'C', 0x2663},
1550 {'M', 'd', 0x2669},
1551 {'M', '8', 0x266a},
1552 {'M', '2', 0x266b},
1553 {'M', 'b', 0x266d},
1554 {'M', 'x', 0x266e},
1555 {'M', 'X', 0x266f},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001556#define DG_START_DINGBATS 0x2713
Bram Moolenaar071d4272004-06-13 20:20:40 +00001557 {'O', 'K', 0x2713},
1558 {'X', 'X', 0x2717},
1559 {'-', 'X', 0x2720},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001560#define DG_START_CJK_SYMBOLS 0x3000
Bram Moolenaar071d4272004-06-13 20:20:40 +00001561 {'I', 'S', 0x3000},
1562 {',', '_', 0x3001},
1563 {'.', '_', 0x3002},
1564 {'+', '"', 0x3003},
1565 {'+', '_', 0x3004},
1566 {'*', '_', 0x3005},
1567 {';', '_', 0x3006},
1568 {'0', '_', 0x3007},
1569 {'<', '+', 0x300a},
1570 {'>', '+', 0x300b},
1571 {'<', '\'', 0x300c},
1572 {'>', '\'', 0x300d},
1573 {'<', '"', 0x300e},
1574 {'>', '"', 0x300f},
1575 {'(', '"', 0x3010},
1576 {')', '"', 0x3011},
1577 {'=', 'T', 0x3012},
1578 {'=', '_', 0x3013},
1579 {'(', '\'', 0x3014},
1580 {')', '\'', 0x3015},
1581 {'(', 'I', 0x3016},
1582 {')', 'I', 0x3017},
1583 {'-', '?', 0x301c},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001584#define DG_START_HIRAGANA 0x3041
Bram Moolenaar071d4272004-06-13 20:20:40 +00001585 {'A', '5', 0x3041},
1586 {'a', '5', 0x3042},
1587 {'I', '5', 0x3043},
1588 {'i', '5', 0x3044},
1589 {'U', '5', 0x3045},
1590 {'u', '5', 0x3046},
1591 {'E', '5', 0x3047},
1592 {'e', '5', 0x3048},
1593 {'O', '5', 0x3049},
1594 {'o', '5', 0x304a},
1595 {'k', 'a', 0x304b},
1596 {'g', 'a', 0x304c},
1597 {'k', 'i', 0x304d},
1598 {'g', 'i', 0x304e},
1599 {'k', 'u', 0x304f},
1600 {'g', 'u', 0x3050},
1601 {'k', 'e', 0x3051},
1602 {'g', 'e', 0x3052},
1603 {'k', 'o', 0x3053},
1604 {'g', 'o', 0x3054},
1605 {'s', 'a', 0x3055},
1606 {'z', 'a', 0x3056},
1607 {'s', 'i', 0x3057},
1608 {'z', 'i', 0x3058},
1609 {'s', 'u', 0x3059},
1610 {'z', 'u', 0x305a},
1611 {'s', 'e', 0x305b},
1612 {'z', 'e', 0x305c},
1613 {'s', 'o', 0x305d},
1614 {'z', 'o', 0x305e},
1615 {'t', 'a', 0x305f},
1616 {'d', 'a', 0x3060},
1617 {'t', 'i', 0x3061},
1618 {'d', 'i', 0x3062},
1619 {'t', 'U', 0x3063},
1620 {'t', 'u', 0x3064},
1621 {'d', 'u', 0x3065},
1622 {'t', 'e', 0x3066},
1623 {'d', 'e', 0x3067},
1624 {'t', 'o', 0x3068},
1625 {'d', 'o', 0x3069},
1626 {'n', 'a', 0x306a},
1627 {'n', 'i', 0x306b},
1628 {'n', 'u', 0x306c},
1629 {'n', 'e', 0x306d},
1630 {'n', 'o', 0x306e},
1631 {'h', 'a', 0x306f},
1632 {'b', 'a', 0x3070},
1633 {'p', 'a', 0x3071},
1634 {'h', 'i', 0x3072},
1635 {'b', 'i', 0x3073},
1636 {'p', 'i', 0x3074},
1637 {'h', 'u', 0x3075},
1638 {'b', 'u', 0x3076},
1639 {'p', 'u', 0x3077},
1640 {'h', 'e', 0x3078},
1641 {'b', 'e', 0x3079},
1642 {'p', 'e', 0x307a},
1643 {'h', 'o', 0x307b},
1644 {'b', 'o', 0x307c},
1645 {'p', 'o', 0x307d},
1646 {'m', 'a', 0x307e},
1647 {'m', 'i', 0x307f},
1648 {'m', 'u', 0x3080},
1649 {'m', 'e', 0x3081},
1650 {'m', 'o', 0x3082},
1651 {'y', 'A', 0x3083},
1652 {'y', 'a', 0x3084},
1653 {'y', 'U', 0x3085},
1654 {'y', 'u', 0x3086},
1655 {'y', 'O', 0x3087},
1656 {'y', 'o', 0x3088},
1657 {'r', 'a', 0x3089},
1658 {'r', 'i', 0x308a},
1659 {'r', 'u', 0x308b},
1660 {'r', 'e', 0x308c},
1661 {'r', 'o', 0x308d},
1662 {'w', 'A', 0x308e},
1663 {'w', 'a', 0x308f},
1664 {'w', 'i', 0x3090},
1665 {'w', 'e', 0x3091},
1666 {'w', 'o', 0x3092},
1667 {'n', '5', 0x3093},
1668 {'v', 'u', 0x3094},
1669 {'"', '5', 0x309b},
1670 {'0', '5', 0x309c},
1671 {'*', '5', 0x309d},
1672 {'+', '5', 0x309e},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001673#define DG_START_KATAKANA 0x30a1
Bram Moolenaar071d4272004-06-13 20:20:40 +00001674 {'a', '6', 0x30a1},
1675 {'A', '6', 0x30a2},
1676 {'i', '6', 0x30a3},
1677 {'I', '6', 0x30a4},
1678 {'u', '6', 0x30a5},
1679 {'U', '6', 0x30a6},
1680 {'e', '6', 0x30a7},
1681 {'E', '6', 0x30a8},
1682 {'o', '6', 0x30a9},
1683 {'O', '6', 0x30aa},
1684 {'K', 'a', 0x30ab},
1685 {'G', 'a', 0x30ac},
1686 {'K', 'i', 0x30ad},
1687 {'G', 'i', 0x30ae},
1688 {'K', 'u', 0x30af},
1689 {'G', 'u', 0x30b0},
1690 {'K', 'e', 0x30b1},
1691 {'G', 'e', 0x30b2},
1692 {'K', 'o', 0x30b3},
1693 {'G', 'o', 0x30b4},
1694 {'S', 'a', 0x30b5},
1695 {'Z', 'a', 0x30b6},
1696 {'S', 'i', 0x30b7},
1697 {'Z', 'i', 0x30b8},
1698 {'S', 'u', 0x30b9},
1699 {'Z', 'u', 0x30ba},
1700 {'S', 'e', 0x30bb},
1701 {'Z', 'e', 0x30bc},
1702 {'S', 'o', 0x30bd},
1703 {'Z', 'o', 0x30be},
1704 {'T', 'a', 0x30bf},
1705 {'D', 'a', 0x30c0},
1706 {'T', 'i', 0x30c1},
1707 {'D', 'i', 0x30c2},
1708 {'T', 'U', 0x30c3},
1709 {'T', 'u', 0x30c4},
1710 {'D', 'u', 0x30c5},
1711 {'T', 'e', 0x30c6},
1712 {'D', 'e', 0x30c7},
1713 {'T', 'o', 0x30c8},
1714 {'D', 'o', 0x30c9},
1715 {'N', 'a', 0x30ca},
1716 {'N', 'i', 0x30cb},
1717 {'N', 'u', 0x30cc},
1718 {'N', 'e', 0x30cd},
1719 {'N', 'o', 0x30ce},
1720 {'H', 'a', 0x30cf},
1721 {'B', 'a', 0x30d0},
1722 {'P', 'a', 0x30d1},
1723 {'H', 'i', 0x30d2},
1724 {'B', 'i', 0x30d3},
1725 {'P', 'i', 0x30d4},
1726 {'H', 'u', 0x30d5},
1727 {'B', 'u', 0x30d6},
1728 {'P', 'u', 0x30d7},
1729 {'H', 'e', 0x30d8},
1730 {'B', 'e', 0x30d9},
1731 {'P', 'e', 0x30da},
1732 {'H', 'o', 0x30db},
1733 {'B', 'o', 0x30dc},
1734 {'P', 'o', 0x30dd},
1735 {'M', 'a', 0x30de},
1736 {'M', 'i', 0x30df},
1737 {'M', 'u', 0x30e0},
1738 {'M', 'e', 0x30e1},
1739 {'M', 'o', 0x30e2},
1740 {'Y', 'A', 0x30e3},
1741 {'Y', 'a', 0x30e4},
1742 {'Y', 'U', 0x30e5},
1743 {'Y', 'u', 0x30e6},
1744 {'Y', 'O', 0x30e7},
1745 {'Y', 'o', 0x30e8},
1746 {'R', 'a', 0x30e9},
1747 {'R', 'i', 0x30ea},
1748 {'R', 'u', 0x30eb},
1749 {'R', 'e', 0x30ec},
1750 {'R', 'o', 0x30ed},
1751 {'W', 'A', 0x30ee},
1752 {'W', 'a', 0x30ef},
1753 {'W', 'i', 0x30f0},
1754 {'W', 'e', 0x30f1},
1755 {'W', 'o', 0x30f2},
1756 {'N', '6', 0x30f3},
1757 {'V', 'u', 0x30f4},
1758 {'K', 'A', 0x30f5},
1759 {'K', 'E', 0x30f6},
1760 {'V', 'a', 0x30f7},
1761 {'V', 'i', 0x30f8},
1762 {'V', 'e', 0x30f9},
1763 {'V', 'o', 0x30fa},
1764 {'.', '6', 0x30fb},
1765 {'-', '6', 0x30fc},
1766 {'*', '6', 0x30fd},
1767 {'+', '6', 0x30fe},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001768#define DG_START_BOPOMOFO 0x3105
Bram Moolenaar071d4272004-06-13 20:20:40 +00001769 {'b', '4', 0x3105},
1770 {'p', '4', 0x3106},
1771 {'m', '4', 0x3107},
1772 {'f', '4', 0x3108},
1773 {'d', '4', 0x3109},
1774 {'t', '4', 0x310a},
1775 {'n', '4', 0x310b},
1776 {'l', '4', 0x310c},
1777 {'g', '4', 0x310d},
1778 {'k', '4', 0x310e},
1779 {'h', '4', 0x310f},
1780 {'j', '4', 0x3110},
1781 {'q', '4', 0x3111},
1782 {'x', '4', 0x3112},
1783 {'z', 'h', 0x3113},
1784 {'c', 'h', 0x3114},
1785 {'s', 'h', 0x3115},
1786 {'r', '4', 0x3116},
1787 {'z', '4', 0x3117},
1788 {'c', '4', 0x3118},
1789 {'s', '4', 0x3119},
1790 {'a', '4', 0x311a},
1791 {'o', '4', 0x311b},
1792 {'e', '4', 0x311c},
1793 {'a', 'i', 0x311e},
1794 {'e', 'i', 0x311f},
1795 {'a', 'u', 0x3120},
1796 {'o', 'u', 0x3121},
1797 {'a', 'n', 0x3122},
1798 {'e', 'n', 0x3123},
1799 {'a', 'N', 0x3124},
1800 {'e', 'N', 0x3125},
1801 {'e', 'r', 0x3126},
1802 {'i', '4', 0x3127},
1803 {'u', '4', 0x3128},
1804 {'i', 'u', 0x3129},
1805 {'v', '4', 0x312a},
1806 {'n', 'G', 0x312b},
1807 {'g', 'n', 0x312c},
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001808#define DG_START_OTHER3 0x3220
Bram Moolenaar071d4272004-06-13 20:20:40 +00001809 {'1', 'c', 0x3220},
1810 {'2', 'c', 0x3221},
1811 {'3', 'c', 0x3222},
1812 {'4', 'c', 0x3223},
1813 {'5', 'c', 0x3224},
1814 {'6', 'c', 0x3225},
1815 {'7', 'c', 0x3226},
1816 {'8', 'c', 0x3227},
1817 {'9', 'c', 0x3228},
Bram Moolenaarceb45be2010-05-07 16:18:14 +02001818 /* code points 0xe000 - 0xefff excluded, they have no assigned
1819 * characters, only used in proposals. */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001820 {'f', 'f', 0xfb00},
1821 {'f', 'i', 0xfb01},
1822 {'f', 'l', 0xfb02},
1823 {'f', 't', 0xfb05},
1824 {'s', 't', 0xfb06},
Bram Moolenaar5f91c0c2008-01-03 16:54:33 +00001825
Bram Moolenaar071d4272004-06-13 20:20:40 +00001826 {NUL, NUL, NUL}
1827 };
1828
Bram Moolenaar13505972019-01-24 15:04:48 +01001829# endif /* OLD_DIGRAPHS */
Bram Moolenaar48e330a2016-02-23 14:53:34 +01001830# endif /* EBCDIC */
1831# endif /* !HPUX_DIGRAPHS */
1832#endif /* !__MINT__ */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001833
1834/*
1835 * handle digraphs after typing a character
1836 */
1837 int
Bram Moolenaar7454a062016-01-30 15:14:10 +01001838do_digraph(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001839{
1840 static int backspaced; /* character before K_BS */
1841 static int lastchar; /* last typed character */
1842
1843 if (c == -1) /* init values */
1844 {
1845 backspaced = -1;
1846 }
1847 else if (p_dg)
1848 {
1849 if (backspaced >= 0)
1850 c = getdigraph(backspaced, c, FALSE);
1851 backspaced = -1;
1852 if ((c == K_BS || c == Ctrl_H) && lastchar >= 0)
1853 backspaced = lastchar;
1854 }
1855 lastchar = c;
1856 return c;
1857}
1858
1859/*
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001860 * Find a digraph for "val". If found return the string to display it.
1861 * If not found return NULL.
1862 */
1863 char_u *
Bram Moolenaarbc5020a2018-06-16 17:25:22 +02001864get_digraph_for_char(int val_arg)
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001865{
Bram Moolenaarbc5020a2018-06-16 17:25:22 +02001866 int val = val_arg;
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001867 int i;
1868 int use_defaults;
1869 digr_T *dp;
1870 static char_u r[3];
1871
Bram Moolenaareae8ae12018-12-14 18:53:02 +01001872#if defined(USE_UNICODE_DIGRAPHS)
Bram Moolenaarbc5020a2018-06-16 17:25:22 +02001873 if (!enc_utf8)
1874 {
1875 char_u buf[6], *to;
1876 vimconv_T vc;
1877
1878 // convert the character from 'encoding' to Unicode
1879 i = mb_char2bytes(val, buf);
1880 vc.vc_type = CONV_NONE;
1881 if (convert_setup(&vc, p_enc, (char_u *)"utf-8") == OK)
1882 {
1883 vc.vc_fail = TRUE;
1884 to = string_convert(&vc, buf, &i);
1885 if (to != NULL)
1886 {
1887 val = utf_ptr2char(to);
1888 vim_free(to);
1889 }
1890 (void)convert_setup(&vc, NULL, NULL);
1891 }
1892 }
1893#endif
1894
Bram Moolenaar5f73ef82018-02-27 21:09:30 +01001895 for (use_defaults = 0; use_defaults <= 1; use_defaults++)
1896 {
1897 if (use_defaults == 0)
1898 dp = (digr_T *)user_digraphs.ga_data;
1899 else
1900 dp = digraphdefault;
1901 for (i = 0; use_defaults ? dp->char1 != NUL
1902 : i < user_digraphs.ga_len; ++i)
1903 {
1904 if (dp->result == val)
1905 {
1906 r[0] = dp->char1;
1907 r[1] = dp->char2;
1908 r[2] = NUL;
1909 return r;
1910 }
1911 ++dp;
1912 }
1913 }
1914 return NULL;
1915}
1916
1917/*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001918 * Get a digraph. Used after typing CTRL-K on the command line or in normal
1919 * mode.
1920 * Returns composed character, or NUL when ESC was used.
1921 */
1922 int
Bram Moolenaar7454a062016-01-30 15:14:10 +01001923get_digraph(
1924 int cmdline) /* TRUE when called from the cmdline */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001925{
1926 int c, cc;
1927
1928 ++no_mapping;
1929 ++allow_keys;
Bram Moolenaar61abfd12007-09-13 16:26:47 +00001930 c = plain_vgetc();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001931 --no_mapping;
1932 --allow_keys;
1933 if (c != ESC) /* ESC cancels CTRL-K */
1934 {
1935 if (IS_SPECIAL(c)) /* insert special key code */
1936 return c;
1937 if (cmdline)
1938 {
1939 if (char2cells(c) == 1
1940#if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
1941 && cmdline_star == 0
1942#endif
1943 )
1944 putcmdline(c, TRUE);
1945 }
1946#ifdef FEAT_CMDL_INFO
1947 else
1948 add_to_showcmd(c);
1949#endif
1950 ++no_mapping;
1951 ++allow_keys;
Bram Moolenaar61abfd12007-09-13 16:26:47 +00001952 cc = plain_vgetc();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001953 --no_mapping;
1954 --allow_keys;
1955 if (cc != ESC) /* ESC cancels CTRL-K */
1956 return getdigraph(c, cc, TRUE);
1957 }
1958 return NUL;
1959}
1960
1961/*
1962 * Lookup the pair "char1", "char2" in the digraph tables.
1963 * If no match, return "char2".
Bram Moolenaar70b2a562012-01-10 22:26:17 +01001964 * If "meta_char" is TRUE and "char1" is a space, return "char2" | 0x80.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001965 */
1966 static int
Bram Moolenaar7454a062016-01-30 15:14:10 +01001967getexactdigraph(int char1, int char2, int meta_char)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001968{
1969 int i;
1970 int retval = 0;
1971 digr_T *dp;
1972
1973 if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
1974 return char2;
1975
1976 /*
1977 * Search user digraphs first.
1978 */
1979 dp = (digr_T *)user_digraphs.ga_data;
1980 for (i = 0; i < user_digraphs.ga_len; ++i)
1981 {
1982 if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1983 {
1984 retval = dp->result;
1985 break;
1986 }
1987 ++dp;
1988 }
1989
1990 /*
1991 * Search default digraphs.
1992 */
1993 if (retval == 0)
1994 {
1995 dp = digraphdefault;
1996 for (i = 0; dp->char1 != 0; ++i)
1997 {
1998 if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1999 {
2000 retval = dp->result;
2001 break;
2002 }
2003 ++dp;
2004 }
2005 }
Bram Moolenaar13505972019-01-24 15:04:48 +01002006#ifdef USE_UNICODE_DIGRAPHS
Bram Moolenaar071d4272004-06-13 20:20:40 +00002007 if (retval != 0 && !enc_utf8)
2008 {
2009 char_u buf[6], *to;
2010 vimconv_T vc;
2011
2012 /*
2013 * Convert the Unicode digraph to 'encoding'.
2014 */
2015 i = utf_char2bytes(retval, buf);
2016 retval = 0;
2017 vc.vc_type = CONV_NONE;
2018 if (convert_setup(&vc, (char_u *)"utf-8", p_enc) == OK)
2019 {
2020 vc.vc_fail = TRUE;
2021 to = string_convert(&vc, buf, &i);
2022 if (to != NULL)
2023 {
2024 retval = (*mb_ptr2char)(to);
2025 vim_free(to);
2026 }
2027 (void)convert_setup(&vc, NULL, NULL);
2028 }
2029 }
Bram Moolenaar13505972019-01-24 15:04:48 +01002030#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002031
2032 /* Ignore multi-byte characters when not in multi-byte mode. */
2033 if (!has_mbyte && retval > 0xff)
2034 retval = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002035
2036 if (retval == 0) /* digraph deleted or not found */
2037 {
Bram Moolenaar70b2a562012-01-10 22:26:17 +01002038 if (char1 == ' ' && meta_char) /* <space> <char> --> meta-char */
Bram Moolenaar071d4272004-06-13 20:20:40 +00002039 return (char2 | 0x80);
2040 return char2;
2041 }
2042 return retval;
2043}
2044
2045/*
2046 * Get digraph.
2047 * Allow for both char1-char2 and char2-char1
2048 */
2049 int
Bram Moolenaar7454a062016-01-30 15:14:10 +01002050getdigraph(int char1, int char2, int meta_char)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002051{
2052 int retval;
2053
Bram Moolenaar70b2a562012-01-10 22:26:17 +01002054 if (((retval = getexactdigraph(char1, char2, meta_char)) == char2)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002055 && (char1 != char2)
Bram Moolenaar70b2a562012-01-10 22:26:17 +01002056 && ((retval = getexactdigraph(char2, char1, meta_char)) == char1))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002057 return char2;
2058 return retval;
2059}
2060
2061/*
2062 * Add the digraphs in the argument to the digraph table.
2063 * format: {c1}{c2} char {c1}{c2} char ...
2064 */
2065 void
Bram Moolenaar7454a062016-01-30 15:14:10 +01002066putdigraph(char_u *str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002067{
2068 int char1, char2, n;
2069 int i;
2070 digr_T *dp;
2071
2072 while (*str != NUL)
2073 {
2074 str = skipwhite(str);
2075 if (*str == NUL)
2076 return;
2077 char1 = *str++;
2078 char2 = *str++;
2079 if (char2 == 0)
2080 {
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002081 emsg(_(e_invarg));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002082 return;
2083 }
2084 if (char1 == ESC || char2 == ESC)
2085 {
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002086 emsg(_("E104: Escape not allowed in digraph"));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002087 return;
2088 }
2089 str = skipwhite(str);
2090 if (!VIM_ISDIGIT(*str))
2091 {
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002092 emsg(_(e_number_exp));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002093 return;
2094 }
2095 n = getdigits(&str);
2096
2097 /* If the digraph already exists, replace the result. */
2098 dp = (digr_T *)user_digraphs.ga_data;
2099 for (i = 0; i < user_digraphs.ga_len; ++i)
2100 {
2101 if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
2102 {
2103 dp->result = n;
2104 break;
2105 }
2106 ++dp;
2107 }
2108
2109 /* Add a new digraph to the table. */
2110 if (i == user_digraphs.ga_len)
2111 {
2112 if (ga_grow(&user_digraphs, 1) == OK)
2113 {
2114 dp = (digr_T *)user_digraphs.ga_data + user_digraphs.ga_len;
2115 dp->char1 = char1;
2116 dp->char2 = char2;
2117 dp->result = n;
2118 ++user_digraphs.ga_len;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002119 }
2120 }
2121 }
2122}
2123
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002124#if defined(USE_UNICODE_DIGRAPHS)
2125 static void
2126digraph_header(char *msg)
2127{
2128 if (msg_col > 0)
2129 msg_putchar('\n');
2130 msg_outtrans_attr((char_u *)msg, HL_ATTR(HLF_CM));
2131 msg_putchar('\n');
2132}
2133#endif
2134
Bram Moolenaar071d4272004-06-13 20:20:40 +00002135 void
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002136listdigraphs(int use_headers)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002137{
2138 int i;
2139 digr_T *dp;
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002140 result_T previous = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002141
2142 msg_putchar('\n');
2143
2144 dp = digraphdefault;
2145 for (i = 0; dp->char1 != NUL && !got_int; ++i)
2146 {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002147#if defined(USE_UNICODE_DIGRAPHS)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002148 digr_T tmp;
2149
2150 /* May need to convert the result to 'encoding'. */
2151 tmp.char1 = dp->char1;
2152 tmp.char2 = dp->char2;
2153 tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
2154 if (tmp.result != 0 && tmp.result != tmp.char2
2155 && (has_mbyte || tmp.result <= 255))
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002156 printdigraph(&tmp, use_headers ? &previous : NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002157#else
2158
2159 if (getexactdigraph(dp->char1, dp->char2, FALSE) == dp->result
Bram Moolenaar13505972019-01-24 15:04:48 +01002160 && (has_mbyte || dp->result <= 255))
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002161 printdigraph(dp, use_headers ? &previous : NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002162#endif
2163 ++dp;
2164 ui_breakcheck();
2165 }
2166
2167 dp = (digr_T *)user_digraphs.ga_data;
2168 for (i = 0; i < user_digraphs.ga_len && !got_int; ++i)
2169 {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002170#if defined(USE_UNICODE_DIGRAPHS)
2171 if (previous >= 0 && use_headers)
2172 digraph_header(_("Custom"));
2173 previous = -1;
2174#endif
2175 printdigraph(dp, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002176 ui_breakcheck();
2177 ++dp;
2178 }
2179 must_redraw = CLEAR; /* clear screen, because some digraphs may be
2180 wrong, in which case we messed up ScreenLines */
2181}
2182
Bram Moolenaar5843f5f2019-08-20 20:13:45 +02002183static struct dg_header_entry {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002184 int dg_start;
2185 char *dg_header;
2186} header_table[] = {
2187 {DG_START_LATIN, N_("Latin supplement")},
2188 {DG_START_GREEK, N_("Greek and Coptic")},
2189 {DG_START_CYRILLIC, N_("Cyrillic")},
2190 {DG_START_HEBREW, N_("Hebrew")},
2191 {DG_START_ARABIC, N_("Arabic")},
2192 {DG_START_LATIN_EXTENDED, N_("Latin extended")},
2193 {DG_START_GREEK_EXTENDED, N_("Greek extended")},
2194 {DG_START_PUNCTUATION, N_("Punctuation")},
2195 {DG_START_SUB_SUPER, N_("Super- and subscripts")},
2196 {DG_START_CURRENCY, N_("Currency")},
2197 {DG_START_OTHER1, N_("Other")},
2198 {DG_START_ROMAN, N_("Roman numbers")},
2199 {DG_START_ARROWS, N_("Arrows")},
2200 {DG_START_MATH, N_("Mathematical operators")},
2201 {DG_START_TECHNICAL, N_("Technical")},
2202 {DG_START_OTHER2, N_("Other")},
2203 {DG_START_DRAWING, N_("Box drawing")},
2204 {DG_START_BLOCK, N_("Block elements")},
2205 {DG_START_SHAPES, N_("Geometric shapes")},
2206 {DG_START_SYMBOLS, N_("Symbols")},
2207 {DG_START_DINGBATS, N_("Dingbats")},
2208 {DG_START_CJK_SYMBOLS, N_("CJK symbols and punctuation")},
2209 {DG_START_HIRAGANA, N_("Hiragana")},
2210 {DG_START_KATAKANA, N_("Katakana")},
2211 {DG_START_BOPOMOFO, N_("Bopomofo")},
2212 {DG_START_OTHER3, N_("Other")},
2213 {0xfffffff, NULL},
2214};
2215
Bram Moolenaar071d4272004-06-13 20:20:40 +00002216 static void
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002217printdigraph(digr_T *dp, result_T *previous)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002218{
2219 char_u buf[30];
2220 char_u *p;
2221
2222 int list_width;
2223
Bram Moolenaar13505972019-01-24 15:04:48 +01002224 if ((dy_flags & DY_UHEX) || has_mbyte)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002225 list_width = 13;
2226 else
2227 list_width = 11;
2228
2229 if (dp->result != 0)
2230 {
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002231#if defined(USE_UNICODE_DIGRAPHS)
2232 if (previous != NULL)
2233 {
2234 int i;
2235
2236 for (i = 0; header_table[i].dg_header != NULL; ++i)
2237 if (*previous < header_table[i].dg_start
2238 && dp->result >= header_table[i].dg_start
2239 && dp->result < header_table[i + 1].dg_start)
2240 {
2241 digraph_header(_(header_table[i].dg_header));
2242 break;
2243 }
2244 *previous = dp->result;
2245 }
2246#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00002247 if (msg_col > Columns - list_width)
2248 msg_putchar('\n');
2249 if (msg_col)
2250 while (msg_col % list_width != 0)
2251 msg_putchar(' ');
2252
2253 p = buf;
2254 *p++ = dp->char1;
2255 *p++ = dp->char2;
2256 *p++ = ' ';
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002257 *p = NUL;
2258 msg_outtrans(buf);
2259 p = buf;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002260 if (has_mbyte)
2261 {
2262 /* add a space to draw a composing char on */
2263 if (enc_utf8 && utf_iscomposing(dp->result))
2264 *p++ = ' ';
2265 p += (*mb_char2bytes)(dp->result, p);
2266 }
2267 else
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002268 *p++ = (char_u)dp->result;
Bram Moolenaareae8ae12018-12-14 18:53:02 +01002269 *p = NUL;
2270 msg_outtrans_attr(buf, HL_ATTR(HLF_8));
2271 p = buf;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002272 if (char2cells(dp->result) == 1)
2273 *p++ = ' ';
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002274 vim_snprintf((char *)p, sizeof(buf) - (p - buf), " %3d", dp->result);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002275 msg_outtrans(buf);
2276 }
2277}
2278
2279#endif /* FEAT_DIGRAPHS */
2280
2281#if defined(FEAT_KEYMAP) || defined(PROTO)
2282
2283/* structure used for b_kmap_ga.ga_data */
2284typedef struct
2285{
2286 char_u *from;
2287 char_u *to;
2288} kmap_T;
2289
2290#define KMAP_MAXLEN 20 /* maximum length of "from" or "to" */
2291
Bram Moolenaarf28dbce2016-01-29 22:03:47 +01002292static void keymap_unload(void);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002293
2294/*
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002295 * Set up key mapping tables for the 'keymap' option.
2296 * Returns NULL if OK, an error message for failure. This only needs to be
2297 * used when setting the option, not later when the value has already been
2298 * checked.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002299 */
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002300 char *
Bram Moolenaar7454a062016-01-30 15:14:10 +01002301keymap_init(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002302{
2303 curbuf->b_kmap_state &= ~KEYMAP_INIT;
2304
2305 if (*curbuf->b_p_keymap == NUL)
2306 {
Bram Moolenaarbf444172007-07-07 11:58:28 +00002307 /* Stop any active keymap and clear the table. Also remove
Bram Moolenaar61abfd12007-09-13 16:26:47 +00002308 * b:keymap_name, as no keymap is active now. */
Bram Moolenaar071d4272004-06-13 20:20:40 +00002309 keymap_unload();
Bram Moolenaarbf444172007-07-07 11:58:28 +00002310 do_cmdline_cmd((char_u *)"unlet! b:keymap_name");
Bram Moolenaar071d4272004-06-13 20:20:40 +00002311 }
2312 else
2313 {
2314 char_u *buf;
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002315 size_t buflen;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002316
2317 /* Source the keymap file. It will contain a ":loadkeymap" command
2318 * which will call ex_loadkeymap() below. */
Bram Moolenaar13505972019-01-24 15:04:48 +01002319 buflen = STRLEN(curbuf->b_p_keymap) + STRLEN(p_enc) + 14;
Bram Moolenaar964b3742019-05-24 18:54:09 +02002320 buf = alloc(buflen);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002321 if (buf == NULL)
2322 return e_outofmem;
2323
Bram Moolenaar071d4272004-06-13 20:20:40 +00002324 /* try finding "keymap/'keymap'_'encoding'.vim" in 'runtimepath' */
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002325 vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
2326 curbuf->b_p_keymap, p_enc);
Bram Moolenaar7f8989d2016-03-12 22:11:39 +01002327 if (source_runtime(buf, 0) == FAIL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002328 {
2329 /* try finding "keymap/'keymap'.vim" in 'runtimepath' */
Bram Moolenaar0ab2a882009-05-13 10:51:08 +00002330 vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
2331 curbuf->b_p_keymap);
Bram Moolenaar7f8989d2016-03-12 22:11:39 +01002332 if (source_runtime(buf, 0) == FAIL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002333 {
2334 vim_free(buf);
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002335 return N_("E544: Keymap file not found");
Bram Moolenaar071d4272004-06-13 20:20:40 +00002336 }
2337 }
2338 vim_free(buf);
2339 }
2340
2341 return NULL;
2342}
2343
2344/*
2345 * ":loadkeymap" command: load the following lines as the keymap.
2346 */
2347 void
Bram Moolenaar7454a062016-01-30 15:14:10 +01002348ex_loadkeymap(exarg_T *eap)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002349{
2350 char_u *line;
2351 char_u *p;
2352 char_u *s;
2353 kmap_T *kp;
2354#define KMAP_LLEN 200 /* max length of "to" and "from" together */
2355 char_u buf[KMAP_LLEN + 11];
2356 int i;
2357 char_u *save_cpo = p_cpo;
2358
2359 if (!getline_equal(eap->getline, eap->cookie, getsourceline))
2360 {
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002361 emsg(_("E105: Using :loadkeymap not in a sourced file"));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002362 return;
2363 }
2364
2365 /*
2366 * Stop any active keymap and clear the table.
2367 */
2368 keymap_unload();
2369
2370 curbuf->b_kmap_state = 0;
2371 ga_init2(&curbuf->b_kmap_ga, (int)sizeof(kmap_T), 20);
2372
2373 /* Set 'cpoptions' to "C" to avoid line continuation. */
2374 p_cpo = (char_u *)"C";
2375
2376 /*
2377 * Get each line of the sourced file, break at the end.
2378 */
2379 for (;;)
2380 {
Bram Moolenaare96a2492019-06-25 04:12:16 +02002381 line = eap->getline(0, eap->cookie, 0, TRUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002382 if (line == NULL)
2383 break;
2384
2385 p = skipwhite(line);
2386 if (*p != '"' && *p != NUL && ga_grow(&curbuf->b_kmap_ga, 1) == OK)
2387 {
2388 kp = (kmap_T *)curbuf->b_kmap_ga.ga_data + curbuf->b_kmap_ga.ga_len;
2389 s = skiptowhite(p);
2390 kp->from = vim_strnsave(p, (int)(s - p));
2391 p = skipwhite(s);
2392 s = skiptowhite(p);
2393 kp->to = vim_strnsave(p, (int)(s - p));
2394
2395 if (kp->from == NULL || kp->to == NULL
Bram Moolenaar57657d82006-04-21 22:12:41 +00002396 || STRLEN(kp->from) + STRLEN(kp->to) >= KMAP_LLEN
2397 || *kp->from == NUL || *kp->to == NUL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002398 {
Bram Moolenaar57657d82006-04-21 22:12:41 +00002399 if (kp->to != NULL && *kp->to == NUL)
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002400 emsg(_("E791: Empty keymap entry"));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002401 vim_free(kp->from);
2402 vim_free(kp->to);
2403 }
2404 else
Bram Moolenaar071d4272004-06-13 20:20:40 +00002405 ++curbuf->b_kmap_ga.ga_len;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002406 }
2407 vim_free(line);
2408 }
2409
2410 /*
2411 * setup ":lnoremap" to map the keys
2412 */
2413 for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
2414 {
Bram Moolenaar555b2802005-05-19 21:08:39 +00002415 vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s",
Bram Moolenaar071d4272004-06-13 20:20:40 +00002416 ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from,
2417 ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to);
2418 (void)do_map(2, buf, LANGMAP, FALSE);
2419 }
2420
2421 p_cpo = save_cpo;
2422
2423 curbuf->b_kmap_state |= KEYMAP_LOADED;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002424 status_redraw_curbuf();
Bram Moolenaar071d4272004-06-13 20:20:40 +00002425}
2426
2427/*
2428 * Stop using 'keymap'.
2429 */
2430 static void
Bram Moolenaar7454a062016-01-30 15:14:10 +01002431keymap_unload(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002432{
2433 char_u buf[KMAP_MAXLEN + 10];
2434 int i;
2435 char_u *save_cpo = p_cpo;
Bram Moolenaar8c8de832008-06-24 22:58:06 +00002436 kmap_T *kp;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002437
2438 if (!(curbuf->b_kmap_state & KEYMAP_LOADED))
2439 return;
2440
2441 /* Set 'cpoptions' to "C" to avoid line continuation. */
2442 p_cpo = (char_u *)"C";
2443
2444 /* clear the ":lmap"s */
Bram Moolenaar8c8de832008-06-24 22:58:06 +00002445 kp = (kmap_T *)curbuf->b_kmap_ga.ga_data;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002446 for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
2447 {
Bram Moolenaar8c8de832008-06-24 22:58:06 +00002448 vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s", kp[i].from);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002449 (void)do_map(1, buf, LANGMAP, FALSE);
2450 }
Bram Moolenaar50138322018-01-28 17:05:16 +01002451 keymap_clear(&curbuf->b_kmap_ga);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002452
2453 p_cpo = save_cpo;
2454
2455 ga_clear(&curbuf->b_kmap_ga);
2456 curbuf->b_kmap_state &= ~KEYMAP_LOADED;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002457 status_redraw_curbuf();
Bram Moolenaar071d4272004-06-13 20:20:40 +00002458}
2459
Bram Moolenaar50138322018-01-28 17:05:16 +01002460 void
2461keymap_clear(garray_T *kmap)
2462{
2463 int i;
2464 kmap_T *kp = (kmap_T *)kmap->ga_data;
2465
2466 for (i = 0; i < kmap->ga_len; ++i)
2467 {
2468 vim_free(kp[i].from);
2469 vim_free(kp[i].to);
2470 }
2471}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002472#endif /* FEAT_KEYMAP */