Skip to content

Commit fb6b3d1

Browse files
committedOct 13, 2024
feat: user configurable anti conceal per component
## Details Request: #204 Previously the decoration elements that are hidden on the cursor line was not something the user had direct control over. The default behavior was to never hide virtual lines, spacing, signs or code backgrounds. All other decorations on the line would always be hidden if the user kept anti conceal enabled. For the time being virtual lines and spacing remain permanently enabled. However signs, code backgrounds and most other elements that by default would be hidden are entirely within the users control. This is all managed through the new `anti_conceal.ignore` property. This table is a mapping from element name to a boolean. A value of `true` for an element means it will not be concealed when the cursor enters the line. A value of `false` behaves the same as no value being set and will be hidden. A table is used rather than a list so that when users modify values the defaults remain the same as they were unless explicitely changed. Signs and code backgrounds set their values to `true` to remain ignored by default as before, however now users have the ability to change this behavior if they would like to hide signs and backgrounds. Additionally most other decorations that remain concealable by default like before can now be ignored if the user sets their value to true. A complete list of possible values is provided in the default configuration in the README.
1 parent 18c7ef7 commit fb6b3d1

21 files changed

+108
-41
lines changed
 

Diff for: ‎CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
- allow empty lists for all heading properties [0c6de74](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/0c6de743a8d3c61b87bc7db9ab97dcda12ca6818)
1111
- wiki link config & language highlight [#205](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/205)
1212
[965c222](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/965c222076b2d289ed498730845d533780f3c7c7)
13+
- code language name [#205](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/205)
14+
[18c7ef7](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/18c7ef71fb4b8d83cb0160adc9127fc4d65ca42e)
1315

1416
### Bug Fixes
1517

Diff for: ‎README.md

+7
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,13 @@ require('render-markdown').setup({
169169
anti_conceal = {
170170
-- This enables hiding any added text on the line the cursor is on
171171
enabled = true,
172+
-- Which elements to always show, ignoring anti conceal behavior. Possible values are:
173+
-- head_icon, head_background, head_border, code_language, code_background, code_border
174+
-- dash, bullet, check_icon, check_scope, quote, table_border, callout, link, sign
175+
ignore = {
176+
code_background = true,
177+
sign = true,
178+
},
172179
-- Number of lines above cursor to show
173180
above = 0,
174181
-- Number of lines below cursor to show

Diff for: ‎doc/render-markdown.txt

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*render-markdown.txt* For 0.10.0 Last change: 2024 October 12
1+
*render-markdown.txt* For 0.10.0 Last change: 2024 October 13
22

33
==============================================================================
44
Table of Contents *render-markdown-table-of-contents*
@@ -218,6 +218,13 @@ Default Configuration ~
218218
anti_conceal = {
219219
-- This enables hiding any added text on the line the cursor is on
220220
enabled = true,
221+
-- Which elements to always show, ignoring anti conceal behavior. Possible values are:
222+
-- head_icon, head_background, head_border, code_language, code_background, code_border
223+
-- dash, bullet, check_icon, check_scope, quote, table_border, callout, link, sign
224+
ignore = {
225+
code_background = true,
226+
sign = true,
227+
},
221228
-- Number of lines above cursor to show
222229
above = 0,
223230
-- Number of lines below cursor to show

Diff for: ‎lua/render-markdown/core/list.lua

+21-6
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ local log = require('render-markdown.core.log')
22
local util = require('render-markdown.core.util')
33

44
---@class render.md.Marks
5+
---@field private ignore table<render.md.Element, boolean>
56
---@field private marks render.md.Mark[]
67
local Marks = {}
78
Marks.__index = Marks
89

10+
---@param ignore table<render.md.Element, boolean>
911
---@return render.md.Marks
10-
function Marks.new()
12+
function Marks.new(ignore)
1113
local self = setmetatable({}, Marks)
14+
self.ignore = ignore
1215
self.marks = {}
1316
return self
1417
end
@@ -18,15 +21,15 @@ function Marks:get()
1821
return self.marks
1922
end
2023

21-
---@param conceal boolean
24+
---@param element boolean|render.md.Element
2225
---@param start_row integer
2326
---@param start_col integer
2427
---@param opts vim.api.keyset.set_extmark
2528
---@return boolean
26-
function Marks:add(conceal, start_row, start_col, opts)
29+
function Marks:add(element, start_row, start_col, opts)
2730
---@type render.md.Mark
2831
local mark = {
29-
conceal = conceal,
32+
conceal = self:conceal(element),
3033
start_row = start_row,
3134
start_col = start_col,
3235
opts = opts,
@@ -44,12 +47,24 @@ function Marks:add(conceal, start_row, start_col, opts)
4447
return true
4548
end
4649

50+
---@private
51+
---@param element boolean|render.md.Element
52+
---@return boolean
53+
function Marks:conceal(element)
54+
if type(element) == 'boolean' then
55+
return element
56+
else
57+
return self.ignore[element] ~= true
58+
end
59+
end
60+
4761
---@class render.md.ListHelper
4862
local M = {}
4963

64+
---@param ignore? table<render.md.Element, boolean>
5065
---@return render.md.Marks
51-
function M.new_marks()
52-
return Marks.new()
66+
function M.new_marks(ignore)
67+
return Marks.new(ignore or {})
5368
end
5469

5570
---@generic T

Diff for: ‎lua/render-markdown/handler/markdown.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ local state = require('render-markdown.state')
44
local treesitter = require('render-markdown.core.treesitter')
55

66
---@class render.md.handler.buf.Markdown
7-
---@field private marks render.md.Marks
87
---@field private config render.md.buffer.Config
98
---@field private context render.md.Context
9+
---@field private marks render.md.Marks
1010
---@field private query vim.treesitter.Query
1111
---@field private renderers table<string, render.md.Renderer>
1212
local Handler = {}
@@ -16,9 +16,9 @@ Handler.__index = Handler
1616
---@return render.md.handler.buf.Markdown
1717
function Handler.new(buf)
1818
local self = setmetatable({}, Handler)
19-
self.marks = list.new_marks()
2019
self.config = state.get(buf)
2120
self.context = Context.get(buf)
21+
self.marks = list.new_marks(self.config.anti_conceal.ignore)
2222
self.query = treesitter.parse(
2323
'markdown',
2424
[[

Diff for: ‎lua/render-markdown/handler/markdown_inline.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ local state = require('render-markdown.state')
44
local treesitter = require('render-markdown.core.treesitter')
55

66
---@class render.md.handler.buf.MarkdownInline
7-
---@field private marks render.md.Marks
87
---@field private config render.md.buffer.Config
98
---@field private context render.md.Context
9+
---@field private marks render.md.Marks
1010
---@field private query vim.treesitter.Query
1111
---@field private renderers table<string, render.md.Renderer>
1212
local Handler = {}
@@ -16,9 +16,9 @@ Handler.__index = Handler
1616
---@return render.md.handler.buf.MarkdownInline
1717
function Handler.new(buf)
1818
local self = setmetatable({}, Handler)
19-
self.marks = list.new_marks()
2019
self.config = state.get(buf)
2120
self.context = Context.get(buf)
21+
self.marks = list.new_marks(self.config.anti_conceal.ignore)
2222
self.query = treesitter.parse(
2323
'markdown_inline',
2424
[[

Diff for: ‎lua/render-markdown/health.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local state = require('render-markdown.state')
44
local M = {}
55

66
---@private
7-
M.version = '7.3.6'
7+
M.version = '7.3.7'
88

99
function M.check()
1010
M.start('version')

Diff for: ‎lua/render-markdown/init.lua

+25
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,26 @@ local M = {}
174174
---@class (exact) render.md.UserPadding
175175
---@field public highlight? string
176176

177+
---@alias render.md.Element
178+
---| 'head_icon'
179+
---| 'head_background'
180+
---| 'head_border'
181+
---| 'code_language'
182+
---| 'code_background'
183+
---| 'code_border'
184+
---| 'dash'
185+
---| 'bullet'
186+
---| 'check_icon'
187+
---| 'check_scope'
188+
---| 'quote'
189+
---| 'table_border'
190+
---| 'callout'
191+
---| 'link'
192+
---| 'sign'
193+
177194
---@class (exact) render.md.UserAntiConceal
178195
---@field public enabled? boolean
196+
---@field public ignore? table<render.md.Element, boolean>
179197
---@field public above? integer
180198
---@field public below? integer
181199

@@ -262,6 +280,13 @@ M.default_config = {
262280
anti_conceal = {
263281
-- This enables hiding any added text on the line the cursor is on
264282
enabled = true,
283+
-- Which elements to always show, ignoring anti conceal behavior. Possible values are:
284+
-- head_icon, head_background, head_border, code_language, code_background, code_border
285+
-- dash, bullet, check_icon, check_scope, quote, table_border, callout, link, sign
286+
ignore = {
287+
code_background = true,
288+
sign = true,
289+
},
265290
-- Number of lines above cursor to show
266291
above = 0,
267292
-- Number of lines below cursor to show

Diff for: ‎lua/render-markdown/render/base.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ function Base:sign(text, highlight)
3838
if highlight ~= nil then
3939
sign_highlight = colors.combine(highlight, sign_highlight)
4040
end
41-
self.marks:add(false, self.info.start_row, self.info.start_col, {
41+
self.marks:add('sign', self.info.start_row, self.info.start_col, {
4242
sign_text = text,
4343
sign_hl_group = sign_highlight,
4444
})

Diff for: ‎lua/render-markdown/render/checkbox.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ end
4646
function Render:icon()
4747
local icon = self.checkbox.icon
4848
local text = self.inline and icon or str.pad_to(self.info.text, icon) .. icon
49-
self.marks:add(true, self.info.start_row, self.info.start_col, {
49+
self.marks:add('check_icon', self.info.start_row, self.info.start_col, {
5050
end_row = self.info.end_row,
5151
end_col = self.info.end_col,
5252
virt_text = { { text, self.checkbox.highlight } },
@@ -65,7 +65,7 @@ function Render:highlight_scope()
6565
if paragraph == nil then
6666
return
6767
end
68-
self.marks:add(true, paragraph.start_row, paragraph.start_col, {
68+
self.marks:add('check_scope', paragraph.start_row, paragraph.start_col, {
6969
end_row = paragraph.end_row,
7070
end_col = paragraph.end_col,
7171
hl_group = highlight,

Diff for: ‎lua/render-markdown/render/code.lua

+5-5
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ function Render:language(add_background)
125125
local padding = str.spaces('start', self.info.text) + self.data.language_padding
126126
icon_text = str.pad(padding) .. icon_text .. info.text
127127
end
128-
return self.marks:add(true, info.start_row, info.start_col, {
128+
return self.marks:add('code_language', info.start_row, info.start_col, {
129129
virt_text = { { icon_text, highlight } },
130130
virt_text_pos = 'inline',
131131
})
@@ -137,7 +137,7 @@ function Render:language(add_background)
137137
if self.code.width == 'block' then
138138
win_col = win_col - str.width(icon_text) + self.data.indent
139139
end
140-
return self.marks:add(true, info.start_row, 0, {
140+
return self.marks:add('code_language', info.start_row, 0, {
141141
virt_text = { { icon_text, highlight } },
142142
virt_text_win_col = win_col,
143143
})
@@ -160,7 +160,7 @@ function Render:background(icon_added)
160160
table.insert(virt_text, { str.pad(self.data.margin), self.config.padding.highlight })
161161
end
162162
table.insert(virt_text, { icon:rep(width - self.data.col), colors.bg_to_fg(self.code.highlight) })
163-
self.marks:add(true, row, self.data.col, {
163+
self.marks:add('code_border', row, self.data.col, {
164164
virt_text = virt_text,
165165
virt_text_pos = 'overlay',
166166
})
@@ -181,14 +181,14 @@ function Render:background(icon_added)
181181
table.insert(padding, { str.pad(vim.o.columns * 2), self.config.padding.highlight })
182182
end
183183
for row = self.data.start_row, self.data.end_row - 1 do
184-
self.marks:add(false, row, self.data.col, {
184+
self.marks:add('code_background', row, self.data.col, {
185185
end_row = row + 1,
186186
hl_group = self.code.highlight,
187187
hl_eol = true,
188188
})
189189
if win_col > 0 and #padding > 0 then
190190
-- Overwrite anything beyond width with padding highlight
191-
self.marks:add(false, row, self.data.col, {
191+
self.marks:add('code_background', row, self.data.col, {
192192
priority = 0,
193193
virt_text = padding,
194194
virt_text_win_col = win_col,

Diff for: ‎lua/render-markdown/render/code_inline.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function Render:setup()
2424
end
2525

2626
function Render:render()
27-
self.marks:add(true, self.info.start_row, self.info.start_col, {
27+
self.marks:add('code_background', self.info.start_row, self.info.start_col, {
2828
end_row = self.info.end_row,
2929
end_col = self.info.end_col,
3030
hl_group = self.code.highlight_inline,

Diff for: ‎lua/render-markdown/render/dash.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ function Render:render()
2929
local virt_text = { self.dash.icon:rep(width), self.dash.highlight }
3030

3131
local start_row, end_row = self.info.start_row, self.info.end_row - 1
32-
self.marks:add(true, start_row, 0, {
32+
self.marks:add('dash', start_row, 0, {
3333
virt_text = { virt_text },
3434
virt_text_pos = 'overlay',
3535
})
3636
if end_row > start_row then
37-
self.marks:add(true, end_row, 0, {
37+
self.marks:add('dash', end_row, 0, {
3838
virt_text = { virt_text },
3939
virt_text_pos = 'overlay',
4040
})

Diff for: ‎lua/render-markdown/render/heading.lua

+7-7
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ function Render:icon()
9999
local added = true
100100
for row = self.info.start_row, self.data.end_row - 1 do
101101
added = added
102-
and self.marks:add(true, row, self.info.start_col, {
102+
and self.marks:add('head_icon', row, self.info.start_col, {
103103
end_row = row,
104104
end_col = self.info.end_col,
105105
virt_text = { { row == self.info.start_row and icon or str.pad(str.width(icon)), highlight } },
@@ -119,7 +119,7 @@ function Render:icon()
119119

120120
local padding = width - str.width(icon)
121121
if self.heading.position == 'inline' or padding < 0 then
122-
local added = self.marks:add(true, self.info.start_row, self.info.start_col, {
122+
local added = self.marks:add('head_icon', self.info.start_row, self.info.start_col, {
123123
end_row = self.info.end_row,
124124
end_col = self.info.end_col,
125125
virt_text = { { icon, highlight } },
@@ -128,7 +128,7 @@ function Render:icon()
128128
})
129129
return added and str.width(icon) + 1 or width
130130
else
131-
self.marks:add(true, self.info.start_row, self.info.start_col, {
131+
self.marks:add('head_icon', self.info.start_row, self.info.start_col, {
132132
end_row = self.info.end_row,
133133
end_col = self.info.end_col,
134134
virt_text = { { str.pad(padding) .. icon, highlight } },
@@ -173,14 +173,14 @@ function Render:background(width)
173173
table.insert(padding, { str.pad(vim.o.columns * 2), self.config.padding.highlight })
174174
end
175175
for row = self.info.start_row, self.data.end_row - 1 do
176-
self.marks:add(true, row, 0, {
176+
self.marks:add('head_background', row, 0, {
177177
end_row = row + 1,
178178
hl_group = highlight,
179179
hl_eol = true,
180180
})
181181
if win_col > 0 and #padding > 0 then
182182
-- Overwrite anything beyond width with padding highlight
183-
self.marks:add(true, row, 0, {
183+
self.marks:add('head_background', row, 0, {
184184
priority = 0,
185185
virt_text = padding,
186186
virt_text_win_col = win_col,
@@ -225,7 +225,7 @@ function Render:border(width)
225225

226226
local line_above = line(self.heading.above)
227227
if not virtual and self:empty_line('above') and self.info.start_row - 1 ~= self.context.last_heading then
228-
self.marks:add(true, self.info.start_row - 1, 0, {
228+
self.marks:add('head_border', self.info.start_row - 1, 0, {
229229
virt_text = line_above,
230230
virt_text_pos = 'overlay',
231231
})
@@ -238,7 +238,7 @@ function Render:border(width)
238238

239239
local line_below = line(self.heading.below)
240240
if not virtual and self:empty_line('below') then
241-
self.marks:add(true, self.info.end_row + 1, 0, {
241+
self.marks:add('head_border', self.info.end_row + 1, 0, {
242242
virt_text = line_below,
243243
virt_text_pos = 'overlay',
244244
})

Diff for: ‎lua/render-markdown/render/link.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ function Render:setup()
4646
end
4747

4848
function Render:render()
49-
local added = self.marks:add(true, self.info.start_row, self.info.start_col, {
49+
local added = self.marks:add('link', self.info.start_row, self.info.start_col, {
5050
end_row = self.info.end_row,
5151
end_col = self.info.end_col,
5252
virt_text = { { self.data.text, self.data.highlight } },

Diff for: ‎lua/render-markdown/render/list_marker.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ end
6363

6464
---@private
6565
function Render:hide_marker()
66-
self.marks:add(true, self.info.start_row, self.info.start_col + self.leading_spaces, {
66+
self.marks:add('check_icon', self.info.start_row, self.info.start_col + self.leading_spaces, {
6767
end_row = self.info.end_row,
6868
end_col = self.info.end_col,
6969
conceal = '',
@@ -77,7 +77,7 @@ function Render:icon(level)
7777
if icon == nil then
7878
return
7979
end
80-
self.marks:add(true, self.info.start_row, self.info.start_col, {
80+
self.marks:add('bullet', self.info.start_row, self.info.start_col, {
8181
end_row = self.info.end_row,
8282
end_col = self.info.end_col,
8383
virt_text = { { str.pad(self.leading_spaces) .. icon, self.bullet.highlight } },

Diff for: ‎lua/render-markdown/render/quote.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ end
5858
---@private
5959
---@param info render.md.NodeInfo
6060
function Render:quote_marker(info)
61-
self.marks:add(true, info.start_row, info.start_col, {
61+
self.marks:add('quote', info.start_row, info.start_col, {
6262
end_row = info.end_row,
6363
end_col = info.end_col,
6464
virt_text = { { info.text:gsub('>', self.data.icon), self.data.highlight } },

Diff for: ‎lua/render-markdown/render/shortcut.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ function Render:callout(callout)
4747
end
4848

4949
local text, conceal = self:callout_title(callout)
50-
local added = self.marks:add(true, self.info.start_row, self.info.start_col, {
50+
local added = self.marks:add('callout', self.info.start_row, self.info.start_col, {
5151
end_row = self.info.end_row,
5252
end_col = self.info.end_col,
5353
virt_text = { { text, callout.highlight } },
@@ -86,7 +86,7 @@ function Render:checkbox(checkbox)
8686

8787
local inline = self.config.checkbox.position == 'inline'
8888
local icon, highlight = checkbox.rendered, checkbox.highlight
89-
local added = self.marks:add(true, self.info.start_row, self.info.start_col, {
89+
local added = self.marks:add('check_icon', self.info.start_row, self.info.start_col, {
9090
end_row = self.info.end_row,
9191
end_col = self.info.end_col,
9292
virt_text = { { inline and icon or str.pad_to(self.info.text, icon) .. icon, highlight } },
@@ -112,7 +112,7 @@ function Render:wiki_link()
112112
icon, highlight = link_component.icon, link_component.highlight
113113
end
114114
local link_text = icon .. parts[#parts]
115-
local added = self.marks:add(true, self.info.start_row, self.info.start_col - 1, {
115+
local added = self.marks:add('link', self.info.start_row, self.info.start_col - 1, {
116116
end_row = self.info.end_row,
117117
end_col = self.info.end_col + 1,
118118
virt_text = { { link_text, highlight } },

Diff for: ‎lua/render-markdown/render/table.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ function Render:delimiter()
221221
text = text .. border[4] .. table.concat(sections, border[5]) .. border[6]
222222
text = text .. str.pad_to(delim.info.text, text)
223223

224-
self.marks:add(true, delim.info.start_row, delim.info.start_col, {
224+
self.marks:add('table_border', delim.info.start_row, delim.info.start_col, {
225225
end_row = delim.info.end_row,
226226
end_col = delim.info.end_col,
227227
virt_text = { { text, self.table.head } },
@@ -237,7 +237,7 @@ function Render:row(row)
237237

238238
if vim.tbl_contains({ 'trimmed', 'padded', 'raw' }, self.table.cell) then
239239
for _, pipe in ipairs(row.pipes) do
240-
self.marks:add(true, pipe.start_row, pipe.start_col, {
240+
self.marks:add('table_border', pipe.start_row, pipe.start_col, {
241241
end_row = pipe.end_row,
242242
end_col = pipe.end_col,
243243
virt_text = { { border[10], highlight } },
@@ -267,7 +267,7 @@ function Render:row(row)
267267
end
268268

269269
if self.table.cell == 'overlay' then
270-
self.marks:add(true, row.info.start_row, row.info.start_col, {
270+
self.marks:add('table_border', row.info.start_row, row.info.start_col, {
271271
end_row = row.info.end_row,
272272
end_col = row.info.end_col,
273273
virt_text = { { row.info.text:gsub('|', border[10]), highlight } },

Diff for: ‎lua/render-markdown/state.lua

+11-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,17 @@ function M.validate()
136136
return validator:spec(config, nilable, key, path)
137137
end
138138

139-
get_spec('anti_conceal'):type('enabled', 'boolean'):type({ 'above', 'below' }, 'number'):check()
139+
get_spec('anti_conceal')
140+
:type('enabled', 'boolean')
141+
:type({ 'above', 'below' }, 'number')
142+
:type('ignore', 'table')
143+
:check()
144+
get_spec({ 'anti_conceal', 'ignore' })
145+
:type({ 'head_icon', 'head_background', 'head_border' }, { 'boolean', 'nil' })
146+
:type({ 'code_language', 'code_background', 'code_border' }, { 'boolean', 'nil' })
147+
:type({ 'dash', 'bullet', 'check_icon', 'check_scope' }, { 'boolean', 'nil' })
148+
:type({ 'quote', 'table_border', 'callout', 'link', 'sign' }, { 'boolean', 'nil' })
149+
:check()
140150

141151
get_spec('padding'):type('highlight', 'string'):check()
142152

Diff for: ‎lua/render-markdown/types.lua

+1
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149

150150
---@class (exact) render.md.AntiConceal
151151
---@field public enabled boolean
152+
---@field public ignore table<render.md.Element, boolean>
152153
---@field public above integer
153154
---@field public below integer
154155

2 commit comments

Comments
 (2)

hneutr commented on Oct 14, 2024

@hneutr

Dude, you are so awesome, I am so appreciative of the work you put into this plugin. Updated my plugins today and perused the change notes and saw this one — had thought about making an issue and you beat me to it. 👏👏👏

MeanderingProgrammer commented on Oct 15, 2024

@MeanderingProgrammer
OwnerAuthor

Thank you for the kind words, glad you're still enjoying the plugin :)

Please sign in to comment.