現在選択されている行(ビジュアルモード)をRubyのbegin-rescueブロックでラップするvimscript関数を作成しています。奇妙な振る舞いをしています。これが私の関数です:
function! BeginRescueWrap()
execute "normal! gvd"
let head = "begin\<CR>"
let body = @"
let tail = "rescue StandardError =>e\<CR>binding.pry\<CR>end\<CR>"
execute "normal! i" . head . "\<CR>" . body . "\<CR>" . tail
endfunction
それはほとんど機能します-それは何らかの理由で頭と尾の2つのコピーを生成するだけです。たとえば、このテキストが選択されているときに関数を実行すると、次のようになります。
Oh lord won't you buy me a Mercedes Benz
My friends all drive Porsches, I must make amends
この出力を生成します:
begin
begin
rescue StandardError =>e
binding.pry
end
Oh lord won't you buy me a Mercedes Benz
My friends all drive Porsches, I must make amends
rescue StandardError =>e
binding.pry
end
インデントは気にしません(後で修正できます)。空の内側の折り返しとそれに続くターゲット行を含む外側の折り返しがあることに注意してください。私は何が間違っているのですか?