From 9651601fef15f3cfb6ff803a0b3c6180dfae29b9 Mon Sep 17 00:00:00 2001 From: Ian Main Date: Sat, 25 Oct 2014 09:38:40 +1700 Subject: [PATCH] [PATCH v4 2/2] VIM: Add URI handling --- 7d/73af1b65028aa367f1e4f880638dc5504987aa | 237 ++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 7d/73af1b65028aa367f1e4f880638dc5504987aa diff --git a/7d/73af1b65028aa367f1e4f880638dc5504987aa b/7d/73af1b65028aa367f1e4f880638dc5504987aa new file mode 100644 index 000000000..e87f2767d --- /dev/null +++ b/7d/73af1b65028aa367f1e4f880638dc5504987aa @@ -0,0 +1,237 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id D9D43431FBD + for ; Fri, 24 Oct 2014 09:39:06 -0700 (PDT) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 + tests=[RCVD_IN_DNSWL_NONE=-0.0001] autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id jg1djzJ+HXxA for ; + Fri, 24 Oct 2014 09:38:59 -0700 (PDT) +Received: from cmta3.telus.net (cmta3.telus.net [209.171.16.76]) + by olra.theworths.org (Postfix) with ESMTP id 915BF431FC9 + for ; Fri, 24 Oct 2014 09:38:59 -0700 (PDT) +Received: from ovo.mains.priv ([207.102.88.62]) by cmta3.telus.net with TELUS + id 74es1p00k1LiWEf014ezkY; Fri, 24 Oct 2014 10:38:59 -0600 +X-Authority-Analysis: v=2.0 cv=GePJa3rL c=1 sm=2 + a=EcQDfIwDZEqJA1f7rVUV8Q==:17 a=tsa3CZZnAAAA:8 a=r_jncFobP5VkJRuen9wA:9 + a=ba93nok9ugSu9a0E:21 a=27csIzTaovQh-TYg:21 + a=EcQDfIwDZEqJA1f7rVUV8Q==:117 +X-Telus-Outbound-IP: 207.102.88.62 +From: Ian Main +To: notmuch@notmuchmail.org +Subject: [PATCH v4 2/2] VIM: Add URI handling +Date: Fri, 24 Oct 2014 09:38:40 -0700 +Message-Id: <1414168720-1574-2-git-send-email-imain@stemwinder.org> +X-Mailer: git-send-email 1.9.3 +In-Reply-To: <1414168720-1574-1-git-send-email-imain@stemwinder.org> +References: <1414168720-1574-1-git-send-email-imain@stemwinder.org> +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Fri, 24 Oct 2014 16:39:07 -0000 + +Add URI handling to the vim client. You can now press 'enter' by +default and the client will parse the current line and find any 'Part's +or URIs available for opening. If there are more than one it opens the +one under the cursor or else it opens the only one available. It also +supports mailto: URI's and will compose a new message when activated. + +By default xdg-open is used for everything but mailto: which generally +does the right thing afaict. + +Note that this is now dependant on the attachment patch in order to +make the nice 'enter' behavior work for both. + + Ian + +--- +Fixed commit message. + + vim/notmuch.txt | 3 ++- + vim/notmuch.vim | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++------ + 2 files changed, 70 insertions(+), 9 deletions(-) + +diff --git a/vim/notmuch.txt b/vim/notmuch.txt +index d5e1ad2..f51b20f 100644 +--- a/vim/notmuch.txt ++++ b/vim/notmuch.txt +@@ -74,7 +74,8 @@ I Mark as read (-unread) + t Tag (prompted) + e Extract attachment on the current 'Part' line or all + attachments if the cursor is elsewhere. +- View attachment on the current 'Part' line. ++ View email part on the current 'Part' line, or open URI under cursor ++ or on line. + s Search + p Save patches + r Reply +diff --git a/vim/notmuch.vim b/vim/notmuch.vim +index 1466e50..2f76f55 100644 +--- a/vim/notmuch.vim ++++ b/vim/notmuch.vim +@@ -12,7 +12,7 @@ let g:notmuch_folders_maps = { + \ '': 'folders_show_search()', + \ 's': 'folders_search_prompt()', + \ '=': 'folders_refresh()', +- \ 'c': 'compose()', ++ \ 'c': 'compose("")', + \ } + + let g:notmuch_search_maps = { +@@ -25,7 +25,7 @@ let g:notmuch_search_maps = { + \ 's': 'search_search_prompt()', + \ '=': 'search_refresh()', + \ '?': 'search_info()', +- \ 'c': 'compose()', ++ \ 'c': 'compose("")', + \ } + + let g:notmuch_show_maps = { +@@ -35,13 +35,13 @@ let g:notmuch_show_maps = { + \ 't': 'show_tag("")', + \ 'o': 'show_open_msg()', + \ 'e': 'show_extract_msg()', +- \ '': 'show_view_attachment()', ++ \ '': 'show_view_magic()', + \ 's': 'show_save_msg()', + \ 'p': 'show_save_patches()', + \ 'r': 'show_reply()', + \ '?': 'show_info()', + \ '': 'show_next_msg()', +- \ 'c': 'compose()', ++ \ 'c': 'compose("")', + \ } + + let g:notmuch_compose_maps = { +@@ -63,6 +63,7 @@ let s:notmuch_view_attachment_default = 'xdg-open' + let s:notmuch_attachment_tmpdir_default = '~/.notmuch/tmp' + let s:notmuch_folders_count_threads_default = 0 + let s:notmuch_compose_start_insert_default = 1 ++let s:notmuch_open_uri_default = 'xdg-open' + + function! s:new_file_buffer(type, fname) + exec printf('edit %s', a:fname) +@@ -141,8 +142,8 @@ function! s:show_reply() + end + endfunction + +-function! s:compose() +- ruby open_compose ++function! s:compose(to_email) ++ ruby open_compose(VIM::evaluate('a:to_email')) + let b:compose_done = 0 + call s:set_map(g:notmuch_compose_maps) + autocmd BufDelete call s:on_compose_delete() +@@ -155,6 +156,22 @@ function! s:show_info() + ruby vim_puts get_message.inspect + endfunction + ++function! s:show_view_magic() ++ let line = getline(".") ++ ++ruby << EOF ++ line = VIM::evaluate('line') ++ ++ # Easiest to check for 'Part' types first.. ++ match = line.match(/^Part (\d*):/) ++ if match and match.length == 2 ++ VIM::command('call s:show_view_attachment()') ++ else ++ VIM::command('call s:show_open_uri()') ++ end ++EOF ++endfunction ++ + function! s:show_view_attachment() + let line = getline(".") + ruby << EOF +@@ -226,6 +243,45 @@ ruby << EOF + EOF + endfunction + ++function! s:show_open_uri() ++ let line = getline(".") ++ let pos = getpos(".") ++ let col = pos[2] ++ruby << EOF ++ m = get_message ++ line = VIM::evaluate('line') ++ col = VIM::evaluate('col') - 1 ++ uris = URI.extract(line) ++ wanted_uri = nil ++ if uris.length == 1 ++ wanted_uri = uris[0] ++ else ++ uris.each do |uri| ++ # Check to see the URI is at the present cursor location ++ idx = line.index(uri) ++ if col >= idx and col <= idx + uri.length ++ wanted_uri = uri ++ break ++ end ++ end ++ end ++ ++ if wanted_uri ++ uri = URI.parse(wanted_uri) ++ if uri.class == URI::MailTo ++ vim_puts("Composing new email to #{uri.to}.") ++ VIM::command("call s:compose('#{uri.to}')") ++ else ++ vim_puts("Opening #{uri.to_s}.") ++ cmd = VIM::evaluate('g:notmuch_open_uri') ++ system(cmd, uri.to_s) ++ end ++ else ++ vim_puts('URI not found.') ++ end ++EOF ++endfunction ++ + function! s:show_open_msg() + ruby << EOF + m = get_message +@@ -481,6 +537,10 @@ function! s:set_defaults() + endif + endif + ++ if !exists('g:notmuch_open_uri') ++ let g:notmuch_open_uri = s:notmuch_open_uri_default ++ endif ++ + if !exists('g:notmuch_reader') + if exists('g:notmuch_rb_reader') + let g:notmuch_reader = g:notmuch_rb_reader +@@ -693,11 +753,11 @@ ruby << EOF + open_compose_helper(lines, cur) + end + +- def open_compose() ++ def open_compose(to_email) + lines = [] + + lines << "From: #{$email}" +- lines << "To: " ++ lines << "To: #{to_email}" + cur = lines.count + + lines << "Cc: " +-- +1.9.3 + -- 2.26.2