NeoBundleの相対パスからVim pluginのURLをブラウザで開く

Vim

この記事はVim Advent Calendar 2012の217日目の記事です。
216日目はmanga_osyoさんによるVim のプラグインを作る時に注意すべきことや便利なプラグインでした。

NeoBundleの相対パスから、Vim pluginのURLを開く設定についてです。

小ネタです。
たまにはこんなVACでもいいと思うので、皆さんもっと気軽にVACに投稿すればいいと思います。

はじめに

先日行われたTokyoVimのあとのmomonga.vim時のvimrc読書会で、 自分が書いてるvimrcの設定をthincaさんとsupermomongaさんに見せたところ 便利。と同意を頂いたので小ネタですが、VACに書くことにしました。

どういう時に使うかというと人のvimrcを読んでいる時、つまりvimrc読書会で このVim pluginなんだろう?と思った時にさっとURL開けるので便利です。

ちなみに、vimrc読書会は毎週土曜日23時から やっていてどなたでも参加可能なので、是非参加して見ることをおすすめします。

NeoBundleの相対パスから、Vim pluginのURLを開く

以下の設定をvimrcに書いて、例えばNeoBundle 'deris/vim-rengbang'と記載された行で、gzとタイプすると ブラウザでそのVim pluginのURL(この場合https://github.com/deris/vim-rengbang)をブラウザで開きます。
もしくは、visualモードでderis/vim-rengbangの部分を選択してgzとタイプしても開けます。

なお使用には、tyruさんが作られたopen-browser.vimを インストールしておく必要があります(NeoBundleでのインストールも一緒に下の設定に書いてます。)

NeoBundle 'tyru/open-browser'

nnoremap gz vi':<C-u>call ExecuteWithSelectedText('OpenBrowser https://github.com/%s')<CR>
vnoremap gz :<C-u>call ExecuteWithSelectedText('OpenBrowser https://github.com/%s')<CR>

" visualモードで最後に選択したテキストを%sで指定してコマンドを実行する {{{
function! ExecuteWithSelectedText(command)
  if a:command !~? '%s'
    return
  endif

  let reg = '"'
  let [save_reg, save_type] = [getreg(reg), getregtype(reg)]
  normal! gvy
  let selectedText = @"
  call setreg(reg, save_reg, save_type)
  if selectedText == ''
    return
  endif

  execute printf(a:command, selectedText)
endfunction
" }}}

gist

私のvimrcからほぼそのまま持ってきたものです。

normal modeの方は、vi'で相対パスを選択しているので、相対パスの文字列部分を ""でくくっている方はvi"のように適宜修正するか、visualモードで選択して開いてください。


ここまで書いてて、ちょっと汎用的じゃないなぁと思ったので、operator-user対応しました。
使用にはkanaさんが作られたoperator-userを インストールしておく必要があります(NeoBundleでのインストールも一緒に下の設定に書いてます。)

NeoBundle 'tyru/open-browser'
NeoBundle 'kana/vim-operator-user'

call operator#user#define('open-neobundlepath', 'OpenNeoBundlePath')
map gz <Plug>(operator-open-neobundlepath)
function! OpenNeoBundlePath(motion_wise)
  if line("'[") != line("']")
    return
  endif
  let start = col("'[") - 1
  let end = col("']")
  let sel = strpart(getline('.'), start, end - start)
  let sel = substitute(sel, '^\%(github\|gh\|git@github\.com\):\(.\+\)', 'https://github.com/\1', '')
  let sel = substitute(sel, '^\%(bitbucket\|bb\):\(.\+\)', 'https://bitbucket.org/\1', '')
  let sel = substitute(sel, '^gist:\(.\+\)', 'https://gist.github.com/\1', '')
  let sel = substitute(sel, '^git://', 'https://', '')
  if sel =~ '^https\?://'
    call openbrowser#open(sel)
  elseif sel =~ '/'
    call openbrowser#open('https://github.com/'.sel)
  else
    call openbrowser#open('https://github.com/vim-scripts/'.sel)
  endif
endfunction

gist

gzにkey mappingしているので、normalモードでgzとタイプし、 textobjects(i',iwとか)を入力するか、visualモードで選択したあとgzと タイプすることで、NeoBundleの相対パスからURLを開くことができます。

この設定では、最初の設定と比較して、http://~,https://~,git://~のパス、 およびNeoBundleのgithub:~,bitbucket:~,gist:~形式のパス、 www.vim.orgにあるVim pluginをホストしているhttps://github.com/vim-scripts のパス(NeoBundle 'project.tar.gz'とか)もURLで開くことができます。

operator-user対応したことで、若干タイプ数は増えましたが、大分汎用的になりました。

まとめ

以上が、NeoBundleの相対パスから、Vim pluginのURLを開く設定についてでした。

今回ご紹介した設定は、vimrc読書会に参加する上で便利な設定なので、本設定をした上で是非ご参加ください。毎週土曜日23時からやってます。

それではVim Advent Calendar 2012の217日目を終わります。

明日のVim Advent Calendar 2012はKSuzukiiiさんです。