vim-jp » Vimのユーザーと開発者を結ぶコミュニティサイト

ctags にソースコードのエンコーディングを指定出来るオプションが追加されました。

Posted on 2015-07-09


Vim 使いの方であればほぼ皆さん ctags をご存じだと思います。ctags はソースコードを解析して tags ファイルを生成します。テキストエディタはこの tags ファイルを使用して名称から定義位置にジャンプ(タグジャンプと呼ばれます)出来る様になります。

多くのテキストエディタがこのタグジャンプを実装しています。ctags は元々、Vim のリポジトリ内に存在しました。その後別のリポジトリに切り出され現在に至ります。こういった経緯から Vim と ctags は切っても切れない関係にあります。

Vim はタグジャンプを使いこなせて一人前、いやタグジャンプが使えない Vimmer はモグリとまで言われています。(要出典)

tags ファイルにはシンボル、定義されているファイル、定義位置、定義されている行の文字列が行毎に書かれています。テキストエディタはシンボル名が与えられると定義位置からファイル名と定義位置を特定し、数行のズレを最後の「定義されている行の文字列」で補正します。逆に言うと、これがマッチしない行は正しくタグジャンプ出来ない事になります。

ところが日本を含む幾らかの国ではソースコード内にマルチバイト文字のコメントを書く習慣があり、ctags がこのマルチバイトのコメントをそのまま tags ファイルに書きだしていた為、いざテキストエディタがタグジャンプをしようとした際にテキストエディタのエンコーディングとタグ文字列のエンコーディングに相違が発生してしまいます。またリポジトリに異なるエンコーディングのファイルが複数含まれるといった事もあり得ます。例えば C# は UTF-8 で、Java は Shift_JIS でといった様に。

この tags ファイルのエンコーディングを統一的に指定出来る様にすべく、vim-jp では universal-ctags に対するパッチを作成し、pull-request しました。昨日そのパッチがマージされ、公式として入力ファイルのエンコーディングと出力する tags ファイルのエンコーディングが指定出来る様になりました。

$ ctags --input-encoding=utf-8 --input-encoding-java=cp932 --input-encoding-javascript=euc-jp -R .

この様に全体の encoding と言語個別のエンコーディングを分けて指定したり --output-encoding=cp932 といった様に tags ファイルのエンコーディングを指定出来る様になっています。tags ファイルを Shift_JIS でしか判定出来ないテキストエディタでも正しく動作出来る様になります。(–output-encoding のデフォルト値は utf-8 です) その際 tags ファイルには

!_TAG_FILE_ENCODING	UTF-8	//

という、tags ファイル自身のエンコーディング名も出力されますので、各テキストエディタではこの文字列を判断して tags ファイルのエンコーディングを判定して頂く事になります。

~/.ctags に以下の様に書いておくと毎回この長いオプションを指定しなくても良くなります。

--sort=yes
--input-encoding=utf-8
--input-encoding-c=sjis
--input-encoding-vim=utf-8
--input-encoding-go=utf-8

vim においてはこの TAG_FILE_ENCODING は既に取り込まれており、バージョン6以上の vim であれば問題なく使用出来ます。

なお、この修正によりソースコード上でシンボル自身がマルチバイトになり得るプログラミング言語(golang 等)のタグも正しく扱える様になります。


もどる