Skip to content

Commit e2e43b3

Browse files
authored
feat: winfixbuf support (#137)
* feat: add `winfixbuf` support * feat(utils): `with_version` * refactor: `cmd.menu()` * feat(ui-utils): new utility * fix(yank): check for `0.10`
1 parent 94c16d8 commit e2e43b3

File tree

8 files changed

+64
-19
lines changed

8 files changed

+64
-19
lines changed

lua/leetcode-ui/popup/info.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,12 @@ function Info:mount()
134134
local ui_utils = require("leetcode-ui.utils")
135135
local winhighlight = "Normal:NormalSB,FloatBorder:FloatBorder"
136136

137-
ui_utils.set_win_opts(self.winid, {
137+
ui_utils.win_set_opts(self.winid, {
138138
winhighlight = winhighlight,
139139
wrap = true,
140140
})
141141

142-
ui_utils.set_win_opts(self.border.winid, {
142+
ui_utils.win_set_opts(self.border.winid, {
143143
winhighlight = winhighlight,
144144
})
145145

lua/leetcode-ui/question.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ local Object = require("nui.object")
55

66
local api_question = require("leetcode.api.question")
77
local utils = require("leetcode.utils")
8+
local ui_utils = require("leetcode-ui.utils")
89
local config = require("leetcode.config")
910
local log = require("leetcode.logger")
1011

@@ -88,14 +89,15 @@ function Question:create_buffer()
8889
vim.cmd("$tabe " .. path)
8990
self.bufnr = vim.api.nvim_get_current_buf()
9091
self.winid = vim.api.nvim_get_current_win()
92+
ui_utils.win_set_winfixbuf(self.winid)
9193

9294
self:open_buffer(existed)
9395
end
9496

9597
---@param existed boolean
9698
function Question:open_buffer(existed)
97-
vim.api.nvim_win_set_buf(self.winid, self.bufnr)
98-
vim.api.nvim_set_option_value("buflisted", true, { buf = self.bufnr })
99+
ui_utils.buf_set_opts(self.bufnr, { buflisted = true })
100+
ui_utils.win_set_buf(self.winid, self.bufnr, true)
99101

100102
local i = self:fold_range()
101103
if i then

lua/leetcode-ui/renderer/init.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ function Renderer:draw(component)
3737
self._.line_idx = 1
3838

3939
local c_ok, c = pcall(vim.api.nvim_win_get_cursor, self.winid)
40-
self:modifiable(function()
40+
self:with_modifiable(function()
4141
vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, {})
4242
vim.api.nvim_buf_clear_namespace(self.bufnr, -1, 0, -1)
4343

@@ -51,7 +51,7 @@ end
5151
---@private
5252
---
5353
---@param fn function
54-
function Renderer:modifiable(fn)
54+
function Renderer:with_modifiable(fn)
5555
local bufnr = self.bufnr
5656
if not (bufnr and vim.api.nvim_buf_is_valid(bufnr)) then
5757
return
@@ -112,7 +112,7 @@ function Renderer:clear()
112112
self._.line_idx = 1
113113
self._.buttons = {}
114114
self:clear_keymaps()
115-
self:modifiable(function()
115+
self:with_modifiable(function()
116116
vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, {})
117117
end)
118118
end

lua/leetcode-ui/renderer/menu.lua

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
local log = require("leetcode.logger")
22
local cookie = require("leetcode.cache.cookie")
33
local config = require("leetcode.config")
4-
local utils = require("leetcode-ui.utils")
4+
local ui_utils = require("leetcode-ui.utils")
5+
local utils = require("leetcode.utils")
56
local Renderer = require("leetcode-ui.renderer")
67
local api = vim.api
78

@@ -123,7 +124,7 @@ end
123124
function Menu:apply_options()
124125
api.nvim_buf_set_name(self.bufnr, "")
125126

126-
utils.set_buf_opts(self.bufnr, {
127+
ui_utils.buf_set_opts(self.bufnr, {
127128
modifiable = false,
128129
buflisted = false,
129130
matchpairs = "",
@@ -132,7 +133,7 @@ function Menu:apply_options()
132133
filetype = config.name,
133134
synmaxcol = 0,
134135
})
135-
utils.set_win_opts(self.winid, {
136+
ui_utils.win_set_opts(self.winid, {
136137
wrap = false,
137138
colorcolumn = "",
138139
foldlevel = 999,
@@ -145,6 +146,7 @@ function Menu:apply_options()
145146
spell = false,
146147
signcolumn = "no",
147148
})
149+
ui_utils.win_set_winfixbuf(self.winid)
148150
end
149151

150152
function Menu:unmount()
@@ -173,7 +175,7 @@ function Menu:remount()
173175
api.nvim_buf_delete(self.bufnr, { force = true })
174176
end
175177

176-
vim.cmd("$tabnew")
178+
vim.cmd("0tabnew")
177179
self.bufnr = api.nvim_get_current_buf()
178180
self.winid = api.nvim_get_current_win()
179181

lua/leetcode-ui/split/description.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function Description:mount()
3434
self:populate()
3535

3636
local ui_utils = require("leetcode-ui.utils")
37-
ui_utils.set_buf_opts(self.bufnr, {
37+
ui_utils.buf_set_opts(self.bufnr, {
3838
modifiable = false,
3939
buflisted = false,
4040
matchpairs = "",
@@ -43,7 +43,7 @@ function Description:mount()
4343
filetype = config.name,
4444
synmaxcol = 0,
4545
})
46-
ui_utils.set_win_opts(self.winid, {
46+
ui_utils.win_set_opts(self.winid, {
4747
winhighlight = "Normal:NormalFloat,FloatBorder:FloatBorder",
4848
wrap = not img_sup,
4949
colorcolumn = "",
@@ -58,6 +58,8 @@ function Description:mount()
5858
signcolumn = "no",
5959
linebreak = true,
6060
})
61+
ui_utils.win_set_winfixbuf(self.winid)
62+
6163
if not img_ok and config.user.image_support then
6264
log.error("image.nvim not found but `image_support` is enabled")
6365
end

lua/leetcode-ui/utils.lua

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ function utils.get_padding(lines, layout)
103103
return padding
104104
end
105105

106-
function utils.set_buf_opts(bufnr, options)
106+
function utils.buf_set_opts(bufnr, options)
107107
if not vim.api.nvim_buf_is_valid(bufnr) then
108108
return
109109
end
@@ -116,7 +116,7 @@ function utils.set_buf_opts(bufnr, options)
116116
end
117117
end
118118

119-
function utils.set_win_opts(winid, options)
119+
function utils.win_set_opts(winid, options)
120120
if not vim.api.nvim_win_is_valid(winid) then
121121
return
122122
end
@@ -130,6 +130,35 @@ function utils.set_win_opts(winid, options)
130130
end
131131
end
132132

133+
---@param winid number
134+
function utils.win_set_winfixbuf(winid)
135+
local u = require("leetcode.utils")
136+
u.with_version("0.10.0", function()
137+
utils.win_set_opts(winid, { winfixbuf = true })
138+
end)
139+
end
140+
141+
---@param winid number
142+
---@param bufnr number
143+
---@param force? boolean
144+
function utils.win_set_buf(winid, bufnr, force)
145+
local u = require("leetcode.utils")
146+
147+
u.with_version("0.10.0", function()
148+
local wfb = vim.api.nvim_win_get_option(winid, "winfixbuf")
149+
150+
if not wfb then
151+
vim.api.nvim_win_set_buf(winid, bufnr)
152+
elseif force then
153+
utils.win_set_opts(winid, { winfixbuf = false })
154+
vim.api.nvim_win_set_buf(winid, bufnr)
155+
utils.win_set_opts(winid, { winfixbuf = true })
156+
end
157+
end, function()
158+
vim.api.nvim_win_set_buf(winid, bufnr)
159+
end)
160+
end
161+
133162
function utils.is_instance(instance, class)
134163
return type(instance) == "table" and O.is_instance(instance, class)
135164
end

lua/leetcode/command/init.lua

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,11 @@ end
177177
function cmd.menu()
178178
local winid, bufnr = _Lc_state.menu.winid, _Lc_state.menu.bufnr
179179
local ok, tabp = pcall(api.nvim_win_get_tabpage, winid)
180+
local ui = require("leetcode-ui.utils")
180181

181182
if ok then
182183
api.nvim_set_current_tabpage(tabp)
183-
api.nvim_win_set_buf(winid, bufnr)
184+
ui.win_set_buf(winid, bufnr)
184185
else
185186
_Lc_state.menu:remount()
186187
end
@@ -198,7 +199,9 @@ function cmd.yank()
198199
and (q.winid and api.nvim_win_is_valid(q.winid))
199200
then
200201
api.nvim_set_current_win(q.winid)
201-
api.nvim_set_current_buf(q.bufnr)
202+
utils.with_version("0.10.0", nil, function()
203+
api.nvim_set_current_buf(q.bufnr)
204+
end)
202205

203206
local start_i, end_i, lines = q:range()
204207
vim.cmd(("%d,%dyank"):format(start_i or 1, end_i or #lines))
@@ -358,6 +361,7 @@ end
358361

359362
function cmd.restore()
360363
local utils = require("leetcode.utils")
364+
local ui = require("leetcode-ui.utils")
361365
local q = utils.curr_question()
362366
if not q then
363367
return
@@ -367,7 +371,7 @@ function cmd.restore()
367371
(q.winid and api.nvim_win_is_valid(q.winid))
368372
and (q.bufnr and api.nvim_buf_is_valid(q.bufnr))
369373
then
370-
api.nvim_win_set_buf(q.winid, q.bufnr)
374+
ui.win_set_buf(q.winid, q.bufnr)
371375
end
372376

373377
q.description:show()
@@ -377,7 +381,7 @@ function cmd.restore()
377381
(winid and api.nvim_win_is_valid(winid)) --
378382
and (bufnr and api.nvim_buf_is_valid(bufnr))
379383
then
380-
api.nvim_win_set_buf(winid, bufnr)
384+
ui.win_set_buf(q.winid, q.bufnr)
381385
end
382386
end
383387

lua/leetcode/utils.lua

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,10 @@ function utils.norm_ins(str)
138138
return ins:sub(2, #ins - 1)
139139
end
140140

141+
function utils.with_version(v, with, without)
142+
with = with or function() end
143+
without = without or function() end
144+
return (vim.fn.has("nvim-" .. v) == 1 and with or without)()
145+
end
146+
141147
return utils

0 commit comments

Comments
 (0)