2015-05-22 3 views
2

Рассмотрите следующий код vim.Vim говорит «отсутствует: endif», но я уверен, что его там

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> 

Открыть сеанс vim и нажать F7. Vim wil then throw error E171: Missing :endif. Как это возможно и как я могу правильно отправить сообщение об ошибке внутри части python?

ответ

4

Внутри функции, :echoerr работает как :throw и вызывает исключение. Нормальный поток управления прерывается, и Vim жалуется, что он не видит :endif. :echoerr практически бесполезен внутри функции, также потому, что показан целый многострочный стек.

Я бы решить эту проблему, просто установив 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> 
+0

На стороне записки: ' ! empty (string) 'очень неэффективен, так как он сначала должен преобразовать' string' в список. Вместо этого используйте 'len (string)' или просто 'string! = # '''. Это распространенная ошибка ... – lcd047

+0

Извините, 'len (string)' должен быть 'strlen (string)'. – lcd047

+0

@ lcd047: Вы действительно измерили его? Я не вижу какой-либо заметной разницы, и я не думаю, что будет явное преобразование в Список. О, и 'len()' и 'strlen()' идентичны для строк. –

2

if s:bar() ожидает s:bar(), чтобы вернуть значение, но s:bar() нет. Следовательно, «отсутствует: endif».

На стороне примечания вы также не сделали import vim для кода Python (не уверен, что это все еще требуется).

Обновление:echoerr также поднимает vim.error. Попробуйте вместо этого:

function! s:bar() 
    python <<EOF 
import vim 

vim.command('normal \<Esc>') 
vim.command('echohl ErrorMsg') 
vim.command('echomsg "blabla"') 
vim.command('echohl None') 
EOF 
    return 1 
endfunction 
Смежные вопросы