diff --git a/after/ftplugin/markdown.vim b/after/ftplugin/markdown.vim index 19bb301..2f8a3fa 100644 --- a/after/ftplugin/markdown.vim +++ b/after/ftplugin/markdown.vim @@ -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. diff --git a/autoload/denote/completion.vim b/autoload/denote/completion.vim new file mode 100644 index 0000000..5053784 --- /dev/null +++ b/autoload/denote/completion.vim @@ -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:`. +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 + " \matchstrpos('\= 0 + return res[1] + endif + let res = l->matchstrpos('\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 diff --git a/autoload/denote/meta.vim b/autoload/denote/meta.vim index 41eb41e..3c5b00d 100644 --- a/autoload/denote/meta.vim +++ b/autoload/denote/meta.vim @@ -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.