Vim script で NUL 文字を扱う

vim-jp の issues をウォッチしていたら NUL 文字を扱う方法を知ることができたのでメモ. 当該の issue はこれ. #170: Vim のコマンドライン引数が取りたい - Issues - vim-jp/issues - GitHub

Vim の文字列は C と同様に NUL-terminated な表現なので,例えば :echo "foo\0bar" とすると foo と表示される. Vim script 内で完結していれば NUL 文字と出会うことも無いけれども,NUL 文字を区切り文字として使って出力するようなプログラムが一部存在する. 代表例は find -print0 だと思う. :echo system('find . -type f -name "*.vim" -print0') などとすると,最初のパスだけしか表示されない.

そこで readfile() が使える. :help readfile() を見ると

All NUL characters are replaced with a NL character.

と書かれている. readfile() は各行を要素としたリストを返すため,:call system('find . -type f -name "*.vim" -print0 > /tmp/paths.txt') と一旦ファイルに書き出した後に :echo split(readfile('/tmp/paths.txt')[0], '\n') とすれば正しくパスのリストが手に入る. ちなみに実際にこの方法を利用するときは,書き出すテンポラリファイルのパスは tempname() で得たものを使うといいと思う.