mirror of
https://github.com/freitass/todo.txt-vim.git
synced 2025-11-16 13:53:47 -05:00
The commita612ebe('Remove trailing whitespaces') removed the whitespace which was after 'x' markup. It caused to mark the completed task without space and didn't allow to remove it automatically. Before this change: xCOMPLETION_DATE .... After this change: x COMPLETION_DATE ... Fixes:a612ebe('Remove trailing whitespaces') Signed-off-by: Leon Romanovsky <leon@leon.nu>
124 lines
3.7 KiB
VimL
124 lines
3.7 KiB
VimL
" File: todo.txt.vim
|
||
" Description: Todo.txt filetype detection
|
||
" Author: Leandro Freitas <freitass@gmail.com>
|
||
" License: Vim license
|
||
" Website: http://github.com/freitass/todo.txt-vim
|
||
" Version: 0.4
|
||
|
||
" Export Context Dictionary for unit testing {{{1
|
||
function! s:get_SID()
|
||
return matchstr(expand('<sfile>'), '<SNR>\d\+_')
|
||
endfunction
|
||
let s:SID = s:get_SID()
|
||
delfunction s:get_SID
|
||
|
||
function! todo#txt#__context__()
|
||
return { 'sid': s:SID, 'scope': s: }
|
||
endfunction
|
||
|
||
" Functions {{{1
|
||
function! s:remove_priority()
|
||
:s/^(\w)\s\+//ge
|
||
endfunction
|
||
|
||
function! s:get_current_date()
|
||
return strftime('%Y-%m-%d')
|
||
endfunction
|
||
|
||
function! todo#txt#prepend_date()
|
||
execute 'normal! I' . s:get_current_date() . ' '
|
||
endfunction
|
||
|
||
function! todo#txt#replace_date()
|
||
let current_line = getline('.')
|
||
if (current_line =~ '^\(([a-zA-Z]) \)\?\d\{2,4\}-\d\{2\}-\d\{2\} ') &&
|
||
\ exists('g:todo_existing_date') && g:todo_existing_date == 'n'
|
||
return
|
||
endif
|
||
execute 's/^\(([a-zA-Z]) \)\?\(\d\{2,4\}-\d\{2\}-\d\{2\} \)\?/\1' . s:get_current_date() . ' /'
|
||
endfunction
|
||
|
||
function! todo#txt#mark_as_done()
|
||
call s:remove_priority()
|
||
call todo#txt#prepend_date()
|
||
execute 'normal! Ix '
|
||
endfunction
|
||
|
||
function! todo#txt#mark_all_as_done()
|
||
:g!/^x /:call todo#txt#mark_as_done()
|
||
endfunction
|
||
|
||
function! s:append_to_file(file, lines)
|
||
let l:lines = []
|
||
|
||
" Place existing tasks in done.txt at the beggining of the list.
|
||
if filereadable(a:file)
|
||
call extend(l:lines, readfile(a:file))
|
||
endif
|
||
|
||
" Append new completed tasks to the list.
|
||
call extend(l:lines, a:lines)
|
||
|
||
" Write to file.
|
||
call writefile(l:lines, a:file)
|
||
endfunction
|
||
|
||
function! todo#txt#remove_completed()
|
||
" Check if we can write to done.txt before proceeding.
|
||
|
||
let l:target_dir = expand('%:p:h')
|
||
let l:todo_file = expand('%:p')
|
||
let l:done_file = substitute(substitute(l:todo_file, 'todo.txt$', 'done.txt', ''), 'Todo.txt$', 'Done.txt', '')
|
||
if !filewritable(l:done_file) && !filewritable(l:target_dir)
|
||
echoerr "Can't write to file 'done.txt'"
|
||
return
|
||
endif
|
||
|
||
let l:completed = []
|
||
:g/^x /call add(l:completed, getline(line(".")))|d
|
||
call s:append_to_file(l:done_file, l:completed)
|
||
endfunction
|
||
|
||
function! todo#txt#sort_by_context() range
|
||
execute a:firstline . "," . a:lastline . "sort /\\(^\\| \\)\\zs@[^[:blank:]]\\+/ r"
|
||
endfunction
|
||
|
||
function! todo#txt#sort_by_project() range
|
||
execute a:firstline . "," . a:lastline . "sort /\\(^\\| \\)\\zs+[^[:blank:]]\\+/ r"
|
||
endfunction
|
||
|
||
function! todo#txt#sort_by_date() range
|
||
let l:date_regex = "\\d\\{2,4\\}-\\d\\{2\\}-\\d\\{2\\}"
|
||
execute a:firstline . "," . a:lastline . "sort /" . l:date_regex . "/ r"
|
||
execute a:firstline . "," . a:lastline . "g!/" . l:date_regex . "/m" . a:lastline
|
||
endfunction
|
||
|
||
function! todo#txt#sort_by_due_date() range
|
||
let l:date_regex = "due:\\d\\{2,4\\}-\\d\\{2\\}-\\d\\{2\\}"
|
||
execute a:firstline . "," . a:lastline . "sort /" . l:date_regex . "/ r"
|
||
execute a:firstline . "," . a:lastline . "g!/" . l:date_regex . "/m" . a:lastline
|
||
endfunction
|
||
|
||
" Increment and Decrement The Priority
|
||
:set nf=octal,hex,alpha
|
||
|
||
function! todo#txt#prioritize_increase()
|
||
normal! 0f)h
|
||
endfunction
|
||
|
||
function! todo#txt#prioritize_decrease()
|
||
normal! 0f)h
|
||
endfunction
|
||
|
||
function! todo#txt#prioritize_add(priority)
|
||
" Need to figure out how to only do this if the first visible letter in a line is not (
|
||
:call todo#txt#prioritize_add_action(a:priority)
|
||
endfunction
|
||
|
||
function! todo#txt#prioritize_add_action(priority)
|
||
execute 's/^\(([a-zA-Z]) \)\?/(' . a:priority . ') /'
|
||
endfunction
|
||
|
||
" Modeline {{{1
|
||
" vim: ts=8 sw=4 sts=4 et foldenable foldmethod=marker foldcolumn=1
|