]> granicus.if.org Git - vim/commitdiff
patch 9.0.0712: wrong column when calling setcursorcharpos() with zero lnum v9.0.0712
authorBram Moolenaar <Bram@vim.org>
Mon, 10 Oct 2022 11:42:57 +0000 (12:42 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 10 Oct 2022 11:42:57 +0000 (12:42 +0100)
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
src/evalfunc.c
src/testdir/test_cursor_func.vim
src/version.c

index c37765fd89774260df9a8f28dc39f40dbc27b331..1652fcb4ae4820ad07b36bcc06d25eff3294b2ba 100644 (file)
@@ -6023,10 +6023,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.
  */
@@ -6069,6 +6071,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;
@@ -6078,7 +6081,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;
 
index a2a5296ae7fd27e8febe1e09cfe43f7c848efcd7..07ea31178758db04bc4789b51a191da18adf3493 100644 (file)
@@ -3545,7 +3545,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;
 
@@ -3567,7 +3567,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)
@@ -3576,17 +3576,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);
     }
@@ -3595,10 +3597,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;
index d5f0ac7fa20b8358611bbc0a3916aeda53c99b03..d2685ed9d858923217e1b1e62fd025abfa6352e7 100644 (file)
@@ -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])
index d3189fb5cce3b2f9b454cb5db27d1b936f3d99fd..eef7ff101bd4c16683d6facda4ff2717adde1a57 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    712,
 /**/
     711,
 /**/