feat(client): conceal colour spans down to their coloured text
A :VimwikiColorize'd word showed the literal `<span style="color:NAME">TEXT</span>` markup. Now the tags are concealed and TEXT is painted in NAME, so the buffer shows just the coloured word — matching the HTML export. New autoload/nuwiki/colors.vim: nuwiki#colors#refresh() scans the buffer and, per distinct colour, defines a syntax region that conceals the `<span …>` / `</span>` tags (concealends) and highlights the body with the span's actual colour (guifg always; ctermfg for named colours). Idempotent (clears the group before redefining) and tracked in b:nuwiki_color_seen. Refresh is driven from three places so it's both correct and immediate: - syntax/vimwiki.vim: initial pass + re-establish after :colorscheme reload (resets the per-buffer cache since :syntax clear drops the regions); - ftplugin TextChanged/InsertLeave autocmd for spans that arrive via paste/ undo/external edits; - colorize() itself calls refresh() right after wrapping, so a freshly colorized word conceals instantly (TextChanged doesn't fire reliably mid command / in headless ex-mode). The LSP @vimwikiColor token no longer links to Constant, so in Neovim it doesn't override the real per-span colour on the concealed text. Pure syntax + :highlight — works identically in Vim, coc.nvim, and Neovim, no LSP needed. Tests: colorize.conceal_hides_tags_shows_text (both harnesses) and colorize.command_conceals_immediately (vim). Sample wiki's colorize section notes the conceal. nvim 269, vim 259+18, config-parity green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -773,6 +773,22 @@ vim.defer_fn(function()
|
||||
error('ranged command did not wrap selection: ' .. got)
|
||||
end
|
||||
end)
|
||||
-- Colour spans are concealed down to their coloured text. Put the span on a
|
||||
-- non-cursor line so concealcursor (=c) doesn't reveal it, then refresh.
|
||||
tobj_case('colorize.conceal_hides_tags_shows_text', function()
|
||||
set_buf({ 'plain line', '<span style="color:red">word</span> tail' })
|
||||
vim.api.nvim_win_set_cursor(0, { 1, 0 })
|
||||
vim.fn['nuwiki#colors#refresh']()
|
||||
local l = vim.fn.getline(2)
|
||||
local wcol = (l:find('word')) -- 1-based
|
||||
local open = vim.fn.synconcealed(2, 1)[1]
|
||||
local close = vim.fn.synconcealed(2, (l:find('</span>')))[1]
|
||||
local word = vim.fn.synconcealed(2, wcol)[1]
|
||||
local grp = vim.fn.synIDattr(vim.fn.synID(2, wcol, 1), 'name')
|
||||
if not (open == 1 and close == 1 and word == 0 and grp == 'nuwikiColorSpan_red') then
|
||||
error(string.format('open=%s close=%s word=%s grp=%s', open, close, word, grp))
|
||||
end
|
||||
end)
|
||||
|
||||
-- ===== Wiki picker (config-driven, no LSP) =====
|
||||
-- The picker must build its list from config so it works from any buffer
|
||||
|
||||
Reference in New Issue
Block a user