読者です 読者をやめる 読者になる 読者になる

Vimで自動的にファイルタイプを設定してくれる便利プラグインvim-autoftを作りました!

Vim

あなたは次のような場面を経験したことはありませんか?

  1. Webページからコード片をコピーする
  2. 保存するまでもない時はファイルを作らずに、Vimの無名バッファーに貼り付ける
  3. シンタックスハイライトされねぇじゃねぇか!!!と怒る
  4. :set ft=ほげほげ あるいは :set filetype=ほげほげ あるいは :setf ほげほげ する

f:id:itchyny:20150113203515g:plain

いちいちファイルタイプを自分で設定するのは面倒ですよね…

そんなあなたに、便利なプラグインを作りました。

このプラグインはデフォルトでは何もしてくれないので、パターンとファイルタイプを設定する必要があります。例えば、次のように設定してみます。

let g:autoft_config = [
      \ { 'filetype': 'html' , 'pattern': '<\%(!DOCTYPE\|html\|head\|script\)' },
      \ { 'filetype': 'c'    , 'pattern': '^\s*#\s*\%(include\|define\)\>' },
      \ { 'filetype': 'diff' , 'pattern': '^diff -' },
      \ { 'filetype': 'sh'   , 'pattern': '^#!.*\%(\<sh\>\|\<bash\>\)\s*$' },
      \ ]

そして、コードを貼り付けてしばらく(updatetime)すると、勝手にファイルタイプを設定してくれるのです!
f:id:itchyny:20150113201428g:plain

わ〜い!!! 面倒なことを勝手にやってくれるなんて素敵すぎる〜!!!

使っている言語や、どういうパターンでファイルタイプを設定したいかなどは、個人差が大きいと思うので、デフォルトではなにもしないようになっています。また、既にファイルタイプが設定されているバッファーでは何もしません。私はこのプラグインを長いこと使っているのですが、あまり適当に設定し過ぎると、違うファイルタイプに誤判断してしまいますので、パターンはわりと慎重に設定しなくてはいけません。

コード入力中でもパターンをチェックしてくれるので、例えばhtml:5というパターンでhtmlになるように設定しておき、

      \ { 'filetype': 'html' , 'pattern': '<\%(!DOCTYPE\|html\|head\|script\)\|^html:5\s*$' },

mattn/emmet-vim · GitHub

autocmd FileType html imap <buffer><expr> <tab> pumvisible() ? "\<C-n>" : emmet#isExpandable() ? "\<Plug>(emmet-expand-abbr)" : "\<TAB>"

のように設定しておけば、

  1. 新規バッファーを開く
  2. html:5と打つ
  3. autoftがファイルタイプを設定
  4. FileTypeイベントがトリガーされて、<tab>がマッピングされる
  5. <tab>を打つと、emmetが展開してくれる

みたいなコンボを挿入モードのまま行うこともできます。(もちろんemmetのデフォルトのマッピングを使っても良し!)
f:id:itchyny:20150113201449g:plain

歴史を遡ってみると、vim-autoftの原点はhatena記法でした。ダイアリー記事の下書きをローカルのファイルに保存しておき、そのファイルを開いた時にft=hatenaをどうやって設定しようか迷っていました。拡張子.hatenaは違和感があったのでファイル名に頼りたくなかったし、modelineを使うのもローカルからWebに貼り付ける時にいちいち消さなくてはいけなくて(あるいはコメントとしてダイアリー記事のソースに残るのも)、嫌でした。そこでファイルの一行目が「*[」から始まるなら「ft=hatena」するという設定を2013年9月(実に1年半弱も前!)に行ったのが事の始まりでした。すぐさま他の拡張子の設定、例えば「\documentclass」から始まるならft=tex、「#include」から始まるならft=cという設定を増やしていきました。様々なファイルタイプを設定する中で、「パターンを見て→ファイルタイプを設定する」というのは一般化できるし、とても便利だし、プラグインにしてもいいなと思いたち、vim-autoftを作りました。無名バッファーでコーディングを始めて、勝手にファイルタイプがついて、そのファイルタイプの補完が有効になるのが心地良くなり、もはや手放せなくなっています。

とにかく、このプラグインはとっても便利なので是非とも使ってみてください!Vim正規表現の知識は必要ですが、うまいこと設定すれば先輩も後輩もびっくりな技を繰り出せると思います!びっくりさせることができたらプラグインを紹介してあげて下さい!よろしくお願いします!