To: vim_dev@googlegroups.com Subject: Patch 9.0.0133 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0133 Problem: Virtual text after line moves to joined line. (Yegappan Lakshmanan) Solution: When joining lines only keep virtual text after the last line. Files: src/textprop.c, src/proto/textprop.pro, src/ops.c, src/testdir/test_textprop.vim, src/testdir/dumps/Test_prop_with_text_after_joined_1.dump *** ../vim-9.0.0132/src/textprop.c 2022-08-01 16:11:02.656646804 +0100 --- src/textprop.c 2022-08-01 22:03:07.426795153 +0100 *************** *** 600,606 **** * be considered. */ int ! count_props(linenr_T lnum, int only_starting) { char_u *props; int proplen = get_text_props(curbuf, lnum, &props, 0); --- 600,606 ---- * be considered. */ int ! count_props(linenr_T lnum, int only_starting, int last_line) { char_u *props; int proplen = get_text_props(curbuf, lnum, &props, 0); *************** *** 608,620 **** int i; textprop_T prop; ! if (only_starting) ! for (i = 0; i < proplen; ++i) ! { ! mch_memmove(&prop, props + i * sizeof(prop), sizeof(prop)); ! if (prop.tp_flags & TP_FLAG_CONT_PREV) ! --result; ! } return result; } --- 608,623 ---- int i; textprop_T prop; ! for (i = 0; i < proplen; ++i) ! { ! mch_memmove(&prop, props + i * sizeof(prop), sizeof(prop)); ! // A prop is droppend when in the first line and it continues from the ! // previous line, or when not in the last line and it is virtual text ! // after the line. ! if ((only_starting && (prop.tp_flags & TP_FLAG_CONT_PREV)) ! || (!last_line && prop.tp_col == MAXCOL)) ! --result; ! } return result; } *************** *** 2024,2030 **** int propcount, int *props_remaining, linenr_T lnum, ! int add_all, long col, int removed) { --- 2027,2033 ---- int propcount, int *props_remaining, linenr_T lnum, ! int last_line, long col, int removed) { *************** *** 2038,2049 **** int end; mch_memmove(&prop, props + i * sizeof(prop), sizeof(prop)); end = !(prop.tp_flags & TP_FLAG_CONT_NEXT); adjust_prop(&prop, 0, -removed, 0); // Remove leading spaces adjust_prop(&prop, -1, col, 0); // Make line start at its final column ! if (add_all || end) mch_memmove(new_props + --(*props_remaining) * sizeof(prop), &prop, sizeof(prop)); else --- 2041,2054 ---- int end; mch_memmove(&prop, props + i * sizeof(prop), sizeof(prop)); + if (prop.tp_col == MAXCOL && !last_line) + continue; // drop property with text after the line end = !(prop.tp_flags & TP_FLAG_CONT_NEXT); adjust_prop(&prop, 0, -removed, 0); // Remove leading spaces adjust_prop(&prop, -1, col, 0); // Make line start at its final column ! if (last_line || end) mch_memmove(new_props + --(*props_remaining) * sizeof(prop), &prop, sizeof(prop)); else *** ../vim-9.0.0132/src/proto/textprop.pro 2022-07-25 18:13:33.050580738 +0100 --- src/proto/textprop.pro 2022-08-01 22:03:19.086791605 +0100 *************** *** 4,10 **** void f_prop_add_list(typval_T *argvars, typval_T *rettv); int prop_add_common(linenr_T start_lnum, colnr_T start_col, dict_T *dict, buf_T *default_buf, typval_T *dict_arg); int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change); ! int count_props(linenr_T lnum, int only_starting); int find_visible_prop(win_T *wp, int type_id, int id, textprop_T *prop, linenr_T *found_lnum); proptype_T *text_prop_type_by_id(buf_T *buf, int id); void f_prop_clear(typval_T *argvars, typval_T *rettv); --- 4,10 ---- void f_prop_add_list(typval_T *argvars, typval_T *rettv); int prop_add_common(linenr_T start_lnum, colnr_T start_col, dict_T *dict, buf_T *default_buf, typval_T *dict_arg); int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change); ! int count_props(linenr_T lnum, int only_starting, int last_line); int find_visible_prop(win_T *wp, int type_id, int id, textprop_T *prop, linenr_T *found_lnum); proptype_T *text_prop_type_by_id(buf_T *buf, int id); void f_prop_clear(typval_T *argvars, typval_T *rettv); *************** *** 20,24 **** void clear_buf_prop_types(buf_T *buf); int adjust_prop_columns(linenr_T lnum, colnr_T col, int bytes_added, int flags); void adjust_props_for_split(linenr_T lnum_props, linenr_T lnum_top, int kept, int deleted); ! void prepend_joined_props(char_u *new_props, int propcount, int *props_remaining, linenr_T lnum, int add_all, long col, int removed); /* vim: set ft=c : */ --- 20,24 ---- void clear_buf_prop_types(buf_T *buf); int adjust_prop_columns(linenr_T lnum, colnr_T col, int bytes_added, int flags); void adjust_props_for_split(linenr_T lnum_props, linenr_T lnum_top, int kept, int deleted); ! void prepend_joined_props(char_u *new_props, int propcount, int *props_remaining, linenr_T lnum, int last_line, long col, int removed); /* vim: set ft=c : */ *** ../vim-9.0.0132/src/ops.c 2022-07-30 16:54:01.867698285 +0100 --- src/ops.c 2022-08-01 22:09:37.058648407 +0100 *************** *** 2012,2018 **** { curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t)); #ifdef FEAT_PROP_POPUP ! propcount += count_props((linenr_T) (curwin->w_cursor.lnum + t), t > 0); #endif if (t == 0 && setmark && (cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0) { --- 2012,2019 ---- { curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t)); #ifdef FEAT_PROP_POPUP ! propcount += count_props((linenr_T) (curwin->w_cursor.lnum + t), ! t > 0, t + 1 == count); #endif if (t == 0 && setmark && (cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0) { *************** *** 2147,2153 **** curwin->w_cursor.lnum + t, t == count - 1, (long)(cend - newp), spaces_removed); #endif - if (t == 0) break; curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t - 1)); --- 2148,2153 ---- *** ../vim-9.0.0132/src/testdir/test_textprop.vim 2022-08-01 16:50:58.869575285 +0100 --- src/testdir/test_textprop.vim 2022-08-01 22:12:58.186556839 +0100 *************** *** 2243,2248 **** --- 2243,2274 ---- call delete('XscriptPropsWithTextAfter') endfunc + func Test_props_with_text_after_joined() + CheckRunVimInTerminal + + let lines =<< trim END + call setline(1, ['one', 'two', 'three', 'four']) + call prop_type_add('afterprop', #{highlight: 'Search'}) + call prop_add(1, 0, #{type: 'afterprop', text: ' ONE', text_align: 'after'}) + call prop_add(4, 0, #{type: 'afterprop', text: ' FOUR', text_align: 'after'}) + normal ggJ + normal GkJ + + call setline(3, ['a', 'b', 'c', 'd', 'e', 'f']) + call prop_add(3, 0, #{type: 'afterprop', text: ' AAA', text_align: 'after'}) + call prop_add(5, 0, #{type: 'afterprop', text: ' CCC', text_align: 'after'}) + call prop_add(7, 0, #{type: 'afterprop', text: ' EEE', text_align: 'after'}) + call prop_add(8, 0, #{type: 'afterprop', text: ' FFF', text_align: 'after'}) + normal 3G6J + END + call writefile(lines, 'XscriptPropsWithTextAfterJoined') + let buf = RunVimInTerminal('-S XscriptPropsWithTextAfterJoined', #{rows: 6, cols: 60}) + call VerifyScreenDump(buf, 'Test_prop_with_text_after_joined_1', {}) + + call StopVimInTerminal(buf) + call delete('XscriptPropsWithTextAfterJoined') + endfunc + func Test_removed_prop_with_text_cleans_up_array() new call setline(1, 'some text here') *** ../vim-9.0.0132/src/testdir/dumps/Test_prop_with_text_after_joined_1.dump 2022-08-01 22:16:59.600536521 +0100 --- src/testdir/dumps/Test_prop_with_text_after_joined_1.dump 2022-08-01 22:13:23.762544691 +0100 *************** *** 0 **** --- 1,6 ---- + |o+0&#ffffff0|n|e| |t|w|o| @52 + |t|h|r|e@1| |f|o|u|r| +0&#ffff4012|F|O|U|R| +0&#ffffff0@44 + |a| |b| |c| |d| |e> |f| +0&#ffff4012|F@2| +0&#ffffff0@44 + |~+0#4040ff13&| @58 + |~| @58 + | +0#0000000&@41|3|,|1|0| @9|A|l@1| *** ../vim-9.0.0132/src/version.c 2022-08-01 16:50:58.869575285 +0100 --- src/version.c 2022-08-01 21:35:55.593941508 +0100 *************** *** 737,738 **** --- 737,740 ---- { /* Add new patch number below this line */ + /**/ + 133, /**/ -- If evolution theories are correct, humans will soon grow a third hand for operating the mouse. /// 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 ///