VIM: Почему эта функция висит VIM? - PullRequest
1 голос
/ 16 марта 2012

Я добавил следующую тонкую функцию в мою строку состояния, чтобы показать, какая функция в настоящее время редактируется на языках, производных от C:

set statusline+=%{WhatFunctionAreWeIn()}
fun WhatFunctionAreWeIn()
    let strList = ["while", "foreach", "ifelse", "if else", "for", "if", "else", "try", "catch", "case"]
    let foundcontrol = 1
    let pos=getpos(".")          " This saves the cursor position
    let view=winsaveview()       " This saves the window view

    while (foundcontrol)

        let foundcontrol = 0

        " Go to the character before the last open {
        normal [{
        call search('\S','bW')

        " If the character is a ) then go to the character
        " preceding the () section
        let tempchar = getline(".")[col(".") - 1]
        if (match(tempchar, ")") >=0 )
            normal %
            call search('\S','bW')
        endif

        let tempstring = getline(".")

        for item in strList
            if( match(tempstring,item) >= 0 )
                let foundcontrol = 1
                break
            endif
        endfor

        if(foundcontrol == 0)
            call cursor(pos)
            call winrestview(view)
            return tempstring
        endif
    endwhile
    call cursor(pos)
    call winrestview(view)
    return tempstring
endfun

Однако через несколько минут VIM зависает. Отключение функции предотвращает зависание, поэтому я уверен, что виновата эта функция. Есть ли там что-нибудь, что может повесить VIM? Есть ли лучший способ выполнить задачу отображения редактируемой в данный момент функции в строке состояния?

Спасибо.

1 Ответ

1 голос
/ 29 марта 2012

Проблема в том, что ваша стратегия определения того, продолжать ли движение к окружающим скобкам, слишком агрессивна:

  • Предположим, что ваш курсор находится на f в директиве препроцессора #endif между двумя функциями.
  • Поскольку вы находитесь между двумя функциями, нет равных { для [{ для перехода, поэтому курсор не перемещается.
  • Ваш match() против strList попадает в if в #endif, вызывая продолжение цикла.
  • Цикл никогда не завершается.

Я подозреваю, что подход на основе ctags, как @Gowtham предлагает, будет работать лучше, даже если потребуется некоторая настройка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...