diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-05-23 19:35:44 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-05-23 19:50:52 -0400 |
commit | b87a1db5acbe9a1e210c20d625e5bee19240c3a4 (patch) | |
tree | 3bdd9cfe5b7c0568539af195398ebcb5b04e6278 | |
parent | 66d127957ed3cc27af0344c742bc5acedd347894 (diff) | |
download | rneovim-b87a1db5acbe9a1e210c20d625e5bee19240c3a4.tar.gz rneovim-b87a1db5acbe9a1e210c20d625e5bee19240c3a4.tar.bz2 rneovim-b87a1db5acbe9a1e210c20d625e5bee19240c3a4.zip |
vim-patch:8.1.1373: "[p" in Visual mode puts in wrong line
Problem: "[p" in Visual mode puts in wrong line.
Solution: Call nv_put() instead of duplicating the functionality.
(closes vim/vim#4408)
https://github.com/vim/vim/commit/0ab190c05706b1c72e6e2ca4d990febfa81cf886
-rw-r--r-- | src/nvim/normal.c | 58 | ||||
-rw-r--r-- | src/nvim/testdir/test_put.vim | 12 |
2 files changed, 29 insertions, 41 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c index ca586cca29..fbf1cc04e2 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -5638,44 +5638,7 @@ static void nv_brackets(cmdarg_T *cap) * "[p", "[P", "]P" and "]p": put with indent adjustment */ else if (cap->nchar == 'p' || cap->nchar == 'P') { - if (!checkclearop(cap->oap)) { - int dir = (cap->cmdchar == ']' && cap->nchar == 'p') ? FORWARD : BACKWARD; - int regname = cap->oap->regname; - int was_visual = VIsual_active; - linenr_T line_count = curbuf->b_ml.ml_line_count; - pos_T start, end; - - if (VIsual_active) { - start = ltoreq(VIsual, curwin->w_cursor) ? VIsual : curwin->w_cursor; - end = equalpos(start, VIsual) ? curwin->w_cursor : VIsual; - curwin->w_cursor = (dir == BACKWARD ? start : end); - } - prep_redo_cmd(cap); - do_put(regname, NULL, dir, cap->count1, PUT_FIXINDENT); - if (was_visual) { - VIsual = start; - curwin->w_cursor = end; - if (dir == BACKWARD) { - /* adjust lines */ - VIsual.lnum += curbuf->b_ml.ml_line_count - line_count; - curwin->w_cursor.lnum += curbuf->b_ml.ml_line_count - line_count; - } - - VIsual_active = true; - if (VIsual_mode == 'V') { - /* delete visually selected lines */ - cap->cmdchar = 'd'; - cap->nchar = NUL; - cap->oap->regname = regname; - nv_operator(cap); - do_pending_operator(cap, 0, false); - } - if (VIsual_active) { - end_visual_mode(); - redraw_later(SOME_VALID); - } - } - } + nv_put_opt(cap, true); } /* * "['", "[`", "]'" and "]`": jump to next mark @@ -7799,6 +7762,13 @@ static void nv_join(cmdarg_T *cap) */ static void nv_put(cmdarg_T *cap) { + nv_put_opt(cap, false); +} + +// "P", "gP", "p" and "gp" commands. +// "fix_indent" is true for "[p", "[P", "]p" and "]P". +static void nv_put_opt(cmdarg_T *cap, bool fix_indent) +{ int regname = 0; yankreg_T *savereg = NULL; bool empty = false; @@ -7815,9 +7785,15 @@ static void nv_put(cmdarg_T *cap) } else clearopbeep(cap->oap); } else { - dir = (cap->cmdchar == 'P' - || (cap->cmdchar == 'g' && cap->nchar == 'P')) - ? BACKWARD : FORWARD; + if (fix_indent) { + dir = (cap->cmdchar == ']' && cap->nchar == 'p') + ? FORWARD : BACKWARD; + flags |= PUT_FIXINDENT; + } else { + dir = (cap->cmdchar == 'P' + || (cap->cmdchar == 'g' && cap->nchar == 'P')) + ? BACKWARD : FORWARD; + } prep_redo_cmd(cap); if (cap->cmdchar == 'g') flags |= PUT_CURSEND; diff --git a/src/nvim/testdir/test_put.vim b/src/nvim/testdir/test_put.vim index 43a5d18cb3..d8a231c52e 100644 --- a/src/nvim/testdir/test_put.vim +++ b/src/nvim/testdir/test_put.vim @@ -104,3 +104,15 @@ func Test_put_p_errmsg_nodup() delfunction Capture_p_error bwipeout! endfunc + +func Test_put_p_indent_visual() + new + call setline(1, ['select this text', 'select that text']) + " yank "that" from the second line + normal 2Gwvey + " select "this" in the first line and put + normal k0wve[p + call assert_equal('select that text', getline(1)) + call assert_equal('select that text', getline(2)) + bwipe! +endfunc |