patch 9.1.0822: topline might be changed in diff mode unexpectedly

Commit: 
https://github.com/vim/vim/commit/05a40e07c2f0e41b708c4c75a6aa7d0e7f6201a3
Author: Christian Brabandt <c...@256bit.org>
Date:   Tue Oct 29 20:29:04 2024 +0100

    patch 9.1.0822: topline might be changed in diff mode unexpectedly
    
    Problem:  topline might be changed in diff mode unexpectedly
              (Jaehwang Jung)
    Solution: do not re-calculate topline, when using line() func
              in diff mode.
    
    fixes: #15812
    closes: #15950
    
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/evalfunc.c b/src/evalfunc.c
index d902045e8..f6a3f9d91 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -8359,9 +8359,15 @@ f_line(typval_T *argvars, typval_T *rettv)
        {
            if (switch_win_noblock(&switchwin, wp, tp, TRUE) == OK)
            {
+               // in diff mode, prevent that the window scrolls
+               // and keep the topline
+               if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff)
+                   skip_update_topline = TRUE;
                check_cursor();
                fp = var2fpos(&argvars[0], TRUE, &fnum, FALSE);
            }
+           if (curwin->w_p_diff && switchwin.sw_curwin->w_p_diff)
+               skip_update_topline = FALSE;
            restore_win_noblock(&switchwin, TRUE);
        }
     }
diff --git a/src/testdir/dumps/Test_diff_topline_1.dump 
b/src/testdir/dumps/Test_diff_topline_1.dump
new file mode 100644
index 000000000..1d4c9145f
--- /dev/null
+++ b/src/testdir/dumps/Test_diff_topline_1.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| 
+0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1>2+0#0000000#5fd7ff255|1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255@1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|3| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|4| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|5| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|6| @32
+|[+1&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|4|2|%| |[+3&&|N|o| 
|N|a|m|e|]| |[|+|]| @5|2|1|,|1| @10|1|9|%
+| +0&&@74
diff --git a/src/testdir/dumps/Test_diff_topline_2.dump 
b/src/testdir/dumps/Test_diff_topline_2.dump
new file mode 100644
index 000000000..2d28bd373
--- /dev/null
+++ b/src/testdir/dumps/Test_diff_topline_2.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| 
+0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1>2+0#0000000#5fd7ff255|1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255@1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|3| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|4| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|5| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|6| @32
+|[+1&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|4|2|%| |[+3&&|N|o| 
|N|a|m|e|]| |[|+|]| @5|2|1|,|1| @10|1|9|%
+|9+0&&| @73
diff --git a/src/testdir/dumps/Test_diff_topline_3.dump 
b/src/testdir/dumps/Test_diff_topline_3.dump
new file mode 100644
index 000000000..3c0c2c9c8
--- /dev/null
+++ b/src/testdir/dumps/Test_diff_topline_3.dump
@@ -0,0 +1,20 @@
+|++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| 
|1|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| 
|1|-@19
+| @1|5+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1>1+0#0000000#ffffff0|0| @32||+1&&| 
+0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|1| @32
+|[+3&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p| |[+1&&|N|o| 
|N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p
+| +0&&@74
diff --git a/src/testdir/dumps/Test_diff_topline_4.dump 
b/src/testdir/dumps/Test_diff_topline_4.dump
new file mode 100644
index 000000000..6043d7ad7
--- /dev/null
+++ b/src/testdir/dumps/Test_diff_topline_4.dump
@@ -0,0 +1,20 @@
+|++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| 
|1|-@19||+1#0000000#ffffff0|++0#0000e05#a8a8a8255| |+|-@1| @1|4| |l|i|n|e|s|:| 
|1|-@19
+| @1|5+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|5+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|6+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|7+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|8+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33||+1&&| 
+0#0000e05#a8a8a8255@1|9+0#0000000#ffffff0| @33
+| +0#0000e05#a8a8a8255@1|1+0#0000000#ffffff0|0| @32||+1&&| 
+0#0000e05#a8a8a8255@1>1+0#0000000#ffffff0|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255@1| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|2| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|3| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|4| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|5| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|6| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|7| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|8| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|1+0#0000000#5fd7ff255|9| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|0| @32
+| +0#0000e05#a8a8a8255@1|-+0#4040ff13#afffff255@34||+1#0000000#ffffff0| 
+0#0000e05#a8a8a8255@1|2+0#0000000#5fd7ff255|1| @32
+|[+1&#ffffff0|N|o| |N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p| |[+3&&|N|o| 
|N|a|m|e|]| |[|+|]| @5|1|0|,|1| @10|T|o|p
+| +0&&@74
diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim
index 7e117a3b6..a654b6dda 100644
--- a/src/testdir/test_diffmode.vim
+++ b/src/testdir/test_diffmode.vim
@@ -2258,4 +2258,31 @@ func Test_diff_overlapped_diff_blocks_will_be_merged()
   call StopVimInTerminal(buf)
 endfunc
 
+" switching windows in diff mode caused an unneccessary scroll
+func Test_diff_topline_noscroll()
+  CheckScreendump
+
+  let content =<< trim END
+    call setline(1, range(1,60))
+    vnew
+    call setline(1, range(1,10) + range(50,60))
+    windo diffthis
+    norm! G
+    exe "norm! 30\<C-y>"
+  END
+  call writefile(content, 'Xcontent', 'D')
+  let buf = RunVimInTerminal('-S Xcontent', {'rows': 20})
+  call VerifyScreenDump(buf, 'Test_diff_topline_1', {})
+  call term_sendkeys(buf, ":echo line('w0', 1001)\<cr>")
+  call term_wait(buf)
+  call VerifyScreenDump(buf, 'Test_diff_topline_2', {})
+  call term_sendkeys(buf, "\<C-W>p")
+  call term_wait(buf)
+  call VerifyScreenDump(buf, 'Test_diff_topline_3', {})
+  call term_sendkeys(buf, "\<C-W>p")
+  call term_wait(buf)
+  call VerifyScreenDump(buf, 'Test_diff_topline_4', {})
+  call StopVimInTerminal(buf)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 6abc80284..74837b31c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    822,
 /**/
     821,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1t5s9H-00Ge4A-RR%40256bit.org.

Raspunde prin e-mail lui