VIM:为什么这个功能挂起VIM?

时间:2012-03-16 13:38:27

标签: debugging function vim

我在状态栏中添加了以下精细功能,以显示当前正在使用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 个答案:

答案 0 :(得分:1)

问题在于,您决定是否继续使用周围支撑的策略过于激进:

  • 假设您的光标位于两个函数之间的预处理程序指令f中的#endif上。
  • 由于您处于两个函数之间,因此{没有不匹配的[{可以跳转到,因此光标不会移动。
  • match() strList if点击了#endif中的{{1}},导致循环继续。
  • 循环永不退出。

我怀疑像@Gowtham建议的基于ctags的方法会更好,即使它需要一些自定义。