if !exists('g:todo_project_context') let g:todo_project_context = '' endif command! -nargs=* Todo call Todo() command! -nargs=+ TodoAdd call TodoAdd() command! -nargs=* -complete=customlist,CompleteTodoList TodoList call TodoList() command! -nargs=0 TodoListProjects call TodoListProj() command! -nargs=0 TodoListContexts call TodoListCon() nnoremap tl :TodoList nnoremap ta :TodoAdd function! TodoList(args) let list_args = a:args if match(list_args, g:todo_project_context) == -1 let list_args .= " " . g:todo_project_context endif call Todo('list ' . list_args) nnoremap q :q execute 'nnoremap o :call TodoAddInput():TodoList ' . list_args . '' execute 'nnoremap r :TodoList ' . list_args . '' execute 'nnoremap d :silent call TodoDoneCurrent():TodoList ' . list_args . '' execute 'nnoremap D :silent call TodoDeleteCurrent():TodoList ' . list_args . '' execute 'nnoremap p :call TodoPriorityCurrent():TodoList ' . list_args . '' execute 'nnoremap P :call TodoAppendProjectCurrent():TodoList ' . list_args . '' execute 'nnoremap C :call TodoAppendContextCurrent():TodoList ' . list_args . '' execute 'nnoremap + :silent call TodoPriorityAdjust(-1):TodoList ' . list_args . '' execute 'nnoremap - :silent call TodoPriorityAdjust(1):TodoList ' . list_args . '' endfunction function! TodoPriorityAdjust(amount) let id = TodoCurrentLineId() let item = getline('.') let priorities = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] let index = 0 while index < len(priorities) let p = priorities[index] if match(item, "(" . p . ")") > -1 if index + a:amount >= len(priorities) call TodoAction('pri ' . id . ' ' . priorities[0]) else call TodoAction('pri ' . id . ' ' . priorities[index + a:amount]) endif break endif let index += 1 endwhile if index == len(priorities) call TodoAction('pri ' . id . ' ' . priorities[0]) endif endfunction function! TodoAddInput() call inputsave() let task = input("Task: ") if len(g:todo_project_context) > 0 let task .= " " . g:todo_project_context endif call inputrestore() call TodoAction('add "' . task . '"') endfunction function! TodoCurrentLineId() let row = split(getline('.')) return row[0] endfunction function! TodoDoneCurrent() let id = TodoCurrentLineId() call TodoAction('do ' . id) endfunction function! TodoDeleteCurrent() let id = TodoCurrentLineId() call TodoAction('rm ' . id) endfunction function! TodoPriorityCurrent() let id = TodoCurrentLineId() call inputsave() let priority = input("Priority (A-Z): ", "A") call inputrestore() call TodoAction('pri ' . id . ' ' . priority) endfunction function! TodoAppendContextCurrent() let id = TodoCurrentLineId() call inputsave() let context = input("Context: ", "@", "customlist,CompleteTodoProjects") call inputrestore() call TodoAction('append ' . id . ' ' . context) endfunction function! TodoAppendProjectCurrent() let id = TodoCurrentLineId() call inputsave() let project = input("Project: ", "+", "customlist,CompleteTodoProjects") call inputrestore() call TodoAction('append ' . id . ' ' . project) endfunction function! TodoListProj() call TodoAction('listproj') endfunction function! TodoListCon() call TodoAction('listcon') endfunction function! TodoAdd(args) call TodoAction('add "' . a:args . ' ' . g:todo_project_context . '"') endfunction function! CompleteTodo(type, arg_lead, cmd_line, cursor_pos) let opts = split(SystemTodo('list' . a:type)) return filter(opts, 'match(v:val, ''\V'' . a:arg_lead) == 0') endfunction function! CompleteTodoContexts(arg_lead, cmd_line, cursor_pos) return CompleteTodo('con', a:arg_lead, a:cmd_line, a:cursor_pos) endfunction function! CompleteTodoProjects(arg_lead, cmd_line, cursor_pos) return CompleteTodo('proj', a:arg_lead, a:cmd_line, a:cursor_pos) endfunction function! CompleteTodoList(arg_lead, cmd_line, cursor_pos) let opts = [ ] if !strlen(a:arg_lead) || a:arg_lead =~ '^+' let opts += CompleteTodoProjects(a:arg_lead, a:cmd_line, a:cursor_pos) endif if !strlen(a:arg_lead) || a:arg_lead =~ '^@' let opts += CompleteTodoContexts(a:arg_lead, a:cmd_line, a:cursor_pos) endif return opts endfunction function! TodoAction(args) echo SystemTodo(a:args) endfunction function! Todo(args) let todo_output = SystemTodo(a:args) if !strlen(todo_output) echo "No output from todo command" return endif call OpenTodoBuffer(todo_output) setlocal filetype=todo-list endfunction function! s:SystemTodo(args) let default_args = DefaultTodoArgs() return system('todo.sh ' . default_args . ' ' . a:args . ' < /dev/null') endfunction function! s:DefaultTodoArgs() let args = '-p' if exists('g:todotxt_cfg_file') && strlen(g:todotxt_cfg_file) args += ' -d ' . g:todotxt_cfg_file endif return args endfunction function! s:OpenTodoBuffer(content) if exists('b:is_todo_output_buffer') && b:is_todo_output_buffer enew! else new endif setlocal buftype=nofile readonly modifiable silent put=a:content keepjumps 0d setlocal nomodifiable let b:is_todo_output_buffer = 1 endfunction