| To: vim-dev@vim.org |
| Subject: Patch 7.2.348 (after 7.2.330) |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.2.348 (after 7.2.330) |
| Problem: Unicode double-width characters are not up-to date. |
| Solution: Produce the double-width table like the others. |
| Files: runtime/tools/unicode.vim, src/mbyte.c |
| |
| |
| |
| |
| |
| *** 187,202 **** |
| wincmd p |
| endfunc |
| |
| ! " Build the ambiguous table in a new buffer. |
| " Uses s:widthprops and s:dataprops. |
| ! func! BuildAmbiguousTable() |
| let start = -1 |
| let end = -1 |
| let ranges = [] |
| let dataidx = 0 |
| for p in s:widthprops |
| ! if p[1][0] == 'A' |
| ! let n = ('0x' . p[0]) + 0 |
| " Find this char in the data table. |
| while 1 |
| let dn = ('0x' . s:dataprops[dataidx][0]) + 0 |
| --- 187,213 ---- |
| wincmd p |
| endfunc |
| |
| ! " Build the double width or ambiguous width table in a new buffer. |
| " Uses s:widthprops and s:dataprops. |
| ! func! BuildWidthTable(pattern, tableName) |
| let start = -1 |
| let end = -1 |
| let ranges = [] |
| let dataidx = 0 |
| for p in s:widthprops |
| ! if p[1][0] =~ a:pattern |
| ! 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. |
| while 1 |
| let dn = ('0x' . s:dataprops[dataidx][0]) + 0 |
| |
| *** 205,231 **** |
| endif |
| let dataidx += 1 |
| endwhile |
| ! if dn != n |
| echoerr "Cannot find character " . n . " in data table" |
| endif |
| " Only use the char when it's not a composing char. |
| let dp = s:dataprops[dataidx] |
| ! if dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me' |
| if start >= 0 && end + 1 == n |
| " continue with same range. |
| - let end = n |
| else |
| if start >= 0 |
| " produce previous range |
| call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) |
| endif |
| let start = n |
| - if p[0] =~ '\.\.' |
| - let end = ('0x' . substitute(p[0], '.*\.\.', '', '')) + 0 |
| - else |
| - let end = n |
| - endif |
| endif |
| endif |
| endif |
| endfor |
| --- 216,238 ---- |
| endif |
| let dataidx += 1 |
| endwhile |
| ! if dn != n && n_last == n |
| echoerr "Cannot find character " . n . " in data table" |
| endif |
| " Only use the char when it's not a composing char. |
| + " But use all chars from a range. |
| let dp = s:dataprops[dataidx] |
| ! if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me') |
| if start >= 0 && end + 1 == n |
| " continue with same range. |
| else |
| if start >= 0 |
| " produce previous range |
| call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end)) |
| endif |
| let start = n |
| endif |
| + let end = n_last |
| endif |
| endif |
| endfor |
| |
| *** 235,242 **** |
| |
| " New buffer to put the result in. |
| new |
| ! file ambiguous |
| ! call setline(1, " static struct interval ambiguous[] =") |
| call setline(2, " {") |
| call append('$', ranges) |
| call setline('$', getline('$')[:-2]) " remove last comma |
| --- 242,249 ---- |
| |
| " 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 |
| |
| *** 276,280 **** |
| " Parse each line, create a list of lists. |
| call ParseWidthProps() |
| |
| ! " Build the ambiguous table. |
| ! call BuildAmbiguousTable() |
| --- 283,290 ---- |
| " Parse each line, create a list of lists. |
| call ParseWidthProps() |
| |
| ! " Build the double width table. |
| ! call BuildWidthTable('[WF]', 'doublewidth') |
| ! |
| ! " Build the ambiguous width table. |
| ! call BuildWidthTable('A', 'ambiguous') |
| |
| |
| |
| *** 1200,1205 **** |
| --- 1200,1248 ---- |
| utf_char2cells(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 |
| * characters, generated with ../runtime/tools/unicode.vim. */ |
| static struct interval ambiguous[] = |
| |
| *** 1403,1422 **** |
| #else |
| if (!utf_printable(c)) |
| return 6; /* unprintable, displays <xxxx> */ |
| ! if (c >= 0x1100 |
| ! && (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; |
| #endif |
| } |
| --- 1446,1452 ---- |
| #else |
| if (!utf_printable(c)) |
| return 6; /* unprintable, displays <xxxx> */ |
| ! if (intable(doublewidth, sizeof(doublewidth), c)) |
| return 2; |
| #endif |
| } |
| |
| |
| |
| *** 683,684 **** |
| --- 683,686 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 348, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 157. You fum through a magazine, you first check to see if it has a web |
| address. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |