[Jodavaho.io]

Stuff by Josh Vander Hook

Bullet journal in plain bash

I keep journals for my work and home projects, each of my group members, my section duties, my publications … you get the idea. Here’s how I use plain text, in markdown files, backed by GitHub as the ultimate productivity tool. view full post

As mentioned I try to journal frequently in plain old bash. I keep journals for my work and home projects, each of my group members, my section duties, my publications … you get the idea.

Since my code is automation-aided text editing, and my publications are automation-aided text editing, why would I use anything else for my project management?

All the code I use is wrapped up here: github.com/jodavaho/bashlog but it’s easy enough to do without that.

Basics

For managing todos, I use bullet journal. Bullet Journalling has become quite a fad lately, with frothing-at-the-mouth reviews like “It will make you a better person!” How can you argue with that simple, artistically drawn ven diagram where it lies at the center of “Why” and “What”?

Check out the basics here. Following their method, I keep track of todos as simple bullet lists, and to annotate them with one of a few “statuses”: todo, done, scheduled, dropped, and migrated.

We’ll use GitHub flavored markdown, in particular the fancy todo box to make our bullet journals.

I add a few statues, and use:

- [ ] todo
- [x] done
- [-] failed
- [v] dropped
- [>] migrated
- [^] scheduled
- [<] delegated

Intermediate use

By keeping this todo file in a known location I can easily access it with a few keystrokes. Mid-day or mid-week, it starts to look like this, with dupes, out of order items, and a mix of statuses:

- [ ] water the lawn
- [x] write up analysis for steve
- [>] complete AAS paper revisions
- [>] Add image to Keck report
- [x] take dog on a walk
- [ ] schedule a doctor appointment
- [ ] water the lawn
- [^] cross-compile scheduler 
- [-] runtime reports 
- [v] pick up vitamins

Well, that’s functional, but why bother? Well first, this is easy to diff with git to see what has changed lately, when items were added and so on. But my day-to-day interaction is mostly trying to mark everything off.

I use vim to edit this todo file. so :sort comes in handy. :sort u even removes duplicates

- [ ] schedule a doctor appointment
- [ ] water the lawn
- [-] runtime reports 
- [>] Add image to Keck report
- [>] complete AAS paper revisions
- [^] cross-compile scheduler 
- [v] pick up vitamins
- [x] take dog on a walk
- [x] write up analysis for steve

That’s a nice thermometer view, we’re over half done, and I can see what roughly what fraction I’m doing, delegating, dropping, failing, etc at a glance.

I often prioritize items as well, then :sort will sort by status first, then by priority:

- [x] This was done
- [ ] Less important
- [ ] Need to do this now

Becomes:

- [ ] 1 Need to do this now
- [ ] 2 Less important
- [x] This was done

For large lists with lots remaining, bumping a few to the top with a properly placed 0 is a life saver. I can scan and downselect today’s 0 tomorrows 1, etc very quickly.

There are many other things that :sort can do, including sorting by just priority :sort n or by arbitrary tokens :sort /<stuff to ignore>/. That last one is particularly helpful if you structure todos with delimited tags.

Power use

If you follow the same basic format of status, tags, delimiters, and descriptions …

- [<status>] <tag> <tag> ... <description>

or more readable:

- [<status>] <descirption> <tag> <tag> ... 

For example: - [ ] +project +priority +due date : item. Then you can easily sort by a specific tag by ignoring the first n occurrences of the pattern PATTERN like this

:sort /\(.\{-}\zsPATTERN\)\{NUMBER}/

e.g., :sort /\(.\{-}\zs+\)\{0}/

# this list has 3 tags, project, priority, and due date: 

- [ ] +project 2 +1 +2021-02-15 :Do stuff ... 
- [x] +project 1 +1 +2021-03 Do :stuff ... 
- [ ] +project 2 +1 +2021-03-15 :Always do stuff ...
- [ ] +project 2 +0 +2021-04-01 :Do stuff ...
- [x] +project 2 +1 +2022       :Do stuff ... 

You can use the following commands:

" By project
:sort /\(.\{-}\zs+\)\{0}/
" By priority
:sort /\(.\{-}\zs+\)\{1}/
" By due date
:sort /\(.\{-}\zs+\)\{2}/
" By description
:sort /.*:/

Try it on the above task list for extra credit? It’s easier to use separate tag markers and more readable with descriptions up front.

- [ ] Never do stuff  =project 2 +1 
- [x] Always do stuff =project 1 +1 _2021-03 
- [ ] Do stuff        =project 2 +1 _2021-02-15 
- [x] Do stuff        =project 2 +1 _2022       
- [ ] Do stuff        =project 2 +0 _2021-04-01

" By status / description
:sort 
" By project
:sort /.*=/
" By priority
:sort /.*+/
" By due date
:sort /.*_/

You can easily bind any of those sorts to custom commands as well, as discussed in the vim manual

e.g., in your ~/.vimrc put:

" By project
comand SortProject sort /.*=/
" By priority
command SortPriority sort /.*+/
" By due date
command SortDate sort /.*_/

Conclusion

Keeping a plain text file was explored as an alternative to task management software. The simple delimited text format for todos was borrowed from GitHub, and expanded to include bullet journalling. I used Vim and in particular :sort to get all the organizational tools I needed to keep track of status. In closing, I’ll say that the most important part, in the spirit of Bullet Journal, is culling the done items and refreshing the todos periodically, e.g., every Monday. Don’t worry, they’re still in git histories if you want them back. You won’t.

Comments

I have not configured comments for this site yet as there doesn't seem to be any good, free solutions. Please feel free to email, or reach out on social media if you have any thoughts or questions. I'd love to hear from you!