6

私はあなたが使用できることを知っています

set foldcolumn=1

フォールドカラムを有効にする

しかし、ファイルに折り目が存在する場合にのみ自動的にオンにする方法はありますか?

4

3 に答える 3

7

ファイルが十分に大きくなると、私の方法は@Zsolt Botykaiの方法よりも高速です。小さなファイルの場合、時間差は重要ではないと思います。折り目のすべての行をチェックする代わりに、関数は単に折り目間を移動しようとします。カーソルが移動しない場合、折り目はありません。

function HasFolds()
    "Attempt to move between folds, checking line numbers to see if it worked.
    "If it did, there are folds.

    function! HasFoldsInner()
        let origline=line('.')  
        :norm zk
        if origline==line('.')
            :norm zj
            if origline==line('.')
                return 0
            else
                return 1
            endif
        else
            return 1
        endif
        return 0
    endfunction

    let l:winview=winsaveview() "save window and cursor position
    let foldsexist=HasFoldsInner()
    if foldsexist
        set foldcolumn=1
    else
        "Move to the end of the current fold and check again in case the
        "cursor was on the sole fold in the file when we checked
        if line('.')!=1
            :norm [z
            :norm k
        else
            :norm ]z
            :norm j
        endif
        let foldsexist=HasFoldsInner()
        if foldsexist
            set foldcolumn=1
        else
            set foldcolumn=0
        endif
    end
    call winrestview(l:winview) "restore window/cursor position
endfunction

au CursorHold,BufWinEnter ?* call HasFolds()
于 2015-03-16T20:43:35.493 に答える
2

ほとんどの場合、次のように、ファイルに折り畳みがあるかどうかを確認する関数を作成できます。

function HasFoldedLine() 
    let lnum=1 
    while lnum <= line("$") 
        if (foldclosed(lnum) > -1) 
            return 1 
        endif 
        let lnum+=1 
    endwhile 
    return 0 
 endfu 

これで、いくつかの で使用できるようになりましたautocommand

au CursorHold * if HasFoldedLine() == 1 | set fdc=1 | else |set fdc=0 | endif 

HTH

于 2012-01-06T12:52:53.047 に答える
2

(恥知らずな自己プラグイン)

@SnoringFrogの回答をモデルにしたAuto Origamiと呼ばれるこれを行うためのプラグインを作成しました。

インストール後に次の例をvimrcにドロップして、魔法が起こることを確認します(:help auto-origami微調整する方法を読むために読んでください)。

augroup autofoldcolumn
  au!

  " Or whatever autocmd-events you want
  au CursorHold,BufWinEnter * AutoOrigamiFoldColumn
augroup END
于 2017-08-27T05:20:27.550 に答える