taking notes with bash + vim
A co-worker sold me on the utility of having a program like Yojimbo. However, I'm too cheap to shell out the $39 for a license, and I prefer to have vi key bindings, and complete keyboard control. I found an excellent post at make-believe.org which describes a system for note-taking using a little bash magic for searching and command line tab completion, and vim for editing. I liked it a lot, but decided to add tagging to the system. Read on to find out how I did it.
(:xa will save all buffers and quit in one swell foop)
Now, here's the other piece. Put this in your .vimrc:
Place the cursor over the note you wish to edit, press 'x', and it will open up the split-pane view with the note and tag files. I welcome suggestions for improvements!
host:~ $ note testnote
(:xa will save all buffers and quit in one swell foop)
host:~ $ findnote note /Users/acrollet/.notes/test note.note 1:This is a test note.
host:~ $ findtag bash /Users/acrollet/.notes/test note.tags 1:bash vi note-takingThe bash file to do the above looks like this:
- note() {
- if [ -n "$*" ]; then
- mvim -o2 "$HOME/.notes/$*.note" "$HOME/.notes/$*.tags"
- else
- printf "Name of note is a required argument.\n"
- fi
- }
- findnote() {
- ack -ia $1 ~/.notes/*.note
- }
- shownote() {
- cat "$HOME/.notes/$*.note"
- }
- findtag() {
- ack -ia $1 ~/.notes/*.tags
- }
- copynote() {
- cat "$HOME/.notes/$*.note" | pbcopy
- }
- alias note:='note'
- alias shownote:='shownote'
- alias notes="mvim -c \"let g:netrw_list_hide='\.tags$,^\..*'\" -c \"let g:netrw_hide=1\" $HOME/.notes"
- _notes() {
- local cur names IFS
- cur="${COMP_WORDS[COMP_CWORD]}"
- names=`ls $HOME/.notes | sed 's/.note$//g'`
- IFS=$'\t\n'
- COMPREPLY=( $(compgen -W "${names}" -- ${cur}) )
- return 0
- }
- complete -o nospace -F _notes note
- complete -o nospace -F _notes note:
- complete -o nospace -F _notes copynote
let g:netrw_hide=1 let g:netrw_list_hide='\.tags$,^\..*'And this in netrwFileHandlers.vim: (you may need a more recent version than came with your distribution, v98 did not work for me)
" ---------------------------------------------------------------------
"
" s:NFH_note: handles note file when the user hits "x" when the {{{1
" cursor is atop a *.note file
fun! s:NFH_note(notefile)
" call Dfunc("s:NFH_note(".a:notefile.")")
let note= substitute(a:notefile,'\ ','\\\ ','g')
let tags= substitute(a:notefile,'\.note$','\.tags','')
let tag= substitute(tags,'\ ','\\\ ','g')
" call Decho("opening "page)
execute "e "tag
execute "sp "note
return 0
endfun
Now, when you type 'notes' at the prompt, you'll get this view:
Place the cursor over the note you wish to edit, press 'x', and it will open up the split-pane view with the note and tag files. I welcome suggestions for improvements!