Skip to content

Commit 0944ba0

Browse files
fix: correctly order indent & padding
## Details Issue: #457 Indent extmarks and padding extmarks were both placed with priority 0, this means if they were both put at the same row and column the order they were rendered was non-deterministic. This would sometimes result in the padding extmark going before the indent extmark, which is incorrect. To fix this set the priority of padding to 100 and keep indent marks at priority 0. This way the padding is added first, and then the indent, which means the indent moves the padding over.
1 parent 95bc2ec commit 0944ba0

File tree

9 files changed

+65
-69
lines changed

9 files changed

+65
-69
lines changed

doc/render-markdown.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*render-markdown.txt* For NVIM v0.11.2 Last change: 2025 June 20
1+
*render-markdown.txt* For NVIM v0.11.2 Last change: 2025 June 21
22

33
==============================================================================
44
Table of Contents *render-markdown-table-of-contents*

lua/render-markdown/health.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ local state = require('render-markdown.state')
55
local M = {}
66

77
---@private
8-
M.version = '8.5.8'
8+
M.version = '8.5.9'
99

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

lua/render-markdown/render/markdown/bullet.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,14 @@ function Render:padding()
119119
local right = row == start_row and self.data.marker.end_col - 1 or left
120120
if #left_line > 0 then
121121
self.marks:add(false, row, left, {
122-
priority = 0,
122+
priority = 100,
123123
virt_text = left_line,
124124
virt_text_pos = 'inline',
125125
})
126126
end
127127
if #right_line > 0 then
128128
self.marks:add(false, row, right, {
129-
priority = 0,
129+
priority = 100,
130130
virt_text = right_line,
131131
virt_text_pos = 'inline',
132132
})

lua/render-markdown/render/markdown/code.lua

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,7 @@ function Render:padding(background)
243243
if #empty == 0 and self.data.margin <= 0 and self.data.padding <= 0 then
244244
return
245245
end
246-
247-
-- 0 | low | includes other marks in padding when code block is at edge
248-
-- 1000 | medium | includes border marks while likely avoiding other plugins
249-
local priority = col == 0 and 0 or 1000
250246
local highlight = background and self.config.highlight or nil
251-
252247
for row = start_row, end_row do
253248
local line = self:line()
254249
if vim.tbl_contains(empty, row) then
@@ -260,7 +255,7 @@ function Render:padding(background)
260255
end
261256
if not line:empty() then
262257
self.marks:add(false, row, col, {
263-
priority = priority,
258+
priority = 100,
264259
virt_text = line:get(),
265260
virt_text_pos = 'inline',
266261
})

lua/render-markdown/render/markdown/heading.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ function Render:padding(box)
244244
end
245245
for row = self.node.start_row, self.node.end_row - 1 do
246246
self.marks:add(false, row, 0, {
247-
priority = 0,
247+
priority = 100,
248248
virt_text = line:get(),
249249
virt_text_pos = 'inline',
250250
})

lua/render-markdown/render/markdown/paragraph.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function Render:padding(start_row, end_row, amount)
5959
end
6060
for row = start_row, end_row do
6161
self.marks:add(false, row, 0, {
62-
priority = 0,
62+
priority = 100,
6363
virt_text = line,
6464
virt_text_pos = 'inline',
6565
})

tests/code_spec.lua

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ describe('code', function()
6161
marks:add(row:get(0, 0), { 2, 5 }, util.conceal())
6262
marks:add(row:get(0, 0), { 5, 7 }, util.conceal())
6363
marks:add(row:get(1, 1), { 2, 0 }, util.code.bg())
64-
marks:add(row:get(0), 0, util.padding(2, 1000))
64+
marks:add(row:get(0), 0, util.padding(2))
6565
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
6666
marks:add(row:get(0, 1), { 2, 0 }, util.code.bg())
6767
marks:add(row:get(0, 0), { 2, 5 }, util.conceal())
@@ -131,13 +131,13 @@ describe('code', function()
131131
marks:add(row:get(0), 0, util.code.border('', false, 'rust', b1))
132132
marks:add(row:get(0, 0), { 0, 3 }, util.conceal())
133133
marks:add(row:get(0, 0), { 3, 7 }, util.conceal())
134-
marks:add(row:get(1), 0, util.padding(2, 0, 'RmCode'))
134+
marks:add(row:get(1), 0, util.code.padding('block', 2))
135135
marks:add(row:get(0), 0, util.code.hide(w1))
136136
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
137-
marks:add(row:get(0), 0, util.padding(2, 0, 'RmCode'))
137+
marks:add(row:get(0), 0, util.code.padding('block', 2))
138138
marks:add(row:get(0), 0, util.code.hide(w1))
139139
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
140-
marks:add(row:get(0), 0, util.padding(2, 0, 'RmCode'))
140+
marks:add(row:get(0), 0, util.code.padding('block', 2))
141141
marks:add(row:get(0), 0, util.code.hide(w1))
142142
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
143143
marks:add(row:get(0), 0, util.code.border('', false, w1))
@@ -151,17 +151,17 @@ describe('code', function()
151151
marks:add(row:get(0), 2, util.code.border('', false, 'py', b2))
152152
marks:add(row:get(0, 0), { 2, 5 }, util.conceal())
153153
marks:add(row:get(0, 0), { 5, 7 }, util.conceal())
154-
marks:add(row:get(1), 2, util.padding(2, 1000, 'RmCode'))
154+
marks:add(row:get(1), 2, util.code.padding('block', 2))
155155
marks:add(row:get(0), 2, util.code.hide(w2))
156156
marks:add(row:get(0, 1), { 2, 0 }, util.code.bg())
157157
marks:add(row:get(0), 0, {
158-
priority = 1000,
158+
priority = 100,
159159
virt_text = { { ' ', 'Normal' }, { ' ', 'RmCode' } },
160160
virt_text_pos = 'inline',
161161
})
162162
marks:add(row:get(0), 0, util.code.hide(w2))
163163
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
164-
marks:add(row:get(0), 2, util.padding(2, 1000, 'RmCode'))
164+
marks:add(row:get(0), 2, util.code.padding('block', 2))
165165
marks:add(row:get(0), 2, util.code.hide(w2))
166166
marks:add(row:get(0, 1), { 2, 0 }, util.code.bg())
167167
marks:add(row:get(0), 2, util.code.border('', false, w2 - 2))
@@ -173,13 +173,13 @@ describe('code', function()
173173
marks:add(row:get(0), 0, util.code.border('', false, 2, 'lua', b3))
174174
marks:add(row:get(0, 0), { 0, 5 }, util.conceal())
175175
marks:add(row:get(0, 0), { 5, 8 }, util.conceal())
176-
marks:add(row:get(1), 0, util.padding(2, 0, 'RmCode'))
176+
marks:add(row:get(1), 0, util.code.padding('block', 2))
177177
marks:add(row:get(0), 0, util.code.hide(w3))
178178
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
179-
marks:add(row:get(0), 0, util.padding(2, 0, 'RmCode'))
179+
marks:add(row:get(0), 0, util.code.padding('block', 2))
180180
marks:add(row:get(0), 0, util.code.hide(w3))
181181
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
182-
marks:add(row:get(0), 0, util.padding(2, 0, 'RmCode'))
182+
marks:add(row:get(0), 0, util.code.padding('block', 2))
183183
marks:add(row:get(0), 0, util.code.hide(w3))
184184
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
185185
marks:add(row:get(0), 0, util.code.border('', false, w3))
@@ -190,7 +190,7 @@ describe('code', function()
190190
local w4 = width[4] + (2 * tab) -- left + right padding (to nearest tab)
191191
marks:add(row:get(2), 0, util.code.border('', false, w4))
192192
marks:add(row:get(0, 0), { 0, 3 }, util.conceal())
193-
marks:add(row:get(1), 0, util.padding(tab, 0, 'RmCode'))
193+
marks:add(row:get(1), 0, util.code.padding('block', tab))
194194
marks:add(row:get(0), 0, util.code.hide(w4))
195195
marks:add(row:get(0, 1), { 0, 0 }, util.code.bg())
196196
marks:add(row:get(0), 0, util.code.border('', false, w4))

tests/list_table_spec.lua

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,8 @@ describe('list_table.md', function()
2828
marks:add(row:get(0, 0), { 0, 1 }, util.heading.icon(1))
2929
marks:add(row:get(0, 1), { 0, 0 }, util.heading.bg(1))
3030

31-
marks:add(row:get(1, 0), { 0, 3 }, {
32-
virt_text = { { '1.', 'RmBullet' } },
33-
virt_text_pos = 'overlay',
34-
})
35-
marks:add(row:get(1, 0), { 0, 3 }, {
36-
virt_text = { { '2.', 'RmBullet' } },
37-
virt_text_pos = 'overlay',
38-
})
31+
marks:add(row:get(1, 0), { 0, 3 }, util.ordered(1))
32+
marks:add(row:get(1, 0), { 0, 3 }, util.ordered(2))
3933

4034
marks:add(row:get(2), 0, util.heading.sign(1))
4135
marks:add(row:get(0, 0), { 0, 1 }, util.heading.icon(1))
@@ -117,52 +111,46 @@ describe('list_table.md', function()
117111
marks:add(row:get(0, 0), { 0, 1 }, util.heading.icon(1))
118112
marks:add(row:get(0, 1), { 0, 0 }, util.heading.bg(1))
119113

120-
marks:add(row:get(1), 0, util.padding(2, 0))
114+
marks:add(row:get(1), 0, util.padding(2))
121115
marks:add(row:get(0, 0), { 0, 2 }, util.bullet(1))
122-
marks:add(row:get(0), 1, util.padding(2, 0))
116+
marks:add(row:get(0), 1, util.padding(2))
123117
marks:add(row:get(0), 20, util.link('web'))
124-
marks:add(row:get(1), 0, util.padding(2, 0))
118+
marks:add(row:get(1), 0, util.padding(2))
125119
marks:add(row:get(0, 0), { 0, 2 }, util.bullet(1))
126-
marks:add(row:get(0), 1, util.padding(2, 0))
127-
marks:add(row:get(0), 20, util.code.padding(2))
120+
marks:add(row:get(0), 1, util.padding(2))
121+
marks:add(row:get(0), 20, util.code.padding('inline', 2))
128122
marks:add(row:get(0, 0), { 20, 28 }, util.highlight('code'))
129-
marks:add(row:get(0), 28, util.code.padding(2))
130-
marks:add(row:get(1), 0, util.padding(2, 0))
123+
marks:add(row:get(0), 28, util.code.padding('inline', 2))
124+
marks:add(row:get(1), 0, util.padding(2))
131125
marks:add(row:get(0, 0), { 2, 6 }, util.bullet(2, 2))
132-
marks:add(row:get(0), 5, util.padding(2, 0))
133-
marks:add(row:get(1), 0, util.padding(2, 0))
126+
marks:add(row:get(0), 5, util.padding(2))
127+
marks:add(row:get(1), 0, util.padding(2))
134128
marks:add(row:get(0, 0), { 4, 6 }, util.bullet(2))
135-
marks:add(row:get(0), 5, util.padding(2, 0))
136-
marks:add(row:get(1), 0, util.padding(2, 0))
129+
marks:add(row:get(0), 5, util.padding(2))
130+
marks:add(row:get(1), 0, util.padding(2))
137131
marks:add(row:get(0, 0), { 6, 8 }, util.bullet(3))
138-
marks:add(row:get(0), 7, util.padding(2, 0))
139-
marks:add(row:get(1), 0, util.padding(2, 0))
132+
marks:add(row:get(0), 7, util.padding(2))
133+
marks:add(row:get(1), 0, util.padding(2))
140134
marks:add(row:get(0, 0), { 8, 10 }, util.bullet(4))
141-
marks:add(row:get(0), 9, util.padding(2, 0))
142-
marks:add(row:get(1), 0, util.padding(2, 0))
135+
marks:add(row:get(0), 9, util.padding(2))
136+
marks:add(row:get(1), 0, util.padding(2))
143137
marks:add(row:get(0, 0), { 10, 12 }, util.bullet(1))
144-
marks:add(row:get(0), 11, util.padding(2, 0))
145-
marks:add(row:get(1), 0, util.padding(2, 0))
138+
marks:add(row:get(0), 11, util.padding(2))
139+
marks:add(row:get(1), 0, util.padding(2))
146140
marks:add(row:get(0, 0), { 0, 2 }, util.bullet(1))
147-
marks:add(row:get(0), 1, util.padding(2, 0))
141+
marks:add(row:get(0), 1, util.padding(2))
148142
marks:add(row:get(0), 20, util.link('link'))
149143

150144
marks:add(row:get(2), 0, util.heading.sign(1))
151145
marks:add(row:get(0, 0), { 0, 1 }, util.heading.icon(1))
152146
marks:add(row:get(0, 1), { 0, 0 }, util.heading.bg(1))
153147

154-
marks:add(row:get(1), 0, util.padding(2, 0))
155-
marks:add(row:get(0, 0), { 0, 3 }, {
156-
virt_text = { { '1.', 'RmBullet' } },
157-
virt_text_pos = 'overlay',
158-
})
159-
marks:add(row:get(0), 2, util.padding(2, 0))
160-
marks:add(row:get(1), 0, util.padding(2, 0))
161-
marks:add(row:get(0, 0), { 0, 3 }, {
162-
virt_text = { { '2.', 'RmBullet' } },
163-
virt_text_pos = 'overlay',
164-
})
165-
marks:add(row:get(0), 2, util.padding(2, 0))
148+
marks:add(row:get(1), 0, util.padding(2))
149+
marks:add(row:get(0, 0), { 0, 3 }, util.ordered(1))
150+
marks:add(row:get(0), 2, util.padding(2))
151+
marks:add(row:get(1), 0, util.padding(2))
152+
marks:add(row:get(0, 0), { 0, 3 }, util.ordered(2))
153+
marks:add(row:get(0), 2, util.padding(2))
166154

167155
marks:add(row:get(2), 0, util.heading.sign(1))
168156
marks:add(row:get(0, 0), { 0, 1 }, util.heading.icon(1))
@@ -175,9 +163,9 @@ describe('list_table.md', function()
175163
}
176164
marks:add(row:get(0), 0, sections[1])
177165
marks:add(row:get(1, 0), { 0, 1 }, util.table.pipe(true))
178-
marks:add(row:get(0), 2, util.code.padding(2))
166+
marks:add(row:get(0), 2, util.code.padding('inline', 2))
179167
marks:add(row:get(0, 0), { 2, 8 }, util.highlight('code'))
180-
marks:add(row:get(0), 8, util.code.padding(2))
168+
marks:add(row:get(0), 8, util.code.padding('inline', 2))
181169
marks:add(row:get(0, 0), { 9, 10 }, util.table.pipe(true))
182170
marks:add(row:get(0), 11, util.table.padding(3))
183171
marks:add(row:get(0, 0), { 24, 25 }, util.conceal())
@@ -186,9 +174,9 @@ describe('list_table.md', function()
186174
marks:add(row:get(0, 0), { 40, 41 }, util.table.pipe(true))
187175
marks:add(row:get(1, 0), { 0, 41 }, sections[2])
188176
marks:add(row:get(1, 0), { 0, 1 }, util.table.pipe(false))
189-
marks:add(row:get(0), 2, util.code.padding(2))
177+
marks:add(row:get(0), 2, util.code.padding('inline', 2))
190178
marks:add(row:get(0, 0), { 2, 8 }, util.highlight('code'))
191-
marks:add(row:get(0), 8, util.code.padding(2))
179+
marks:add(row:get(0), 8, util.code.padding('inline', 2))
192180
marks:add(row:get(0, 0), { 9, 10 }, util.table.pipe(false))
193181
marks:add(row:get(0), 11, util.table.padding(4))
194182
marks:add(row:get(0, 0), { 25, 26 }, util.table.pipe(false))

tests/util.lua

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,16 @@ function M.bullet(level, spaces)
103103
}
104104
end
105105

106+
---@param level integer
107+
---@return vim.api.keyset.set_extmark
108+
function M.ordered(level)
109+
---@type vim.api.keyset.set_extmark
110+
return {
111+
virt_text = { { ('%d.'):format(level), 'RmBullet' } },
112+
virt_text_pos = 'overlay',
113+
}
114+
end
115+
106116
---@param kind 'email'|'git'|'image'|'link'|'web'|'wiki'|'youtube'
107117
---@return vim.api.keyset.set_extmark
108118
function M.link(kind)
@@ -135,13 +145,13 @@ function M.quote(highlight)
135145
end
136146

137147
---@param spaces integer
138-
---@param priority integer
148+
---@param priority? integer
139149
---@param highlight? string
140150
---@return vim.api.keyset.set_extmark
141151
function M.padding(spaces, priority, highlight)
142152
---@type vim.api.keyset.set_extmark
143153
return {
144-
priority = priority,
154+
priority = priority or 100,
145155
virt_text = { { (' '):rep(spaces), highlight or 'Normal' } },
146156
virt_text_pos = 'inline',
147157
}
@@ -313,10 +323,13 @@ function M.code.hide(width)
313323
}
314324
end
315325

326+
---@param kind 'block'|'inline'
316327
---@param spaces integer
317328
---@return vim.api.keyset.set_extmark
318-
function M.code.padding(spaces)
319-
return M.padding(spaces, 0, 'RmCodeInline')
329+
function M.code.padding(kind, spaces)
330+
local priority = kind == 'inline' and 0 or nil
331+
local highlight = kind == 'inline' and 'RmCodeInline' or 'RmCode'
332+
return M.padding(spaces, priority, highlight)
320333
end
321334

322335
---@class render.md.test.Table

0 commit comments

Comments
 (0)