forked from aniani/vim
patch 9.1.0120: hard to get visual region using Vim script
Problem: hard to get visual region using Vim script Solution: Add getregion() Vim script function (Shougo Matsushita, Jakub Łuczyński) closes: #13998 closes: #11579 Co-authored-by: =?UTF-8?q?Jakub=20=C5=81uczy=C5=84ski?= <doubleloop@o2.pl> Co-authored-by: Shougo Matsushita <Shougo.Matsu@gmail.com> Signed-off-by: Shougo Matsushita <Shougo.Matsu@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
f865895c87
commit
3f905ab3c4
78
src/ops.c
78
src/ops.c
@@ -2414,6 +2414,84 @@ block_prep(
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Get block text from "start" to "end"
|
||||
*/
|
||||
void
|
||||
charwise_block_prep(
|
||||
pos_T start,
|
||||
pos_T end,
|
||||
struct block_def *bdp,
|
||||
linenr_T lnum,
|
||||
int inclusive)
|
||||
{
|
||||
colnr_T startcol = 0, endcol = MAXCOL;
|
||||
int is_oneChar = FALSE;
|
||||
colnr_T cs, ce;
|
||||
char_u *p;
|
||||
|
||||
p = ml_get(lnum);
|
||||
bdp->startspaces = 0;
|
||||
bdp->endspaces = 0;
|
||||
|
||||
if (lnum == start.lnum)
|
||||
{
|
||||
startcol = start.col;
|
||||
if (virtual_op)
|
||||
{
|
||||
getvcol(curwin, &start, &cs, NULL, &ce);
|
||||
if (ce != cs && start.coladd > 0)
|
||||
{
|
||||
// Part of a tab selected -- but don't
|
||||
// double-count it.
|
||||
bdp->startspaces = (ce - cs + 1)
|
||||
- start.coladd;
|
||||
if (bdp->startspaces < 0)
|
||||
bdp->startspaces = 0;
|
||||
startcol++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lnum == end.lnum)
|
||||
{
|
||||
endcol = end.col;
|
||||
if (virtual_op)
|
||||
{
|
||||
getvcol(curwin, &end, &cs, NULL, &ce);
|
||||
if (p[endcol] == NUL || (cs + end.coladd < ce
|
||||
// Don't add space for double-wide
|
||||
// char; endcol will be on last byte
|
||||
// of multi-byte char.
|
||||
&& (*mb_head_off)(p, p + endcol) == 0))
|
||||
{
|
||||
if (start.lnum == end.lnum
|
||||
&& start.col == end.col)
|
||||
{
|
||||
// Special case: inside a single char
|
||||
is_oneChar = TRUE;
|
||||
bdp->startspaces = end.coladd
|
||||
- start.coladd + inclusive;
|
||||
endcol = startcol;
|
||||
}
|
||||
else
|
||||
{
|
||||
bdp->endspaces = end.coladd
|
||||
+ inclusive;
|
||||
endcol -= inclusive;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (endcol == MAXCOL)
|
||||
endcol = (colnr_T)STRLEN(p);
|
||||
if (startcol > endcol || is_oneChar)
|
||||
bdp->textlen = 0;
|
||||
else
|
||||
bdp->textlen = endcol - startcol + inclusive;
|
||||
bdp->textstart = p + startcol;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle the add/subtract operator.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user