From: Ian Main Date: Thu, 23 Oct 2014 22:19:54 +0000 (+1700) Subject: [PATCH v2] VIM: Add URI handling X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=cda3407f4d87ebdd25a2dc194130be3844aeb13f;p=notmuch-archives.git [PATCH v2] VIM: Add URI handling --- diff --git a/4f/f2b14e2aa57f2a09a99ebad0a547b7a50b5cdf b/4f/f2b14e2aa57f2a09a99ebad0a547b7a50b5cdf new file mode 100644 index 000000000..d5aad989d --- /dev/null +++ b/4f/f2b14e2aa57f2a09a99ebad0a547b7a50b5cdf @@ -0,0 +1,234 @@ +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 B5ECD431FD7 + for ; Thu, 23 Oct 2014 15:20:07 -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 RXyZj0Z+QjP8 for ; + Thu, 23 Oct 2014 15:20:00 -0700 (PDT) +Received: from cmta11.telus.net (cmta11.telus.net [209.171.16.84]) + by olra.theworths.org (Postfix) with ESMTP id 5CF59431FBD + for ; Thu, 23 Oct 2014 15:20:00 -0700 (PDT) +Received: from ovo.mains.priv ([207.102.88.62]) by cmta11.telus.net with TELUS + id 6mKy1p0051LiWEf01mKygu; Thu, 23 Oct 2014 16:19:58 -0600 +X-Authority-Analysis: v=2.0 cv=daReKwre c=1 sm=2 + a=EcQDfIwDZEqJA1f7rVUV8Q==:17 a=tsa3CZZnAAAA:8 a=r_jncFobP5VkJRuen9wA:9 + a=-tTqbyaxCRf-iLxf:21 a=0_Bxu91NZpkSn-c3:21 + a=EcQDfIwDZEqJA1f7rVUV8Q==:117 +X-Telus-Outbound-IP: 207.102.88.62 +From: Ian Main +To: notmuch@notmuchmail.org +Subject: [PATCH v2] VIM: Add URI handling +Date: Thu, 23 Oct 2014 15:19:54 -0700 +Message-Id: <1414102794-12094-1-git-send-email-imain@stemwinder.org> +X-Mailer: git-send-email 1.9.3 +In-Reply-To: <1412281423-22441-1-git-send-email-imain@stemwinder.org> +References: <1412281423-22441-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: Thu, 23 Oct 2014 22:20: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 +--- + 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 838a904..5d84fde 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 'Attachment' line or all + attachments if the cursor is elsewhere. +-v View attachment on the current 'Attachment' 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 +