diff --git a/autoload/nuwiki/commands.vim b/autoload/nuwiki/commands.vim index 7dccae3..8ef0141 100644 --- a/autoload/nuwiki/commands.vim +++ b/autoload/nuwiki/commands.vim @@ -419,32 +419,37 @@ endfunction " ===== Diary ===== -function! s:diary_open(cmd_name, ...) abort - let l:open = a:0 >= 1 ? a:1 : 'edit' - call s:exec(a:cmd_name, [{ 'uri': s:buf_uri() }], - \ {n -> s:open_uri_from(n, l:open)}) +" `a:open` is the window command ('edit'/'tabedit'); `a:count` is vimwiki's +" diary `-count` — a wiki number (1-indexed at the user level). When > 0 the +" server acts on that wiki instead of the buffer's. +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 -function! nuwiki#commands#diary_today() abort - call s:diary_open('nuwiki.diary.openToday') +function! nuwiki#commands#diary_today(...) abort + call s:diary_open('nuwiki.diary.openToday', 'edit', a:0 >= 1 ? a:1 : 0) endfunction -function! nuwiki#commands#diary_today_tab() abort - call s:diary_open('nuwiki.diary.openToday', 'tabedit') +function! nuwiki#commands#diary_today_tab(...) abort + call s:diary_open('nuwiki.diary.openToday', 'tabedit', a:0 >= 1 ? a:1 : 0) endfunction -function! nuwiki#commands#diary_yesterday() abort - call s:diary_open('nuwiki.diary.openYesterday') +function! nuwiki#commands#diary_yesterday(...) abort + call s:diary_open('nuwiki.diary.openYesterday', 'edit', a:0 >= 1 ? a:1 : 0) endfunction -function! nuwiki#commands#diary_tomorrow() abort - call s:diary_open('nuwiki.diary.openTomorrow') +function! nuwiki#commands#diary_tomorrow(...) abort + call s:diary_open('nuwiki.diary.openTomorrow', 'edit', a:0 >= 1 ? a:1 : 0) endfunction -function! nuwiki#commands#diary_index() abort - call s:diary_open('nuwiki.diary.openIndex') +function! nuwiki#commands#diary_index(...) abort + call s:diary_open('nuwiki.diary.openIndex', 'edit', a:0 >= 1 ? a:1 : 0) endfunction function! nuwiki#commands#diary_next() abort - call s:diary_open('nuwiki.diary.next') + call s:diary_open('nuwiki.diary.next', 'edit', 0) endfunction function! nuwiki#commands#diary_prev() abort - call s:diary_open('nuwiki.diary.prev') + call s:diary_open('nuwiki.diary.prev', 'edit', 0) endfunction function! nuwiki#commands#diary_generate_index() abort call s:exec('nuwiki.diary.generateIndex', [{ 'uri': s:buf_uri() }]) diff --git a/crates/nuwiki-lsp/src/commands.rs b/crates/nuwiki-lsp/src/commands.rs index d169cba..df8840f 100644 --- a/crates/nuwiki-lsp/src/commands.rs +++ b/crates/nuwiki-lsp/src/commands.rs @@ -308,6 +308,11 @@ fn parse_uri_arg(args: Vec) -> Result { struct OptionalUriArg { #[serde(default)] uri: Option, + /// 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, } fn parse_optional_uri_arg(args: Vec) -> Result { @@ -522,7 +527,7 @@ fn diary_list(backend: &Backend, args: Vec) -> Result, Stri Some(v) => serde_json::from_value(v).map_err(|e| format!("invalid args: {e}"))?, 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!([]))); }; let entries = { @@ -556,7 +561,7 @@ fn diary_open_for_date(backend: &Backend, args: Vec) -> Result) -> Result, Str Some(v) => serde_json::from_value(v).map_err(|e| format!("invalid args: {e}"))?, 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!([]))); }; let hits = { @@ -653,7 +658,7 @@ fn tags_rebuild(backend: &Backend, args: Vec) -> Result, St let targets: Vec = if all { backend.wikis_snapshot() } else { - match resolve_diary_wiki(backend, p.uri.as_ref()) { + match resolve_diary_wiki(backend, p.uri.as_ref(), None) { Some(w) => vec![w], None => return Ok(None), } @@ -1171,7 +1176,7 @@ fn export_current( fn export_all(backend: &Backend, args: Vec, force: bool) -> Result, String> { 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); }; let cfg = wiki.config.clone(); @@ -1248,7 +1253,7 @@ fn export_all(backend: &Backend, args: Vec, force: bool) -> Result