commit 5222f0defb5bcf3752ac3a59ad1ea60ecfa0e82e
parent 7e2bb889e617302c82e28d04cb2e0db5d35fbb08
Author: Hamish Downer <dmishd@gmail.com>
Date: Fri, 11 Feb 2011 00:24:08 +0000
started work on edit-message-async-mode
Diffstat:
2 files changed, 82 insertions(+), 0 deletions(-)
diff --git a/lib/sup/modes/edit-message-async-mode.rb b/lib/sup/modes/edit-message-async-mode.rb
@@ -0,0 +1,41 @@
+# edit-message-async-mode
+#
+
+class EditMessageAsyncMode < Mode
+ # TODO:
+ #
+ # * set up keymap - just X to say you're done
+
+ # * generate buffer text
+ # * override mode bits - killable etc.
+
+ # * initialize function - need
+ # ** file path
+ # ** info to restart edit mode it started in
+ def initialize
+ end
+
+ def edit_finished
+ #
+ # We need a edit_message_async_resume method, but maybe that
+ # should be in another mode?? The below code should run in it
+
+ # first make sure any external editor has exited
+ File.open(@file.path, 'r') { |f|
+ while !f.flock(File::LOCK_EX|File::LOCK_NB)
+ # ask user to check that any editor of that file has exited
+ # press enter when ready to continue
+ end
+ }
+ @edited = true if File.mtime(@file.path) > @mtime
+
+ return @edited unless @edited
+
+ header, @body = parse_file @file.path
+ @header = header - NON_EDITABLE_HEADERS
+ handle_new_text @header, @body
+ update
+
+ @edited
+ end
+end
diff --git a/lib/sup/modes/edit-message-mode.rb b/lib/sup/modes/edit-message-mode.rb
@@ -80,6 +80,7 @@ EOS
k.add :edit_cc, "Edit Cc:", 'c'
k.add :edit_subject, "Edit Subject", 's'
k.add :edit_message, "Edit message", :enter
+ k.add :edit_message_async, "Edit message asynchronously", 'X'
k.add :save_as_draft, "Save as draft", 'P'
k.add :attach_file, "Attach a file", 'a'
k.add :delete_attachment, "Delete an attachment", 'd'
@@ -184,6 +185,46 @@ EOS
@edited
end
+ def edit_message_async
+ @file = Tempfile.new "sup.#{self.class.name.gsub(/.*::/, '').camel_to_hyphy}"
+ @file.puts format_headers(@header - NON_EDITABLE_HEADERS).first
+ @file.puts
+ @file.puts @body.join("\n")
+ @file.close
+
+ @mtime = File.mtime @file.path
+
+ # put up buffer saying you can now edit the message in another
+ # terminal or app, and continue to use sup in the meantime.
+ # When you are done, navigate back to this buffer and press
+ # X to resume
+ mode = EditMessageAsync.new m, type_arg
+ BufferManager.spawn "Waiting for message \"#{m.subj}\" to be finished", mode
+
+ # now do we kill our own mode? how?
+
+ # We need a edit_message_async_resume method, but maybe that
+ # should be in another mode?? The below code should run in it
+
+ # first make sure any external editor has exited
+ File.open(@file.path, 'r') { |f|
+ while !f.flock(File::LOCK_EX|File::LOCK_NB)
+ # ask user to check that any editor of that file has exited
+ # press enter when ready to continue
+ end
+ }
+ @edited = true if File.mtime(@file.path) > @mtime
+
+ return @edited unless @edited
+
+ header, @body = parse_file @file.path
+ @header = header - NON_EDITABLE_HEADERS
+ handle_new_text @header, @body
+ update
+
+ @edited
+ end
+
def killable?
!edited? || BufferManager.ask_yes_or_no("Discard message?")
end