2013/01/23

SublimeText2でPHPファイルをビルド&Build Systemを使いこなす

SublimeText2でPHPを実行できると何かと便利だと思うので設定する。
PHPはインストール済みとする。
MacならPHPがインストールされていると思うので大丈夫だと思う。

参考: Build Systems — Sublime Text Unofficial Documentation

設定

Sublime Text 2 >Tools > Build System > New Build System... から
設定ファイルを新規作成して以下のJSONをコピペすると良い。
{
    "cmd": ["php", "$file"],
    "selector": "source.php"
}
$file が現在のファイルを指し示す。
selector で source.php と書いておくとPHPファイルで Tools > Build System > Automatic の際に
自動的にPHPと認識してビルドしてくれる。

ビルド

PHPファイルを開いて command + B でビルドできる。

標準入力の処理があるPHPファイルを実行する

競技プログラミングのテストケースをファイルとして持っておき、
それを実行したいPHPファイルにパイプで渡してCLI(Command Line Interface)で実行すれば
コードを書き換えることなく競技プログラミング用のテストが出来る。
{
    "cmd": ["cat $file_path/test.txt | php $file | diff - $file_path/answer.txt -u"],
    "selector": "source.php",
    "shell": true
}
$file_path は実行したファイルのディレクトリ。コマンドが急に俺のスキルを越えていったので解説。
  1. cat $file_path/test.txtでテストケースを標準出力に流しこむ
  2. パイプで標準入力として受け取りphp $fileで実行
  3. 結果の標準出力をパイプで受け取り、diff - $file_path/answer.txt -uで正誤チェック
標準入力とファイルの diff を取る場合は - を指定するらしい。オプションで diff 表示形式変更可能。
参考: UNIXの部屋 コマンド検索:diff (*BSD/Linux)

上のようにコマンドを区切っていたらどうにもエラーになるので
"shell": true にしてコマンドを全部いっぺんに渡している。

答えまで準備するのは面倒な場合は以下のように途中で渡すのをやめれば良い。
{
    "cmd": ["cat $file_path/test.txt | php $file"],
    "selector": "source.php",
    "shell": true
}
これでシームレスにコーディングと実行ができ、快適な競技プログラミングができるでしょう!

Build Systemを使いこなす

{
    "selector": "source.php",
    "variants": [
        {
            "cmd": ["php $file"],
            "name": "php build",
            "shell": true
        },
        {
            "cmd": ["cat $file_path/test.txt | php $file"],
            "name": "php run test case",
            "shell": true
        },
        {
            "cmd": ["cat $file_path/test.txt | php $file | diff - $file_path/answer.txt -u"],
            "name": "php check answer",
            "shell": true
        }
    ]
}
上で書いたコマンドを使い分けたい場合は1ファイルに"variants"に配列で指定すれば良い。
ここでは1階層目に"cmd"を記述しなかったので command + B を押しても何も起こらない。
コマンドパレットで Build: php build とか候補が出るようになるのでこちらで使い分けると良い。

0 コメント :

コメントを投稿

タグ(RSS)