]> git.notmuchmail.org Git - notmuch/blobdiff - vim/notmuch.vim
emacs: Add new option notmuch-search-hide-excluded
[notmuch] / vim / notmuch.vim
index 4e4dfb04515e42d5ae63d69830b99fb19e9931ee..c1c2f63d20178dab69f92c9ff9aab4631dda6ee5 100644 (file)
@@ -59,36 +59,16 @@ let s:notmuch_datetime_format_default = '%d.%m.%y %H:%M:%S'
 let s:notmuch_reader_default = 'mutt -f %s'
 let s:notmuch_sendmail_default = 'sendmail'
 let s:notmuch_folders_count_threads_default = 0
-
-if !exists('g:notmuch_rb_date_format')
-       let g:notmuch_rb_date_format = s:notmuch_date_format_default
-endif
-
-if !exists('g:notmuch_rb_datetime_format')
-       let g:notmuch_rb_datetime_format = s:notmuch_datetime_format_default
-endif
-
-if !exists('g:notmuch_rb_reader')
-       let g:notmuch_rb_reader = s:notmuch_reader_default
-endif
-
-if !exists('g:notmuch_rb_sendmail')
-       let g:notmuch_rb_sendmail = s:notmuch_sendmail_default
-endif
-
-if !exists('g:notmuch_rb_folders_count_threads')
-       let g:notmuch_rb_folders_count_threads = s:notmuch_folders_count_threads_default
-endif
+let s:notmuch_compose_start_insert_default = 1
 
 function! s:new_file_buffer(type, fname)
        exec printf('edit %s', a:fname)
        execute printf('set filetype=notmuch-%s', a:type)
        execute printf('set syntax=notmuch-%s', a:type)
        ruby $curbuf.init(VIM::evaluate('a:type'))
-       ruby $buf_queue.push($curbuf.number)
 endfunction
 
-function! s:compose_unload()
+function! s:on_compose_delete()
        if b:compose_done
                return
        endif
@@ -107,17 +87,22 @@ endfunction
 function! s:compose_send()
        let b:compose_done = 1
        let fname = expand('%')
+       let lines = getline(5, '$')
 
-       " remove headers
-       0,4d
-       write
+ruby << EOF
+       # Generate proper mail to send
+       text = VIM::evaluate('lines').join("\n")
+       fname = VIM::evaluate('fname')
+       transport = Mail.new(text)
+       transport.message_id = generate_message_id
+       transport.charset = 'utf-8'
+       File.write(fname, transport.to_s)
+EOF
 
        let cmdtxt = g:notmuch_sendmail . ' -t -f ' . s:reply_from . ' < ' . fname
        let out = system(cmdtxt)
        let err = v:shell_error
        if err
-               undo
-               write
                echohl Error
                echo 'Eeek! unable to send mail'
                echo out
@@ -147,16 +132,20 @@ function! s:show_reply()
        ruby open_reply get_message.mail
        let b:compose_done = 0
        call s:set_map(g:notmuch_compose_maps)
-       autocmd BufUnload <buffer> call s:compose_unload()
-       startinsert!
+       autocmd BufDelete <buffer> call s:on_compose_delete()
+       if g:notmuch_compose_start_insert
+               startinsert!
+       end
 endfunction
 
 function! s:compose()
        ruby open_compose
        let b:compose_done = 0
        call s:set_map(g:notmuch_compose_maps)
-       autocmd BufUnload <buffer> call s:compose_unload()
-       startinsert!
+       autocmd BufDelete <buffer> call s:on_compose_delete()
+       if g:notmuch_compose_start_insert
+               startinsert!
+       end
 endfunction
 
 function! s:show_info()
@@ -179,7 +168,7 @@ function! s:show_open_msg()
 ruby << EOF
        m = get_message
        mbox = File.expand_path('~/.notmuch/vim_mbox')
-       cmd = VIM::evaluate('g:notmuch_rb_reader') % mbox
+       cmd = VIM::evaluate('g:notmuch_reader') % mbox
        system "notmuch show --format=mbox id:#{m.message_id} > #{mbox} && #{cmd}"
 EOF
 endfunction
@@ -288,13 +277,8 @@ endfunction
 
 function! s:kill_this_buffer()
 ruby << EOF
-       if $buf_queue.size > 1
-               $curbuf.close
-               VIM::command("bdelete!")
-               $buf_queue.pop
-               b = $buf_queue.last
-               VIM::command("buffer #{b}") if b
-       end
+       $curbuf.close
+       VIM::command("bdelete!")
 EOF
 endfunction
 
@@ -313,7 +297,6 @@ function! s:new_buffer(type)
        execute printf('set filetype=notmuch-%s', a:type)
        execute printf('set syntax=notmuch-%s', a:type)
        ruby $curbuf.init(VIM::evaluate('a:type'))
-       ruby $buf_queue.push($curbuf.number)
 endfunction
 
 function! s:set_menu_buffer()
@@ -334,13 +317,16 @@ ruby << EOF
        $curbuf.render do |b|
                q = $curbuf.query(get_cur_view)
                q.sort = Notmuch::SORT_OLDEST_FIRST
+               $exclude_tags.each { |t|
+                       q.add_tag_exclude(t)
+               }
                msgs = q.search_messages
                msgs.each do |msg|
                        m = Mail.read(msg.filename)
                        part = m.find_first_text
                        nm_m = Message.new(msg, m)
                        $messages << nm_m
-                       date_fmt = VIM::evaluate('g:notmuch_rb_datetime_format')
+                       date_fmt = VIM::evaluate('g:notmuch_datetime_format')
                        date = Time.at(msg.date).strftime(date_fmt)
                        nm_m.start = b.count
                        b << "%s %s (%s)" % [msg['from'], date, msg.tags]
@@ -410,16 +396,72 @@ endfunction
 "" root
 
 function! s:set_defaults()
-       if exists('g:notmuch_rb_custom_search_maps')
-               call extend(g:notmuch_search_maps, g:notmuch_rb_custom_search_maps)
+       if !exists('g:notmuch_date_format')
+               if exists('g:notmuch_rb_date_format')
+                       let g:notmuch_date_format = g:notmuch_rb_date_format
+               else
+                       let g:notmuch_date_format = s:notmuch_date_format_default
+               endif
        endif
 
-       if exists('g:notmuch_rb_custom_show_maps')
-               call extend(g:notmuch_show_maps, g:notmuch_rb_custom_show_maps)
+       if !exists('g:notmuch_datetime_format')
+               if exists('g:notmuch_rb_datetime_format')
+                       let g:notmuch_datetime_format = g:notmuch_rb_datetime_format
+               else
+                       let g:notmuch_datetime_format = s:notmuch_datetime_format_default
+               endif
+       endif
+
+       if !exists('g:notmuch_reader')
+               if exists('g:notmuch_rb_reader')
+                       let g:notmuch_reader = g:notmuch_rb_reader
+               else
+                       let g:notmuch_reader = s:notmuch_reader_default
+               endif
+       endif
+
+       if !exists('g:notmuch_sendmail')
+               if exists('g:notmuch_rb_sendmail')
+                       let g:notmuch_sendmail = g:notmuch_rb_sendmail
+               else
+                       let g:notmuch_sendmail = s:notmuch_sendmail_default
+               endif
+       endif
+
+       if !exists('g:notmuch_folders_count_threads')
+               if exists('g:notmuch_rb_count_threads')
+                       let g:notmuch_count_threads = g:notmuch_rb_count_threads
+               else
+                       let g:notmuch_folders_count_threads = s:notmuch_folders_count_threads_default
+               endif
+       endif
+
+       if !exists('g:notmuch_compose_start_insert')
+               let g:notmuch_compose_start_insert = s:notmuch_compose_start_insert_default
+       endif
+
+       if !exists('g:notmuch_custom_search_maps') && exists('g:notmuch_rb_custom_search_maps')
+               let g:notmuch_custom_search_maps = g:notmuch_rb_custom_search_maps
+       endif
+
+       if !exists('g:notmuch_custom_show_maps') && exists('g:notmuch_rb_custom_show_maps')
+               let g:notmuch_custom_show_maps = g:notmuch_rb_custom_show_maps
+       endif
+
+       if exists('g:notmuch_custom_search_maps')
+               call extend(g:notmuch_search_maps, g:notmuch_custom_search_maps)
+       endif
+
+       if exists('g:notmuch_custom_show_maps')
+               call extend(g:notmuch_show_maps, g:notmuch_custom_show_maps)
        endif
 
        if !exists('g:notmuch_folders')
-               let g:notmuch_folders = s:notmuch_folders_default
+               if exists('g:notmuch_rb_folders')
+                       let g:notmuch_folders = g:notmuch_rb_folders
+               else
+                       let g:notmuch_folders = s:notmuch_folders_default
+               endif
        endif
 endfunction
 
@@ -438,33 +480,28 @@ ruby << EOF
 
        $db_name = nil
        $email = $email_name = $email_address = nil
+       $exclude_tags = []
        $searches = []
-       $buf_queue = []
        $threads = []
        $messages = []
-       $config = {}
        $mail_installed = defined?(Mail)
 
