Vim で PHP のマニュアルを表示する

PHP は標準関数が滅茶苦茶多くて、関数の書き方、引数の順番等に統一性がない。
strcmp() だっけ? str_cmp() だっけ?となることがある。
その代わりマニュアルの充実度は凄い。


ブラウザで http://jp.php.net/manual/ja/ に行って検索するのもいいけど、
TextMate みたいに、ツールチップで引数リストをみたり、マニュアルを表示したい。


で、ググったら、PHP マニュアルを表示する Vim スクリプト という プラグイン を見つけた。
ローカル*1に置いた PHP マニュアルを vim 上に表示してくれるようだ。


さっそく導入して、PHP マニュアルを ~/.vim/manual/ とかに置いて、標準関数にカーソルを持っていき、
\P を押してみたら、w3m が見つからないとエラーに。
ビューワーとして w3m を使ってるからインストール必須のよう。


MacPortsw3m があったので、sudo port install w3m としてインストールしたら、
configure でハングした。ググったら、同じ現象の人が。

ビルド中に mktable の処理に異常に時間がかかって、ほぼハングアップ状態。何度か繰り返していると、稀に mktable の処理がすぐに終わってビルドもインストールも無事に終わることもあるのですが、そこでインストールされた w3m を起動すると、これまたほぼハングアップ状態。ごく稀に正常に起動することもありますが、ほとんどの場合はダメ。

http://blogs.dion.ne.jp/yamaga/archives/6362416.html

なるほど。boehmgc7.0 が悪さをしているのか。。。
解決策は上記のサイトにあったが、オリジナルの Portfile を修正していたので、
LocalPorts に Portsfile を置いて、portindex をして boehmgc6.8 をインストールしたら、上手く入った。


再度 vim を起動して、マニュアルが表示されるかテスト。
vim のウインドウが分割されて、上段にマニュアルが表示されたが、文字化けしている。
どうやら、phpmanual.vim で iconv を使用して euc-jp に変換かけているようだ。
あと :PHPMaunual reflist とすればリファレンス一覧が表示されるが、その冒頭部分も文字化けが発生している。
これは Mac の Terminal.app が LANG=ja_JP.UTF-8 となっていて、
PHPManual.vimeuc-jp で表示しようとしている。

対策

let g:phpmanual_convfilter を設定しないと、utf-8 から euc-jp に変換する。
PHP のマニュアルの HTML の charset は utf-8 となっているので、わざわざ変換することもない。
let g:phpmanual_convfilter = '' と何も設定されなかったら、変換を掛けないようにする。


:PHPMaunual reflist の冒頭部分の文字化けはソースを読むと、silent exec 'r! ++enc=euc-jp echo とやっている
箇所があったので、++enc=euc-jp を削除した。

パッチファイル

一応パッチを作った。

--- phpmanual.vim.orig  2008-02-16 21:04:58.000000000 +0900
+++ phpmanual.vim 2008-02-16 23:44:51.000000000 +0900
@@ -252,16 +252,16 @@
   "let g:phpmanual_file_ext = "php"
 endif

-"
-" UTF-8 -> EUC 変換フィルタ
-"
-if !exists('g:phpmanual_convfilter')
-  " iconv を使用
-  let g:phpmanual_convfilter = "iconv -c -f utf-8 -t euc-jp"
-
-  " UTF-8 対応 nkf を使用する場合
-  "let g:phpmanual_convfilter = "nkf -e"
-endif
+""
+"" UTF-8 -> EUC 変換フィルタ
+""
+"if !exists('g:phpmanual_convfilter')
+"  " iconv を使用
+"  let g:phpmanual_convfilter = "iconv -c -f utf-8 -t euc-jp"
+"
+"  " UTF-8 対応 nkf を使用する場合
+"  "let g:phpmanual_convfilter = "nkf -e"
+"endif

 "
 " HTML 表示ビューア(標準入力からの読み込み)
@@ -393,13 +393,17 @@
     silent exec '%s/^HREF="ref\.\([a-z]*\)\.' . g:phpmanual_file_ext . '">\(.*\)<\/A$/\1\t\t: \2/'
     setlocal tabstop=20
     silent exec "norm ggO"
-    silent exec 'r! ++enc=euc-jp echo "使い方 :PHPManual ref <識別名>" && echo ""'
-    silent exec 'r! ++enc=euc-jp echo "例: 以下を実行すると、関数リファレンスの Apache 用関数のページが表示されます。"'
+    silent exec 'r! echo "使い方 :PHPManual ref <識別名>" && echo ""'
+    silent exec 'r! echo "例: 以下を実行すると、関数リファレンスの Apache 用関数のページが表示されます。"'
     silent exec 'r! echo "" && echo "  :PHPManual ref apache" && echo ""'
-    silent exec 'r! ++enc=euc-jp echo "識別名は以下の通りです。" && echo "--"'
+    silent exec 'r! echo "識別名は以下の通りです。" && echo "--"'
     silent exec "norm ggdd"
   else
-    silent exec "r! ++enc=euc-jp " . a:filter. " " . a:resource . " | " . a:viewer
+    if exists(a:filter)
+      silent exec "r! " . a:filter. " " . a:resource . " | " . a:viewer
+    else
+      silent exec "r! " . a:viewer . " " . a:resource
+    endif
   endif

   " 一番上に移動

最近の Linuxutf-8 な場合が多いと思うので、多分いけると思う。
まぁ一応自己責任ということで。


ちなみに .vimrc にはこういう風に書いた。

" PHP マニュアルを設置している場合
let phpmanual_dir = $HOME . '/.vim/manual/php_manual_ja/'
" マニュアルの拡張子
let phpmanual_file_ext = 'html'
" マニュアルのカラー表示
let phpmanual_color = 1
" iconv 変換をしない
let phpmanual_convfilter = ''
" w3m の表示形式を utf-8 にし、auto detect を on にする
let phpmanual_htmlviewer = 'w3m -o display_charset=utf-8 -o auto_detect=2 -T text/html'
" phpmanual.vim を置いているパスを指定
source $HOME/.vim/ftplugin/phpmanual.vim

これでマニュアルを調べたい時にいちいちブラウザを立ち上げて検索する必要がなくなった。

*1:http://jp.php.net/manual/ja/ を指定しても OK