1edf3f97aSBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet:
2071d4279SBram Moolenaar *
3071d4279SBram Moolenaar * VIM - Vi IMproved by Bram Moolenaar
4071d4279SBram Moolenaar *
5071d4279SBram Moolenaar * Do ":help uganda" in Vim to read copying and usage conditions.
6071d4279SBram Moolenaar * Do ":help credits" in Vim to see a list of people who contributed.
7071d4279SBram Moolenaar * See README.txt for an overview of the Vim source code.
8071d4279SBram Moolenaar */
9071d4279SBram Moolenaar
10071d4279SBram Moolenaar /*
11071d4279SBram Moolenaar * digraph.c: code for digraphs
12071d4279SBram Moolenaar */
13071d4279SBram Moolenaar
14071d4279SBram Moolenaar #include "vim.h"
15071d4279SBram Moolenaar
16071d4279SBram Moolenaar #if defined(FEAT_DIGRAPHS) || defined(PROTO)
17071d4279SBram Moolenaar
18071d4279SBram Moolenaar typedef int result_T;
19071d4279SBram Moolenaar
20071d4279SBram Moolenaar typedef struct digraph
21071d4279SBram Moolenaar {
22071d4279SBram Moolenaar char_u char1;
23071d4279SBram Moolenaar char_u char2;
24071d4279SBram Moolenaar result_T result;
25071d4279SBram Moolenaar } digr_T;
26071d4279SBram Moolenaar
27eae8ae1bSBram Moolenaar static void printdigraph(digr_T *dp, result_T *previous);
28071d4279SBram Moolenaar
295d18efecSBram Moolenaar // digraphs added by the user
300ab2a887SBram Moolenaar static garray_T user_digraphs = {0, 0, (int)sizeof(digr_T), 10, NULL};
31071d4279SBram Moolenaar
32071d4279SBram Moolenaar /*
33071d4279SBram Moolenaar * Note: Characters marked with XX are not included literally, because some
34071d4279SBram Moolenaar * compilers cannot handle them (Amiga SAS/C is the most picky one).
35071d4279SBram Moolenaar */
366c0b44b5SBram Moolenaar static digr_T digraphdefault[] =
37071d4279SBram Moolenaar
38071d4279SBram Moolenaar #ifdef HPUX_DIGRAPHS
39071d4279SBram Moolenaar /*
40071d4279SBram Moolenaar * different HPUX digraphs
41071d4279SBram Moolenaar */
425d18efecSBram Moolenaar {{'A', '`', 161}, // ¡
435d18efecSBram Moolenaar {'A', '^', 162}, // ¢
445d18efecSBram Moolenaar {'E', '`', 163}, // £
455d18efecSBram Moolenaar {'E', '^', 164}, // ¤
465d18efecSBram Moolenaar {'E', '"', 165}, // ¥
475d18efecSBram Moolenaar {'I', '^', 166}, // ¦
485d18efecSBram Moolenaar {'I', '"', 167}, // §
495d18efecSBram Moolenaar {'\'', '\'', 168}, // ¨
505d18efecSBram Moolenaar {'`', '`', 169}, // ©
515d18efecSBram Moolenaar {'^', '^', 170}, // ª
525d18efecSBram Moolenaar {'"', '"', 171}, // «
535d18efecSBram Moolenaar {'~', '~', 172}, // ¬
545d18efecSBram Moolenaar {'U', '`', 173}, //
555d18efecSBram Moolenaar {'U', '^', 174}, // ®
565d18efecSBram Moolenaar {'L', '=', 175}, // ¯
575d18efecSBram Moolenaar {'~', '_', 176}, // °
585d18efecSBram Moolenaar {'Y', '\'', 177}, // ±
595d18efecSBram Moolenaar {'y', '\'', 178}, // ²
605d18efecSBram Moolenaar {'~', 'o', 179}, // ³
615d18efecSBram Moolenaar {'C', ',', 180}, // ´
625d18efecSBram Moolenaar {'c', ',', 181}, // µ
635d18efecSBram Moolenaar {'N', '~', 182}, // ¶
645d18efecSBram Moolenaar {'n', '~', 183}, // ·
655d18efecSBram Moolenaar {'~', '!', 184}, // ¸
665d18efecSBram Moolenaar {'~', '?', 185}, // ¹
675d18efecSBram Moolenaar {'o', 'x', 186}, // º
685d18efecSBram Moolenaar {'L', '-', 187}, // »
695d18efecSBram Moolenaar {'Y', '=', 188}, // ¼
705d18efecSBram Moolenaar {'p', 'p', 189}, // ½
715d18efecSBram Moolenaar {'f', 'l', 190}, // ¾
725d18efecSBram Moolenaar {'c', '|', 191}, // ¿
735d18efecSBram Moolenaar {'a', '^', 192}, // À
745d18efecSBram Moolenaar {'e', '^', 193}, // Á
755d18efecSBram Moolenaar {'o', '^', 194}, // Â
765d18efecSBram Moolenaar {'u', '^', 195}, // Ã
775d18efecSBram Moolenaar {'a', '\'', 196}, // Ä
785d18efecSBram Moolenaar {'e', '\'', 197}, // Å
795d18efecSBram Moolenaar {'o', '\'', 198}, // Æ
805d18efecSBram Moolenaar {'u', '\'', 199}, // Ç
815d18efecSBram Moolenaar {'a', '`', 200}, // È
825d18efecSBram Moolenaar {'e', '`', 201}, // É
835d18efecSBram Moolenaar {'o', '`', 202}, // Ê
845d18efecSBram Moolenaar {'u', '`', 203}, // Ë
855d18efecSBram Moolenaar {'a', '"', 204}, // Ì
865d18efecSBram Moolenaar {'e', '"', 205}, // Í
875d18efecSBram Moolenaar {'o', '"', 206}, // Î
885d18efecSBram Moolenaar {'u', '"', 207}, // Ï
895d18efecSBram Moolenaar {'A', 'o', 208}, // Ð
905d18efecSBram Moolenaar {'i', '^', 209}, // Ñ
915d18efecSBram Moolenaar {'O', '/', 210}, // Ò
925d18efecSBram Moolenaar {'A', 'E', 211}, // Ó
935d18efecSBram Moolenaar {'a', 'o', 212}, // Ô
945d18efecSBram Moolenaar {'i', '\'', 213}, // Õ
955d18efecSBram Moolenaar {'o', '/', 214}, // Ö
965d18efecSBram Moolenaar {'a', 'e', 215}, // ×
975d18efecSBram Moolenaar {'A', '"', 216}, // Ø
985d18efecSBram Moolenaar {'i', '`', 217}, // Ù
995d18efecSBram Moolenaar {'O', '"', 218}, // Ú
1005d18efecSBram Moolenaar {'U', '"', 219}, // Û
1015d18efecSBram Moolenaar {'E', '\'', 220}, // Ü
1025d18efecSBram Moolenaar {'i', '"', 221}, // Ý
1035d18efecSBram Moolenaar {'s', 's', 222}, // Þ
1045d18efecSBram Moolenaar {'O', '^', 223}, // ß
1055d18efecSBram Moolenaar {'A', '\'', 224}, // à
1065d18efecSBram Moolenaar {'A', '~', 225}, // á
1075d18efecSBram Moolenaar {'a', '~', 226}, // â
1085d18efecSBram Moolenaar {'D', '-', 227}, // ã
1095d18efecSBram Moolenaar {'d', '-', 228}, // ä
1105d18efecSBram Moolenaar {'I', '\'', 229}, // å
1115d18efecSBram Moolenaar {'I', '`', 230}, // æ
1125d18efecSBram Moolenaar {'O', '\'', 231}, // ç
1135d18efecSBram Moolenaar {'O', '`', 232}, // è
1145d18efecSBram Moolenaar {'O', '~', 233}, // é
1155d18efecSBram Moolenaar {'o', '~', 234}, // ê
1165d18efecSBram Moolenaar {'S', '~', 235}, // ë
1175d18efecSBram Moolenaar {'s', '~', 236}, // ì
1185d18efecSBram Moolenaar {'U', '\'', 237}, // í
1195d18efecSBram Moolenaar {'Y', '"', 238}, // î
1205d18efecSBram Moolenaar {'y', '"', 239}, // ï
1215d18efecSBram Moolenaar {'p', '-', 240}, // ð
1225d18efecSBram Moolenaar {'p', '~', 241}, // ñ
1235d18efecSBram Moolenaar {'~', '.', 242}, // ò
1245d18efecSBram Moolenaar {'j', 'u', 243}, // ó
1255d18efecSBram Moolenaar {'P', 'p', 244}, // ô
1265d18efecSBram Moolenaar {'3', '4', 245}, // õ
1275d18efecSBram Moolenaar {'-', '-', 246}, // ö
1285d18efecSBram Moolenaar {'1', '4', 247}, // ÷
1295d18efecSBram Moolenaar {'1', '2', 248}, // ø
1305d18efecSBram Moolenaar {'a', '_', 249}, // ù
1315d18efecSBram Moolenaar {'o', '_', 250}, // ú
1325d18efecSBram Moolenaar {'<', '<', 251}, // û
1335d18efecSBram Moolenaar {'x', 'x', 252}, // ü
1345d18efecSBram Moolenaar {'>', '>', 253}, // ý
1355d18efecSBram Moolenaar {'+', '-', 254}, // þ
1365d18efecSBram Moolenaar {'n', 'u', 255}, // x XX
137071d4279SBram Moolenaar {NUL, NUL, NUL}
138071d4279SBram Moolenaar };
139071d4279SBram Moolenaar
1405d18efecSBram Moolenaar #else // !HPUX_DIGRAPHS
141071d4279SBram Moolenaar
142071d4279SBram Moolenaar # ifdef EBCDIC
143071d4279SBram Moolenaar
144071d4279SBram Moolenaar /*
145071d4279SBram Moolenaar * EBCDIC - ISO digraphs
146071d4279SBram Moolenaar * TODO: EBCDIC Table is Code-Page 1047
147071d4279SBram Moolenaar */
1485d18efecSBram Moolenaar {{'a', '^', 66}, // â
1495d18efecSBram Moolenaar {'a', '"', 67}, // ä
1505d18efecSBram Moolenaar {'a', '`', 68}, // à
1515d18efecSBram Moolenaar {'a', '\'', 69}, // á
1525d18efecSBram Moolenaar {'a', '~', 70}, // ã
1535d18efecSBram Moolenaar {'a', '@', 71}, // å
1545d18efecSBram Moolenaar {'a', 'a', 71}, // å
1555d18efecSBram Moolenaar {'c', ',', 72}, // ç
1565d18efecSBram Moolenaar {'n', '~', 73}, // ñ
1575d18efecSBram Moolenaar {'c', '|', 74}, // ¢
1585d18efecSBram Moolenaar {'e', '\'', 81}, // é
1595d18efecSBram Moolenaar {'e', '^', 82}, // ê
1605d18efecSBram Moolenaar {'e', '"', 83}, // ë
1615d18efecSBram Moolenaar {'e', '`', 84}, // è
1625d18efecSBram Moolenaar {'i', '\'', 85}, // í
1635d18efecSBram Moolenaar {'i', '^', 86}, // î
1645d18efecSBram Moolenaar {'i', '"', 87}, // ï
1655d18efecSBram Moolenaar {'i', '`', 88}, // ì
1665d18efecSBram Moolenaar {'s', 's', 89}, // ß
1675d18efecSBram Moolenaar {'A', '^', 98}, // Â
1685d18efecSBram Moolenaar {'A', '"', 99}, // Ä
1695d18efecSBram Moolenaar {'A', '`', 100}, // À
1705d18efecSBram Moolenaar {'A', '\'', 101}, // Á
1715d18efecSBram Moolenaar {'A', '~', 102}, // Ã
1725d18efecSBram Moolenaar {'A', '@', 103}, // Å
1735d18efecSBram Moolenaar {'A', 'A', 103}, // Å
1745d18efecSBram Moolenaar {'C', ',', 104}, // Ç
1755d18efecSBram Moolenaar {'N', '~', 105}, // Ñ
1765d18efecSBram Moolenaar {'|', '|', 106}, // ¦
1775d18efecSBram Moolenaar {'o', '/', 112}, // ø
1785d18efecSBram Moolenaar {'E', '\'', 113}, // É
1795d18efecSBram Moolenaar {'E', '^', 114}, // Ê
1805d18efecSBram Moolenaar {'E', '"', 115}, // Ë
1815d18efecSBram Moolenaar {'E', '`', 116}, // È
1825d18efecSBram Moolenaar {'I', '\'', 117}, // Í
1835d18efecSBram Moolenaar {'I', '^', 118}, // Î
1845d18efecSBram Moolenaar {'I', '"', 119}, // Ï
1855d18efecSBram Moolenaar {'I', '`', 120}, // Ì
1865d18efecSBram Moolenaar {'O', '/', 128}, // 0/ XX
1875d18efecSBram Moolenaar {'<', '<', 138}, // «
1885d18efecSBram Moolenaar {'>', '>', 139}, // »
1895d18efecSBram Moolenaar {'d', '-', 140}, // ð
1905d18efecSBram Moolenaar {'y', '\'', 141}, // ý
1915d18efecSBram Moolenaar {'i', 'p', 142}, // þ
1925d18efecSBram Moolenaar {'+', '-', 143}, // ±
1935d18efecSBram Moolenaar {'~', 'o', 144}, // °
1945d18efecSBram Moolenaar {'a', '-', 154}, // ª
1955d18efecSBram Moolenaar {'o', '-', 155}, // º
1965d18efecSBram Moolenaar {'a', 'e', 156}, // æ
1975d18efecSBram Moolenaar {',', ',', 157}, // , XX
1985d18efecSBram Moolenaar {'A', 'E', 158}, // Æ
1995d18efecSBram Moolenaar {'o', 'x', 159}, // ¤ - currency symbol in ISO 8859-1
2005d18efecSBram Moolenaar {'e', '=', 159}, // ¤ - euro symbol in ISO 8859-15
2015d18efecSBram Moolenaar {'E', 'u', 159}, // ¤ - euro symbol in ISO 8859-15
2025d18efecSBram Moolenaar {'j', 'u', 160}, // µ
2035d18efecSBram Moolenaar {'y', '"', 167}, // x XX
2045d18efecSBram Moolenaar {'~', '!', 170}, // ¡
2055d18efecSBram Moolenaar {'~', '?', 171}, // ¿
2065d18efecSBram Moolenaar {'D', '-', 172}, // Ð
2075d18efecSBram Moolenaar {'I', 'p', 174}, // Þ
2085d18efecSBram Moolenaar {'r', 'O', 175}, // ®
2095d18efecSBram Moolenaar {'-', ',', 176}, // ¬
2105d18efecSBram Moolenaar {'$', '$', 177}, // £
2115d18efecSBram Moolenaar {'Y', '-', 178}, // ¥
2125d18efecSBram Moolenaar {'~', '.', 179}, // ·
2135d18efecSBram Moolenaar {'c', 'O', 180}, // ©
2145d18efecSBram Moolenaar {'p', 'a', 181}, // §
2155d18efecSBram Moolenaar {'p', 'p', 182}, // ¶
2165d18efecSBram Moolenaar {'1', '4', 183}, // ¼
2175d18efecSBram Moolenaar {'1', '2', 184}, // ½
2185d18efecSBram Moolenaar {'3', '4', 185}, // ¾
2195d18efecSBram Moolenaar {'Y', '\'', 186}, // Ý
2205d18efecSBram Moolenaar {'"', '"', 187}, // ¨
2215d18efecSBram Moolenaar {'-', '=', 188}, // ¯
2225d18efecSBram Moolenaar {'\'', '\'', 190}, // ´
2235d18efecSBram Moolenaar {'O', 'E', 191}, // × - OE in ISO 8859-15
2245d18efecSBram Moolenaar {'/', '\\', 191}, // × - multiplication symbol in ISO 8859-1
2255d18efecSBram Moolenaar {'-', '-', 202}, //
2265d18efecSBram Moolenaar {'o', '^', 203}, // ô
2275d18efecSBram Moolenaar {'o', '"', 204}, // ö
2285d18efecSBram Moolenaar {'o', '`', 205}, // ò
2295d18efecSBram Moolenaar {'o', '\'', 206}, // ó
2305d18efecSBram Moolenaar {'o', '~', 207}, // õ
2315d18efecSBram Moolenaar {'1', '1', 218}, // ¹
2325d18efecSBram Moolenaar {'u', '^', 219}, // û
2335d18efecSBram Moolenaar {'u', '"', 220}, // ü
2345d18efecSBram Moolenaar {'u', '`', 221}, // ù
2355d18efecSBram Moolenaar {'u', '\'', 222}, // ú
2365d18efecSBram Moolenaar {':', '-', 225}, // ÷ - division symbol in ISO 8859-1
2375d18efecSBram Moolenaar {'o', 'e', 225}, // ÷ - oe in ISO 8859-15
2385d18efecSBram Moolenaar {'2', '2', 234}, // ²
2395d18efecSBram Moolenaar {'O', '^', 235}, // Ô
2405d18efecSBram Moolenaar {'O', '"', 236}, // Ö
2415d18efecSBram Moolenaar {'O', '`', 237}, // Ò
2425d18efecSBram Moolenaar {'O', '\'', 238}, // Ó
2435d18efecSBram Moolenaar {'O', '~', 239}, // Õ
2445d18efecSBram Moolenaar {'3', '3', 250}, // ³
2455d18efecSBram Moolenaar {'U', '^', 251}, // Û
2465d18efecSBram Moolenaar {'U', '"', 252}, // Ü
2475d18efecSBram Moolenaar {'U', '`', 253}, // Ù
2485d18efecSBram Moolenaar {'U', '\'', 254}, // Ú
249071d4279SBram Moolenaar {NUL, NUL, NUL}
250071d4279SBram Moolenaar };
251071d4279SBram Moolenaar
252e3f915d1SBram Moolenaar # else // EBCDIC
253071d4279SBram Moolenaar # ifdef OLD_DIGRAPHS
254071d4279SBram Moolenaar
255071d4279SBram Moolenaar /*
256071d4279SBram Moolenaar * digraphs compatible with Vim 5.x
257071d4279SBram Moolenaar */
2585d18efecSBram Moolenaar {{'~', '!', 161}, // ¡
2595d18efecSBram Moolenaar {'c', '|', 162}, // ¢
2605d18efecSBram Moolenaar {'$', '$', 163}, // £
2615d18efecSBram Moolenaar {'o', 'x', 164}, // ¤ - currency symbol in ISO 8859-1
2625d18efecSBram Moolenaar {'e', '=', 164}, // ¤ - euro symbol in ISO 8859-15
2635d18efecSBram Moolenaar {'Y', '-', 165}, // ¥
2645d18efecSBram Moolenaar {'|', '|', 166}, // ¦
2655d18efecSBram Moolenaar {'p', 'a', 167}, // §
2665d18efecSBram Moolenaar {'"', '"', 168}, // ¨
2675d18efecSBram Moolenaar {'c', 'O', 169}, // ©
2685d18efecSBram Moolenaar {'a', '-', 170}, // ª
2695d18efecSBram Moolenaar {'<', '<', 171}, // «
2705d18efecSBram Moolenaar {'-', ',', 172}, // ¬
2715d18efecSBram Moolenaar {'-', '-', 173}, //
2725d18efecSBram Moolenaar {'r', 'O', 174}, // ®
2735d18efecSBram Moolenaar {'-', '=', 175}, // ¯
2745d18efecSBram Moolenaar {'~', 'o', 176}, // °
2755d18efecSBram Moolenaar {'+', '-', 177}, // ±
2765d18efecSBram Moolenaar {'2', '2', 178}, // ²
2775d18efecSBram Moolenaar {'3', '3', 179}, // ³
2785d18efecSBram Moolenaar {'\'', '\'', 180}, // ´
2795d18efecSBram Moolenaar {'j', 'u', 181}, // µ
2805d18efecSBram Moolenaar {'p', 'p', 182}, // ¶
2815d18efecSBram Moolenaar {'~', '.', 183}, // ·
2825d18efecSBram Moolenaar {',', ',', 184}, // ¸
2835d18efecSBram Moolenaar {'1', '1', 185}, // ¹
2845d18efecSBram Moolenaar {'o', '-', 186}, // º
2855d18efecSBram Moolenaar {'>', '>', 187}, // »
2865d18efecSBram Moolenaar {'1', '4', 188}, // ¼
2875d18efecSBram Moolenaar {'1', '2', 189}, // ½
2885d18efecSBram Moolenaar {'3', '4', 190}, // ¾
2895d18efecSBram Moolenaar {'~', '?', 191}, // ¿
2905d18efecSBram Moolenaar {'A', '`', 192}, // À
2915d18efecSBram Moolenaar {'A', '\'', 193}, // Á
2925d18efecSBram Moolenaar {'A', '^', 194}, // Â
2935d18efecSBram Moolenaar {'A', '~', 195}, // Ã
2945d18efecSBram Moolenaar {'A', '"', 196}, // Ä
2955d18efecSBram Moolenaar {'A', '@', 197}, // Å
2965d18efecSBram Moolenaar {'A', 'A', 197}, // Å
2975d18efecSBram Moolenaar {'A', 'E', 198}, // Æ
2985d18efecSBram Moolenaar {'C', ',', 199}, // Ç
2995d18efecSBram Moolenaar {'E', '`', 200}, // È
3005d18efecSBram Moolenaar {'E', '\'', 201}, // É
3015d18efecSBram Moolenaar {'E', '^', 202}, // Ê
3025d18efecSBram Moolenaar {'E', '"', 203}, // Ë
3035d18efecSBram Moolenaar {'I', '`', 204}, // Ì
3045d18efecSBram Moolenaar {'I', '\'', 205}, // Í
3055d18efecSBram Moolenaar {'I', '^', 206}, // Î
3065d18efecSBram Moolenaar {'I', '"', 207}, // Ï
3075d18efecSBram Moolenaar {'D', '-', 208}, // Ð
3085d18efecSBram Moolenaar {'N', '~', 209}, // Ñ
3095d18efecSBram Moolenaar {'O', '`', 210}, // Ò
3105d18efecSBram Moolenaar {'O', '\'', 211}, // Ó
3115d18efecSBram Moolenaar {'O', '^', 212}, // Ô
3125d18efecSBram Moolenaar {'O', '~', 213}, // Õ
3135d18efecSBram Moolenaar {'O', '"', 214}, // Ö
3145d18efecSBram Moolenaar {'/', '\\', 215}, // × - multiplication symbol in ISO 8859-1
3155d18efecSBram Moolenaar {'O', 'E', 215}, // × - OE in ISO 8859-15
3165d18efecSBram Moolenaar {'O', '/', 216}, // Ø
3175d18efecSBram Moolenaar {'U', '`', 217}, // Ù
3185d18efecSBram Moolenaar {'U', '\'', 218}, // Ú
3195d18efecSBram Moolenaar {'U', '^', 219}, // Û
3205d18efecSBram Moolenaar {'U', '"', 220}, // Ü
3215d18efecSBram Moolenaar {'Y', '\'', 221}, // Ý
3225d18efecSBram Moolenaar {'I', 'p', 222}, // Þ
3235d18efecSBram Moolenaar {'s', 's', 223}, // ß
3245d18efecSBram Moolenaar {'a', '`', 224}, // à
3255d18efecSBram Moolenaar {'a', '\'', 225}, // á
3265d18efecSBram Moolenaar {'a', '^', 226}, // â
3275d18efecSBram Moolenaar {'a', '~', 227}, // ã
3285d18efecSBram Moolenaar {'a', '"', 228}, // ä
3295d18efecSBram Moolenaar {'a', '@', 229}, // å
3305d18efecSBram Moolenaar {'a', 'a', 229}, // å
3315d18efecSBram Moolenaar {'a', 'e', 230}, // æ
3325d18efecSBram Moolenaar {'c', ',', 231}, // ç
3335d18efecSBram Moolenaar {'e', '`', 232}, // è
3345d18efecSBram Moolenaar {'e', '\'', 233}, // é
3355d18efecSBram Moolenaar {'e', '^', 234}, // ê
3365d18efecSBram Moolenaar {'e', '"', 235}, // ë
3375d18efecSBram Moolenaar {'i', '`', 236}, // ì
3385d18efecSBram Moolenaar {'i', '\'', 237}, // í
3395d18efecSBram Moolenaar {'i', '^', 238}, // î
3405d18efecSBram Moolenaar {'i', '"', 239}, // ï
3415d18efecSBram Moolenaar {'d', '-', 240}, // ð
3425d18efecSBram Moolenaar {'n', '~', 241}, // ñ
3435d18efecSBram Moolenaar {'o', '`', 242}, // ò
3445d18efecSBram Moolenaar {'o', '\'', 243}, // ó
3455d18efecSBram Moolenaar {'o', '^', 244}, // ô
3465d18efecSBram Moolenaar {'o', '~', 245}, // õ
3475d18efecSBram Moolenaar {'o', '"', 246}, // ö
3485d18efecSBram Moolenaar {':', '-', 247}, // ÷ - division symbol in ISO 8859-1
3495d18efecSBram Moolenaar {'o', 'e', 247}, // ÷ - oe in ISO 8859-15
3505d18efecSBram Moolenaar {'o', '/', 248}, // ø
3515d18efecSBram Moolenaar {'u', '`', 249}, // ù
3525d18efecSBram Moolenaar {'u', '\'', 250}, // ú
3535d18efecSBram Moolenaar {'u', '^', 251}, // û
3545d18efecSBram Moolenaar {'u', '"', 252}, // ü
3555d18efecSBram Moolenaar {'y', '\'', 253}, // ý
3565d18efecSBram Moolenaar {'i', 'p', 254}, // þ
3575d18efecSBram Moolenaar {'y', '"', 255}, // x XX
358071d4279SBram Moolenaar {NUL, NUL, NUL}
359071d4279SBram Moolenaar };
3605d18efecSBram Moolenaar # else // OLD_DIGRAPHS
361071d4279SBram Moolenaar
362071d4279SBram Moolenaar /*
363071d4279SBram Moolenaar * digraphs for Unicode from RFC1345
364071d4279SBram Moolenaar * (also work for ISO-8859-1 aka latin1)
365071d4279SBram Moolenaar */
366071d4279SBram Moolenaar {
3675d18efecSBram Moolenaar {'N', 'U', 0x0a}, // LF for NUL
368071d4279SBram Moolenaar {'S', 'H', 0x01},
369071d4279SBram Moolenaar {'S', 'X', 0x02},
370071d4279SBram Moolenaar {'E', 'X', 0x03},
371071d4279SBram Moolenaar {'E', 'T', 0x04},
372071d4279SBram Moolenaar {'E', 'Q', 0x05},
373071d4279SBram Moolenaar {'A', 'K', 0x06},
374071d4279SBram Moolenaar {'B', 'L', 0x07},
375071d4279SBram Moolenaar {'B', 'S', 0x08},
376071d4279SBram Moolenaar {'H', 'T', 0x09},
377071d4279SBram Moolenaar {'L', 'F', 0x0a},
378071d4279SBram Moolenaar {'V', 'T', 0x0b},
379071d4279SBram Moolenaar {'F', 'F', 0x0c},
380071d4279SBram Moolenaar {'C', 'R', 0x0d},
381071d4279SBram Moolenaar {'S', 'O', 0x0e},
382071d4279SBram Moolenaar {'S', 'I', 0x0f},
383071d4279SBram Moolenaar {'D', 'L', 0x10},
384071d4279SBram Moolenaar {'D', '1', 0x11},
385071d4279SBram Moolenaar {'D', '2', 0x12},
386071d4279SBram Moolenaar {'D', '3', 0x13},
387071d4279SBram Moolenaar {'D', '4', 0x14},
388071d4279SBram Moolenaar {'N', 'K', 0x15},
389071d4279SBram Moolenaar {'S', 'Y', 0x16},
390071d4279SBram Moolenaar {'E', 'B', 0x17},
391071d4279SBram Moolenaar {'C', 'N', 0x18},
392071d4279SBram Moolenaar {'E', 'M', 0x19},
393071d4279SBram Moolenaar {'S', 'B', 0x1a},
394071d4279SBram Moolenaar {'E', 'C', 0x1b},
395071d4279SBram Moolenaar {'F', 'S', 0x1c},
396071d4279SBram Moolenaar {'G', 'S', 0x1d},
397071d4279SBram Moolenaar {'R', 'S', 0x1e},
398071d4279SBram Moolenaar {'U', 'S', 0x1f},
399071d4279SBram Moolenaar {'S', 'P', 0x20},
400071d4279SBram Moolenaar {'N', 'b', 0x23},
401071d4279SBram Moolenaar {'D', 'O', 0x24},
402071d4279SBram Moolenaar {'A', 't', 0x40},
403071d4279SBram Moolenaar {'<', '(', 0x5b},
404071d4279SBram Moolenaar {'/', '/', 0x5c},
405071d4279SBram Moolenaar {')', '>', 0x5d},
406071d4279SBram Moolenaar {'\'', '>', 0x5e},
407071d4279SBram Moolenaar {'\'', '!', 0x60},
408071d4279SBram Moolenaar {'(', '!', 0x7b},
409071d4279SBram Moolenaar {'!', '!', 0x7c},
410071d4279SBram Moolenaar {'!', ')', 0x7d},
411071d4279SBram Moolenaar {'\'', '?', 0x7e},
412071d4279SBram Moolenaar {'D', 'T', 0x7f},
413071d4279SBram Moolenaar {'P', 'A', 0x80},
414071d4279SBram Moolenaar {'H', 'O', 0x81},
415071d4279SBram Moolenaar {'B', 'H', 0x82},
416071d4279SBram Moolenaar {'N', 'H', 0x83},
417071d4279SBram Moolenaar {'I', 'N', 0x84},
418071d4279SBram Moolenaar {'N', 'L', 0x85},
419071d4279SBram Moolenaar {'S', 'A', 0x86},
420071d4279SBram Moolenaar {'E', 'S', 0x87},
421071d4279SBram Moolenaar {'H', 'S', 0x88},
422071d4279SBram Moolenaar {'H', 'J', 0x89},
423071d4279SBram Moolenaar {'V', 'S', 0x8a},
424071d4279SBram Moolenaar {'P', 'D', 0x8b},
425071d4279SBram Moolenaar {'P', 'U', 0x8c},
426071d4279SBram Moolenaar {'R', 'I', 0x8d},
427071d4279SBram Moolenaar {'S', '2', 0x8e},
428071d4279SBram Moolenaar {'S', '3', 0x8f},
429071d4279SBram Moolenaar {'D', 'C', 0x90},
430071d4279SBram Moolenaar {'P', '1', 0x91},
431071d4279SBram Moolenaar {'P', '2', 0x92},
432071d4279SBram Moolenaar {'T', 'S', 0x93},
433071d4279SBram Moolenaar {'C', 'C', 0x94},
434071d4279SBram Moolenaar {'M', 'W', 0x95},
435071d4279SBram Moolenaar {'S', 'G', 0x96},
436071d4279SBram Moolenaar {'E', 'G', 0x97},
437071d4279SBram Moolenaar {'S', 'S', 0x98},
438071d4279SBram Moolenaar {'G', 'C', 0x99},
439071d4279SBram Moolenaar {'S', 'C', 0x9a},
440071d4279SBram Moolenaar {'C', 'I', 0x9b},
441071d4279SBram Moolenaar {'S', 'T', 0x9c},
442071d4279SBram Moolenaar {'O', 'C', 0x9d},
443071d4279SBram Moolenaar {'P', 'M', 0x9e},
444071d4279SBram Moolenaar {'A', 'C', 0x9f},
445071d4279SBram Moolenaar {'N', 'S', 0xa0},
446eae8ae1bSBram Moolenaar # define DG_START_LATIN 0xa1
447071d4279SBram Moolenaar {'!', 'I', 0xa1},
4484119309dSBram Moolenaar {'~', '!', 0xa1}, // ¡ Vim 5.x compatible
449071d4279SBram Moolenaar {'C', 't', 0xa2},
4504119309dSBram Moolenaar {'c', '|', 0xa2}, // ¢ Vim 5.x compatible
451071d4279SBram Moolenaar {'P', 'd', 0xa3},
4524119309dSBram Moolenaar {'$', '$', 0xa3}, // £ Vim 5.x compatible
453071d4279SBram Moolenaar {'C', 'u', 0xa4},
4544119309dSBram Moolenaar {'o', 'x', 0xa4}, // ¤ Vim 5.x compatible
455071d4279SBram Moolenaar {'Y', 'e', 0xa5},
4564119309dSBram Moolenaar {'Y', '-', 0xa5}, // ¥ Vim 5.x compatible
457071d4279SBram Moolenaar {'B', 'B', 0xa6},
4584119309dSBram Moolenaar {'|', '|', 0xa6}, // ¦ Vim 5.x compatible
459071d4279SBram Moolenaar {'S', 'E', 0xa7},
460071d4279SBram Moolenaar {'\'', ':', 0xa8},
461071d4279SBram Moolenaar {'C', 'o', 0xa9},
4624119309dSBram Moolenaar {'c', 'O', 0xa9}, // © Vim 5.x compatible
463071d4279SBram Moolenaar {'-', 'a', 0xaa},
464071d4279SBram Moolenaar {'<', '<', 0xab},
465071d4279SBram Moolenaar {'N', 'O', 0xac},
4664119309dSBram Moolenaar {'-', ',', 0xac}, // ¬ Vim 5.x compatible
467071d4279SBram Moolenaar {'-', '-', 0xad},
468071d4279SBram Moolenaar {'R', 'g', 0xae},
469071d4279SBram Moolenaar {'\'', 'm', 0xaf},
4704119309dSBram Moolenaar {'-', '=', 0xaf}, // ¯ Vim 5.x compatible
471071d4279SBram Moolenaar {'D', 'G', 0xb0},
4724119309dSBram Moolenaar {'~', 'o', 0xb0}, // ° Vim 5.x compatible
473071d4279SBram Moolenaar {'+', '-', 0xb1},
474071d4279SBram Moolenaar {'2', 'S', 0xb2},
4754119309dSBram Moolenaar {'2', '2', 0xb2}, // ² Vim 5.x compatible
476071d4279SBram Moolenaar {'3', 'S', 0xb3},
4774119309dSBram Moolenaar {'3', '3', 0xb3}, // ³ Vim 5.x compatible
478071d4279SBram Moolenaar {'\'', '\'', 0xb4},
479071d4279SBram Moolenaar {'M', 'y', 0xb5},
480071d4279SBram Moolenaar {'P', 'I', 0xb6},
4814119309dSBram Moolenaar {'p', 'p', 0xb6}, // ¶ Vim 5.x compatible
482071d4279SBram Moolenaar {'.', 'M', 0xb7},
4834119309dSBram Moolenaar {'~', '.', 0xb7}, // · Vim 5.x compatible
484071d4279SBram Moolenaar {'\'', ',', 0xb8},
485071d4279SBram Moolenaar {'1', 'S', 0xb9},
4864119309dSBram Moolenaar {'1', '1', 0xb9}, // ¹ Vim 5.x compatible
487071d4279SBram Moolenaar {'-', 'o', 0xba},
488071d4279SBram Moolenaar {'>', '>', 0xbb},
489071d4279SBram Moolenaar {'1', '4', 0xbc},
490071d4279SBram Moolenaar {'1', '2', 0xbd},
491071d4279SBram Moolenaar {'3', '4', 0xbe},
492071d4279SBram Moolenaar {'?', 'I', 0xbf},
4934119309dSBram Moolenaar {'~', '?', 0xbf}, // ¿ Vim 5.x compatible
494071d4279SBram Moolenaar {'A', '!', 0xc0},
4954119309dSBram Moolenaar {'A', '`', 0xc0}, // À Vim 5.x compatible
496071d4279SBram Moolenaar {'A', '\'', 0xc1},
497071d4279SBram Moolenaar {'A', '>', 0xc2},
4984119309dSBram Moolenaar {'A', '^', 0xc2}, // Â Vim 5.x compatible
499071d4279SBram Moolenaar {'A', '?', 0xc3},
5004119309dSBram Moolenaar {'A', '~', 0xc3}, // Ã Vim 5.x compatible
501071d4279SBram Moolenaar {'A', ':', 0xc4},
5024119309dSBram Moolenaar {'A', '"', 0xc4}, // Ä Vim 5.x compatible
503071d4279SBram Moolenaar {'A', 'A', 0xc5},
5044119309dSBram Moolenaar {'A', '@', 0xc5}, // Å Vim 5.x compatible
505071d4279SBram Moolenaar {'A', 'E', 0xc6},
506071d4279SBram Moolenaar {'C', ',', 0xc7},
507071d4279SBram Moolenaar {'E', '!', 0xc8},
5084119309dSBram Moolenaar {'E', '`', 0xc8}, // È Vim 5.x compatible
509071d4279SBram Moolenaar {'E', '\'', 0xc9},
510071d4279SBram Moolenaar {'E', '>', 0xca},
5114119309dSBram Moolenaar {'E', '^', 0xca}, // Ê Vim 5.x compatible
512071d4279SBram Moolenaar {'E', ':', 0xcb},
5134119309dSBram Moolenaar {'E', '"', 0xcb}, // Ë Vim 5.x compatible
514071d4279SBram Moolenaar {'I', '!', 0xcc},
5154119309dSBram Moolenaar {'I', '`', 0xcc}, // Ì Vim 5.x compatible
516071d4279SBram Moolenaar {'I', '\'', 0xcd},
517071d4279SBram Moolenaar {'I', '>', 0xce},
5184119309dSBram Moolenaar {'I', '^', 0xce}, // Î Vim 5.x compatible
519071d4279SBram Moolenaar {'I', ':', 0xcf},
5204119309dSBram Moolenaar {'I', '"', 0xcf}, // Ï Vim 5.x compatible
521071d4279SBram Moolenaar {'D', '-', 0xd0},
522071d4279SBram Moolenaar {'N', '?', 0xd1},
5234119309dSBram Moolenaar {'N', '~', 0xd1}, // Ñ Vim 5.x compatible
524071d4279SBram Moolenaar {'O', '!', 0xd2},
5254119309dSBram Moolenaar {'O', '`', 0xd2}, // Ò Vim 5.x compatible
526071d4279SBram Moolenaar {'O', '\'', 0xd3},
527071d4279SBram Moolenaar {'O', '>', 0xd4},
5284119309dSBram Moolenaar {'O', '^', 0xd4}, // Ô Vim 5.x compatible
529071d4279SBram Moolenaar {'O', '?', 0xd5},
5304119309dSBram Moolenaar {'O', '~', 0xd5}, // Õ Vim 5.x compatible
531071d4279SBram Moolenaar {'O', ':', 0xd6},
532071d4279SBram Moolenaar {'*', 'X', 0xd7},
5334119309dSBram Moolenaar {'/', '\\', 0xd7}, // × Vim 5.x compatible
534071d4279SBram Moolenaar {'O', '/', 0xd8},
535071d4279SBram Moolenaar {'U', '!', 0xd9},
5364119309dSBram Moolenaar {'U', '`', 0xd9}, // Ù Vim 5.x compatible
537071d4279SBram Moolenaar {'U', '\'', 0xda},
538071d4279SBram Moolenaar {'U', '>', 0xdb},
5394119309dSBram Moolenaar {'U', '^', 0xdb}, // Û Vim 5.x compatible
540071d4279SBram Moolenaar {'U', ':', 0xdc},
541071d4279SBram Moolenaar {'Y', '\'', 0xdd},
542071d4279SBram Moolenaar {'T', 'H', 0xde},
5434119309dSBram Moolenaar {'I', 'p', 0xde}, // Þ Vim 5.x compatible
544071d4279SBram Moolenaar {'s', 's', 0xdf},
545071d4279SBram Moolenaar {'a', '!', 0xe0},
5464119309dSBram Moolenaar {'a', '`', 0xe0}, // à Vim 5.x compatible
547071d4279SBram Moolenaar {'a', '\'', 0xe1},
548071d4279SBram Moolenaar {'a', '>', 0xe2},
5494119309dSBram Moolenaar {'a', '^', 0xe2}, // â Vim 5.x compatible
550071d4279SBram Moolenaar {'a', '?', 0xe3},
5514119309dSBram Moolenaar {'a', '~', 0xe3}, // ã Vim 5.x compatible
552071d4279SBram Moolenaar {'a', ':', 0xe4},
5534119309dSBram Moolenaar {'a', '"', 0xe4}, // ä Vim 5.x compatible
554071d4279SBram Moolenaar {'a', 'a', 0xe5},
5554119309dSBram Moolenaar {'a', '@', 0xe5}, // å Vim 5.x compatible
556071d4279SBram Moolenaar {'a', 'e', 0xe6},
557071d4279SBram Moolenaar {'c', ',', 0xe7},
558071d4279SBram Moolenaar {'e', '!', 0xe8},
5594119309dSBram Moolenaar {'e', '`', 0xe8}, // è Vim 5.x compatible
560071d4279SBram Moolenaar {'e', '\'', 0xe9},
561071d4279SBram Moolenaar {'e', '>', 0xea},
5624119309dSBram Moolenaar {'e', '^', 0xea}, // ê Vim 5.x compatible
563071d4279SBram Moolenaar {'e', ':', 0xeb},
5644119309dSBram Moolenaar {'e', '"', 0xeb}, // ë Vim 5.x compatible
565071d4279SBram Moolenaar {'i', '!', 0xec},
5664119309dSBram Moolenaar {'i', '`', 0xec}, // ì Vim 5.x compatible
567071d4279SBram Moolenaar {'i', '\'', 0xed},
568071d4279SBram Moolenaar {'i', '>', 0xee},
5694119309dSBram Moolenaar {'i', '^', 0xee}, // î Vim 5.x compatible
570071d4279SBram Moolenaar {'i', ':', 0xef},
571071d4279SBram Moolenaar {'d', '-', 0xf0},
572071d4279SBram Moolenaar {'n', '?', 0xf1},
5734119309dSBram Moolenaar {'n', '~', 0xf1}, // ñ Vim 5.x compatible
574071d4279SBram Moolenaar {'o', '!', 0xf2},
5754119309dSBram Moolenaar {'o', '`', 0xf2}, // ò Vim 5.x compatible
576071d4279SBram Moolenaar {'o', '\'', 0xf3},
577071d4279SBram Moolenaar {'o', '>', 0xf4},
5784119309dSBram Moolenaar {'o', '^', 0xf4}, // ô Vim 5.x compatible
579071d4279SBram Moolenaar {'o', '?', 0xf5},
5804119309dSBram Moolenaar {'o', '~', 0xf5}, // õ Vim 5.x compatible
581071d4279SBram Moolenaar {'o', ':', 0xf6},
582071d4279SBram Moolenaar {'-', ':', 0xf7},
583071d4279SBram Moolenaar {'o', '/', 0xf8},
584071d4279SBram Moolenaar {'u', '!', 0xf9},
5854119309dSBram Moolenaar {'u', '`', 0xf9}, // ù Vim 5.x compatible
586071d4279SBram Moolenaar {'u', '\'', 0xfa},
587071d4279SBram Moolenaar {'u', '>', 0xfb},
5884119309dSBram Moolenaar {'u', '^', 0xfb}, // û Vim 5.x compatible
589071d4279SBram Moolenaar {'u', ':', 0xfc},
590071d4279SBram Moolenaar {'y', '\'', 0xfd},
591071d4279SBram Moolenaar {'t', 'h', 0xfe},
592071d4279SBram Moolenaar {'y', ':', 0xff},
593eae8ae1bSBram Moolenaar {'y', '"', 0xff}, // x XX Vim 5.x compatible
594071d4279SBram Moolenaar
595071d4279SBram Moolenaar # define USE_UNICODE_DIGRAPHS
596071d4279SBram Moolenaar
597071d4279SBram Moolenaar {'A', '-', 0x0100},
598071d4279SBram Moolenaar {'a', '-', 0x0101},
599071d4279SBram Moolenaar {'A', '(', 0x0102},
600071d4279SBram Moolenaar {'a', '(', 0x0103},
601071d4279SBram Moolenaar {'A', ';', 0x0104},
602071d4279SBram Moolenaar {'a', ';', 0x0105},
603071d4279SBram Moolenaar {'C', '\'', 0x0106},
604071d4279SBram Moolenaar {'c', '\'', 0x0107},
605071d4279SBram Moolenaar {'C', '>', 0x0108},
606071d4279SBram Moolenaar {'c', '>', 0x0109},
607071d4279SBram Moolenaar {'C', '.', 0x010a},
608071d4279SBram Moolenaar {'c', '.', 0x010b},
609071d4279SBram Moolenaar {'C', '<', 0x010c},
610071d4279SBram Moolenaar {'c', '<', 0x010d},
611071d4279SBram Moolenaar {'D', '<', 0x010e},
612071d4279SBram Moolenaar {'d', '<', 0x010f},
613071d4279SBram Moolenaar {'D', '/', 0x0110},
614071d4279SBram Moolenaar {'d', '/', 0x0111},
615071d4279SBram Moolenaar {'E', '-', 0x0112},
616071d4279SBram Moolenaar {'e', '-', 0x0113},
617071d4279SBram Moolenaar {'E', '(', 0x0114},
618071d4279SBram Moolenaar {'e', '(', 0x0115},
619071d4279SBram Moolenaar {'E', '.', 0x0116},
620071d4279SBram Moolenaar {'e', '.', 0x0117},
621071d4279SBram Moolenaar {'E', ';', 0x0118},
622071d4279SBram Moolenaar {'e', ';', 0x0119},
623071d4279SBram Moolenaar {'E', '<', 0x011a},
624071d4279SBram Moolenaar {'e', '<', 0x011b},
625071d4279SBram Moolenaar {'G', '>', 0x011c},
626071d4279SBram Moolenaar {'g', '>', 0x011d},
627071d4279SBram Moolenaar {'G', '(', 0x011e},
628071d4279SBram Moolenaar {'g', '(', 0x011f},
629071d4279SBram Moolenaar {'G', '.', 0x0120},
630071d4279SBram Moolenaar {'g', '.', 0x0121},
631071d4279SBram Moolenaar {'G', ',', 0x0122},
632071d4279SBram Moolenaar {'g', ',', 0x0123},
633071d4279SBram Moolenaar {'H', '>', 0x0124},
634071d4279SBram Moolenaar {'h', '>', 0x0125},
635071d4279SBram Moolenaar {'H', '/', 0x0126},
636071d4279SBram Moolenaar {'h', '/', 0x0127},
637071d4279SBram Moolenaar {'I', '?', 0x0128},
638071d4279SBram Moolenaar {'i', '?', 0x0129},
639071d4279SBram Moolenaar {'I', '-', 0x012a},
640071d4279SBram Moolenaar {'i', '-', 0x012b},
641071d4279SBram Moolenaar {'I', '(', 0x012c},
642071d4279SBram Moolenaar {'i', '(', 0x012d},
643071d4279SBram Moolenaar {'I', ';', 0x012e},
644071d4279SBram Moolenaar {'i', ';', 0x012f},
645071d4279SBram Moolenaar {'I', '.', 0x0130},
646071d4279SBram Moolenaar {'i', '.', 0x0131},
647071d4279SBram Moolenaar {'I', 'J', 0x0132},
648071d4279SBram Moolenaar {'i', 'j', 0x0133},
649071d4279SBram Moolenaar {'J', '>', 0x0134},
650071d4279SBram Moolenaar {'j', '>', 0x0135},
651071d4279SBram Moolenaar {'K', ',', 0x0136},
652071d4279SBram Moolenaar {'k', ',', 0x0137},
653071d4279SBram Moolenaar {'k', 'k', 0x0138},
654071d4279SBram Moolenaar {'L', '\'', 0x0139},
655071d4279SBram Moolenaar {'l', '\'', 0x013a},
656071d4279SBram Moolenaar {'L', ',', 0x013b},
657071d4279SBram Moolenaar {'l', ',', 0x013c},
658071d4279SBram Moolenaar {'L', '<', 0x013d},
659071d4279SBram Moolenaar {'l', '<', 0x013e},
660071d4279SBram Moolenaar {'L', '.', 0x013f},
661071d4279SBram Moolenaar {'l', '.', 0x0140},
662071d4279SBram Moolenaar {'L', '/', 0x0141},
663071d4279SBram Moolenaar {'l', '/', 0x0142},
664071d4279SBram Moolenaar {'N', '\'', 0x0143},
665071d4279SBram Moolenaar {'n', '\'', 0x0144},
666071d4279SBram Moolenaar {'N', ',', 0x0145},
667071d4279SBram Moolenaar {'n', ',', 0x0146},
668071d4279SBram Moolenaar {'N', '<', 0x0147},
669071d4279SBram Moolenaar {'n', '<', 0x0148},
670071d4279SBram Moolenaar {'\'', 'n', 0x0149},
671071d4279SBram Moolenaar {'N', 'G', 0x014a},
672071d4279SBram Moolenaar {'n', 'g', 0x014b},
673071d4279SBram Moolenaar {'O', '-', 0x014c},
674071d4279SBram Moolenaar {'o', '-', 0x014d},
675071d4279SBram Moolenaar {'O', '(', 0x014e},
676071d4279SBram Moolenaar {'o', '(', 0x014f},
677071d4279SBram Moolenaar {'O', '"', 0x0150},
678071d4279SBram Moolenaar {'o', '"', 0x0151},
679071d4279SBram Moolenaar {'O', 'E', 0x0152},
680071d4279SBram Moolenaar {'o', 'e', 0x0153},
681071d4279SBram Moolenaar {'R', '\'', 0x0154},
682071d4279SBram Moolenaar {'r', '\'', 0x0155},
683071d4279SBram Moolenaar {'R', ',', 0x0156},
684071d4279SBram Moolenaar {'r', ',', 0x0157},
685071d4279SBram Moolenaar {'R', '<', 0x0158},
686071d4279SBram Moolenaar {'r', '<', 0x0159},
687071d4279SBram Moolenaar {'S', '\'', 0x015a},
688071d4279SBram Moolenaar {'s', '\'', 0x015b},
689071d4279SBram Moolenaar {'S', '>', 0x015c},
690071d4279SBram Moolenaar {'s', '>', 0x015d},
691071d4279SBram Moolenaar {'S', ',', 0x015e},
692071d4279SBram Moolenaar {'s', ',', 0x015f},
693071d4279SBram Moolenaar {'S', '<', 0x0160},
694071d4279SBram Moolenaar {'s', '<', 0x0161},
695071d4279SBram Moolenaar {'T', ',', 0x0162},
696071d4279SBram Moolenaar {'t', ',', 0x0163},
697071d4279SBram Moolenaar {'T', '<', 0x0164},
698071d4279SBram Moolenaar {'t', '<', 0x0165},
699071d4279SBram Moolenaar {'T', '/', 0x0166},
700071d4279SBram Moolenaar {'t', '/', 0x0167},
701071d4279SBram Moolenaar {'U', '?', 0x0168},
702071d4279SBram Moolenaar {'u', '?', 0x0169},
703071d4279SBram Moolenaar {'U', '-', 0x016a},
704071d4279SBram Moolenaar {'u', '-', 0x016b},
705071d4279SBram Moolenaar {'U', '(', 0x016c},
706071d4279SBram Moolenaar {'u', '(', 0x016d},
707071d4279SBram Moolenaar {'U', '0', 0x016e},
708071d4279SBram Moolenaar {'u', '0', 0x016f},
709071d4279SBram Moolenaar {'U', '"', 0x0170},
710071d4279SBram Moolenaar {'u', '"', 0x0171},
711071d4279SBram Moolenaar {'U', ';', 0x0172},
712071d4279SBram Moolenaar {'u', ';', 0x0173},
713071d4279SBram Moolenaar {'W', '>', 0x0174},
714071d4279SBram Moolenaar {'w', '>', 0x0175},
715071d4279SBram Moolenaar {'Y', '>', 0x0176},
716071d4279SBram Moolenaar {'y', '>', 0x0177},
717071d4279SBram Moolenaar {'Y', ':', 0x0178},
718071d4279SBram Moolenaar {'Z', '\'', 0x0179},
719071d4279SBram Moolenaar {'z', '\'', 0x017a},
720071d4279SBram Moolenaar {'Z', '.', 0x017b},
721071d4279SBram Moolenaar {'z', '.', 0x017c},
722071d4279SBram Moolenaar {'Z', '<', 0x017d},
723071d4279SBram Moolenaar {'z', '<', 0x017e},
724071d4279SBram Moolenaar {'O', '9', 0x01a0},
725071d4279SBram Moolenaar {'o', '9', 0x01a1},
726071d4279SBram Moolenaar {'O', 'I', 0x01a2},
727071d4279SBram Moolenaar {'o', 'i', 0x01a3},
728071d4279SBram Moolenaar {'y', 'r', 0x01a6},
729071d4279SBram Moolenaar {'U', '9', 0x01af},
730071d4279SBram Moolenaar {'u', '9', 0x01b0},
731071d4279SBram Moolenaar {'Z', '/', 0x01b5},
732071d4279SBram Moolenaar {'z', '/', 0x01b6},
733071d4279SBram Moolenaar {'E', 'D', 0x01b7},
734071d4279SBram Moolenaar {'A', '<', 0x01cd},
735071d4279SBram Moolenaar {'a', '<', 0x01ce},
736071d4279SBram Moolenaar {'I', '<', 0x01cf},
737071d4279SBram Moolenaar {'i', '<', 0x01d0},
738071d4279SBram Moolenaar {'O', '<', 0x01d1},
739071d4279SBram Moolenaar {'o', '<', 0x01d2},
740071d4279SBram Moolenaar {'U', '<', 0x01d3},
741071d4279SBram Moolenaar {'u', '<', 0x01d4},
742071d4279SBram Moolenaar {'A', '1', 0x01de},
743071d4279SBram Moolenaar {'a', '1', 0x01df},
744071d4279SBram Moolenaar {'A', '7', 0x01e0},
745071d4279SBram Moolenaar {'a', '7', 0x01e1},
746071d4279SBram Moolenaar {'A', '3', 0x01e2},
747071d4279SBram Moolenaar {'a', '3', 0x01e3},
748071d4279SBram Moolenaar {'G', '/', 0x01e4},
749071d4279SBram Moolenaar {'g', '/', 0x01e5},
750071d4279SBram Moolenaar {'G', '<', 0x01e6},
751071d4279SBram Moolenaar {'g', '<', 0x01e7},
752071d4279SBram Moolenaar {'K', '<', 0x01e8},
753071d4279SBram Moolenaar {'k', '<', 0x01e9},
754071d4279SBram Moolenaar {'O', ';', 0x01ea},
755071d4279SBram Moolenaar {'o', ';', 0x01eb},
756071d4279SBram Moolenaar {'O', '1', 0x01ec},
757071d4279SBram Moolenaar {'o', '1', 0x01ed},
758071d4279SBram Moolenaar {'E', 'Z', 0x01ee},
759071d4279SBram Moolenaar {'e', 'z', 0x01ef},
760071d4279SBram Moolenaar {'j', '<', 0x01f0},
761071d4279SBram Moolenaar {'G', '\'', 0x01f4},
762071d4279SBram Moolenaar {'g', '\'', 0x01f5},
763071d4279SBram Moolenaar {';', 'S', 0x02bf},
764071d4279SBram Moolenaar {'\'', '<', 0x02c7},
765071d4279SBram Moolenaar {'\'', '(', 0x02d8},
766071d4279SBram Moolenaar {'\'', '.', 0x02d9},
767071d4279SBram Moolenaar {'\'', '0', 0x02da},
768071d4279SBram Moolenaar {'\'', ';', 0x02db},
769071d4279SBram Moolenaar {'\'', '"', 0x02dd},
770eae8ae1bSBram Moolenaar # define DG_START_GREEK 0x0386
771071d4279SBram Moolenaar {'A', '%', 0x0386},
772071d4279SBram Moolenaar {'E', '%', 0x0388},
773071d4279SBram Moolenaar {'Y', '%', 0x0389},
774071d4279SBram Moolenaar {'I', '%', 0x038a},
775071d4279SBram Moolenaar {'O', '%', 0x038c},
776071d4279SBram Moolenaar {'U', '%', 0x038e},
777071d4279SBram Moolenaar {'W', '%', 0x038f},
778071d4279SBram Moolenaar {'i', '3', 0x0390},
779071d4279SBram Moolenaar {'A', '*', 0x0391},
780071d4279SBram Moolenaar {'B', '*', 0x0392},
781071d4279SBram Moolenaar {'G', '*', 0x0393},
782071d4279SBram Moolenaar {'D', '*', 0x0394},
783071d4279SBram Moolenaar {'E', '*', 0x0395},
784071d4279SBram Moolenaar {'Z', '*', 0x0396},
785071d4279SBram Moolenaar {'Y', '*', 0x0397},
786071d4279SBram Moolenaar {'H', '*', 0x0398},
787071d4279SBram Moolenaar {'I', '*', 0x0399},
788071d4279SBram Moolenaar {'K', '*', 0x039a},
789071d4279SBram Moolenaar {'L', '*', 0x039b},
790071d4279SBram Moolenaar {'M', '*', 0x039c},
791071d4279SBram Moolenaar {'N', '*', 0x039d},
792071d4279SBram Moolenaar {'C', '*', 0x039e},
793071d4279SBram Moolenaar {'O', '*', 0x039f},
794071d4279SBram Moolenaar {'P', '*', 0x03a0},
795071d4279SBram Moolenaar {'R', '*', 0x03a1},
796071d4279SBram Moolenaar {'S', '*', 0x03a3},
797071d4279SBram Moolenaar {'T', '*', 0x03a4},
798071d4279SBram Moolenaar {'U', '*', 0x03a5},
799071d4279SBram Moolenaar {'F', '*', 0x03a6},
800071d4279SBram Moolenaar {'X', '*', 0x03a7},
801071d4279SBram Moolenaar {'Q', '*', 0x03a8},
802071d4279SBram Moolenaar {'W', '*', 0x03a9},
803071d4279SBram Moolenaar {'J', '*', 0x03aa},
804071d4279SBram Moolenaar {'V', '*', 0x03ab},
805071d4279SBram Moolenaar {'a', '%', 0x03ac},
806071d4279SBram Moolenaar {'e', '%', 0x03ad},
807071d4279SBram Moolenaar {'y', '%', 0x03ae},
808071d4279SBram Moolenaar {'i', '%', 0x03af},
809071d4279SBram Moolenaar {'u', '3', 0x03b0},
810071d4279SBram Moolenaar {'a', '*', 0x03b1},
811071d4279SBram Moolenaar {'b', '*', 0x03b2},
812071d4279SBram Moolenaar {'g', '*', 0x03b3},
813071d4279SBram Moolenaar {'d', '*', 0x03b4},
814071d4279SBram Moolenaar {'e', '*', 0x03b5},
815071d4279SBram Moolenaar {'z', '*', 0x03b6},
816071d4279SBram Moolenaar {'y', '*', 0x03b7},
817071d4279SBram Moolenaar {'h', '*', 0x03b8},
818071d4279SBram Moolenaar {'i', '*', 0x03b9},
819071d4279SBram Moolenaar {'k', '*', 0x03ba},
820071d4279SBram Moolenaar {'l', '*', 0x03bb},
821071d4279SBram Moolenaar {'m', '*', 0x03bc},
822071d4279SBram Moolenaar {'n', '*', 0x03bd},
823071d4279SBram Moolenaar {'c', '*', 0x03be},
824071d4279SBram Moolenaar {'o', '*', 0x03bf},
825071d4279SBram Moolenaar {'p', '*', 0x03c0},
826071d4279SBram Moolenaar {'r', '*', 0x03c1},
827071d4279SBram Moolenaar {'*', 's', 0x03c2},
828071d4279SBram Moolenaar {'s', '*', 0x03c3},
829071d4279SBram Moolenaar {'t', '*', 0x03c4},
830071d4279SBram Moolenaar {'u', '*', 0x03c5},
831071d4279SBram Moolenaar {'f', '*', 0x03c6},
832071d4279SBram Moolenaar {'x', '*', 0x03c7},
833071d4279SBram Moolenaar {'q', '*', 0x03c8},
834071d4279SBram Moolenaar {'w', '*', 0x03c9},
835071d4279SBram Moolenaar {'j', '*', 0x03ca},
836071d4279SBram Moolenaar {'v', '*', 0x03cb},
837071d4279SBram Moolenaar {'o', '%', 0x03cc},
838071d4279SBram Moolenaar {'u', '%', 0x03cd},
839071d4279SBram Moolenaar {'w', '%', 0x03ce},
840071d4279SBram Moolenaar {'\'', 'G', 0x03d8},
841071d4279SBram Moolenaar {',', 'G', 0x03d9},
842071d4279SBram Moolenaar {'T', '3', 0x03da},
843071d4279SBram Moolenaar {'t', '3', 0x03db},
844071d4279SBram Moolenaar {'M', '3', 0x03dc},
845071d4279SBram Moolenaar {'m', '3', 0x03dd},
846071d4279SBram Moolenaar {'K', '3', 0x03de},
847071d4279SBram Moolenaar {'k', '3', 0x03df},
848071d4279SBram Moolenaar {'P', '3', 0x03e0},
849071d4279SBram Moolenaar {'p', '3', 0x03e1},
850071d4279SBram Moolenaar {'\'', '%', 0x03f4},
851071d4279SBram Moolenaar {'j', '3', 0x03f5},
852eae8ae1bSBram Moolenaar # define DG_START_CYRILLIC 0x0401
853071d4279SBram Moolenaar {'I', 'O', 0x0401},
854071d4279SBram Moolenaar {'D', '%', 0x0402},
855071d4279SBram Moolenaar {'G', '%', 0x0403},
856071d4279SBram Moolenaar {'I', 'E', 0x0404},
857071d4279SBram Moolenaar {'D', 'S', 0x0405},
858071d4279SBram Moolenaar {'I', 'I', 0x0406},
859071d4279SBram Moolenaar {'Y', 'I', 0x0407},
860071d4279SBram Moolenaar {'J', '%', 0x0408},
861071d4279SBram Moolenaar {'L', 'J', 0x0409},
862071d4279SBram Moolenaar {'N', 'J', 0x040a},
863071d4279SBram Moolenaar {'T', 's', 0x040b},
864071d4279SBram Moolenaar {'K', 'J', 0x040c},
865071d4279SBram Moolenaar {'V', '%', 0x040e},
866071d4279SBram Moolenaar {'D', 'Z', 0x040f},
867071d4279SBram Moolenaar {'A', '=', 0x0410},
868071d4279SBram Moolenaar {'B', '=', 0x0411},
869071d4279SBram Moolenaar {'V', '=', 0x0412},
870071d4279SBram Moolenaar {'G', '=', 0x0413},
871071d4279SBram Moolenaar {'D', '=', 0x0414},
872071d4279SBram Moolenaar {'E', '=', 0x0415},
873071d4279SBram Moolenaar {'Z', '%', 0x0416},
874071d4279SBram Moolenaar {'Z', '=', 0x0417},
875071d4279SBram Moolenaar {'I', '=', 0x0418},
876071d4279SBram Moolenaar {'J', '=', 0x0419},
877071d4279SBram Moolenaar {'K', '=', 0x041a},
878071d4279SBram Moolenaar {'L', '=', 0x041b},
879071d4279SBram Moolenaar {'M', '=', 0x041c},
880071d4279SBram Moolenaar {'N', '=', 0x041d},
881071d4279SBram Moolenaar {'O', '=', 0x041e},
882071d4279SBram Moolenaar {'P', '=', 0x041f},
883071d4279SBram Moolenaar {'R', '=', 0x0420},
884071d4279SBram Moolenaar {'S', '=', 0x0421},
885071d4279SBram Moolenaar {'T', '=', 0x0422},
886071d4279SBram Moolenaar {'U', '=', 0x0423},
887071d4279SBram Moolenaar {'F', '=', 0x0424},
888071d4279SBram Moolenaar {'H', '=', 0x0425},
889071d4279SBram Moolenaar {'C', '=', 0x0426},
890071d4279SBram Moolenaar {'C', '%', 0x0427},
891071d4279SBram Moolenaar {'S', '%', 0x0428},
892071d4279SBram Moolenaar {'S', 'c', 0x0429},
893071d4279SBram Moolenaar {'=', '"', 0x042a},
894071d4279SBram Moolenaar {'Y', '=', 0x042b},
895071d4279SBram Moolenaar {'%', '"', 0x042c},
896071d4279SBram Moolenaar {'J', 'E', 0x042d},
897071d4279SBram Moolenaar {'J', 'U', 0x042e},
898071d4279SBram Moolenaar {'J', 'A', 0x042f},
899071d4279SBram Moolenaar {'a', '=', 0x0430},
900071d4279SBram Moolenaar {'b', '=', 0x0431},
901071d4279SBram Moolenaar {'v', '=', 0x0432},
902071d4279SBram Moolenaar {'g', '=', 0x0433},
903071d4279SBram Moolenaar {'d', '=', 0x0434},
904071d4279SBram Moolenaar {'e', '=', 0x0435},
905071d4279SBram Moolenaar {'z', '%', 0x0436},
906071d4279SBram Moolenaar {'z', '=', 0x0437},
907071d4279SBram Moolenaar {'i', '=', 0x0438},
908071d4279SBram Moolenaar {'j', '=', 0x0439},
909071d4279SBram Moolenaar {'k', '=', 0x043a},
910071d4279SBram Moolenaar {'l', '=', 0x043b},
911071d4279SBram Moolenaar {'m', '=', 0x043c},
912071d4279SBram Moolenaar {'n', '=', 0x043d},
913071d4279SBram Moolenaar {'o', '=', 0x043e},
914071d4279SBram Moolenaar {'p', '=', 0x043f},
915071d4279SBram Moolenaar {'r', '=', 0x0440},
916071d4279SBram Moolenaar {'s', '=', 0x0441},
917071d4279SBram Moolenaar {'t', '=', 0x0442},
918071d4279SBram Moolenaar {'u', '=', 0x0443},
919071d4279SBram Moolenaar {'f', '=', 0x0444},
920071d4279SBram Moolenaar {'h', '=', 0x0445},
921071d4279SBram Moolenaar {'c', '=', 0x0446},
922071d4279SBram Moolenaar {'c', '%', 0x0447},
923071d4279SBram Moolenaar {'s', '%', 0x0448},
924071d4279SBram Moolenaar {'s', 'c', 0x0449},
925071d4279SBram Moolenaar {'=', '\'', 0x044a},
926071d4279SBram Moolenaar {'y', '=', 0x044b},
927071d4279SBram Moolenaar {'%', '\'', 0x044c},
928071d4279SBram Moolenaar {'j', 'e', 0x044d},
929071d4279SBram Moolenaar {'j', 'u', 0x044e},
930071d4279SBram Moolenaar {'j', 'a', 0x044f},
931071d4279SBram Moolenaar {'i', 'o', 0x0451},
932071d4279SBram Moolenaar {'d', '%', 0x0452},
933071d4279SBram Moolenaar {'g', '%', 0x0453},
934071d4279SBram Moolenaar {'i', 'e', 0x0454},
935071d4279SBram Moolenaar {'d', 's', 0x0455},
936071d4279SBram Moolenaar {'i', 'i', 0x0456},
937071d4279SBram Moolenaar {'y', 'i', 0x0457},
938071d4279SBram Moolenaar {'j', '%', 0x0458},
939071d4279SBram Moolenaar {'l', 'j', 0x0459},
940071d4279SBram Moolenaar {'n', 'j', 0x045a},
941071d4279SBram Moolenaar {'t', 's', 0x045b},
942071d4279SBram Moolenaar {'k', 'j', 0x045c},
943071d4279SBram Moolenaar {'v', '%', 0x045e},
944071d4279SBram Moolenaar {'d', 'z', 0x045f},
945071d4279SBram Moolenaar {'Y', '3', 0x0462},
946071d4279SBram Moolenaar {'y', '3', 0x0463},
947071d4279SBram Moolenaar {'O', '3', 0x046a},
948071d4279SBram Moolenaar {'o', '3', 0x046b},
949071d4279SBram Moolenaar {'F', '3', 0x0472},
950071d4279SBram Moolenaar {'f', '3', 0x0473},
951071d4279SBram Moolenaar {'V', '3', 0x0474},
952071d4279SBram Moolenaar {'v', '3', 0x0475},
953071d4279SBram Moolenaar {'C', '3', 0x0480},
954071d4279SBram Moolenaar {'c', '3', 0x0481},
955071d4279SBram Moolenaar {'G', '3', 0x0490},
956071d4279SBram Moolenaar {'g', '3', 0x0491},
957eae8ae1bSBram Moolenaar # define DG_START_HEBREW 0x05d0
958071d4279SBram Moolenaar {'A', '+', 0x05d0},
959071d4279SBram Moolenaar {'B', '+', 0x05d1},
960071d4279SBram Moolenaar {'G', '+', 0x05d2},
961071d4279SBram Moolenaar {'D', '+', 0x05d3},
962071d4279SBram Moolenaar {'H', '+', 0x05d4},
963071d4279SBram Moolenaar {'W', '+', 0x05d5},
964071d4279SBram Moolenaar {'Z', '+', 0x05d6},
965071d4279SBram Moolenaar {'X', '+', 0x05d7},
966071d4279SBram Moolenaar {'T', 'j', 0x05d8},
967071d4279SBram Moolenaar {'J', '+', 0x05d9},
968071d4279SBram Moolenaar {'K', '%', 0x05da},
969071d4279SBram Moolenaar {'K', '+', 0x05db},
970071d4279SBram Moolenaar {'L', '+', 0x05dc},
971071d4279SBram Moolenaar {'M', '%', 0x05dd},
972071d4279SBram Moolenaar {'M', '+', 0x05de},
973071d4279SBram Moolenaar {'N', '%', 0x05df},
974071d4279SBram Moolenaar {'N', '+', 0x05e0},
975071d4279SBram Moolenaar {'S', '+', 0x05e1},
976071d4279SBram Moolenaar {'E', '+', 0x05e2},
977071d4279SBram Moolenaar {'P', '%', 0x05e3},
978071d4279SBram Moolenaar {'P', '+', 0x05e4},
979071d4279SBram Moolenaar {'Z', 'j', 0x05e5},
980071d4279SBram Moolenaar {'Z', 'J', 0x05e6},
981071d4279SBram Moolenaar {'Q', '+', 0x05e7},
982071d4279SBram Moolenaar {'R', '+', 0x05e8},
983071d4279SBram Moolenaar {'S', 'h', 0x05e9},
984071d4279SBram Moolenaar {'T', '+', 0x05ea},
985eae8ae1bSBram Moolenaar # define DG_START_ARABIC 0x060c
986071d4279SBram Moolenaar {',', '+', 0x060c},
987071d4279SBram Moolenaar {';', '+', 0x061b},
988071d4279SBram Moolenaar {'?', '+', 0x061f},
989071d4279SBram Moolenaar {'H', '\'', 0x0621},
990071d4279SBram Moolenaar {'a', 'M', 0x0622},
991071d4279SBram Moolenaar {'a', 'H', 0x0623},
992071d4279SBram Moolenaar {'w', 'H', 0x0624},
993071d4279SBram Moolenaar {'a', 'h', 0x0625},
994071d4279SBram Moolenaar {'y', 'H', 0x0626},
995071d4279SBram Moolenaar {'a', '+', 0x0627},
996071d4279SBram Moolenaar {'b', '+', 0x0628},
997071d4279SBram Moolenaar {'t', 'm', 0x0629},
998071d4279SBram Moolenaar {'t', '+', 0x062a},
999071d4279SBram Moolenaar {'t', 'k', 0x062b},
1000071d4279SBram Moolenaar {'g', '+', 0x062c},
1001071d4279SBram Moolenaar {'h', 'k', 0x062d},
1002071d4279SBram Moolenaar {'x', '+', 0x062e},
1003071d4279SBram Moolenaar {'d', '+', 0x062f},
1004071d4279SBram Moolenaar {'d', 'k', 0x0630},
1005071d4279SBram Moolenaar {'r', '+', 0x0631},
1006071d4279SBram Moolenaar {'z', '+', 0x0632},
1007071d4279SBram Moolenaar {'s', '+', 0x0633},
1008071d4279SBram Moolenaar {'s', 'n', 0x0634},
1009071d4279SBram Moolenaar {'c', '+', 0x0635},
1010071d4279SBram Moolenaar {'d', 'd', 0x0636},
1011071d4279SBram Moolenaar {'t', 'j', 0x0637},
1012071d4279SBram Moolenaar {'z', 'H', 0x0638},
1013071d4279SBram Moolenaar {'e', '+', 0x0639},
1014071d4279SBram Moolenaar {'i', '+', 0x063a},
1015071d4279SBram Moolenaar {'+', '+', 0x0640},
1016071d4279SBram Moolenaar {'f', '+', 0x0641},
1017071d4279SBram Moolenaar {'q', '+', 0x0642},
1018071d4279SBram Moolenaar {'k', '+', 0x0643},
1019071d4279SBram Moolenaar {'l', '+', 0x0644},
1020071d4279SBram Moolenaar {'m', '+', 0x0645},
1021071d4279SBram Moolenaar {'n', '+', 0x0646},
1022071d4279SBram Moolenaar {'h', '+', 0x0647},
1023071d4279SBram Moolenaar {'w', '+', 0x0648},
1024071d4279SBram Moolenaar {'j', '+', 0x0649},
1025071d4279SBram Moolenaar {'y', '+', 0x064a},
1026071d4279SBram Moolenaar {':', '+', 0x064b},
1027071d4279SBram Moolenaar {'"', '+', 0x064c},
1028071d4279SBram Moolenaar {'=', '+', 0x064d},
1029071d4279SBram Moolenaar {'/', '+', 0x064e},
1030071d4279SBram Moolenaar {'\'', '+', 0x064f},
1031071d4279SBram Moolenaar {'1', '+', 0x0650},
1032071d4279SBram Moolenaar {'3', '+', 0x0651},
1033071d4279SBram Moolenaar {'0', '+', 0x0652},
1034071d4279SBram Moolenaar {'a', 'S', 0x0670},
1035071d4279SBram Moolenaar {'p', '+', 0x067e},
1036071d4279SBram Moolenaar {'v', '+', 0x06a4},
1037071d4279SBram Moolenaar {'g', 'f', 0x06af},
1038071d4279SBram Moolenaar {'0', 'a', 0x06f0},
1039071d4279SBram Moolenaar {'1', 'a', 0x06f1},
1040071d4279SBram Moolenaar {'2', 'a', 0x06f2},
1041071d4279SBram Moolenaar {'3', 'a', 0x06f3},
1042071d4279SBram Moolenaar {'4', 'a', 0x06f4},
1043071d4279SBram Moolenaar {'5', 'a', 0x06f5},
1044071d4279SBram Moolenaar {'6', 'a', 0x06f6},
1045071d4279SBram Moolenaar {'7', 'a', 0x06f7},
1046071d4279SBram Moolenaar {'8', 'a', 0x06f8},
1047071d4279SBram Moolenaar {'9', 'a', 0x06f9},
1048eae8ae1bSBram Moolenaar # define DG_START_LATIN_EXTENDED 0x1e02
1049071d4279SBram Moolenaar {'B', '.', 0x1e02},
1050071d4279SBram Moolenaar {'b', '.', 0x1e03},
1051071d4279SBram Moolenaar {'B', '_', 0x1e06},
1052071d4279SBram Moolenaar {'b', '_', 0x1e07},
1053071d4279SBram Moolenaar {'D', '.', 0x1e0a},
1054071d4279SBram Moolenaar {'d', '.', 0x1e0b},
1055071d4279SBram Moolenaar {'D', '_', 0x1e0e},
1056071d4279SBram Moolenaar {'d', '_', 0x1e0f},
1057071d4279SBram Moolenaar {'D', ',', 0x1e10},
1058071d4279SBram Moolenaar {'d', ',', 0x1e11},
1059071d4279SBram Moolenaar {'F', '.', 0x1e1e},
1060071d4279SBram Moolenaar {'f', '.', 0x1e1f},
1061071d4279SBram Moolenaar {'G', '-', 0x1e20},
1062071d4279SBram Moolenaar {'g', '-', 0x1e21},
1063071d4279SBram Moolenaar {'H', '.', 0x1e22},
1064071d4279SBram Moolenaar {'h', '.', 0x1e23},
1065071d4279SBram Moolenaar {'H', ':', 0x1e26},
1066071d4279SBram Moolenaar {'h', ':', 0x1e27},
1067071d4279SBram Moolenaar {'H', ',', 0x1e28},
1068071d4279SBram Moolenaar {'h', ',', 0x1e29},
1069071d4279SBram Moolenaar {'K', '\'', 0x1e30},
1070071d4279SBram Moolenaar {'k', '\'', 0x1e31},
1071071d4279SBram Moolenaar {'K', '_', 0x1e34},
1072071d4279SBram Moolenaar {'k', '_', 0x1e35},
1073071d4279SBram Moolenaar {'L', '_', 0x1e3a},
1074071d4279SBram Moolenaar {'l', '_', 0x1e3b},
1075071d4279SBram Moolenaar {'M', '\'', 0x1e3e},
1076071d4279SBram Moolenaar {'m', '\'', 0x1e3f},
1077071d4279SBram Moolenaar {'M', '.', 0x1e40},
1078071d4279SBram Moolenaar {'m', '.', 0x1e41},
1079071d4279SBram Moolenaar {'N', '.', 0x1e44},
1080071d4279SBram Moolenaar {'n', '.', 0x1e45},
1081071d4279SBram Moolenaar {'N', '_', 0x1e48},
1082071d4279SBram Moolenaar {'n', '_', 0x1e49},
1083071d4279SBram Moolenaar {'P', '\'', 0x1e54},
1084071d4279SBram Moolenaar {'p', '\'', 0x1e55},
1085071d4279SBram Moolenaar {'P', '.', 0x1e56},
1086071d4279SBram Moolenaar {'p', '.', 0x1e57},
1087071d4279SBram Moolenaar {'R', '.', 0x1e58},
1088071d4279SBram Moolenaar {'r', '.', 0x1e59},
1089071d4279SBram Moolenaar {'R', '_', 0x1e5e},
1090071d4279SBram Moolenaar {'r', '_', 0x1e5f},
1091071d4279SBram Moolenaar {'S', '.', 0x1e60},
1092071d4279SBram Moolenaar {'s', '.', 0x1e61},
1093071d4279SBram Moolenaar {'T', '.', 0x1e6a},
1094071d4279SBram Moolenaar {'t', '.', 0x1e6b},
1095071d4279SBram Moolenaar {'T', '_', 0x1e6e},
1096071d4279SBram Moolenaar {'t', '_', 0x1e6f},
1097071d4279SBram Moolenaar {'V', '?', 0x1e7c},
1098071d4279SBram Moolenaar {'v', '?', 0x1e7d},
1099071d4279SBram Moolenaar {'W', '!', 0x1e80},
1100eae8ae1bSBram Moolenaar {'W', '`', 0x1e80}, // extra alternative, easier to remember
1101071d4279SBram Moolenaar {'w', '!', 0x1e81},
1102eae8ae1bSBram Moolenaar {'w', '`', 0x1e81}, // extra alternative, easier to remember
1103071d4279SBram Moolenaar {'W', '\'', 0x1e82},
1104071d4279SBram Moolenaar {'w', '\'', 0x1e83},
1105071d4279SBram Moolenaar {'W', ':', 0x1e84},
1106071d4279SBram Moolenaar {'w', ':', 0x1e85},
1107071d4279SBram Moolenaar {'W', '.', 0x1e86},
1108071d4279SBram Moolenaar {'w', '.', 0x1e87},
1109071d4279SBram Moolenaar {'X', '.', 0x1e8a},
1110071d4279SBram Moolenaar {'x', '.', 0x1e8b},
1111071d4279SBram Moolenaar {'X', ':', 0x1e8c},
1112071d4279SBram Moolenaar {'x', ':', 0x1e8d},
1113071d4279SBram Moolenaar {'Y', '.', 0x1e8e},
1114071d4279SBram Moolenaar {'y', '.', 0x1e8f},
1115071d4279SBram Moolenaar {'Z', '>', 0x1e90},
1116071d4279SBram Moolenaar {'z', '>', 0x1e91},
1117071d4279SBram Moolenaar {'Z', '_', 0x1e94},
1118071d4279SBram Moolenaar {'z', '_', 0x1e95},
1119071d4279SBram Moolenaar {'h', '_', 0x1e96},
1120071d4279SBram Moolenaar {'t', ':', 0x1e97},
1121071d4279SBram Moolenaar {'w', '0', 0x1e98},
1122071d4279SBram Moolenaar {'y', '0', 0x1e99},
1123071d4279SBram Moolenaar {'A', '2', 0x1ea2},
1124071d4279SBram Moolenaar {'a', '2', 0x1ea3},
1125071d4279SBram Moolenaar {'E', '2', 0x1eba},
1126071d4279SBram Moolenaar {'e', '2', 0x1ebb},
1127071d4279SBram Moolenaar {'E', '?', 0x1ebc},
1128071d4279SBram Moolenaar {'e', '?', 0x1ebd},
1129071d4279SBram Moolenaar {'I', '2', 0x1ec8},
1130071d4279SBram Moolenaar {'i', '2', 0x1ec9},
1131071d4279SBram Moolenaar {'O', '2', 0x1ece},
1132071d4279SBram Moolenaar {'o', '2', 0x1ecf},
1133071d4279SBram Moolenaar {'U', '2', 0x1ee6},
1134071d4279SBram Moolenaar {'u', '2', 0x1ee7},
1135071d4279SBram Moolenaar {'Y', '!', 0x1ef2},
1136eae8ae1bSBram Moolenaar {'Y', '`', 0x1ef2}, // extra alternative, easier to remember
1137071d4279SBram Moolenaar {'y', '!', 0x1ef3},
1138eae8ae1bSBram Moolenaar {'y', '`', 0x1ef3}, // extra alternative, easier to remember
1139071d4279SBram Moolenaar {'Y', '2', 0x1ef6},
1140071d4279SBram Moolenaar {'y', '2', 0x1ef7},
1141071d4279SBram Moolenaar {'Y', '?', 0x1ef8},
1142071d4279SBram Moolenaar {'y', '?', 0x1ef9},
1143eae8ae1bSBram Moolenaar # define DG_START_GREEK_EXTENDED 0x1f00
1144071d4279SBram Moolenaar {';', '\'', 0x1f00},
1145071d4279SBram Moolenaar {',', '\'', 0x1f01},
1146071d4279SBram Moolenaar {';', '!', 0x1f02},
1147071d4279SBram Moolenaar {',', '!', 0x1f03},
1148071d4279SBram Moolenaar {'?', ';', 0x1f04},
1149071d4279SBram Moolenaar {'?', ',', 0x1f05},
1150071d4279SBram Moolenaar {'!', ':', 0x1f06},
1151071d4279SBram Moolenaar {'?', ':', 0x1f07},
1152eae8ae1bSBram Moolenaar # define DG_START_PUNCTUATION 0x2002
1153071d4279SBram Moolenaar {'1', 'N', 0x2002},
1154071d4279SBram Moolenaar {'1', 'M', 0x2003},
1155071d4279SBram Moolenaar {'3', 'M', 0x2004},
1156071d4279SBram Moolenaar {'4', 'M', 0x2005},
1157071d4279SBram Moolenaar {'6', 'M', 0x2006},
1158071d4279SBram Moolenaar {'1', 'T', 0x2009},
1159071d4279SBram Moolenaar {'1', 'H', 0x200a},
1160071d4279SBram Moolenaar {'-', '1', 0x2010},
1161071d4279SBram Moolenaar {'-', 'N', 0x2013},
1162071d4279SBram Moolenaar {'-', 'M', 0x2014},
1163071d4279SBram Moolenaar {'-', '3', 0x2015},
1164071d4279SBram Moolenaar {'!', '2', 0x2016},
1165071d4279SBram Moolenaar {'=', '2', 0x2017},
1166071d4279SBram Moolenaar {'\'', '6', 0x2018},
1167071d4279SBram Moolenaar {'\'', '9', 0x2019},
1168071d4279SBram Moolenaar {'.', '9', 0x201a},
1169071d4279SBram Moolenaar {'9', '\'', 0x201b},
1170071d4279SBram Moolenaar {'"', '6', 0x201c},
1171071d4279SBram Moolenaar {'"', '9', 0x201d},
1172071d4279SBram Moolenaar {':', '9', 0x201e},
1173071d4279SBram Moolenaar {'9', '"', 0x201f},
1174071d4279SBram Moolenaar {'/', '-', 0x2020},
1175071d4279SBram Moolenaar {'/', '=', 0x2021},
117657ad94c5SBram Moolenaar {'o', 'o', 0x2022},
1177071d4279SBram Moolenaar {'.', '.', 0x2025},
117881615517SBram Moolenaar {',', '.', 0x2026},
1179071d4279SBram Moolenaar {'%', '0', 0x2030},
1180071d4279SBram Moolenaar {'1', '\'', 0x2032},
1181071d4279SBram Moolenaar {'2', '\'', 0x2033},
1182071d4279SBram Moolenaar {'3', '\'', 0x2034},
1183071d4279SBram Moolenaar {'1', '"', 0x2035},
1184071d4279SBram Moolenaar {'2', '"', 0x2036},
1185071d4279SBram Moolenaar {'3', '"', 0x2037},
1186071d4279SBram Moolenaar {'C', 'a', 0x2038},
1187071d4279SBram Moolenaar {'<', '1', 0x2039},
1188071d4279SBram Moolenaar {'>', '1', 0x203a},
1189071d4279SBram Moolenaar {':', 'X', 0x203b},
1190071d4279SBram Moolenaar {'\'', '-', 0x203e},
1191071d4279SBram Moolenaar {'/', 'f', 0x2044},
1192eae8ae1bSBram Moolenaar # define DG_START_SUB_SUPER 0x2070
1193071d4279SBram Moolenaar {'0', 'S', 0x2070},
1194071d4279SBram Moolenaar {'4', 'S', 0x2074},
1195071d4279SBram Moolenaar {'5', 'S', 0x2075},
1196071d4279SBram Moolenaar {'6', 'S', 0x2076},
1197071d4279SBram Moolenaar {'7', 'S', 0x2077},
1198071d4279SBram Moolenaar {'8', 'S', 0x2078},
1199071d4279SBram Moolenaar {'9', 'S', 0x2079},
1200071d4279SBram Moolenaar {'+', 'S', 0x207a},
1201071d4279SBram Moolenaar {'-', 'S', 0x207b},
1202071d4279SBram Moolenaar {'=', 'S', 0x207c},
1203071d4279SBram Moolenaar {'(', 'S', 0x207d},
1204071d4279SBram Moolenaar {')', 'S', 0x207e},
1205071d4279SBram Moolenaar {'n', 'S', 0x207f},
1206071d4279SBram Moolenaar {'0', 's', 0x2080},
1207071d4279SBram Moolenaar {'1', 's', 0x2081},
1208071d4279SBram Moolenaar {'2', 's', 0x2082},
1209071d4279SBram Moolenaar {'3', 's', 0x2083},
1210071d4279SBram Moolenaar {'4', 's', 0x2084},
1211071d4279SBram Moolenaar {'5', 's', 0x2085},
1212071d4279SBram Moolenaar {'6', 's', 0x2086},
1213071d4279SBram Moolenaar {'7', 's', 0x2087},
1214071d4279SBram Moolenaar {'8', 's', 0x2088},
1215071d4279SBram Moolenaar {'9', 's', 0x2089},
1216071d4279SBram Moolenaar {'+', 's', 0x208a},
1217071d4279SBram Moolenaar {'-', 's', 0x208b},
1218071d4279SBram Moolenaar {'=', 's', 0x208c},
1219071d4279SBram Moolenaar {'(', 's', 0x208d},
1220071d4279SBram Moolenaar {')', 's', 0x208e},
1221eae8ae1bSBram Moolenaar # define DG_START_CURRENCY 0x20a4
1222071d4279SBram Moolenaar {'L', 'i', 0x20a4},
1223071d4279SBram Moolenaar {'P', 't', 0x20a7},
1224071d4279SBram Moolenaar {'W', '=', 0x20a9},
12255d18efecSBram Moolenaar {'=', 'e', 0x20ac}, // euro
12265d18efecSBram Moolenaar {'E', 'u', 0x20ac}, // euro
12275d18efecSBram Moolenaar {'=', 'R', 0x20bd}, // rouble
12285d18efecSBram Moolenaar {'=', 'P', 0x20bd}, // rouble
1229eae8ae1bSBram Moolenaar # define DG_START_OTHER1 0x2103
1230071d4279SBram Moolenaar {'o', 'C', 0x2103},
1231071d4279SBram Moolenaar {'c', 'o', 0x2105},
1232071d4279SBram Moolenaar {'o', 'F', 0x2109},
1233071d4279SBram Moolenaar {'N', '0', 0x2116},
1234071d4279SBram Moolenaar {'P', 'O', 0x2117},
1235071d4279SBram Moolenaar {'R', 'x', 0x211e},
1236071d4279SBram Moolenaar {'S', 'M', 0x2120},
1237071d4279SBram Moolenaar {'T', 'M', 0x2122},
1238071d4279SBram Moolenaar {'O', 'm', 0x2126},
1239071d4279SBram Moolenaar {'A', 'O', 0x212b},
1240071d4279SBram Moolenaar {'1', '3', 0x2153},
1241071d4279SBram Moolenaar {'2', '3', 0x2154},
1242071d4279SBram Moolenaar {'1', '5', 0x2155},
1243071d4279SBram Moolenaar {'2', '5', 0x2156},
1244071d4279SBram Moolenaar {'3', '5', 0x2157},
1245071d4279SBram Moolenaar {'4', '5', 0x2158},
1246071d4279SBram Moolenaar {'1', '6', 0x2159},
1247071d4279SBram Moolenaar {'5', '6', 0x215a},
1248071d4279SBram Moolenaar {'1', '8', 0x215b},
1249071d4279SBram Moolenaar {'3', '8', 0x215c},
1250071d4279SBram Moolenaar {'5', '8', 0x215d},
1251071d4279SBram Moolenaar {'7', '8', 0x215e},
1252eae8ae1bSBram Moolenaar # define DG_START_ROMAN 0x2160
1253071d4279SBram Moolenaar {'1', 'R', 0x2160},
1254071d4279SBram Moolenaar {'2', 'R', 0x2161},
1255071d4279SBram Moolenaar {'3', 'R', 0x2162},
1256071d4279SBram Moolenaar {'4', 'R', 0x2163},
1257071d4279SBram Moolenaar {'5', 'R', 0x2164},
1258071d4279SBram Moolenaar {'6', 'R', 0x2165},
1259071d4279SBram Moolenaar {'7', 'R', 0x2166},
1260071d4279SBram Moolenaar {'8', 'R', 0x2167},
1261071d4279SBram Moolenaar {'9', 'R', 0x2168},
1262071d4279SBram Moolenaar {'a', 'R', 0x2169},
1263071d4279SBram Moolenaar {'b', 'R', 0x216a},
1264071d4279SBram Moolenaar {'c', 'R', 0x216b},
1265071d4279SBram Moolenaar {'1', 'r', 0x2170},
1266071d4279SBram Moolenaar {'2', 'r', 0x2171},
1267071d4279SBram Moolenaar {'3', 'r', 0x2172},
1268071d4279SBram Moolenaar {'4', 'r', 0x2173},
1269071d4279SBram Moolenaar {'5', 'r', 0x2174},
1270071d4279SBram Moolenaar {'6', 'r', 0x2175},
1271071d4279SBram Moolenaar {'7', 'r', 0x2176},
1272071d4279SBram Moolenaar {'8', 'r', 0x2177},
1273071d4279SBram Moolenaar {'9', 'r', 0x2178},
1274071d4279SBram Moolenaar {'a', 'r', 0x2179},
1275071d4279SBram Moolenaar {'b', 'r', 0x217a},
1276071d4279SBram Moolenaar {'c', 'r', 0x217b},
1277eae8ae1bSBram Moolenaar # define DG_START_ARROWS 0x2190
1278071d4279SBram Moolenaar {'<', '-', 0x2190},
1279071d4279SBram Moolenaar {'-', '!', 0x2191},
1280071d4279SBram Moolenaar {'-', '>', 0x2192},
1281071d4279SBram Moolenaar {'-', 'v', 0x2193},
1282071d4279SBram Moolenaar {'<', '>', 0x2194},
1283071d4279SBram Moolenaar {'U', 'D', 0x2195},
1284071d4279SBram Moolenaar {'<', '=', 0x21d0},
1285071d4279SBram Moolenaar {'=', '>', 0x21d2},
1286071d4279SBram Moolenaar {'=', '=', 0x21d4},
1287eae8ae1bSBram Moolenaar # define DG_START_MATH 0x2200
1288071d4279SBram Moolenaar {'F', 'A', 0x2200},
1289071d4279SBram Moolenaar {'d', 'P', 0x2202},
1290071d4279SBram Moolenaar {'T', 'E', 0x2203},
1291071d4279SBram Moolenaar {'/', '0', 0x2205},
1292071d4279SBram Moolenaar {'D', 'E', 0x2206},
1293071d4279SBram Moolenaar {'N', 'B', 0x2207},
1294071d4279SBram Moolenaar {'(', '-', 0x2208},
1295071d4279SBram Moolenaar {'-', ')', 0x220b},
1296071d4279SBram Moolenaar {'*', 'P', 0x220f},
1297071d4279SBram Moolenaar {'+', 'Z', 0x2211},
1298071d4279SBram Moolenaar {'-', '2', 0x2212},
1299071d4279SBram Moolenaar {'-', '+', 0x2213},
1300071d4279SBram Moolenaar {'*', '-', 0x2217},
1301071d4279SBram Moolenaar {'O', 'b', 0x2218},
1302071d4279SBram Moolenaar {'S', 'b', 0x2219},
1303071d4279SBram Moolenaar {'R', 'T', 0x221a},
1304071d4279SBram Moolenaar {'0', '(', 0x221d},
1305071d4279SBram Moolenaar {'0', '0', 0x221e},
1306071d4279SBram Moolenaar {'-', 'L', 0x221f},
1307071d4279SBram Moolenaar {'-', 'V', 0x2220},
1308071d4279SBram Moolenaar {'P', 'P', 0x2225},
1309071d4279SBram Moolenaar {'A', 'N', 0x2227},
1310071d4279SBram Moolenaar {'O', 'R', 0x2228},
1311071d4279SBram Moolenaar {'(', 'U', 0x2229},
1312071d4279SBram Moolenaar {')', 'U', 0x222a},
1313071d4279SBram Moolenaar {'I', 'n', 0x222b},
1314071d4279SBram Moolenaar {'D', 'I', 0x222c},
1315071d4279SBram Moolenaar {'I', 'o', 0x222e},
1316071d4279SBram Moolenaar {'.', ':', 0x2234},
1317071d4279SBram Moolenaar {':', '.', 0x2235},
1318071d4279SBram Moolenaar {':', 'R', 0x2236},
1319071d4279SBram Moolenaar {':', ':', 0x2237},
1320071d4279SBram Moolenaar {'?', '1', 0x223c},
1321071d4279SBram Moolenaar {'C', 'G', 0x223e},
1322071d4279SBram Moolenaar {'?', '-', 0x2243},
1323071d4279SBram Moolenaar {'?', '=', 0x2245},
1324071d4279SBram Moolenaar {'?', '2', 0x2248},
1325071d4279SBram Moolenaar {'=', '?', 0x224c},
1326071d4279SBram Moolenaar {'H', 'I', 0x2253},
1327071d4279SBram Moolenaar {'!', '=', 0x2260},
1328071d4279SBram Moolenaar {'=', '3', 0x2261},
1329071d4279SBram Moolenaar {'=', '<', 0x2264},
1330071d4279SBram Moolenaar {'>', '=', 0x2265},
1331071d4279SBram Moolenaar {'<', '*', 0x226a},
1332071d4279SBram Moolenaar {'*', '>', 0x226b},
1333071d4279SBram Moolenaar {'!', '<', 0x226e},
1334071d4279SBram Moolenaar {'!', '>', 0x226f},
1335071d4279SBram Moolenaar {'(', 'C', 0x2282},
1336071d4279SBram Moolenaar {')', 'C', 0x2283},
1337071d4279SBram Moolenaar {'(', '_', 0x2286},
1338071d4279SBram Moolenaar {')', '_', 0x2287},
1339071d4279SBram Moolenaar {'0', '.', 0x2299},
1340071d4279SBram Moolenaar {'0', '2', 0x229a},
1341071d4279SBram Moolenaar {'-', 'T', 0x22a5},
1342071d4279SBram Moolenaar {'.', 'P', 0x22c5},
1343071d4279SBram Moolenaar {':', '3', 0x22ee},
1344071d4279SBram Moolenaar {'.', '3', 0x22ef},
1345eae8ae1bSBram Moolenaar # define DG_START_TECHNICAL 0x2302
1346071d4279SBram Moolenaar {'E', 'h', 0x2302},
1347071d4279SBram Moolenaar {'<', '7', 0x2308},
1348071d4279SBram Moolenaar {'>', '7', 0x2309},
1349071d4279SBram Moolenaar {'7', '<', 0x230a},
1350071d4279SBram Moolenaar {'7', '>', 0x230b},
1351071d4279SBram Moolenaar {'N', 'I', 0x2310},
1352071d4279SBram Moolenaar {'(', 'A', 0x2312},
1353071d4279SBram Moolenaar {'T', 'R', 0x2315},
1354071d4279SBram Moolenaar {'I', 'u', 0x2320},
1355071d4279SBram Moolenaar {'I', 'l', 0x2321},
1356071d4279SBram Moolenaar {'<', '/', 0x2329},
1357071d4279SBram Moolenaar {'/', '>', 0x232a},
1358eae8ae1bSBram Moolenaar # define DG_START_OTHER2 0x2423
1359071d4279SBram Moolenaar {'V', 's', 0x2423},
1360071d4279SBram Moolenaar {'1', 'h', 0x2440},
1361071d4279SBram Moolenaar {'3', 'h', 0x2441},
1362071d4279SBram Moolenaar {'2', 'h', 0x2442},
1363071d4279SBram Moolenaar {'4', 'h', 0x2443},
1364071d4279SBram Moolenaar {'1', 'j', 0x2446},
1365071d4279SBram Moolenaar {'2', 'j', 0x2447},
1366071d4279SBram Moolenaar {'3', 'j', 0x2448},
1367071d4279SBram Moolenaar {'4', 'j', 0x2449},
1368071d4279SBram Moolenaar {'1', '.', 0x2488},
1369071d4279SBram Moolenaar {'2', '.', 0x2489},
1370071d4279SBram Moolenaar {'3', '.', 0x248a},
1371071d4279SBram Moolenaar {'4', '.', 0x248b},
1372071d4279SBram Moolenaar {'5', '.', 0x248c},
1373071d4279SBram Moolenaar {'6', '.', 0x248d},
1374071d4279SBram Moolenaar {'7', '.', 0x248e},
1375071d4279SBram Moolenaar {'8', '.', 0x248f},
1376071d4279SBram Moolenaar {'9', '.', 0x2490},
1377eae8ae1bSBram Moolenaar # define DG_START_DRAWING 0x2500
1378071d4279SBram Moolenaar {'h', 'h', 0x2500},
1379071d4279SBram Moolenaar {'H', 'H', 0x2501},
1380071d4279SBram Moolenaar {'v', 'v', 0x2502},
1381071d4279SBram Moolenaar {'V', 'V', 0x2503},
1382071d4279SBram Moolenaar {'3', '-', 0x2504},
1383071d4279SBram Moolenaar {'3', '_', 0x2505},
1384071d4279SBram Moolenaar {'3', '!', 0x2506},
1385071d4279SBram Moolenaar {'3', '/', 0x2507},
1386071d4279SBram Moolenaar {'4', '-', 0x2508},
1387071d4279SBram Moolenaar {'4', '_', 0x2509},
1388071d4279SBram Moolenaar {'4', '!', 0x250a},
1389071d4279SBram Moolenaar {'4', '/', 0x250b},
1390071d4279SBram Moolenaar {'d', 'r', 0x250c},
1391071d4279SBram Moolenaar {'d', 'R', 0x250d},
1392071d4279SBram Moolenaar {'D', 'r', 0x250e},
1393071d4279SBram Moolenaar {'D', 'R', 0x250f},
1394071d4279SBram Moolenaar {'d', 'l', 0x2510},
1395071d4279SBram Moolenaar {'d', 'L', 0x2511},
1396071d4279SBram Moolenaar {'D', 'l', 0x2512},
1397071d4279SBram Moolenaar {'L', 'D', 0x2513},
1398071d4279SBram Moolenaar {'u', 'r', 0x2514},
1399071d4279SBram Moolenaar {'u', 'R', 0x2515},
1400071d4279SBram Moolenaar {'U', 'r', 0x2516},
1401071d4279SBram Moolenaar {'U', 'R', 0x2517},
1402071d4279SBram Moolenaar {'u', 'l', 0x2518},
1403071d4279SBram Moolenaar {'u', 'L', 0x2519},
1404071d4279SBram Moolenaar {'U', 'l', 0x251a},
1405071d4279SBram Moolenaar {'U', 'L', 0x251b},
1406071d4279SBram Moolenaar {'v', 'r', 0x251c},
1407071d4279SBram Moolenaar {'v', 'R', 0x251d},
1408071d4279SBram Moolenaar {'V', 'r', 0x2520},
1409071d4279SBram Moolenaar {'V', 'R', 0x2523},
1410071d4279SBram Moolenaar {'v', 'l', 0x2524},
1411071d4279SBram Moolenaar {'v', 'L', 0x2525},
1412071d4279SBram Moolenaar {'V', 'l', 0x2528},
1413071d4279SBram Moolenaar {'V', 'L', 0x252b},
1414071d4279SBram Moolenaar {'d', 'h', 0x252c},
1415071d4279SBram Moolenaar {'d', 'H', 0x252f},
1416071d4279SBram Moolenaar {'D', 'h', 0x2530},
1417071d4279SBram Moolenaar {'D', 'H', 0x2533},
1418071d4279SBram Moolenaar {'u', 'h', 0x2534},
1419071d4279SBram Moolenaar {'u', 'H', 0x2537},
1420071d4279SBram Moolenaar {'U', 'h', 0x2538},
1421071d4279SBram Moolenaar {'U', 'H', 0x253b},
1422071d4279SBram Moolenaar {'v', 'h', 0x253c},
1423071d4279SBram Moolenaar {'v', 'H', 0x253f},
1424071d4279SBram Moolenaar {'V', 'h', 0x2542},
1425071d4279SBram Moolenaar {'V', 'H', 0x254b},
1426071d4279SBram Moolenaar {'F', 'D', 0x2571},
1427071d4279SBram Moolenaar {'B', 'D', 0x2572},
1428eae8ae1bSBram Moolenaar # define DG_START_BLOCK 0x2580
1429071d4279SBram Moolenaar {'T', 'B', 0x2580},
1430071d4279SBram Moolenaar {'L', 'B', 0x2584},
1431071d4279SBram Moolenaar {'F', 'B', 0x2588},
1432071d4279SBram Moolenaar {'l', 'B', 0x258c},
1433071d4279SBram Moolenaar {'R', 'B', 0x2590},
1434071d4279SBram Moolenaar {'.', 'S', 0x2591},
1435071d4279SBram Moolenaar {':', 'S', 0x2592},
1436071d4279SBram Moolenaar {'?', 'S', 0x2593},
1437eae8ae1bSBram Moolenaar # define DG_START_SHAPES 0x25a0
1438071d4279SBram Moolenaar {'f', 'S', 0x25a0},
1439071d4279SBram Moolenaar {'O', 'S', 0x25a1},
1440071d4279SBram Moolenaar {'R', 'O', 0x25a2},
1441071d4279SBram Moolenaar {'R', 'r', 0x25a3},
1442071d4279SBram Moolenaar {'R', 'F', 0x25a4},
1443071d4279SBram Moolenaar {'R', 'Y', 0x25a5},
1444071d4279SBram Moolenaar {'R', 'H', 0x25a6},
1445071d4279SBram Moolenaar {'R', 'Z', 0x25a7},
1446071d4279SBram Moolenaar {'R', 'K', 0x25a8},
1447071d4279SBram Moolenaar {'R', 'X', 0x25a9},
1448071d4279SBram Moolenaar {'s', 'B', 0x25aa},
1449071d4279SBram Moolenaar {'S', 'R', 0x25ac},
1450071d4279SBram Moolenaar {'O', 'r', 0x25ad},
1451071d4279SBram Moolenaar {'U', 'T', 0x25b2},
1452071d4279SBram Moolenaar {'u', 'T', 0x25b3},
1453071d4279SBram Moolenaar {'P', 'R', 0x25b6},
1454071d4279SBram Moolenaar {'T', 'r', 0x25b7},
1455071d4279SBram Moolenaar {'D', 't', 0x25bc},
1456071d4279SBram Moolenaar {'d', 'T', 0x25bd},
1457071d4279SBram Moolenaar {'P', 'L', 0x25c0},
1458071d4279SBram Moolenaar {'T', 'l', 0x25c1},
1459071d4279SBram Moolenaar {'D', 'b', 0x25c6},
1460071d4279SBram Moolenaar {'D', 'w', 0x25c7},
1461071d4279SBram Moolenaar {'L', 'Z', 0x25ca},
1462071d4279SBram Moolenaar {'0', 'm', 0x25cb},
1463071d4279SBram Moolenaar {'0', 'o', 0x25ce},
1464071d4279SBram Moolenaar {'0', 'M', 0x25cf},
1465071d4279SBram Moolenaar {'0', 'L', 0x25d0},
1466071d4279SBram Moolenaar {'0', 'R', 0x25d1},
1467071d4279SBram Moolenaar {'S', 'n', 0x25d8},
1468071d4279SBram Moolenaar {'I', 'c', 0x25d9},
1469071d4279SBram Moolenaar {'F', 'd', 0x25e2},
1470071d4279SBram Moolenaar {'B', 'd', 0x25e3},
1471eae8ae1bSBram Moolenaar # define DG_START_SYMBOLS 0x2605
1472071d4279SBram Moolenaar {'*', '2', 0x2605},
1473071d4279SBram Moolenaar {'*', '1', 0x2606},
1474071d4279SBram Moolenaar {'<', 'H', 0x261c},
1475071d4279SBram Moolenaar {'>', 'H', 0x261e},
1476071d4279SBram Moolenaar {'0', 'u', 0x263a},
1477071d4279SBram Moolenaar {'0', 'U', 0x263b},
1478071d4279SBram Moolenaar {'S', 'U', 0x263c},
1479071d4279SBram Moolenaar {'F', 'm', 0x2640},
1480071d4279SBram Moolenaar {'M', 'l', 0x2642},
1481071d4279SBram Moolenaar {'c', 'S', 0x2660},
1482071d4279SBram Moolenaar {'c', 'H', 0x2661},
1483071d4279SBram Moolenaar {'c', 'D', 0x2662},
1484071d4279SBram Moolenaar {'c', 'C', 0x2663},
1485071d4279SBram Moolenaar {'M', 'd', 0x2669},
1486071d4279SBram Moolenaar {'M', '8', 0x266a},
1487071d4279SBram Moolenaar {'M', '2', 0x266b},
1488071d4279SBram Moolenaar {'M', 'b', 0x266d},
1489071d4279SBram Moolenaar {'M', 'x', 0x266e},
1490071d4279SBram Moolenaar {'M', 'X', 0x266f},
1491eae8ae1bSBram Moolenaar # define DG_START_DINGBATS 0x2713
1492071d4279SBram Moolenaar {'O', 'K', 0x2713},
1493071d4279SBram Moolenaar {'X', 'X', 0x2717},
1494071d4279SBram Moolenaar {'-', 'X', 0x2720},
1495eae8ae1bSBram Moolenaar # define DG_START_CJK_SYMBOLS 0x3000
1496071d4279SBram Moolenaar {'I', 'S', 0x3000},
1497071d4279SBram Moolenaar {',', '_', 0x3001},
1498071d4279SBram Moolenaar {'.', '_', 0x3002},
1499071d4279SBram Moolenaar {'+', '"', 0x3003},
1500071d4279SBram Moolenaar {'+', '_', 0x3004},
1501071d4279SBram Moolenaar {'*', '_', 0x3005},
1502071d4279SBram Moolenaar {';', '_', 0x3006},
1503071d4279SBram Moolenaar {'0', '_', 0x3007},
1504071d4279SBram Moolenaar {'<', '+', 0x300a},
1505071d4279SBram Moolenaar {'>', '+', 0x300b},
1506071d4279SBram Moolenaar {'<', '\'', 0x300c},
1507071d4279SBram Moolenaar {'>', '\'', 0x300d},
1508071d4279SBram Moolenaar {'<', '"', 0x300e},
1509071d4279SBram Moolenaar {'>', '"', 0x300f},
1510071d4279SBram Moolenaar {'(', '"', 0x3010},
1511071d4279SBram Moolenaar {')', '"', 0x3011},
1512071d4279SBram Moolenaar {'=', 'T', 0x3012},
1513071d4279SBram Moolenaar {'=', '_', 0x3013},
1514071d4279SBram Moolenaar {'(', '\'', 0x3014},
1515071d4279SBram Moolenaar {')', '\'', 0x3015},
1516071d4279SBram Moolenaar {'(', 'I', 0x3016},
1517071d4279SBram Moolenaar {')', 'I', 0x3017},
1518071d4279SBram Moolenaar {'-', '?', 0x301c},
1519eae8ae1bSBram Moolenaar # define DG_START_HIRAGANA 0x3041
1520071d4279SBram Moolenaar {'A', '5', 0x3041},
1521071d4279SBram Moolenaar {'a', '5', 0x3042},
1522071d4279SBram Moolenaar {'I', '5', 0x3043},
1523071d4279SBram Moolenaar {'i', '5', 0x3044},
1524071d4279SBram Moolenaar {'U', '5', 0x3045},
1525071d4279SBram Moolenaar {'u', '5', 0x3046},
1526071d4279SBram Moolenaar {'E', '5', 0x3047},
1527071d4279SBram Moolenaar {'e', '5', 0x3048},
1528071d4279SBram Moolenaar {'O', '5', 0x3049},
1529071d4279SBram Moolenaar {'o', '5', 0x304a},
1530071d4279SBram Moolenaar {'k', 'a', 0x304b},
1531071d4279SBram Moolenaar {'g', 'a', 0x304c},
1532071d4279SBram Moolenaar {'k', 'i', 0x304d},
1533071d4279SBram Moolenaar {'g', 'i', 0x304e},
1534071d4279SBram Moolenaar {'k', 'u', 0x304f},
1535071d4279SBram Moolenaar {'g', 'u', 0x3050},
1536071d4279SBram Moolenaar {'k', 'e', 0x3051},
1537071d4279SBram Moolenaar {'g', 'e', 0x3052},
1538071d4279SBram Moolenaar {'k', 'o', 0x3053},
1539071d4279SBram Moolenaar {'g', 'o', 0x3054},
1540071d4279SBram Moolenaar {'s', 'a', 0x3055},
1541071d4279SBram Moolenaar {'z', 'a', 0x3056},
1542071d4279SBram Moolenaar {'s', 'i', 0x3057},
1543071d4279SBram Moolenaar {'z', 'i', 0x3058},
1544071d4279SBram Moolenaar {'s', 'u', 0x3059},
1545071d4279SBram Moolenaar {'z', 'u', 0x305a},
1546071d4279SBram Moolenaar {'s', 'e', 0x305b},
1547071d4279SBram Moolenaar {'z', 'e', 0x305c},
1548071d4279SBram Moolenaar {'s', 'o', 0x305d},
1549071d4279SBram Moolenaar {'z', 'o', 0x305e},
1550071d4279SBram Moolenaar {'t', 'a', 0x305f},
1551071d4279SBram Moolenaar {'d', 'a', 0x3060},
1552071d4279SBram Moolenaar {'t', 'i', 0x3061},
1553071d4279SBram Moolenaar {'d', 'i', 0x3062},
1554071d4279SBram Moolenaar {'t', 'U', 0x3063},
1555071d4279SBram Moolenaar {'t', 'u', 0x3064},
1556071d4279SBram Moolenaar {'d', 'u', 0x3065},
1557071d4279SBram Moolenaar {'t', 'e', 0x3066},
1558071d4279SBram Moolenaar {'d', 'e', 0x3067},
1559071d4279SBram Moolenaar {'t', 'o', 0x3068},
1560071d4279SBram Moolenaar {'d', 'o', 0x3069},
1561071d4279SBram Moolenaar {'n', 'a', 0x306a},
1562071d4279SBram Moolenaar {'n', 'i', 0x306b},
1563071d4279SBram Moolenaar {'n', 'u', 0x306c},
1564071d4279SBram Moolenaar {'n', 'e', 0x306d},
1565071d4279SBram Moolenaar {'n', 'o', 0x306e},
1566071d4279SBram Moolenaar {'h', 'a', 0x306f},
1567071d4279SBram Moolenaar {'b', 'a', 0x3070},
1568071d4279SBram Moolenaar {'p', 'a', 0x3071},
1569071d4279SBram Moolenaar {'h', 'i', 0x3072},
1570071d4279SBram Moolenaar {'b', 'i', 0x3073},
1571071d4279SBram Moolenaar {'p', 'i', 0x3074},
1572071d4279SBram Moolenaar {'h', 'u', 0x3075},
1573071d4279SBram Moolenaar {'b', 'u', 0x3076},
1574071d4279SBram Moolenaar {'p', 'u', 0x3077},
1575071d4279SBram Moolenaar {'h', 'e', 0x3078},
1576071d4279SBram Moolenaar {'b', 'e', 0x3079},
1577071d4279SBram Moolenaar {'p', 'e', 0x307a},
1578071d4279SBram Moolenaar {'h', 'o', 0x307b},
1579071d4279SBram Moolenaar {'b', 'o', 0x307c},
1580071d4279SBram Moolenaar {'p', 'o', 0x307d},
1581071d4279SBram Moolenaar {'m', 'a', 0x307e},
1582071d4279SBram Moolenaar {'m', 'i', 0x307f},
1583071d4279SBram Moolenaar {'m', 'u', 0x3080},
1584071d4279SBram Moolenaar {'m', 'e', 0x3081},
1585071d4279SBram Moolenaar {'m', 'o', 0x3082},
1586071d4279SBram Moolenaar {'y', 'A', 0x3083},
1587071d4279SBram Moolenaar {'y', 'a', 0x3084},
1588071d4279SBram Moolenaar {'y', 'U', 0x3085},
1589071d4279SBram Moolenaar {'y', 'u', 0x3086},
1590071d4279SBram Moolenaar {'y', 'O', 0x3087},
1591071d4279SBram Moolenaar {'y', 'o', 0x3088},
1592071d4279SBram Moolenaar {'r', 'a', 0x3089},
1593071d4279SBram Moolenaar {'r', 'i', 0x308a},
1594071d4279SBram Moolenaar {'r', 'u', 0x308b},
1595071d4279SBram Moolenaar {'r', 'e', 0x308c},
1596071d4279SBram Moolenaar {'r', 'o', 0x308d},
1597071d4279SBram Moolenaar {'w', 'A', 0x308e},
1598071d4279SBram Moolenaar {'w', 'a', 0x308f},
1599071d4279SBram Moolenaar {'w', 'i', 0x3090},
1600071d4279SBram Moolenaar {'w', 'e', 0x3091},
1601071d4279SBram Moolenaar {'w', 'o', 0x3092},
1602071d4279SBram Moolenaar {'n', '5', 0x3093},
1603071d4279SBram Moolenaar {'v', 'u', 0x3094},
1604071d4279SBram Moolenaar {'"', '5', 0x309b},
1605071d4279SBram Moolenaar {'0', '5', 0x309c},
1606071d4279SBram Moolenaar {'*', '5', 0x309d},
1607071d4279SBram Moolenaar {'+', '5', 0x309e},
1608eae8ae1bSBram Moolenaar # define DG_START_KATAKANA 0x30a1
1609071d4279SBram Moolenaar {'a', '6', 0x30a1},
1610071d4279SBram Moolenaar {'A', '6', 0x30a2},
1611071d4279SBram Moolenaar {'i', '6', 0x30a3},
1612071d4279SBram Moolenaar {'I', '6', 0x30a4},
1613071d4279SBram Moolenaar {'u', '6', 0x30a5},
1614071d4279SBram Moolenaar {'U', '6', 0x30a6},
1615071d4279SBram Moolenaar {'e', '6', 0x30a7},
1616071d4279SBram Moolenaar {'E', '6', 0x30a8},
1617071d4279SBram Moolenaar {'o', '6', 0x30a9},
1618071d4279SBram Moolenaar {'O', '6', 0x30aa},
1619071d4279SBram Moolenaar {'K', 'a', 0x30ab},
1620071d4279SBram Moolenaar {'G', 'a', 0x30ac},
1621071d4279SBram Moolenaar {'K', 'i', 0x30ad},
1622071d4279SBram Moolenaar {'G', 'i', 0x30ae},
1623071d4279SBram Moolenaar {'K', 'u', 0x30af},
1624071d4279SBram Moolenaar {'G', 'u', 0x30b0},
1625071d4279SBram Moolenaar {'K', 'e', 0x30b1},
1626071d4279SBram Moolenaar {'G', 'e', 0x30b2},
1627071d4279SBram Moolenaar {'K', 'o', 0x30b3},
1628071d4279SBram Moolenaar {'G', 'o', 0x30b4},
1629071d4279SBram Moolenaar {'S', 'a', 0x30b5},
1630071d4279SBram Moolenaar {'Z', 'a', 0x30b6},
1631071d4279SBram Moolenaar {'S', 'i', 0x30b7},
1632071d4279SBram Moolenaar {'Z', 'i', 0x30b8},
1633071d4279SBram Moolenaar {'S', 'u', 0x30b9},
1634071d4279SBram Moolenaar {'Z', 'u', 0x30ba},
1635071d4279SBram Moolenaar {'S', 'e', 0x30bb},
1636071d4279SBram Moolenaar {'Z', 'e', 0x30bc},
1637071d4279SBram Moolenaar {'S', 'o', 0x30bd},
1638071d4279SBram Moolenaar {'Z', 'o', 0x30be},
1639071d4279SBram Moolenaar {'T', 'a', 0x30bf},
1640071d4279SBram Moolenaar {'D', 'a', 0x30c0},
1641071d4279SBram Moolenaar {'T', 'i', 0x30c1},
1642071d4279SBram Moolenaar {'D', 'i', 0x30c2},
1643071d4279SBram Moolenaar {'T', 'U', 0x30c3},
1644071d4279SBram Moolenaar {'T', 'u', 0x30c4},
1645071d4279SBram Moolenaar {'D', 'u', 0x30c5},
1646071d4279SBram Moolenaar {'T', 'e', 0x30c6},
1647071d4279SBram Moolenaar {'D', 'e', 0x30c7},
1648071d4279SBram Moolenaar {'T', 'o', 0x30c8},
1649071d4279SBram Moolenaar {'D', 'o', 0x30c9},
1650071d4279SBram Moolenaar {'N', 'a', 0x30ca},
1651071d4279SBram Moolenaar {'N', 'i', 0x30cb},
1652071d4279SBram Moolenaar {'N', 'u', 0x30cc},
1653071d4279SBram Moolenaar {'N', 'e', 0x30cd},
1654071d4279SBram Moolenaar {'N', 'o', 0x30ce},
1655071d4279SBram Moolenaar {'H', 'a', 0x30cf},
1656071d4279SBram Moolenaar {'B', 'a', 0x30d0},
1657071d4279SBram Moolenaar {'P', 'a', 0x30d1},
1658071d4279SBram Moolenaar {'H', 'i', 0x30d2},
1659071d4279SBram Moolenaar {'B', 'i', 0x30d3},
1660071d4279SBram Moolenaar {'P', 'i', 0x30d4},
1661071d4279SBram Moolenaar {'H', 'u', 0x30d5},
1662071d4279SBram Moolenaar {'B', 'u', 0x30d6},
1663071d4279SBram Moolenaar {'P', 'u', 0x30d7},
1664071d4279SBram Moolenaar {'H', 'e', 0x30d8},
1665071d4279SBram Moolenaar {'B', 'e', 0x30d9},
1666071d4279SBram Moolenaar {'P', 'e', 0x30da},
1667071d4279SBram Moolenaar {'H', 'o', 0x30db},
1668071d4279SBram Moolenaar {'B', 'o', 0x30dc},
1669071d4279SBram Moolenaar {'P', 'o', 0x30dd},
1670071d4279SBram Moolenaar {'M', 'a', 0x30de},
1671071d4279SBram Moolenaar {'M', 'i', 0x30df},
1672071d4279SBram Moolenaar {'M', 'u', 0x30e0},
1673071d4279SBram Moolenaar {'M', 'e', 0x30e1},
1674071d4279SBram Moolenaar {'M', 'o', 0x30e2},
1675071d4279SBram Moolenaar {'Y', 'A', 0x30e3},
1676071d4279SBram Moolenaar {'Y', 'a', 0x30e4},
1677071d4279SBram Moolenaar {'Y', 'U', 0x30e5},
1678071d4279SBram Moolenaar {'Y', 'u', 0x30e6},
1679071d4279SBram Moolenaar {'Y', 'O', 0x30e7},
1680071d4279SBram Moolenaar {'Y', 'o', 0x30e8},
1681071d4279SBram Moolenaar {'R', 'a', 0x30e9},
1682071d4279SBram Moolenaar {'R', 'i', 0x30ea},
1683071d4279SBram Moolenaar {'R', 'u', 0x30eb},
1684071d4279SBram Moolenaar {'R', 'e', 0x30ec},
1685071d4279SBram Moolenaar {'R', 'o', 0x30ed},
1686071d4279SBram Moolenaar {'W', 'A', 0x30ee},
1687071d4279SBram Moolenaar {'W', 'a', 0x30ef},
1688071d4279SBram Moolenaar {'W', 'i', 0x30f0},
1689071d4279SBram Moolenaar {'W', 'e', 0x30f1},
1690071d4279SBram Moolenaar {'W', 'o', 0x30f2},
1691071d4279SBram Moolenaar {'N', '6', 0x30f3},
1692071d4279SBram Moolenaar {'V', 'u', 0x30f4},
1693071d4279SBram Moolenaar {'K', 'A', 0x30f5},
1694071d4279SBram Moolenaar {'K', 'E', 0x30f6},
1695071d4279SBram Moolenaar {'V', 'a', 0x30f7},
1696071d4279SBram Moolenaar {'V', 'i', 0x30f8},
1697071d4279SBram Moolenaar {'V', 'e', 0x30f9},
1698071d4279SBram Moolenaar {'V', 'o', 0x30fa},
1699071d4279SBram Moolenaar {'.', '6', 0x30fb},
1700071d4279SBram Moolenaar {'-', '6', 0x30fc},
1701071d4279SBram Moolenaar {'*', '6', 0x30fd},
1702071d4279SBram Moolenaar {'+', '6', 0x30fe},
1703eae8ae1bSBram Moolenaar # define DG_START_BOPOMOFO 0x3105
1704071d4279SBram Moolenaar {'b', '4', 0x3105},
1705071d4279SBram Moolenaar {'p', '4', 0x3106},
1706071d4279SBram Moolenaar {'m', '4', 0x3107},
1707071d4279SBram Moolenaar {'f', '4', 0x3108},
1708071d4279SBram Moolenaar {'d', '4', 0x3109},
1709071d4279SBram Moolenaar {'t', '4', 0x310a},
1710071d4279SBram Moolenaar {'n', '4', 0x310b},
1711071d4279SBram Moolenaar {'l', '4', 0x310c},
1712071d4279SBram Moolenaar {'g', '4', 0x310d},
1713071d4279SBram Moolenaar {'k', '4', 0x310e},
1714071d4279SBram Moolenaar {'h', '4', 0x310f},
1715071d4279SBram Moolenaar {'j', '4', 0x3110},
1716071d4279SBram Moolenaar {'q', '4', 0x3111},
1717071d4279SBram Moolenaar {'x', '4', 0x3112},
1718071d4279SBram Moolenaar {'z', 'h', 0x3113},
1719071d4279SBram Moolenaar {'c', 'h', 0x3114},
1720071d4279SBram Moolenaar {'s', 'h', 0x3115},
1721071d4279SBram Moolenaar {'r', '4', 0x3116},
1722071d4279SBram Moolenaar {'z', '4', 0x3117},
1723071d4279SBram Moolenaar {'c', '4', 0x3118},
1724071d4279SBram Moolenaar {'s', '4', 0x3119},
1725071d4279SBram Moolenaar {'a', '4', 0x311a},
1726071d4279SBram Moolenaar {'o', '4', 0x311b},
1727071d4279SBram Moolenaar {'e', '4', 0x311c},
1728071d4279SBram Moolenaar {'a', 'i', 0x311e},
1729071d4279SBram Moolenaar {'e', 'i', 0x311f},
1730071d4279SBram Moolenaar {'a', 'u', 0x3120},
1731071d4279SBram Moolenaar {'o', 'u', 0x3121},
1732071d4279SBram Moolenaar {'a', 'n', 0x3122},
1733071d4279SBram Moolenaar {'e', 'n', 0x3123},
1734071d4279SBram Moolenaar {'a', 'N', 0x3124},
1735071d4279SBram Moolenaar {'e', 'N', 0x3125},
1736071d4279SBram Moolenaar {'e', 'r', 0x3126},
1737071d4279SBram Moolenaar {'i', '4', 0x3127},
1738071d4279SBram Moolenaar {'u', '4', 0x3128},
1739071d4279SBram Moolenaar {'i', 'u', 0x3129},
1740071d4279SBram Moolenaar {'v', '4', 0x312a},
1741071d4279SBram Moolenaar {'n', 'G', 0x312b},
1742071d4279SBram Moolenaar {'g', 'n', 0x312c},
1743eae8ae1bSBram Moolenaar # define DG_START_OTHER3 0x3220
1744071d4279SBram Moolenaar {'1', 'c', 0x3220},
1745071d4279SBram Moolenaar {'2', 'c', 0x3221},
1746071d4279SBram Moolenaar {'3', 'c', 0x3222},
1747071d4279SBram Moolenaar {'4', 'c', 0x3223},
1748071d4279SBram Moolenaar {'5', 'c', 0x3224},
1749071d4279SBram Moolenaar {'6', 'c', 0x3225},
1750071d4279SBram Moolenaar {'7', 'c', 0x3226},
1751071d4279SBram Moolenaar {'8', 'c', 0x3227},
1752071d4279SBram Moolenaar {'9', 'c', 0x3228},
17535d18efecSBram Moolenaar // code points 0xe000 - 0xefff excluded, they have no assigned
17545d18efecSBram Moolenaar // characters, only used in proposals.
1755071d4279SBram Moolenaar {'f', 'f', 0xfb00},
1756071d4279SBram Moolenaar {'f', 'i', 0xfb01},
1757071d4279SBram Moolenaar {'f', 'l', 0xfb02},
1758071d4279SBram Moolenaar {'f', 't', 0xfb05},
1759071d4279SBram Moolenaar {'s', 't', 0xfb06},
17605f91c0caSBram Moolenaar
1761071d4279SBram Moolenaar {NUL, NUL, NUL}
1762071d4279SBram Moolenaar };
1763071d4279SBram Moolenaar
17645d18efecSBram Moolenaar # endif // OLD_DIGRAPHS
17655d18efecSBram Moolenaar # endif // EBCDIC
17665d18efecSBram Moolenaar #endif // !HPUX_DIGRAPHS
1767071d4279SBram Moolenaar
1768071d4279SBram Moolenaar /*
1769071d4279SBram Moolenaar * handle digraphs after typing a character
1770071d4279SBram Moolenaar */
1771071d4279SBram Moolenaar int
do_digraph(int c)17727454a06eSBram Moolenaar do_digraph(int c)
1773071d4279SBram Moolenaar {
17745d18efecSBram Moolenaar static int backspaced; // character before K_BS
17755d18efecSBram Moolenaar static int lastchar; // last typed character
1776071d4279SBram Moolenaar
17775d18efecSBram Moolenaar if (c == -1) // init values
1778071d4279SBram Moolenaar {
1779071d4279SBram Moolenaar backspaced = -1;
1780071d4279SBram Moolenaar }
1781071d4279SBram Moolenaar else if (p_dg)
1782071d4279SBram Moolenaar {
1783071d4279SBram Moolenaar if (backspaced >= 0)
178429b85715Sh-east c = digraph_get(backspaced, c, FALSE);
1785071d4279SBram Moolenaar backspaced = -1;
1786071d4279SBram Moolenaar if ((c == K_BS || c == Ctrl_H) && lastchar >= 0)
1787071d4279SBram Moolenaar backspaced = lastchar;
1788071d4279SBram Moolenaar }
1789071d4279SBram Moolenaar lastchar = c;
1790071d4279SBram Moolenaar return c;
1791071d4279SBram Moolenaar }
1792071d4279SBram Moolenaar
1793071d4279SBram Moolenaar /*
17945f73ef8dSBram Moolenaar * Find a digraph for "val". If found return the string to display it.
17955f73ef8dSBram Moolenaar * If not found return NULL.
17965f73ef8dSBram Moolenaar */
17975f73ef8dSBram Moolenaar char_u *
get_digraph_for_char(int val_arg)1798bc5020aaSBram Moolenaar get_digraph_for_char(int val_arg)
17995f73ef8dSBram Moolenaar {
1800bc5020aaSBram Moolenaar int val = val_arg;
18015f73ef8dSBram Moolenaar int i;
18025f73ef8dSBram Moolenaar int use_defaults;
18035f73ef8dSBram Moolenaar digr_T *dp;
18045f73ef8dSBram Moolenaar static char_u r[3];
18055f73ef8dSBram Moolenaar
1806eae8ae1bSBram Moolenaar #if defined(USE_UNICODE_DIGRAPHS)
1807bc5020aaSBram Moolenaar if (!enc_utf8)
1808bc5020aaSBram Moolenaar {
1809bc5020aaSBram Moolenaar char_u buf[6], *to;
1810bc5020aaSBram Moolenaar vimconv_T vc;
1811bc5020aaSBram Moolenaar
1812bc5020aaSBram Moolenaar // convert the character from 'encoding' to Unicode
1813bc5020aaSBram Moolenaar i = mb_char2bytes(val, buf);
1814bc5020aaSBram Moolenaar vc.vc_type = CONV_NONE;
1815bc5020aaSBram Moolenaar if (convert_setup(&vc, p_enc, (char_u *)"utf-8") == OK)
1816bc5020aaSBram Moolenaar {
1817bc5020aaSBram Moolenaar vc.vc_fail = TRUE;
1818bc5020aaSBram Moolenaar to = string_convert(&vc, buf, &i);
1819bc5020aaSBram Moolenaar if (to != NULL)
1820bc5020aaSBram Moolenaar {
1821bc5020aaSBram Moolenaar val = utf_ptr2char(to);
1822bc5020aaSBram Moolenaar vim_free(to);
1823bc5020aaSBram Moolenaar }
1824bc5020aaSBram Moolenaar (void)convert_setup(&vc, NULL, NULL);
1825bc5020aaSBram Moolenaar }
1826bc5020aaSBram Moolenaar }
1827bc5020aaSBram Moolenaar #endif
1828bc5020aaSBram Moolenaar
18295f73ef8dSBram Moolenaar for (use_defaults = 0; use_defaults <= 1; use_defaults++)
18305f73ef8dSBram Moolenaar {
18315f73ef8dSBram Moolenaar if (use_defaults == 0)
18325f73ef8dSBram Moolenaar dp = (digr_T *)user_digraphs.ga_data;
18335f73ef8dSBram Moolenaar else
18345f73ef8dSBram Moolenaar dp = digraphdefault;
18355f73ef8dSBram Moolenaar for (i = 0; use_defaults ? dp->char1 != NUL
18365f73ef8dSBram Moolenaar : i < user_digraphs.ga_len; ++i)
18375f73ef8dSBram Moolenaar {
18385f73ef8dSBram Moolenaar if (dp->result == val)
18395f73ef8dSBram Moolenaar {
18405f73ef8dSBram Moolenaar r[0] = dp->char1;
18415f73ef8dSBram Moolenaar r[1] = dp->char2;
18425f73ef8dSBram Moolenaar r[2] = NUL;
18435f73ef8dSBram Moolenaar return r;
18445f73ef8dSBram Moolenaar }
18455f73ef8dSBram Moolenaar ++dp;
18465f73ef8dSBram Moolenaar }
18475f73ef8dSBram Moolenaar }
18485f73ef8dSBram Moolenaar return NULL;
18495f73ef8dSBram Moolenaar }
18505f73ef8dSBram Moolenaar
18515f73ef8dSBram Moolenaar /*
1852071d4279SBram Moolenaar * Get a digraph. Used after typing CTRL-K on the command line or in normal
1853071d4279SBram Moolenaar * mode.
1854071d4279SBram Moolenaar * Returns composed character, or NUL when ESC was used.
1855071d4279SBram Moolenaar */
1856071d4279SBram Moolenaar int
get_digraph(int cmdline)18577454a06eSBram Moolenaar get_digraph(
18585d18efecSBram Moolenaar int cmdline) // TRUE when called from the cmdline
1859071d4279SBram Moolenaar {
1860071d4279SBram Moolenaar int c, cc;
1861071d4279SBram Moolenaar
1862071d4279SBram Moolenaar ++no_mapping;
1863071d4279SBram Moolenaar ++allow_keys;
186461abfd11SBram Moolenaar c = plain_vgetc();
1865071d4279SBram Moolenaar --no_mapping;
1866071d4279SBram Moolenaar --allow_keys;
18675d18efecSBram Moolenaar if (c != ESC) // ESC cancels CTRL-K
1868071d4279SBram Moolenaar {
18695d18efecSBram Moolenaar if (IS_SPECIAL(c)) // insert special key code
1870071d4279SBram Moolenaar return c;
1871071d4279SBram Moolenaar if (cmdline)
1872071d4279SBram Moolenaar {
1873071d4279SBram Moolenaar if (char2cells(c) == 1
1874071d4279SBram Moolenaar #if defined(FEAT_CRYPT) || defined(FEAT_EVAL)
1875071d4279SBram Moolenaar && cmdline_star == 0
1876071d4279SBram Moolenaar #endif
1877071d4279SBram Moolenaar )
1878071d4279SBram Moolenaar putcmdline(c, TRUE);
1879071d4279SBram Moolenaar }
1880071d4279SBram Moolenaar #ifdef FEAT_CMDL_INFO
1881071d4279SBram Moolenaar else
1882071d4279SBram Moolenaar add_to_showcmd(c);
1883071d4279SBram Moolenaar #endif
1884071d4279SBram Moolenaar ++no_mapping;
1885071d4279SBram Moolenaar ++allow_keys;
188661abfd11SBram Moolenaar cc = plain_vgetc();
1887071d4279SBram Moolenaar --no_mapping;
1888071d4279SBram Moolenaar --allow_keys;
18895d18efecSBram Moolenaar if (cc != ESC) // ESC cancels CTRL-K
189029b85715Sh-east return digraph_get(c, cc, TRUE);
1891071d4279SBram Moolenaar }
1892071d4279SBram Moolenaar return NUL;
1893071d4279SBram Moolenaar }
1894071d4279SBram Moolenaar
1895071d4279SBram Moolenaar /*
1896071d4279SBram Moolenaar * Lookup the pair "char1", "char2" in the digraph tables.
1897071d4279SBram Moolenaar * If no match, return "char2".
189870b2a56dSBram Moolenaar * If "meta_char" is TRUE and "char1" is a space, return "char2" | 0x80.
1899071d4279SBram Moolenaar */
1900071d4279SBram Moolenaar static int
getexactdigraph(int char1,int char2,int meta_char)19017454a06eSBram Moolenaar getexactdigraph(int char1, int char2, int meta_char)
1902071d4279SBram Moolenaar {
1903071d4279SBram Moolenaar int i;
1904071d4279SBram Moolenaar int retval = 0;
1905071d4279SBram Moolenaar digr_T *dp;
1906071d4279SBram Moolenaar
1907071d4279SBram Moolenaar if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
1908071d4279SBram Moolenaar return char2;
1909071d4279SBram Moolenaar
1910071d4279SBram Moolenaar /*
1911071d4279SBram Moolenaar * Search user digraphs first.
1912071d4279SBram Moolenaar */
1913071d4279SBram Moolenaar dp = (digr_T *)user_digraphs.ga_data;
1914071d4279SBram Moolenaar for (i = 0; i < user_digraphs.ga_len; ++i)
1915071d4279SBram Moolenaar {
1916071d4279SBram Moolenaar if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1917071d4279SBram Moolenaar {
1918071d4279SBram Moolenaar retval = dp->result;
1919071d4279SBram Moolenaar break;
1920071d4279SBram Moolenaar }
1921071d4279SBram Moolenaar ++dp;
1922071d4279SBram Moolenaar }
1923071d4279SBram Moolenaar
1924071d4279SBram Moolenaar /*
1925071d4279SBram Moolenaar * Search default digraphs.
1926071d4279SBram Moolenaar */
1927071d4279SBram Moolenaar if (retval == 0)
1928071d4279SBram Moolenaar {
1929071d4279SBram Moolenaar dp = digraphdefault;
1930071d4279SBram Moolenaar for (i = 0; dp->char1 != 0; ++i)
1931071d4279SBram Moolenaar {
1932071d4279SBram Moolenaar if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
1933071d4279SBram Moolenaar {
1934071d4279SBram Moolenaar retval = dp->result;
1935071d4279SBram Moolenaar break;
1936071d4279SBram Moolenaar }
1937071d4279SBram Moolenaar ++dp;
1938071d4279SBram Moolenaar }
1939071d4279SBram Moolenaar }
1940071d4279SBram Moolenaar #ifdef USE_UNICODE_DIGRAPHS
1941071d4279SBram Moolenaar if (retval != 0 && !enc_utf8)
1942071d4279SBram Moolenaar {
1943071d4279SBram Moolenaar char_u buf[6], *to;
1944071d4279SBram Moolenaar vimconv_T vc;
1945071d4279SBram Moolenaar
1946071d4279SBram Moolenaar /*
1947071d4279SBram Moolenaar * Convert the Unicode digraph to 'encoding'.
1948071d4279SBram Moolenaar */
1949071d4279SBram Moolenaar i = utf_char2bytes(retval, buf);
1950071d4279SBram Moolenaar retval = 0;
1951071d4279SBram Moolenaar vc.vc_type = CONV_NONE;
1952071d4279SBram Moolenaar if (convert_setup(&vc, (char_u *)"utf-8", p_enc) == OK)
1953071d4279SBram Moolenaar {
1954071d4279SBram Moolenaar vc.vc_fail = TRUE;
1955071d4279SBram Moolenaar to = string_convert(&vc, buf, &i);
1956071d4279SBram Moolenaar if (to != NULL)
1957071d4279SBram Moolenaar {
1958071d4279SBram Moolenaar retval = (*mb_ptr2char)(to);
1959071d4279SBram Moolenaar vim_free(to);
1960071d4279SBram Moolenaar }
1961071d4279SBram Moolenaar (void)convert_setup(&vc, NULL, NULL);
1962071d4279SBram Moolenaar }
1963071d4279SBram Moolenaar }
1964071d4279SBram Moolenaar #endif
1965071d4279SBram Moolenaar
19665d18efecSBram Moolenaar // Ignore multi-byte characters when not in multi-byte mode.
1967071d4279SBram Moolenaar if (!has_mbyte && retval > 0xff)
1968071d4279SBram Moolenaar retval = 0;
1969071d4279SBram Moolenaar
19705d18efecSBram Moolenaar if (retval == 0) // digraph deleted or not found
1971071d4279SBram Moolenaar {
19725d18efecSBram Moolenaar if (char1 == ' ' && meta_char) // <space> <char> --> meta-char
1973071d4279SBram Moolenaar return (char2 | 0x80);
1974071d4279SBram Moolenaar return char2;
1975071d4279SBram Moolenaar }
1976071d4279SBram Moolenaar return retval;
1977071d4279SBram Moolenaar }
1978071d4279SBram Moolenaar
1979071d4279SBram Moolenaar /*
1980071d4279SBram Moolenaar * Get digraph.
1981071d4279SBram Moolenaar * Allow for both char1-char2 and char2-char1
1982071d4279SBram Moolenaar */
1983071d4279SBram Moolenaar int
digraph_get(int char1,int char2,int meta_char)198429b85715Sh-east digraph_get(int char1, int char2, int meta_char)
1985071d4279SBram Moolenaar {
1986071d4279SBram Moolenaar int retval;
1987071d4279SBram Moolenaar
198870b2a56dSBram Moolenaar if (((retval = getexactdigraph(char1, char2, meta_char)) == char2)
1989071d4279SBram Moolenaar && (char1 != char2)
199070b2a56dSBram Moolenaar && ((retval = getexactdigraph(char2, char1, meta_char)) == char1))
1991071d4279SBram Moolenaar return char2;
1992071d4279SBram Moolenaar return retval;
1993071d4279SBram Moolenaar }
1994071d4279SBram Moolenaar
1995071d4279SBram Moolenaar /*
19966106504eSmityu * Add a digraph to the digraph table.
1997071d4279SBram Moolenaar */
19986106504eSmityu static void
registerdigraph(int char1,int char2,int n)19996106504eSmityu registerdigraph(int char1, int char2, int n)
2000071d4279SBram Moolenaar {
2001071d4279SBram Moolenaar int i;
2002071d4279SBram Moolenaar digr_T *dp;
2003071d4279SBram Moolenaar
20046106504eSmityu // If the digraph already exists, replace "result".
2005071d4279SBram Moolenaar dp = (digr_T *)user_digraphs.ga_data;
2006071d4279SBram Moolenaar for (i = 0; i < user_digraphs.ga_len; ++i)
2007071d4279SBram Moolenaar {
2008071d4279SBram Moolenaar if ((int)dp->char1 == char1 && (int)dp->char2 == char2)
2009071d4279SBram Moolenaar {
2010071d4279SBram Moolenaar dp->result = n;
20116106504eSmityu return;
2012071d4279SBram Moolenaar }
2013071d4279SBram Moolenaar ++dp;
2014071d4279SBram Moolenaar }
2015071d4279SBram Moolenaar
20165d18efecSBram Moolenaar // Add a new digraph to the table.
2017071d4279SBram Moolenaar if (ga_grow(&user_digraphs, 1) == OK)
2018071d4279SBram Moolenaar {
2019071d4279SBram Moolenaar dp = (digr_T *)user_digraphs.ga_data + user_digraphs.ga_len;
2020071d4279SBram Moolenaar dp->char1 = char1;
2021071d4279SBram Moolenaar dp->char2 = char2;
2022071d4279SBram Moolenaar dp->result = n;
2023071d4279SBram Moolenaar ++user_digraphs.ga_len;
2024071d4279SBram Moolenaar }
2025071d4279SBram Moolenaar }
20266106504eSmityu
20276106504eSmityu /*
20286106504eSmityu * Check the characters are valid for a digraph.
20296106504eSmityu * If they are valid, returns TRUE; otherwise, give an error message and
20306106504eSmityu * returns FALSE.
20316106504eSmityu */
20328ee52affSYegappan Lakshmanan static int
check_digraph_chars_valid(int char1,int char2)20336106504eSmityu check_digraph_chars_valid(int char1, int char2)
20346106504eSmityu {
20356106504eSmityu if (char2 == 0)
20366106504eSmityu {
20376106504eSmityu char_u msg[MB_MAXBYTES + 1];
20386106504eSmityu
20396106504eSmityu msg[mb_char2bytes(char1, msg)] = NUL;
20406106504eSmityu
20416106504eSmityu semsg(_(e_digraph_must_be_just_two_characters_str), msg);
20426106504eSmityu return FALSE;
20436106504eSmityu }
20446106504eSmityu if (char1 == ESC || char2 == ESC)
20456106504eSmityu {
20466106504eSmityu emsg(_("E104: Escape not allowed in digraph"));
20476106504eSmityu return FALSE;
20486106504eSmityu }
20496106504eSmityu return TRUE;
20506106504eSmityu }
20516106504eSmityu
20526106504eSmityu
20536106504eSmityu
20546106504eSmityu /*
20556106504eSmityu * Add the digraphs in the argument to the digraph table.
20566106504eSmityu * format: {c1}{c2} char {c1}{c2} char ...
20576106504eSmityu */
20586106504eSmityu void
putdigraph(char_u * str)20596106504eSmityu putdigraph(char_u *str)
20606106504eSmityu {
20616106504eSmityu int char1, char2, n;
20626106504eSmityu
20636106504eSmityu while (*str != NUL)
20646106504eSmityu {
20656106504eSmityu str = skipwhite(str);
20666106504eSmityu if (*str == NUL)
20676106504eSmityu return;
20686106504eSmityu char1 = *str++;
20696106504eSmityu char2 = *str++;
20706106504eSmityu
20716106504eSmityu if (!check_digraph_chars_valid(char1, char2))
20726106504eSmityu return;
20736106504eSmityu
20746106504eSmityu str = skipwhite(str);
20756106504eSmityu if (!VIM_ISDIGIT(*str))
20766106504eSmityu {
2077e29a27f6SBram Moolenaar emsg(_(e_number_expected));
20786106504eSmityu return;
20796106504eSmityu }
20806106504eSmityu n = getdigits(&str);
20816106504eSmityu
20826106504eSmityu registerdigraph(char1, char2, n);
2083071d4279SBram Moolenaar }
2084071d4279SBram Moolenaar }
2085071d4279SBram Moolenaar
2086eae8ae1bSBram Moolenaar #if defined(USE_UNICODE_DIGRAPHS)
2087eae8ae1bSBram Moolenaar static void
digraph_header(char * msg)2088eae8ae1bSBram Moolenaar digraph_header(char *msg)
2089eae8ae1bSBram Moolenaar {
2090eae8ae1bSBram Moolenaar if (msg_col > 0)
2091eae8ae1bSBram Moolenaar msg_putchar('\n');
2092eae8ae1bSBram Moolenaar msg_outtrans_attr((char_u *)msg, HL_ATTR(HLF_CM));
2093eae8ae1bSBram Moolenaar msg_putchar('\n');
2094eae8ae1bSBram Moolenaar }
2095eae8ae1bSBram Moolenaar #endif
2096eae8ae1bSBram Moolenaar
2097071d4279SBram Moolenaar void
listdigraphs(int use_headers)2098eae8ae1bSBram Moolenaar listdigraphs(int use_headers)
2099071d4279SBram Moolenaar {
2100071d4279SBram Moolenaar int i;
2101071d4279SBram Moolenaar digr_T *dp;
2102eae8ae1bSBram Moolenaar result_T previous = 0;
2103071d4279SBram Moolenaar
2104071d4279SBram Moolenaar msg_putchar('\n');
2105071d4279SBram Moolenaar
2106071d4279SBram Moolenaar dp = digraphdefault;
2107071d4279SBram Moolenaar for (i = 0; dp->char1 != NUL && !got_int; ++i)
2108071d4279SBram Moolenaar {
2109eae8ae1bSBram Moolenaar #if defined(USE_UNICODE_DIGRAPHS)
2110071d4279SBram Moolenaar digr_T tmp;
2111071d4279SBram Moolenaar
21125d18efecSBram Moolenaar // May need to convert the result to 'encoding'.
2113071d4279SBram Moolenaar tmp.char1 = dp->char1;
2114071d4279SBram Moolenaar tmp.char2 = dp->char2;
2115071d4279SBram Moolenaar tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
2116071d4279SBram Moolenaar if (tmp.result != 0 && tmp.result != tmp.char2
2117071d4279SBram Moolenaar && (has_mbyte || tmp.result <= 255))
2118eae8ae1bSBram Moolenaar printdigraph(&tmp, use_headers ? &previous : NULL);
2119071d4279SBram Moolenaar #else
2120071d4279SBram Moolenaar
2121071d4279SBram Moolenaar if (getexactdigraph(dp->char1, dp->char2, FALSE) == dp->result
212213505972SBram Moolenaar && (has_mbyte || dp->result <= 255))
2123eae8ae1bSBram Moolenaar printdigraph(dp, use_headers ? &previous : NULL);
2124071d4279SBram Moolenaar #endif
2125071d4279SBram Moolenaar ++dp;
2126071d4279SBram Moolenaar ui_breakcheck();
2127071d4279SBram Moolenaar }
2128071d4279SBram Moolenaar
2129071d4279SBram Moolenaar dp = (digr_T *)user_digraphs.ga_data;
2130071d4279SBram Moolenaar for (i = 0; i < user_digraphs.ga_len && !got_int; ++i)
2131071d4279SBram Moolenaar {
2132eae8ae1bSBram Moolenaar #if defined(USE_UNICODE_DIGRAPHS)
2133eae8ae1bSBram Moolenaar if (previous >= 0 && use_headers)
2134eae8ae1bSBram Moolenaar digraph_header(_("Custom"));
2135eae8ae1bSBram Moolenaar previous = -1;
2136eae8ae1bSBram Moolenaar #endif
2137eae8ae1bSBram Moolenaar printdigraph(dp, NULL);
2138071d4279SBram Moolenaar ui_breakcheck();
2139071d4279SBram Moolenaar ++dp;
2140071d4279SBram Moolenaar }
21415d18efecSBram Moolenaar must_redraw = CLEAR; // clear screen, because some digraphs may be
21425d18efecSBram Moolenaar // wrong, in which case we messed up ScreenLines
2143071d4279SBram Moolenaar }
2144071d4279SBram Moolenaar
21456106504eSmityu static void
digraph_getlist_appendpair(digr_T * dp,list_T * l)214629b85715Sh-east digraph_getlist_appendpair(digr_T *dp, list_T *l)
21476106504eSmityu {
21486106504eSmityu char_u buf[30];
21496106504eSmityu char_u *p;
21506106504eSmityu list_T *l2;
21516106504eSmityu listitem_T *li, *li2;
21526106504eSmityu
21536106504eSmityu
21546106504eSmityu li = listitem_alloc();
21556106504eSmityu if (li == NULL)
21566106504eSmityu return;
21576106504eSmityu list_append(l, li);
21586106504eSmityu li->li_tv.v_type = VAR_LIST;
21596106504eSmityu li->li_tv.v_lock = 0;
21606106504eSmityu
21616106504eSmityu l2 = list_alloc();
21626106504eSmityu li->li_tv.vval.v_list = l2;
21636106504eSmityu if (l2 == NULL)
21646106504eSmityu return;
21656106504eSmityu ++l2->lv_refcount;
21666106504eSmityu
21676106504eSmityu li2 = listitem_alloc();
21686106504eSmityu if (li2 == NULL)
21696106504eSmityu return;
21706106504eSmityu list_append(l2, li2);
21716106504eSmityu li2->li_tv.v_type = VAR_STRING;
21726106504eSmityu li2->li_tv.v_lock = 0;
21736106504eSmityu
21746106504eSmityu buf[0] = dp->char1;
21756106504eSmityu buf[1] = dp->char2;
21766106504eSmityu buf[2] = NUL;
21776106504eSmityu li2->li_tv.vval.v_string = vim_strsave(&buf[0]);
21786106504eSmityu
21796106504eSmityu li2 = listitem_alloc();
21806106504eSmityu if (li2 == NULL)
21816106504eSmityu return;
21826106504eSmityu list_append(l2, li2);
21836106504eSmityu li2->li_tv.v_type = VAR_STRING;
21846106504eSmityu li2->li_tv.v_lock = 0;
21856106504eSmityu
21866106504eSmityu p = buf;
21876106504eSmityu if (has_mbyte)
21886106504eSmityu p += (*mb_char2bytes)(dp->result, p);
21896106504eSmityu else
21906106504eSmityu *p++ = (char_u)dp->result;
21916106504eSmityu *p = NUL;
21926106504eSmityu
21936106504eSmityu li2->li_tv.vval.v_string = vim_strsave(buf);
21946106504eSmityu }
21956106504eSmityu
21968ee52affSYegappan Lakshmanan static void
digraph_getlist_common(int list_all,typval_T * rettv)219729b85715Sh-east digraph_getlist_common(int list_all, typval_T *rettv)
21986106504eSmityu {
21996106504eSmityu int i;
22006106504eSmityu digr_T *dp;
22016106504eSmityu
22026106504eSmityu if (rettv_list_alloc(rettv) == FAIL)
22036106504eSmityu return;
22046106504eSmityu
22056106504eSmityu if (list_all)
22066106504eSmityu {
22076106504eSmityu dp = digraphdefault;
22086106504eSmityu for (i = 0; dp->char1 != NUL && !got_int; ++i)
22096106504eSmityu {
22106106504eSmityu #ifdef USE_UNICODE_DIGRAPHS
22116106504eSmityu digr_T tmp;
22126106504eSmityu
22136106504eSmityu tmp.char1 = dp->char1;
22146106504eSmityu tmp.char2 = dp->char2;
22156106504eSmityu tmp.result = getexactdigraph(tmp.char1, tmp.char2, FALSE);
22166106504eSmityu if (tmp.result != 0 && tmp.result != tmp.char2
22176106504eSmityu && (has_mbyte || tmp.result <= 255))
221829b85715Sh-east digraph_getlist_appendpair(&tmp, rettv->vval.v_list);
22196106504eSmityu #else
22206106504eSmityu if (getexactdigraph(dp->char1, dp->char2, FALSE) == dp->result
22216106504eSmityu && (has_mbyte || dp->result <= 255))
222229b85715Sh-east digraph_getlist_appendpair(dp, rettv->vval.v_list);
22236106504eSmityu #endif
22246106504eSmityu ++dp;
22256106504eSmityu }
22266106504eSmityu }
22276106504eSmityu
22286106504eSmityu dp = (digr_T *)user_digraphs.ga_data;
22296106504eSmityu for (i = 0; i < user_digraphs.ga_len && !got_int; ++i)
22306106504eSmityu {
223129b85715Sh-east digraph_getlist_appendpair(dp, rettv->vval.v_list);
22326106504eSmityu ++dp;
22336106504eSmityu }
22346106504eSmityu }
22356106504eSmityu
22365843f5f3SBram Moolenaar static struct dg_header_entry {
2237eae8ae1bSBram Moolenaar int dg_start;
2238eae8ae1bSBram Moolenaar char *dg_header;
2239eae8ae1bSBram Moolenaar } header_table[] = {
2240eae8ae1bSBram Moolenaar {DG_START_LATIN, N_("Latin supplement")},
2241eae8ae1bSBram Moolenaar {DG_START_GREEK, N_("Greek and Coptic")},
2242eae8ae1bSBram Moolenaar {DG_START_CYRILLIC, N_("Cyrillic")},
2243eae8ae1bSBram Moolenaar {DG_START_HEBREW, N_("Hebrew")},
2244eae8ae1bSBram Moolenaar {DG_START_ARABIC, N_("Arabic")},
2245eae8ae1bSBram Moolenaar {DG_START_LATIN_EXTENDED, N_("Latin extended")},
2246eae8ae1bSBram Moolenaar {DG_START_GREEK_EXTENDED, N_("Greek extended")},
2247eae8ae1bSBram Moolenaar {DG_START_PUNCTUATION, N_("Punctuation")},
2248eae8ae1bSBram Moolenaar {DG_START_SUB_SUPER, N_("Super- and subscripts")},
2249eae8ae1bSBram Moolenaar {DG_START_CURRENCY, N_("Currency")},
2250eae8ae1bSBram Moolenaar {DG_START_OTHER1, N_("Other")},
2251eae8ae1bSBram Moolenaar {DG_START_ROMAN, N_("Roman numbers")},
2252eae8ae1bSBram Moolenaar {DG_START_ARROWS, N_("Arrows")},
2253eae8ae1bSBram Moolenaar {DG_START_MATH, N_("Mathematical operators")},
2254eae8ae1bSBram Moolenaar {DG_START_TECHNICAL, N_("Technical")},
2255eae8ae1bSBram Moolenaar {DG_START_OTHER2, N_("Other")},
2256eae8ae1bSBram Moolenaar {DG_START_DRAWING, N_("Box drawing")},
2257eae8ae1bSBram Moolenaar {DG_START_BLOCK, N_("Block elements")},
2258eae8ae1bSBram Moolenaar {DG_START_SHAPES, N_("Geometric shapes")},
2259eae8ae1bSBram Moolenaar {DG_START_SYMBOLS, N_("Symbols")},
2260eae8ae1bSBram Moolenaar {DG_START_DINGBATS, N_("Dingbats")},
2261eae8ae1bSBram Moolenaar {DG_START_CJK_SYMBOLS, N_("CJK symbols and punctuation")},
2262eae8ae1bSBram Moolenaar {DG_START_HIRAGANA, N_("Hiragana")},
2263eae8ae1bSBram Moolenaar {DG_START_KATAKANA, N_("Katakana")},
2264eae8ae1bSBram Moolenaar {DG_START_BOPOMOFO, N_("Bopomofo")},
2265eae8ae1bSBram Moolenaar {DG_START_OTHER3, N_("Other")},
2266eae8ae1bSBram Moolenaar {0xfffffff, NULL},
2267eae8ae1bSBram Moolenaar };
2268eae8ae1bSBram Moolenaar
2269071d4279SBram Moolenaar static void
printdigraph(digr_T * dp,result_T * previous)2270eae8ae1bSBram Moolenaar printdigraph(digr_T *dp, result_T *previous)
2271071d4279SBram Moolenaar {
2272071d4279SBram Moolenaar char_u buf[30];
2273071d4279SBram Moolenaar char_u *p;
2274071d4279SBram Moolenaar
2275071d4279SBram Moolenaar int list_width;
2276071d4279SBram Moolenaar
227713505972SBram Moolenaar if ((dy_flags & DY_UHEX) || has_mbyte)
2278071d4279SBram Moolenaar list_width = 13;
2279071d4279SBram Moolenaar else
2280071d4279SBram Moolenaar list_width = 11;
2281071d4279SBram Moolenaar
2282071d4279SBram Moolenaar if (dp->result != 0)
2283071d4279SBram Moolenaar {
2284eae8ae1bSBram Moolenaar #if defined(USE_UNICODE_DIGRAPHS)
2285eae8ae1bSBram Moolenaar if (previous != NULL)
2286eae8ae1bSBram Moolenaar {
2287eae8ae1bSBram Moolenaar int i;
2288eae8ae1bSBram Moolenaar
2289eae8ae1bSBram Moolenaar for (i = 0; header_table[i].dg_header != NULL; ++i)
2290eae8ae1bSBram Moolenaar if (*previous < header_table[i].dg_start
2291eae8ae1bSBram Moolenaar && dp->result >= header_table[i].dg_start
2292eae8ae1bSBram Moolenaar && dp->result < header_table[i + 1].dg_start)
2293eae8ae1bSBram Moolenaar {
2294eae8ae1bSBram Moolenaar digraph_header(_(header_table[i].dg_header));
2295eae8ae1bSBram Moolenaar break;
2296eae8ae1bSBram Moolenaar }
2297eae8ae1bSBram Moolenaar *previous = dp->result;
2298eae8ae1bSBram Moolenaar }
2299eae8ae1bSBram Moolenaar #endif
2300071d4279SBram Moolenaar if (msg_col > Columns - list_width)
2301071d4279SBram Moolenaar msg_putchar('\n');
2302071d4279SBram Moolenaar if (msg_col)
2303071d4279SBram Moolenaar while (msg_col % list_width != 0)
2304071d4279SBram Moolenaar msg_putchar(' ');
2305071d4279SBram Moolenaar
2306071d4279SBram Moolenaar p = buf;
2307071d4279SBram Moolenaar *p++ = dp->char1;
2308071d4279SBram Moolenaar *p++ = dp->char2;
2309071d4279SBram Moolenaar *p++ = ' ';
2310eae8ae1bSBram Moolenaar *p = NUL;
2311eae8ae1bSBram Moolenaar msg_outtrans(buf);
2312eae8ae1bSBram Moolenaar p = buf;
2313071d4279SBram Moolenaar if (has_mbyte)
2314071d4279SBram Moolenaar {
23155d18efecSBram Moolenaar // add a space to draw a composing char on
2316071d4279SBram Moolenaar if (enc_utf8 && utf_iscomposing(dp->result))
2317071d4279SBram Moolenaar *p++ = ' ';
2318071d4279SBram Moolenaar p += (*mb_char2bytes)(dp->result, p);
2319071d4279SBram Moolenaar }
2320071d4279SBram Moolenaar else
23210ab2a887SBram Moolenaar *p++ = (char_u)dp->result;
2322eae8ae1bSBram Moolenaar *p = NUL;
2323eae8ae1bSBram Moolenaar msg_outtrans_attr(buf, HL_ATTR(HLF_8));
2324eae8ae1bSBram Moolenaar p = buf;
2325071d4279SBram Moolenaar if (char2cells(dp->result) == 1)
2326071d4279SBram Moolenaar *p++ = ' ';
23270ab2a887SBram Moolenaar vim_snprintf((char *)p, sizeof(buf) - (p - buf), " %3d", dp->result);
2328071d4279SBram Moolenaar msg_outtrans(buf);
2329071d4279SBram Moolenaar }
2330071d4279SBram Moolenaar }
2331071d4279SBram Moolenaar
23326106504eSmityu # ifdef FEAT_EVAL
23336106504eSmityu /*
23346106504eSmityu * Get the two digraph characters from a typval.
23356106504eSmityu * Return OK or FAIL.
23366106504eSmityu */
23376106504eSmityu static int
get_digraph_chars(typval_T * arg,int * char1,int * char2)23386106504eSmityu get_digraph_chars(typval_T *arg, int *char1, int *char2)
23396106504eSmityu {
23406106504eSmityu char_u buf_chars[NUMBUFLEN];
23416106504eSmityu char_u *chars = tv_get_string_buf_chk(arg, buf_chars);
23426106504eSmityu char_u *p = chars;
23436106504eSmityu
23446106504eSmityu if (p != NULL)
23456106504eSmityu {
23466106504eSmityu if (*p != NUL)
23476106504eSmityu {
23486106504eSmityu *char1 = mb_cptr2char_adv(&p);
23496106504eSmityu if (*p != NUL)
23506106504eSmityu {
23516106504eSmityu *char2 = mb_cptr2char_adv(&p);
23526106504eSmityu if (*p == NUL)
23536106504eSmityu {
23546106504eSmityu if (check_digraph_chars_valid(*char1, *char2))
23556106504eSmityu return OK;
23566106504eSmityu return FAIL;
23576106504eSmityu }
23586106504eSmityu }
23596106504eSmityu }
23606106504eSmityu }
23616106504eSmityu semsg(_(e_digraph_must_be_just_two_characters_str), chars);
23626106504eSmityu return FAIL;
23636106504eSmityu }
23646106504eSmityu
23656106504eSmityu static int
digraph_set_common(typval_T * argchars,typval_T * argdigraph)236629b85715Sh-east digraph_set_common(typval_T *argchars, typval_T *argdigraph)
23676106504eSmityu {
23686106504eSmityu int char1, char2;
23696106504eSmityu char_u *digraph;
23706106504eSmityu char_u *p;
23716106504eSmityu char_u buf_digraph[NUMBUFLEN];
23726106504eSmityu varnumber_T n;
23736106504eSmityu
23746106504eSmityu if (get_digraph_chars(argchars, &char1, &char2) == FAIL)
23756106504eSmityu return FALSE;
23766106504eSmityu
23776106504eSmityu digraph = tv_get_string_buf_chk(argdigraph, buf_digraph);
23786106504eSmityu if (digraph == NULL)
23796106504eSmityu return FALSE;
23806106504eSmityu p = digraph;
23816106504eSmityu n = mb_cptr2char_adv(&p);
23826106504eSmityu if (*p != NUL)
23836106504eSmityu {
23846106504eSmityu semsg(_(e_digraph_argument_must_be_one_character_str), digraph);
23856106504eSmityu return FALSE;
23866106504eSmityu }
23876106504eSmityu
23886106504eSmityu registerdigraph(char1, char2, (int)n);
23896106504eSmityu return TRUE;
23906106504eSmityu }
23916106504eSmityu # endif
23926106504eSmityu
23935d18efecSBram Moolenaar #endif // FEAT_DIGRAPHS
2394071d4279SBram Moolenaar
23956106504eSmityu #if defined(FEAT_EVAL) || defined(PROTO)
23966106504eSmityu /*
239729b85715Sh-east * "digraph_get()" function
23986106504eSmityu */
23996106504eSmityu void
f_digraph_get(typval_T * argvars,typval_T * rettv)240029b85715Sh-east f_digraph_get(typval_T *argvars, typval_T *rettv)
24016106504eSmityu {
24026106504eSmityu # ifdef FEAT_DIGRAPHS
24036106504eSmityu int code;
24046106504eSmityu char_u buf[NUMBUFLEN];
24056106504eSmityu char_u *digraphs;
24066106504eSmityu
24076106504eSmityu rettv->v_type = VAR_STRING;
24086106504eSmityu rettv->vval.v_string = NULL; // Return empty string for failure
24094490ec4eSYegappan Lakshmanan
24104490ec4eSYegappan Lakshmanan if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
24114490ec4eSYegappan Lakshmanan return;
24124490ec4eSYegappan Lakshmanan
24136106504eSmityu digraphs = tv_get_string_chk(&argvars[0]);
24146106504eSmityu
24156106504eSmityu if (digraphs == NULL)
24166106504eSmityu return;
24176106504eSmityu else if (STRLEN(digraphs) != 2)
24186106504eSmityu {
24196106504eSmityu semsg(_(e_digraph_must_be_just_two_characters_str), digraphs);
24206106504eSmityu return;
24216106504eSmityu }
242229b85715Sh-east code = digraph_get(digraphs[0], digraphs[1], FALSE);
24236106504eSmityu
24246106504eSmityu if (has_mbyte)
24256106504eSmityu buf[(*mb_char2bytes)(code, buf)] = NUL;
24266106504eSmityu else {
24276106504eSmityu buf[0] = code;
24286106504eSmityu buf[1] = NUL;
24296106504eSmityu }
24306106504eSmityu
24316106504eSmityu rettv->vval.v_string = vim_strsave(buf);
24326106504eSmityu # else
24336106504eSmityu emsg(_(e_no_digraphs_version));
24346106504eSmityu # endif
24356106504eSmityu }
24366106504eSmityu
24376106504eSmityu /*
243829b85715Sh-east * "digraph_getlist()" function
24396106504eSmityu */
24406106504eSmityu void
f_digraph_getlist(typval_T * argvars,typval_T * rettv)244129b85715Sh-east f_digraph_getlist(typval_T *argvars, typval_T *rettv)
24426106504eSmityu {
24436106504eSmityu # ifdef FEAT_DIGRAPHS
24446106504eSmityu int flag_list_all;
24456106504eSmityu
2446*fc3b7750SYegappan Lakshmanan if (in_vim9script() && check_for_opt_bool_arg(argvars, 0) == FAIL)
24474490ec4eSYegappan Lakshmanan return;
24484490ec4eSYegappan Lakshmanan
24496106504eSmityu if (argvars[0].v_type == VAR_UNKNOWN)
24506106504eSmityu flag_list_all = FALSE;
24516106504eSmityu else
24526106504eSmityu {
24536106504eSmityu int error = FALSE;
24546106504eSmityu varnumber_T flag = tv_get_number_chk(&argvars[0], &error);
24556106504eSmityu if (error)
24566106504eSmityu return;
24576106504eSmityu flag_list_all = flag ? TRUE : FALSE;
24586106504eSmityu }
24596106504eSmityu
246029b85715Sh-east digraph_getlist_common(flag_list_all, rettv);
24616106504eSmityu # else
24626106504eSmityu emsg(_(e_no_digraphs_version));
24636106504eSmityu # endif
24646106504eSmityu }
24656106504eSmityu
24666106504eSmityu /*
246729b85715Sh-east * "digraph_set()" function
24686106504eSmityu */
24696106504eSmityu void
f_digraph_set(typval_T * argvars,typval_T * rettv)247029b85715Sh-east f_digraph_set(typval_T *argvars, typval_T *rettv)
24716106504eSmityu {
24726106504eSmityu # ifdef FEAT_DIGRAPHS
24736106504eSmityu rettv->v_type = VAR_BOOL;
24746106504eSmityu rettv->vval.v_number = VVAL_FALSE;
24756106504eSmityu
24764490ec4eSYegappan Lakshmanan if (in_vim9script()
24774490ec4eSYegappan Lakshmanan && (check_for_string_arg(argvars, 0) == FAIL
2478*fc3b7750SYegappan Lakshmanan || check_for_string_arg(argvars, 1) == FAIL))
24794490ec4eSYegappan Lakshmanan return;
24804490ec4eSYegappan Lakshmanan
248129b85715Sh-east if (!digraph_set_common(&argvars[0], &argvars[1]))
24826106504eSmityu return;
24836106504eSmityu
24846106504eSmityu rettv->vval.v_number = VVAL_TRUE;
24856106504eSmityu # else
24866106504eSmityu emsg(_(e_no_digraphs_version));
24876106504eSmityu # endif
24886106504eSmityu }
24896106504eSmityu
24906106504eSmityu /*
249129b85715Sh-east * "digraph_setlist()" function
24926106504eSmityu */
24936106504eSmityu void
f_digraph_setlist(typval_T * argvars,typval_T * rettv)249429b85715Sh-east f_digraph_setlist(typval_T * argvars, typval_T *rettv)
24956106504eSmityu {
24966106504eSmityu # ifdef FEAT_DIGRAPHS
24976106504eSmityu list_T *pl, *l;
24986106504eSmityu listitem_T *pli;
24996106504eSmityu
25006106504eSmityu rettv->v_type = VAR_BOOL;
25016106504eSmityu rettv->vval.v_number = VVAL_FALSE;
25026106504eSmityu
25036106504eSmityu if (argvars[0].v_type != VAR_LIST)
25046106504eSmityu {
250529b85715Sh-east emsg(_(e_digraph_setlist_argument_must_be_list_of_lists_with_two_items));
25066106504eSmityu return;
25076106504eSmityu }
25086106504eSmityu
25096106504eSmityu pl = argvars[0].vval.v_list;
25106106504eSmityu if (pl == NULL)
25116106504eSmityu {
25126106504eSmityu // Empty list always results in success.
25136106504eSmityu rettv->vval.v_number = VVAL_TRUE;
25146106504eSmityu return;
25156106504eSmityu }
25166106504eSmityu
25176106504eSmityu FOR_ALL_LIST_ITEMS(pl, pli)
25186106504eSmityu {
25196106504eSmityu if (pli->li_tv.v_type != VAR_LIST)
25206106504eSmityu {
252129b85715Sh-east emsg(_(e_digraph_setlist_argument_must_be_list_of_lists_with_two_items));
25226106504eSmityu return;
25236106504eSmityu }
25246106504eSmityu
25256106504eSmityu l = pli->li_tv.vval.v_list;
25266106504eSmityu if (l == NULL || l->lv_len != 2)
25276106504eSmityu {
252829b85715Sh-east emsg(_(e_digraph_setlist_argument_must_be_list_of_lists_with_two_items));
25296106504eSmityu return;
25306106504eSmityu }
25316106504eSmityu
253229b85715Sh-east if (!digraph_set_common(&l->lv_first->li_tv,
25336106504eSmityu &l->lv_first->li_next->li_tv))
25346106504eSmityu return;
25356106504eSmityu }
25366106504eSmityu rettv->vval.v_number = VVAL_TRUE;
25376106504eSmityu # else
25386106504eSmityu emsg(_(e_no_digraphs_version));
25396106504eSmityu # endif
25406106504eSmityu }
25416106504eSmityu
25426106504eSmityu #endif // FEAT_EVAL
25436106504eSmityu
25446106504eSmityu
2545071d4279SBram Moolenaar #if defined(FEAT_KEYMAP) || defined(PROTO)
2546071d4279SBram Moolenaar
25475d18efecSBram Moolenaar // structure used for b_kmap_ga.ga_data
2548071d4279SBram Moolenaar typedef struct
2549071d4279SBram Moolenaar {
2550071d4279SBram Moolenaar char_u *from;
2551071d4279SBram Moolenaar char_u *to;
2552071d4279SBram Moolenaar } kmap_T;
2553071d4279SBram Moolenaar
25545d18efecSBram Moolenaar #define KMAP_MAXLEN 20 // maximum length of "from" or "to"
2555071d4279SBram Moolenaar
2556f28dbceaSBram Moolenaar static void keymap_unload(void);
2557071d4279SBram Moolenaar
2558071d4279SBram Moolenaar /*
25590ab2a887SBram Moolenaar * Set up key mapping tables for the 'keymap' option.
25600ab2a887SBram Moolenaar * Returns NULL if OK, an error message for failure. This only needs to be
25610ab2a887SBram Moolenaar * used when setting the option, not later when the value has already been
25620ab2a887SBram Moolenaar * checked.
2563071d4279SBram Moolenaar */
2564f9e3e09fSBram Moolenaar char *
keymap_init(void)25657454a06eSBram Moolenaar keymap_init(void)
2566071d4279SBram Moolenaar {
2567071d4279SBram Moolenaar curbuf->b_kmap_state &= ~KEYMAP_INIT;
2568071d4279SBram Moolenaar
2569071d4279SBram Moolenaar if (*curbuf->b_p_keymap == NUL)
2570071d4279SBram Moolenaar {
25715d18efecSBram Moolenaar // Stop any active keymap and clear the table. Also remove
25725d18efecSBram Moolenaar // b:keymap_name, as no keymap is active now.
2573071d4279SBram Moolenaar keymap_unload();
2574bf444179SBram Moolenaar do_cmdline_cmd((char_u *)"unlet! b:keymap_name");
2575071d4279SBram Moolenaar }
2576071d4279SBram Moolenaar else
2577071d4279SBram Moolenaar {
2578071d4279SBram Moolenaar char_u *buf;
25790ab2a887SBram Moolenaar size_t buflen;
2580071d4279SBram Moolenaar
25815d18efecSBram Moolenaar // Source the keymap file. It will contain a ":loadkeymap" command
25825d18efecSBram Moolenaar // which will call ex_loadkeymap() below.
258313505972SBram Moolenaar buflen = STRLEN(curbuf->b_p_keymap) + STRLEN(p_enc) + 14;
2584964b3746SBram Moolenaar buf = alloc(buflen);
2585071d4279SBram Moolenaar if (buf == NULL)
2586e29a27f6SBram Moolenaar return e_out_of_memory;
2587071d4279SBram Moolenaar
25885d18efecSBram Moolenaar // try finding "keymap/'keymap'_'encoding'.vim" in 'runtimepath'
25890ab2a887SBram Moolenaar vim_snprintf((char *)buf, buflen, "keymap/%s_%s.vim",
25900ab2a887SBram Moolenaar curbuf->b_p_keymap, p_enc);
25917f8989ddSBram Moolenaar if (source_runtime(buf, 0) == FAIL)
2592071d4279SBram Moolenaar {
25935d18efecSBram Moolenaar // try finding "keymap/'keymap'.vim" in 'runtimepath'
25940ab2a887SBram Moolenaar vim_snprintf((char *)buf, buflen, "keymap/%s.vim",
25950ab2a887SBram Moolenaar curbuf->b_p_keymap);
25967f8989ddSBram Moolenaar if (source_runtime(buf, 0) == FAIL)
2597071d4279SBram Moolenaar {
2598071d4279SBram Moolenaar vim_free(buf);
2599f9e3e09fSBram Moolenaar return N_("E544: Keymap file not found");
2600071d4279SBram Moolenaar }
2601071d4279SBram Moolenaar }
2602071d4279SBram Moolenaar vim_free(buf);
2603071d4279SBram Moolenaar }
2604071d4279SBram Moolenaar
2605071d4279SBram Moolenaar return NULL;
2606071d4279SBram Moolenaar }
2607071d4279SBram Moolenaar
2608071d4279SBram Moolenaar /*
2609071d4279SBram Moolenaar * ":loadkeymap" command: load the following lines as the keymap.
2610071d4279SBram Moolenaar */
2611071d4279SBram Moolenaar void
ex_loadkeymap(exarg_T * eap)26127454a06eSBram Moolenaar ex_loadkeymap(exarg_T *eap)
2613071d4279SBram Moolenaar {
2614071d4279SBram Moolenaar char_u *line;
2615071d4279SBram Moolenaar char_u *p;
2616071d4279SBram Moolenaar char_u *s;
2617071d4279SBram Moolenaar kmap_T *kp;
26185d18efecSBram Moolenaar #define KMAP_LLEN 200 // max length of "to" and "from" together
2619071d4279SBram Moolenaar char_u buf[KMAP_LLEN + 11];
2620071d4279SBram Moolenaar int i;
2621071d4279SBram Moolenaar char_u *save_cpo = p_cpo;
2622071d4279SBram Moolenaar
2623071d4279SBram Moolenaar if (!getline_equal(eap->getline, eap->cookie, getsourceline))
2624071d4279SBram Moolenaar {
2625f9e3e09fSBram Moolenaar emsg(_("E105: Using :loadkeymap not in a sourced file"));
2626071d4279SBram Moolenaar return;
2627071d4279SBram Moolenaar }
2628071d4279SBram Moolenaar
2629071d4279SBram Moolenaar /*
2630071d4279SBram Moolenaar * Stop any active keymap and clear the table.
2631071d4279SBram Moolenaar */
2632071d4279SBram Moolenaar keymap_unload();
2633071d4279SBram Moolenaar
2634071d4279SBram Moolenaar curbuf->b_kmap_state = 0;
2635071d4279SBram Moolenaar ga_init2(&curbuf->b_kmap_ga, (int)sizeof(kmap_T), 20);
2636071d4279SBram Moolenaar
26375d18efecSBram Moolenaar // Set 'cpoptions' to "C" to avoid line continuation.
2638071d4279SBram Moolenaar p_cpo = (char_u *)"C";
2639071d4279SBram Moolenaar
2640071d4279SBram Moolenaar /*
2641071d4279SBram Moolenaar * Get each line of the sourced file, break at the end.
2642071d4279SBram Moolenaar */
2643071d4279SBram Moolenaar for (;;)
2644071d4279SBram Moolenaar {
2645e96a2498SBram Moolenaar line = eap->getline(0, eap->cookie, 0, TRUE);
2646071d4279SBram Moolenaar if (line == NULL)
2647071d4279SBram Moolenaar break;
2648071d4279SBram Moolenaar
2649071d4279SBram Moolenaar p = skipwhite(line);
2650071d4279SBram Moolenaar if (*p != '"' && *p != NUL && ga_grow(&curbuf->b_kmap_ga, 1) == OK)
2651071d4279SBram Moolenaar {
2652071d4279SBram Moolenaar kp = (kmap_T *)curbuf->b_kmap_ga.ga_data + curbuf->b_kmap_ga.ga_len;
2653071d4279SBram Moolenaar s = skiptowhite(p);
2654df44a27bSBram Moolenaar kp->from = vim_strnsave(p, s - p);
2655071d4279SBram Moolenaar p = skipwhite(s);
2656071d4279SBram Moolenaar s = skiptowhite(p);
2657df44a27bSBram Moolenaar kp->to = vim_strnsave(p, s - p);
2658071d4279SBram Moolenaar
2659071d4279SBram Moolenaar if (kp->from == NULL || kp->to == NULL
266057657d85SBram Moolenaar || STRLEN(kp->from) + STRLEN(kp->to) >= KMAP_LLEN
266157657d85SBram Moolenaar || *kp->from == NUL || *kp->to == NUL)
2662071d4279SBram Moolenaar {
266357657d85SBram Moolenaar if (kp->to != NULL && *kp->to == NUL)
2664f9e3e09fSBram Moolenaar emsg(_("E791: Empty keymap entry"));
2665071d4279SBram Moolenaar vim_free(kp->from);
2666071d4279SBram Moolenaar vim_free(kp->to);
2667071d4279SBram Moolenaar }
2668071d4279SBram Moolenaar else
2669071d4279SBram Moolenaar ++curbuf->b_kmap_ga.ga_len;
2670071d4279SBram Moolenaar }
2671071d4279SBram Moolenaar vim_free(line);
2672071d4279SBram Moolenaar }
2673071d4279SBram Moolenaar
2674071d4279SBram Moolenaar /*
2675071d4279SBram Moolenaar * setup ":lnoremap" to map the keys
2676071d4279SBram Moolenaar */
2677071d4279SBram Moolenaar for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
2678071d4279SBram Moolenaar {
2679555b280fSBram Moolenaar vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s %s",
2680071d4279SBram Moolenaar ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].from,
2681071d4279SBram Moolenaar ((kmap_T *)curbuf->b_kmap_ga.ga_data)[i].to);
2682071d4279SBram Moolenaar (void)do_map(2, buf, LANGMAP, FALSE);
2683071d4279SBram Moolenaar }
2684071d4279SBram Moolenaar
2685071d4279SBram Moolenaar p_cpo = save_cpo;
2686071d4279SBram Moolenaar
2687071d4279SBram Moolenaar curbuf->b_kmap_state |= KEYMAP_LOADED;
2688071d4279SBram Moolenaar status_redraw_curbuf();
2689071d4279SBram Moolenaar }
2690071d4279SBram Moolenaar
2691071d4279SBram Moolenaar /*
2692071d4279SBram Moolenaar * Stop using 'keymap'.
2693071d4279SBram Moolenaar */
2694071d4279SBram Moolenaar static void
keymap_unload(void)26957454a06eSBram Moolenaar keymap_unload(void)
2696071d4279SBram Moolenaar {
2697071d4279SBram Moolenaar char_u buf[KMAP_MAXLEN + 10];
2698071d4279SBram Moolenaar int i;
2699071d4279SBram Moolenaar char_u *save_cpo = p_cpo;
27008c8de839SBram Moolenaar kmap_T *kp;
2701071d4279SBram Moolenaar
2702071d4279SBram Moolenaar if (!(curbuf->b_kmap_state & KEYMAP_LOADED))
2703071d4279SBram Moolenaar return;
2704071d4279SBram Moolenaar
27055d18efecSBram Moolenaar // Set 'cpoptions' to "C" to avoid line continuation.
2706071d4279SBram Moolenaar p_cpo = (char_u *)"C";
2707071d4279SBram Moolenaar
27085d18efecSBram Moolenaar // clear the ":lmap"s
27098c8de839SBram Moolenaar kp = (kmap_T *)curbuf->b_kmap_ga.ga_data;
2710071d4279SBram Moolenaar for (i = 0; i < curbuf->b_kmap_ga.ga_len; ++i)
2711071d4279SBram Moolenaar {
27128c8de839SBram Moolenaar vim_snprintf((char *)buf, sizeof(buf), "<buffer> %s", kp[i].from);
2713071d4279SBram Moolenaar (void)do_map(1, buf, LANGMAP, FALSE);
2714071d4279SBram Moolenaar }
271550138323SBram Moolenaar keymap_clear(&curbuf->b_kmap_ga);
2716071d4279SBram Moolenaar
2717071d4279SBram Moolenaar p_cpo = save_cpo;
2718071d4279SBram Moolenaar
2719071d4279SBram Moolenaar ga_clear(&curbuf->b_kmap_ga);
2720071d4279SBram Moolenaar curbuf->b_kmap_state &= ~KEYMAP_LOADED;
2721071d4279SBram Moolenaar status_redraw_curbuf();
2722071d4279SBram Moolenaar }
2723071d4279SBram Moolenaar
272450138323SBram Moolenaar void
keymap_clear(garray_T * kmap)272550138323SBram Moolenaar keymap_clear(garray_T *kmap)
272650138323SBram Moolenaar {
272750138323SBram Moolenaar int i;
272850138323SBram Moolenaar kmap_T *kp = (kmap_T *)kmap->ga_data;
272950138323SBram Moolenaar
273050138323SBram Moolenaar for (i = 0; i < kmap->ga_len; ++i)
273150138323SBram Moolenaar {
273250138323SBram Moolenaar vim_free(kp[i].from);
273350138323SBram Moolenaar vim_free(kp[i].to);
273450138323SBram Moolenaar }
273550138323SBram Moolenaar }
27365d18efecSBram Moolenaar #endif // FEAT_KEYMAP
2737