dotfiles/.vim/pack/plugins/opt/vim-taskwarrior/autoload/taskwarrior.vim

222 lines
7.8 KiB
VimL
Raw Normal View History

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