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
:callに複雑な式を渡すと「E15: Invalid expression」を出すことがある #17
Comments
再現する最小ケースを下さい。 |
すみません、ちょっと再現するコードを作るのに手間取ってます。 |
ああ、再現自体ができないのか。Vimスクリプトの実行のしかたを考えると、 |
単純に
charがkeysにないとかそういう話ではなく? |
その場合 |
ざっとソースコード見たけどE15出すとこオオスギワロタ |
タイミングは100%ですか? |
おそらくこういう形かと思います。
例えばこの
と出ます。実行したケースによって
が
みたくdictで無くなってたり、もしくはこの行がパスしてなかったりしませんか? |
おそらくですがそれはないと思います。 |
再現しました!
とかやってもエラー出なかったので。 |
なるほど function! s:do(...)
echomsg 's:do()'
endfunction
function! s:run()
let obj = {'do': function('s:do')}
for method in ['do']
call call(obj[method], [])
endfor
endfunction
call s:run() だと出ないのか |
あとこれはokなのね function! s:do(...)
echomsg 's:do()'
endfunction
function! s:run()
let obj = {'do': function('s:do')}
for method in ['do']
let dummy = obj[method]()
endfor
endfunction
call s:run() |
どうやら構文解析っぽい |
ダメパターンをそのまま転載: function! s:do(...)
echomsg 's:do()'
endfunction
function! s:run()
let obj = {'do': function('s:do')}
for method in ['do']
call obj[method]()
endfor
endfunction
call s:run() あとその出力:
ところで出力見るとs:do()は一回実行されてますよね。 |
スキップ処理だった。 diff -r 5e84f6567623 src/eval.c
--- a/src/eval.c Wed Sep 21 20:09:42 2011 +0200
+++ b/src/eval.c Tue Sep 27 20:39:37 2011 +0900
@@ -4013,7 +4013,7 @@
p = skipwhite(arg);
ret = eval1(&p, rettv, evaluate);
- if (ret == FAIL || !ends_excmd(*p))
+ if (evaluate && (ret == FAIL || !ends_excmd(*p)))
{
if (ret != FAIL)
clear_tv(rettv); |
これもちょっと寝かせる(何個かスクリプト動作を試す)ので、安定したら提出。 |
違うパッチになったけど、入ったのでclose |
tyru/caw.vim#12 (comment)
上は一例です(他にも
.
で長くメソッドチェインしまくったりすると起こったことが...)。しかし具体的な再現条件はつかめてません。
だいたい
let _ = expression
みたいにすると回避できます。The text was updated successfully, but these errors were encountered: