222 lines
7.8 KiB
VimL
222 lines
7.8 KiB
VimL
|
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
|