aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-09-28 17:16:22 +0800
committerGitHub <noreply@github.com>2024-09-28 17:16:22 +0800
commitd5f6f61879bac3ac90512efe05d68e3500125a08 (patch)
treee47b8f939eab5cbca68b2ecd1ed876b0706bd9d3
parent4349bdbd0bd0096b4f4bea0feda0961e3b03f3cc (diff)
downloadrneovim-d5f6f61879bac3ac90512efe05d68e3500125a08.tar.gz
rneovim-d5f6f61879bac3ac90512efe05d68e3500125a08.tar.bz2
rneovim-d5f6f61879bac3ac90512efe05d68e3500125a08.zip
fix(column): set signcolumn width after splitting window (#30556)
-rw-r--r--src/nvim/optionstr.c38
-rw-r--r--test/functional/ui/sign_spec.lua12
2 files changed, 30 insertions, 20 deletions
diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c
index 8eadd52972..a9651084b7 100644
--- a/src/nvim/optionstr.c
+++ b/src/nvim/optionstr.c
@@ -306,26 +306,26 @@ int check_signcolumn(win_T *wp)
wp->w_minscwidth = 0;
wp->w_maxscwidth = 1;
}
- return OK;
- }
-
- if (strncmp(val, "auto:", 5) != 0
- || strlen(val) != 8
- || !ascii_isdigit(val[5])
- || val[6] != '-'
- || !ascii_isdigit(val[7])) {
- return FAIL;
- }
-
- // auto:<NUM>-<NUM>
- int min = val[5] - '0';
- int max = val[7] - '0';
- if (min < 1 || max < 2 || min > 8 || min >= max) {
- return FAIL;
+ } else {
+ if (strncmp(val, "auto:", 5) != 0
+ || strlen(val) != 8
+ || !ascii_isdigit(val[5])
+ || val[6] != '-'
+ || !ascii_isdigit(val[7])) {
+ return FAIL;
+ }
+ // auto:<NUM>-<NUM>
+ int min = val[5] - '0';
+ int max = val[7] - '0';
+ if (min < 1 || max < 2 || min > 8 || min >= max) {
+ return FAIL;
+ }
+ wp->w_minscwidth = min;
+ wp->w_maxscwidth = max;
}
- wp->w_minscwidth = min;
- wp->w_maxscwidth = max;
+ int scwidth = wp->w_minscwidth <= 0 ? 0 : MIN(wp->w_maxscwidth, wp->w_scwidth);
+ wp->w_scwidth = MAX(wp->w_minscwidth, scwidth);
return OK;
}
@@ -2038,8 +2038,6 @@ const char *did_set_signcolumn(optset_T *args)
if (check_signcolumn(win) != OK) {
return e_invarg;
}
- int scwidth = win->w_minscwidth <= 0 ? 0 : MIN(win->w_maxscwidth, win->w_scwidth);
- win->w_scwidth = MAX(win->w_minscwidth, scwidth);
// When changing the 'signcolumn' to or from 'number', recompute the
// width of the number column if 'number' or 'relativenumber' is set.
if ((*oldval == 'n' && *(oldval + 1) == 'u') || win->w_minscwidth == SCL_NUM) {
diff --git a/test/functional/ui/sign_spec.lua b/test/functional/ui/sign_spec.lua
index 6f4bf5695d..30da79af47 100644
--- a/test/functional/ui/sign_spec.lua
+++ b/test/functional/ui/sign_spec.lua
@@ -4,6 +4,7 @@ local Screen = require('test.functional.ui.screen')
local api, clear, eq = n.api, n.clear, t.eq
local eval, exec, feed = n.eval, n.exec, n.feed
+local exec_lua = n.exec_lua
describe('Signs', function()
local screen
@@ -607,4 +608,15 @@ describe('Signs', function()
exec('sign unplace 1')
screen:expect(s1)
end)
+
+ it('signcolumn width is set immediately after splitting window #30547', function()
+ local infos = exec_lua([[
+ vim.o.number = true
+ vim.o.signcolumn = 'yes'
+ vim.cmd.wincmd('v')
+ return vim.fn.getwininfo()
+ ]])
+ eq(6, infos[1].textoff)
+ eq(6, infos[2].textoff)
+ end)
end)