Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vim script の再帰回数について #270

Closed
osyo-manga opened this issue Nov 4, 2012 · 9 comments

Comments

Projects
None yet
6 participants
@osyo-manga
Copy link

commented Nov 4, 2012

次のような Vim script を実行すると次のようなエラーが出力されます。

  • ソース
set maxfuncdepth=1000

function! s:func(n)
    if a:n
        call s:func(a:n-1)
    endif
endfunction
call s:func(198)
  • エラー
function <SNR>294_func..<SNR>294_func..(中略)<SNR>294_func..<SNR>294_func の処理中にエラーが検出されました:
行    1:
E169: コマンドが再帰的過ぎます

関数の再帰回数は maxfuncdepth で設定できるんですが、上記の場合はそれよりも少ない数でエラーになってしまいます。
エラーコードを見る限りではコマンドの再帰でエラーになっているぽいです。
これはこういう仕様なんでしょうか?
ちなみに set maxfuncdepth=100 した場合は E132 が発生します。

@koron

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

ex_docmd.c:801 ですね。
execute や source などでコマンドラインコマンドが再起するのを防ぐため
200回(ハードコーディング) という制限がある模様。

ドキュメントに明示するか、オプション化しておいたほうが良いかも。

@koron

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

maxfuncdepth の適用範囲はevalであり、cmdlineではないってことなんだろうなぁ。

call そのものはcmdline であってeval ではないので maxfuncdepth の適用対象外。
ただその先で呼ばれる関数はmaxfuncdepth の対象となる。

が今の実装仕様ですね。

@mattn

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

これそっちもmaxfuncdepthにした方がうれしいなー

@mattn

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

まぁ違うオプションでもいいけど200を変えれないのは痛い

@thinca

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

コマンドの再帰数が200に制限されているのは、:help E169 に書いてありますね。
ただ、関数を呼び出すにはまずコマンドを実行しなくてはいけないので、
'maxfuncdepth' を 200 以上にしても先にコマンドの制限に引っ掛かってしまうのがアレですね。

@mattn

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

とりあえず、このままほっとくと沈みそうなので提案してみます?

@koron

This comment has been minimized.

Copy link
Member

commented Nov 5, 2012

evalの右辺で再帰すればいけそうw

提案するに +1
2012/11/05 13:40 "mattn" notifications@github.com:

とりあえず、このままほっとくと沈みそうなので提案してみます?


Reply to this email directly or view it on GitHubhttps://github.com//issues/270#issuecomment-10060479.

@k-takata

This comment has been minimized.

Copy link
Member

commented Jan 3, 2017

8.0.137 で 'maxfuncdepth' の値が適用されるようになりました。
https://groups.google.com/d/topic/vim_dev/v1_h1YdQ_vg/discussion

@k-takata k-takata closed this Jan 3, 2017

@k-takata k-takata added the xlose/fixed label Jan 3, 2017

@tyru

This comment has been minimized.

Copy link
Member

commented Jan 3, 2017

これで悩んでましたが解消しました。ありがとうございます!
(http://vim-jp.org/redirects/ の "Latest Vim official binary for Windows x64" (8.0.142) で確認済み)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.