diff options
author | Sean Dewar <seandewar@users.noreply.github.com> | 2023-04-17 17:32:32 +0100 |
---|---|---|
committer | Sean Dewar <seandewar@users.noreply.github.com> | 2023-04-17 18:38:31 +0100 |
commit | 7095f8ff9d9ce3519abe34a3da4c8f4bdc3fc865 (patch) | |
tree | b5dbcc244f5ae81581cbc77cd6d9309717dba9e3 | |
parent | 9e5f9c25d9955f8c0ab7de874cf3a40fc077458b (diff) | |
download | rneovim-7095f8ff9d9ce3519abe34a3da4c8f4bdc3fc865.tar.gz rneovim-7095f8ff9d9ce3519abe34a3da4c8f4bdc3fc865.tar.bz2 rneovim-7095f8ff9d9ce3519abe34a3da4c8f4bdc3fc865.zip |
vim-patch:9.0.1461: ruler not drawn correctly when using 'rulerformat'
Problem: Ruler not drawn correctly when using 'rulerformat'.
Solution: Adjust formatting depending on whether the ruler is drawn in the
statusline or the command line. (Sean Dewar, closes vim/vim#12246)
https://github.com/vim/vim/commit/fc8a601c3251c0388a88c1235b18c529385f7196
This issue was made apparent after neovim/neovim@0f1e2b6, as `showmode()` calls
`win_redr_ruler()` with `curwin` now if it's floating, rather than the last
window if there's no statusline (which usually already shares its right side
with that of the editor).
Co-authored-by: Sean Dewar <seandewar@users.noreply.github.com>
-rw-r--r-- | src/nvim/statusline.c | 11 | ||||
-rw-r--r-- | test/functional/legacy/cmdline_spec.lua | 19 | ||||
-rw-r--r-- | test/functional/ui/float_spec.lua | 45 | ||||
-rw-r--r-- | test/old/testdir/test_cmdline.vim | 13 |
4 files changed, 84 insertions, 4 deletions
diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c index feb67ad6fa..5a1f7e3a7f 100644 --- a/src/nvim/statusline.c +++ b/src/nvim/statusline.c @@ -348,7 +348,8 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) } else { row = is_stl_global ? (Rows - (int)p_ch - 1) : W_ENDROW(wp); fillchar = fillchar_status(&attr, wp); - maxwidth = is_stl_global ? Columns : wp->w_width; + const bool in_status_line = wp->w_status_height != 0 || is_stl_global; + maxwidth = in_status_line && !is_stl_global ? wp->w_width : Columns; stl_clear_click_defs(wp->w_status_click_defs, wp->w_status_click_defs_size); wp->w_status_click_defs = stl_alloc_click_defs(wp->w_status_click_defs, maxwidth, &wp->w_status_click_defs_size); @@ -374,8 +375,8 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) if (col < (maxwidth + 1) / 2) { col = (maxwidth + 1) / 2; } - maxwidth = maxwidth - col; - if (!wp->w_status_height && !is_stl_global) { + maxwidth -= col; + if (!in_status_line) { grid = &msg_grid_adj; row = Rows - 1; maxwidth--; // writing in last column may cause scrolling @@ -388,7 +389,9 @@ static void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) opt_scope = ((*wp->w_p_stl != NUL) ? OPT_LOCAL : 0); } - col += is_stl_global ? 0 : wp->w_wincol; + if (in_status_line && !is_stl_global) { + col += wp->w_wincol; + } } if (maxwidth <= 0) { diff --git a/test/functional/legacy/cmdline_spec.lua b/test/functional/legacy/cmdline_spec.lua index 2fceb6a132..f7df6ae8d7 100644 --- a/test/functional/legacy/cmdline_spec.lua +++ b/test/functional/legacy/cmdline_spec.lua @@ -239,6 +239,25 @@ describe('cmdline', function() | ]]) end) + + -- oldtest: Test_rulerformat_position() + it("ruler has correct position with 'rulerformat' set", function() + local screen = Screen.new(20, 3) + screen:set_default_attr_ids { + [0] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + } + screen:attach() + meths.set_option('ruler', true) + meths.set_option('rulerformat', 'longish') + meths.set_option('laststatus', 0) + meths.set_option('winwidth', 1) + feed [[<C-W>v<C-W>|<C-W>p]] + screen:expect [[ + │^ | + {0:~ }│{0:~}| + longish | + ]] + end) end) describe('cmdwin', function() diff --git a/test/functional/ui/float_spec.lua b/test/functional/ui/float_spec.lua index 3203b187cc..0e1842d087 100644 --- a/test/functional/ui/float_spec.lua +++ b/test/functional/ui/float_spec.lua @@ -2295,6 +2295,51 @@ describe('float window', function() end end) + it("correct ruler position in current float with 'rulerformat' set", function() + command 'set ruler rulerformat=fish:<><' + meths.open_win(0, true, {relative='editor', width=9, height=3, row=0, col=5}) + if multigrid then + screen:expect{grid=[[ + ## grid 1 + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [2:----------------------------------------]| + [3:----------------------------------------]| + ## grid 2 + | + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + {0:~ }| + ## grid 3 + fish:<>< | + ## grid 4 + {1:^ }| + {2:~ }| + {2:~ }| + ]], float_pos={ + [4] = {{id = 1001}, "NW", 1, 0, 5, true, 50}; + }, win_viewport={ + [2] = {win = {id = 1000}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0}; + [4] = {win = {id = 1001}, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0}; + }} + else + screen:expect{grid=[[ + {1:^ } | + {0:~ }{2:~ }{0: }| + {0:~ }{2:~ }{0: }| + {0:~ }| + {0:~ }| + {0:~ }| + fish:<>< | + ]]} + end + end) + it('can have minimum size', function() insert("the background text") local buf = meths.create_buf(false, true) diff --git a/test/old/testdir/test_cmdline.vim b/test/old/testdir/test_cmdline.vim index 0c6464ae80..9d506a66c0 100644 --- a/test/old/testdir/test_cmdline.vim +++ b/test/old/testdir/test_cmdline.vim @@ -3599,4 +3599,17 @@ func Test_setcmdline() cunmap a endfunc +func Test_rulerformat_position() + CheckScreendump + + let buf = RunVimInTerminal('', #{rows: 2, cols: 20}) + call term_sendkeys(buf, ":set ruler rulerformat=longish\<CR>") + call term_sendkeys(buf, ":set laststatus=0 winwidth=1\<CR>") + call term_sendkeys(buf, "\<C-W>v\<C-W>|\<C-W>p") + call VerifyScreenDump(buf, 'Test_rulerformat_position', {}) + + " clean up + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab |