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
+15 -3
View File
@@ -144,10 +144,12 @@ 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()
endif
if s:cursor_inside_wikilink()
if exists(':LspDefinition') == 2
LspDefinition
else
@@ -155,6 +157,16 @@ function! nuwiki#commands#follow_link_or_create() abort
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
endif
endfunction
" Pure-VimL bullet-continuation for `o` / `O` — mirrors the Lua side
+15 -4
View File
@@ -159,13 +159,24 @@ local function wrap_cword_as_wikilink()
return true
end
--- 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.
--- "Not on a word" falls through to plain definition so users can
--- still chord a definition request anywhere.
function M.follow_link_or_create()
if not cursor_inside_wikilink() then
if not wrap_cword_as_wikilink() then
-- Not on a word either — fall through to plain definition; the
-- LSP will simply do nothing if there's no target.
if cursor_inside_wikilink() then
vim.lsp.buf.definition()
return
end
if wrap_cword_as_wikilink() then
-- Wrapped — leave the user inside the new `[[…]]` and stop. A
-- second `<CR>` follows it, matching vimwiki's review-then-follow
-- flow.
return
end
-- No word under cursor either — fall through.
vim.lsp.buf.definition()
end