]> git.notmuchmail.org Git - notmuch/blobdiff - vim/plugin/notmuch.vim
vim: allow overriding how newBuffer is created
[notmuch] / vim / plugin / notmuch.vim
index 99be62612907f17bd258394ef5d55cf2dd9dc0eb..0adca0b0c574922ec78a90a1e14a74d4a8b9105b 100644 (file)
@@ -53,6 +53,8 @@ let s:notmuch_defaults = {
         \
         \ 'g:notmuch_show_citation_regexp':          '^\s*>'                      ,
         \
+        \ 'g:notmuch_compose_insert_mode_start':     1                            ,
+        \ 'g:notmuch_compose_header_help':           1                            ,
         \ 'g:notmuch_compose_temp_file_dir':         '~/.notmuch/compose/'        ,
         \ }
 
@@ -158,6 +160,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
 
@@ -176,7 +188,7 @@ function! s:NM_cmd_folders(words)
                 call add(searches, search)
         endfor
 
-        call <SID>NM_newBuffer('folders', join(disp, "\n"))
+        call <SID>NM_newBuffer('', 'folders', join(disp, "\n"))
         let b:nm_searches = searches
         let b:nm_timestamp = reltime()
 
@@ -224,7 +236,7 @@ function! s:NM_cmd_search(words)
         let disp = copy(lines)
         call map(disp, 's:NM_cmd_search_fmtline(v:val)')
 
-        call <SID>NM_newBuffer('search', join(disp, "\n"))
+        call <SID>NM_newBuffer('', 'search', join(disp, "\n"))
         let b:nm_raw_lines = lines
         let b:nm_search_words = a:words
 
@@ -369,8 +381,7 @@ endfunction
 
 function! s:NM_search_thread_id()
         if !exists('b:nm_raw_lines')
-                echoe 'no b:nm_raw_lines'
-                return ''
+                throw 'Eeek! no b:nm_raw_lines'
         endif
         let mnum = line('.') - 1
         if len(b:nm_raw_lines) <= mnum
@@ -407,7 +418,7 @@ function! s:NM_cmd_show(words)
         let info = s:NM_cmd_show_parse(lines)
 
         setlocal bufhidden=hide
-        call <SID>NM_newBuffer('show', join(info['disp'], "\n"))
+        call <SID>NM_newBuffer('', 'show', join(info['disp'], "\n"))
         setlocal bufhidden=delete
         let b:nm_words = a:words
         let b:nm_raw_info = info
@@ -609,8 +620,7 @@ endfunction
 
 function! s:NM_show_message_id()
         if !exists('b:nm_raw_info')
-                echoe 'no b:nm_raw_info'
-                return ''
+                throw 'Eeek! no b:nm_raw_info'
         endif
         let msg = <SID>NM_show_get_message_for_line(line('.'))
         if has_key(msg,'id')
@@ -621,8 +631,7 @@ endfunction
 
 function! s:NM_show_search_words()
         if !exists('b:nm_words')
-                echoe 'no b:nm_words'
-                return []
+                throw 'Eeek! no b:nm_words'
         endif
         return b:nm_words
 endfunction
@@ -866,7 +875,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 +937,57 @@ 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)
-        startinsert!
+        call cursor(start_on_line, strlen(start_on_line) + 1)
+        if g:notmuch_compose_insert_mode_start
+                startinsert!
+        endif
         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
+        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,11 +998,27 @@ 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
 
-function! s:NM_newBuffer(type, content)
-        enew
+function! s:NM_newBuffer(how, type, content)
+        if strlen(a:how)
+                exec a:how
+        else
+                enew
+        endif
         setlocal buftype=nofile readonly modifiable scrolloff=0 sidescrolloff=0
         silent put=a:content
         keepjumps 0d