Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gvim automatic show foldcolumn when there are folds in a file

Tags:

vim

folding

fold

I know you can use

set foldcolumn=1

to enable fold column

but is there a way to automatic turn it on only when there are folds exist in the file?

like image 607
Jerry Gao Avatar asked Jan 06 '12 11:01

Jerry Gao


1 Answers

My method is faster than @Zsolt Botykai's when files get large enough. For small files I'd imagine the time difference is insignificant. Instead of checking every line for a fold, the function simply tries to move between folds. If the cursor never moves, there are no folds.

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()
like image 85
SnoringFrog Avatar answered Sep 18 '22 12:09

SnoringFrog