初めての vim プラグイン作成

この記事は Vim2 Advent Calendar 2020 - Qiita の8日目の記事です。 昨日は Hasu さんの 高校生がVimプラグインを作った話 でした。

はじめに

この記事では、アルパカ隊長 さんに教わりながら作成した はじめての Vimプラグインの話を書き記したいと思います。

作ったもの

github.com

複数行選択をしたのちに、 :Ghlink とコマンドを入力すると、選択した行がハイライトされたページへのリンクがクリップボードに保存される、と言うものです。

vim-plug の場合は、vim の設定ファイルに以下の通りに記述するとインストールされると思います。

Plug 'cat2koban/ghlink.vim'

簡単なデモを下に載せておきます。

f:id:sorehaedamame:20201208095052g:plain
ghlink.vim_demo

選択した後に : を押すと、コマンド入力部分に既に '<,'> が入力されていると思いますが、続けて Ghlink と打ちます。

もともと Slack などで質問する際に、複数行ハイライトされた状態のページへのリンクをさくっと取得できるようにしたいなと思ってこう言うプラグインを作ろうと思いました。 まぁ特に調べもせずに、Vimプラグインがどういうふうに作られるのか気になっていたので、車輪の再発明は気にせず学び目的で作成しました。 まだいくつか TODO が残っているので、引き続き実装は進めていこうと考えています。

作るときに便利だったもの

github.com

便利関数が多数定義されているプラグイン。これからのプラグイン開発では、こいつは必須になってくるのかなぁと思った代物です。ghlink.vim のコードでもその定義された関数を使っていて、便利さを 1行で実感しました。 2行目の s:Prelude.path2project_directory(a:path) の部分が vital の中で定義された関数を呼び出している箇所になります。 とはいえ実際の上の行では vital のインスタンスを作成していたりと、vital の関数を使う前にいくつかすることがあるのですが、それはドキュメントを参照してください。

function! s:current_git_path(path)
  let git_root = s:Prelude.path2project_directory(a:path) # ここで .git の管理するルートディレクトリからの現在のファイルパスを読み込んでいる
  return substitute(a:path, git_root."/", "", "g")
endfunction

ref: https://github.com/cat2koban/ghlink.vim/blob/2be9505c1568c18c47335fc99fabe4325dfffe10/autoload/ghlink.vim#L16-L19

おわりに

自分の中で課題と感じていることを、自分で作ったプラグインで解決する、という経験がなかったので、楽しみながら作ることができました。アルパカ隊長 さんには細かくご教示いただけて、とても感謝しています。あらかたプラグインを作る上での最低限のフォーマットは抑えられたのかなと思っているので、次は TODO をつぶしつつ、新しいプラグインの作成にも目を向けても面白いかもなと思っています。