-
-
Save saitoha/5445a2b2367866839515 to your computer and use it in GitHub Desktop.
Emoji Support for Vim (with emoji option)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/runtime/tools/unicode.vim b/runtime/tools/unicode.vim | |
index d733fe8..dfe9cef 100644 | |
--- a/runtime/tools/unicode.vim | |
+++ b/runtime/tools/unicode.vim | |
@@ -251,6 +251,27 @@ func! BuildWidthTable(pattern, tableName) | |
wincmd p | |
endfunc | |
+" Build the amoji width table in a new buffer. | |
+func! BuildEmojiTable(pattern, tableName) | |
+ let ranges = [] | |
+ for line in map(filter(filter(getline(1, '$'), 'v:val=~"^[1-9]"'), 'v:val=~a:pattern'), 'matchstr(v:val,"^\\S\\+")') | |
+ let token = split(line, '\.\.') | |
+ if len(token) == 1 | |
+ call add(token, token[0]) | |
+ endif | |
+ call add(ranges, printf("\t{0x%04x, 0x%04x},", "0x".token[0], "0x".token[1])) | |
+ endfor | |
+ | |
+ " New buffer to put the result in. | |
+ new | |
+ exe "file " . a:tableName | |
+ call setline(1, " static struct interval " . a:tableName . "[] =") | |
+ call setline(2, " {") | |
+ call append('$', ranges) | |
+ call setline('$', getline('$')[:-2]) " remove last comma | |
+ call setline(line('$') + 1, " };") | |
+ wincmd p | |
+endfunc | |
" Try to avoid hitting E36 | |
set equalalways | |
@@ -290,3 +311,9 @@ call BuildWidthTable('[WF]', 'doublewidth') | |
" Build the ambiguous width table. | |
call BuildWidthTable('A', 'ambiguous') | |
+ | |
+" Edit the emoji text file. Requires the netrw plugin. | |
+edit http://www.unicode.org/Public/emoji/3.0/emoji-data.txt | |
+ | |
+" Build the emoji table. Ver. 1.0 - 6.0 | |
+call BuildEmojiTable('; Emoji\s\+# [1-6]\.[0-9]', 'emoji') | |
diff --git a/src/mbyte.c b/src/mbyte.c | |
index b44168d..313db76 100644 | |
--- a/src/mbyte.c | |
+++ b/src/mbyte.c | |
@@ -1253,11 +1253,6 @@ utf_char2cells(int c) | |
{0xfe68, 0xfe6b}, | |
{0xff01, 0xff60}, | |
{0xffe0, 0xffe6}, | |
- {0x1b000, 0x1b001}, | |
- {0x1f200, 0x1f202}, | |
- {0x1f210, 0x1f23a}, | |
- {0x1f240, 0x1f248}, | |
- {0x1f250, 0x1f251}, | |
{0x20000, 0x2fffd}, | |
{0x30000, 0x3fffd} | |
}; | |
@@ -1441,6 +1436,148 @@ utf_char2cells(int c) | |
{0x100000, 0x10fffd} | |
}; | |
+ /* Sorted list of non-overlapping intervals of Emoji characters, | |
+ * based on http://unicode.org/emoji/charts/emoji-list.html */ | |
+ static struct interval emoji[] = | |
+ { | |
+ {0x203c, 0x203c}, | |
+ {0x2049, 0x2049}, | |
+ {0x2122, 0x2122}, | |
+ {0x2139, 0x2139}, | |
+ {0x2194, 0x2199}, | |
+ {0x21a9, 0x21aa}, | |
+ {0x231a, 0x231b}, | |
+ {0x2328, 0x2328}, | |
+ {0x23cf, 0x23cf}, | |
+ {0x23e9, 0x23f3}, | |
+ {0x24c2, 0x24c2}, | |
+ {0x25aa, 0x25ab}, | |
+ {0x25b6, 0x25b6}, | |
+ {0x25c0, 0x25c0}, | |
+ {0x25fb, 0x25fe}, | |
+ {0x2600, 0x2604}, | |
+ {0x260e, 0x260e}, | |
+ {0x2611, 0x2611}, | |
+ {0x2614, 0x2615}, | |
+ {0x2618, 0x2618}, | |
+ {0x261d, 0x261d}, | |
+ {0x2620, 0x2620}, | |
+ {0x2622, 0x2623}, | |
+ {0x2626, 0x2626}, | |
+ {0x262a, 0x262a}, | |
+ {0x262e, 0x262f}, | |
+ {0x2638, 0x263a}, | |
+ {0x2648, 0x2653}, | |
+ {0x2660, 0x2660}, | |
+ {0x2663, 0x2663}, | |
+ {0x2665, 0x2666}, | |
+ {0x2668, 0x2668}, | |
+ {0x267b, 0x267b}, | |
+ {0x267f, 0x267f}, | |
+ {0x2692, 0x2694}, | |
+ {0x2696, 0x2697}, | |
+ {0x2699, 0x2699}, | |
+ {0x269b, 0x269c}, | |
+ {0x26a0, 0x26a1}, | |
+ {0x26aa, 0x26ab}, | |
+ {0x26b0, 0x26b1}, | |
+ {0x26bd, 0x26be}, | |
+ {0x26c4, 0x26c5}, | |
+ {0x26c8, 0x26c8}, | |
+ {0x26ce, 0x26ce}, | |
+ {0x26cf, 0x26cf}, | |
+ {0x26d1, 0x26d1}, | |
+ {0x26d3, 0x26d4}, | |
+ {0x26e9, 0x26ea}, | |
+ {0x26f0, 0x26f5}, | |
+ {0x26f7, 0x26fa}, | |
+ {0x26fd, 0x26fd}, | |
+ {0x2702, 0x2702}, | |
+ {0x2705, 0x2705}, | |
+ {0x2708, 0x2709}, | |
+ {0x270a, 0x270b}, | |
+ {0x270c, 0x270d}, | |
+ {0x270f, 0x270f}, | |
+ {0x2712, 0x2712}, | |
+ {0x2714, 0x2714}, | |
+ {0x2716, 0x2716}, | |
+ {0x271d, 0x271d}, | |
+ {0x2721, 0x2721}, | |
+ {0x2728, 0x2728}, | |
+ {0x2733, 0x2734}, | |
+ {0x2744, 0x2744}, | |
+ {0x2747, 0x2747}, | |
+ {0x274c, 0x274c}, | |
+ {0x274e, 0x274e}, | |
+ {0x2753, 0x2755}, | |
+ {0x2757, 0x2757}, | |
+ {0x2763, 0x2764}, | |
+ {0x2795, 0x2797}, | |
+ {0x27a1, 0x27a1}, | |
+ {0x27b0, 0x27b0}, | |
+ {0x27bf, 0x27bf}, | |
+ {0x2934, 0x2935}, | |
+ {0x2b05, 0x2b07}, | |
+ {0x2b1b, 0x2b1c}, | |
+ {0x2b50, 0x2b50}, | |
+ {0x2b55, 0x2b55}, | |
+ {0x3030, 0x3030}, | |
+ {0x303d, 0x303d}, | |
+ {0x3297, 0x3297}, | |
+ {0x3299, 0x3299}, | |
+ {0x1f004, 0x1f004}, | |
+ {0x1f0cf, 0x1f0cf}, | |
+ {0x1f170, 0x1f171}, | |
+ {0x1f17e, 0x1f17e}, | |
+ {0x1f17f, 0x1f17f}, | |
+ {0x1f18e, 0x1f18e}, | |
+ {0x1f191, 0x1f19a}, | |
+ {0x1f1e6, 0x1f1ff}, | |
+ {0x1f201, 0x1f202}, | |
+ {0x1f21a, 0x1f21a}, | |
+ {0x1f22f, 0x1f22f}, | |
+ {0x1f232, 0x1f23a}, | |
+ {0x1f250, 0x1f251}, | |
+ {0x1f300, 0x1f320}, | |
+ {0x1f330, 0x1f335}, | |
+ {0x1f337, 0x1f37c}, | |
+ {0x1f380, 0x1f393}, | |
+ {0x1f3a0, 0x1f3c4}, | |
+ {0x1f3c6, 0x1f3ca}, | |
+ {0x1f3e0, 0x1f3f0}, | |
+ {0x1f400, 0x1f43e}, | |
+ {0x1f440, 0x1f440}, | |
+ {0x1f442, 0x1f4f7}, | |
+ {0x1f4f9, 0x1f4fc}, | |
+ {0x1f500, 0x1f53d}, | |
+ {0x1f550, 0x1f567}, | |
+ {0x1f5fb, 0x1f5ff}, | |
+ {0x1f600, 0x1f600}, | |
+ {0x1f601, 0x1f610}, | |
+ {0x1f611, 0x1f611}, | |
+ {0x1f612, 0x1f614}, | |
+ {0x1f615, 0x1f615}, | |
+ {0x1f616, 0x1f616}, | |
+ {0x1f617, 0x1f617}, | |
+ {0x1f618, 0x1f618}, | |
+ {0x1f619, 0x1f619}, | |
+ {0x1f61a, 0x1f61a}, | |
+ {0x1f61b, 0x1f61b}, | |
+ {0x1f61c, 0x1f61e}, | |
+ {0x1f61f, 0x1f61f}, | |
+ {0x1f620, 0x1f625}, | |
+ {0x1f626, 0x1f627}, | |
+ {0x1f628, 0x1f62b}, | |
+ {0x1f62c, 0x1f62c}, | |
+ {0x1f62d, 0x1f62d}, | |
+ {0x1f62e, 0x1f62f}, | |
+ {0x1f630, 0x1f633}, | |
+ {0x1f634, 0x1f634}, | |
+ {0x1f635, 0x1f640}, | |
+ {0x1f645, 0x1f64f}, | |
+ {0x1f680, 0x1f6c5} | |
+ }; | |
+ | |
if (c >= 0x100) | |
{ | |
#ifdef USE_WCHAR_FUNCTIONS | |
@@ -1460,6 +1597,8 @@ utf_char2cells(int c) | |
if (intable(doublewidth, sizeof(doublewidth), c)) | |
return 2; | |
#endif | |
+ if (p_emoji && intable(emoji, sizeof(emoji), c)) | |
+ return 2; | |
} | |
/* Characters below 0x100 are influenced by 'isprint' option */ | |
diff --git a/src/option.c b/src/option.c | |
index b624aad..004e0ff 100644 | |
--- a/src/option.c | |
+++ b/src/option.c | |
@@ -1051,6 +1051,15 @@ static struct vimoption options[] = | |
{"edcompatible","ed", P_BOOL|P_VI_DEF, | |
(char_u *)&p_ed, PV_NONE, | |
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT}, | |
+ {"emoji", "emo", P_BOOL|P_VI_DEF|P_RCLR, | |
+#if defined(FEAT_MBYTE) | |
+ (char_u *)&p_emoji, PV_NONE, | |
+ {(char_u *)TRUE, (char_u *)0L} | |
+#else | |
+ (char_u *)NULL, PV_NONE, | |
+ {(char_u *)0L, (char_u *)0L} | |
+#endif | |
+ SCRIPTID_INIT}, | |
{"encoding", "enc", P_STRING|P_VI_DEF|P_RCLR|P_NO_ML, | |
#ifdef FEAT_MBYTE | |
(char_u *)&p_enc, PV_NONE, | |
@@ -5986,7 +5995,7 @@ did_set_string_option( | |
/* 'ambiwidth' */ | |
#ifdef FEAT_MBYTE | |
- else if (varp == &p_ambw) | |
+ else if (varp == &p_ambw || varp == &p_emoji) | |
{ | |
if (check_opt_strings(p_ambw, p_ambw_values, FALSE) != OK) | |
errmsg = e_invarg; | |
diff --git a/src/option.h b/src/option.h | |
index 2f1f04f..dbdf9ff 100644 | |
--- a/src/option.h | |
+++ b/src/option.h | |
@@ -317,6 +317,7 @@ EXTERN int p_acd; /* 'autochdir' */ | |
#endif | |
#ifdef FEAT_MBYTE | |
EXTERN char_u *p_ambw; /* 'ambiwidth' */ | |
+EXTERN char_u *p_emoji; /* 'emoji' */ | |
#endif | |
#if defined(FEAT_GUI) && defined(MACOS_X) | |
EXTERN int *p_antialias; /* 'antialias' */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment