aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-07-21 17:42:17 +0800
committerGitHub <noreply@github.com>2022-07-21 17:42:17 +0800
commitc15e9d3746ee0aa6a9d80596bffc19e9ac9612bc (patch)
tree63151061bb72c56bed896bb93224687524fec314
parent6a7d00469bd64e8fe63468b5c1643087432709e9 (diff)
downloadrneovim-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.c11
-rw-r--r--src/nvim/regexp_bt.c2
-rw-r--r--src/nvim/regexp_nfa.c4
-rw-r--r--test/functional/editor/mark_spec.lua7
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")