aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2023-04-17 17:32:32 +0100
committerSean Dewar <seandewar@users.noreply.github.com>2023-04-17 18:38:31 +0100
commit7095f8ff9d9ce3519abe34a3da4c8f4bdc3fc865 (patch)
treeb5dbcc244f5ae81581cbc77cd6d9309717dba9e3
parent9e5f9c25d9955f8c0ab7de874cf3a40fc077458b (diff)
downloadrneovim-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.c11
-rw-r--r--test/functional/legacy/cmdline_spec.lua19
-rw-r--r--test/functional/ui/float_spec.lua45
-rw-r--r--test/old/testdir/test_cmdline.vim13
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