Compare commits

..

2 Commits

Author SHA1 Message Date
24cadefafc doc: denote link completion 2026-02-19 16:19:18 +01:00
83ea4f2bcf feat: denote link completion 2026-02-19 15:56:08 +01:00
5 changed files with 84 additions and 13 deletions

View File

@@ -32,15 +32,22 @@ the help files. This will allow you to get more help using `:help denote` or
similar commands.
### Usage
For following links, simply move your cursor to the denote link, and press
For _following links,_ simply move your cursor to the denote link, and press
`gf`.
Browsing and searching notes is implemented using the [location
This package also provides denote _link completion_ using the
[|'omnifunc'|](https://vimhelp.org/options.txt.html#%27omnifunc%27) option. So,
the link is completed after pressing `<C-X><C-O>` while typing any prefix of a
denote link `denote:<identifier>`. Even more so, if this completion is invoked
after typing `denote:<str>`, then the link is completed for denote entries
that have `<str>` as part of the title.
_Browsing_ and _searching notes_ is implemented using the [location
list](https://vimhelp.org/quickfix.txt.html#location-list).
So, after running any of the following commands, you may navigate your notes
using, e.g., `:lopen` to open the list, `:lnext` and `:lprev`, to move to the next or
previous entry (the list does not need to be opened for that), and `:lclose`
for closing the location list.
This means that you may navigate your notes using, e.g., `:lopen` to open the
list, `:lnext` and `:lprev`, to move to the next or previous entry (the list
does not need to be opened for that), and `:lclose` for closing the location
list.
#### Commands
This package defines the following user commands:

View File

@@ -1,3 +1,6 @@
" Link completion {{{1
set omnifunc=denote#completion#get
" Go to file command |gf| adjustments {{{1
" This resolves denote links. The function has access to the variable v:fname,
" which corresponds to the filename under the cursor.

View File

@@ -0,0 +1,59 @@
" Find the column where the completion starts. This must be between 1 and
" col('.'). Denote links are of this form: `denote:<identifier>`.
function s:column()
" Get the substring from the start of the line until col('.')
let l = getline(".")[:col('.')]
" Take the shortest prefix of a denote link. This may be any of
" \<d$
" ..
" \<denote:$
" \<denote:\f$
" \<denote:\f\f$
" etc.
let res = l->matchstrpos('\<denote:\f*$')
if res[1] >= 0
return res[1]
endif
let res = l->matchstrpos('\<d\f*$')
if res[1] == -1
return -3
endif
return 'denote:' =~ '^' .. res[0] ? res[1] : -3
endfunction
" Return completion items given by the base
function s:suggestions(base)
let prefix = a:base->matchstr('^denote:\zs.*$')
let flist = glob(prefix ? "*" .. prefix .. "*" : "*", 0, v:true)
let res = []
for filename in flist
let noteId = denote#meta#noteIdFromFile(filename)
let noteTitle = denote#meta#noteTitleFromFile(filename)
if noteId == v:false || (noteId !~ '^' .. prefix && noteTitle !~ prefix)
continue
endif
let noteTitle = noteTitle ?? '(no title)'
let noteTags = denote#meta#noteTagsFromFile(filename)
let res = res->add({
\ 'word' : 'denote:' .. noteId,
\ 'abbr' : noteTitle,
\ 'menu' : noteTags->join(', ')
\ })
endfor
return res
endfunction
function! Myomni(findstart, base)
if a:findstart == 1
let tmp = s:column()
return tmp
else
let tmp = s:suggestions(a:base)
return tmp
endif
endfunction
" Completion function for denote links
function denote#completion#get(findstart, base)
return a:findstart == 1 ? s:column() : s:suggestions(a:base)
endfunction

View File

@@ -23,10 +23,9 @@ function denote#meta#noteIdFromFile(filename)
\ ?? v:false
endfunction
" Return the note title from the filename. On failure, v:false is returned.
" Return the note title from the filename.
function denote#meta#noteTitleFromFile(filename)
return a:filename->matchstr("--\\zs.\\{-\\}\\ze\\(==\\|@@\\|__\\|\\..\\)")->substitute("-", " ", "g")
\ ?? v:false
endfunction
" Return the note tags from the filename as a list.

View File

@@ -21,7 +21,7 @@ do adjusting the tags or changing the title of a note. The official manual is
available online:
https://protesilaos.com/emacs/denote
The denote plugin adds denote-functionality to vim --- the vim way. We are
The denote plugin adds denote functionality to vim --- _the vim way._ We are
aware of two other plugins, but we fear that these plugins are not flexible
enough, and more importantly, do not follow the vim philosophy for handling
denote notes. These mentioned plugins are available here:
@@ -29,10 +29,13 @@ denote notes. These mentioned plugins are available here:
https://git.sr.ht/~ashton314/vim-denote
In contrast to these plugins, the present package relies on the
|location-list| features for displaying denote entries, and on and
|'includeexpr'| option for following the links (see, |gf|). This plugin also
provides custom location-list formatting using the option
|'quickfixtextfunc'|.
|location-list| features for displaying denote entries, and on the options
|'quickfixtextfunc'|, |'includeexpr'|, and |'omnifunc'|. With these, denote
links can be followed using |gf|, and completed using omni comletion (see,
|compl-omni|). For link completion, press |i_CTRL-X_CTRL-O| after typing any
prefix of a denote link. This completion also works with titles: by invoking
omni completion after typing "denote:foo", denote links are completed for
entries containing "foo" in the title.
*denote-commands*
Commands ~