mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:9.1.0441: getregionpos() can't properly indicate positions beyond eol (#28957)
Problem: getregionpos() can't properly indicate positions beyond eol.
Solution: Add an "eol" flag that enables handling positions beyond end
of line like getpos() does (zeertzjq).
Also fix the problem that a position still has the coladd beyond the end
of the line when its column has been clamped. In the last test case
with TABs at the end of the line the old behavior is obviously wrong.
I decided to gate this behind a flag because returning positions that
don't correspond to actual characters in the line may lead to mistakes
for callers that want to calculate the length of the selected text, so
the behavior is only enabled if the caller wants it.
closes: vim/vim#14838
2b09de9104
This commit is contained in:
parent
c836383d21
commit
cd05fbef17
13
runtime/doc/builtin.txt
generated
13
runtime/doc/builtin.txt
generated
@ -2988,6 +2988,19 @@ getregionpos({pos1}, {pos2} [, {opts}]) *getregionpos()*
|
||||
the offset of the character's first cell not included in the
|
||||
selection, otherwise all its cells are included.
|
||||
|
||||
Apart from the options supported by |getregion()|, {opts} also
|
||||
supports the following:
|
||||
|
||||
eol If |TRUE|, indicate positions beyond
|
||||
the end of a line with "col" values
|
||||
one more than the length of the line.
|
||||
If |FALSE|, positions are limited
|
||||
within their lines, and if a line is
|
||||
empty or the selection is entirely
|
||||
beyond the end of a line, a "col"
|
||||
value of 0 is used for both positions.
|
||||
(default: |FALSE|)
|
||||
|
||||
getregtype([{regname}]) *getregtype()*
|
||||
The result is a String, which is type of register {regname}.
|
||||
The value will be one of:
|
||||
|
13
runtime/lua/vim/_meta/vimfn.lua
generated
13
runtime/lua/vim/_meta/vimfn.lua
generated
@ -3599,6 +3599,19 @@ function vim.fn.getregion(pos1, pos2, opts) end
|
||||
--- the offset of the character's first cell not included in the
|
||||
--- selection, otherwise all its cells are included.
|
||||
---
|
||||
--- Apart from the options supported by |getregion()|, {opts} also
|
||||
--- supports the following:
|
||||
---
|
||||
--- eol If |TRUE|, indicate positions beyond
|
||||
--- the end of a line with "col" values
|
||||
--- one more than the length of the line.
|
||||
--- If |FALSE|, positions are limited
|
||||
--- within their lines, and if a line is
|
||||
--- empty or the selection is entirely
|
||||
--- beyond the end of a line, a "col"
|
||||
--- value of 0 is used for both positions.
|
||||
--- (default: |FALSE|)
|
||||
---
|
||||
--- @param pos1 table
|
||||
--- @param pos2 table
|
||||
--- @param opts? table
|
||||
|
@ -4435,6 +4435,19 @@ M.funcs = {
|
||||
If the "off" number of an ending position is non-zero, it is
|
||||
the offset of the character's first cell not included in the
|
||||
selection, otherwise all its cells are included.
|
||||
|
||||
Apart from the options supported by |getregion()|, {opts} also
|
||||
supports the following:
|
||||
|
||||
eol If |TRUE|, indicate positions beyond
|
||||
the end of a line with "col" values
|
||||
one more than the length of the line.
|
||||
If |FALSE|, positions are limited
|
||||
within their lines, and if a line is
|
||||
empty or the selection is entirely
|
||||
beyond the end of a line, a "col"
|
||||
value of 0 is used for both positions.
|
||||
(default: |FALSE|)
|
||||
]=],
|
||||
name = 'getregionpos',
|
||||
params = { { 'pos1', 'table' }, { 'pos2', 'table' }, { 'opts', 'table' } },
|
||||
|
@ -3001,16 +3001,14 @@ static void add_regionpos_range(typval_T *rettv, pos_T p1, pos_T p2)
|
||||
list_T *l3 = tv_list_alloc(4);
|
||||
tv_list_append_list(l1, l3);
|
||||
|
||||
int max_col1 = ml_get_len(p1.lnum);
|
||||
tv_list_append_number(l2, curbuf->b_fnum);
|
||||
tv_list_append_number(l2, p1.lnum);
|
||||
tv_list_append_number(l2, p1.col > max_col1 ? max_col1 : p1.col);
|
||||
tv_list_append_number(l2, p1.col);
|
||||
tv_list_append_number(l2, p1.coladd);
|
||||
|
||||
int max_col2 = ml_get_len(p2.lnum);
|
||||
tv_list_append_number(l3, curbuf->b_fnum);
|
||||
tv_list_append_number(l3, p2.lnum);
|
||||
tv_list_append_number(l3, p2.col > max_col2 ? max_col2 : p2.col);
|
||||
tv_list_append_number(l3, p2.col);
|
||||
tv_list_append_number(l3, p2.coladd);
|
||||
}
|
||||
|
||||
@ -3023,14 +3021,20 @@ static void f_getregionpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
|
||||
pos_T p1, p2;
|
||||
bool inclusive = true;
|
||||
MotionType region_type = kMTUnknown;
|
||||
bool allow_eol = false;
|
||||
oparg_T oa;
|
||||
|
||||
if (getregionpos(argvars, rettv, &p1, &p2, &inclusive, ®ion_type, &oa) == FAIL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (argvars[2].v_type == VAR_DICT) {
|
||||
allow_eol = tv_dict_get_bool(argvars[2].vval.v_dict, "eol", false);
|
||||
}
|
||||
|
||||
for (linenr_T lnum = p1.lnum; lnum <= p2.lnum; lnum++) {
|
||||
pos_T ret_p1, ret_p2;
|
||||
colnr_T line_len = ml_get_len(lnum);
|
||||
|
||||
if (region_type == kMTLineWise) {
|
||||
ret_p1.col = 1;
|
||||
@ -3054,6 +3058,11 @@ static void f_getregionpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
|
||||
ret_p1.col = p1.col + 1;
|
||||
ret_p1.coladd = p1.coladd;
|
||||
}
|
||||
} else if (region_type == kMTBlockWise && oa.start_vcol > bd.start_vcol) {
|
||||
// blockwise selection entirely beyond end of line
|
||||
ret_p1.col = MAXCOL;
|
||||
ret_p1.coladd = oa.start_vcol - bd.start_vcol;
|
||||
bd.is_oneChar = true;
|
||||
} else if (bd.startspaces > 0) {
|
||||
ret_p1.col = bd.textcol;
|
||||
ret_p1.coladd = bd.start_char_vcols - bd.startspaces;
|
||||
@ -3064,7 +3073,7 @@ static void f_getregionpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
|
||||
|
||||
if (bd.is_oneChar) { // selection entirely inside one char
|
||||
ret_p2.col = ret_p1.col;
|
||||
ret_p2.coladd = ret_p1.coladd + bd.startspaces;
|
||||
ret_p2.coladd = ret_p1.coladd + bd.startspaces + bd.endspaces;
|
||||
} else if (bd.endspaces > 0) {
|
||||
ret_p2.col = bd.textcol + bd.textlen + 1;
|
||||
ret_p2.coladd = bd.endspaces;
|
||||
@ -3074,6 +3083,20 @@ static void f_getregionpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
|
||||
}
|
||||
}
|
||||
|
||||
if (!allow_eol && ret_p1.col > line_len) {
|
||||
ret_p1.col = 0;
|
||||
ret_p1.coladd = 0;
|
||||
} else if (ret_p1.col > line_len + 1) {
|
||||
ret_p1.col = line_len + 1;
|
||||
}
|
||||
|
||||
if (!allow_eol && ret_p2.col > line_len) {
|
||||
ret_p2.col = ret_p1.col == 0 ? 0 : line_len;
|
||||
ret_p2.coladd = 0;
|
||||
} else if (ret_p2.col > line_len + 1) {
|
||||
ret_p2.col = line_len + 1;
|
||||
}
|
||||
|
||||
ret_p1.lnum = lnum;
|
||||
ret_p2.lnum = lnum;
|
||||
add_regionpos_range(rettv, ret_p1, ret_p2);
|
||||
|
@ -1774,24 +1774,185 @@ func Test_visual_getregion()
|
||||
call feedkeys("\<ESC>Vjj", 'tx')
|
||||
call assert_equal(['one', 'two', 'three'],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'V' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 3, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'V' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 4, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 4, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 6, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'V', 'eol': v:true }))
|
||||
|
||||
#" Multiline with block visual mode
|
||||
call cursor(1, 1)
|
||||
call feedkeys("\<ESC>\<C-v>jj", 'tx')
|
||||
call assert_equal(['o', 't', 't'],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 1, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 1, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 1, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
|
||||
call cursor(1, 1)
|
||||
call feedkeys("\<ESC>\<C-v>jj$", 'tx')
|
||||
call assert_equal(['one', 'two', 'three'],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 3, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 3, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", 'eol': v:true }))
|
||||
|
||||
#" 'virtualedit'
|
||||
set virtualedit=all
|
||||
|
||||
call cursor(1, 1)
|
||||
call feedkeys("\<ESC>\<C-v>10ljj$", 'tx')
|
||||
call assert_equal(['one ', 'two ', 'three '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 3, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 4, 3]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 4, 3]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 6, 1]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", 'eol': v:true }))
|
||||
|
||||
call cursor(3, 5)
|
||||
call feedkeys("\<ESC>\<C-v>hkk", 'tx')
|
||||
call assert_equal([' ', ' ', 'ee'],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 0, 0], [bufnr('%'), 1, 0, 0]],
|
||||
\ [[bufnr('%'), 2, 0, 0], [bufnr('%'), 2, 0, 0]],
|
||||
\ [[bufnr('%'), 3, 4, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 4, 0], [bufnr('%'), 1, 4, 2]],
|
||||
\ [[bufnr('%'), 2, 4, 0], [bufnr('%'), 2, 4, 2]],
|
||||
\ [[bufnr('%'), 3, 4, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", 'eol': v:true }))
|
||||
|
||||
call cursor(3, 5)
|
||||
call feedkeys("\<ESC>\<C-v>kk", 'tx')
|
||||
call assert_equal([' ', ' ', 'e'],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 0, 0], [bufnr('%'), 1, 0, 0]],
|
||||
\ [[bufnr('%'), 2, 0, 0], [bufnr('%'), 2, 0, 0]],
|
||||
\ [[bufnr('%'), 3, 5, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 4, 1], [bufnr('%'), 1, 4, 2]],
|
||||
\ [[bufnr('%'), 2, 4, 1], [bufnr('%'), 2, 4, 2]],
|
||||
\ [[bufnr('%'), 3, 5, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", 'eol': v:true }))
|
||||
|
||||
call cursor(1, 3)
|
||||
call feedkeys("\<ESC>vjj4l", 'tx')
|
||||
call assert_equal(['e', 'two', 'three '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 3, 0], [bufnr('%'), 1, 3, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 3, 0], [bufnr('%'), 1, 4, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 4, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 6, 2]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'v', 'eol': v:true }))
|
||||
|
||||
call cursor(1, 3)
|
||||
call feedkeys("\<ESC>lvjj3l", 'tx')
|
||||
call assert_equal(['', 'two', 'three '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 0, 0], [bufnr('%'), 1, 0, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 4, 0], [bufnr('%'), 1, 4, 0]],
|
||||
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 4, 0]],
|
||||
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 6, 2]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'v', 'eol': v:true }))
|
||||
|
||||
call cursor(3, 5)
|
||||
call feedkeys("\<ESC>v3l", 'tx')
|
||||
call assert_equal(['e '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 3, 5, 0], [bufnr('%'), 3, 5, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 3, 5, 0], [bufnr('%'), 3, 6, 3]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'v', 'eol': v:true }))
|
||||
|
||||
call cursor(3, 5)
|
||||
call feedkeys("\<ESC>lv3l", 'tx')
|
||||
call assert_equal([' '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 3, 6, 0], [bufnr('%'), 3, 6, 4]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'v', 'eol': v:true }))
|
||||
|
||||
call cursor(3, 5)
|
||||
call feedkeys("\<ESC>3lv3l", 'tx')
|
||||
call assert_equal([' '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 3, 6, 2], [bufnr('%'), 3, 6, 6]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'v', 'eol': v:true }))
|
||||
|
||||
set virtualedit&
|
||||
|
||||
#" using wrong types for positions
|
||||
@ -1867,11 +2028,10 @@ func Test_visual_getregion()
|
||||
|
||||
exe $':{g:buf}bwipe!'
|
||||
unlet g:buf
|
||||
bwipe!
|
||||
END
|
||||
call CheckLegacyAndVim9Success(lines)
|
||||
|
||||
bwipe!
|
||||
|
||||
let lines =<< trim END
|
||||
#" Selection in starts or ends in the middle of a multibyte character
|
||||
new
|
||||
@ -1991,12 +2151,12 @@ func Test_visual_getregion()
|
||||
call assert_equal(['abcdefghijk«'],
|
||||
\ getregion(getpos("'a"), getpos("'b"),
|
||||
\ {'type': 'V', 'exclusive': 1 }))
|
||||
:set selection&
|
||||
|
||||
set selection&
|
||||
bwipe!
|
||||
END
|
||||
call CheckLegacyAndVim9Success(lines)
|
||||
|
||||
bwipe!
|
||||
|
||||
let lines =<< trim END
|
||||
#" Exclusive selection
|
||||
new
|
||||
@ -2183,9 +2343,16 @@ func Test_visual_getregion()
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 0], [bufnr('%'), 1, 2, 2]],
|
||||
\ [[bufnr('%'), 2, 2, 0], [bufnr('%'), 2, 2, 2]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 2]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 0], [bufnr('%'), 1, 2, 2]],
|
||||
\ [[bufnr('%'), 2, 2, 0], [bufnr('%'), 2, 2, 2]],
|
||||
\ [[bufnr('%'), 3, 1, 1], [bufnr('%'), 3, 1, 3]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", "eol": v:true }))
|
||||
|
||||
call cursor(1, 1)
|
||||
call feedkeys("\<Esc>2l\<C-v>2l2j", 'xt')
|
||||
@ -2194,9 +2361,16 @@ func Test_visual_getregion()
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 1], [bufnr('%'), 1, 2, 3]],
|
||||
\ [[bufnr('%'), 2, 2, 1], [bufnr('%'), 2, 2, 3]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 2]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 1], [bufnr('%'), 1, 2, 3]],
|
||||
\ [[bufnr('%'), 2, 2, 1], [bufnr('%'), 2, 2, 3]],
|
||||
\ [[bufnr('%'), 3, 1, 2], [bufnr('%'), 3, 1, 4]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", "eol": v:true }))
|
||||
|
||||
#" 'virtualedit' with inclusive selection
|
||||
set selection&
|
||||
@ -2282,9 +2456,16 @@ func Test_visual_getregion()
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 0], [bufnr('%'), 1, 2, 3]],
|
||||
\ [[bufnr('%'), 2, 2, 0], [bufnr('%'), 2, 2, 3]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 3]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 0], [bufnr('%'), 1, 2, 3]],
|
||||
\ [[bufnr('%'), 2, 2, 0], [bufnr('%'), 2, 2, 3]],
|
||||
\ [[bufnr('%'), 3, 1, 1], [bufnr('%'), 3, 1, 4]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", "eol": v:true }))
|
||||
|
||||
call cursor(1, 1)
|
||||
call feedkeys("\<Esc>2l\<C-v>2l2j", 'xt')
|
||||
@ -2293,9 +2474,57 @@ func Test_visual_getregion()
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 1], [bufnr('%'), 1, 2, 4]],
|
||||
\ [[bufnr('%'), 2, 2, 1], [bufnr('%'), 2, 2, 4]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 3]],
|
||||
\ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 2, 1], [bufnr('%'), 1, 2, 4]],
|
||||
\ [[bufnr('%'), 2, 2, 1], [bufnr('%'), 2, 2, 4]],
|
||||
\ [[bufnr('%'), 3, 1, 2], [bufnr('%'), 3, 1, 5]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", "eol": v:true }))
|
||||
|
||||
set virtualedit&
|
||||
bwipe!
|
||||
END
|
||||
call CheckLegacyAndVim9Success(lines)
|
||||
|
||||
let lines =<< trim END
|
||||
#" 'virtualedit' with TABs at end of line
|
||||
new
|
||||
set virtualedit=all
|
||||
call setline(1, ["\t", "a\t", "aa\t"])
|
||||
|
||||
call feedkeys("gg06l\<C-v>3l2j", 'xt')
|
||||
call assert_equal([' ', ' ', ' '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 6], [bufnr('%'), 1, 1, 0]],
|
||||
\ [[bufnr('%'), 2, 2, 5], [bufnr('%'), 2, 2, 0]],
|
||||
\ [[bufnr('%'), 3, 3, 4], [bufnr('%'), 3, 3, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 6], [bufnr('%'), 1, 2, 2]],
|
||||
\ [[bufnr('%'), 2, 2, 5], [bufnr('%'), 2, 3, 2]],
|
||||
\ [[bufnr('%'), 3, 3, 4], [bufnr('%'), 3, 4, 2]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': "\<C-v>", "eol": v:true }))
|
||||
|
||||
call feedkeys("gg06lv3l", 'xt')
|
||||
call assert_equal([' '],
|
||||
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 6], [bufnr('%'), 1, 1, 0]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
|
||||
call assert_equal([
|
||||
\ [[bufnr('%'), 1, 1, 6], [bufnr('%'), 1, 2, 2]],
|
||||
\ ],
|
||||
\ getregionpos(getpos('v'), getpos('.'),
|
||||
\ {'type': 'v', "eol": v:true }))
|
||||
|
||||
set virtualedit&
|
||||
bwipe!
|
||||
|
Loading…
Reference in New Issue
Block a user