今では存在すら忘れさられているというか存在を知らない人もいそうな NTFS の代替データストリーム機能。これを Vim で読み書きする方法の紹介。
読み込む
file.txt の stream という代替データストリームを読み込む場合。
edit file.txt:stream
これで開ける。
書き込む
普通に :write で書き込める。普通のファイルを
write file.txt:stream
とすれば代替データストリームとして保存できる。
何のことはない
ファイル名の後に : とストリーム名を繋げてファイルを読み書きすれば自動的に代替データストリームに対する読み書きになる。これは別に Vim が特別なことをしているわけじゃなくて、詳しいことは知らないけど Windows か NTFS レベルのレイヤーの話なので、メモ帳や他のエディタでもできる。
metarw.vim の罠
metarw.vim を導入していると : を含むパスは読み書きのイベントが取られてしまうのでうまく扱えない。これを一時的に無理矢理回避にするには :edit や :write する際に :noautocmd を使って :noautocmd edit や :noautocmd write のようにする。
metarw.vim は Scheme を
The name of a scheme must consist of 2 or more characters, and it
should consist of only lowercase, English alphabets.
としてるけど今回の代替データストリームの : に反応しちゃうのはバグかなぁ。たしかに file-pattern だけじゃこのパターンは作れないから対応は大変そうだけれども。
その他
filereadable() や filewritable() も普通に機能するし、delete() を使えば代替データストリームの削除もできる。だから例えば Vim で Zone.Identifier*1 を消す、なんてこともできるわけですね。誰得。
注意
'backupcopy' が auto だと Vim さんは no の方を使ってしまうようで、保存すると代替データストリームが消える。それでも誰も困ってないあたり、代替データストリームって誰も使ってないのね。私も使ってないけど。
*1:ネットからダウンロードしてきたファイルに付いてて、これが付いてるとexeの実行時なんかに警告がでる。