私はあなたが使用できることを知っています
set foldcolumn=1
フォールドカラムを有効にする
しかし、ファイルに折り目が存在する場合にのみ自動的にオンにする方法はありますか?
ファイルが十分に大きくなると、私の方法は@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()
ほとんどの場合、次のように、ファイルに折り畳みがあるかどうかを確認する関数を作成できます。
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
(恥知らずな自己プラグイン)
@SnoringFrogの回答をモデルにしたAuto Origamiと呼ばれるこれを行うためのプラグインを作成しました。
インストール後に次の例をvimrcにドロップして、魔法が起こることを確認します(:help auto-origami
微調整する方法を読むために読んでください)。
augroup autofoldcolumn
au!
" Or whatever autocmd-events you want
au CursorHold,BufWinEnter * AutoOrigamiFoldColumn
augroup END