]> granicus.if.org Git - vim/commitdiff
patch 9.0.0133: virtual text after line moves to joined line v9.0.0133
authorBram Moolenaar <Bram@vim.org>
Mon, 1 Aug 2022 21:18:50 +0000 (22:18 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 1 Aug 2022 21:18:50 +0000 (22:18 +0100)
Problem:    Virtual text after line moves to joined line. (Yegappan
            Lakshmanan)
Solution:   When joining lines only keep virtual text after the last line.

src/ops.c
src/proto/textprop.pro
src/testdir/dumps/Test_prop_with_text_after_joined_1.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/textprop.c
src/version.c

index c160e88c51efd50b5172341b3937bbb4891216dd..0cd5f7238349034994c4d9200faa31e93962e7f9 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -2012,7 +2012,8 @@ do_join(
     {
        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);
+       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,7 +2148,6 @@ do_join(
                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));
index 4a6bab3083134ec41001a1811766a642cfe3d76b..0c580df3d1597ad9eb4f4594bc41c6f37d6c3da4 100644 (file)
@@ -4,7 +4,7 @@ void f_prop_add(typval_T *argvars, typval_T *rettv);
 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 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,5 +20,5 @@ void clear_global_prop_types(void);
 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);
+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 : */
diff --git a/src/testdir/dumps/Test_prop_with_text_after_joined_1.dump b/src/testdir/dumps/Test_prop_with_text_after_joined_1.dump
new file mode 100644 (file)
index 0000000..0a4e73d
--- /dev/null
@@ -0,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| 
index 46ee37e96a35350808cf06c5864bab28714ab090..c05a963895efabf5aee180324cbc1e31617d5995 100644 (file)
@@ -2243,6 +2243,32 @@ func Test_props_with_text_after()
   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')
index 6fefc6d24cf5efef4f27286974f23615eb696495..9a9544c503e17ebe89b8666f4bc1eb576af5d1f5 100644 (file)
@@ -600,7 +600,7 @@ get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change)
  * be considered.
  */
     int
-count_props(linenr_T lnum, int only_starting)
+count_props(linenr_T lnum, int only_starting, int last_line)
 {
     char_u     *props;
     int                proplen = get_text_props(curbuf, lnum, &props, 0);
@@ -608,13 +608,16 @@ count_props(linenr_T lnum, int only_starting)
     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;
-       }
+    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,7 +2027,7 @@ prepend_joined_props(
        int         propcount,
        int         *props_remaining,
        linenr_T    lnum,
-       int         add_all,
+       int         last_line,
        long        col,
        int         removed)
 {
@@ -2038,12 +2041,14 @@ prepend_joined_props(
        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 (add_all || end)
+       if (last_line || end)
            mch_memmove(new_props + --(*props_remaining) * sizeof(prop),
                                                          &prop, sizeof(prop));
        else
index 6b5290ced9f1eb86639d659a43762f7581a5fcb5..75f24c66e6c2857bb8d67a3c19eb94557dda6ffb 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    133,
 /**/
     132,
 /**/