Initial commit

This commit is contained in:
2026-02-17 16:18:18 +01:00
commit 4e06bec5ef
6 changed files with 215 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
" Clear location list
function denote#loclist#clear()
call setloclist(0, [], ' ')
endfunction
" Local helper function to retrieve and format the title.
function s:titleFromBuf(buf)
let name=denote#meta#noteTitleFromFile(bufname(a:buf))
return strchars(name, 1) <= g:denote_loc_title_columns
\ ? printf('%' .. g:denote_loc_title_columns .. 's', name)
\ : printf('%.' .. (g:denote_loc_title_columns - 1) .. 's', name) .. '…'
endfunction
" Local helper function to truncate text with match at the given column as a
" string of at most `width` columns.
function s:formatText(text, col, width)
return a:col <= a:width
\ ? a:text
\ : a:text[a:col-float2nr(a:width*0.3):]
endfunction
" This modifies the location list for pretty display.
function denote#loclist#textReferences(info)
let items=getloclist(a:info.winid)
let l=[]
let width=winwidth(0) - g:denote_loc_title_columns - 19
for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
let e=items[idx]
let name=s:titleFromBuf(e.bufnr)
let lnum=printf('%5d', e.lnum)
let col=printf('%3d', e.col)
call add(l, name ..
\ ' | ' .. lnum .. ' col ' .. col ..
\ ' | ' .. s:formatText(items[idx].text, col, width))
endfor
return l
endfunction
" This modifies the location list for pretty display.
function denote#loclist#textNoteList(info)
let items=getloclist(a:info.winid)
let l=[]
for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
let e=items[idx]
let name=s:titleFromBuf(e.bufnr)
let ntags=denote#meta#noteTagsFromFile(bufname(e.bufnr))->join()
call add(l, name .. ' | ' .. ntags)
endfor
return l
endfunction
" Load all references to the given note into the location list.
function denote#loclist#references(noteId)
" Populate location list
execute "lvimgrep /\\<denote:" .. a:noteId .. "\\>/gj *"
" Adjust location list: set title and specify display function
let file=denote#meta#fileFromNoteId(a:noteId)
let noteTitle=denote#meta#noteTitleFromFile(file)
call setloclist(0, [], 'r',
\ {'title': 'References to ' .. noteTitle .. ' (' .. a:noteId .. ')',
\ 'quickfixtextfunc' : 'denote#loclist#textReferences'})
endfunction

36
autoload/denote/meta.vim Normal file
View File

@@ -0,0 +1,36 @@
" Return the filename of the note with id `noteId`. If the file is note found,
" then v:false is returned.
function denote#meta#fileFromNoteId(noteId)
" According to the file-naming scheme, the note id is prefixed with '@@'. If
" the note id appears at the beginning of the filename, then this prefix is
" optional. There may exist another field (such as the signature, title, or
" keywords field) after the note id. These are prefixed with '==', '--', or
" '__'. If the note id is the last field, then the id is followed by the file
" extension, e.g., '.md'.
" (A) First, we get all files that contain the note id as substring.
" (B) Then we ensure that the note id is followed by another field or by the
" file extension.
let files = glob("*" .. a:noteId .. "*", 0, v:true)
\ ->filter('v:val =~ "' .. a:noteId .. '\\(==\\|--\\|__\\|\\.\\)"')
\ ->filter('v:val =~ "^' .. a:noteId .. '\\|@@' .. a:noteId .. '"')
return empty(files) ? v:false : files[0]
endfunction
" Return the note id from the filename. On failure, v:false is returned.
function denote#meta#noteIdFromFile(filename)
return a:filename->matchstr("@@\\zs.\\{-\\}\\ze\\(==\\|--\\|__\\|\\..\\)")
\ ?? a:filename->matchstr("^.\\{-\\}\\ze\\(==\\|--\\|__\\|\\..\\)")
\ ?? v:false
endfunction
" Return the note title from the filename. On failure, v:false is returned.
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.
function denote#meta#noteTagsFromFile(filename)
return a:filename->matchstr("__\\zs.\\{-\\}\\ze\\(==\\|@@\\|--\\|\\..\\)")->split("_")
\ ?? []
endfunction