X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=vim%2Fnotmuch.vim;h=aa1b7ef6677b7543728b180a08f3e635f190e77e;hp=0ccaaf1ebebf32e5f82ec73389448f8bf278e8ce;hb=a760e4ab47e152a9d3b4fa9b733f82723ebaaefe;hpb=6f8a1345ebd5b915d8a002baf3faa0f2b3d603a2 diff --git a/vim/notmuch.vim b/vim/notmuch.vim index 0ccaaf1e..aa1b7ef6 100644 --- a/vim/notmuch.vim +++ b/vim/notmuch.vim @@ -34,6 +34,7 @@ let g:notmuch_rb_show_maps = { \ 'o': 'show_open_msg()', \ 'e': 'show_extract_msg()', \ 's': 'show_save_msg()', + \ 'p': 'show_save_patches()', \ 'r': 'show_reply()', \ '?': 'show_info()', \ '': 'show_next_msg()', @@ -80,6 +81,7 @@ 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 @@ -180,6 +182,20 @@ ruby << EOF EOF endfunction +function! s:show_save_patches() +ruby << EOF + q = $curbuf.query($cur_thread) + t = q.search_threads.first + n = 0 + t.toplevel_messages.first.replies.each do |m| + next if not m['subject'] =~ /^\[PATCH.*\]/ + file = "%04d.patch" % [n += 1] + system "notmuch show --format=mbox id:#{m.message_id} > #{file}" + end + vim_puts "Saved #{n} patches" +EOF +endfunction + function! s:show_tag(intags) if empty(a:intags) let tags = input('tags: ') @@ -195,6 +211,7 @@ function! s:search_search_prompt() setlocal modifiable ruby << EOF $cur_search = VIM::evaluate('text') + $curbuf.reopen search_render($cur_search) EOF setlocal nomodifiable @@ -206,6 +223,7 @@ endfunction function! s:search_refresh() setlocal modifiable + ruby $curbuf.reopen ruby search_render($cur_search) setlocal nomodifiable endfunction @@ -218,7 +236,6 @@ function! s:search_tag(intags) endif ruby do_tag(get_thread_id, VIM::evaluate('l:tags')) norm j - call s:search_refresh() endfunction function! s:folders_search_prompt() @@ -228,6 +245,7 @@ endfunction function! s:folders_refresh() setlocal modifiable + ruby $curbuf.reopen ruby folders_render() setlocal nomodifiable endfunction @@ -255,11 +273,14 @@ function! s:show_next_thread() endfunction function! s:kill_this_buffer() - bdelete! ruby << EOF - $buf_queue.pop - b = $buf_queue.last - VIM::command("buffer #{b}") if b + if $buf_queue.size > 1 + $curbuf.close + VIM::command("bdelete!") + $buf_queue.pop + b = $buf_queue.last + VIM::command("buffer #{b}") if b + end EOF endfunction @@ -277,6 +298,7 @@ function! s:new_buffer(type) keepjumps 0d 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 @@ -296,33 +318,31 @@ ruby << EOF $cur_thread = thread_id $messages.clear $curbuf.render do |b| - do_read do |db| - q = db.query(get_cur_view) - q.sort = 0 - 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 = Time.at(msg.date).strftime(date_fmt) - nm_m.start = b.count - b << "%s %s (%s)" % [msg['from'], date, msg.tags] - b << "Subject: %s" % [msg['subject']] - b << "To: %s" % m['to'] - b << "Cc: %s" % m['cc'] - b << "Date: %s" % m['date'] - nm_m.body_start = b.count - b << "--- %s ---" % part.mime_type - part.convert.each_line do |l| - b << l.chomp - end - b << "" - nm_m.end = b.count + q = $curbuf.query(get_cur_view) + q.sort = Notmuch::SORT_OLDEST_FIRST + 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 = Time.at(msg.date).strftime(date_fmt) + nm_m.start = b.count + b << "%s %s (%s)" % [msg['from'], date, msg.tags] + b << "Subject: %s" % [msg['subject']] + b << "To: %s" % msg['to'] + b << "Cc: %s" % msg['cc'] + b << "Date: %s" % msg['date'] + nm_m.body_start = b.count + b << "--- %s ---" % part.mime_type + part.convert.each_line do |l| + b << l.chomp end - b.delete(b.count) + b << "" + nm_m.end = b.count end + b.delete(b.count) end $messages.each_with_index do |msg, i| VIM::command("syntax region nmShowMsg#{i}Desc start='\\%%%il' end='\\%%%il' contains=@nmShowMsgDesc" % [msg.start, msg.start + 1]) @@ -394,7 +414,7 @@ function! s:set_defaults() endif endfunction -function! s:NotMuch() +function! s:NotMuch(...) call s:set_defaults() ruby << EOF @@ -470,24 +490,6 @@ ruby << EOF end end - def do_write - db = Notmuch::Database.new($db_name, :mode => Notmuch::MODE_READ_WRITE) - begin - yield db - ensure - db.close - end - end - - def do_read - db = Notmuch::Database.new($db_name) - begin - yield db - ensure - db.close - end - end - def open_reply(orig) help_lines = [ 'Notmuch-Help: Type in your message here; to help you use these bindings:', @@ -560,21 +562,19 @@ ruby << EOF folders = VIM::evaluate('g:notmuch_rb_folders') count_threads = VIM::evaluate('g:notmuch_rb_folders_count_threads') $searches.clear - do_read do |db| - folders.each do |name, search| - q = db.query(search) - $searches << search - count = count_threads ? q.search_threads.count : q.search_messages.count - b << "%9d %-20s (%s)" % [count, name, search] - end + folders.each do |name, search| + q = $curbuf.query(search) + $searches << search + count = count_threads ? q.search_threads.count : q.search_messages.count + b << "%9d %-20s (%s)" % [count, name, search] end end end def search_render(search) date_fmt = VIM::evaluate('g:notmuch_rb_date_format') - db = Notmuch::Database.new($db_name) - q = db.query(search) + q = $curbuf.query(search) + q.sort = Notmuch::SORT_NEWEST_FIRST $threads.clear t = q.search_threads @@ -582,10 +582,11 @@ ruby << EOF items.each do |e| authors = e.authors.to_utf8.split(/[,|]/).map { |a| author_filter(a) }.join(",") date = Time.at(e.newest_date).strftime(date_fmt) + subject = e.messages.first['subject'] if $mail_installed - subject = Mail::Field.new("Subject: " + e.subject).to_s + subject = Mail::Field.new("Subject: " + subject).to_s else - subject = e.subject.force_encoding('utf-8') + subject = subject.force_encoding('utf-8') end b << "%-12s %3s %-20.20s | %s (%s)" % [date, e.matched_messages, authors, subject, e.tags] $threads << e.thread_id @@ -594,7 +595,7 @@ ruby << EOF end def do_tag(filter, tags) - do_write do |db| + $curbuf.do_write do |db| q = db.query(filter) q.search_messages.each do |e| e.freeze @@ -611,6 +612,40 @@ ruby << EOF e.thaw e.tags_to_maildir_flags end + q.destroy! + end + end + + module DbHelper + def init(name) + @name = name + @db = Notmuch::Database.new($db_name) + @queries = [] + end + + def query(*args) + q = @db.query(*args) + @queries << q + q + end + + def close + @queries.delete_if { |q| ! q.destroy! } + @db.close + end + + def reopen + close if @db + @db = Notmuch::Database.new($db_name) + end + + def do_write + db = Notmuch::Database.new($db_name, :mode => Notmuch::MODE_READ_WRITE) + begin + yield db + ensure + db.close + end end end @@ -659,6 +694,8 @@ ruby << EOF end class VIM::Buffer + include DbHelper + def <<(a) append(count(), a) end @@ -828,9 +865,13 @@ ruby << EOF get_config EOF - call s:folders() + if a:0 + call s:search(join(a:000)) + else + call s:folders() + endif endfunction -command NotMuch :call s:NotMuch() +command -nargs=* NotMuch call s:NotMuch() " vim: set noexpandtab: