fix(buffer): switching buffer should respect jumpoptions+=view (#36969)

Also add missing change to buflist_findfmark() from #19224.

(cherry picked from commit 2700f6642a)
This commit is contained in:
zeertzjq
2025-12-15 14:45:11 +08:00
committed by github-actions[bot]
parent 45cda1bcf4
commit 6f84ea7c66
2 changed files with 29 additions and 15 deletions

View File

@@ -2219,7 +2219,8 @@ int buflist_getfile(int n, linenr_T lnum, int options, int forceit)
/// Go to the last known line number for the current buffer. /// Go to the last known line number for the current buffer.
void buflist_getfpos(void) void buflist_getfpos(void)
{ {
pos_T *fpos = &buflist_findfmark(curbuf)->mark; fmark_T *fm = buflist_findfmark(curbuf);
const pos_T *fpos = &fm->mark;
curwin->w_cursor.lnum = fpos->lnum; curwin->w_cursor.lnum = fpos->lnum;
check_cursor_lnum(curwin); check_cursor_lnum(curwin);
@@ -2232,6 +2233,10 @@ void buflist_getfpos(void)
curwin->w_cursor.coladd = 0; curwin->w_cursor.coladd = 0;
curwin->w_set_curswant = true; curwin->w_set_curswant = true;
} }
if (jop_flags & kOptJopFlagView) {
mark_view_restore(fm);
}
} }
/// Find file in buffer list by name (it has to be for the current window). /// Find file in buffer list by name (it has to be for the current window).
@@ -2812,7 +2817,7 @@ void get_winopts(buf_T *buf)
fmark_T *buflist_findfmark(buf_T *buf) fmark_T *buflist_findfmark(buf_T *buf)
FUNC_ATTR_PURE FUNC_ATTR_PURE
{ {
static fmark_T no_position = { { 1, 0, 0 }, 0, 0, { 0 }, NULL }; static fmark_T no_position = { { 1, 0, 0 }, 0, 0, INIT_FMARKV, NULL };
WinInfo *const wip = find_wininfo(buf, false, false); WinInfo *const wip = find_wininfo(buf, false, false);
return (wip == NULL) ? &no_position : &(wip->wi_mark); return (wip == NULL) ? &no_position : &(wip->wi_mark);

View File

@@ -423,27 +423,36 @@ describe('jumpoptions=view', function()
]]) ]])
end) end)
it('restores the view across files with <C-^>', function() it('restores the view across files with <C-^>/:bprevious/:bnext', function()
local screen = Screen.new(5, 5) local screen = Screen.new(5, 5)
command('args ' .. file1 .. ' ' .. file2) command('args ' .. file1 .. ' ' .. file2)
feed('12Gzt') feed('12Gzt')
command('next') local s1 = [[
feed('G')
screen:expect([[
27 line |
28 line |
29 line |
^30 line |
|
]])
feed('<C-^>')
screen:expect([[
^12 line | ^12 line |
13 line | 13 line |
14 line | 14 line |
15 line | 15 line |
| |
]]) ]]
screen:expect(s1)
command('next')
feed('G')
local s2 = [[
27 line |
28 line |
29 line |
^30 line |
|
]]
screen:expect(s2)
feed('<C-^>')
screen:expect(s1)
feed('<C-^>')
screen:expect(s2)
command('bprevious')
screen:expect(s1)
command('bnext')
screen:expect(s2)
end) end)
it("falls back to standard behavior when view can't be recovered", function() it("falls back to standard behavior when view can't be recovered", function()