それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

vimで開いたファイル のシンタックスハイライトを自動判別できるよう設定する。

vim でファイルを開くとシンタックスハイライトされないことがある。

f:id:takuya_1st:20160224025816p:plain

現在、どの設定で開いているのか。

シンタックスハイライトは、vim の filetype 設定に依っている。

そこで、ファイルタイプを確認すると現在どのファイルタイプで開いているか確認できる。

:set filetype?

これでファイルタイプが確認できる。

ファイルタイプを修正する。

現在のファイルタイプを変更するには、次のようにする。

:set filetype=javascript

現在のシンタックス判定も確認。

syntax 設定は、filetypeに引きづられる。そのためfiletypeを優先してみておけばいいが、念のため確認しておく

:set syntax?

filetypeはそのままで、syntaxだけを変更しても目的は果たせそう。

シェルスクリプトで作ったnode.js 実行ファイルが正しく解釈されない。

普通は、拡張子などで判断される、だけれど判別がうまくいかない時がある。シェルスクリプトなど拡張子なしのコマンドを作った時だ、しかもシェル呼び出しは行数が少ないことがおおく中身からも判別が失敗しました。

判断がうまくいかないよくある例。

#!/usr/local/bin/node 
var url = require('url')

自動判定を追加する。

Vimのファイル・タイプの判断を自分で上書きすることが出来る。

ファイルの判定は、次の二箇所で主に行われる。 - ~/.vim/filetype.vim ファイル名でfiletypeの決定 - ~/.vim/scripts.vim ファイル内容でfiletypeの決定

~/.vim/ は :set runtimepath? でPathを通している箇所。

ファイルの内容で、判別を書く

今回は、シェルスクリプトShebang を元に判別したいので

~/.vim/scripts.vim
if did_filetype()
    finish
endif
if getline(1) =~ 'node'
    set filetype=javascript
        finish
endif

このように書いた。 getline(1)shebang を取得して、node が含まれていたら javascript とした。

これで、正しくファイルタイプが決定されシンタックスハイライトが決定された

無事ハイライトが自動で決まった。

f:id:takuya_1st:20160224025855p:plain

拡張子の設定。

拡張子の設定は、次のコマンドで書き換えられる。

autocmd BufRead,BufNewFile *.erb set filetype=eruby.html

これは、~/.vim/filetype.vim や ~/.vimrc にでも書いておけば済みそうだ。

定義済みのシンタックスハイライト

定義済みのシンタックスハイライトは、Neobuldleなどでごちゃごちゃしてしまうが

mac のhomebrew でインストールした vim は /usr/local/share/vim に設定が作られるので、次の場所に存在した。

ls /usr/local/share/vim/vim74/syntax

まとめ

  • filetype によって syntax が決まる。
  • filetype は 拡張子から決まる。
  • filetype は 中身からも決まる。
  • .vim/scripts.vim でファイルの中身を判定するvimスクリプトが実行される
  • とりあえず変えたい時
    • syntax を変えたいときは set syntax=ruby
    • filetype を変えたいときは set filetype=python

参考資料

http://qiita.com/okamos/items/8279154e20249247f78f

[vim] HTML5のシンタックスハイライト・インデントをERBでも有効化 | CreativeStyle

Vim documentation: usr_43