" File: todo.txt.vim " Description: Todo.txt syntax settings " Author: David Beniamine ,Leandro Freitas " License: Vim license " Website: http://github.com/dbeniamine/todo.txt-vim " vim: ts=4 sw=4 :help tw=78 cc=80 if exists("b:current_syntax") finish endif syntax match TodoDone '^[x]\s.\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext syntax match TodoPriorityA '^(A) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityB '^(B) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityC '^(C) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityD '^(D) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityE '^(E) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityF '^(F) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityG '^(G) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityH '^(H) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityI '^(I) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityJ '^(J) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityK '^(K) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityL '^(L) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityM '^(M) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityN '^(N) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityO '^(O) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityP '^(P) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityQ '^(Q) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityR '^(R) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityS '^(S) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityT '^(T) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityU '^(U) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityV '^(V) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityW '^(W) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityX '^(X) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityY '^(Y) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoPriorityZ '^(Z) .\+$' contains=TodoKey,TodoDate,TodoProject,TodoContext,TodoDueToday,TodoOverDueDate syntax match TodoDate '\d\{2,4\}-\d\{2\}-\d\{2\}' contains=NONE syntax match TodoKey '\S*\S:\S\S*' contains=TodoDate syntax match TodoProject '\(^\|\W\)+[^[:blank:]]\+' contains=NONE syntax match TodoContext '\(^\|\W\)@[^[:blank:]]\+' contains=NONE let s:todayDate=strftime('%Y\-%m\-%d') "TODO: Figure out how to allow stop the following line being highlighted inside TodoDone "execute 'syntax match TodoDueToday /\v\c<(due:)@4<=' . s:todayDate . '/ contains=NONE contained' execute 'syntax match TodoDueToday /\v\c= 1 let l:year=a:1 endif if a:0 >= 2 let l:month=a:2 endif if a:0 >= 3 let l:day=a:3 endif " Use very magic mode, and start an alternation let l:overdueRex = '\v(' " PART 1: 0000-1999 " This sucker is static and won't change to year 3000. I'm not coding for the year 3000. let l:overdueRex = l:overdueRex . '([01]\d{3}' " PART 2. All previous decades for the reference date century " i.e. for 2017: "200\d", for 2035: "20[0-2]\d" " for 2000: skip let l:decade = strpart(l:year, 2, 1) " i.e. the 1 from 2017 if l:decade > 0 let l:overdueRex = l:overdueRex . '|20' if l:decade > 1 let l:overdueRex = l:overdueRex . '[0-' . (l:decade - 1) . ']' else let l:overdueRex = l:overdueRex . '0' endif let l:overdueRex = l:overdueRex . '\d' endif " PART 3: This decade, to previous year " i.e. for 2017: "201[0-6]", for 2035: "203[0-4]", for 2000: skip let l:y = strpart(l:year, 3, 1) " Last digit of the year, i.e. 7 for 2017 if l:y > 0 if l:y > 1 let l:overdueRex = l:overdueRex . '|20' . l:decade . '[0-' . (l:y - 1) . ']' else let l:overdueRex = l:overdueRex . '|20' . l:decade . '0' endif endif let l:overdueRex = l:overdueRex . ')\-\d{2}\-\d{2}|' " PART 4: All months to the end of the previous month " i.e. for a date of 2017-09-07, "2017-(0[1-8])-\d{2}" " for 2017-11-30: "2017-(0\d|1[0-1])-\d{2}" " for 2017-01-20: skip " This only applies if the reference date is not in January if l:month > 1 let l:overdueRex = l:overdueRex . '(' . l:year . '\-(0' if l:month > 10 let l:overdueRex = l:overdueRex . '\d|1' endif let l:y = strpart(printf('%02d', l:month), 1, 1) " Second digit of the month let l:overdueRex = l:overdueRex . '[0-' . (l:y - 1) . '])\-\d{2})|' endif " PART 5. Days of the month part 1. " i.e. for 2017-09-07: skip " for 2017-12-29: "2017-12-[0-1]\d" let l:y = strpart(printf('%02d', l:day), 0, 1) " First digit of the day if l:y > 0 if l:y > 1 let l:overdueRex = l:overdueRex . '(' . l:year . '\-' . printf('%02d', l:month) . '\-[0-' . (l:y - 1) . ']\d)|' else let l:overdueRex = l:overdueRex . '(' . l:year . '\-' . printf('%02d', l:month) . '\-0\d)|' endif endif " PART 6. Days of the month part 2. " i.e. for 2017-09-07: "2017-09-0[0-6]" " for 2017-12-29: "2017-12-2[0-8]" let l:y = strpart(printf('%02d', l:day), 0, 1) " First digit of the day let l:overdueRex = l:overdueRex . '(' . l:year . '\-' . printf('%02d', l:month) . '\-' . l:y let l:y = strpart(printf('%02d', l:day), 1, 1) " Last digit of the day if l:y > 0 let l:overdueRex = l:overdueRex . '[0-' . (l:y - 1) . ']' else let l:overdueRex = l:overdueRex . '0' endif let l:overdueRex = l:overdueRex . ')' let l:overdueRex = l:overdueRex . ')' return l:overdueRex endfunction execute 'syntax match TodoOverDueDate /\v\c/' highlight default link TodoOverDueDate Error let b:current_syntax = "todo"