Vim Advent Calendar 2013 102日目: ヤンクした URL を貼り付けて neosnippet を展開する

この記事は Vim Advent Calendar 2013 102日目の記事になります。


上記の記事ではオペレータを使用したアプローチでしたが、わたしは neosnippet を使ってヤンクした URL を貼り付けた状態で展開するようにしてみました。
neosnippet のスニペットは `` で囲むことで Vim script の式を埋め込むことができます。

[スニペット]

snippet mdlink
options word
     [${2:$1}](${1:`getreg("*") =~ '^https\?:\/\/.*$' ? getreg("*") : ""`})


スニペットの編集は :NeoSnippetEdit で行うことができます。
上記のようなスニペットを定義して URL をヤンクしている状態で mdlink を展開すると

[http://vimtaku.github.io/blog/2014/03/08/vim-operator-mdurl/](http://vimtaku.github.io/blog/2014/03/08/vim-operator-mdurl/)

このようにヤンクした URL を埋め込んで展開する事ができます。
ちなみに URL はマークのデフォルト値として埋め込んでいるので展開後に編集する事も可能です。

[Web ページのタイトルも一緒にスニペットで展開する]

webapi.vim を使用することで URL から Web ページのタイトルを取得する事ができるのでそれを利用して URL と同様にページのタイトルも一緒に埋め込んでしまう事ができます。

[スクリプト]

function! WebPageTitle(url)
    if a:url !~ '^https\?:\/\/.*$'
        return ""
    endif
    let body = webapi#http#get(a:url).content
    let enc = matchstr(body, '<meta[^>]\+content=["''][^;"'']\+;\s*charset=\zs[^;"'']\+\ze["''][^>]*>')
    if len(enc) == 0
        let enc = matchstr(body, '<meta\s\+charset=["'']\?\zs[^"'']\+\ze["'']\?[^>]*>')
    endif

    if empty(enc)
        let enc = matchstr(body, 'charset=["'']\zs[^"'']*\ze["'']')
    endif
    return iconv(matchstr(body, '<title>\zs.*\ze<\/title>'), empty(enc) ? 'uft-8' : enc, &enc)
endfunction

[スニペット]

snippet mdtitlelink
options word
     [${2:`WebPageTitle(getreg("*"))`}](${1:`getreg("*") =~ '^https\?:\/\/.*$' ? getreg("*") : ""`})


これで URL をヤンクした状態で mdtitlelink を展開すると

[vim-operator-mdurl という vim plugin 書いた - vimtaku blog](http://vimtaku.github.io/blog/2014/03/08/vim-operator-mdurl/)

と、いう風にタイトルも一緒に展開する事ができます。


vim-operator-mdurl とはアプローチが違いますが、これはこれで便利そうですね。
neosnippet のスニペットには Vim script を埋め込む事ができるので でまだまだ色々とできそうです。