papis-vim/plugin/papis.vim
koalp c2d20b238e
fix: make list of citations in fzf work again
The command used by fzf for listing citations was not working anymore
because the command used in fzf is launching an interactive selector.

Therefore , the --all option have been added in order to mitigate the
issue.

This is a dirty workaround
2020-02-23 05:21:08 +01:00

119 lines
3.1 KiB
VimL

function! s:yank_to_register(data)
let @" = a:data
silent! let @* = a:data
silent! let @+ = a:data
endfunction
function! s:get_reference(line)
let l:pat='@\v(.*)$'
return substitute(matchlist(a:line, l:pat)[1], "/", "", "g")
endfunction
function! s:inside_cite_body()
execute "silent! normal! mq?\\\\cite\\|}\r"
let l:inbody = getline('.')[col('.')-1: col('.') + 3] ==# '\cite'
execute "normal! `q"
return l:inbody
endfunction
function! s:handler(a)
let l:lines = a:a
if l:lines == [] || l:lines == ['','','']
return
endif
" Expect at least 2 elements, `query` and `keypress`, which may be empty
" strings.
let l:keypress = l:lines[1]
let l:citations = l:lines[2:]
let l:candidates = []
" Making list of the things to cite
for l:line in l:citations
call add(l:candidates, s:get_reference(l:line))
endfor
" it is possible to yank the doc id using the ctrl-y keypress
if l:keypress ==? "ctrl-y"
execute s:yank_to_register(join(l:candidates, "\n"))
" this will insert \cite{id} command for all selected citations
else
" If you are already in a \cite{} body
if s:inside_cite_body()
execute "normal! \/\}\rgea, " . join(l:candidates, ", ") ."\e"
" start a fresh \cite{} body
else
execute "normal! a\\cite{" . join(l:candidates, ", ") . "}\e"
endif
endif
endfunction
let g:PapisFormat = '"{doc[author]}: {doc[title]}'
let g:PapisBackend = ''
function! s:getPapisBackend()
if g:PapisBackend ==# ''
let g:PapisBackend = systemlist('papis config database-backend')[0]
endif
return g:PapisBackend
endfunction
function! s:Papis(searchline)
let l:searchinp = a:searchline
if l:searchinp ==# ''
if s:getPapisBackend() ==# "whoosh"
let l:searchinp = '"*"'
endif
endif
call fzf#run(fzf#wrap({'source': 'papis list ' . l:searchinp . ' --format ' . g:PapisFormat . ' @{doc[ref]}"' . ' --all', 'sink*': function('s:handler'), 'options': '--multi --expect=ctrl-y --print-query'}))
endfunction
command! -bang -nargs=* Papis call s:Papis('<args>')
function! s:get_citeref(cite, full_list)
for l:ref in a:full_list
if a:cite ==# substitute(l:ref, "/", "", "g")
return l:ref
endif
endfor
endfunction
function! s:get_all_citerefs()
return systemlist('papis list "ref:*" --format "{doc[ref]}"')
endfunction
function! s:get_cite_under_cursor()
if s:inside_cite_body()
if getline('.')[col('.') -1] ==# ','
return
endif
execute "silent! normal! mq/[}{]\r"
if getline('.')[col('.') -1] ==# '{'
execute "silent! normal! `q"
return
endif
execute "silent! normal! `q"
execute "silent! normal! ?[{,]\rwv/[,}]\rge\"qy`q"
return @q
endif
endfunction
function! s:PapisView()
if s:getPapisBackend() !=# "whoosh"
echom "PapisView only works for Papis with whoosh as database-backend at the moment"
return
endif
let l:cite = s:get_cite_under_cursor()
if l:cite ==# ""
return
endif
let l:full_list = s:get_all_citerefs()
let l:ref = s:get_citeref(l:cite, l:full_list)
call system('papis open "ref:' . l:ref . '"')
endfunction
command! -bang PapisView call s:PapisView()