mirror of
https://github.com/neovim/neovim.git
synced 2025-12-11 09:02:40 +00:00
Merge pull request #20574 from zeertzjq/vim-8.2.2184
vim-patch:8.2.{1465,2184,2670,2671},9.0.{0712,partial:0715}
This commit is contained in:
@@ -6454,11 +6454,14 @@ pos_T *var2fpos(const typval_T *const tv, const bool dollar_lnum, int *const ret
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/// 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 "posp" 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.
|
||||
///
|
||||
/// @param charcol if 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.
|
||||
int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp, bool charcol)
|
||||
@@ -6498,13 +6501,16 @@ int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp, bool c
|
||||
return FAIL;
|
||||
}
|
||||
// If character position is specified, then convert to byte position
|
||||
// If the line number is zero use the cursor line.
|
||||
if (charcol) {
|
||||
// Get the text for the specified line in a loaded buffer
|
||||
buf_T *buf = buflist_findnr(fnump == NULL ? curbuf->b_fnum : *fnump);
|
||||
if (buf == NULL || buf->b_ml.ml_mfp == NULL) {
|
||||
return FAIL;
|
||||
}
|
||||
n = buf_charidx_to_byteidx(buf, posp->lnum, (int)n) + 1;
|
||||
n = buf_charidx_to_byteidx(buf,
|
||||
posp->lnum == 0 ? curwin->w_cursor.lnum : posp->lnum,
|
||||
(int)n) + 1;
|
||||
}
|
||||
posp->col = (colnr_T)n;
|
||||
|
||||
|
||||
@@ -1270,7 +1270,7 @@ static void f_ctxsize(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||
/// Otherwise use the column number as a byte offset.
|
||||
static void set_cursorpos(typval_T *argvars, typval_T *rettv, bool charcol)
|
||||
{
|
||||
long line, col;
|
||||
long lnum, col;
|
||||
long coladd = 0;
|
||||
bool set_curswant = true;
|
||||
|
||||
@@ -1284,7 +1284,7 @@ static void set_cursorpos(typval_T *argvars, typval_T *rettv, bool charcol)
|
||||
return;
|
||||
}
|
||||
|
||||
line = pos.lnum;
|
||||
lnum = pos.lnum;
|
||||
col = pos.col;
|
||||
coladd = pos.coladd;
|
||||
if (curswant >= 0) {
|
||||
@@ -1293,10 +1293,15 @@ static void set_cursorpos(typval_T *argvars, typval_T *rettv, bool charcol)
|
||||
}
|
||||
} 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);
|
||||
lnum = tv_get_lnum(argvars);
|
||||
if (lnum < 0) {
|
||||
semsg(_(e_invarg2), 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, (linenr_T)line, (int)col) + 1;
|
||||
col = buf_charidx_to_byteidx(curbuf, (linenr_T)lnum, (int)col) + 1;
|
||||
}
|
||||
if (argvars[2].v_type != VAR_UNKNOWN) {
|
||||
coladd = (long)tv_get_number_chk(&argvars[2], NULL);
|
||||
@@ -1305,11 +1310,11 @@ static void set_cursorpos(typval_T *argvars, typval_T *rettv, bool charcol)
|
||||
emsg(_(e_invarg));
|
||||
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 = (linenr_T)line;
|
||||
if (lnum > 0) {
|
||||
curwin->w_cursor.lnum = (linenr_T)lnum;
|
||||
}
|
||||
if (col > 0) {
|
||||
curwin->w_cursor.col = (colnr_T)col - 1;
|
||||
|
||||
@@ -3750,9 +3750,11 @@ varnumber_T tv_get_number_chk(const typval_T *const tv, bool *const ret_error)
|
||||
linenr_T tv_get_lnum(const typval_T *const tv)
|
||||
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
|
||||
{
|
||||
const int did_emsg_before = did_emsg;
|
||||
linenr_T lnum = (linenr_T)tv_get_number_chk(tv, NULL);
|
||||
if (lnum == 0) { // No valid number, try using same function as line() does.
|
||||
if (lnum <= 0 && did_emsg_before == did_emsg && tv->v_type != VAR_NUMBER) {
|
||||
int fnum;
|
||||
// No valid number, try using same function as line() does.
|
||||
pos_T *const fp = var2fpos(tv, true, &fnum, false);
|
||||
if (fp != NULL) {
|
||||
lnum = fp->lnum;
|
||||
|
||||
@@ -199,7 +199,7 @@ EXTERN dict_T vimvardict; // Dictionary with v: variables
|
||||
EXTERN dict_T globvardict; // Dictionary with g: variables
|
||||
/// g: value
|
||||
#define globvarht globvardict.dv_hashtab
|
||||
EXTERN bool did_emsg; // set by emsg() when the message
|
||||
EXTERN int did_emsg; // set by emsg() when the message
|
||||
// is displayed or thrown
|
||||
EXTERN bool called_vim_beep; // set if vim_beep() is called
|
||||
EXTERN bool did_emsg_syntax; // did_emsg set because of a
|
||||
|
||||
@@ -658,7 +658,7 @@ static bool emsg_multiline(const char *s, bool multiline)
|
||||
// interrupt message).
|
||||
if (cause_errthrow(s, severe, &ignore)) {
|
||||
if (!ignore) {
|
||||
did_emsg = true;
|
||||
did_emsg++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -721,7 +721,7 @@ static bool emsg_multiline(const char *s, bool multiline)
|
||||
} else {
|
||||
flush_buffers(FLUSH_MINIMAL); // flush internal buffers
|
||||
}
|
||||
did_emsg = true; // flag for DoOneCmd()
|
||||
did_emsg++; // flag for DoOneCmd()
|
||||
}
|
||||
|
||||
emsg_on_display = true; // remember there is an error message
|
||||
|
||||
@@ -32,7 +32,7 @@ func Test_move_cursor()
|
||||
call cursor(1, 1, 1)
|
||||
call assert_equal([1, 1, 1], getcurpos()[1:3])
|
||||
|
||||
call assert_equal(-1, cursor(-1, -1))
|
||||
call assert_fails('call cursor(-1, -1)', 'E475:')
|
||||
|
||||
quit!
|
||||
endfunc
|
||||
@@ -353,8 +353,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])
|
||||
|
||||
Reference in New Issue
Block a user