X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fnotmuch.vim;h=ad8b7c800cd5cca1b9b4c23fe226d57c4e414191;hp=4e4dfb04515e42d5ae63d69830b99fb19e9931ee;hb=HEAD;hpb=77c2853d7d521916191f75c6d31e2802c48e273a diff --git a/vim/notmuch.vim b/vim/notmuch.vim index 4e4dfb04..c1c2f63d 100644 --- a/vim/notmuch.vim +++ b/vim/notmuch.vim @@ -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 call s:compose_unload() - startinsert! + autocmd BufDelete 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 call s:compose_unload() - startinsert! + autocmd BufDelete 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