Vimスクリプトにヌルバイトを含む入力があった場合は「正しく扱えない」
Vimスクリプトはやっぱ言語としての完成度は低い - Humanity
そうなんですよね。Vim の内部文字列の扱いは非常に変態的で頭がいたいところ。Vim の内部での文字列は C のものと同じなので、NUL 文字は使えない。
ちなみにNUL文字を含むファイルを開いた場合、Vim はそれを
あとこれに関連する話で、Vim は UTF-16 を内部的に扱えないので、Unicode は全て UTF-8 で表現される。この辺りの詳細は :help iconv() で。
あとgetchar()は基本的に文字の数値を返すけど、特殊文字が押された場合は先頭バイトが0x80の文字列を返す。
Vimスクリプトはやっぱ言語としての完成度は低い - Humanity
これは以下のようなラッパ関数を作ってしまえば大体の場合は解決する。
function! s:getchar() let c = getchar() return type(c) == type(0) ? nr2char(c) : c endfunction
数字だったら文字列に変換する。これでどの入力も文字列として受け取れる。
あと「これはちょっと。。。」な点と言えば次行に続くコマンドを打つ時はVimスクリプトではこんな風にして続ける。
:let foo = \ printf("%s, %s", "hello", "hello.")(中略)
これの理由がまったくわかりません。理由知ってる方教えてください。
Vimスクリプトはやっぱ言語としての完成度は低い - Humanity
:normal などの一部のコマンドは、行末のコメントや複数コマンドを区切る|(:help :bar)がコマンドの一部と解釈されて使えない。
つまり、すべてのコマンドで行末の文字が認識出来るわけではないので、必然的に行頭になってる。
ちなみに、:help にも書いてある。まあこの help に辿り着くのが難しいと言う問題はあるだろうけど…。
Rationale: Most programs work with a trailing backslash to indicate line continuation. Using this in Vim would cause incompatibility with Vi. For example for this Vi mapping: :map xx asdf\ Therefore the unusual leading backslash is used.:help line-continuation
そもそもコマンドによって解釈が変わる時点で十分変態だよなぁ。