-       def get_config
-               group = nil
-               config = ENV['NOTMUCH_CONFIG'] || '~/.notmuch-config'
-               File.open(File.expand_path(config)).each do |l|
-                       l.chomp!
-                       case l
-                       when /^\[(.*)\]$/
-                               group = $1
-                       when ''
-                       when /^(.*)=(.*)$/
-                               key = "%s.%s" % [group, $1]
-                               value = $2
-                               $config[key] = value
-                       end
-               end
+       def get_config_item(item)
+               result = ''
+               IO.popen(['notmuch', 'config', 'get', item]) { |out|
+                       result = out.read
+               }
+               return result.rstrip
+       end
 
-               $db_name = $config['database.path']
-               $email_name = $config['user.name']
-               $email_address = $config['user.primary_email']
+       def get_config
+               $db_name = get_config_item('database.path')
+               $email_name = get_config_item('user.name')
+               $email_address = get_config_item('user.primary_email')
+               $email_name = get_config_item('user.name')
                $email = "%s <%s>" % [$email_name, $email_address]
+               ignore_tags = get_config_item('search.exclude_tags')
+               $exclude_tags = ignore_tags.split("\n")
        end
 
        def vim_puts(s)
@@ -548,9 +585,7 @@ ruby << EOF
                        end
                        m.cc = orig[:cc]
                        m.from = $email
-                       m.message_id = generate_message_id
                        m.charset = 'utf-8'
-                       m.content_transfer_encoding = '7bit'
                end
 
                lines = []
@@ -576,7 +611,7 @@ ruby << EOF
 
                reply.body = body_lines.join("\n")
 
-               lines += reply.to_s.lines.map { |e| e.chomp }
+               lines += reply.present.lines.map { |e| e.chomp }
                lines << ""
 
                cur = lines.count - 1
@@ -587,18 +622,13 @@ ruby << EOF
        def open_compose()
                lines = []
 
-               lines << "Date: #{Time.now().strftime('%a, %-d %b %Y %T %z')}"
                lines << "From: #{$email}"
                lines << "To: "
                cur = lines.count
 
                lines << "Cc: "
                lines << "Bcc: "
-               lines << "Message-Id: #{generate_message_id}"
                lines << "Subject: "
-               lines << "Mime-Version: 1.0"
-               lines << "Content-Type: text/plain; charset=utf-8"
-               lines << "Content-Transfer-Encoding: 7bit"
                lines << ""
                lines << ""
                lines << ""
@@ -609,21 +639,27 @@ ruby << EOF
        def folders_render()
                $curbuf.render do |b|
                        folders = VIM::evaluate('g:notmuch_folders')
-                       count_threads = VIM::evaluate('g:notmuch_rb_folders_count_threads')
+                       count_threads = VIM::evaluate('g:notmuch_folders_count_threads') == 1
                        $searches.clear
                        folders.each do |name, search|
                                q = $curbuf.query(search)
+                               $exclude_tags.each { |t|
+                                       q.add_tag_exclude(t)
+                               }
                                $searches << search
-                               count = count_threads ? q.search_threads.count : q.search_messages.count
+                               count = count_threads ? q.count_threads : q.count_messages
                                b << "%9d %-20s (%s)" % [count, name, search]
                        end
                end
        end
 
        def search_render(search)
-               date_fmt = VIM::evaluate('g:notmuch_rb_date_format')
+               date_fmt = VIM::evaluate('g:notmuch_date_format')
                q = $curbuf.query(search)
                q.sort = Notmuch::SORT_NEWEST_FIRST
+               $exclude_tags.each { |t|
+                       q.add_tag_exclude(t)
+               }
                $threads.clear
                t = q.search_threads
 
@@ -633,7 +669,7 @@ ruby << EOF
                                date = Time.at(e.newest_date).strftime(date_fmt)
                                subject = e.messages.first['subject']
                                if $mail_installed
-                                       subject = Mail::Field.new("Subject: " + subject).to_s
+                                       subject = Mail::Field.parse("Subject: " + subject).to_s
                                else
                                        subject = subject.force_encoding('utf-8')
                                end
@@ -895,7 +931,8 @@ ruby << EOF
                                if mime_type != "text/html"
                                        text = decoded
                                else
-                                       IO.popen("elinks --dump", "w+") do |pipe|
+                                       IO.popen(VIM::evaluate('exists("g:notmuch_html_converter") ? ' +
+                                                       'g:notmuch_html_converter : "elinks --dump"'), "w+") do |pipe|
                                                pipe.write(decode_body)
                                                pipe.close_write
                                                text = pipe.read
@@ -903,6 +940,16 @@ ruby << EOF
                                end
                                text
                        end
+
+                       def present
+                               buffer = ''
+                               header.fields.each do |f|
+                                       buffer << "%s: %s\r\n" % [f.name, f.to_s]
+                               end
+                               buffer << "\r\n"
+                               buffer << body.to_s
+                               buffer
+                       end
                end
        end