ファイルの一部を別ファイルに書き出す(?)Vimプラグインを作った


TL;DR

動機

ファイルの一部を別ファイルに書き出すプラグインが何の役に立つの?という方も多いと思います。
単にファイルの一部を別ファイルに書き出したいだけであれば、書き出したい部分を visual モードで選択して以下のコマンドを実行すれば実現できます。

:'<,'>w /path/to/file

それでもこのプラグインを作ったのは当然理由があります。

私は趣味でも仕事でも Clojure を使っていて REPL 駆動での開発をしています。
REPL 駆動では小さい式の単位で評価を繰り返しながら実装を進める関係上、個人的には既存コードに影響せず直ぐに捨てられるよう comment フォームをよく使っています。

(defn 何かすごい関数 [...]
  ...)

;; ちょっと動きを確認したい/検証したいときの捨てコード
(comment
  (let [res (何かすごい関数 ...)]   )
    (何か新しいこと res))

comment は既存の関数を使った検証でも利用しているのですが、この検証用のコードにおいて「前に書いたあの検証用コードまた使いたいなぁ」ということが稀によくありました。
そういうコードは再利用できるようにちゃんと管理しておけば良いのですが、ものぐさな性格と comment の消しやすさが災いしてすぐになくしてしまうのです。。

この問題を解決するために作ったのが vim-file-to-file プラグインです。

https://github.com/liquidz/vim-file-to-file

使い方

junegunn/vim-plug を使っている場合は以下のようにインストールしてください。

Plug 'liquidz/vim-file-to-file'

デフォルトで動作は有効になっています。
動きは至極単純で以下のような記述があるファイルを保存すると、保存時に ==FILE== パス から ==FILE== END までの間の行を指定されたパスに別途書き出してくれます。

;; ==FILE== /path/to/file.clj
(println "これらの行がファイル保存時に /path/to/file.clj に書き出されます")
;; ==FILE== END

これにより comment として書いた検証用のコードを comment を消したとしても別ファイルにとっておけるようにしようという魂胆です。

でも毎回 ==FILE== 〜 を書くのは面倒。。。
これだけでは使わなくなるのが落ちです。

vim-sonictemplateとの連携

そこで登場するのが mattn/vim-sonictemplate です。
本プラグインとの連携とは関係なく元々お世話になっているプラグインで、予め用意しておいたテンプレートを素早く簡単に展開してくれるのでコーディングで大いに役立ってくれます。

今回は例えば以下のようなテンプレートを用意してみましょう。
書き出す先のパスは vim-sonictemplate のテンプレートディレクトリである g:sonictemplate_vim_template_dir 配下にしましょう。

;; ==FILE== ~/src/github.com/liquidz/dotfiles/.vim/template/clojure/snip-{{_cursor_}}default.clj
(comment
  ::ok)
;; ==FILE== END

するとどうでしょう?このテンプレートを使って作った comment フォームは vim-sonictemplate のテンプレートとして保存されるので、再利用したくなったら vim-sonictemplate からすぐに利用できるようになります。
以下は実際に使ってみている例です。

(ちなみにテンプレートの選択には Shougo/ddu.vim を利用しています。)

この vim-sonictemplate との連携は個人的にはとても気に入っていてもっと早く作っておけば楽できたことが多かったのに!と思っています。

最後に

私は皆さんのように後で使いがちな検証用コードをちゃんと管理できないのでこういったプラグインの力を借りて効率アップを図るしかなかったのですが、
もしこれを便利と思ってくれる方が1人でもいれば嬉しいです。

なお vim-sonictemplate で上記のようなテンプレートを作る際に1つ罠がありまして、
このテンプレートを用意しようとテンプレートファイルを保存すると vim-file-to-file が動いて snip-{{_cursor_}}default.clj というファイルが保存されてしまいます。

vim-file-to-file の有効/無効を切り替えるための変数は用意しているので、thinca/vim-localrc などを使ってテンプレートディレクトリ配下では vim-file-to-file を無効化するなどすると良いでしょう。

let g:file_to_file#is_enabled = v:false

その他、ファイルに書き出す際の ==FILE== のようなキーワードが気に入らないから変更したいという場合はヘルプファイルを参照していただければと思います。

https://github.com/liquidz/vim-file-to-file/blob/main/doc/vim-file-to-file.txt

動きとしてはすごく単純なプラグインで同じようなものがあるとは思っているのですが検索力が足りず見つけられなかったので、
もし「そういう動作ならこのプラグインがあるよ」という情報があれば教えていただければと思います。(作る前に聞けばいいのにというのは無しです。欲しいと思った時に作ってたからです)