Vim で PHP 関数の辞書を作成する方法についてのメモ

HOME | メモ一覧 | LastUpdate: 2009-08-16

説明と環境

PHP の辞書作成方法をまとめてみました。

また、ctags などを使って、Vim をさらに便利に使うことができるようになりますので、その時に調べたり、行ったりした作業のメモをまとめておきます。

このメモは、Gentoo Linux で作成しました。ツールのバージョンや、Vim のバージョンなどによってはうまくいかない場合もあると思いますが、何か気になった点や問題などがありましたら、メールで連絡してください。


目次

Vim で PHP の辞書を作成する方法と ctags についてのメモ 目次

  1. 説明と環境
  2. Vim 用の PHP 関数辞書を作成する
    1. PHP マニュアルから関数の辞書を作成する
    2. PHP スクリプトから定義済み関数を出力する
  3. ctags を使用する
    1. tags ファイルを作成する
    2. PEAR の tags ファイルを作成する
  4. PHP マニュアルを表示する Vim スクリプト
  5. 更新履歴

Vim 用の PHP 関数辞書を作成する

Vim では、:set dictionary に辞書ファイルを指定し、Ctrl+x, Ctrl+k で、辞書補完が行えるようになりますが、辞書ファイルをどのように作成するかという問題がありますので、思いついた方法をメモしておきます。良いと思われる方法で辞書を作成してください。PHP スクリプトから定義済み関数を出力する方が、PHP 4 と PHP 5 の辞書を分けることができますので、便利だと思います。

a. PHP マニュアルから関数の辞書を作成する

  1. まず、PHP マニュアルをダウンロードします。日本語マニュアルをダウンロードしても問題はないのですが、翻訳のタイムラグの関係で、新しく追加された関数などが載っていない可能性もありますので、Vim の辞書を作成するには、英語のマニュアルの方が良いと思います。

  2. 適当なディレクトリを作成して、取得した PHP マニュアルを展開します。英語マニュアルをダウンロードした場合は、以下のように展開します。

    $ mkdir php_manual
    $ cd php_manual
    $ tar jxvf php_manual_en.tar.bz2
    
  3. 辞書ファイル( 以下の例では 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/
    
  4. .vimrc(Windows などの場合は _vimrc) に、以下の設定を追加します。php.dict を ホームディレクトリの ~/.vim/dict/ に置いた場合の設定です。

    autocmd FileType php  :set dictionary=~/.vim/php.dict
  5. Vim で、PHP のスクリプトが書かれたファイルを開き、インサート(挿入)モードでコマンドの最初の数文字を入力して、Ctrl-x, Ctrl-k と入力すると、辞書ファイルにある単語の中から、補完されます。

    例えば、

    array_s

    まで入力して、Ctrl-x, Ctrl-k を押すと、

    array_search

    のように関数名が補完されます。次の候補を表示するには、Ctrl-n、前の候補を表示するには、Ctrl-pを押します。

とりあえず、この方法でも簡単に辞書ファイルを作成できると思います。ただし、使用できない関数なども辞書に含まれてしまうため、少し無駄の多い辞書かもしれません。

章の最初へ | 目次へ

b. PHP スクリプトから定義済み関数を出力する

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 は入力補完だけでなく、タグジャンプの機能が便利ですので、使えるようにしておくと、スクリプトを書くときなどに非常に効率が良くなります。

ctags は、バージョン 5.0 以降で PHP をサポートしていますので、ctags --version を実行して、バージョンが 5.0 以降であることを確認しておいてください。もし、ctags がない、または、バージョンが古い場合は、Exuberant Ctags から、ソースファイルをダウンロードして、コンパイルするか、各 Linux ディストリビューションで配布されているパッケージなどをインストールしてください。

a. tags ファイルを作成する

ctags を使って、カレントディレクトリ以下のファイルに対して、tags ファイルを作成するには、以下のようにします。拡張子は自動判別で解析してくれますが、デフォルトでは、拡張子の .inc は PHP ファイルとしてみなしてくれませんので、オプションの --langmap.inc も PHP ファイルとしてみなすように指定します。拡張子とファイルの関連付けについては、ctags --list-maps を実行すると表示されますので、詳しくはその出力を参照してください。

$ ctags -a -R --langmap=PHP:.php.inc --php-types=c+f ./

簡単にオプションの説明をしておきます。以下に紹介したもの以外のオプションについては、ctags --help で確認してください。

上で使用した ctags のオプション説明
オプション説明
-a既に tags ファイルがある場合は、ファイルを上書きせず、追加します。
-R指定したディレクトリに含まれる全てのファイルを調べます。
--langmap デフォルトで設定されているファイルの拡張子設定を上書きします。 デフォルト設定は、ctags --list-maps で確認できます。
--php-types PHP ファイルで tags ファイルを作成する時のタグ名に PHP のクラスと関数の両方を使用します。 使用できるタグ名は、ctags --list-kinds=php で確認できます。 例えば、他の言語の場合、Java で使用できるタグ名は ctags --list-kinds=java の ように指定すると確認できます。

処理が終了すると、カレントディレクトリに 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+nCtrl+p で変換候補を選択することができます。

章の最初へ | 目次へ

b. PEAR の tags ファイルを作成する

PHP の PEAR などのモジュールを利用している場合、以下のように、tags ファイルをまとめておくとさらに便利になると思います。

  1. 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 コマンドで 拡張子が phpinc になっているファイルのみ、情報を登録するようにしています。

  2. カレントディレクトリに pear.tags というファイルが作成されますので、ファイルを任意の場所( ここでは、~/.vim/tags )に移動させます。

    $ mkdir -p ~/.vim/tags
    $ mv pear.tags ~/.vim/tags/
    
  3. ~/.vimrc を編集して、PHP ファイルを編集するときのみ、tags ファイルを呼び出すように設定します。

    autocmd FileType php :set tags+=~/.vim/tags/pear.tags

ただし、PEAR のモジュールを追加したり、アップデートした場合は、再度 ctags コマンドを実行する必要があります。

章の最初へ | 目次へ

▲ 目次へ戻る


PHP マニュアルを表示する Vim スクリプト

PHP マニュアルを表示する Vim スクリプトなどを書いてみました。PHP スクリプトを書く時には意外と便利です。

▲ 目次へ戻る


更新履歴

( 2009.08.14 )

最近の辞書作成用のスクリプトを掲載。

( 2004.05.02 )

誤字、脱字など、気になった部分の修正。辞書作成スクリプトを簡単な形に変更。

( 2003.10.05 )

Vim のサイトで、PHP.dict 0.2 が公開されていたので追記。

( 2003.07.13 )

初版作成。公開。

▲ 目次へ戻る

LastUpdate: 2009-08-16 | メモ一覧 | HOME