Mercurial > vim
changeset 25116:56817e74d106 v8.2.3095
patch 8.2.3095: with 'virtualedit' set to "block" block selection is wrong
Commit: https://github.com/vim/vim/commit/b17ab86e7b8712206aa9ea7198c28db969e25936
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jul 3 22:15:17 2021 +0200
patch 8.2.3095: with 'virtualedit' set to "block" block selection is wrong
Problem: With 'virtualedit' set to "block" block selection is wrong after
using "$". (Marco Trosi)
Solution: Compute the longest selected line. (closes #8495)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 03 Jul 2021 22:30:03 +0200 |
parents | 9ca1b31f6297 |
children | 93f37d29970f |
files | src/drawscreen.c src/testdir/dumps/Test_visual_block_with_virtualedit2.dump src/testdir/test_visual.vim src/version.c |
diffstat | 4 files changed, 43 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -2009,14 +2009,41 @@ win_update(win_T *wp) ve_flags = VE_ALL; #endif getvcols(wp, &VIsual, &curwin->w_cursor, &fromc, &toc); + ++toc; #if defined(FEAT_LINEBREAK) ve_flags = save_ve_flags; #endif - ++toc; // Highlight to the end of the line, unless 'virtualedit' has // "block". - if (curwin->w_curswant == MAXCOL && !(ve_flags & VE_BLOCK)) - toc = MAXCOL; + if (curwin->w_curswant == MAXCOL) + { + if (ve_flags & VE_BLOCK) + { + pos_T pos; + int cursor_above = + curwin->w_cursor.lnum < VIsual.lnum; + + // Need to find the longest line. + toc = 0; + pos.coladd = 0; + for (pos.lnum = curwin->w_cursor.lnum; cursor_above + ? pos.lnum <= VIsual.lnum + : pos.lnum >= VIsual.lnum; + pos.lnum += cursor_above ? 1 : -1) + { + colnr_T t; + + pos.col = STRLEN(ml_get_buf(wp->w_buffer, + pos.lnum, FALSE)); + getvvcol(wp, &pos, NULL, NULL, &t); + if (toc < t) + toc = t; + } + ++toc; + } + else + toc = MAXCOL; + } if (fromc != wp->w_old_cursor_fcol || toc != wp->w_old_cursor_lcol)
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_visual_block_with_virtualedit2.dump @@ -0,0 +1,8 @@ +|a+0&#e0e0e08@5| | +0&#ffffff0@42 +|b+0&#e0e0e08@3| @2| +0&#ffffff0@42 +|c+0&#e0e0e08@1> +0&#ffffff0| +0&#e0e0e08@3| +0&#ffffff0@42 +|~+0#4040ff13&| @48 +|~| @48 +|~| @48 +|~| @48 +|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@3|3|x|3| @6|3|,|3| @10|A|l@1|
--- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -1256,6 +1256,9 @@ func Test_visual_block_with_virtualedit( call term_sendkeys(buf, "\<C-V>gg$") call VerifyScreenDump(buf, 'Test_visual_block_with_virtualedit', {}) + call term_sendkeys(buf, "\<Esc>gg\<C-V>G$") + call VerifyScreenDump(buf, 'Test_visual_block_with_virtualedit2', {}) + " clean up call term_sendkeys(buf, "\<Esc>") call StopVimInTerminal(buf)