]> git.notmuchmail.org Git - notmuch/blobdiff - vim/plugin/notmuch.vim
vim: add a helpful header to notmuch-compose mode
[notmuch] / vim / plugin / notmuch.vim
index 99be62612907f17bd258394ef5d55cf2dd9dc0eb..341f3370dad8d821062a0bb3aa87c50b17cbaf50 100644 (file)
@@ -53,6 +53,7 @@ let s:notmuch_defaults = {
         \
         \ 'g:notmuch_show_citation_regexp':          '^\s*>'                      ,
         \
+        \ 'g:notmuch_compose_header_help':           1                            ,
         \ 'g:notmuch_compose_temp_file_dir':         '~/.notmuch/compose/'        ,
         \ }
 
@@ -158,6 +159,16 @@ let g:notmuch_show_maps = {
         \ '?':          ':echo <SID>NM_show_message_id() . ''  @ '' . join(<SID>NM_show_search_words())<CR>',
         \ }
 
+" --- --- bindings for compose screen {{{2
+let g:notmuch_compose_nmaps = {
+        \ ',s':         ':call <SID>NM_compose_send()<CR>',
+        \ ',a':         ':call <SID>NM_compose_attach()<CR>',
+        \ ',q':         ':call <SID>NM_kill_this_buffer()<CR>',
+        \ '<Tab>':      ':call <SID>NM_compose_next_entry_area()<CR>',
+        \ }
+let g:notmuch_compose_imaps = {
+        \ '<Tab>':      '<C-r>=<SID>NM_compose_next_entry_area()<CR>',
+        \ }
 
 " --- implement folders screen {{{1
 
@@ -866,7 +877,13 @@ endfunction
 " --- implement compose screen {{{1
 
 function! s:NM_cmd_compose(words, body_lines)
-        let lines = []
+        let lines = !g:notmuch_compose_header_help ? [] : [
+                  \ 'Notmuch-Help: Type in your message here; to help you use these bindings:',
+                  \ 'Notmuch-Help:   ,a    - attach a file',
+                  \ 'Notmuch-Help:   ,s    - send the message (Notmuch-Help lines will be removed)',
+                  \ 'Notmuch-Help:   ,q    - abort the message',
+                  \ 'Notmuch-Help:   <Tab> - skip through header lines',
+                  \ ]
         let start_on_line = 0
 
         let hdrs = { }
@@ -922,22 +939,56 @@ function! s:NM_cmd_compose(words, body_lines)
                                   \ 'compose', lines)
         setlocal bufhidden=hide
 
-        call <SID>NM_cmd_compose_mksyntax()
         call <SID>NM_set_map('n', g:notmuch_compose_nmaps)
         call <SID>NM_set_map('i', g:notmuch_compose_imaps)
 
-        exec printf('norm %dG', start_on_line)
+        call cursor(start_on_line, strlen(start_on_line) + 1)
         startinsert!
         echo 'Type your message, use <TAB> to jump to next header and then body.'
 endfunction
-function! s:NM_cmd_compose_mksyntax()
-        silent! setlocal syntax=mail
-endfunction
 
 function! s:NM_compose_send()
         echo 'not implemented'
 endfunction
 
+function! s:NM_compose_attach()
+        echo 'not implemented'
+endfunction
+
+function! s:NM_compose_next_entry_area()
+        let lnum = line('.')
+        let hdr_end = <SID>NM_compose_find_line_match(1,'^$',1)
+        echo 'header end = ' . string(hdr_end)
+        if lnum < hdr_end
+                let lnum = lnum + 1
+                let line = getline(lnum)
+                if match(line, '^\([^:]\+\):\s*$') == -1
+                        call cursor(lnum, strlen(line) + 1)
+                        return ''
+                endif
+                while match(getline(lnum+1), '^\s') != -1
+                        let lnum = lnum + 1
+                endwhile
+                call cursor(lnum, strlen(getline(lnum)) + 1)
+                return ''
+
+        elseif lnum == hdr_end
+                call cursor(lnum+1, strlen(getline(lnum+1)) + 1)
+                return ''
+        endif
+        echo 'mode=' . mode()
+        if mode() == 'i'
+                if !getbufvar(bufnr('.'), '&et')
+                        return "\t"
+                endif
+               let space = ''
+               let shiftwidth = a:shiftwidth
+               let shiftwidth = shiftwidth - ((virtcol('.')-1) % shiftwidth)
+                " we assume no one has shiftwidth set to more than 40 :)
+                return '                                        '[0:shiftwidth]
+        endif
+endfunction
+
 " --- --- compose screen helper functions {{{2
 
 function! s:NM_compose_get_user_email()
@@ -948,6 +999,18 @@ function! s:NM_compose_get_user_email()
         return name . '@' . fqdn
 endfunction
 
+function! s:NM_compose_find_line_match(start, pattern, failure)
+        let lnum = a:start
+        let lend = line('$')
+        while lnum < lend
+                if match(getline(lnum), a:pattern) != -1
+                        return lnum
+                endif
+                let lnum = lnum + 1
+        endwhile
+        return a:failure
+endfunction
+
 
 " --- notmuch helper functions {{{1