Usage

On any line in a markdown file that starts with AR, <Shift-Enter> will add this line to the todo list, with the current date and the name of the originating file.

Alternatively, :AR will do the same thing, regardless of how the line starts.

In the todo file all open action start in o (lower case o). <Ctrl-a> toggles o to (check mark) and moves the line to under the # Done heading, with the completion date appended.

Example

In a markdown file take-action.md:


 AR Write a todo list

gets added to the todo.md file as:


   # TODOs
  o Write a todo list  (2 Jan 24)  in: take-action.md o Do some actual work  (1 Jan 20)  in: day_job.md  # DONE
  1 Jan 2024 ✓ Think about a todo list  (12 Aug 21)  in: take-action.md  

When the action is complete, <Ctrl-a> toggles the o to and moves the line to the # Done section:


   # TODOs
  o Do some actual work  (1 Jan 20)  in: day_job.md  # DONE
  05 Jan 2024 ✓ Write a todo list  (2 Jan 24)  in: take-action.md  1 Jan 2024 ✓ Think about a todo list  (12 Aug 21)  in: take-action.md   

Installation

Add the following to your .vimrc or other files that get sourced when starting vim.


 command! AR call TakeAction()
  fu! TakeAction()
   let line = substitute(getline('.'), '^AR ', '', '')
   let action = 'o '.line.' '.strftime("  (%d %b %y)").'\t in: '.expand('%:r')
   execute "!sed -i '' '3s/^/".action."\\n/' $PATH/TO/YOUR/todo.md"
   echomsg 'Action: "'.getline('.').'" taken'
 endfu

For the <Ctrl-a> mapping, add:


 nnoremap <C-a> :call Toggle('+')<CR>
  function! Toggle(change)
   let cStr = matchstr(getline('.'), '\%' . col('.') . 'c.')
   if (cStr == "o")
     " move item to 'done' list
     normal ciw✓
     normal ddmo
     /^# DONE\n/
     normal j
     r! date "+\%d \%b \%Y"
     normal p`o

cStr is the character under the cursor. If it is o, it is replaced with and the line is moved to the # Done section of the todo file. I use the <C-a> and <C-x> mappings for many other toggles, such as number increments or switching between True and False.

For the <Shift-Enter> mapping, add something like:


 function! Process()
   if getline('.') =~ '^AR '
     call TakeAction()
     return
   endif   […] endfunction  nnoremap <buffer><S-ENTER>  :call Process()<CR>

!sed… inserts the action as the third line into the todo file (to leave space for a title)

Again, I use <S-Enter> for many other things besides. Lines starting with > get executed as shell commands. Otherwise it 'executes' the file depending on type (python is run, emails are sent, markdown turned into pdf or website…)