Python
Vim
C言語
neovim

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

More than 1 year has passed since last update.

はじまり

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

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

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

neovimdein.vimについて

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

thinca/vim-templateを使う

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

とりあえず、dein.tomlにどう書けばいいのかで、vim-template/doc/template.jaxとにらめっこした結果、動作するようになったのが以下の通りです。

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のテンプレートを用意してます。

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

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

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+>を変換してくれます。

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言語

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

#include <stdio.h>

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

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に記載すればよかったですね。

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
dein.vim
NeoVim と dein.vim を使ってみる!
NeoVim、そしてdein.vimへ
thinca/vim-template