" scripts/test-keymaps-vim.vim — driven by scripts/test-keymaps-vim.sh. " " Pure-VimL keymap regression suite. Plain Vim's LSP path " (vim-lsp + async.vim) talks to the server via timers, which won't " reliably fire inside `vim -e -s` headless mode — so the cases here " are restricted to the bindings whose RHS is implemented entirely in " VimL (header/link nav, `o`/`O` bullet continuation, the wrap step " of ``). LSP-roundtrip bindings (``, `=`, `-`, …) get " their coverage from the Neovim harness in scripts/test-keymaps.lua " — same Lua codepath, same server. let s:results = [] let s:pass = 0 let s:fail = 0 let s:out = $NUWIKI_KEYMAP_RESULTS function! s:record(ok, name, detail) abort let l:line = (a:ok ? 'PASS' : 'FAIL') . ' ' . a:name if a:detail !=# '' let l:line .= ' — ' . a:detail endif call add(s:results, l:line) if a:ok let s:pass += 1 else let s:fail += 1 endif endfunction function! s:set_buf(lines) abort silent %delete _ call setline(1, a:lines) endfunction function! s:lines() abort return getline(1, '$') endfunction function! s:run(name, opts) abort try call s:set_buf(a:opts.lines) let l:cursor = get(a:opts, 'cursor', [1, 1]) call cursor(l:cursor[0], l:cursor[1]) " feedkeys with 'tx' — t: typed (respects maps), x: execute now. let l:keys = a:opts.keys call feedkeys(l:keys, 'tx') let l:detail = '' if has_key(a:opts, 'expect_lines') if s:lines() !=# a:opts.expect_lines let l:detail = 'lines mismatch — expected ' . string(a:opts.expect_lines) \ . ', actual ' . string(s:lines()) call s:record(0, a:name, l:detail) return endif endif if has_key(a:opts, 'expect_line') && has_key(a:opts, 'expect_at') let l:got = getline(a:opts.expect_at) if l:got !=# a:opts.expect_line let l:detail = 'line ' . a:opts.expect_at . ' — expected ' . string(a:opts.expect_line) \ . ', got ' . string(l:got) call s:record(0, a:name, l:detail) return endif endif if has_key(a:opts, 'expect_cursor_line') let l:lnum = line('.') if l:lnum != a:opts.expect_cursor_line let l:detail = 'cursor line — expected ' . a:opts.expect_cursor_line \ . ', got ' . l:lnum call s:record(0, a:name, l:detail) return endif endif call s:record(1, a:name, '') catch call s:record(0, a:name, v:exception) endtry endfunction " ===== Smoke: ftplugin loaded + commands defined ===== if &filetype !=# 'vimwiki' call s:record(0, 'ftplugin.attached', 'filetype is ' . &filetype . ' (expected vimwiki)') else call s:record(1, 'ftplugin.attached', '') endif if exists(':VimwikiTOC') == 2 call s:record(1, 'cmd.VimwikiTOC_defined', '') else call s:record(0, 'cmd.VimwikiTOC_defined', ':VimwikiTOC not registered') endif if exists(':NuwikiIndex') == 2 call s:record(1, 'cmd.NuwikiIndex_defined', '') else call s:record(0, 'cmd.NuwikiIndex_defined', ':NuwikiIndex not registered') endif " ===== Header nav (pure VimL) ===== call s:run('headers.]]_jumps_to_next', { \ 'lines': ['= One =', 'body', '== Two ==', 'body', '= Three ='], \ 'cursor': [1, 1], \ 'keys': ']]', \ 'expect_cursor_line': 3, \ }) call s:run('headers.[[_jumps_to_prev', { \ 'lines': ['= One =', 'body', '== Two ==', 'body', '= Three ='], \ 'cursor': [5, 1], \ 'keys': '[[', \ 'expect_cursor_line': 3, \ }) call s:run('headers.]u_jumps_to_parent', { \ 'lines': ['= Parent =', '== Child ==', 'body'], \ 'cursor': [3, 1], \ 'keys': ']u', \ 'expect_cursor_line': 1, \ }) call s:run('headers.]=_jumps_to_next_sibling', { \ 'lines': ['= A =', '== child ==', 'body', '= B ='], \ 'cursor': [1, 1], \ 'keys': ']=', \ 'expect_cursor_line': 4, \ }) " ===== Link nav (pure VimL) ===== call s:run('links._finds_next_wikilink', { \ 'lines': ['intro [[A]] more [[B]] end'], \ 'cursor': [1, 1], \ 'keys': "\", \ 'expect_cursor_line': 1, \ }) " ===== first press wraps bare word ===== call s:run('cr.wraps_bare_word_first_press', { \ 'lines': ['MyPage rest'], \ 'cursor': [1, 3], \ 'keys': "\", \ 'expect_line': '[[MyPage]] rest', \ 'expect_at': 1, \ }) " ===== Bullet continuation ===== call s:run('lists.o_continues_list_marker', { \ 'lines': ['- first'], \ 'cursor': [1, 1], \ 'keys': "o\", \ 'expect_lines': ['- first', '- '], \ }) call s:run('lists.o_continues_checkbox', { \ 'lines': ['- [ ] first'], \ 'cursor': [1, 1], \ 'keys': "o\", \ 'expect_lines': ['- [ ] first', '- [ ] '], \ }) call s:run('lists.O_continues_above', { \ 'lines': ['- second'], \ 'cursor': [1, 1], \ 'keys': "O\", \ 'expect_lines': ['- ', '- second'], \ }) " ===== Wrap up ===== call add(s:results, '') call add(s:results, printf('SUMMARY: %d passed, %d failed', s:pass, s:fail)) call writefile(s:results, s:out) execute (s:fail == 0 ? 'qall!' : 'cquit!')