Perl ソースコードを読み込んで、インデントの修正などを行い整形されたソースコードを出力するツール。GNU GPL のもと公開されている。
このツールを用いることで、スタイルの統一された見やすいソースコードにすることができる。 また、ソースコードをハイライトした HTML ファイルを作成することもできる。
ソースコードをハイライトして行番号付きの HTML テキストを生成する場合は
perltidy -html -nnn --nohtml-entities source.pl
とする。
Windows 上で ActivePerl を利用している場合は、PPM パッケージの形でネットワークインストールできる。
コマンド プロンプト上で、以下を実行する:
ppm install Perl-Tidy
リャマ本を使用した社内 Perl 勉強会の2回目を開催。 今回は7人。直前に社長につかまって約20分遅れのスタート (スミマセン)。
進行方法はほぼ前回と同じで、事前に練習問題を解いておき、勉強会では互いにコードレビューをしながら進行役の私がポイントを説明していく形式。
今日は「初めてのPerl 第3版」第3章が範囲で、リストと配列がテーマ。
今のところ、全員ついてこれている様子。 スカラーコンテキストとリストコンテキストは、Perl 初心者にとってとっつきにくい部分の一つだと思うので、これが理解できれば結構いけそうな気もする。
今回はトータル80分ぐらい。7人だと1時間半ぐらい確保しておいた方がいいかもしれないな。
次回はゴールデンウィークを挟んで2週間後。
WiKicker のソースコードを人に説明するのにプリントアウトして説明するのに、doxygen のようなツールが欲しいのだけれど Perl 用のものはないのかな。
というのが希望。1 だけなら結構いろいろなツールがあり、1 + 2 なら perltidy で実現できる。 しかし 3、4 までしてくれるツールが見つけられない。
とりあえず perltidy の Perl::Tidy と File::Find で再帰的にまとめて HTML に変換するスクリプトだけは書いて、一気に変換だけはできるようにしておいた。
インデックスの作成までは面倒なので未着手。
私が Perl が好きな理由の一つとして perltidy が存在しているという点がある。 perltidy のソースコード整形は柔軟にカスタマイズができて、自分の好みの整形設定を作っておける。 このツールおかげで後で整形できるので、荒々しくコードを書いてガンガンリファクタリングしていくことできる。
久しぶりに C++ の開発をするにあたって、C++ の同様のツールを探してみた。 perltidy のように長い式の折り返しを適切に調整してくれる整形ツールはあまり見つからない。いくつか試したところ Uncrustify にたどりついた。
uncrustify -c /dev/null --update-config-with-doc -o ~/.uncrustify.cfg
するとデフォルトの設定が書き込まれた設定ファイルができる。 これを好みの設定に書き換えていく。
uncrustify source.cpp
とすると整形されたソースコードが source.cpp.uncrustify に出力される。
uncrustify --replace source.cpp
とすると source.cpp 自体を整形されたソースコードで置き換えてくれる。
perltidy の時の設定(記事)で OK。 shell-command-on-region では
uncrustify -l CPP -q
を実行するようにする。Uncrustify は標準入力からソースコードを渡す際にはどのプログラミング言語が指定してあげる必要がある。
好みの設定は現在模索中。 長い式の中の、引数なしの関数呼び出しの開き括弧と閉じ括弧の間で折り返されることがあってそれが気持ち悪いのだが、それ以外は好みの設定になりつつある。 もうちょっと設定いじってみて確定するつもり。
やっぱり Perl スクリプトは perltidy をかけておかないと気持ち悪いよね。 Emacs からは perltidy を呼べるように設定済み。
基本 Perl スクリプトを書く時は Emacs なのだが、Windows 上でさくっと書く時もある。最近は Windows 上のテキストエディタは Notepad++ を使っているので、同様に Notepad++ からも呼べるように設定しておこう。
以下 Notepad++ v5.8.7 (UNICODE)、[全般設定] で言語に日本語を指定してある状態での設定手順。Perl は Strawberry Perl で cpanm が入った状態。
以下のコマンドで perltidy をインストールする。
cpanm Perl::Tidy
Notepad++ v5.8.7 に 外部コマンドを実行する NppExec プラグインが入っていなかったのでインストール。
NppExec_041_dll_Unicode.zip をダウンロードしてきて展開し c:\Program Files\Notepad++\plugins に NppExec.dll をコピーする。
Notepad++ を起動し以下の設定を行う。途中 Notepad を再起動するように指定されたら指示に従って起動しなおす。
c:\strawberry\perl\bin\wperl.exe -x -S perltidy --quiet --preserve-line-endings --backup-and-modify-in-place "$(FULL_CURRENT_PATH)"
これで [マクロ]-[perltidy] と指定できるようになる。
お気に入りの .perltidyrc (perltidy.ini でも OK)を
perltidy -dpro
で表示されるディレクトリのどこかに置くか、置き場所を PERLTIDY 環境変数に設定しておくか、コマンドラインオプションに -pro=filename という形で指定しておく。
適当に Perl スクリプトファイルを開いて [マクロ]-[perltidy] を実行。ウィンドウの下部に Console 出力が表示される。 処理が終わったら [ファイル]-[開き直す]をすると整形された Perl スクリプトが表示される。
上記の手順を Notepad++ マクロ化しようとしたんだけれど、これは失敗。
perltidy の設定ファイル .perltidyrc は以前に載せた後 --vertical-tightness-closing を 2 に変えたあといじってなかった。 こんな感じ。
# Basic Options --maximum-line-length=78 # default is 80 --indent-columns=2 # (!= perlstyle) default is 4 --preserve-line-endings # Code Indentation Control --line-up-parentheses # --nooutdent-long-lines # default is --outdent-long-lines # Whitespace Control --paren-tightness=2 # default is 1 --square-bracket-tightness=2 # default is 1 --brace-tightness=2 # default is 1 --nospace-for-semicolon # default is --space-for-semicolon # Line Break Control --vertical-tightness=2 # default is 0 --vertical-tightness-closing=2 # default is 0 --want-break-before="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x=" # default is ". << >> -> && ||" # HTML Options -nnn --nohtml-entities
その後新しいオプションが増えているのでチェックしなくては。
perltidy が無いと Perl のソースコードが書けない体なのです。 なので cpanm でホームディレクトリ以下にインストール。
まずは ~/local/perl 以下に CPAN モジュールをインストールして使えるように、Bash の設定ファイルに以下を追加。
export PERL_CPANM_OPT="--local-lib=$HOME/local/perl" PERL5LIB=$PERL5LIB:$HOME/local/perl/lib/perl5:$HOME/local/perl/lib/perl5/x86_64-linux-thread-multi PATH=$PATH:$HOME/local/perl/bin
そして以下を実行(~/local/bin は PATH に設定しているところ)。
cd ~/local/bin curl -LO http://xrl.us/cpanm chmod 755 ./cpanm
cpanm のインストールはこれで OK。後は
cpanm Perl::Tidy
で perltidy のインストール完了。
あとはお好みな .perltidyrc を用意したり Emacs から呼べるように設定したりすれば OK。
perltidy の設定ファイル .perltidyrc の見直し。
# Basic Options --maximum-line-length=78 # default is 80 --indent-columns=2 # default is 4 --preserve-line-endings --iterations=2 # Add! # Code Indentation Control --nooutdent-long-lines # default is --outdent-long-lines # Whitespace Control --paren-tightness=2 # default is 1 --square-bracket-tightness=2 # default is 1 --brace-tightness=2 # default is 1 --nospace-for-semicolon # default is --space-for-semicolon # Line Break Control --opening-brace-always-on-right # Add! --break-before-all-operators # change from --want-break-before # HTML Options -nnn --nohtml-entities
今回の変更点:
基本タイトな整形が好きなので --vertical-tightness 系を切るのは断腸の思いではあるが、この設定の方が整形に一貫性があるのでよしとしよう。
ちょっと JavaScript コードを書く機会が増えてきそう。 そうなると、Perl コードを書く時には perltidy が手放せないように、JavaScript ソースコードフォーマッタが必要だ。 なのでとりあえず検索してよくひっかかってきた JS Beautifier を使ってみることにした。
JavaScript で書かれたバージョンと Python で書かれたバージョンがあって、後者の方はそのままコマンドラインからの呼び出しできるようになっているので、それを使うようにしてみる。
手元の環境だと Python の dev 系のファイルがインストールされていなくて setup.py が通らないので、Python からマルっと入れた。
$ tar zxvf Python-2.7.3.tgz $ cd Python-2.7.3 $ ./configure --prefix=$HOME/local/python-2.7.3 $ make $ make altinstall
で Python をインストールしたら JS Beautifier をインストール。
$ git clone https://github.com/einars/js-beautify.git $ cd js-beautify/python $ $HOME/local/python-2.7.3/bin/python2.7 setup.py install
$HOME/local/python-2.7.3/bin/js-beautify がインストールされる。PATH の通ったところにシンボリックリンクしておく。
あとは Emacs から実行できるように設定。
(defun js-beautify-region() "Run js-beautify on the current region." (interactive) (save-excursion (shell-command-on-region (point) (mark) "js-beautify -i" nil t)))
を設定しておいて、整形したいところをリージョン選択してから M-x js-beautify-region を実行するとその範囲を整形してくれる。
ちょっと使ってみた範囲では、大外ししてインデントメチャクチャとかは無かった。perltidy ほど賢くない感じだけれど、これで一貫したスタイルで書けるようになるのでいい感じかな。
今週ぐらいからぼちぼち本格的に GHE 使い始めていて pull request も実は初めて使ったんだけれど、まず便利そう。 pull request に pull request とかやってみたけど、普通にみんなそういう風にしているのかな。
あと perltidy の ChangeLog 確認したら気がつかないうちにフラグがいろいろ増えていた。今は 2011年6月に見直した .perltidyrc で安定して整形してくれていて困っていないんだけれど、新しいフラグの効果も試してみた方がいいのかな。1つ1つ試してどっちがいいかとか結構悩むんだよねぇ。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。