]> granicus.if.org Git - vim/commitdiff
patch 7.4.734 v7.4.734
authorBram Moolenaar <Bram@vim.org>
Tue, 9 Jun 2015 18:20:03 +0000 (20:20 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 9 Jun 2015 18:20:03 +0000 (20:20 +0200)
Problem:    ml_get error when using "p" in a Visual selection in the last
            line.
Solution:   Change the behavior at the last line. (Yukihiro Nakadaira)

src/normal.c
src/ops.c
src/testdir/test94.in
src/testdir/test94.ok
src/version.c

index 0ec803733c4a72b7b628463be4e7237f6a21a03e..38a9f81b4ec24f845e80e3d82ab86ecdd3da145a 100644 (file)
@@ -1547,8 +1547,10 @@ do_pending_operator(cap, old_col, gui_yank)
            }
 
            /* In Select mode, a linewise selection is operated upon like a
-            * characterwise selection. */
-           if (VIsual_select && VIsual_mode == 'V')
+            * characterwise selection.
+            * Special case: gH<Del> deletes the last line. */
+           if (VIsual_select && VIsual_mode == 'V'
+                                           && cap->oap->op_type != OP_DELETE)
            {
                if (lt(VIsual, curwin->w_cursor))
                {
@@ -1770,24 +1772,16 @@ do_pending_operator(cap, old_col, gui_yank)
                    oap->inclusive = FALSE;
                    /* Try to include the newline, unless it's an operator
                     * that works on lines only. */
-                   if (*p_sel != 'o' && !op_on_lines(oap->op_type))
+                   if (*p_sel != 'o'
+                           && !op_on_lines(oap->op_type)
+                           && oap->end.lnum < curbuf->b_ml.ml_line_count)
                    {
-                       if (oap->end.lnum < curbuf->b_ml.ml_line_count)
-                       {
-                           ++oap->end.lnum;
-                           oap->end.col = 0;
+                       ++oap->end.lnum;
+                       oap->end.col = 0;
 #ifdef FEAT_VIRTUALEDIT
-                           oap->end.coladd = 0;
+                       oap->end.coladd = 0;
 #endif
-                           ++oap->line_count;
-                       }
-                       else
-                       {
-                           /* Cannot move below the last line, make the op
-                            * inclusive to tell the operation to include the
-                            * line break. */
-                           oap->inclusive = TRUE;
-                       }
+                       ++oap->line_count;
                    }
                }
            }
index 090d3f8918a9c4763e8ed8a07e5f01b8be942d2e..05b1e1cc2e43a9099312473e3a444a858712b043 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -1959,60 +1959,31 @@ op_delete(oap)
                    curwin->w_cursor.coladd = 0;
            }
 #endif
-           if (oap->op_type == OP_DELETE
-                   && oap->inclusive
-                   && oap->end.lnum == curbuf->b_ml.ml_line_count
-                   && n > (int)STRLEN(ml_get(oap->end.lnum)))
-           {
-               /* Special case: gH<Del> deletes the last line. */
-               del_lines(1L, FALSE);
-           }
-           else
-           {
-               (void)del_bytes((long)n, !virtual_op,
-                               oap->op_type == OP_DELETE && !oap->is_VIsual);
-           }
+           (void)del_bytes((long)n, !virtual_op,
+                           oap->op_type == OP_DELETE && !oap->is_VIsual);
        }
        else                            /* delete characters between lines */
        {
            pos_T   curpos;
-           int     delete_last_line;
 
            /* save deleted and changed lines for undo */
            if (u_save((linenr_T)(curwin->w_cursor.lnum - 1),
                 (linenr_T)(curwin->w_cursor.lnum + oap->line_count)) == FAIL)
                return FAIL;
 
-           delete_last_line = (oap->end.lnum == curbuf->b_ml.ml_line_count);
            truncate_line(TRUE);        /* delete from cursor to end of line */
 
            curpos = curwin->w_cursor;  /* remember curwin->w_cursor */
            ++curwin->w_cursor.lnum;
            del_lines((long)(oap->line_count - 2), FALSE);
 
-           if (delete_last_line)
-               oap->end.lnum = curbuf->b_ml.ml_line_count;
-
+           /* delete from start of line until op_end */
            n = (oap->end.col + 1 - !oap->inclusive);
-           if (oap->inclusive && delete_last_line
-                   && n > (int)STRLEN(ml_get(oap->end.lnum)))
-           {
-               /* Special case: gH<Del> deletes the last line. */
-               del_lines(1L, FALSE);
-               curwin->w_cursor = curpos;      /* restore curwin->w_cursor */
-               if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
-                   curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
-           }
-           else
-           {
-               /* delete from start of line until op_end */
-               curwin->w_cursor.col = 0;
-               (void)del_bytes((long)n, !virtual_op,
-                               oap->op_type == OP_DELETE && !oap->is_VIsual);
-               curwin->w_cursor = curpos;      /* restore curwin->w_cursor */
-           }
-           if (curwin->w_cursor.lnum < curbuf->b_ml.ml_line_count)
-               (void)do_join(2, FALSE, FALSE, FALSE, FALSE);
+           curwin->w_cursor.col = 0;
+           (void)del_bytes((long)n, !virtual_op,
+                           oap->op_type == OP_DELETE && !oap->is_VIsual);
+           curwin->w_cursor = curpos;  /* restore curwin->w_cursor */
+           (void)do_join(2, FALSE, FALSE, FALSE, FALSE);
        }
     }
 
index dfa91d8340c21582992372a6a6fbb364b5b1db2b..e98d58875ce348f419b3d10f0f37023d8f5e5127 100644 (file)
@@ -64,6 +64,116 @@ dV:\rdv:\r:set noma | let v:errmsg = ''
 d:\r:set ma | put = v:errmsg =~# '^E21' ? 'ok' : 'failed'
 dv:\edV:\e:set noma | let v:errmsg = ''
 d:\e:set ma | put = v:errmsg =~# '^E21' ? 'failed' : 'ok'
+:
+:$put =''
+:$put ='characterwise visual mode: replace last line'
+:$put ='a'
+:let @" = 'x'
+:let v:errmsg = ''
+v$p
+:$put ='---'
+:$put ='v:errmsg='.v:errmsg
+:
+:$put =''
+:$put ='characterwise visual mode: delete middle line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kkv$d
+:$put ='---'
+:
+:$put =''
+:$put ='characterwise visual mode: delete middle two line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kkvj$d
+:$put ='---'
+:
+:$put =''
+:$put ='characterwise visual mode: delete last line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+v$d
+:$put ='---'
+:
+:$put =''
+:$put ='characterwise visual mode: delete last two line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kvj$d
+:$put ='---'
+:
+:" Select mode maps
+:snoremap <lt>End> <End>
+:snoremap <lt>Down> <Down>
+:snoremap <lt>Del> <Del>
+:
+:$put =''
+:$put ='characterwise select mode: delete middle line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kkgh<End><Del>
+:$put ='---'
+:
+:$put =''
+:$put ='characterwise select mode: delete middle two line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kkgh<Down><End><Del>
+:$put ='---'
+:
+:$put =''
+:$put ='characterwise select mode: delete last line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+gh<End><Del>
+:$put ='---'
+:
+:$put =''
+:$put ='characterwise select mode: delete last two line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kgh<Down><End><Del>
+:$put ='---'
+:
+:$put =''
+:$put ='linewise select mode: delete middle line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kkgH<Del>
+:$put ='---'
+:
+:$put =''
+:$put ='linewise select mode: delete middle two line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kkgH<Down><Del>
+:$put ='---'
+:
+:$put =''
+:$put ='linewise select mode: delete last line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+gH<Del>
+:$put ='---'
+:
+:$put =''
+:$put ='linewise select mode: delete last two line'
+:$put ='a'
+:$put ='b'
+:$put ='c'
+kgH<Down><Del>
+:$put ='---'
 :/^start:/+2,$w! test.out
 :q!
 ENDTEST
index 3996f2a3a4c320de0c07edb873abd4090d499841..9207ea5b5e402fb19c9f0591b16572b8dc0517ab 100644 (file)
@@ -18,3 +18,66 @@ LemonNewNewZ
 zzz
 ok
 ok
+
+characterwise visual mode: replace last line
+x
+---
+v:errmsg=
+
+characterwise visual mode: delete middle line
+b
+c
+---
+
+characterwise visual mode: delete middle two line
+c
+---
+
+characterwise visual mode: delete last line
+a
+b
+
+---
+
+characterwise visual mode: delete last two line
+a
+
+---
+
+characterwise select mode: delete middle line
+b
+c
+---
+
+characterwise select mode: delete middle two line
+c
+---
+
+characterwise select mode: delete last line
+a
+b
+
+---
+
+characterwise select mode: delete last two line
+a
+
+---
+
+linewise select mode: delete middle line
+b
+c
+---
+
+linewise select mode: delete middle two line
+c
+---
+
+linewise select mode: delete last line
+a
+b
+---
+
+linewise select mode: delete last two line
+a
+---
index 4e5e0c9eb7ebcf36c35dcf254d944f8a50a006b9..a21ec5effbb92fd7d6822e4f0709a64f42f2ebd6 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    734,
 /**/
     733,
 /**/