Note-taking with Vim ==================== :author: Aaron Ball :email: nullspoon@iohq.net Two vim posts in one day! My task list at work has recently become so large (it's probably well over a year's worth of work now) that I now need to track my tasks somewhere other than in my head (documentation is always better than tribal knowledge anyways). I realy don't like task tracking becuase most of the applications out there are just so heavy for what note-taking actually is. I use vim almost all day, every day though, so why not use that (plus it's command line!)? I spent about thirty minutes writing this up today. It's inspired a bit by the LifeHacker article, http://lifehacker.com/5592047/turn-your-command-line-into-a-fast-and-simple-note+taking-tool[Turn Your Command Line into a Fast and Simple Note Taking Tool] (thanks http://mottr.am/[Jack Mottram]). This will automagically give all of your notes a .wiki extension, telling vim to use the mediawiki text syntax highlighter (I use MediaWiki a lot to so I figured I'd use that syntax for markup). This can be found http://en.wikipedia.org/wiki/Wikipedia:Text_editor_support#Vim[here]. If you want to use something else like markdown, just change the $noteExt variable at the top to the extension associated with the highlighter you want. This addition will give you six new commands. * +**note** [NoteName]+: Opens a note for editing or creates a new note. If no note is specified, opens the most recent note. * +**mknote** NoteName "Note to append"+: Appends text to the requested note. * +**catnote** [NoteName]+: Prints the contents of the specified note. * +**lsnotes**+: Lists all notes by date modified * +**findnote** SearchTerm+: Searches all notes for the search term (case insensitive) and prints the results along with note title and line number on which the term was found. * +**mvnote** OldName NewName+: Renames a note * +**rmnote** NoteName+: Deletes the specified note. Add the following to your .bash_profile (or .profile if you're a ksh user) ---- export base=~/Documents/Notes export noteExt=wiki # This would be used for markdown # export noteExt=md note() { if [ ! -d $base ]; then mkdir -p $base fi # If note not specified, open most recent if [[ -z "$1" ]]; then vim $(ls -t $(find $base/ -type f) | head -n 1) else vim $base/$1.$noteExt fi } mknote() { echo $2 >> $base/$1.$noteExt } catnote() { # If note not specified, cat most recent if [[ -z "$1" ]]; then cat $(ls -t $(find $base/ -type f) | head -n 1) else cat $base/$1.$noteExt fi } lsnotes() { #ls -1 $base/ | sed "s/\(.*\).$noteExt/* \1/" echo echo -e "Last Modified\tName" ls -lt $base/ | tr -s ' ' | cut -d ' ' -f 6,7,8,9 | sed "s/^\(\w\+\) \(\w\w\) \(\w\w:\w\w\) \(.*\).wiki/\1 \2 \3\t\4/" echo } findnote() { if [[ -n "$1" ]]; then contents="Note:Line:Text\n\n" contents=$contents$(find $base/ -type f | xargs grep -n -i "$1" | sed "s/.*\/\(.*\)\.$noteExt:\([0-9]\+\):\(.*\)/\1:\2:\3/") echo -e "$contents" | column -s ":" -t else echo "Please specify a search term." fi } mvnote() { mv $base/$1.$noteExt ~/Documents/Notes/$2.$noteExt } rmnote() { if [[ -n "$1" ]]; then rm $base/$1.$noteExt else echo "Please specify a note." fi } ---- Category:Linux Category:Vim Category:Productivity // vim: set syntax=asciidoc: