From 2c680a58541af00f064e7fe80d3414fd6c748178 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Tue, 9 Oct 2018 03:04:51 -0400 Subject: vim-patch:8.0.1779: deleting in a block selection causes problems (#9099) Problem: Deleting in a block selection causes problems. Solution: Check the length of the line before adding bd.textcol and bd.textlen. (Christian Brabandt, closes vim/vim#2825) https://github.com/vim/vim/commit/35e802e713382d7e76232ad344af7dcd577e43de --- src/nvim/ops.c | 14 +++++++++++--- src/nvim/testdir/test_blockedit.vim | 13 +++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nvim/ops.c b/src/nvim/ops.c index e902127a40..5a6e56299d 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -2159,9 +2159,17 @@ void op_insert(oparg_T *oap, long count1) * Subsequent calls to ml_get() flush the firstline data - take a * copy of the required string. */ - firstline = ml_get(oap->start.lnum) + bd.textcol; - if (oap->op_type == OP_APPEND) - firstline += bd.textlen; + firstline = ml_get(oap->start.lnum); + const size_t len = STRLEN(firstline); + colnr_T add = bd.textcol; + if (oap->op_type == OP_APPEND) { + add += bd.textlen; + } + if ((size_t)add > len) { + firstline += len; // short line, point to the NUL + } else { + firstline += add; + } ins_len = (long)STRLEN(firstline) - pre_textlen; if (pre_textlen >= 0 && ins_len > 0) { ins_text = vim_strnsave(firstline, (size_t)ins_len); diff --git a/src/nvim/testdir/test_blockedit.vim b/src/nvim/testdir/test_blockedit.vim index 4a8d59952e..527224ccd2 100644 --- a/src/nvim/testdir/test_blockedit.vim +++ b/src/nvim/testdir/test_blockedit.vim @@ -16,5 +16,18 @@ func Test_blockinsert_indent() bwipe! endfunc +func Test_blockinsert_delete() + new + let _bs = &bs + set bs=2 + call setline(1, ['case Arg is ', ' when Name_Async,', ' when Name_Num_Gangs,', 'end if;']) + exe "norm! ggjVj\$o$A\\" + "call feedkeys("Vj\$o$A\\", 'ti') + call assert_equal(["case Arg is ", " when Name_Async", " when Name_Num_Gangs,", "end if;"], + \ getline(1,'$')) + " reset to sane state + let &bs = _bs + bwipe! +endfunc " vim: shiftwidth=2 sts=2 expandtab -- cgit