primitive notmuch mail interface for vim
authorBart Trojanowski <bart@jukie.net>
Wed, 18 Nov 2009 21:43:42 +0000 (16:43 -0500)
committerBart Trojanowski <bart@jukie.net>
Wed, 25 Nov 2009 05:48:48 +0000 (00:48 -0500)
vim/plugin/notmuch.vim [new file with mode: 0644]

diff --git a/vim/plugin/notmuch.vim b/vim/plugin/notmuch.vim
new file mode 100644 (file)
index 0000000..865624f
--- /dev/null
@@ -0,0 +1,116 @@
+" notmuch.vim plugin --- run notmuch within vim
+"
+" Copyright © Carl Worth
+"
+" This file is part of Notmuch.
+"
+" Notmuch is free software: you can redistribute it and/or modify it
+" under the terms of the GNU General Public License as published by
+" the Free Software Foundation, either version 3 of the License, or
+" (at your option) any later version.
+"
+" Notmuch is distributed in the hope that it will be useful, but
+" WITHOUT ANY WARRANTY; without even the implied warranty of
+" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+" General Public License for more details.
+"
+" You should have received a copy of the GNU General Public License
+" along with Notmuch.  If not, see <http://www.gnu.org/licenses/>.
+"
+" Authors: Bart Trojanowski <bart@jukie.net>
+
+" --- defaults
+
+if !exists('g:notmuch_cmd')
+        let g:notmuch_cmd = 'notmuch'
+endif
+
+
+" --- implement search screen
+
+function! s:NM_cmd_search(words)
+        let data = split(s:NM_run(['search'] + a:words), "\n")
+        let disp = copy(data)
+        call map(disp, 'substitute(v:val, "^thread:\\S* ", "", "")' )
+
+        call s:NM_newBuffer('search', join(disp, "\n"))
+        let b:nm_raw_data = data
+
+        nnoremap <buffer> <Enter> :call <SID>NM_search_display()<CR>
+endfunction
+
+function! s:NM_search_display()
+        let line = line('.')
+        if !exists('b:nm_raw_data')
+                echo 'no b:nm_raw_data'
+        else
+                let info = b:nm_raw_data[line]
+                let what = split(info, '\W\+')[0]
+                call s:NM_cmd_show([what])
+        endif
+endfunction
+
+
+" --- implement show screen
+
+function! s:NM_cmd_show(words)
+        let data = s:NM_run(['show'] + a:words)
+
+        call s:NM_newBuffer('show', data)
+        let b:nm_raw_data = data
+endfunction
+
+
+" --- helper function
+
+function! s:NM_newBuffer(ft, content)
+        enew
+        setlocal buftype=nofile readonly modifiable
+        setlocal bufhidden=delete
+        silent put=a:content
+        keepjumps 0d
+        setlocal nomodifiable
+        setlocal cursorline
+        execute printf('setlocal filetype=notmuch-%s', a:ft)
+endfunction
+
+function! s:NM_run(args)
+        let cmd = g:notmuch_cmd . ' ' . join(a:args) . '< /dev/null'
+        let out = system(cmd)
+        if v:shell_error
+                echohl Error
+                echo substitute(out, '\n*$', '', '')
+                echohl None
+                return ''
+        else
+                return out
+        endif
+endfunction
+
+
+" --- command handler
+
+function! NotMuch(args)
+        if !strlen(a:args)
+                call s:NM_cmd_search(['tag:inbox'])
+                return
+        endif
+
+        echo "blarg!"
+
+        let words = split(a:args)
+        " TODO: handle commands passed as arguments
+endfunction
+function! CompleteNotMuch(arg_lead, cmd_line, cursor_pos)
+        return []
+endfunction
+
+
+" --- glue
+
+command! -nargs=* -complete=customlist,CompleteNotMuch NotMuch call NotMuch(<q-args>)
+cabbrev  notmuch <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'NotMuch' : 'notmuch')<CR>
+
+" --- hacks, only for development :)
+
+nnoremap ,nmr :source ~/.vim/plugin/notmuch.vim<CR>:call NotMuch('')<CR>