🦍

Markdownでサクッと選択した文字列にリンクを追加する方法

2021/12/02に公開

初めに

みなさん、GitHubのこの機能をご存じでしょうか?
URLがクリップボードにコピーされている場合、選択した文字列にリンクを追加してくれる便利な機能です。

これをVimで実現する方法を紹介します。

やり方

次の設定をvimrcに追加するだけです。クリップボードにURLがある場合、ヴィジュアルモードで文字列を選択してpでputするだけでリンクになります。

let s:clipboard_register = has('linux') || has('unix') ? '+' : '*'
function! InsertMarkdownLink() abort
  " use register `9`
  let old = getreg('9')
  let link = trim(getreg(s:clipboard_register))
  if link !~# '^http.*'
    normal! gvp
    return
  endif

  " replace `[text](link)` to selected text
  normal! gv"9y
  let word = getreg(9)
  let newtext = printf('[%s](%s)', word, link)
  call setreg(9, newtext)
  normal! gv"9p

  " restore old data
  call setreg(9, old)
endfunction

augroup markdown-insert-link
  au!
  au FileType markdown vnoremap <buffer> <silent> p :<C-u>call InsertMarkdownLink()<CR>
augroup END

上記を設定すると次のデモのように、同じことができます。

解説

次のことをVim scriptでやっています。かなり愚直なことをしています。

  1. 一時的にレジスタ9を使用するため、既存のテキストを一度退避
  2. getreg()クリップボードからテキストを取得して、httpから始まるURLかどうかを確認
  3. URLじゃない場合は通常のpを実行
  4. 選択した文字列をレジスタ9にyankして、テキストを取得
  5. 1で取得したURLと2で取得したテキストを使ってリンクの書式を組み立て、setreg()でレジスタ9に保存
  6. レジスタ9をputする
  7. もともとレジスタ9に保存しているテキストを戻す

最後に

みなさんはGitHubのissueを書くときもVimを使っていると思います。
これで少し作業効率が上がるのでぜひ試してみてください。

Discussion