From 9bec9a51e79d6313ad14525ed54951e553ea9e8b Mon Sep 17 00:00:00 2001 From: Ian Main Date: Fri, 3 Oct 2014 13:23:43 +1700 Subject: [PATCH] [PATCH] VIM: Add URI handling --- 07/8f73a4a0225f3d3a47d06135cf2b28aa1f4e48 | 201 ++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 07/8f73a4a0225f3d3a47d06135cf2b28aa1f4e48 diff --git a/07/8f73a4a0225f3d3a47d06135cf2b28aa1f4e48 b/07/8f73a4a0225f3d3a47d06135cf2b28aa1f4e48 new file mode 100644 index 000000000..396f92d23 --- /dev/null +++ b/07/8f73a4a0225f3d3a47d06135cf2b28aa1f4e48 @@ -0,0 +1,201 @@ +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 EC08F431FBC + for ; Thu, 2 Oct 2014 13:23:56 -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 QBC4wxPKbWQP for ; + Thu, 2 Oct 2014 13:23:49 -0700 (PDT) +Received: from cmta9.telus.net (cmta9.telus.net [209.171.16.82]) + by olra.theworths.org (Postfix) with ESMTP id B6311431FB6 + for ; Thu, 2 Oct 2014 13:23:49 -0700 (PDT) +Received: from ovo.mains.priv ([207.102.88.62]) by cmta9.telus.net with TELUS + id yLPo1o00R1LiWEf01LPoop; Thu, 02 Oct 2014 14:23:49 -0600 +X-Authority-Analysis: v=2.0 cv=KNmE+i5o c=1 sm=2 + a=EcQDfIwDZEqJA1f7rVUV8Q==:17 a=S-IsBHyFrF4A:10 a=tsa3CZZnAAAA:8 + a=QFmAR4G64Eb_gXI2RCcA:9 a=MjTX9qxYB3U_cAoe:21 a=YysiEKMxJFnvkd6R:21 + a=EcQDfIwDZEqJA1f7rVUV8Q==:117 +X-Telus-Outbound-IP: 207.102.88.62 +From: Ian Main +To: notmuch@notmuchmail.org +Subject: [PATCH] VIM: Add URI handling +Date: Thu, 2 Oct 2014 13:23:43 -0700 +Message-Id: <1412281423-22441-1-git-send-email-imain@stemwinder.org> +X-Mailer: git-send-email 1.9.3 +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, 02 Oct 2014 20:23:57 -0000 + +This patch adds URI handling to the vim client. You can now press +'u' by default and the client will parse the current line and find +any URIs available. 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. + + Ian +--- + vim/notmuch.txt | 1 + + vim/notmuch.vim | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++------- + 2 files changed, 53 insertions(+), 7 deletions(-) + +diff --git a/vim/notmuch.txt b/vim/notmuch.txt +index 4374102..d336406 100644 +--- a/vim/notmuch.txt ++++ b/vim/notmuch.txt +@@ -72,6 +72,7 @@ q Quit view + A Archive (-inbox -unread) + I Mark as read (-unread) + t Tag (prompted) ++u Open URI + s Search + p Save patches + r Reply +diff --git a/vim/notmuch.vim b/vim/notmuch.vim +index 331e930..de82bb9 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 = { +@@ -37,10 +37,11 @@ let g:notmuch_show_maps = { + \ 'e': 'show_extract_msg()', + \ 's': 'show_save_msg()', + \ 'p': 'show_save_patches()', ++ \ 'u': 'show_open_uri()', + \ 'r': 'show_reply()', + \ '?': 'show_info()', + \ '': 'show_next_msg()', +- \ 'c': 'compose()', ++ \ 'c': 'compose("")', + \ } + + let g:notmuch_compose_maps = { +@@ -59,6 +60,7 @@ let s:notmuch_datetime_format_default = '%d.%m.%y %H:%M:%S' + let s:notmuch_reader_default = 'mutt -f %s' + let s:notmuch_sendmail_default = 'sendmail' + let s:notmuch_folders_count_threads_default = 0 ++let s:notmuch_open_uri_default = 'xdg-open' + + function! s:new_file_buffer(type, fname) + exec printf('edit %s', a:fname) +@@ -135,8 +137,8 @@ function! s:show_reply() + startinsert! + 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() +@@ -159,6 +161,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 +@@ -404,6 +445,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 +@@ -611,11 +656,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