getregionpos(
typval_T *argvars,
typval_T *rettv,
- pos_T *p1, pos_T *p2,
+ pos_T *p1,
+ pos_T *p2,
int *inclusive,
int *region_type,
- oparg_T *oa,
- int *fnum)
+ oparg_T *oa)
{
int fnum1 = -1, fnum2 = -1;
char_u *type;
}
findbuf = fnum1 != 0 ? buflist_findnr(fnum1) : curbuf;
- *fnum = fnum1 != 0 ? fnum1 : curbuf->b_fnum;
if (findbuf == NULL || findbuf->b_ml.ml_mfp == NULL)
{
emsg(_(e_buffer_is_not_loaded));
int inclusive = TRUE;
int region_type = -1;
oparg_T oa;
- int fnum;
buf_T *save_curbuf;
int save_virtual;
save_virtual = virtual_op;
if (getregionpos(argvars, rettv,
- &p1, &p2, &inclusive, ®ion_type, &oa, &fnum) == FAIL)
+ &p1, &p2, &inclusive, ®ion_type, &oa) == FAIL)
return;
for (lnum = p1.lnum; lnum <= p2.lnum; lnum++)
}
}
- // getregionpos() breaks curbuf and virtual_op
+ // getregionpos() may change curbuf and virtual_op
curbuf = save_curbuf;
curwin->w_buffer = curbuf;
virtual_op = save_virtual;
}
static void
-add_regionpos_range(
- typval_T *rettv,
- int bufnr,
- int lnum1,
- int col1,
- int coladd1,
- int lnum2,
- int col2,
- int coladd2)
+add_regionpos_range(typval_T *rettv, pos_T p1, pos_T p2)
{
list_T *l1, *l2, *l3;
- buf_T *findbuf;
int max_col1, max_col2;
- findbuf = bufnr != 0 ? buflist_findnr(bufnr) : curbuf;
- if (findbuf == NULL || findbuf->b_ml.ml_mfp == NULL)
- return;
-
l1 = list_alloc();
if (l1 == NULL)
return;
return;
}
+ max_col1 = ml_get_len(p1.lnum);
+ list_append_number(l2, curbuf->b_fnum);
+ list_append_number(l2, p1.lnum);
+ list_append_number(l2, p1.col > max_col1 ? max_col1 : p1.col);
+ list_append_number(l2, p1.coladd);
- max_col1 = ml_get_buf_len(findbuf, lnum1);
- list_append_number(l2, bufnr);
- list_append_number(l2, lnum1);
- list_append_number(l2, col1 > max_col1 ? max_col1 : col1);
- list_append_number(l2, coladd1);
-
- max_col2 = ml_get_buf_len(findbuf, lnum2);
- list_append_number(l3, bufnr);
- list_append_number(l3, lnum2);
- list_append_number(l3, col2 > max_col2 ? max_col2 : col2);
- list_append_number(l3, coladd2);
+ max_col2 = ml_get_len(p2.lnum);
+ list_append_number(l3, curbuf->b_fnum);
+ list_append_number(l3, p2.lnum);
+ list_append_number(l3, p2.col > max_col2 ? max_col2 : p2.col);
+ list_append_number(l3, p2.coladd);
}
/*
int inclusive = TRUE;
int region_type = -1;
oparg_T oa;
- int fnum;
int lnum;
buf_T *save_curbuf;
save_virtual = virtual_op;
if (getregionpos(argvars, rettv,
- &p1, &p2, &inclusive, ®ion_type, &oa, &fnum) == FAIL)
+ &p1, &p2, &inclusive, ®ion_type, &oa) == FAIL)
return;
for (lnum = p1.lnum; lnum <= p2.lnum; lnum++)
{
struct block_def bd;
- int start_col, end_col;
+ pos_T ret_p1, ret_p2;
if (region_type == MLINE)
{
- start_col = 1;
- end_col = MAXCOL;
- }
- else if (region_type == MBLOCK)
- {
- block_prep(&oa, &bd, lnum, FALSE);
- start_col = bd.start_vcol + 1;
- end_col = bd.end_vcol;
- }
- else if (p1.lnum < lnum && lnum < p2.lnum)
- {
- start_col = 1;
- end_col = MAXCOL;
+ ret_p1.col = 1;
+ ret_p1.coladd = 0;
+ ret_p2.col = MAXCOL;
+ ret_p2.coladd = 0;
}
else
{
- start_col = p1.lnum == lnum ? p1.col + 1 : 1;
- end_col = p2.lnum == lnum ? p2.col + 1 : MAXCOL;
+ if (region_type == MBLOCK)
+ block_prep(&oa, &bd, lnum, FALSE);
+ else
+ charwise_block_prep(p1, p2, &bd, lnum, inclusive);
+ if (bd.startspaces > 0)
+ {
+ ret_p1.col = bd.textcol;
+ ret_p1.coladd = bd.start_char_vcols - bd.startspaces;
+ }
+ else
+ {
+ ret_p1.col = bd.textcol + 1;
+ ret_p1.coladd = 0;
+ }
+ if (bd.endspaces > 0)
+ {
+ ret_p2.col = bd.textcol + bd.textlen + 1;
+ ret_p2.coladd = bd.endspaces;
+ }
+ else
+ {
+ ret_p2.col = bd.textcol + bd.textlen;
+ ret_p2.coladd = 0;
+ }
}
- add_regionpos_range(rettv, fnum, lnum, start_col,
- p1.coladd, lnum, end_col, p2.coladd);
+ ret_p1.lnum = lnum;
+ ret_p2.lnum = lnum;
+ add_regionpos_range(rettv, ret_p1, ret_p2);
}
// getregionpos() may change curbuf and virtual_op
#" Visual mode
call cursor(1, 1)
call feedkeys("\<ESC>vjl", 'tx')
+
call assert_equal(['one', 'tw'],
\ 'v'->getpos()->getregion(getpos('.')))
call assert_equal([
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 2, 0]]
\ ],
\ 'v'->getpos()->getregionpos(getpos('.')))
+
call assert_equal(['one', 'tw'],
\ '.'->getpos()->getregion(getpos('v')))
call assert_equal([
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 2, 0]]
\ ],
\ '.'->getpos()->getregionpos(getpos('v')))
+
call assert_equal(['o'],
\ 'v'->getpos()->getregion(getpos('v')))
call assert_equal([
\ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 1, 0]],
\ ],
\ 'v'->getpos()->getregionpos(getpos('v')))
+
call assert_equal(['w'],
\ '.'->getpos()->getregion(getpos('.'), {'type': 'v' }))
call assert_equal([
\ [[bufnr('%'), 2, 2, 0], [bufnr('%'), 2, 2, 0]],
\ ],
\ '.'->getpos()->getregionpos(getpos('.'), {'type': 'v' }))
+
call assert_equal(['one', 'two'],
\ getpos('.')->getregion(getpos('v'), {'type': 'V' }))
call assert_equal([
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 3, 0]],
\ ],
\ getpos('.')->getregionpos(getpos('v'), {'type': 'V' }))
+
call assert_equal(['on', 'tw'],
\ getpos('.')->getregion(getpos('v'), {'type': "\<C-v>" }))
call assert_equal([
call assert_equal(range(10)->mapnew('string(v:val)'),
\ getregion([g:buf, 10, 2, 0], [g:buf, 1, 1, 0],
\ {'type': type, 'exclusive': exclusive }))
+ call assert_equal(range(1, 10)->mapnew('repeat([[g:buf, v:val, 1, 0]], 2)'),
+ \ getregionpos([g:buf, 1, 1, 0], [g:buf, 10, 2, 0],
+ \ {'type': type, 'exclusive': exclusive }))
+ call assert_equal(range(1, 10)->mapnew('repeat([[g:buf, v:val, 1, 0]], 2)'),
+ \ getregionpos([g:buf, 10, 2, 0], [g:buf, 1, 1, 0],
+ \ {'type': type, 'exclusive': exclusive }))
endfor
endfor
\ "\U0001f1e6\u00ab\U0001f1e7\u00ab\U0001f1e8\u00ab\U0001f1e9",
\ "1234567890"
\ ])
+
call cursor(1, 3)
call feedkeys("\<Esc>\<C-v>ljj", 'xt')
call assert_equal(['cd', "\u00ab ", '34'],
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 3, 0], [bufnr('%'), 1, 4, 0]],
+ \ [[bufnr('%'), 2, 5, 0], [bufnr('%'), 2, 7, 1]],
+ \ [[bufnr('%'), 3, 3, 0], [bufnr('%'), 3, 4, 0]],
+ \ ],
+ \ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+
call cursor(1, 4)
call feedkeys("\<Esc>\<C-v>ljj", 'xt')
call assert_equal(['de', "\U0001f1e7", '45'],
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 4, 0], [bufnr('%'), 1, 5, 0]],
+ \ [[bufnr('%'), 2, 7, 0], [bufnr('%'), 2, 10, 0]],
+ \ [[bufnr('%'), 3, 4, 0], [bufnr('%'), 3, 5, 0]],
+ \ ],
+ \ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+
call cursor(1, 5)
call feedkeys("\<Esc>\<C-v>jj", 'xt')
call assert_equal(['e', ' ', '5'],
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 5, 0], [bufnr('%'), 1, 5, 0]],
+ \ [[bufnr('%'), 2, 10, 1], [bufnr('%'), 2, 10, 0]],
+ \ [[bufnr('%'), 3, 5, 0], [bufnr('%'), 3, 5, 0]],
+ \ ],
+ \ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
call assert_equal([
\ [[bufnr('%'), 1, 5, 0], [bufnr('%'), 1, 13, 0]],
\ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 22, 0]],
\ [[bufnr('%'), 3, 1, 0], [bufnr('%'), 3, 5, 0]],
\ ],
\ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
+
call cursor(1, 1)
call feedkeys("\<Esc>vj", 'xt')
call assert_equal(['abcdefghijk«', "\U0001f1e6"],
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 1, 0], [bufnr('%'), 1, 13, 0]],
+ \ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 4, 0]],
+ \ ],
+ \ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
#" marks on multibyte chars
:set selection=exclusive
call setpos("'b", [0, 2, 16, 0])
call setpos("'c", [0, 2, 0, 0])
call cursor(1, 1)
+
call assert_equal(['ghijk', '🇨«🇩'],
\ getregion(getpos("'a"), getpos("'b"), {'type': "\<C-v>" }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 7, 0], [bufnr('%'), 1, 11, 0]],
+ \ [[bufnr('%'), 2, 13, 0], [bufnr('%'), 2, 22, 0]],
+ \ ],
+ \ getregionpos(getpos("'a"), getpos("'b"), {'type': "\<C-v>" }))
+
call assert_equal(['k«', '🇦«🇧«🇨'],
\ getregion(getpos("'a"), getpos("'b"), {'type': 'v' }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 11, 0], [bufnr('%'), 1, 13, 0]],
+ \ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 16, 0]],
+ \ ],
+ \ getregionpos(getpos("'a"), getpos("'b"), {'type': 'v' }))
+
call assert_equal(['k«'],
\ getregion(getpos("'a"), getpos("'c"), {'type': 'v' }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 11, 0], [bufnr('%'), 1, 13, 0]],
+ \ ],
+ \ getregionpos(getpos("'a"), getpos("'c"), {'type': 'v' }))
#" use inclusive selection, although 'selection' is exclusive
call setpos("'a", [0, 1, 11, 0])
#" virtualedit
set selection=exclusive
set virtualedit=all
+
call cursor(1, 1)
call feedkeys("\<Esc>2lv2lj", 'xt')
call assert_equal([' c', 'x '],
\ getregion(getpos('v'), getpos('.'), {'type': 'v' }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 2, 1], [bufnr('%'), 1, 3, 0]],
+ \ [[bufnr('%'), 2, 1, 0], [bufnr('%'), 2, 2, 3]],
+ \ ],
+ \ getregionpos(getpos('v'), getpos('.'), {'type': 'v' }))
+
call cursor(1, 1)
call feedkeys("\<Esc>2l\<C-v>2l2j", 'xt')
call assert_equal([' ', ' ', ' '],
\ getregion(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+ call assert_equal([
+ \ [[bufnr('%'), 1, 2, 5], [bufnr('%'), 1, 2, 0]],
+ \ [[bufnr('%'), 2, 2, 5], [bufnr('%'), 2, 2, 0]],
+ \ [[bufnr('%'), 3, 0, 0], [bufnr('%'), 3, 0, 2]],
+ \ ],
+ \ getregionpos(getpos('v'), getpos('.'), {'type': "\<C-v>" }))
+
set virtualedit&
set selection&