aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/funcs.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-05-25 05:19:46 +0800
committerGitHub <noreply@github.com>2024-05-25 05:19:46 +0800
commit06347a64cac5e33574713a59ace9d1d0ea4b6f82 (patch)
tree14dcd33011dc44875b9da4e57e5217274b0f5f8c /src/nvim/eval/funcs.c
parent28c04948a1c887a1cc0cb64de79fa32631700466 (diff)
downloadrneovim-06347a64cac5e33574713a59ace9d1d0ea4b6f82.tar.gz
rneovim-06347a64cac5e33574713a59ace9d1d0ea4b6f82.tar.bz2
rneovim-06347a64cac5e33574713a59ace9d1d0ea4b6f82.zip
vim-patch:9.1.0443: Can't use blockwise selection with width for getregion() (#28985)
Problem: Can't use a blockwise selection with a width for getregion(). Solution: Add support for blockwise selection with width like the return value of getregtype() or the "regtype" value of TextYankPost (zeertzjq). closes: vim/vim#14842 https://github.com/vim/vim/commit/afc2295c2201ae87bfbb42d5f5315ad0583ccabf
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r--src/nvim/eval/funcs.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index e4cb63eb8e..3cb6ef41c0 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -2824,7 +2824,7 @@ static char *block_def2str(struct block_def *bd)
}
static int getregionpos(typval_T *argvars, typval_T *rettv, pos_T *p1, pos_T *p2,
- bool *const inclusive, MotionType *region_type, oparg_T *oa)
+ bool *const inclusive, MotionType *region_type, oparg_T *oap)
FUNC_ATTR_NONNULL_ALL
{
tv_list_alloc_ret(rettv, kListLenMayKnow);
@@ -2858,11 +2858,17 @@ static int getregionpos(typval_T *argvars, typval_T *rettv, pos_T *p1, pos_T *p2
type = default_type;
}
+ int block_width = 0;
if (type[0] == 'v' && type[1] == NUL) {
*region_type = kMTCharWise;
} else if (type[0] == 'V' && type[1] == NUL) {
*region_type = kMTLineWise;
- } else if (type[0] == Ctrl_V && type[1] == NUL) {
+ } else if (type[0] == Ctrl_V) {
+ char *p = type + 1;
+ if (*p != NUL && ((block_width = getdigits_int(&p, false, 0)) <= 0 || *p != NUL)) {
+ semsg(_(e_invargNval), "type", type);
+ return FAIL;
+ }
*region_type = kMTBlockWise;
} else {
semsg(_(e_invargNval), "type", type);
@@ -2926,16 +2932,18 @@ static int getregionpos(typval_T *argvars, typval_T *rettv, pos_T *p1, pos_T *p2
colnr_T sc1, ec1, sc2, ec2;
getvvcol(curwin, p1, &sc1, NULL, &ec1);
getvvcol(curwin, p2, &sc2, NULL, &ec2);
- oa->motion_type = kMTBlockWise;
- oa->inclusive = true;
- oa->op_type = OP_NOP;
- oa->start = *p1;
- oa->end = *p2;
- oa->start_vcol = MIN(sc1, sc2);
- if (is_select_exclusive && ec1 < sc2 && 0 < sc2 && ec2 > ec1) {
- oa->end_vcol = sc2 - 1;
+ oap->motion_type = kMTBlockWise;
+ oap->inclusive = true;
+ oap->op_type = OP_NOP;
+ oap->start = *p1;
+ oap->end = *p2;
+ oap->start_vcol = MIN(sc1, sc2);
+ if (block_width > 0) {
+ oap->end_vcol = oap->start_vcol + block_width - 1;
+ } else if (is_select_exclusive && ec1 < sc2 && 0 < sc2 && ec2 > ec1) {
+ oap->end_vcol = sc2 - 1;
} else {
- oa->end_vcol = MAX(ec1, ec2);
+ oap->end_vcol = MAX(ec1, ec2);
}
}