From 1fc09b0738e540accb3fea22afeb95906a300ed1 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 28 Sep 2024 17:16:22 +0800 Subject: [PATCH] fix(column): set signcolumn width after splitting window (#30556) (cherry picked from commit d5f6f61879bac3ac90512efe05d68e3500125a08) --- src/nvim/optionstr.c | 38 +++++++++++++++----------------- test/functional/ui/sign_spec.lua | 12 ++++++++++ 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/src/nvim/optionstr.c b/src/nvim/optionstr.c index 5d67971da0..743cd0b8a0 100644 --- a/src/nvim/optionstr.c +++ b/src/nvim/optionstr.c @@ -300,26 +300,26 @@ int check_signcolumn(win_T *wp) wp->w_minscwidth = 0; wp->w_maxscwidth = 1; } - return OK; + } else { + if (strncmp(val, "auto:", 5) != 0 + || strlen(val) != 8 + || !ascii_isdigit(val[5]) + || val[6] != '-' + || !ascii_isdigit(val[7])) { + return FAIL; + } + // auto:- + 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; } - if (strncmp(val, "auto:", 5) != 0 - || strlen(val) != 8 - || !ascii_isdigit(val[5]) - || val[6] != '-' - || !ascii_isdigit(val[7])) { - return FAIL; - } - - // auto:- - 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; + int scwidth = wp->w_minscwidth <= 0 ? 0 : MIN(wp->w_maxscwidth, wp->w_scwidth); + wp->w_scwidth = MAX(wp->w_minscwidth, scwidth); return OK; } @@ -2019,8 +2019,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 126b4fc754..b7bf14997d 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)