X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fnotmuch.vim;h=42c5f188431ee14ed50390a1c9818a66250088fc;hp=aa1b7ef6677b7543728b180a08f3e635f190e77e;hb=24dc32aef7d7bba4f54a7ff665940b3a7b419581;hpb=a760e4ab47e152a9d3b4fa9b733f82723ebaaefe diff --git a/vim/notmuch.vim b/vim/notmuch.vim index aa1b7ef6..42c5f188 100644 --- a/vim/notmuch.vim +++ b/vim/notmuch.vim @@ -12,6 +12,7 @@ let g:notmuch_rb_folders_maps = { \ '': 'folders_show_search()', \ 's': 'folders_search_prompt()', \ '=': 'folders_refresh()', + \ 'c': 'compose()', \ } let g:notmuch_rb_search_maps = { @@ -24,6 +25,7 @@ let g:notmuch_rb_search_maps = { \ 's': 'search_search_prompt()', \ '=': 'search_refresh()', \ '?': 'search_info()', + \ 'c': 'compose()', \ } let g:notmuch_rb_show_maps = { @@ -38,6 +40,7 @@ let g:notmuch_rb_show_maps = { \ 'r': 'show_reply()', \ '?': 'show_info()', \ '': 'show_next_msg()', + \ 'c': 'compose()', \ } let g:notmuch_rb_compose_maps = { @@ -148,6 +151,14 @@ function! s:show_reply() startinsert! endfunction +function! s:compose() + ruby open_compose + let b:compose_done = 0 + call s:set_map(g:notmuch_rb_compose_maps) + autocmd BufUnload call s:compose_unload() + startinsert! +endfunction + function! s:show_info() ruby vim_puts get_message.inspect endfunction @@ -208,6 +219,9 @@ endfunction function! s:search_search_prompt() let text = input('Search: ') + if text == "" + return + endif setlocal modifiable ruby << EOF $cur_search = VIM::evaluate('text') @@ -421,13 +435,14 @@ ruby << EOF require 'notmuch' require 'rubygems' require 'tempfile' + require 'socket' begin require 'mail' rescue LoadError end $db_name = nil - $email_address = nil + $email = $email_name = $email_address = nil $searches = [] $buf_queue = [] $threads = [] @@ -452,7 +467,9 @@ ruby << EOF end $db_name = $config['database.path'] - $email_address = "%s <%s>" % [$config['user.name'], $config['user.primary_email']] + $email_name = $config['user.name'] + $email_address = $config['user.primary_email'] + $email = "%s <%s>" % [$email_name, $email_address] end def vim_puts(s) @@ -490,71 +507,108 @@ ruby << EOF end end - def open_reply(orig) + def generate_message_id + t = Time.now + random_tag = sprintf('%x%x_%x%x%x', + t.to_i, t.tv_usec, + $$, Thread.current.object_id.abs, rand(255)) + return "<#{random_tag}@#{Socket.gethostname}.notmuch>" + end + + def open_compose_helper(lines, cur) help_lines = [ 'Notmuch-Help: Type in your message here; to help you use these bindings:', 'Notmuch-Help: ,s - send the message (Notmuch-Help lines will be removed)', 'Notmuch-Help: ,q - abort the message', ] + + dir = File.expand_path('~/.notmuch/compose') + FileUtils.mkdir_p(dir) + Tempfile.open(['nm-', '.mail'], dir) do |f| + f.puts(help_lines) + f.puts + f.puts(lines) + + sig_file = File.expand_path('~/.signature') + if File.exists?(sig_file) + f.puts("-- ") + f.write(File.read(sig_file)) + end + + f.flush + + cur += help_lines.size + 1 + + VIM::command("let s:reply_from='%s'" % $email_address) + VIM::command("call s:new_file_buffer('compose', '#{f.path}')") + VIM::command("call cursor(#{cur}, 0)") + end + end + + def open_reply(orig) reply = orig.reply do |m| # fix headers if not m[:reply_to] m.to = [orig[:from].to_s, orig[:to].to_s] end m.cc = orig[:cc] - m.from = $email_address + m.from = $email + m.message_id = generate_message_id m.charset = 'utf-8' m.content_transfer_encoding = '7bit' end - dir = File.expand_path('~/.notmuch/compose') - FileUtils.mkdir_p(dir) - Tempfile.open(['nm-', '.mail'], dir) do |f| - lines = [] - - lines += help_lines - lines << '' - - body_lines = [] - if $mail_installed - addr = Mail::Address.new(orig[:from].value) - name = addr.name - name = addr.local + "@" if name.nil? && !addr.local.nil? - else - name = orig[:from] - end - name = "somebody" if name.nil? - - body_lines << "%s wrote:" % name - part = orig.find_first_text - part.convert.each_line do |l| - body_lines << "> %s" % l.chomp - end - body_lines << "" - body_lines << "" - body_lines << "" + lines = [] - reply.body = body_lines.join("\n") + body_lines = [] + if $mail_installed + addr = Mail::Address.new(orig[:from].value) + name = addr.name + name = addr.local + "@" if name.nil? && !addr.local.nil? + else + name = orig[:from] + end + name = "somebody" if name.nil? - lines += reply.to_s.lines.map { |e| e.chomp } - lines << "" + body_lines << "%s wrote:" % name + part = orig.find_first_text + part.convert.each_line do |l| + body_lines << "> %s" % l.chomp + end + body_lines << "" + body_lines << "" + body_lines << "" - old_count = lines.count - 1 + reply.body = body_lines.join("\n") - f.puts(lines) + lines += reply.to_s.lines.map { |e| e.chomp } + lines << "" - sig_file = File.expand_path('~/.signature') - if File.exists?(sig_file) - f.puts("-- ") - f.write(File.read(sig_file)) - end + cur = lines.count - 1 - f.flush + open_compose_helper(lines, cur) + end - VIM::command("let s:reply_from='%s'" % reply.from.first.to_s) - VIM::command("call s:new_file_buffer('compose', '#{f.path}')") - VIM::command("call cursor(#{old_count}, 0)") - end + 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 << "" + + open_compose_helper(lines, cur) end def folders_render()