Vimでライブラリをスニペットとして登録する

僕は今まで競プロ用のライブラリをファイルとして保存しておいて、それをコピペするスタイルを取っていました。しかし、いささか面倒になってきたのでスニペット化してみました。

実現したいこと

たとえばmint.cppというファイルがあるとします。

template<int MOD>struct MInt {
// 実装
};
using mint = MInt<1000000007>;

これをlibmintでスニペットとして呼び出せるようにします。

スニペット設定を生成

以下のようなディレクトリ構造を想定しています。

./create.sh
./library
  - mint.cpp
./snippets

このとき、以下のcreate.shを実行するだけでNeosnippet用の設定ファイルが生成されます。

#!/bin/bash
absolute_pwd=$(cd $(dirname $0); pwd) # create.shがあるディレクトリの絶対パス
snip_dir=$absolute_pwd/snippets

mkdir -p $snip_dir # snippetファイルが生成されていくディレクトリ
for path in $(ls ./library/*.cpp); do
    filename=$(basename $path .cpp)

    echo "snippet lib${filename}" > $snip_dir/${filename}.snip
    cat $path | sed -e 's/^/ /g' >> $snip_dir/${filename}.snip
done

# 使いやすい場所へシンボリックリンクを張る
[ -e "$XDG_CONFIG_HOME/nvim/snippets/library" ] || ln -sf $absolute_pwd/snippets $XDG_CONFIG_HOME/nvim/snippets/library

あとは$ bash create.shを実行するだけでスニペットファイルが生成されます。

備考

最後のシンボリックリンクは必要に応じて使ってください。たとえばneosnippetが読み込むディレクトリ以下にあるcpp.snip(~/.config/nvim/snippets/cpp.snipなど)に以下のように書いていた場合はシンボリックリンクを張っておくと便利です。

include ./library/*.snip