関数内の ":change" の扱いがおかしい #1004

Closed
ichizok opened this Issue Jan 5, 2017 · 3 comments

Projects

None yet

2 participants

@ichizok
Member
ichizok commented Jan 5, 2017 edited

質問・報告の内容

1. :change のテキストの中に py <<EOS など「次行以降がExコマンドではない」コマンドを書くと、:source 時にエラーになる。(EOS で終端してない場合)

test1a.vim:

function! F()
  change
py <<EOS
.
endfunction

vim -Nu NONE -S test1a.vim

Error detected while processing /tmp/test1a.vim:
line    6:
E126: Missing :endfunction

:append:insert では問題ない。

test1b.vim:

function! F()
  append
py <<EOS
.
endfunction

vim -Nu NONE -S test1b.vim

2. 終端文字 . を書かなくてもエラーにならない。

test2a.vim:

function! F()
  change
123
endfunction

vim -Nu NONE -S test2a.vim

関数呼び出しも可能。endfunction 直前までが :change のテキストになる。

:call F()
" カーソル下が "123" で置換される

:append, :insert では (期待通り) エラーになる。

test2b.vim:

function! F()
  append
123
endfunction

vim -Nu NONE -S test2b.vim

Error detected while processing /tmp/test2b.vim:
line    5:
E126: Missing :endfunction

Vimのバージョン

8.0.0142

原因

https://github.com/vim/vim/blob/0cdb72a/src/userfunc.c#L2088-L2093
関数定義のパース (ex_function) では、:append, :insert:python など「次行以降がExコマンドではない」コマンドが現れた場合、対応する終端文字まで行をスキップする。
ここで :change を扱っていないのが原因。

その他

git blame で見ていくと 7.0 まで遡れた。

@ichizok
Member
ichizok commented Jan 5, 2017

vim/vim@master...ichizok:fix/change-in-func
とりあえず修正だけ。
テストは tes49.vim や test_viml.vim あたりを参考にすればいいでしょうか?

@ichizok ichizok added the kind/bug label Jan 5, 2017
@ichizok
Member
ichizok commented Jan 12, 2017

テスト追加して投げました。
vim/vim#1374

@mattn
Member
mattn commented Jan 13, 2017

8.0.0176

vim/vim@70bcd73

@mattn mattn closed this Jan 13, 2017
@mattn mattn added the xlose/fixed label Jan 13, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment