diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-07-21 17:42:17 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-21 17:42:17 +0800 |
commit | c15e9d3746ee0aa6a9d80596bffc19e9ac9612bc (patch) | |
tree | 63151061bb72c56bed896bb93224687524fec314 | |
parent | 6a7d00469bd64e8fe63468b5c1643087432709e9 (diff) | |
download | rneovim-c15e9d3746ee0aa6a9d80596bffc19e9ac9612bc.tar.gz rneovim-c15e9d3746ee0aa6a9d80596bffc19e9ac9612bc.tar.bz2 rneovim-c15e9d3746ee0aa6a9d80596bffc19e9ac9612bc.zip |
fix(mark): give correct error message when mark is in another buffer (#19454)
-rw-r--r-- | src/nvim/mark.c | 11 | ||||
-rw-r--r-- | src/nvim/regexp_bt.c | 2 | ||||
-rw-r--r-- | src/nvim/regexp_nfa.c | 4 | ||||
-rw-r--r-- | test/functional/editor/mark_spec.lua | 7 |
4 files changed, 14 insertions, 10 deletions
diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 66855c66b5..b7d0e9b401 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -339,11 +339,11 @@ fmark_T *mark_get(buf_T *buf, win_T *win, fmark_T *fmp, MarkGet flag, int name) fmark_T *fm = NULL; if (ASCII_ISUPPER(name) || ascii_isdigit(name)) { // Global marks - xfmark_T *xfm = mark_get_global(!(flag & kMarkAllNoResolve), name); + xfmark_T *xfm = mark_get_global(flag != kMarkAllNoResolve, name); fm = &xfm->fmark; - // Only wanted marks belonging to the buffer - if ((flag & kMarkBufLocal) && xfm->fmark.fnum != buf->handle) { - return NULL; + if (flag == kMarkBufLocal && xfm->fmark.fnum != buf->handle) { + // Only wanted marks belonging to the buffer + return pos_to_mark(buf, NULL, (pos_T){ .lnum = 0 }); } } else if (name > 0 && name < NMARK_LOCAL_MAX) { // Local Marks @@ -508,11 +508,12 @@ fmark_T *mark_get_visual(buf_T *buf, int name) /// Pass an fmp if multiple c /// @note view fields are set to 0. /// @param buf for fmark->fnum. -/// @param pos for fmrak->mark. +/// @param pos for fmark->mark. /// @param fmp pointer to save the mark. /// /// @return[static] Mark with the given information. fmark_T *pos_to_mark(buf_T *buf, fmark_T *fmp, pos_T pos) + FUNC_ATTR_NONNULL_RET { static fmark_T fms = INIT_FMARK; fmark_T *fm = fmp == NULL ? &fms : fmp; diff --git a/src/nvim/regexp_bt.c b/src/nvim/regexp_bt.c index 272429bb91..f82006bede 100644 --- a/src/nvim/regexp_bt.c +++ b/src/nvim/regexp_bt.c @@ -3705,8 +3705,6 @@ static bool regmatch(char_u *scan, proftime_T *tm, int *timed_out) int cmp = OPERAND(scan)[1]; pos_T *pos; size_t col = REG_MULTI ? rex.input - rex.line : 0; - - // fm will be NULL if the mark is not set in reg_buf fmark_T *fm = mark_get(rex.reg_buf, curwin, NULL, kMarkBufLocal, mark); // Line may have been freed, get it again. diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c index 870af3eafc..eda18ebec9 100644 --- a/src/nvim/regexp_nfa.c +++ b/src/nvim/regexp_nfa.c @@ -6930,10 +6930,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm case NFA_MARK: case NFA_MARK_GT: case NFA_MARK_LT: { - fmark_T *fm; size_t col = REG_MULTI ? rex.input - rex.line : 0; - // fm will be NULL if the mark is not set, doesn't belong to reg_buf - fm = mark_get(rex.reg_buf, curwin, NULL, kMarkBufLocal, t->state->val); + fmark_T *fm = mark_get(rex.reg_buf, curwin, NULL, kMarkBufLocal, t->state->val); // Line may have been freed, get it again. if (REG_MULTI) { diff --git a/test/functional/editor/mark_spec.lua b/test/functional/editor/mark_spec.lua index 1eb76aa628..2440867c6e 100644 --- a/test/functional/editor/mark_spec.lua +++ b/test/functional/editor/mark_spec.lua @@ -157,6 +157,13 @@ describe('named marks', function() os.remove(file1) end) + it("errors when using a mark in another buffer in command range", function() + feed('ifoo<Esc>mA') + command('enew') + feed('ibar<Esc>') + eq('Vim(print):E20: Mark not set', pcall_err(command, [['Aprint]])) + end) + it("leave a context mark when moving with '", function() command("edit " .. file1) feed("llmamA") |