vim-patch:9.1.0430: getregionpos() doesn't handle one char selection (#28924)

Problem:  getregionpos() doesn't handle one char selection.
Solution: Handle startspaces differently when is_oneChar is set.
          Also add a test for an exclusive charwise selection with
          multibyte chars (zeertzjq)

closes: vim/vim#14825

52a6f34887
This commit is contained in:
zeertzjq
2024-05-23 06:08:24 +08:00
committed by GitHub
parent 3d43bdc81e
commit 5cbd6d9b9f
6 changed files with 81 additions and 17 deletions

View File

@@ -3041,7 +3041,6 @@ static void f_getregionpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
}
for (linenr_T lnum = p1.lnum; lnum <= p2.lnum; lnum++) {
struct block_def bd;
pos_T ret_p1, ret_p2;
if (region_type == kMTLineWise) {
@@ -3050,19 +3049,34 @@ static void f_getregionpos(typval_T *argvars, typval_T *rettv, EvalFuncData fptr
ret_p2.col = MAXCOL;
ret_p2.coladd = 0;
} else {
struct block_def bd;
if (region_type == kMTBlockWise) {
block_prep(&oa, &bd, lnum, false);
} else {
charwise_block_prep(p1, p2, &bd, lnum, inclusive);
}
if (bd.startspaces > 0) {
if (bd.is_oneChar) { // selection entirely inside one char
if (region_type == kMTBlockWise) {
ret_p1.col = bd.textcol;
ret_p1.coladd = bd.start_char_vcols - (bd.start_vcol - oa.start_vcol);
} else {
ret_p1.col = p1.col + 1;
ret_p1.coladd = p1.coladd;
}
} else 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) {
if (bd.is_oneChar) { // selection entirely inside one char
ret_p2.col = ret_p1.col;
ret_p2.coladd = ret_p1.coladd + bd.startspaces;
} else if (bd.endspaces > 0) {
ret_p2.col = bd.textcol + bd.textlen + 1;
ret_p2.coladd = bd.endspaces;
} else {