質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

vim / foldingの折り畳みの挙動を変更したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,656

takets

score 39

前提・実現したいこと

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』のみを追加
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

vimrcに『set foldmethod=marker』のみを追加

この状態だと 'foldmerker' オプションは {{{,}}} のように設定されているので、マーカーテキストを設置しないと折り畳みは行われません。

そして期待している挙動ですが、Vim のデフォルトでは難しいかと思います。foldmethod=expr にして、自作することで可能になるとは思います。
割とありがちな挙動だとは思うので、もしかしたら探せばすでに同様のことをするプラグインなりが存在するかもしれませんが、残念ながら私は知りません。

作るということでしたらアドバイスはできると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/08 18:15

    サンプルありがとうございます。
    現在、富士山登山中のため、下山後に試してベストアンサーをつけさせていただきます。

    キャンセル

0

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)

こんなスクリプトを使ってはどうでしょうか?プラグイン化してませんが、ニーズがあるなら作るかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/10 10:38

    ありがとうございます。
    markerでは対処できなそうなため、いただいたサンプルコードをもとに手を加えてみようかと思います。

    また、上記アウトライン ddd(3)の下にfodldingに含まれないテキストがある場合、こちらまで折り畳まれてしまう現象があるため、こちらも合わせてプラグインにできればと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る