diff --git a/ftdetect/nuwiki.vim b/ftdetect/nuwiki.vim index b858a8c..5f22638 100644 --- a/ftdetect/nuwiki.vim +++ b/ftdetect/nuwiki.vim @@ -3,5 +3,10 @@ " Users who configure a custom `file_extension` in setup() should add their " own `:autocmd BufRead,BufNewFile *.myext setfiletype vimwiki` mapping; " we hardcode `.wiki` since ftdetect runs before any user setup() call. +" +" Use `set filetype=…` (not `setfiletype`) so we override Neovim's bundled +" `*.wiki → mediawiki` rule. Users who actually want MediaWiki on .wiki +" can override this with their own autocmd at a later runtimepath entry, +" or with `vim.filetype.add` in Neovim. -autocmd! BufRead,BufNewFile *.wiki setfiletype vimwiki +autocmd! BufRead,BufNewFile *.wiki set filetype=vimwiki diff --git a/ftplugin/nuwiki.vim b/ftplugin/vimwiki.vim similarity index 100% rename from ftplugin/nuwiki.vim rename to ftplugin/vimwiki.vim diff --git a/lua/nuwiki/ftplugin.lua b/lua/nuwiki/ftplugin.lua index 1b1ab9c..805d706 100644 --- a/lua/nuwiki/ftplugin.lua +++ b/lua/nuwiki/ftplugin.lua @@ -9,34 +9,33 @@ local function setup_folding(bufnr, folding_mode) if folding_mode == 'off' then return end - if folding_mode == 'expr' then - vim.api.nvim_set_option_value('foldmethod', 'expr', { buf = bufnr }) - vim.api.nvim_set_option_value( - 'foldexpr', - 'v:lua.require("nuwiki.folding").expr()', - { buf = bufnr } - ) - vim.api.nvim_set_option_value( - 'foldtext', - 'v:lua.require("nuwiki.folding").foldtext()', - { buf = bufnr } - ) - return - end - -- folding_mode == 'lsp' (default): rely on the server's - -- `foldingRange` capability. Neovim 0.11+ enables it automatically - -- via `vim.lsp.foldexpr`. Older versions get the regex fallback. - if vim.fn.has('nvim-0.11') == 1 and vim.lsp.foldexpr then - vim.api.nvim_set_option_value('foldmethod', 'expr', { buf = bufnr }) - vim.api.nvim_set_option_value( - 'foldexpr', - 'v:lua.vim.lsp.foldexpr()', - { buf = bufnr } - ) - else - -- Pre-0.11 — degrade to the regex fallback so users still get folds. - setup_folding(bufnr, 'expr') + -- `foldmethod` / `foldexpr` / `foldtext` are window-local options. + -- The ftplugin runs during BufRead → FileType, by which time the + -- buffer is displayed in the current window. `vim.opt_local` writes + -- to the current window's view of the option. + local apply = function() + if folding_mode == 'expr' + or not (vim.fn.has('nvim-0.11') == 1 and vim.lsp.foldexpr) + then + vim.opt_local.foldmethod = 'expr' + vim.opt_local.foldexpr = 'v:lua.require("nuwiki.folding").expr()' + vim.opt_local.foldtext = 'v:lua.require("nuwiki.folding").foldtext()' + else + -- LSP-backed folding via Neovim 0.11+'s built-in foldexpr. + vim.opt_local.foldmethod = 'expr' + vim.opt_local.foldexpr = 'v:lua.vim.lsp.foldexpr()' + end end + + -- Set on the current window first (the one that triggered the + -- ftplugin). Also re-apply on any future split that views this + -- buffer, so `v` / `:split` preserves the fold method. + apply() + vim.api.nvim_create_autocmd('BufWinEnter', { + buffer = bufnr, + group = vim.api.nvim_create_augroup('nuwiki_folding_' .. bufnr, { clear = true }), + callback = apply, + }) end function M.attach(bufnr) diff --git a/lua/nuwiki/init.lua b/lua/nuwiki/init.lua index 556e2b8..d11cc32 100644 --- a/lua/nuwiki/init.lua +++ b/lua/nuwiki/init.lua @@ -15,6 +15,20 @@ local lsp = require('nuwiki.lsp') function M.setup(opts) config.apply(opts or {}) + + -- Neovim 0.7+ resolves filetypes via `vim.filetype.match` before any + -- `ftdetect/*.vim` autocmd fires, and its bundled rule for `*.wiki` + -- returns `mediawiki`. Register an authoritative rule here so this + -- plugin's filetype (vimwiki) wins. + if vim.filetype and vim.filetype.add then + local extensions = { wiki = 'vimwiki' } + local ext = (config.options.file_extension or '.wiki'):gsub('^%.', '') + if ext ~= 'wiki' and ext ~= '' then + extensions[ext] = 'vimwiki' + end + vim.filetype.add({ extension = extensions }) + end + lsp.register() end diff --git a/syntax/nuwiki.vim b/syntax/vimwiki.vim similarity index 100% rename from syntax/nuwiki.vim rename to syntax/vimwiki.vim