ケーズメモ このページをアンテナに追加 RSSフィード

2009-09-06

vimの構文ハイライトファイルを書いてみた 作成〜コメントアウトをハイライトするまで

詳しくは

:h usr_44.txt

を参照ということで。

ここでは『ふつうのコンパイラをつくろう』

ふつうのコンパイラをつくろう

ふつうのコンパイラをつくろう

で作ろうとしている言語のC♭のシンタックスハイライトを作ろうとして試してみたことを書いていきます。


拡張子とファイルタイプを関連付ける

C♭はCのサブセットなので拡張子を.cにしてCとして認識させるか、拡張子が.cbのものをfiletypeとしてはCとして認識させるのが手っ取り早いのですが、それだとこの節だけで終わってしまいます。

ファイルの拡張子を.cにするのはどうということはないので、拡張子が.cbのものをcとして認識させる方法を書いておきます。.vimrcに

au BufRead,BufNewFile *.cb set filetype=c

と書いておけばOKです。

今回は拡張子が.cbのものをC♭のファイルとして判別するために.vimrcに

au BufRead,BufNewFile *.cb set filetype=cb

と設定を追加します。


構文ファイルの作成

構文ファイルは~/.vim/syntax/FILE_TYPE.vimに作成します。今回の場合は

~/.vim/syntax/cb.vim

を作成します。

構文ファイルの大枠は以下のようになります。

" 構文のマッチ
syntax (keyword|region|match|...) {group} {keyword} ...

" 構文に対するハイライトの割り当て
highlight link {group} {group-name} ...

" ファイルタイプcbを指定
let b:current_syntax = "cb"

基本的にマッチさせる構文をキーワード/範囲/正規表現で指定して、そのグループに対してハイライトを割り当てるかたちです。最後のシンタックスのファイルタイプの指定をしています。


一行コメントアウトの構文

まずはプロトタイプ。行頭が//から始まり、その行はコメントアウト扱いにします。

syntax region cbLineComment start=+//+ end=+$+

範囲指定のregionを使って//から始まり、行末までを指定しました。

このままだと例えば

url = "http://example.com/";

は//以降がコメントアウトとしてハイライトされてしまいます。

この場合は文字列の"〜"との優先度がどちらが高いかという問題にもなりますので、一旦このままにしておきます。

startからendの間にあっても無視したい文字列がある場合、例えば"〜"の間にエスケープされたダブルクォートがある場合などは

syntax region cbString start=+"+ skip=+\\"+ end=+"+

と、skipにstartからendの間にあっても無視する文字列を指定することもできます。

複数行コメントアウト

あまり考えずに単純に指定してみました。

syntax region cbComment start=+/\*+ end=+\*/+

今回のように複数行にまたがる指定を行う場合、指定範囲内でハイライトをしたい場合があります。その場合

syntax region cbComment start=+/\*+ end=+\*/+ contains=group, ...

と構文のグループ名を指定してやることができます。

コメントアウトハイライト指定

最後にgroup-nameをハイライトの指定と結びつけます。

highlight link cbLineComment Comment
highlight link cbComment Comment

Commentの部分はvim側で指定されたgroup-nameで、Comment, Constant, Identifierなどがあります。

詳しくは

:h group-name

を参照してください。

まとめ

以上で簡易的にですが、拡張子.cbのファイルでコメントがコメント行としてハイライトされるようになります。

まだ不十分なところもありますが、一通り作ってみて、それから再度直していこうと思います。

ToDOとしては

  1. :h syntax周りを読み込む
  2. vim onlineのsyntaxファイル(http://www.vim.org/scripts/script_search_results.php?keywords=&script_type=syntax&order_by=rating&direction=descending&search=search)を見てやり方を学ぶ

といった辺りでしょうか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ksmemo/20090906/p2
Connection: close