To: vim_dev@googlegroups.com Subject: Patch 9.0.0139 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0139 Problem: Truncating virtual text after a line not implemented. Cursor positioning wrong with Newline in the text. Solution: Implement truncating. Disallow control characters in the text. (closes #10842) Files: src/drawline.c, src/structs.h, src/charset.c, src/proto/charset.pro, src/testdir/test_textprop.vim, src/testdir/dumps/Test_prop_with_text_after_trunc_1.dump, src/testdir/dumps/Test_prop_with_text_after_trunc_2.dump, src/testdir/dumps/Test_prop_with_text_after_trunc_3.dump, src/testdir/dumps/Test_prop_with_text_after_trunc_4.dump, src/testdir/dumps/Test_prop_with_text_after_trunc_5.dump, src/testdir/dumps/Test_prop_with_text_after_wraps_1.dump *** ../vim-9.0.0138/src/drawline.c 2022-08-01 16:50:58.869575285 +0100 --- src/drawline.c 2022-08-04 14:53:51.782503874 +0100 *************** *** 1554,1559 **** --- 1554,1561 ---- & TP_FLAG_ALIGN_RIGHT); int below = (text_props[used_tpi].tp_flags & TP_FLAG_ALIGN_BELOW); + int wrap = (text_props[used_tpi].tp_flags + & TP_FLAG_WRAP); p_extra = p; c_extra = NUL; *************** *** 1566,1591 **** // don't combine char attr after EOL text_prop_combine = FALSE; ! // TODO: truncation if it doesn't fit ! if (right || below) { int added = wp->w_width - col; char_u *l; ! // Right-align: fill with spaces ! if (right) ! added -= vim_strsize(p_extra); ! if (added < 0 || (below && col == 0)) ! added = 0; ! l = alloc(n_extra + added + 1); ! if (l != NULL) { ! vim_memset(l, ' ', added); ! STRCPY(l + added, p); ! vim_free(p_extra_free); ! p_extra = p_extra_free = l; ! n_extra += added; ! n_attr_skip = added; } } } --- 1568,1620 ---- // don't combine char attr after EOL text_prop_combine = FALSE; ! // Keep in sync with where ! // textprop_size_after_trunc() is called in ! // win_lbr_chartabsize(). ! if ((right || below || !wrap) && wp->w_width > 2) { int added = wp->w_width - col; + int n_used = n_extra; char_u *l; + int strsize = wrap + ? vim_strsize(p_extra) + : textprop_size_after_trunc(wp, + below, added, p_extra, &n_used); ! if (wrap || right || below || n_used < n_extra) { ! // Right-align: fill with spaces ! if (right) ! added -= strsize; ! if (added < 0 || (below && col == 0) ! || (!below && n_used < n_extra)) ! added = 0; ! // add 1 for NUL, 2 for when '…' is used ! l = alloc(n_used + added + 3); ! if (l != NULL) ! { ! vim_memset(l, ' ', added); ! vim_strncpy(l + added, p_extra, n_used); ! if (n_used < n_extra) ! { ! char_u *lp = l + added + n_used - 1; ! ! if (has_mbyte) ! { ! // change last character to '…' ! lp -= (*mb_head_off)(l, lp); ! STRCPY(lp, "…"); ! n_used = lp - l + 3; ! } ! else ! // change last character to '>' ! *lp = '>'; ! } ! vim_free(p_extra_free); ! p_extra = p_extra_free = l; ! n_extra = n_used + added; ! n_attr_skip = added; ! } } } } *************** *** 1598,1603 **** --- 1627,1640 ---- text_prop_follows = other_tpi != -1; } } + else if (text_prop_next < text_prop_count + && text_props[text_prop_next].tp_col == MAXCOL + && *ptr != NUL + && ptr[mb_ptr2len(ptr)] == NUL) + // When at last-but-one character and a text property + // follows after it, we may need to flush the line after + // displaying that character. + text_prop_follows = TRUE; } #endif *** ../vim-9.0.0138/src/structs.h 2022-07-31 17:11:47.898558951 +0100 --- src/structs.h 2022-08-03 21:39:12.406065001 +0100 *************** *** 815,820 **** --- 815,822 ---- #define TP_FLAG_WRAP 0x40 // virtual text wraps - when missing // text is truncated + #define PROP_TEXT_MIN_CELLS 4 // minimun number of cells to use for + // the text, even when truncating /* * Structure defining a property type. *** ../vim-9.0.0138/src/charset.c 2022-08-04 13:01:44.765330918 +0100 --- src/charset.c 2022-08-04 14:52:40.530685659 +0100 *************** *** 655,660 **** --- 655,663 ---- int ptr2cells(char_u *p) { + if (!has_mbyte) + return byte2cells(*p); + // For UTF-8 we need to look at more bytes if the first byte is >= 0x80. if (enc_utf8 && *p >= 0x80) return utf_ptr2cells(p); *************** *** 682,697 **** int size = 0; while (*s != NUL && --len >= 0) ! if (has_mbyte) ! { ! int l = (*mb_ptr2len)(s); ! size += ptr2cells(s); ! s += l; ! len -= l - 1; ! } ! else ! size += byte2cells(*s++); return size; } --- 685,697 ---- int size = 0; while (*s != NUL && --len >= 0) ! { ! int l = (*mb_ptr2len)(s); ! size += ptr2cells(s); ! s += l; ! len -= l - 1; ! } return size; } *************** *** 1026,1031 **** --- 1026,1065 ---- return retval; } + #if defined(FEAT_PROP_POPUP) || defined(PROTO) + /* + * Return the cell size of virtual text after truncation. + */ + int + textprop_size_after_trunc( + win_T *wp, + int below, + int added, + char_u *text, + int *n_used_ptr) + { + int space = below ? wp->w_width : added; + int len = (int)STRLEN(text); + int strsize = 0; + int n_used; + + // if the remaining size is to small wrap + // anyway and use the next line + if (space < PROP_TEXT_MIN_CELLS) + space += wp->w_width; + for (n_used = 0; n_used < len; n_used += (*mb_ptr2len)(text + n_used)) + { + int clen = ptr2cells(text + n_used); + + if (strsize + clen > space) + break; + strsize += clen; + } + *n_used_ptr = n_used; + return strsize; + } + #endif + /* * Return the screen size of the character indicated by "cts". * "cts->cts_cur_text_width" is set to the extra size for a text property that *************** *** 1110,1125 **** { char_u *p = ((char_u **)wp->w_buffer->b_textprop_text.ga_data)[ -tp->tp_id - 1]; ! int len = vim_strsize(p); if (tp->tp_col == MAXCOL) { ! // TODO: truncating ! if (tp->tp_flags & TP_FLAG_ALIGN_BELOW) ! len += wp->w_width - (vcol + size) % wp->w_width; } ! cts->cts_cur_text_width += len; ! size += len; } if (tp->tp_col - 1 > col) break; --- 1144,1171 ---- { char_u *p = ((char_u **)wp->w_buffer->b_textprop_text.ga_data)[ -tp->tp_id - 1]; ! int cells = vim_strsize(p); + added = wp->w_width - (vcol + size) % wp->w_width; if (tp->tp_col == MAXCOL) { ! int below = (tp->tp_flags & TP_FLAG_ALIGN_BELOW); ! int wrap = (tp->tp_flags & TP_FLAG_WRAP); ! int len = (int)STRLEN(p); ! int n_used = len; ! ! // Keep in sync with where textprop_size_after_trunc() is ! // called in win_line(). ! if (!wrap) ! cells = textprop_size_after_trunc(wp, ! below, added, p, &n_used); ! // right-aligned does not really matter here, same as ! // "after" ! if (below) ! cells += wp->w_width - (vcol + size) % wp->w_width; } ! cts->cts_cur_text_width += cells; ! size += cells; } if (tp->tp_col - 1 > col) break; *** ../vim-9.0.0138/src/proto/charset.pro 2022-08-04 13:01:44.765330918 +0100 --- src/proto/charset.pro 2022-08-04 13:52:24.423660017 +0100 *************** *** 33,38 **** --- 33,39 ---- void clear_chartabsize_arg(chartabsize_T *cts); int lbr_chartabsize(chartabsize_T *cts); int lbr_chartabsize_adv(chartabsize_T *cts); + int textprop_size_after_trunc(win_T *wp, int below, int added, char_u *text, int *n_used_ptr); int win_lbr_chartabsize(chartabsize_T *cts, int *headp); void getvcol(win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *end); colnr_T getvcol_nolist(pos_T *posp); *** ../vim-9.0.0138/src/testdir/test_textprop.vim 2022-08-02 11:48:48.295757318 +0100 --- src/testdir/test_textprop.vim 2022-08-04 15:01:09.125440149 +0100 *************** *** 2286,2291 **** --- 2286,2355 ---- call delete('XscriptPropsWithTextAfterJoined') endfunc + func Test_props_with_text_after_truncated() + CheckRunVimInTerminal + + let lines =<< trim END + call setline(1, ['one two three four five six seven']) + call prop_type_add('afterprop', #{highlight: 'Search'}) + call prop_add(1, 0, #{type: 'afterprop', text: ' ONE and TWO and THREE and FOUR and FIVE'}) + + call setline(2, ['one two three four five six seven']) + call prop_add(2, 0, #{type: 'afterprop', text: ' one AND two AND three AND four AND five', text_align: 'right'}) + + call setline(3, ['one two three four five six seven']) + call prop_add(3, 0, #{type: 'afterprop', text: ' one AND two AND three AND four AND five lets wrap after some more text', text_align: 'below'}) + + call setline(4, ['cursor here']) + normal 4Gfh + END + call writefile(lines, 'XscriptPropsWithTextAfterTrunc') + let buf = RunVimInTerminal('-S XscriptPropsWithTextAfterTrunc', #{rows: 9, cols: 60}) + call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_1', {}) + + call term_sendkeys(buf, ":37vsp\gg") + call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_2', {}) + + call term_sendkeys(buf, ":36wincmd |\") + call term_sendkeys(buf, "2G$") + call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_3', {}) + + call term_sendkeys(buf, ":33wincmd |\") + call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_4', {}) + + call term_sendkeys(buf, ":18wincmd |\") + call term_sendkeys(buf, "0fx") + call VerifyScreenDump(buf, 'Test_prop_with_text_after_trunc_5', {}) + + call StopVimInTerminal(buf) + call delete('XscriptPropsWithTextAfterTrunc') + endfunc + + func Test_props_with_text_after_wraps() + CheckRunVimInTerminal + + let lines =<< trim END + call setline(1, ['one two three four five six seven']) + call prop_type_add('afterprop', #{highlight: 'Search'}) + call prop_add(1, 0, #{type: 'afterprop', text: ' ONE and TWO and THREE and FOUR and FIVE', text_wrap: 'wrap'}) + + call setline(2, ['one two three four five six seven']) + call prop_add(2, 0, #{type: 'afterprop', text: ' one AND two AND three AND four AND five', text_align: 'right', text_wrap: 'wrap'}) + + call setline(3, ['one two three four five six seven']) + call prop_add(3, 0, #{type: 'afterprop', text: ' one AND two AND three AND four AND five lets wrap after some more text', text_align: 'below', text_wrap: 'wrap'}) + + call setline(4, ['cursor here']) + normal 4Gfh + END + call writefile(lines, 'XscriptPropsWithTextAfterWraps') + let buf = RunVimInTerminal('-S XscriptPropsWithTextAfterWraps', #{rows: 9, cols: 60}) + call VerifyScreenDump(buf, 'Test_prop_with_text_after_wraps_1', {}) + + call StopVimInTerminal(buf) + call delete('XscriptPropsWithTextAfterWraps') + endfunc + func Test_removed_prop_with_text_cleans_up_array() new call setline(1, 'some text here') *** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_1.dump 2022-08-04 15:02:44.857215391 +0100 --- src/testdir/dumps/Test_prop_with_text_after_trunc_1.dump 2022-08-04 14:36:51.237747576 +0100 *************** *** 0 **** --- 1,9 ---- + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|O|N|E| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d|… + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D|… + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @26 + | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D| |f|i|v|e| |l|e|t|s| |w|r|a|p| |a|f|t|e|r| |s|o|… + |c+0&#ffffff0|u|r|s|o|r| >h|e|r|e| @48 + |~+0#4040ff13&| @58 + |~| @58 + |~| @58 + | +0#0000000&@41|4|,|8| @10|A|l@1| *** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_2.dump 2022-08-04 15:02:44.865215371 +0100 --- src/testdir/dumps/Test_prop_with_text_after_trunc_2.dump 2022-08-04 14:36:52.401742439 +0100 *************** *** 0 **** --- 1,9 ---- + >o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|O|N|…||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v + |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|…||+1&#ffffff0|e+0&&| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|… + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @3||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v + | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D| |…||+1&#ffffff0|e+0&&| |s|i|x| |s|e|v|e|n| @10 + |c|u|r|s|o|r| |h|e|r|e| @25||+1&&| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e|… + |~+0#4040ff13#ffffff0| @35||+1#0000000&|c+0&&|u|r|s|o|r| |h|e|r|e| @10 + |~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @20 + |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|A|l@1| |<+1&&|N|a|m|e|]| |[|+|]| |4|,|8| @4|B|o|t + |:+0&&|3|7|v|s|p| @53 *** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_3.dump 2022-08-04 15:02:44.869215362 +0100 --- src/testdir/dumps/Test_prop_with_text_after_trunc_3.dump 2022-08-04 14:36:53.565737306 +0100 *************** *** 0 **** --- 1,9 ---- + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|O|N||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e + |E+0&#ffff4012| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d| |F|O|U|R| |a|n|d| |F|I|…||+1&#ffffff0| +0&&|s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o|… + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e>n| +0&#ffff4012|o|n||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e + |e+0&#ffff4012| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D| |f|i|…||+1&#ffffff0| +0&&|s|i|x| |s|e|v|e|n| @12 + |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @2||+1&&| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1|… + | |o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D|…||+1&#ffffff0|c+0&&|u|r|s|o|r| |h|e|r|e| @11 + |c|u|r|s|o|r| |h|e|r|e| @24||+1&&|~+0#4040ff13&| @21 + |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @4|2|,|3@1| @10|A|l@1| |<+1&&| |N|a|m|e|]| |[|+|]| |4|,|8| @4|B|o|t + |:+0&&|3|6|w|i|n|c|m|d| ||| @48 *** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_4.dump 2022-08-04 15:02:44.873215353 +0100 --- src/testdir/dumps/Test_prop_with_text_after_trunc_4.dump 2022-08-04 14:36:54.733732163 +0100 *************** *** 0 **** --- 1,9 ---- + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i + | +0&#ffff4012|O|N|E| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d| |F|O|U|R| |…||+1&#ffffff0|x+0&&| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|… + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e>n||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i + | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |…||+1&#ffffff0|x+0&&| |s|e|v|e|n| @18 + |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n||+1&&| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|… + | |o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |…||+1&#ffffff0|c+0&&|u|r|s|o|r| |h|e|r|e| @14 + |c|u|r|s|o|r| |h|e|r|e| @21||+1&&|~+0#4040ff13&| @24 + |[+3#0000000&|N|o| |N|a|m|e|]| |[|+|]| @3|2|,|3@1| @8|A|l@1| |<+1&&|o| |N|a|m|e|]| |[|+|]| |4|,|8| @6|B|o|t + |:+0&&|3@1|w|i|n|c|m|d| ||| @48 *** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_trunc_5.dump 2022-08-04 15:02:44.877215345 +0100 --- src/testdir/dumps/Test_prop_with_text_after_trunc_5.dump 2022-08-04 15:01:14.965426377 +0100 *************** *** 0 **** --- 1,9 ---- + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r||+1&&|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|… + | +0&#ffffff0|f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|O|N||+1&#ffffff0|o+0&&|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @7 + |E+0&#ffff4012| |a|n|d| |T|W|O| |a|n|d| |T|H|R|…||+1&#ffffff0| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D| |f|i|v|e|… + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r||+1&&|c+0&&|u|r|s|o|r| |h|e|r|e| @29 + @1|f|i|v|e| |s|i>x| |s|e|v|e|n| +0&#ffff4012|o|n||+1&#ffffff0|~+0#4040ff13&| @39 + |e+0#0000000#ffff4012| |A|N|D| |t|w|o| |A|N|D| |t|h|r|…||+1&#ffffff0|~+0#4040ff13&| @39 + |@@2| @14||+1#0000000&|~+0#4040ff13&| @39 + |<+3#0000000&|m|e|]| |[|+|]| |2|,|2|7| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @9|4|,|8| @11|B|o|t + |:+0&&|1|8|w|i|n|c|m|d| ||| @48 *** ../vim-9.0.0138/src/testdir/dumps/Test_prop_with_text_after_wraps_1.dump 2022-08-04 15:02:44.881215334 +0100 --- src/testdir/dumps/Test_prop_with_text_after_wraps_1.dump 2022-08-02 21:45:50.596698045 +0100 *************** *** 0 **** --- 1,9 ---- + |o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|O|N|E| |a|n|d| |T|W|O| |a|n|d| |T|H|R|E@1| |a|n|d| + |F|O|U|R| |a|n|d| |F|I|V|E| +0&#ffffff0@46 + |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| + |f|o|u|r| |A|N|D| |f|i|v|e| +0&#ffffff0@46 + |o|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| |s|i|x| |s|e|v|e|n| @26 + | +0&#ffff4012|o|n|e| |A|N|D| |t|w|o| |A|N|D| |t|h|r|e@1| |A|N|D| |f|o|u|r| |A|N|D| |f|i|v|e| |l|e|t|s| |w|r|a|p| |a|f|t|e|r| |s|o|m + |e| |m|o|r|e| |t|e|x|t| +0&#ffffff0@48 + |c|u|r|s|o|r| >h|e|r|e| @48 + @42|4|,|8| @10|A|l@1| *** ../vim-9.0.0138/src/version.c 2022-08-04 13:01:44.769330917 +0100 --- src/version.c 2022-08-04 15:02:31.893245711 +0100 *************** *** 737,738 **** --- 737,740 ---- { /* Add new patch number below this line */ + /**/ + 139, /**/ -- A man is incomplete until he's married ... and then he's finished! /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///