class Mournmail::SummaryMode
Constants
- SUMMARY_MODE_MAP
Public Class Methods
new(buffer)
click to toggle source
Calls superclass method
# File lib/mournmail/summary_mode.rb, line 48 def initialize(buffer) super(buffer) buffer.keymap = SUMMARY_MODE_MAP end
Private Instance Methods
current_message()
click to toggle source
# File lib/mournmail/summary_mode.rb, line 658 def current_message uid = selected_uid item = Mournmail.current_summary[uid] message = Groonga["Messages"][item.cache_id] if message.nil? raise EditorError, "No message found" end message end
delete_from_summary(summary, uids, msg)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 668 def delete_from_summary(summary, uids, msg) summary.delete_item_if do |item| uids.include?(item.uid) end summary_text = summary.to_s summary.save foreground do @buffer.read_only_edit do @buffer.clear @buffer.insert(summary_text) end message(msg) end end
gsub_buffer(re, s)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 587 def gsub_buffer(re, s) @buffer.read_only_edit do s = @buffer.to_s.gsub(re, s) @buffer.replace(s) end end
ljust(s, n)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 615 def ljust(s, n) width = 0 str = +"" s.gsub(/\t/, " ").each_char do |c| w = Buffer.display_width(c) width += w if width > n width -= w break end str.concat(c) break if width == n end str + " " * (n - width) end
mark_as_seen(uid, update_server)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 540 def mark_as_seen(uid, update_server) summary_item = Mournmail.current_summary[uid] if summary_item && !summary_item.flags.include?(:Seen) summary_item.set_flag(:Seen, update_server: update_server) Mournmail.current_summary.save update_flags(summary_item) end end
marked_uids()
click to toggle source
# File lib/mournmail/summary_mode.rb, line 493 def marked_uids @buffer.to_s.scan(/^ *\d+(?=\*)/).map(&:to_i) end
next_message()
click to toggle source
# File lib/mournmail/summary_mode.rb, line 575 def next_message @buffer.end_of_line if @buffer.end_of_buffer? raise EditorError, "No more mail" end begin @buffer.re_search_forward(/^ *\d+ u/) rescue SearchError @buffer.forward_line end end
read_current_mail()
click to toggle source
# File lib/mournmail/summary_mode.rb, line 497 def read_current_mail summary = Mournmail.current_summary uid = selected_uid summary.read_mail(uid) end
refile_mails(imap, src_mailbox, uids, dst_mailbox)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 631 def refile_mails(imap, src_mailbox, uids, dst_mailbox) count = 0 uids.each_slice(100) do |uid_set| if dst_mailbox imap.uid_copy(uid_set, dst_mailbox) end imap.uid_store(uid_set, "+FLAGS", [:Deleted]) count += uid_set.size progress = (count.to_f * 100 / uids.size).round foreground do if dst_mailbox message("Refiling mails to #{dst_mailbox}... #{progress}%", log: false) else message("Deleting mails... #{progress}%", log: false) end end end foreground do if dst_mailbox message("Refiled mails to #{dst_mailbox}") else message("Deleted mails") end end end
scroll_up_or_next_uid()
click to toggle source
# File lib/mournmail/summary_mode.rb, line 503 def scroll_up_or_next_uid begin uid = selected_uid if uid == Mournmail.current_uid window = Mournmail.message_window if window.buffer.name == "*message*" old_window = Window.current begin Window.current = window scroll_up return nil ensure Window.current = old_window end end end uid rescue RangeError # may be raised by scroll_up next_message retry end end
selected_uid()
click to toggle source
# File lib/mournmail/summary_mode.rb, line 481 def selected_uid uid = @buffer.save_excursion { @buffer.beginning_of_line if !@buffer.looking_at?(/ *\d+/) Mournmail.current_mail = nil Mournmail.current_uid = nil raise EditorError, "No message found" end @buffer.match_string(0).to_i } end
show_message(mail)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 526 def show_message(mail) message_buffer = Buffer.find_or_new("*message*", undo_limit: 0, read_only: true) message_buffer.apply_mode(Mournmail::MessageMode) message_buffer.read_only_edit do message_buffer.clear message_buffer.insert(mail.render) message_buffer.beginning_of_buffer end message_buffer[:mournmail_mail] = mail window = Mournmail.message_window window.buffer = message_buffer end
show_search_result(messages, query: nil, buffer_name: "*search result*")
click to toggle source
# File lib/mournmail/summary_mode.rb, line 594 def show_search_result(messages, query: nil, buffer_name: "*search result*") summary_text = messages.map { |m| format("%s [ %s ] %s\n", m.date.strftime("%m/%d %H:%M"), ljust(m.from.to_s, 16), ljust(m.subject.to_s, 45)) }.join buffer = Buffer.find_or_new(buffer_name, undo_limit: 0, read_only: true) buffer.apply_mode(Mournmail::SearchResultMode) buffer.read_only_edit do buffer.clear buffer.insert(summary_text) buffer.beginning_of_buffer end buffer[:messages] = messages buffer[:query] = query switch_to_buffer(buffer) end
toggle_flag(uid, flag)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 549 def toggle_flag(uid, flag) summary_item = Mournmail.current_summary[uid] if summary_item Mournmail.background do summary_item.toggle_flag(flag) Mournmail.current_summary.save foreground do update_flags(summary_item) end end end end
update_flags(summary_item)
click to toggle source
# File lib/mournmail/summary_mode.rb, line 562 def update_flags(summary_item) @buffer.read_only_edit do @buffer.save_excursion do @buffer.beginning_of_buffer uid = summary_item.uid flags_char = summary_item.flags_char if @buffer.re_search_forward(/^( *#{uid}) ./) @buffer.replace_match(@buffer.match_string(1) + " " + flags_char) end end end end