fix(mark): mark without a view restores at topline #19224

For a local mark without a view, currently trying to restore its view
will put the cursor at topline, which is not the correct behavior.
Initialize `topline_offset` to `MAXLNUM` instead to fix this.
This commit is contained in:
zeertzjq
2022-07-05 04:28:14 +08:00
committed by GitHub
parent 1803b0ffd7
commit 826fe56f5c
3 changed files with 32 additions and 1 deletions

View File

@@ -607,6 +607,8 @@ void mark_view_restore(fmark_T *fm)
{ {
if (fm != NULL && fm->view.topline_offset >= 0) { if (fm != NULL && fm->view.topline_offset >= 0) {
linenr_T topline = fm->mark.lnum - fm->view.topline_offset; linenr_T topline = fm->mark.lnum - fm->view.topline_offset;
// If the mark does not have a view, topline_offset is MAXLNUM,
// and this check can prevent restoring mark view in that case.
if (topline >= 1) { if (topline >= 1) {
set_topline(curwin, topline); set_topline(curwin, topline);
} }

View File

@@ -64,9 +64,10 @@ typedef enum {
/// Represents view in which the mark was created /// Represents view in which the mark was created
typedef struct fmarkv { typedef struct fmarkv {
linenr_T topline_offset; ///< Amount of lines from the mark lnum to the top of the window. linenr_T topline_offset; ///< Amount of lines from the mark lnum to the top of the window.
///< Use MAXLNUM to indicate that the mark does not have a view.
} fmarkv_T; } fmarkv_T;
#define INIT_FMARKV { 0 } #define INIT_FMARKV { MAXLNUM }
/// Structure defining single local mark /// Structure defining single local mark
typedef struct filemark { typedef struct filemark {

View File

@@ -251,4 +251,32 @@ describe("jumpoptions=view", function()
| |
]]) ]])
end) end)
it('falls back to standard behavior for a mark without a view', function()
local screen = Screen.new(5, 8)
screen:attach()
command('edit ' .. file1)
feed('10ggzzvwy')
screen:expect([[
7 line |
8 line |
9 line |
^10 line |
11 line |
12 line |
13 line |
|
]])
feed('`]')
screen:expect([[
7 line |
8 line |
9 line |
10 ^line |
11 line |
12 line |
13 line |
|
]])
end)
end) end)