Files
nuwiki/ftplugin/vimwiki.vim
T
gffranco ee0309b3c2 parity(1): vimwiki per-wiki config keys, table colspan/rowspan,
named link commands, mouse maps

Parity audit Cluster 1 — small wins.

WikiConfig (server) extended with 14 vimwiki globals:
- `index` (`g:vimwiki_index`), wired into `:VimwikiIndex` so users
  with a custom index page stem (e.g. `home`) get the right file.
- `diary_frequency`, `diary_start_week_day`, `diary_caption_level`,
  `diary_sort`, `diary_header` — diary keys (weekly/monthly/yearly
  semantics land in Cluster 4; the keys parse now so config
  migration doesn't need to wait).
- `maxhi`, `listsyms`, `listsyms_propagate`, `list_margin`,
  `links_space_char`, `nested_syntaxes`, `auto_toc` — list +
  highlight knobs the renderer/handlers can consult.

All keys threaded through `RawWiki` → `WikiConfig::from(RawWiki)`,
defaults centralised in `wiki_defaults()` so `empty()`, `from_root()`,
the legacy single-wiki path, and the `RawWiki` impl stay in sync.

Lua front-door (`lua/nuwiki/config.lua`) now documents the multi-wiki
`wikis = {…}` shape with every accepted per-wiki key — users who
prefer Lua tables no longer have to round-trip through
`init_options` raw JSON.

HTML renderer (`crates/nuwiki-core/src/render/html.rs`):
- New `table_spans()` pre-pass resolves vimwiki's `>` (col_span) and
  `\\/` (row_span) continuation markers into proper HTML
  `colspan="N"` / `rowspan="N"` attributes on the lead cell. Continuation
  cells emit nothing, matching what browsers expect.
- The old behaviour (emitting `class="col-span"` / `class="row-span"`
  as visual markers) is gone — replaced with real merging so the
  rendered HTML matches the source semantics.

Named ex-commands:
- `:VimwikiNextLink` / `:VimwikiPrevLink` — were keymapped only
  (`<Tab>`/`<S-Tab>`); now have explicit `:` commands in both editor
  paths, dispatching to new `nuwiki.commands.link_next` / `link_prev`
  pure-Vim/Lua helpers.
- `:VimwikiBaddLink` — adds the link target's file to the buffer
  list without switching focus. Goes through
  `textDocument/definition` and runs `:badd <fname>` on the resolved
  URI.

Mouse maps (opt-in via `mappings.mouse = true` in Lua or
`g:nuwiki_mouse_mappings = 1` in Vim):
- `<2-LeftMouse>` follows, `<S-2-LeftMouse>` / `<C-2-LeftMouse>`
  follow in split/vsplit, `<MiddleMouse>` adds to buflist,
  `<RightMouse>` goes back. Mirrors upstream vimwiki's defaults.

Tests: 7 new in `parity_cluster_1.rs` covering the per-wiki config
defaults + raw JSON parse, the legacy-single-wiki path, colspan
folding into a lead cell with no leftover class markers, rowspan
across rows, no-attrs when the table has no spans, and a sanity
paragraph render. Total 421 Rust tests pass; clippy clean; both
keymap harnesses still green (20 nvim + 12 vim).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 15:10:27 +00:00

304 lines
21 KiB
VimL

" ftplugin/nuwiki.vim — per-buffer settings + Phase 19 command/keymap glue.
"
" Wires up:
" - basic edit-time options (commentstring, suffixesadd, …)
" - every `:Vimwiki*` / `:Nuwiki*` command from SPEC §12.10 that has a
" server-side counterpart (deferred §13.1 commands stub out with a
" "not yet implemented" notification)
" - on Neovim: keymaps + text objects + folding via
" `nuwiki.ftplugin.attach()`
if exists('b:did_ftplugin')
finish
endif
let b:did_ftplugin = 1
setlocal commentstring=%%\ %s
setlocal comments=:%%
setlocal formatoptions+=ron
setlocal suffixesadd=.wiki
setlocal iskeyword+=-
let b:undo_ftplugin = 'setlocal commentstring< comments< formatoptions< suffixesadd< iskeyword<'
if !has('nvim')
" ===== Plain Vim path =====
"
" Define the same `:Vimwiki*` / `:Nuwiki*` surface here, dispatching
" through `autoload/nuwiki/commands.vim` (which talks to vim-lsp).
" coc.nvim users can run `:CocCommand nuwiki.x` directly and skip
" these aliases.
command! -buffer -count VimwikiIndex call nuwiki#commands#wiki_index(<count>)
command! -buffer -count VimwikiTabIndex call nuwiki#commands#wiki_tab_index(<count>)
command! -buffer VimwikiDiaryIndex call nuwiki#commands#diary_index()
command! -buffer VimwikiMakeDiaryNote call nuwiki#commands#diary_today()
command! -buffer VimwikiMakeYesterdayDiaryNote call nuwiki#commands#diary_yesterday()
command! -buffer VimwikiMakeTomorrowDiaryNote call nuwiki#commands#diary_tomorrow()
command! -buffer VimwikiDiaryNextDay call nuwiki#commands#diary_next()
command! -buffer VimwikiDiaryPrevDay call nuwiki#commands#diary_prev()
command! -buffer VimwikiDiaryGenerateLinks call nuwiki#commands#diary_generate_index()
command! -buffer VimwikiFollowLink LspDefinition
command! -buffer VimwikiBacklinks LspReferences
command! -buffer VWB LspReferences
command! -buffer VimwikiNextLink call nuwiki#commands#link_next()
command! -buffer VimwikiPrevLink call nuwiki#commands#link_prev()
command! -buffer VimwikiBaddLink call nuwiki#commands#badd_link()
command! -buffer -nargs=1 VimwikiSearch lvimgrep /<args>/ **
command! -buffer -nargs=1 VWS lvimgrep /<args>/ **
command! -buffer -nargs=1 VimwikiGoto call nuwiki#commands#wiki_goto_page(<q-args>)
command! -buffer VimwikiDeleteFile call nuwiki#commands#delete_file()
command! -buffer VimwikiRenameFile call nuwiki#commands#rename_file()
command! -buffer VimwikiNextTask call nuwiki#commands#next_task()
command! -buffer VimwikiToggleListItem call nuwiki#commands#toggle_list_item()
command! -buffer VimwikiToggleRejectedListItem call nuwiki#commands#reject_list_item()
command! -buffer VimwikiRemoveDone call nuwiki#commands#list_remove_done()
command! -buffer -nargs=? VimwikiListChangeLvl call nuwiki#commands#list_change_lvl()
command! -buffer Vimwiki2HTML call nuwiki#commands#export_current()
command! -buffer Vimwiki2HTMLBrowse call nuwiki#commands#export_browse()
command! -buffer -bang VimwikiAll2HTML if <bang>0 | call nuwiki#commands#export_all_force() | else | call nuwiki#commands#export_all() | endif
command! -buffer VimwikiRss call nuwiki#commands#export_rss()
command! -buffer VimwikiTOC call nuwiki#commands#toc_generate()
command! -buffer VimwikiGenerateLinks call nuwiki#commands#links_generate()
command! -buffer VimwikiCheckLinks call nuwiki#commands#check_links()
command! -buffer VimwikiFindOrphans call nuwiki#commands#find_orphans()
command! -buffer VimwikiRebuildTags call nuwiki#commands#tags_rebuild()
command! -buffer -nargs=? VimwikiSearchTags call nuwiki#commands#tags_search(<q-args>)
command! -buffer -nargs=? VimwikiGenerateTagLinks call nuwiki#commands#tags_generate_links(<q-args>)
" §13.1 deferred stubs.
command! -buffer -nargs=1 VimwikiTable call nuwiki#commands#table_insert()
command! -buffer VimwikiTableMoveColumnLeft call nuwiki#commands#table_move_left()
command! -buffer VimwikiTableMoveColumnRight call nuwiki#commands#table_move_right()
command! -buffer -nargs=1 VimwikiColorize call nuwiki#commands#colorize(<q-args>)
command! -buffer VimwikiPasteLink call nuwiki#commands#paste_link()
command! -buffer VimwikiPasteUrl call nuwiki#commands#paste_url()
" :Nuwiki* canonical aliases (P10) — Vim side.
command! -buffer -count NuwikiIndex call nuwiki#commands#wiki_index(<count>)
command! -buffer NuwikiTabIndex call nuwiki#commands#wiki_tab_index(<count>)
command! -buffer NuwikiDiaryIndex call nuwiki#commands#diary_index()
command! -buffer NuwikiDiaryToday call nuwiki#commands#diary_today()
command! -buffer NuwikiDiaryYesterday call nuwiki#commands#diary_yesterday()
command! -buffer NuwikiDiaryTomorrow call nuwiki#commands#diary_tomorrow()
command! -buffer NuwikiDiaryNext call nuwiki#commands#diary_next()
command! -buffer NuwikiDiaryPrev call nuwiki#commands#diary_prev()
command! -buffer NuwikiFollowLink LspDefinition
command! -buffer NuwikiBacklinks LspReferences
command! -buffer NuwikiDeleteFile call nuwiki#commands#delete_file()
command! -buffer NuwikiRenameFile call nuwiki#commands#rename_file()
command! -buffer NuwikiNextTask call nuwiki#commands#next_task()
command! -buffer NuwikiToggleListItem call nuwiki#commands#toggle_list_item()
command! -buffer NuwikiToggleRejected call nuwiki#commands#reject_list_item()
command! -buffer NuwikiExport call nuwiki#commands#export_current()
command! -buffer NuwikiExportBrowse call nuwiki#commands#export_browse()
command! -buffer -bang NuwikiExportAll if <bang>0 | call nuwiki#commands#export_all_force() | else | call nuwiki#commands#export_all() | endif
command! -buffer NuwikiRss call nuwiki#commands#export_rss()
command! -buffer NuwikiTOC call nuwiki#commands#toc_generate()
command! -buffer NuwikiGenerateLinks call nuwiki#commands#links_generate()
command! -buffer NuwikiCheckLinks call nuwiki#commands#check_links()
command! -buffer NuwikiFindOrphans call nuwiki#commands#find_orphans()
command! -buffer NuwikiRebuildTags call nuwiki#commands#tags_rebuild()
command! -buffer -nargs=? NuwikiSearchTags call nuwiki#commands#tags_search(<q-args>)
command! -buffer -nargs=? NuwikiGenerateTagLinks call nuwiki#commands#tags_generate_links(<q-args>)
command! -buffer -nargs=1 NuwikiGoto call nuwiki#commands#wiki_goto_page(<q-args>)
" ===== Default key mappings (parity with upstream vimwiki) =====
"
" Users can opt out by setting `g:nuwiki_no_default_mappings = 1`
" (whole layer) or by adding their own competing buffer-local maps.
if !get(g:, 'nuwiki_no_default_mappings', 0)
" Wiki prefix
nnoremap <silent><buffer> <Leader>ww :call nuwiki#commands#diary_today()<CR>
nnoremap <silent><buffer> <Leader>wt :call nuwiki#commands#diary_today()<CR>
nnoremap <silent><buffer> <Leader>ws :call nuwiki#commands#wiki_ui_select()<CR>
nnoremap <silent><buffer> <Leader>wi :call nuwiki#commands#diary_index()<CR>
nnoremap <silent><buffer> <Leader>w<Leader>w :call nuwiki#commands#diary_today()<CR>
nnoremap <silent><buffer> <Leader>w<Leader>y :call nuwiki#commands#diary_yesterday()<CR>
nnoremap <silent><buffer> <Leader>w<Leader>t :call nuwiki#commands#diary_tomorrow()<CR>
nnoremap <silent><buffer> <Leader>w<Leader>m :call nuwiki#commands#diary_tomorrow()<CR>
nnoremap <silent><buffer> <Leader>w<Leader>i :call nuwiki#commands#diary_generate_index()<CR>
" Links
nnoremap <silent><buffer> <CR> :call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <S-CR> :split<CR>:call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <C-CR> :vsplit<CR>:call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <C-S-CR> :tabnew<CR>:call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <BS> <C-o>
nnoremap <silent><buffer> <Tab> /\[\[<CR>:nohlsearch<CR>
nnoremap <silent><buffer> <S-Tab> ?\[\[<CR>:nohlsearch<CR>
nnoremap <silent><buffer> + :call nuwiki#commands#normalize_link()<CR>
xnoremap <silent><buffer> + :<C-u>call nuwiki#commands#normalize_link()<CR>
nnoremap <silent><buffer> <Leader>wn :call nuwiki#commands#wiki_goto_page('')<CR>
nnoremap <silent><buffer> <Leader>wd :call nuwiki#commands#delete_file()<CR>
nnoremap <silent><buffer> <Leader>wr :call nuwiki#commands#rename_file()<CR>
nnoremap <silent><buffer> <Leader>wc :call nuwiki#commands#colorize('')<CR>
xnoremap <silent><buffer> <Leader>wc :<C-u>call nuwiki#commands#colorize('')<CR>
" Diary nav
nnoremap <silent><buffer> <C-Down> :call nuwiki#commands#diary_next()<CR>
nnoremap <silent><buffer> <C-Up> :call nuwiki#commands#diary_prev()<CR>
" Lists
nnoremap <silent><buffer> <C-Space> :call nuwiki#commands#toggle_list_item()<CR>
xnoremap <silent><buffer> <C-Space> :<C-u>call nuwiki#commands#toggle_list_item()<CR>
nnoremap <silent><buffer> <C-@> :call nuwiki#commands#toggle_list_item()<CR>
xnoremap <silent><buffer> <C-@> :<C-u>call nuwiki#commands#toggle_list_item()<CR>
nnoremap <silent><buffer> <Nul> :call nuwiki#commands#toggle_list_item()<CR>
xnoremap <silent><buffer> <Nul> :<C-u>call nuwiki#commands#toggle_list_item()<CR>
nnoremap <silent><buffer> gnt :call nuwiki#commands#next_task()<CR>
nnoremap <silent><buffer> gln :call nuwiki#commands#cycle_list_item()<CR>
xnoremap <silent><buffer> gln :<C-u>call nuwiki#commands#cycle_list_item()<CR>
nnoremap <silent><buffer> glp :call nuwiki#commands#cycle_list_item()<CR>
xnoremap <silent><buffer> glp :<C-u>call nuwiki#commands#cycle_list_item()<CR>
nnoremap <silent><buffer> glx :call nuwiki#commands#reject_list_item()<CR>
xnoremap <silent><buffer> glx :<C-u>call nuwiki#commands#reject_list_item()<CR>
nnoremap <silent><buffer> glh :call nuwiki#commands#list_change_level(-1, 0)<CR>
nnoremap <silent><buffer> gll :call nuwiki#commands#list_change_level(1, 0)<CR>
nnoremap <silent><buffer> gLh :call nuwiki#commands#list_change_level(-1, 1)<CR>
nnoremap <silent><buffer> gLl :call nuwiki#commands#list_change_level(1, 1)<CR>
nnoremap <silent><buffer> glr :call nuwiki#commands#list_renumber()<CR>
nnoremap <silent><buffer> gLr :call nuwiki#commands#list_renumber_all()<CR>
nnoremap <silent><buffer> gl<Space> :call nuwiki#commands#list_remove_done()<CR>
nnoremap <silent><buffer> gL<Space> :call nuwiki#commands#list_remove_done()<CR>
nnoremap <silent><buffer> o :call nuwiki#commands#open_below_with_bullet()<CR>
nnoremap <silent><buffer> O :call nuwiki#commands#open_above_with_bullet()<CR>
" Headers
nnoremap <silent><buffer> = :call nuwiki#commands#heading_add()<CR>
nnoremap <silent><buffer> - :call nuwiki#commands#heading_remove()<CR>
nnoremap <silent><buffer> ]] :call nuwiki#commands#next_header()<CR>
nnoremap <silent><buffer> [[ :call nuwiki#commands#prev_header()<CR>
nnoremap <silent><buffer> ]= :call nuwiki#commands#next_sibling_header()<CR>
nnoremap <silent><buffer> [= :call nuwiki#commands#prev_sibling_header()<CR>
nnoremap <silent><buffer> ]u :call nuwiki#commands#parent_header()<CR>
nnoremap <silent><buffer> [u :call nuwiki#commands#parent_header()<CR>
" HTML export
nnoremap <silent><buffer> <Leader>wh :call nuwiki#commands#export_current()<CR>
nnoremap <silent><buffer> <Leader>whh :call nuwiki#commands#export_browse()<CR>
nnoremap <silent><buffer> <Leader>wha :call nuwiki#commands#export_all()<CR>
" Mouse (opt-in via g:nuwiki_mouse_mappings = 1).
if get(g:, 'nuwiki_mouse_mappings', 0)
nnoremap <silent><buffer> <2-LeftMouse> :call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <S-2-LeftMouse> :split<CR>:call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <C-2-LeftMouse> :vsplit<CR>:call nuwiki#commands#follow_link_or_create()<CR>
nnoremap <silent><buffer> <MiddleMouse> :call nuwiki#commands#badd_link()<CR>
nnoremap <silent><buffer> <RightMouse> <C-o>
endif
" Tables
nnoremap <silent><buffer> gqq :call nuwiki#commands#table_align()<CR>
nnoremap <silent><buffer> gq1 :call nuwiki#commands#table_align()<CR>
nnoremap <silent><buffer> gww :call nuwiki#commands#table_align()<CR>
nnoremap <silent><buffer> gw1 :call nuwiki#commands#table_align()<CR>
nnoremap <silent><buffer> <A-Left> :call nuwiki#commands#table_move_left()<CR>
nnoremap <silent><buffer> <A-Right> :call nuwiki#commands#table_move_right()<CR>
endif
finish
endif
" ===== Neovim path =====
" :Vimwiki* compat — every command dispatches to a Lua wrapper in
" `nuwiki.commands` that either issues a `workspace/executeCommand`
" or, for client-side operations, calls `vim.lsp.buf.*` directly.
command! -buffer -count VimwikiIndex lua require('nuwiki.commands').wiki_index(vim.v.count)
command! -buffer -count VimwikiTabIndex lua require('nuwiki.commands').wiki_tab_index(vim.v.count)
command! -buffer VimwikiUISelect lua require('nuwiki.commands').wiki_ui_select()
command! -buffer VimwikiDiaryIndex lua require('nuwiki.commands').diary_index()
command! -buffer VimwikiMakeDiaryNote lua require('nuwiki.commands').diary_today()
command! -buffer VimwikiMakeYesterdayDiaryNote lua require('nuwiki.commands').diary_yesterday()
command! -buffer VimwikiMakeTomorrowDiaryNote lua require('nuwiki.commands').diary_tomorrow()
command! -buffer VimwikiDiaryNextDay lua require('nuwiki.commands').diary_next()
command! -buffer VimwikiDiaryPrevDay lua require('nuwiki.commands').diary_prev()
command! -buffer VimwikiDiaryGenerateLinks lua require('nuwiki.commands').diary_generate_index()
command! -buffer VimwikiFollowLink lua vim.lsp.buf.definition()
command! -buffer VimwikiGoBackLink normal!
command! -buffer VimwikiSplitLink split | lua vim.lsp.buf.definition()
command! -buffer VimwikiVSplitLink vsplit | lua vim.lsp.buf.definition()
command! -buffer VimwikiTabnewLink tabnew | lua vim.lsp.buf.definition()
command! -buffer VimwikiTabDropLink tabnew | lua vim.lsp.buf.definition()
command! -buffer VimwikiNextLink lua require('nuwiki.commands').link_next()
command! -buffer VimwikiPrevLink lua require('nuwiki.commands').link_prev()
command! -buffer VimwikiBaddLink lua require('nuwiki.commands').badd_link()
command! -buffer -nargs=1 VimwikiGoto lua require('nuwiki.commands').wiki_goto_page(<q-args>)
command! -buffer VimwikiBacklinks lua vim.lsp.buf.references()
command! -buffer VWB lua vim.lsp.buf.references()
command! -buffer -nargs=1 VimwikiSearch lvimgrep /<args>/ **
command! -buffer -nargs=1 VWS lvimgrep /<args>/ **
command! -buffer VimwikiDeleteFile lua require('nuwiki.commands').delete_file()
command! -buffer VimwikiRenameFile lua require('nuwiki.commands').rename_file()
command! -buffer VimwikiNextTask lua require('nuwiki.commands').next_task()
command! -buffer VimwikiToggleListItem lua require('nuwiki.commands').toggle_list_item()
command! -buffer VimwikiToggleRejectedListItem lua require('nuwiki.commands').reject_list_item()
command! -buffer VimwikiRemoveDone lua require('nuwiki.commands').list_remove_done()
command! -buffer -nargs=? VimwikiListChangeLvl lua require('nuwiki.commands').list_change_lvl()
command! -buffer Vimwiki2HTML lua require('nuwiki.commands').export_current()
command! -buffer Vimwiki2HTMLBrowse lua require('nuwiki.commands').export_browse()
command! -buffer -bang VimwikiAll2HTML execute (<bang>0 ? "lua require('nuwiki.commands').export_all_force()" : "lua require('nuwiki.commands').export_all()")
command! -buffer VimwikiRss lua require('nuwiki.commands').export_rss()
command! -buffer VimwikiTOC lua require('nuwiki.commands').toc_generate()
command! -buffer VimwikiGenerateLinks lua require('nuwiki.commands').links_generate()
command! -buffer VimwikiCheckLinks lua require('nuwiki.commands').check_links()
command! -buffer VimwikiFindOrphans lua require('nuwiki.commands').find_orphans()
command! -buffer VimwikiRebuildTags lua require('nuwiki.commands').tags_rebuild()
command! -buffer -nargs=? VimwikiSearchTags lua require('nuwiki.commands').tags_search(<q-args>)
command! -buffer -nargs=? VimwikiGenerateTagLinks lua require('nuwiki.commands').tags_generate_links(<q-args>)
" §13.1 deferred — stubs notify the user instead of erroring.
command! -buffer -nargs=1 VimwikiTable lua require('nuwiki.commands').table_insert()
command! -buffer VimwikiTableMoveColumnLeft lua require('nuwiki.commands').table_move_column_left()
command! -buffer VimwikiTableMoveColumnRight lua require('nuwiki.commands').table_move_column_right()
command! -buffer -nargs=1 VimwikiColorize lua require('nuwiki.commands').colorize()
command! -buffer VimwikiPasteLink lua require('nuwiki.commands').paste_link()
command! -buffer VimwikiPasteUrl lua require('nuwiki.commands').paste_url()
" Canonical :Nuwiki* aliases — P10.
command! -buffer -count NuwikiIndex lua require('nuwiki.commands').wiki_index(vim.v.count)
command! -buffer NuwikiTabIndex lua require('nuwiki.commands').wiki_tab_index(vim.v.count)
command! -buffer NuwikiUISelect lua require('nuwiki.commands').wiki_ui_select()
command! -buffer NuwikiDiaryIndex lua require('nuwiki.commands').diary_index()
command! -buffer NuwikiDiaryToday lua require('nuwiki.commands').diary_today()
command! -buffer NuwikiDiaryYesterday lua require('nuwiki.commands').diary_yesterday()
command! -buffer NuwikiDiaryTomorrow lua require('nuwiki.commands').diary_tomorrow()
command! -buffer NuwikiDiaryNext lua require('nuwiki.commands').diary_next()
command! -buffer NuwikiDiaryPrev lua require('nuwiki.commands').diary_prev()
command! -buffer NuwikiDiaryGenerateLinks lua require('nuwiki.commands').diary_generate_index()
command! -buffer NuwikiFollowLink lua vim.lsp.buf.definition()
command! -buffer NuwikiBacklinks lua vim.lsp.buf.references()
command! -buffer NuwikiDeleteFile lua require('nuwiki.commands').delete_file()
command! -buffer NuwikiRenameFile lua require('nuwiki.commands').rename_file()
command! -buffer NuwikiNextTask lua require('nuwiki.commands').next_task()
command! -buffer NuwikiToggleListItem lua require('nuwiki.commands').toggle_list_item()
command! -buffer NuwikiToggleRejected lua require('nuwiki.commands').reject_list_item()
command! -buffer NuwikiExport lua require('nuwiki.commands').export_current()
command! -buffer NuwikiExportBrowse lua require('nuwiki.commands').export_browse()
command! -buffer -bang NuwikiExportAll execute (<bang>0 ? "lua require('nuwiki.commands').export_all_force()" : "lua require('nuwiki.commands').export_all()")
command! -buffer NuwikiRss lua require('nuwiki.commands').export_rss()
command! -buffer NuwikiTOC lua require('nuwiki.commands').toc_generate()
command! -buffer NuwikiGenerateLinks lua require('nuwiki.commands').links_generate()
command! -buffer NuwikiCheckLinks lua require('nuwiki.commands').check_links()
command! -buffer NuwikiFindOrphans lua require('nuwiki.commands').find_orphans()
command! -buffer NuwikiRebuildTags lua require('nuwiki.commands').tags_rebuild()
command! -buffer -nargs=? NuwikiSearchTags lua require('nuwiki.commands').tags_search(<q-args>)
command! -buffer -nargs=? NuwikiGenerateTagLinks lua require('nuwiki.commands').tags_generate_links(<q-args>)
command! -buffer -nargs=1 NuwikiGoto lua require('nuwiki.commands').wiki_goto_page(<q-args>)
" Phase 19 buffer attach: keymaps + text objects + folding.
lua require('nuwiki.ftplugin').attach(0)