fix(follow-link): two-step <CR> — first wraps, second follows
CI / cargo fmt --check (push) Successful in 18s
CI / cargo clippy (push) Successful in 1m16s
CI / cargo test (push) Successful in 1m15s

User feedback: the smart `<CR>` should give the user a chance to
review/edit the freshly-created wikilink before committing to the
follow. Matches upstream vimwiki's flow.

`follow_link_or_create` (Lua + VimL) now:
  1. Cursor already inside `[[…]]` → follow immediately.
  2. Cursor on a bare word → wrap it as `[[word]]`, place cursor
     inside, and STOP. A second `<CR>` then follows.
  3. Neither — fall through to plain definition request so users
     can still chord follow without a target word.

Verified: cursor on `MyPage rest` →
  1st `<CR>` → `[[MyPage]] rest` (buffer unchanged)
  2nd `<CR>` → opens `MyPage.wiki` (the synthesised future page).

381 tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-12 01:55:20 +00:00
parent 347e2f02f7
commit 4905858d5e
2 changed files with 34 additions and 11 deletions
+18 -6
View File
@@ -144,16 +144,28 @@ function! s:wrap_cword_as_wikilink() abort
return 1
endfunction
" Two-step behaviour matching vimwiki:
" 1. First press on a bare word → wrap it as `[[word]]` and stop.
" 2. Cursor is now inside `[[…]]`; next press follows the link.
" 3. Press inside an existing `[[…]]` follows immediately.
function! nuwiki#commands#follow_link_or_create() abort
if !s:cursor_inside_wikilink()
call s:wrap_cword_as_wikilink()
if s:cursor_inside_wikilink()
if exists(':LspDefinition') == 2
LspDefinition
else
echohl WarningMsg
echom 'nuwiki: :LspDefinition unavailable; install vim-lsp'
echohl None
endif
return
endif
if s:wrap_cword_as_wikilink()
" Wrapped — wait for the user's second <CR> to follow.
return
endif
" Nothing to wrap — fall through.
if exists(':LspDefinition') == 2
LspDefinition
else
echohl WarningMsg
echom 'nuwiki: :LspDefinition unavailable; install vim-lsp'
echohl None
endif
endfunction