Projects
Factory:RISC-V:Base
vim
_service:tar_scm:backport-patch-9.0.0712-wrong-...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:backport-patch-9.0.0712-wrong-column-when-calling-setcursorch-with-zero-lnum.patch of Package vim
From 79f234499b6692cc16970b7455bc9b002242632f Mon Sep 17 00:00:00 2001 From: Bram Moolenaar <Bram@vim.org> Date: Mon, 10 Oct 2022 12:42:57 +0100 Subject: [PATCH] patch 9.0.0712: wrong column when calling setcursorcharpos() with zero lnum Problem: Wrong column when calling setcursorcharpos() with zero lnum. Solution: Set the line number before calling buf_charidx_to_byteidx(). (closes #11329) --- src/eval.c | 10 +++++++--- src/evalfunc.c | 26 ++++++++++++++------------ src/testdir/test_cursor_func.vim | 6 ++++++ 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/eval.c b/src/eval.c index 8df374a..cbd4740 100644 --- a/src/eval.c +++ b/src/eval.c @@ -5906,10 +5906,12 @@ var2fpos( } /* - * Convert list in "arg" into a position and optional file number. - * When "fnump" is NULL there is no file number, only 3 items. + * Convert list in "arg" into position "psop" and optional file number "fnump". + * When "fnump" is NULL there is no file number, only 3 items: [lnum, col, off] * Note that the column is passed on as-is, the caller may want to decrement * it to use 1 for the first column. + * If "charcol" is TRUE use the column as the character index instead of the + * byte index. * Return FAIL when conversion is not possible, doesn't check the position for * validity. */ @@ -5952,6 +5954,7 @@ list2fpos( if (n < 0) return FAIL; // If character position is specified, then convert to byte position + // If the line number is zero use the cursor line. if (charcol) { buf_T *buf; @@ -5961,7 +5964,8 @@ list2fpos( if (buf == NULL || buf->b_ml.ml_mfp == NULL) return FAIL; - n = buf_charidx_to_byteidx(buf, posp->lnum, n) + 1; + n = buf_charidx_to_byteidx(buf, + posp->lnum == 0 ? curwin->w_cursor.lnum : posp->lnum, n) + 1; } posp->col = n; diff --git a/src/evalfunc.c b/src/evalfunc.c index cb12a46..2703865 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3484,7 +3484,7 @@ f_copy(typval_T *argvars, typval_T *rettv) static void set_cursorpos(typval_T *argvars, typval_T *rettv, int charcol) { - long line, col; + long lnum, col; long coladd = 0; int set_curswant = TRUE; @@ -3506,7 +3506,7 @@ set_cursorpos(typval_T *argvars, typval_T *rettv, int charcol) emsg(_(e_invalid_argument)); return; } - line = pos.lnum; + lnum = pos.lnum; col = pos.col; coladd = pos.coladd; if (curswant >= 0) @@ -3515,17 +3515,19 @@ set_cursorpos(typval_T *argvars, typval_T *rettv, int charcol) set_curswant = FALSE; } } - else if ((argvars[0].v_type == VAR_NUMBER || - argvars[0].v_type == VAR_STRING) - && (argvars[1].v_type == VAR_NUMBER || - argvars[1].v_type == VAR_STRING)) + else if ((argvars[0].v_type == VAR_NUMBER + || argvars[0].v_type == VAR_STRING) + && (argvars[1].v_type == VAR_NUMBER + || argvars[1].v_type == VAR_STRING)) { - line = tv_get_lnum(argvars); - if (line < 0) + lnum = tv_get_lnum(argvars); + if (lnum < 0) semsg(_(e_invalid_argument_str), tv_get_string(&argvars[0])); + else if (lnum == 0) + lnum = curwin->w_cursor.lnum; col = (long)tv_get_number_chk(&argvars[1], NULL); if (charcol) - col = buf_charidx_to_byteidx(curbuf, line, col) + 1; + col = buf_charidx_to_byteidx(curbuf, lnum, col) + 1; if (argvars[2].v_type != VAR_UNKNOWN) coladd = (long)tv_get_number_chk(&argvars[2], NULL); } @@ -3534,10 +3536,10 @@ set_cursorpos(typval_T *argvars, typval_T *rettv, int charcol) emsg(_(e_invalid_argument)); return; } - if (line < 0 || col < 0 || coladd < 0) + if (lnum < 0 || col < 0 || coladd < 0) return; // type error; errmsg already given - if (line > 0) - curwin->w_cursor.lnum = line; + if (lnum > 0) + curwin->w_cursor.lnum = lnum; if (col > 0) curwin->w_cursor.col = col - 1; curwin->w_cursor.coladd = coladd; diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim index d5f0ac7..d2685ed 100644 --- a/src/testdir/test_cursor_func.vim +++ b/src/testdir/test_cursor_func.vim @@ -399,8 +399,14 @@ func Test_setcursorcharpos() normal G call setcursorcharpos([1, 1]) call assert_equal([1, 1], [line('.'), col('.')]) + call setcursorcharpos([2, 7, 0]) call assert_equal([2, 9], [line('.'), col('.')]) + call setcursorcharpos([0, 7, 0]) + call assert_equal([2, 9], [line('.'), col('.')]) + call setcursorcharpos(0, 7, 0) + call assert_equal([2, 9], [line('.'), col('.')]) + call setcursorcharpos(3, 4) call assert_equal([3, 1], [line('.'), col('.')]) call setcursorcharpos([3, 1]) -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2