[PATCH v3] VIM: Better reply handling with multiple emails

Ian Main imain at stemwinder.org
Mon Oct 27 13:35:46 PDT 2014


Fix reply handling when using multiple emails.  This adds a config
check for other_email and uses that information when formulating reply
headers.  It will strip out your own email addresses from the reply and
set the From: to be an email of yours found in the original message.

    Ian
---

Fix commit message.

 vim/notmuch.vim | 53 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 48 insertions(+), 5 deletions(-)

diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index cad9517..b480277 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -476,6 +476,7 @@ ruby << EOF
 	end
 
 	$db_name = nil
+	$all_emails = []
 	$email = $email_name = $email_address = nil
 	$searches = []
 	$threads = []
@@ -494,8 +495,14 @@ ruby << EOF
 		$db_name = get_config_item('database.path')
 		$email_name = get_config_item('user.name')
 		$email_address = get_config_item('user.primary_email')
+		$secondary_email_addresses = get_config_item('user.primary_email')
 		$email_name = get_config_item('user.name')
 		$email = "%s <%s>" % [$email_name, $email_address]
+		other_emails = get_config_item('user.other_email')
+		$all_emails = other_emails.split("\n")
+		# Add the primary to this too as we use it for checking
+		# addresses when doing a reply
+		$all_emails.unshift($email_address)
 	end
 
 	def vim_puts(s)
@@ -571,14 +578,50 @@ ruby << EOF
 		end
 	end
 
+	def is_our_address(address)
+		$all_emails.each do |addy|
+			if address.to_s.index(addy) != nil
+				return addy
+			end
+		end
+		return nil
+	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]
+			m.cc = []
+			m.to = []
+			email_addr = $email_address
+			# Use hashes for email addresses so we can eliminate duplicates.
+			to = Hash.new
+			cc = Hash.new
+			if orig[:from]
+				orig[:from].each do |o|
+					to[o.address] = o
+				end
+			end
+			if orig[:cc]
+				orig[:cc].each do |o|
+					cc[o.address] = o
+				end
+			end
+			if orig[:to]
+				orig[:to].each do |o|
+					cc[o.address] = o
+				end
+			end
+			to.each do |e_addr, addr|
+				m.to << addr
+			end
+			cc.each do |e_addr, addr|
+				if is_our_address(e_addr)
+					email_addr = is_our_address(e_addr)
+				else
+					m.cc << addr
+				end
 			end
-			m.cc = orig[:cc]
-			m.from = $email
+			m.to = m[:reply_to] if m[:reply_to]
+			m.from = "#{$email_name} <#{email_addr}>"
 			m.charset = 'utf-8'
 		end
 
-- 
1.9.3



More information about the notmuch mailing list