fix(ftplugin): load on .wiki buffers without manual filetype override
CI / cargo fmt --check (push) Successful in 35s
CI / cargo clippy (push) Successful in 1m12s
CI / cargo test (push) Successful in 1m26s

Three reasons the plugin wasn't activating on `nvim --clean -u init.lua
foo.wiki`:

1. **File-name mismatch.** Vim's filetype-plugin runtime looks for
   `ftplugin/<filetype>.vim` matching the *filetype name*. Our
   filetype is `vimwiki` (per `ftdetect`) but the file was named
   `ftplugin/nuwiki.vim` — so `:runtime! ftplugin/vimwiki.vim` from
   the built-in FileType autocmd never found it, and none of the
   `:Vimwiki*` / `:Nuwiki*` commands got defined. Same wart on the
   syntax side. Renamed:
   - `ftplugin/nuwiki.vim`  → `ftplugin/vimwiki.vim`
   - `syntax/nuwiki.vim`    → `syntax/vimwiki.vim`

2. **`setfiletype` deferred to Neovim's bundled rule.** Neovim ships
   a default `*.wiki → mediawiki` rule via `vim.filetype.add`, and
   `:setfiletype vimwiki` is a no-op once a filetype has been set.
   - `ftdetect/nuwiki.vim` now uses `set filetype=vimwiki` (force).
   - `lua/nuwiki/init.lua`'s `setup()` also calls
     `vim.filetype.add({ extension = { wiki = 'vimwiki', ... } })`
     so the modern table-based detection picks us before the
     bundled rule fires. Honours `config.options.file_extension`
     so a user with a custom extension gets covered automatically.

3. **`foldmethod`/`foldexpr` are window-local options.**
   `ftplugin.lua` was setting them with `nvim_set_option_value({ buf
   = bufnr })`, which threw `'buf' cannot be passed for window-local
   option 'foldmethod'` and aborted the rest of the per-buffer
   attach. Switched to `vim.opt_local.*` (window-aware), applied on
   the current window when the ftplugin fires, and re-applied via a
   `BufWinEnter` autocmd so `:split` / `:vsplit` keep the fold mode.

Verified end-to-end with:

  nvim --clean -u init.lua sample.wiki
  → filetype = vimwiki
  → :VimwikiTOC, :NuwikiIndex, … all defined
  → foldmethod = expr, foldexpr = v:lua.vim.lsp.foldexpr()
  → ftdetect, plugin, ftplugin, syntax all in :scriptnames

Total 377 tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 22:16:57 +00:00
parent cf94f99d3c
commit 09b9bd98a3
5 changed files with 46 additions and 28 deletions
+89
View File
@@ -0,0 +1,89 @@
" syntax/nuwiki.vim — default highlight groups for nuwiki.
"
" Two responsibilities:
" 1. Default `@vimwiki*` highlight groups for the LSP semantic tokens
" (SPEC §11 P7). Loaded eagerly so the very first hover/highlight
" cycle after server startup already has colours.
" 2. A small regex-based fallback so static highlighting works on
" buffers where the LSP isn't running yet.
if exists('b:current_syntax')
finish
endif
" ===== Semantic-token defaults (Neovim's TS-style @group names) =====
" Headings — level modifiers map to progressively softer accents.
highlight default link @vimwikiHeading Title
highlight default link @vimwikiHeading.level1 Title
highlight default link @vimwikiHeading.level2 Function
highlight default link @vimwikiHeading.level3 Identifier
highlight default link @vimwikiHeading.level4 Type
highlight default link @vimwikiHeading.level5 Constant
highlight default link @vimwikiHeading.level6 PreProc
highlight default link @vimwikiHeading.centered Title
" Inline text styling.
highlight default link @vimwikiBold markdownBold
highlight default link @vimwikiItalic markdownItalic
highlight default link @vimwikiBoldItalic markdownBoldItalic
highlight default link @vimwikiStrikethrough Comment
highlight default link @vimwikiSuperscript Number
highlight default link @vimwikiSubscript Number
" Code + math.
highlight default link @vimwikiCode String
highlight default link @vimwikiCodeBlock String
highlight default link @vimwikiMath Number
highlight default link @vimwikiMathBlock Number
" Links + transclusions.
highlight default link @vimwikiWikilink Underlined
highlight default link @vimwikiExternalLink Underlined
highlight default link @vimwikiUrl Underlined
highlight default link @vimwikiTransclusion Identifier
" Misc.
highlight default link @vimwikiKeyword Todo
highlight default link @vimwikiColor Constant
highlight default link @vimwikiComment Comment
highlight default link @vimwikiDefinitionTerm Statement
" ===== Static fallback (no LSP required) =====
syntax case match
syntax match nuwikiHeading /^\s*=\{1,6}\s.\{-}\s=\{1,6}\s*$/
syntax match nuwikiHorizontal /^-\{4,}\s*$/
syntax match nuwikiCommentLine /^%%.*$/
syntax region nuwikiCommentBlock start=/^%%+/ end=/+%%/ keepend
syntax region nuwikiPreformatted start=/^{{{/ end=/^}}}/ keepend
syntax region nuwikiMathBlock start=/^{{\$/ end=/^}}\$/ keepend
syntax match nuwikiPlaceholder /^%\(title\|nohtml\|template\|date\)\>.*$/
syntax match nuwikiBold /\*[^*]\+\*/
syntax match nuwikiItalic /\<_[^_]\+_\>/
syntax match nuwikiCode /`[^`]\+`/
syntax match nuwikiMathInline /\$[^$]\+\$/
syntax match nuwikiKeyword /\<\(TODO\|DONE\|STARTED\|FIXME\|FIXED\|XXX\)\>/
syntax region nuwikiWikilink start=/\[\[/ end=/\]\]/ keepend
syntax region nuwikiTransclusion start=/{{[^{]/ end=/}}/ keepend
syntax match nuwikiUrl /\<\(https\?\|ftp\|mailto\|file\):\/\?\/\?\S\+/
highlight default link nuwikiHeading Title
highlight default link nuwikiHorizontal Comment
highlight default link nuwikiCommentLine Comment
highlight default link nuwikiCommentBlock Comment
highlight default link nuwikiPreformatted String
highlight default link nuwikiMathBlock Number
highlight default link nuwikiPlaceholder PreProc
highlight default link nuwikiBold Bold
highlight default link nuwikiItalic Italic
highlight default link nuwikiCode String
highlight default link nuwikiMathInline Number
highlight default link nuwikiKeyword Todo
highlight default link nuwikiWikilink Underlined
highlight default link nuwikiTransclusion Identifier
highlight default link nuwikiUrl Underlined
let b:current_syntax = 'vimwiki'