To: vim-dev@vim.org Subject: Patch 7.2.348 (after 7.2.330) Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.2.347/runtime/tools/unicode.vim 2010-01-12 19:48:57.000000000 +0100 --- runtime/tools/unicode.vim 2010-01-27 17:57:17.000000000 +0100 *************** *** 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') *** ../vim-7.2.347/src/mbyte.c 2010-01-12 19:48:57.000000000 +0100 --- src/mbyte.c 2010-01-27 18:06:35.000000000 +0100 *************** *** 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 */ ! 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 */ ! if (intable(doublewidth, sizeof(doublewidth), c)) return 2; #endif } *** ../vim-7.2.347/src/version.c 2010-01-27 17:31:38.000000000 +0100 --- src/version.c 2010-01-27 18:25:50.000000000 +0100 *************** *** 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 ///