diff --git a/plugin/papis.vim b/plugin/papis.vim index 12aa5d6..2b12f39 100644 --- a/plugin/papis.vim +++ b/plugin/papis.vim @@ -4,36 +4,50 @@ function! s:yank_to_register(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 lines = a:a - if lines == [] || lines == ['','',''] + 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 query = lines[0] - let keypress = lines[1] - let cmd = "normal a" - let pat = '@\v(.{-})$' + 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 keypress ==? "ctrl-y" - let hashes = join(filter(map(lines[2:], 'matchlist(v:val, pat)[1]'), 'len(v:val)'), "\n") - return s:yank_to_register(hashes) + 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 - let citations = lines[2:] - let candidates = [] - for line in citations - let id = matchlist(line, pat)[1] - call add(candidates, substitute(id, "/", "", "g")) - endfor + " 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 - - execute "normal a\\cite{" . join(candidates, ", ") . "}\egql" endfunction +let g:PapisFormat = '"{doc[author]}: {doc[title]}' command! -bang -nargs=* Papis - \ call fzf#run(fzf#wrap({'source': 'papis list --format "{doc[author]}: {doc[title]} @{doc[ref]}"', 'sink*': function('handler'), 'options': '--multi --expect=ctrl-y --print-query'})) - + \ call fzf#run(fzf#wrap({'source': 'papis list --format ' . g:PapisFormat . ' @{doc[ref]}"', 'sink*': function('handler'), 'options': '--multi --expect=ctrl-y --print-query'}))