xref: /vim-8.2.3635/src/digraph.c (revision fc3b7750)
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