commit 826fe56f5cf30a823dc627b8a710174d04004cef
parent 1803b0ffd7f08b50a3f59272ebe7290ffd21e90f
Author: zeertzjq <zeertzjq@outlook.com>
Date: Tue, 5 Jul 2022 04:28:14 +0800
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.
Diffstat:
3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/src/nvim/mark.c b/src/nvim/mark.c
@@ -607,6 +607,8 @@ void mark_view_restore(fmark_T *fm)
{
if (fm != NULL && fm->view.topline_offset >= 0) {
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) {
set_topline(curwin, topline);
}
diff --git a/src/nvim/mark_defs.h b/src/nvim/mark_defs.h
@@ -64,9 +64,10 @@ typedef enum {
/// Represents view in which the mark was created
typedef struct fmarkv {
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;
-#define INIT_FMARKV { 0 }
+#define INIT_FMARKV { MAXLNUM }
/// Structure defining single local mark
typedef struct filemark {
diff --git a/test/functional/editor/jump_spec.lua b/test/functional/editor/jump_spec.lua
@@ -251,4 +251,32 @@ describe("jumpoptions=view", function()
|
]])
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)