質問: ### 前提・実現したいこと foldingの折り畳みの挙動をアウトラインエディタのworkflowyに近づけたい。 ### 問題 vimのfoldingがworkflowyを代表としたアウトラインエディタの折り畳みと異なる挙動をするのを変更したい。 #### 例 ※ {{{1 等の折り畳みレベルを便宜的に(1), (2)などと表現します ``` aaaa(1) bbb(2) ccc(2) ddd(3) ``` 上記のような階層表示において、ccc(2)の行にカーソルを移動させ、zcで折り畳むと ``` aaaa(1) bbb(2) ccc(2) ``` という挙動(dddはcccの子ノードなので、cccの中に折り畳まれる)を期待していましたが、 ``` aaaa(1) bbb(1) ``` ccc(2)がbbb(2)に折り畳まれ、さらにbbbの階層が(1)になってしまいます。 vimの公式リファレンスを読んでも、上記のようなfoldingの折り畳みの挙動についての記載は発見できずにいます。 このような場合、どのような設定をすれば期待する挙動となりますでしょうか。 もし設定のみで解決しない場合、vimscriptのレベルでプラグインを作ることで解決できるものなのでしょうか。指針のみでもかまいませんので、お教えいただければと思います。 ### 試したこと foldlevelを変更して試す foldmethodをindentに変更して試す ### 補足情報(言語/FW/ツール等のバージョンなど) * Windows10 64bit * Kaoriya-vim 最新版 * vimrcに『set foldmethod=marker』のみを追加
回答: ``` scriptencoding utf-8 function! FoldTree(lnum) let indc = len(matchstr(getline(a:lnum ),'^\s*'))+1 let indn = len(matchstr(getline(a:lnum+1),'^\s*'))+1 return indn > indc ? '>'.indc : indc-1 endfunction setl foldenable foldmethod=expr foldexpr=FoldTree(v:lnum) setl foldtext=v:folddashes.'\ '.getline(v:foldstart) ``` こんなスクリプトを使ってはどうでしょうか?プラグイン化してませんが、ニーズがあるなら作るかもしれません。