dotfiles/.vim/pack/plugins/opt/vim-taskwarrior/autoload/taskwarrior.vim
2024-02-14 16:20:07 +01:00

222 lines
7.8 KiB
VimL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function! taskwarrior#list(...) abort
setlocal noreadonly
setlocal modifiable
let pos = getpos('.')
%delete
call taskwarrior#buffer_var_init()
let b:command = get(a:, 1, b:command)
let b:filter = get(a:, 2, b:filter)
let b:type = get(a:, 3, b:type)
let b:rc = get(a:, 4, b:rc). ' rc.defaultheight=0'
let b:rc .= ' '.join(filter(split(b:filter, ' '), "v:val =~ '^rc\..*'"))
let b:filter = join(filter(split(b:filter, ' '), "v:val !~ '^rc\..*'"))
let rcs = split(b:rc, ' ')
let b:rc = join(filter(copy(rcs), "match(rcs, matchstr(v:val, '^[^=:]*'), v:key+1) == -1"), ' ')
if b:type == 'special'
setlocal buftype=nofile
call append(0, split(system('task '.b:rc.' '.b:filter.' '.b:command), '\n'))
silent global/^[\t ]*$/delete
execute 'setlocal filetype=task_'.b:command
nnoremap <buffer> q :call taskwarrior#Bclose(bufnr('%'))<CR>
call setpos('.', pos)
return
endif
let b:hist = get(b:, 'hist', 1)
call taskwarrior#log#history('write')
let rcc = matchstr(b:rc, 'rc\.report\.'.b:command.'\.columns.\zs\S*')
let rcl = matchstr(b:rc, 'rc\.report\.'.b:command.'\.labels.\zs\S*')
" let b:task_report_columns = rcc == '' ? split(system("task _get -- rc.report.".b:command.".columns")[0:-2], ',') : split(rcc, ',')
" let b:task_report_labels = rcl == '' ? split(system("task _get -- rc.report.".b:command.".labels")[0:-2], ',') : split(rcl, ',')
let b:task_report_columns = rcc == '' ? split(matchstr(system("task show |grep report.".b:command.".columns")[0:-2], '\S*$'), ',') : split(rcc, ',')
let b:task_report_labels = rcl == '' ? split(matchstr(system("task show |grep report.".b:command.".labels")[0:-2], '\S*$'), ',') : split(rcl, ',')
let line1 = join(b:task_report_labels, ' ')
let context = split(substitute(
\ system('task '.b:rc.' '.b:filter.' '.b:command),
\ '\[[0-9;]\+m',
\ '', 'g'),
\ '\n')
let split_lineno = match(context, '^[ -]\+$')
if split_lineno == -1
call append(0, line1)
else
let end = len(context)-match(reverse(copy(context)), '^$')
call append(0, context[split_lineno-1:end-1])
silent global/^[\t ]*$/delete
silent global/^[ -]\+$/delete
endif
call filter(b:task_report_columns, "index(split(getline(1), ' '), b:task_report_labels[v:key]) != -1")
call filter(b:task_report_labels, "index(split(getline(1), ' '), v:val) != -1")
let b:task_columns = []
let ci = 0
1
while ci != -1
let b:task_columns += [ci]
let ci = search('\s\S', 'W', 1)
let ci = ci > 0 ? virtcol('.') : -1
endwhile
let b:task_columns += [999]
let b:summary = taskwarrior#data#global_stats()
let b:sort = taskwarrior#sort#order_list()[0]
let a_tasks = split(system('task active limit:1 rc.verbose:nothing
\ rc.report.active.sort=start-
\ rc.report.active.columns=start.active,start.age,id,description.desc
\ rc.report.active.labels=A,Age,ID,Description'), '\n')
let b:now = len(a_tasks) > 0 ? a_tasks[-1] : ''
let b:active = split(system('task start.any: count'), '\n')[0]
let b:selected = []
let b:sline = []
let b:sstring = ''
let con = split(system('task context show'), '\n')[0]
let b:context = con =~ 'No context' ? 'none' :
\ matchstr(con, 'Context .\zs\S*\ze. ')
setlocal filetype=taskreport
if exists('b:ct')
for l in range(line('$'))
if taskwarrior#data#get_uuid(l) == b:ct
let pos[1] = l
break
endif
endfor
endif
call setpos('.', pos)
endfunction
function! taskwarrior#buffer_var_init()
let b:command = get(b:, 'command', g:task_report_name)
let b:filter = get(b:, 'filter', '')
let b:type = get(b:, 'type', 'report')
let b:rc = get(b:, 'rc', g:task_rc_override)
endfunction
function! taskwarrior#init(...)
if exists(':TagbarClose')
TagbarClose
endif
let argstring = join(a:000, ' ')
let [command, filter, type] = taskwarrior#command_type(argstring)
let rc = g:task_rc_override
if type == 'interactive'
if !g:task_readonly
execute '!task '.argstring
call taskwarrior#refresh()
endif
return
endif
execute 'edit task\ '.command.'\ '.type
if exists('g:task_view')
let g:task_view += [bufnr('%')]
else
let g:task_view = [bufnr('%')]
endif
setlocal noswapfile
call taskwarrior#list(command, filter, type, rc)
endfunction
function! taskwarrior#refresh()
if exists('g:task_view')
for bufn in g:task_view
execute bufn.'buffer'
call taskwarrior#list()
endfor
else
call taskwarrior#init()
endif
endfunction
function! taskwarrior#Bclose(buffer)
if a:buffer =~ '^\d\+$'
let btarget = bufnr(str2nr(a:buffer))
else
let btarget = bufnr(a:buffer)
endif
if bufname(btarget) == ''
bdelete
return
endif
" Numbers of windows that view target buffer which we will delete.
let wnums = filter(range(1, winnr('$')), 'winbufnr(v:val) == btarget')
let wcurrent = winnr()
for w in wnums
execute w.'wincmd w'
let prevbuf = bufnr('#')
if prevbuf > 0 && buflisted(prevbuf) && prevbuf != w
buffer #
else
bprevious
endif
if btarget == bufnr('%')
" Numbers of listed buffers which are not the target to be deleted.
let blisted = filter(range(1, bufnr('$')), 'buflisted(v:val) && v:val != btarget')
" Listed, not target, and not displayed.
let bhidden = filter(copy(blisted), 'bufwinnr(v:val) < 0')
" Take the first buffer, if any (could be more intelligent).
let bjump = (bhidden + blisted + [-1])[0]
if bjump > 0
execute 'buffer '.bjump
else
enew
endif
endif
endfor
execute 'silent! bdelete '.btarget
execute wcurrent.'wincmd w'
endfunction
function! taskwarrior#hi_field()
silent! syntax clear taskwarrior_field
let index = taskwarrior#data#current_index()
execute 'syntax match taskwarrior_field /\%>1l\%'.line('.').'l\%'.(b:task_columns[index]+1).'v.*\%<'.(b:task_columns[index+1]+1).'v/'
endfunction
function! taskwarrior#quit()
call taskwarrior#Bclose(bufnr('%'))
call remove(g:task_view, index(g:task_view, bufnr('%')))
endfunction
function! taskwarrior#quit_all()
for bufn in g:task_view
call taskwarrior#Bclose(bufn)
endfor
let g:task_view = []
endfunction
function! taskwarrior#system_call(filter, command, args, mode)
if a:mode == 'silent'
call system('task '.a:filter.' '.a:command.' '.a:args)
elseif a:mode == 'echo'
echo "\n----------------\n"
echo system('task '.a:filter.' '.a:command.' '.a:args)
else
execute '!task '.a:filter.' '.a:command.' '.a:args
endif
call taskwarrior#refresh()
endfunction
function! taskwarrior#command_type(string)
for sub in split(a:string, ' ')
if index(g:task_report_command, sub) != -1
return [ sub, substitute(' '.a:string, ' '.sub, '', ''), 'report' ]
elseif index(g:task_interactive_command, sub) != -1
return [ sub, substitute(' '.a:string, ' '.sub, '', ''), 'interactive' ]
elseif index(g:task_all_commands, sub) != -1
return [ sub, substitute(' '.a:string, ' '.sub, '', ''), 'special' ]
endif
endfor
return [ g:task_report_name, a:string, 'report' ]
endfunction