-*options.txt* For Vim version 9.1. Last change: 2025 Mar 28
+*options.txt* For Vim version 9.1. Last change: 2025 Apr 04
VIM REFERENCE MANUAL by Bram Moolenaar
difference.
word Use internal diff to perform a
|word|-wise diff and highlight the
- difference.
+ difference. Non-alphanumeric
+ multi-byte characters such as emoji
+ and CJK characters are considered
+ individual words.
internal Use the internal diff library. This is
ignored when 'diffexpr' is set. *E960*
char_u *s;
for (s = curline; *s != NUL;)
{
- // Always use the first buffer's 'iskeyword' to have a consistent diff
int new_in_keyword = FALSE;
if (diff_flags & DIFF_INLINE_WORD)
- new_in_keyword = vim_iswordp_buf(s, curtab->tp_diffbuf[file1_idx]);
+ {
+ // Always use the first buffer's 'iskeyword' to have a
+ // consistent diff.
+ // For multibyte chars, only treat alphanumeric chars
+ // (class 2) as "word", as other classes such as emojis and
+ // CJK ideographs do not usually benefit from word diff as
+ // Vim doesn't have a good way to segment them.
+ new_in_keyword = (mb_get_class_buf(s, curtab->tp_diffbuf[file1_idx]) == 2);
+ }
if (in_keyword && !new_in_keyword)
{
ga_append(curstr, NL);
* Get class of pointer:
* 0 for blank or NUL
* 1 for punctuation
- * 2 for an (ASCII) word character
- * >2 for other word characters
+ * 2 for an alphanumeric word character
+ * >2 for other word characters, including CJK and emoji
*/
int
mb_get_class(char_u *p)
--- /dev/null
+| +0#0000e05#a8a8a8255@1|🚀*0#0000000#ffd7ff255|⛵️*2&#ff404010|一*0&#ffd7ff255|二|三*2&#ff404010|ひ*0&#ffd7ff255|ら|が*0࿈ff13|な*0&#ffd7ff255|Δ+2&#ff404010|έ|λ|τ|α| +0&#ffd7ff255|Δ+2&#ff404010|e|l|t|a| +0&#ffd7ff255|f|o@1|b|a||+1&#ffffff0| +0#0000e05#a8a8a8255@1|🚀*0#0000000#ffd7ff255|🛸*2&#ff404010|一*0&#ffd7ff255|二|四*2&#ff404010|ひ*0&#ffd7ff255|ら|な|δ+2&#ff404010|έ|λ|τ|α| +0&#ffd7ff255|δ+2&#ff404010|e|l|t|a| +0&#ffd7ff255|f|o@1|b|a|r|
+|~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
+|X+3#0000000&|d|i|f|i|l|e|1| @10|1|,|1| @11|A|l@1| |X+1&&|d|i|f|i|l|e|2| @10|1|,|1| @11|A|l@1
+|:+0&&> @73
call term_sendkeys(buf, ":windo set iskeyword&\<CR>:1wincmd w\<CR>")
+ " word diff: test handling of multi-byte characters. Only alphanumeric chars
+ " (e.g. Greek alphabet, but not CJK/emoji) count as words.
+ call WriteDiffFiles(buf, ["🚀⛵️一二三ひらがなΔέλτα Δelta foobar"], ["🚀🛸一二四ひらなδέλτα δelta foobar"])
+ call VerifyInternal(buf, "Test_diff_inline_word_03", " diffopt+=inline:word")
+
" char diff: should slide highlight to whitespace boundary if possible for
" better readability (by using forced indent-heuristics). A wrong result
" would be if the highlight is "Bar, prefix". It should be "prefixBar, "
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1276,
/**/
1275,
/**/