]> granicus.if.org Git - vim/commitdiff
patch 8.1.1890: ml_get error when deleting fold marker v8.1.1890
authorBram Moolenaar <Bram@vim.org>
Mon, 19 Aug 2019 20:48:30 +0000 (22:48 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 19 Aug 2019 20:48:30 +0000 (22:48 +0200)
Problem:    Ml_get error when deleting fold marker.
Solution:   Check that the line number is not below the last line.  Adjust the
            fold when deleting the empty line.  (Christian Brabandt,
            closes #4834)

src/fold.c
src/normal.c
src/testdir/test_fold.vim
src/version.c

index 4cc7a477d7a3392f07e7c837aec5cab0fb24885a..482d3c96822aa7da9af7ebfbc2df0500f91da85b 100644 (file)
@@ -1813,7 +1813,7 @@ deleteFoldMarkers(
 /*
  * Delete marker "marker[markerlen]" at the end of line "lnum".
  * Delete 'commentstring' if it matches.
- * If the marker is not found, there is no error message.  Could a missing
+ * If the marker is not found, there is no error message.  Could be a missing
  * close-marker.
  */
     static void
@@ -1826,6 +1826,9 @@ foldDelMarker(linenr_T lnum, char_u *marker, int markerlen)
     char_u     *cms = curbuf->b_p_cms;
     char_u     *cms2;
 
+    // end marker may be missing and fold extends below the last line
+    if (lnum > curbuf->b_ml.ml_line_count)
+       return;
     line = ml_get(lnum);
     for (p = line; *p != NUL; ++p)
        if (STRNCMP(p, marker, markerlen) == 0)
@@ -2733,16 +2736,19 @@ foldUpdateIEMSRecurse(
      * lvl >= level: fold continues below "bot"
      */
 
-    /* Current fold at least extends until lnum. */
+    // Current fold at least extends until lnum.
     if (fp->fd_len < flp->lnum - fp->fd_top)
     {
        fp->fd_len = flp->lnum - fp->fd_top;
        fp->fd_small = MAYBE;
        fold_changed = TRUE;
     }
+    else if (fp->fd_top + fp->fd_len > linecount)
+       // running into the end of the buffer (deleted last line)
+       fp->fd_len = linecount - fp->fd_top + 1;
 
-    /* Delete contained folds from the end of the last one found until where
-     * we stopped looking. */
+    // Delete contained folds from the end of the last one found until where
+    // we stopped looking.
     foldRemove(&fp->fd_nested, startlnum2 - fp->fd_top,
                                                  flp->lnum - 1 - fp->fd_top);
 
index 7951bd5c36c8eecf47bb557378a7e7f803c2b233..1db1d16abb4d626a42a088c51a8940fbcfa5fee8 100644 (file)
@@ -9346,13 +9346,15 @@ nv_put_opt(cmdarg_T *cap, int fix_indent)
                reg1 = get_register(regname, TRUE);
            }
 
-           /* Now delete the selected text. */
+           // Now delete the selected text. Avoid messages here.
            cap->cmdchar = 'd';
            cap->nchar = NUL;
            cap->oap->regname = NUL;
+           ++msg_silent;
            nv_operator(cap);
            do_pending_operator(cap, 0, FALSE);
            empty = (curbuf->b_ml.ml_flags & ML_EMPTY);
+           --msg_silent;
 
            /* delete PUT_LINE_BACKWARD; */
            cap->oap->regname = regname;
@@ -9407,6 +9409,7 @@ nv_put_opt(cmdarg_T *cap, int fix_indent)
        if (empty && *ml_get(curbuf->b_ml.ml_line_count) == NUL)
        {
            ml_delete(curbuf->b_ml.ml_line_count, TRUE);
+           deleted_lines(curbuf->b_ml.ml_line_count + 1, 1);
 
            /* If the cursor was in that line, move it to the end of the last
             * line. */
index dc5879516c24173d8fba5700402dc43845b0eef0..1d5259f6bb36c06c72509056f355d9ee5849f8df 100644 (file)
@@ -741,3 +741,19 @@ func Test_folds_marker_in_comment2()
   set foldmethod&
   bwipe!
 endfunc
+
+func Test_fold_delete_with_marker()
+  new
+  call setline(1, ['func Func() {{{1', 'endfunc'])
+  1,2yank
+  new
+  set fdm=marker
+  call setline(1, 'x')
+  normal! Vp
+  normal! zd
+  call assert_equal(['func Func() ', 'endfunc'], getline(1, '$'))
+
+  set fdm&
+  bwipe!
+  bwipe!
+endfunc
index d7bdfa2c0681e82b003a51e4fc62c76106a6e814..c6944cf4fff213e7814926be7b2df3811e452327 100644 (file)
@@ -765,6 +765,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1890,
 /**/
     1889,
 /**/