mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
fix(mark): give correct error message when mark is in another buffer (#19454)
This commit is contained in:
@@ -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;
|
fmark_T *fm = NULL;
|
||||||
if (ASCII_ISUPPER(name) || ascii_isdigit(name)) {
|
if (ASCII_ISUPPER(name) || ascii_isdigit(name)) {
|
||||||
// Global marks
|
// Global marks
|
||||||
xfmark_T *xfm = mark_get_global(!(flag & kMarkAllNoResolve), name);
|
xfmark_T *xfm = mark_get_global(flag != kMarkAllNoResolve, name);
|
||||||
fm = &xfm->fmark;
|
fm = &xfm->fmark;
|
||||||
|
if (flag == kMarkBufLocal && xfm->fmark.fnum != buf->handle) {
|
||||||
// Only wanted marks belonging to the buffer
|
// Only wanted marks belonging to the buffer
|
||||||
if ((flag & kMarkBufLocal) && xfm->fmark.fnum != buf->handle) {
|
return pos_to_mark(buf, NULL, (pos_T){ .lnum = 0 });
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
} else if (name > 0 && name < NMARK_LOCAL_MAX) {
|
} else if (name > 0 && name < NMARK_LOCAL_MAX) {
|
||||||
// Local Marks
|
// Local Marks
|
||||||
@@ -508,11 +508,12 @@ fmark_T *mark_get_visual(buf_T *buf, int name)
|
|||||||
/// Pass an fmp if multiple c
|
/// Pass an fmp if multiple c
|
||||||
/// @note view fields are set to 0.
|
/// @note view fields are set to 0.
|
||||||
/// @param buf for fmark->fnum.
|
/// @param buf for fmark->fnum.
|
||||||
/// @param pos for fmrak->mark.
|
/// @param pos for fmark->mark.
|
||||||
/// @param fmp pointer to save the mark.
|
/// @param fmp pointer to save the mark.
|
||||||
///
|
///
|
||||||
/// @return[static] Mark with the given information.
|
/// @return[static] Mark with the given information.
|
||||||
fmark_T *pos_to_mark(buf_T *buf, fmark_T *fmp, pos_T pos)
|
fmark_T *pos_to_mark(buf_T *buf, fmark_T *fmp, pos_T pos)
|
||||||
|
FUNC_ATTR_NONNULL_RET
|
||||||
{
|
{
|
||||||
static fmark_T fms = INIT_FMARK;
|
static fmark_T fms = INIT_FMARK;
|
||||||
fmark_T *fm = fmp == NULL ? &fms : fmp;
|
fmark_T *fm = fmp == NULL ? &fms : fmp;
|
||||||
|
@@ -3705,8 +3705,6 @@ static bool regmatch(char_u *scan, proftime_T *tm, int *timed_out)
|
|||||||
int cmp = OPERAND(scan)[1];
|
int cmp = OPERAND(scan)[1];
|
||||||
pos_T *pos;
|
pos_T *pos;
|
||||||
size_t col = REG_MULTI ? rex.input - rex.line : 0;
|
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);
|
fmark_T *fm = mark_get(rex.reg_buf, curwin, NULL, kMarkBufLocal, mark);
|
||||||
|
|
||||||
// Line may have been freed, get it again.
|
// Line may have been freed, get it again.
|
||||||
|
@@ -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:
|
||||||
case NFA_MARK_GT:
|
case NFA_MARK_GT:
|
||||||
case NFA_MARK_LT: {
|
case NFA_MARK_LT: {
|
||||||
fmark_T *fm;
|
|
||||||
size_t col = REG_MULTI ? rex.input - rex.line : 0;
|
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
|
fmark_T *fm = mark_get(rex.reg_buf, curwin, NULL, kMarkBufLocal, t->state->val);
|
||||||
fm = mark_get(rex.reg_buf, curwin, NULL, kMarkBufLocal, t->state->val);
|
|
||||||
|
|
||||||
// Line may have been freed, get it again.
|
// Line may have been freed, get it again.
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
|
@@ -157,6 +157,13 @@ describe('named marks', function()
|
|||||||
os.remove(file1)
|
os.remove(file1)
|
||||||
end)
|
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()
|
it("leave a context mark when moving with '", function()
|
||||||
command("edit " .. file1)
|
command("edit " .. file1)
|
||||||
feed("llmamA")
|
feed("llmamA")
|
||||||
|
Reference in New Issue
Block a user