1
0
forked from aniani/vim

updated for version 7.2.348

Problem:    Unicode double-width characters are not up-to date.
Solution:   Produce the double-width table like the others.
This commit is contained in:
Bram Moolenaar
2010-01-27 18:29:26 +01:00
parent 0dbf720d86
commit da4d7a92d5
3 changed files with 72 additions and 30 deletions

View File

@@ -187,16 +187,27 @@ func! BuildCombiningTable()
wincmd p wincmd p
endfunc endfunc
" Build the ambiguous table in a new buffer. " Build the double width or ambiguous width table in a new buffer.
" Uses s:widthprops and s:dataprops. " Uses s:widthprops and s:dataprops.
func! BuildAmbiguousTable() func! BuildWidthTable(pattern, tableName)
let start = -1 let start = -1
let end = -1 let end = -1
let ranges = [] let ranges = []
let dataidx = 0 let dataidx = 0
for p in s:widthprops for p in s:widthprops
if p[1][0] == 'A' if p[1][0] =~ a:pattern
let n = ('0x' . p[0]) + 0 if p[0] =~ '\.\.'
" It is a range. we don't check for composing char then.
let rng = split(p[0], '\.\.')
if len(rng) != 2
echoerr "Cannot parse range: '" . p[0] . "' in width table"
endif
let n = ('0x' . rng[0]) + 0
let n_last = ('0x' . rng[1]) + 0
else
let n = ('0x' . p[0]) + 0
let n_last = n
endif
" Find this char in the data table. " Find this char in the data table.
while 1 while 1
let dn = ('0x' . s:dataprops[dataidx][0]) + 0 let dn = ('0x' . s:dataprops[dataidx][0]) + 0
@@ -205,27 +216,23 @@ func! BuildAmbiguousTable()
endif endif
let dataidx += 1 let dataidx += 1
endwhile endwhile
if dn != n if dn != n && n_last == n
echoerr "Cannot find character " . n . " in data table" echoerr "Cannot find character " . n . " in data table"
endif endif
" Only use the char when it's not a composing char. " Only use the char when it's not a composing char.
" But use all chars from a range.
let dp = s:dataprops[dataidx] let dp = s:dataprops[dataidx]
if dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me' if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me')
if start >= 0 && end + 1 == n if start >= 0 && end + 1 == n
" continue with same range. " continue with same range.
let end = n
else else
if start >= 0 if start >= 0
" produce previous range " produce previous range
call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
endif endif
let start = n let start = n
if p[0] =~ '\.\.'
let end = ('0x' . substitute(p[0], '.*\.\.', '', '')) + 0
else
let end = n
endif
endif endif
let end = n_last
endif endif
endif endif
endfor endfor
@@ -235,8 +242,8 @@ func! BuildAmbiguousTable()
" New buffer to put the result in. " New buffer to put the result in.
new new
file ambiguous exe "file " . a:tableName
call setline(1, " static struct interval ambiguous[] =") call setline(1, " static struct interval " . a:tableName . "[] =")
call setline(2, " {") call setline(2, " {")
call append('$', ranges) call append('$', ranges)
call setline('$', getline('$')[:-2]) " remove last comma call setline('$', getline('$')[:-2]) " remove last comma
@@ -276,5 +283,8 @@ edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
" Parse each line, create a list of lists. " Parse each line, create a list of lists.
call ParseWidthProps() call ParseWidthProps()
" Build the ambiguous table. " Build the double width table.
call BuildAmbiguousTable() call BuildWidthTable('[WF]', 'doublewidth')
" Build the ambiguous width table.
call BuildWidthTable('A', 'ambiguous')

View File

@@ -1200,6 +1200,49 @@ intable(table, size, c)
utf_char2cells(c) utf_char2cells(c)
int c; int c;
{ {
/* Sorted list of non-overlapping intervals of East Asian double width
* characters, generated with ../runtime/tools/unicode.vim. */
static struct interval doublewidth[] =
{
{0x1100, 0x115f},
{0x11a3, 0x11a7},
{0x11fa, 0x11ff},
{0x2329, 0x232a},
{0x2e80, 0x2e99},
{0x2e9b, 0x2ef3},
{0x2f00, 0x2fd5},
{0x2ff0, 0x2ffb},
{0x3000, 0x3029},
{0x3030, 0x303e},
{0x3041, 0x3096},
{0x309b, 0x30ff},
{0x3105, 0x312d},
{0x3131, 0x318e},
{0x3190, 0x31b7},
{0x31c0, 0x31e3},
{0x31f0, 0x321e},
{0x3220, 0x3247},
{0x3250, 0x32fe},
{0x3300, 0x4dbf},
{0x4e00, 0xa48c},
{0xa490, 0xa4c6},
{0xa960, 0xa97c},
{0xac00, 0xd7a3},
{0xd7b0, 0xd7c6},
{0xd7cb, 0xd7fb},
{0xf900, 0xfaff},
{0xfe10, 0xfe19},
{0xfe30, 0xfe52},
{0xfe54, 0xfe66},
{0xfe68, 0xfe6b},
{0xff01, 0xff60},
{0xffe0, 0xffe6},
{0x1f200, 0x1f200},
{0x1f210, 0x1f231},
{0x1f240, 0x1f248},
{0x20000, 0x2fffd},
{0x30000, 0x3fffd}
};
/* Sorted list of non-overlapping intervals of East Asian Ambiguous /* Sorted list of non-overlapping intervals of East Asian Ambiguous
* characters, generated with ../runtime/tools/unicode.vim. */ * characters, generated with ../runtime/tools/unicode.vim. */
static struct interval ambiguous[] = static struct interval ambiguous[] =
@@ -1403,20 +1446,7 @@ utf_char2cells(c)
#else #else
if (!utf_printable(c)) if (!utf_printable(c))
return 6; /* unprintable, displays <xxxx> */ return 6; /* unprintable, displays <xxxx> */
if (c >= 0x1100 if (intable(doublewidth, sizeof(doublewidth), c))
&& (c <= 0x115f /* Hangul Jamo */
|| c == 0x2329
|| c == 0x232a
|| (c >= 0x2e80 && c <= 0xa4cf
&& c != 0x303f) /* CJK ... Yi */
|| (c >= 0xac00 && c <= 0xd7a3) /* Hangul Syllables */
|| (c >= 0xf900 && c <= 0xfaff) /* CJK Compatibility
Ideographs */
|| (c >= 0xfe30 && c <= 0xfe6f) /* CJK Compatibility Forms */
|| (c >= 0xff00 && c <= 0xff60) /* Fullwidth Forms */
|| (c >= 0xffe0 && c <= 0xffe6)
|| (c >= 0x20000 && c <= 0x2fffd)
|| (c >= 0x30000 && c <= 0x3fffd)))
return 2; return 2;
#endif #endif
} }

View File

@@ -681,6 +681,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
348,
/**/ /**/
347, 347,
/**/ /**/