🦍
Markdownでサクッと選択した文字列にリンクを追加する方法
初めに
みなさん、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でやっています。かなり愚直なことをしています。
- 一時的にレジスタ9を使用するため、既存のテキストを一度退避
-
getreg()
クリップボードからテキストを取得して、http
から始まるURLかどうかを確認 - URLじゃない場合は通常の
p
を実行 - 選択した文字列をレジスタ9にyankして、テキストを取得
- 1で取得したURLと2で取得したテキストを使ってリンクの書式を組み立て、
setreg()
でレジスタ9に保存 - レジスタ9をputする
- もともとレジスタ9に保存しているテキストを戻す
最後に
みなさんはGitHubのissueを書くときもVimを使っていると思います。
これで少し作業効率が上がるのでぜひ試してみてください。
Discussion