2012-03-16 7 views
1

私は現在、C由来の言語で編集されている機能を示すために私のステータスバーに以下の罰金機能を追加しました:VIM:なぜこの機能はVIMに掛かっていますか?

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をハングする可能性のあるものはありますか?ステータスバーに現在編集されている機能を表示するタスクを実行するためのより良い方法はありますか?

ありがとうございました。

+0

これが見つかりました。 http://www.vim.org/scripts/script.php?script_id=610私は自分でそれを使用していないが、それはctagsに基づいているので、それは堅牢でなければならないと思う。 – Gowtham

+0

Gowthamありがとうございますが、そのスクリプトはPHPファイルでは機能しません。配列が関数のカーソル位置の上に宣言されている場合は、関数ではなく配列の名前が表示されます。 – dotancohen

+0

すべてのファイルタイプ、またはPHPだけがハングしますか?ハングアップを引き起こすファイルを提供できますか? –

答えて

1

問題は、周囲の括弧に移動し維持するかどうかを決定するための戦略があまりにも積極的であるということである。

  • は、カーソルが2つの関数のプリプロセッサディレクティブ#endiffであると仮定します。
  • 2つの機能の間にあるため、[{のジャンプ先が不一致の{がないため、カーソルは移動しません。
  • に対してstrListif#endifになるため、ループが続行されます。
  • ループは終了しません。

@Gowthamのように、カスタマイズが必要な場合でも、より良い結果が得られると考えられます。

+0

ありがとう、David。私はctagsソリューションをやり直して、PHP用にカスタマイズできるかどうか確認します。 – dotancohen

関連する問題