Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim 维姆说';缺少:endif';,但是我';我肯定它在那儿_Vim_Vim Plugin - Fatal编程技术网

Vim 维姆说';缺少:endif';,但是我';我肯定它在那儿

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() 设

考虑以下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()
设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@lcd047
empty()。