Fixed a bug in <Leader>x (todo#PrependDate) introduced last commit. Fixed case sensitivity bug in todo#ToggleMarkAsDone() and todo#UnMarkAsDone() Fixed errors being reported for repeat#set if vim-repeat plugin is not installed. Fixed modeline in .vim files to work (only works on first/last 5 lines of file), and made the modelines consistent across all files. New unit tests for todo#ToggleMarkAsDone() Minor fixes for README.md and man page Fix anchoring of RegExp in todo#ToggleMarkAsDone Fixed a bug in overdue highlighting that resulted in the current date being matched on round dates like the 20th and 30th. Added more unit tests for overdue date highlighting. Corrected RegExp anchoring on today date highlighting. Added a few bash scripts to make running unit tests easier and more reliable, including testing with ignorecase user preference set.
124 lines
3.6 KiB
VimL
124 lines
3.6 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-Z]) \)\?\d\{2,4\}-\d\{2\}-\d\{2\} ') &&
|
||
\ exists('g:todo_existing_date') && g:todo_existing_date == 'n'
|
||
return
|
||
endif
|
||
execute 's/^\(([A-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()
|
||
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-Z]) \)\?/(' . a:priority . ') /'
|
||
endfunction
|
||
|
||
" Modeline {{{1
|
||
" vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab foldmethod=marker
|