Vim 维姆说';缺少:endif';,但是我';我肯定它在那儿
考虑以下vim代码Vim 维姆说';缺少:endif';,但是我';我肯定它在那儿,vim,vim-plugin,Vim,Vim Plugin,考虑以下vim代码 function! s:foo() if s:bar() let a = 1 endif endfunction function! s:bar() python << EOF vim.command('echoerr "blabla"') EOF endfunction command! Foo call s:foo() map <F7> :Foo<CR> 函数!s:foo() 如果s:bar() 设
function! s:foo()
if s:bar()
let a = 1
endif
endfunction
function! s:bar()
python << EOF
vim.command('echoerr "blabla"')
EOF
endfunction
command! Foo call s:foo()
map <F7> :Foo<CR>
函数!s:foo()
如果s:bar()
设a=1
恩迪夫
端功能
功能!s:bar()
python如果s:bar()
期望s:bar()
返回值,但是s:bar()
没有。因此出现了“缺失:endif”
另一方面,您也没有为Python代码导入vim(不确定这是否仍然是必需的)
更新:echoorr
也会引发vim.error
。请尝试以下方法:
函数!s:bar()
python在函数中,:echearr
的工作方式类似于:throw
,并引发异常。正常控制流中断,Vim抱怨未看到:endif
<代码>:echoorr
在函数中实际上是无用的,这也是因为显示了整个多行堆栈跟踪
我可以通过设置v:errmsg
(或任何其他自定义变量或标志)来解决此问题,然后在函数结束时直接检查并报告错误:
function! s:foo()
let v:errmsg = ''
if s:bar()
let a = 1
endif
endfunction
function! s:bar()
python << EOF
vim.command('let v:errmsg = "blabla"')
EOF
endfunction
command! Foo call s:foo() | if ! empty(v:errmsg) | echoerr v:errmsg | endif
map <F7> :Foo<CR>
函数!s:foo()
让v:errmsg=''
如果s:bar()
设a=1
恩迪夫
端功能
功能!s:bar()
python旁注:!空(字符串)
效率很低,因为它必须先将string
转换为列表。考虑使用<代码> LeN(String)< /C> >,或者只是<代码> String!=“x”<代码>。这是一个普遍存在的错误……对不起,len(string)
应该是strlen(string)
@lcd047:你实际测量过吗?我看不出有什么显著的区别,我也不认为会有显式的列表转换。哦,字符串的len()
和strlen()
是相同的;Vim不尝试优化任何东西,即使是这样的入侵。从开发人员的角度来看,这种方法是有意义的。从用户的角度看,情况并非如此len()
,就像empty()
,是一个列表函数。当你打一次电话时,速度差并不重要;当您从排序函数调用它时,它可能开始累积。但即使这是一个毫无意义的优化,它仍然是理解语言的一个小细节(至少对我来说是这样)。shrug@lcd047empty()。