2011-01-23 16 views
2

私は現在のフォールドの最初の行の行番号を見つける必要があるVimscript関数を書いています。これまで私はこれを使用しています:現在のVimフォールドの最初の行を見つける

function! GetFoldStart() 
    let l:current_line=line('.') 
    normal [z 
    let l:current_fold_start=line('.') 
    execute 'normal ' . l:current_line . 'g' 
endfunction 

これはうまく動作しますが、不必要に高価なようです。それを達成するための安価な方法はありますか?基本的には、実際に行に移動することなく[z]コマンドの機能を借用する必要があります。

変数v:foldstartが私の救助になることを期待していましたが、閉じた折り畳み(foldtextでの使用)に対してのみ正しく機能しているようです。

あなたのVimの知恵をお寄せいただきありがとうございます! ジョナサン。

答えて

1

まず、スクリプトにnormal!(バング付き)を使用してください。より安全です。第二に、

let winview=winsaveview() 
try 
    " Your code here " 
finally 
    call winrestview(winview) 
endtry 

はその後let l:current_line=line('.') ... execute "normal! ".l:current_line."gg"より多くのケースを保持しています。

私はnormal! [zせずに必要な情報を取得する方法を知りませんが、次のコードは、ジャンプリストを変更しないでください。

function! GetFoldStart() 
    let winview=winsaveview() 
    try 
     keepjumps normal! [z 
     return line(".") 
    finally 
     keepjumps call winrestview(winview) 
    endtry 
endfunction 
+0

おかげで、それは非常に良いアドバイスだ(私は長い間Vimのユーザーですが、新鮮なVimスクリプタ)。私はまだ別の解決策があると思っています。 –

関連する問題