Vimスクリプトはやっぱ言語としての完成度は低い

と思った。

:echo strlen("foo\0bar")    " => 3

うへぇ。PHPですか。
っていうかstrlen()がそれじゃダメじゃん・・・
PHPのereg_*()関数*1の場合は代替案があるけどVimスクリプトにはstrlen()の役割をする関数は他にはないし・・・
結局Vimスクリプトにヌルバイトを含む入力があった場合は「正しく扱えない」ということになる。strlen()じゃなくて比較だけど、例えばこんな風に。*2

:echo "foo\0bar" == "foo\0abababa"      " => 1

でもまぁWebアプリとか書く訳じゃないからいい・・・のかなぁ・・・?
日本語版と英語版両方のヘルプ見ても

  • バイト数を返す
  • 合成文字は扱えない

としか書いてなくてヌルバイト文字の影響を受けるとは書いてない。


あとgetchar()は基本的に文字の数値を返すけど、特殊文字が押された場合は先頭バイトが0x80の文字列を返す。

:echo getchar()     " a => 97
:echo getchar()     " 改行 => 13
:echo getchar()     " バックスペース => <80>kb (厳密にリテラルとして表せば)

でもなんか比較がおかしい。ていうかできない。
これは自分の間違いである可能性が高いように思う。多分。。。
だって特殊文字含んでたら比較できなくなるとかさすがにないでしょ。。。
ということで特殊文字を含む比較について誰か間違ってるとこ教えてください!

:echo "\<BS>"       " => <80>kb
:echo nr2char(0x80)."kb" == "\<BS>"      " => 0

あとさっきから普通にコメントを:echoの後ろに書いてますが、本来エラーになります。
"をコメントだと認識せず文字列の始まりだと認識するからです。。。
コメントが「"」なせいでいくつかこういうコマンドがある。:echoの他にも:echomsgとか。あと思い出せない。とりあえずあんまりコメントはコマンドの後ろに書かないようにしてるので。。。

これもまぁアレだなぁとは思うんだけどやっぱりVimスクリプトを書いてVimを拡張するのが楽しすぎるので「言語としてのVimスクリプト」についてはあまり気にしないようにしてた。
けどこれはちょっと。。。とさすがに思ったので。


あと「これはちょっと。。。」な点と言えば次行に続くコマンドを打つ時はVimスクリプトではこんな風にして続ける。

:let foo =
\       printf("%s, %s", "hello", "hello.")

個人的にこれ大嫌いです。*3
久しぶりに文章中ででっかい文字を見てfontタグとか打ってる頃を思い出しましたがそんなことはどうでもよくて、なんでこうなってるの?と不思議に思いました。
Vimは(Viから続いてるとすれば)歴史がかなりあるエディタなのでここに書いた内の「歴史的なあれこれ」はしょうがないと思うし、そもそもコマンドラインであれこれやってたのを複数行書けるように無理矢理拡張したものなのでまぁ仕方ないなーとは思うんですが、ただこれの理由がまったくわかりません。理由知ってる方教えてください。


VimPHPもドキュメントは最高にいいんだけど。。。
まぁあれこれ言うならパッチ投げろって話ですね。。。
ちょっと追ってみよう。。。

*1:だったっけ?今バイトで勉強してるんだけど記憶が曖昧

*2:後で気づいたけどこれは:help E693か:help E694らへんに「strcmp()やstricmp()で比較される」と書いてあった。でもやっぱ文字数を保持しといてちゃんと比較してほしい

*3:printf()がPerlのsprintf()の役割なのも個人的に(ry