neovimでテンプレートを用意した

## はじまり
研究室に所属してから、emacsを習い…vimに手を出し…vim主軸の生活で基本的な操作に慣れました。その結果、pluginによる補完とかに興味を持ったので、pluginを管理する上でneobundleを扱うか、neovimに移行して、dein.vimを扱うかでneovimを選びました。

日々新しいプログラムを書き続けているわけではないものの、基本的情報が含まれたテンプレートってやっぱ便利そうじゃないですか。あと、スマートさを感じます。

そんなモチベーションでneovimでテンプレート読み込みをできるようにしました。

### [neovim](https://neovim.io/)と[dein.vim](https://github.com/Shougo/dein.vim)について

記事を書いてる方がたくさんいらっしゃるので、そちらをご参照ください。私は以下の記事などを参照しながら、設定しました。

* [NeoVim と dein.vim を使ってみる!](https://qiita.com/Ress/items/7e71e007cf8d41a07a1a)
* [NeoVim、そしてdein.vimへ](https://qiita.com/okamos/items/2259d5c770d51b88d75b)

## `thinca/vim-template`を使う

自作の環境設定を投稿されている方は多くて、いろいろ拝見させていただいたのですが、pluginを用いるのが初心者にはわかりやすいかなと思って、[thinca/vim-template](https://github.com/thinca/vim-template)を使用することにしました。

とりあえず、`dein.toml`にどう書けばいいのかで、[vim-template/doc/template.jax](https://github.com/thinca/vim-template/blob/master/doc/template.jax)とにらめっこした結果、動作するようになったのが以下の通りです。

```toml:dein.toml
[[plugins]]
repo = 'thinca/vim-template'
hook_add = '''
let g:template_basedir = '~/.config'
let g:template_free_pattern = 'template'
'''
```

neovimの設定ファイル置き場である`.config`は以下のような構造にしています。`template`ディレクトリ下に`template.*`と命名して置いておけば、空ファイルを読み込む際にテンプレートで開いてくれます。私はC言語、python、texのテンプレートを用意してます。

```zsh:tree
~/.config
  ├── dein
  │   ├── clang.toml
  │   ├── dein.toml
  │   └── dein_lazy.toml
  ├── nvim
  |   └── init.vim
  └── template
      ├── template.c
      ├── template.py
      └── template.tex
```

## テンプレートを書いてみる

pythonのテンプレートを例に説明していきます。

```python:template.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# FileName: 	<+FILENAME+>
# CreatedDate:  <+DATE+>
#

<+CURSOR+>
```

まだ、python初心者なこともあって、`import`はテンプレートに書いていません。個人的に、ファイル名とファイル作成日は欲しいなぁと思っていたので、そうなるように書いてあります。

https://github.com/thinca/vim-template/blob/master/doc/template.jax
の記載そのままですが、以下のように`init.vim`に書いておくと、`<+FILENAME+>`,`<+DATE+>`,`<+CURSOR+>`を変換してくれます。

```vim:init.vim
" テンプレート中に含まれる文字を置き換える
autocmd MyAutoCmd User plugin-template-loaded call s:template_keywords()
function! s:template_keywords()
    silent! %s/<+DATE+>/\=strftime('%Y-%m-%d %T')/g
    silent! %s/<+FILENAME+>/\=expand('%:r')/g
endfunction
" テンプレート中に含まれる'<+CURSOR+>'にカーソルを移動
autocmd MyAutoCmd User plugin-template-loaded
    \   if search('<+CURSOR+>')
    \ |   silent! execute 'normal! "_da>'
    \ | endif
```

* `<+FILENAME+>`
 拡張子抜きでファイル名が置換されます。
* `<+DATE+>`
 テンプレートを読み込んだ時にイベントが発生するので、`<+DATE+>`にファイル作成日が置換されます。気が向いた時に`:w`で最終更新日も記入されるようにしたいものですね。
* `<+CURSOR+>`
 カーソルの位置が移動されて、展開されます。このカーソル位置が指定できるのは、C言語やtexの時、恩恵を感じました。
 
### template sample
参考になるかはわからないですが、一応晒します。
C言語

```c:template.c
//
// FileName:       <+FILENAME+>
// CreatedDate:    <+DATE+>
//

#include <stdio.h>

int main(void){
        <+CURSOR+>
        return 0;
}
```

tex

```tex:template.tex
%
% FileName:     <+FILENAME+>
% CreatedDate:  <+DATE+>
%

\documentclass{jsarticle}
\title{<+CURSOR+>}
\author{your name}
\date{\today}

\begin{document}
\maketitle

\end{document}
```

## 2017/10/13追記
neovimの起動速度の高速化を試みていたところで気づいたのですが、`init.vim`に記載するように書いた`autocmd`は以下のように`dein.toml`に記載すればよかったですね。

```toml:dein.toml
[[plugins]]
repo = 'thinca/vim-template'
hook_add = '''
let g:template_basedir = '~/.config'
let g:template_free_pattern = 'template'
" テンプレート中に含まれる文字を置き換える
au MyAutoCmd User plugin-template-loaded call s:template_keywords()
function! s:template_keywords()
    silent! %s/<+DATE+>/\=strftime('%Y-%m-%d %T')/g
    silent! %s/<+FILENAME+>/\=expand('%:r')/g
endfunction
" テンプレート中に含まれる'<+CURSOR+>'にカーソルを移動
au MyAutoCmd User plugin-template-loaded
    \   if search('<+CURSOR+>')
    \ |   silent! execute 'normal! "_da>'
    \ | endif
'''
```

## 参照元
[neovim](https://neovim.io/)
[dein.vim](https://github.com/Shougo/dein.vim)
[NeoVim と dein.vim を使ってみる!](https://qiita.com/Ress/items/7e71e007cf8d41a07a1a)
[NeoVim、そしてdein.vimへ](https://qiita.com/okamos/items/2259d5c770d51b88d75b)
[thinca/vim-template](https://github.com/thinca/vim-template)