From c0daea3afd6a1e502e282a235a10643c785301f7 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 16 Mar 2024 17:10:20 +0800 Subject: [PATCH] vim-patch:9.1.0183: Wrong display or screenpos() result when toggling diff mode (#27882) Problem: Wrong display or screenpos() result when toggling diff mode. Solution: Reset w_skipcol when disabling 'wrap'. Reset w_leftcol when enabling 'wrap' (zeertzjq). fixes: vim/vim#14210 closes: vim/vim#14211 https://github.com/vim/vim/commit/9e7f1fc2f159d58b2a4cd4b7060bead126fead49 --- src/nvim/diff.c | 6 ++- test/old/testdir/test_diffmode.vim | 67 ++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/nvim/diff.c b/src/nvim/diff.c index c680600d39..39d9e9e978 100644 --- a/src/nvim/diff.c +++ b/src/nvim/diff.c @@ -1429,6 +1429,7 @@ void diff_win_options(win_T *wp, bool addbuf) wp->w_p_wrap_save = wp->w_p_wrap; } wp->w_p_wrap = false; + wp->w_skipcol = 0; } if (!wp->w_p_diff) { @@ -1497,8 +1498,9 @@ void ex_diffoff(exarg_T *eap) wp->w_p_crb = wp->w_p_crb_save; } if (!(diff_flags & DIFF_FOLLOWWRAP)) { - if (!wp->w_p_wrap) { - wp->w_p_wrap = wp->w_p_wrap_save; + if (!wp->w_p_wrap && wp->w_p_wrap_save) { + wp->w_p_wrap = true; + wp->w_leftcol = 0; } } free_string_option(wp->w_p_fdm); diff --git a/test/old/testdir/test_diffmode.vim b/test/old/testdir/test_diffmode.vim index 9a3e006430..c1a63a6f88 100644 --- a/test/old/testdir/test_diffmode.vim +++ b/test/old/testdir/test_diffmode.vim @@ -3,6 +3,7 @@ source shared.vim source screendump.vim source check.vim +source view_util.vim func Test_diff_fold_sync() enew! @@ -1702,4 +1703,70 @@ func Test_diff_put_and_undo() endfunc +func Test_diff_toggle_wrap_skipcol_leftcol() + 61vnew + call setline(1, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.') + 30vnew + call setline(1, 'ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.') + let win1 = win_getid() + setlocal smoothscroll + exe "normal! $\" + wincmd l + let win2 = win_getid() + setlocal smoothscroll + exe "normal! $\" + call assert_equal([ + \ '<<