Vim script で end 系のコマンドを :execute できない理由
Lingr の Vim 部屋で次のようなコードが投げられました。
http://lingr.com/room/vim/archives/2013/12/22#message-17893985
let g:queue = range(9) command! WHILE while !empty(g:queue) command! END endwhile " echo g:queue WHILE echo remove(g:queue, 0) END
このコードがエラーになるのは Vim script が行単位で読み込まれるためです。
つまり WHILE が読み込まれて while !empty(g:queue) が実行された時にまだ END は読み込まれておらず endwhile が見つからなくてエラーになります。
なので
while 1 echo "homu" execute "endwhile"
のように endwhile を execute で実行する場合もエラーになります。
これは while にかぎらずに if や for、try などでも同様のエラーになります。
また、同様に catch を :execute で実行した場合も正しく動作しません。
try throw 42 " throw した時にまだ実行されておらず catch は行われない execute "catch /" . 42 . "/" echo "homu" endtry