fix(diary): complete the -count wiki selector (repair 874bdd0)
874bdd0 committed the diary -count feature with several Edits that had
silently no-matched, leaving the tree non-compiling and the clients
inconsistent (CI run 236 failed). This completes it:
- commands.rs: add the `wiki` field to OptionalUriArg (the previous edit
targeted a wrong struct name) and pass None to the six resolve_diary_wiki
callers that take no selector (date/list/step paths). Server builds clean.
- autoload/nuwiki/commands.vim + lua/nuwiki/commands.lua: actually thread the
count through s:diary_open / _diary_open and the diary_today/today_tab/
yesterday/tomorrow/index handlers (these edits had failed before, so the
ftplugin defs were calling handlers that ignored/rejected the arg).
- Add the test cases the prior commit referenced but never landed:
cmd.VimwikiMakeDiaryNote_has_count (test-keymaps.lua) +
cmd.Vimwiki{MakeDiaryNote,DiaryIndex}_accepts_count (test-keymaps-vim.vim).
- Fix the OptUriArg→OptionalUriArg name in the gap-doc note.
Verified with CI flags: workspace test/clippy/fmt clean; lua 284, vim 272/18/21,
all 0 failed; the three new diary cases pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -419,32 +419,37 @@ endfunction
|
|||||||
|
|
||||||
" ===== Diary =====
|
" ===== Diary =====
|
||||||
|
|
||||||
function! s:diary_open(cmd_name, ...) abort
|
" `a:open` is the window command ('edit'/'tabedit'); `a:count` is vimwiki's
|
||||||
let l:open = a:0 >= 1 ? a:1 : 'edit'
|
" diary `-count` — a wiki number (1-indexed at the user level). When > 0 the
|
||||||
call s:exec(a:cmd_name, [{ 'uri': s:buf_uri() }],
|
" server acts on that wiki instead of the buffer's.
|
||||||
\ {n -> s:open_uri_from(n, l:open)})
|
function! s:diary_open(cmd_name, open, count) abort
|
||||||
|
let l:arg = { 'uri': s:buf_uri() }
|
||||||
|
if a:count > 0
|
||||||
|
let l:arg['wiki'] = a:count - 1
|
||||||
|
endif
|
||||||
|
call s:exec(a:cmd_name, [l:arg], {n -> s:open_uri_from(n, a:open)})
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! nuwiki#commands#diary_today() abort
|
function! nuwiki#commands#diary_today(...) abort
|
||||||
call s:diary_open('nuwiki.diary.openToday')
|
call s:diary_open('nuwiki.diary.openToday', 'edit', a:0 >= 1 ? a:1 : 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_today_tab() abort
|
function! nuwiki#commands#diary_today_tab(...) abort
|
||||||
call s:diary_open('nuwiki.diary.openToday', 'tabedit')
|
call s:diary_open('nuwiki.diary.openToday', 'tabedit', a:0 >= 1 ? a:1 : 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_yesterday() abort
|
function! nuwiki#commands#diary_yesterday(...) abort
|
||||||
call s:diary_open('nuwiki.diary.openYesterday')
|
call s:diary_open('nuwiki.diary.openYesterday', 'edit', a:0 >= 1 ? a:1 : 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_tomorrow() abort
|
function! nuwiki#commands#diary_tomorrow(...) abort
|
||||||
call s:diary_open('nuwiki.diary.openTomorrow')
|
call s:diary_open('nuwiki.diary.openTomorrow', 'edit', a:0 >= 1 ? a:1 : 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_index() abort
|
function! nuwiki#commands#diary_index(...) abort
|
||||||
call s:diary_open('nuwiki.diary.openIndex')
|
call s:diary_open('nuwiki.diary.openIndex', 'edit', a:0 >= 1 ? a:1 : 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_next() abort
|
function! nuwiki#commands#diary_next() abort
|
||||||
call s:diary_open('nuwiki.diary.next')
|
call s:diary_open('nuwiki.diary.next', 'edit', 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_prev() abort
|
function! nuwiki#commands#diary_prev() abort
|
||||||
call s:diary_open('nuwiki.diary.prev')
|
call s:diary_open('nuwiki.diary.prev', 'edit', 0)
|
||||||
endfunction
|
endfunction
|
||||||
function! nuwiki#commands#diary_generate_index() abort
|
function! nuwiki#commands#diary_generate_index() abort
|
||||||
call s:exec('nuwiki.diary.generateIndex', [{ 'uri': s:buf_uri() }])
|
call s:exec('nuwiki.diary.generateIndex', [{ 'uri': s:buf_uri() }])
|
||||||
|
|||||||
@@ -308,6 +308,11 @@ fn parse_uri_arg(args: Vec<Value>) -> Result<UriArg, String> {
|
|||||||
struct OptionalUriArg {
|
struct OptionalUriArg {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
uri: Option<Url>,
|
uri: Option<Url>,
|
||||||
|
/// Optional wiki selector (vimwiki's diary `-count`): the client sends a
|
||||||
|
/// 0-indexed wiki number when the user gave a count. When present it wins
|
||||||
|
/// over `uri`-based resolution (see `resolve_diary_wiki`).
|
||||||
|
#[serde(default)]
|
||||||
|
wiki: Option<Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_optional_uri_arg(args: Vec<Value>) -> Result<OptionalUriArg, String> {
|
fn parse_optional_uri_arg(args: Vec<Value>) -> Result<OptionalUriArg, String> {
|
||||||
@@ -522,7 +527,7 @@ fn diary_list(backend: &Backend, args: Vec<Value>) -> Result<Option<Value>, Stri
|
|||||||
Some(v) => serde_json::from_value(v).map_err(|e| format!("invalid args: {e}"))?,
|
Some(v) => serde_json::from_value(v).map_err(|e| format!("invalid args: {e}"))?,
|
||||||
None => Args::default(),
|
None => Args::default(),
|
||||||
};
|
};
|
||||||
let Some(wiki) = resolve_diary_wiki(backend, parsed.uri.as_ref()) else {
|
let Some(wiki) = resolve_diary_wiki(backend, parsed.uri.as_ref(), None) else {
|
||||||
return Ok(Some(serde_json::json!([])));
|
return Ok(Some(serde_json::json!([])));
|
||||||
};
|
};
|
||||||
let entries = {
|
let entries = {
|
||||||
@@ -556,7 +561,7 @@ fn diary_open_for_date(backend: &Backend, args: Vec<Value>) -> Result<Option<Val
|
|||||||
parsed.date
|
parsed.date
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
let Some(wiki) = resolve_diary_wiki(backend, parsed.uri.as_ref()) else {
|
let Some(wiki) = resolve_diary_wiki(backend, parsed.uri.as_ref(), None) else {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
let Some(uri) = crate::diary::uri_for_date(&wiki.config, &date) else {
|
let Some(uri) = crate::diary::uri_for_date(&wiki.config, &date) else {
|
||||||
@@ -579,7 +584,7 @@ fn tags_search(backend: &Backend, args: Vec<Value>) -> Result<Option<Value>, Str
|
|||||||
Some(v) => serde_json::from_value(v).map_err(|e| format!("invalid args: {e}"))?,
|
Some(v) => serde_json::from_value(v).map_err(|e| format!("invalid args: {e}"))?,
|
||||||
None => Args::default(),
|
None => Args::default(),
|
||||||
};
|
};
|
||||||
let Some(wiki) = resolve_diary_wiki(backend, parsed.uri.as_ref()) else {
|
let Some(wiki) = resolve_diary_wiki(backend, parsed.uri.as_ref(), None) else {
|
||||||
return Ok(Some(serde_json::json!([])));
|
return Ok(Some(serde_json::json!([])));
|
||||||
};
|
};
|
||||||
let hits = {
|
let hits = {
|
||||||
@@ -653,7 +658,7 @@ fn tags_rebuild(backend: &Backend, args: Vec<Value>) -> Result<Option<Value>, St
|
|||||||
let targets: Vec<crate::wiki::Wiki> = if all {
|
let targets: Vec<crate::wiki::Wiki> = if all {
|
||||||
backend.wikis_snapshot()
|
backend.wikis_snapshot()
|
||||||
} else {
|
} else {
|
||||||
match resolve_diary_wiki(backend, p.uri.as_ref()) {
|
match resolve_diary_wiki(backend, p.uri.as_ref(), None) {
|
||||||
Some(w) => vec![w],
|
Some(w) => vec![w],
|
||||||
None => return Ok(None),
|
None => return Ok(None),
|
||||||
}
|
}
|
||||||
@@ -1171,7 +1176,7 @@ fn export_current(
|
|||||||
|
|
||||||
fn export_all(backend: &Backend, args: Vec<Value>, force: bool) -> Result<Option<Value>, String> {
|
fn export_all(backend: &Backend, args: Vec<Value>, force: bool) -> Result<Option<Value>, String> {
|
||||||
let p = parse_optional_uri_arg(args)?;
|
let p = parse_optional_uri_arg(args)?;
|
||||||
let Some(wiki) = resolve_diary_wiki(backend, p.uri.as_ref()) else {
|
let Some(wiki) = resolve_diary_wiki(backend, p.uri.as_ref(), None) else {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
let cfg = wiki.config.clone();
|
let cfg = wiki.config.clone();
|
||||||
@@ -1248,7 +1253,7 @@ fn export_all(backend: &Backend, args: Vec<Value>, force: bool) -> Result<Option
|
|||||||
|
|
||||||
fn export_rss(backend: &Backend, args: Vec<Value>) -> Result<Option<Value>, String> {
|
fn export_rss(backend: &Backend, args: Vec<Value>) -> Result<Option<Value>, String> {
|
||||||
let p = parse_optional_uri_arg(args)?;
|
let p = parse_optional_uri_arg(args)?;
|
||||||
let Some(wiki) = resolve_diary_wiki(backend, p.uri.as_ref()) else {
|
let Some(wiki) = resolve_diary_wiki(backend, p.uri.as_ref(), None) else {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
let entries = {
|
let entries = {
|
||||||
|
|||||||
@@ -915,6 +915,15 @@ vim.defer_fn(function()
|
|||||||
error('VimwikiMakeDiaryNote missing -count: ' .. vim.inspect(c))
|
error('VimwikiMakeDiaryNote missing -count: ' .. vim.inspect(c))
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
-- Diary-note family carries -count=0 (vimwiki's wiki selector), so
|
||||||
|
-- `:2VimwikiMakeDiaryNote` selects wiki #2 instead of raising E481.
|
||||||
|
tobj_case('cmd.VimwikiMakeDiaryNote_has_count', function()
|
||||||
|
local c = vim.api.nvim_buf_get_commands(0, {}).VimwikiMakeDiaryNote
|
||||||
|
if not c then error(':VimwikiMakeDiaryNote not defined') end
|
||||||
|
if c.count == nil or c.count == false then
|
||||||
|
error('VimwikiMakeDiaryNote missing -count: ' .. vim.inspect(c))
|
||||||
|
end
|
||||||
|
end)
|
||||||
-- `:VimwikiNormalizeLink 1` (the arg is upstream's visual flag; the command
|
-- `:VimwikiNormalizeLink 1` (the arg is upstream's visual flag; the command
|
||||||
-- is -nargs=? not -range, so no `'<,'>`) wraps the last visual selection.
|
-- is -nargs=? not -range, so no `'<,'>`) wraps the last visual selection.
|
||||||
tobj_case('cmd.normalize_link_visual_wraps_selection', function()
|
tobj_case('cmd.normalize_link_visual_wraps_selection', function()
|
||||||
|
|||||||
@@ -304,8 +304,8 @@ fix site.
|
|||||||
same day)_ — upstream's `:Vimwiki{Make,TabMake,MakeYesterday,MakeTomorrow}DiaryNote`
|
same day)_ — upstream's `:Vimwiki{Make,TabMake,MakeYesterday,MakeTomorrow}DiaryNote`
|
||||||
+ `VimwikiDiaryIndex` (and the `Nuwiki*` forms) carry `-count=0`, where the
|
+ `VimwikiDiaryIndex` (and the `Nuwiki*` forms) carry `-count=0`, where the
|
||||||
count selects the wiki number. _Fix:_ a real wiki selector end-to-end —
|
count selects the wiki number. _Fix:_ a real wiki selector end-to-end —
|
||||||
- Server (`commands.rs`): `OptUriArg` gained an optional `wiki` selector and
|
- Server (`commands.rs`): `OptionalUriArg` gained an optional `wiki` selector
|
||||||
`resolve_diary_wiki(backend, uri, wiki)` now prefers it (via the existing
|
and `resolve_diary_wiki(backend, uri, wiki)` now prefers it (via the existing
|
||||||
`resolve_wiki_selector`, reused — accepts a 0-indexed number) over the
|
`resolve_wiki_selector`, reused — accepts a 0-indexed number) over the
|
||||||
buffer URI; used by `diary_open_relative` + `diary_open_index`.
|
buffer URI; used by `diary_open_relative` + `diary_open_index`.
|
||||||
- Clients: `s:diary_open`/`diary_open` (both clients) and
|
- Clients: `s:diary_open`/`diary_open` (both clients) and
|
||||||
|
|||||||
@@ -310,9 +310,16 @@ end
|
|||||||
|
|
||||||
-- ===== Diary =====
|
-- ===== Diary =====
|
||||||
|
|
||||||
|
-- `count` is vimwiki's diary `-count` — a wiki number (1-indexed at the user
|
||||||
|
-- level). When > 0 the server acts on that wiki (`wiki = count - 1`) instead
|
||||||
|
-- of the buffer's. next/prev ignore it.
|
||||||
local function _diary_open(cmd_name, tab)
|
local function _diary_open(cmd_name, tab)
|
||||||
return function()
|
return function(count)
|
||||||
exec(cmd_name, uri_args(), function(r)
|
local args = uri_args()
|
||||||
|
if count and count > 0 then
|
||||||
|
args[1].wiki = count - 1
|
||||||
|
end
|
||||||
|
exec(cmd_name, args, function(r)
|
||||||
if r and r.uri then open_uri(r.uri, tab) end
|
if r and r.uri then open_uri(r.uri, tab) end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user