PHP の辞書作成方法をまとめてみました。
また、ctags
などを使って、Vim をさらに便利に使うことができるようになりますので、その時に調べたり、行ったりした作業のメモをまとめておきます。
このメモは、Gentoo Linux で作成しました。ツールのバージョンや、Vim のバージョンなどによってはうまくいかない場合もあると思いますが、何か気になった点や問題などがありましたら、メールで連絡してください。
Vim で PHP の辞書を作成する方法と ctags についてのメモ 目次
Vim では、:set dictionary
に辞書ファイルを指定し、Ctrl+x, Ctrl+k
で、辞書補完が行えるようになりますが、辞書ファイルをどのように作成するかという問題がありますので、思いついた方法をメモしておきます。良いと思われる方法で辞書を作成してください。PHP スクリプトから定義済み関数を出力する方が、PHP 4 と PHP 5 の辞書を分けることができますので、便利だと思います。
まず、PHP マニュアルをダウンロードします。日本語マニュアルをダウンロードしても問題はないのですが、翻訳のタイムラグの関係で、新しく追加された関数などが載っていない可能性もありますので、Vim の辞書を作成するには、英語のマニュアルの方が良いと思います。
適当なディレクトリを作成して、取得した PHP マニュアルを展開します。英語マニュアルをダウンロードした場合は、以下のように展開します。
$ mkdir php_manual $ cd php_manual $ tar jxvf php_manual_en.tar.bz2
辞書ファイル( 以下の例では php.dict )を作成します。ファイル名から関数名一覧を取得しています。多分、うまくいくと思いますが、失敗している可能性もありますので、作成された php.dict に PHP の関数がうまく抽出できているか確認してください。辞書ファイルが作成できたら、適当なディレクトリ( 以下の例では、~/.vim/dict/ )に移動させます。
$ ls function.* | sed 's/^function\.\([-_a-z0-9.]*\)\.html$/\1/' | sed 's/-/_/g' | sed 's/\./->/g' | sort > php.dict $ mkdir -p ~/.vim/dict/ $ mv php.dict ~/.vim/dict/
.vimrc(Windows などの場合は _vimrc) に、以下の設定を追加します。php.dict を ホームディレクトリの ~/.vim/dict/ に置いた場合の設定です。
autocmd FileType php :set dictionary=~/.vim/php.dict
Vim で、PHP のスクリプトが書かれたファイルを開き、インサート(挿入)モードでコマンドの最初の数文字を入力して、Ctrl-x, Ctrl-k
と入力すると、辞書ファイルにある単語の中から、補完されます。
例えば、
array_s
まで入力して、Ctrl-x, Ctrl-k
を押すと、
array_search
のように関数名が補完されます。次の候補を表示するには、Ctrl-n
、前の候補を表示するには、Ctrl-p
を押します。
とりあえず、この方法でも簡単に辞書ファイルを作成できると思います。ただし、使用できない関数なども辞書に含まれてしまうため、少し無駄の多い辞書かもしれません。
PHP マニュアルから辞書を作成する方法以外に、PHP スクリプトで定義済みの関数名を出力する関数があったことに気がつきましたので、その出力を元に、辞書ファイルを作成しても良いと思います。
例えば、以下のようなスクリプトを mkvimdic.php として保存します。
<?php $functions = get_defined_functions(); sort( $functions['internal'] ); echo implode( "\n", $functions['internal'] );
(2009.08.16 追記)
最近は以下のようなスクリプトを使用して辞書を作成しています。制御構造や PHP 5.3.0 で追加された自動定義定数、クラスなどを追加しています。
<?php $keywords = array( 'if', 'else', 'elseif', 'endif', 'while', 'endwhile', 'do', 'as', 'for', 'endfor', 'foreach', 'endforeach', 'break', 'continue', 'switch', 'endswitch', 'case', 'default', 'declare', 'enddeclare', 'try', 'catch', 'return', 'exit', 'const', 'class', 'function', 'require', 'include', 'require_once', 'include_once', 'abstract', 'final', 'interface', 'private', 'protected', 'public', 'static', '__LINE__', '__FILE__', '__DIR__', '__FUNCTION__', '__CLASS__', '__METHOD__', '__NAMESPACE__' ); $functions = function_exists( 'get_defined_functions' ) ? get_defined_functions() : array(); $constants = function_exists( 'get_defined_constants' ) ? get_defined_constants() : array(); $interfaces = function_exists( 'get_declared_interfaces' ) ? get_declared_interfaces() : array(); $classes = function_exists( 'get_declared_classes' ) ? get_declared_classes() : array(); $arrays = array_merge( $keywords, $functions['internal'], // array_keys( $constants ), // 定数を補完したい場合はこの行を有効にする $interfaces, $classes ); sort( $arrays ); $arrays = array_unique( $arrays ); echo implode( "\n", $arrays );
以下のようにコマンドライン版 PHP で実行すると、出力された関数一覧が出力されます。このファイルを辞書として使用します。
$ php mkvimdic.php > php.dict
この方法の場合、現在使用している PHP で使用可能な関数のみを辞書に登録することができます。ただし、PHP のバージョンアップや、再コンパイルを行った場合は、実際に使用できる関数と辞書に登録されている関数に違いが出る可能性がありますので、バージョンアップや、コンパイルオプションを変更した場合には辞書を作り直した方が良いと思います。
入力の補完機能を使用する方法として、ctags
を使うこともできるようです。ctags
は入力補完だけでなく、タグジャンプの機能が便利ですので、使えるようにしておくと、スクリプトを書くときなどに非常に効率が良くなります。
ctags は、バージョン 5.0 以降で PHP をサポートしていますので、ctags --version
を実行して、バージョンが 5.0 以降であることを確認しておいてください。もし、ctags がない、または、バージョンが古い場合は、Exuberant Ctags から、ソースファイルをダウンロードして、コンパイルするか、各 Linux ディストリビューションで配布されているパッケージなどをインストールしてください。
ctags
を使って、カレントディレクトリ以下のファイルに対して、tags ファイルを作成するには、以下のようにします。拡張子は自動判別で解析してくれますが、デフォルトでは、拡張子の .inc
は PHP ファイルとしてみなしてくれませんので、オプションの --langmap
に .inc
も PHP ファイルとしてみなすように指定します。拡張子とファイルの関連付けについては、ctags
を実行すると表示されますので、詳しくはその出力を参照してください。--list-maps
$ ctags -a -R --langmap=PHP:.php.inc --php-types=c+f ./
簡単にオプションの説明をしておきます。以下に紹介したもの以外のオプションについては、ctags --help
で確認してください。
オプション | 説明 |
---|---|
-a | 既に tags ファイルがある場合は、ファイルを上書きせず、追加します。 |
-R | 指定したディレクトリに含まれる全てのファイルを調べます。 |
--langmap |
デフォルトで設定されているファイルの拡張子設定を上書きします。
デフォルト設定は、ctags で確認できます。 |
--php-types |
PHP ファイルで tags ファイルを作成する時のタグ名に PHP のクラスと関数の両方を使用します。
使用できるタグ名は、ctags で確認できます。
例えば、他の言語の場合、Java で使用できるタグ名は ctags の
ように指定すると確認できます。 |
処理が終了すると、カレントディレクトリに tags というファイルが作成されています。Vim
では、デフォルトで、カレントディレクトリの tags ファイルを使用するようになっていると思います。確認するには、Vim で以下のようにしてください。
:set tags
以下のように表示されていれば tags に登録された単語に対して、タグジャンプと補完機能が使用できるようになっていると思います。
tags=./tags,./TAGS,tags,TAGS
何も表示されなかった場合は、以下のようにファイルの場所を指定してください。
:set tags=./tags
以上で、tags ファイルがあるディレクトリで PHP ファイルを編集し、定義した関数名の上で Ctrl+]
を押すと、画面が切り替わって、定義されたファイルの該当関数の位置に移動するはずです。前の場所に戻る場合は、Ctrl+t
を押してください。Ctrl+w, Ctrl+]
とすると、ウインドウが分割されて、該当関数が表示されますので、うまく使い分けると便利です。
また、定義された関数名の途中まで入力して、Ctrl+x, Ctrl+]
とすると、tags ファイルで定義された関数名の補完が行えます。辞書ファイルと同じように、Ctrl+n
と Ctrl+p
で変換候補を選択することができます。
PHP の PEAR などのモジュールを利用している場合、以下のように、tags ファイルをまとめておくとさらに便利になると思います。
ctags
を使って、PEAR をインストールしているディレクトリ ( ここでは /usr/local/lib/php/ )の tags ファイルを作成します。ここでは、pear.tags というファイル名で出力しています。
$ ctags -f pear.tags --langmap=PHP:.php.inc --php-types=c+f `find /usr/local/lib/php/ -name '*.php' -or -name '*.inc'`
PEAR のディレクトリには、PHP 以外のファイルも含まれていますので、tags ファイルに不要な情報が含まれるのを回避するために、find
コマンドで 拡張子が php
と inc
になっているファイルのみ、情報を登録するようにしています。
カレントディレクトリに pear.tags というファイルが作成されますので、ファイルを任意の場所( ここでは、~/.vim/tags )に移動させます。
$ mkdir -p ~/.vim/tags $ mv pear.tags ~/.vim/tags/
~/.vimrc を編集して、PHP ファイルを編集するときのみ、tags ファイルを呼び出すように設定します。
autocmd FileType php :set tags+=~/.vim/tags/pear.tags
ただし、PEAR のモジュールを追加したり、アップデートした場合は、再度 ctags
コマンドを実行する必要があります。
PHP マニュアルを表示する Vim スクリプトなどを書いてみました。PHP スクリプトを書く時には意外と便利です。
最近の辞書作成用のスクリプトを掲載。
誤字、脱字など、気になった部分の修正。辞書作成スクリプトを簡単な形に変更。
Vim のサイトで、PHP.dict 0.2 が公開されていたので追記。
初版作成。公開。