irongit

A Neovim plugin enabling you to solve LeetCode problems.

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`
Marcinauthored committed by GitHub
parent 94c16d8commit e2e43b38085faf51c0b62d239f29eeac463161baBrowse files

8 files changed, +64 -19

+2-2lua/leetcode-ui/popup/info.lua
@@ -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
+4-2lua/leetcode-ui/question.lua
@@ -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
+3-3lua/leetcode-ui/renderer/init.lua
@@ -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
+6-4lua/leetcode-ui/renderer/menu.lua
@@ -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
+4-2lua/leetcode-ui/split/description.lua
@@ -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
+31-2lua/leetcode-ui/utils.lua
@@ -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
+8-4lua/leetcode/command/init.lua
@@ -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
+6-0lua/leetcode/utils.lua
@@ -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