新しい折り目を作成すると、ファイル全体が折りたたまれることがあるのはなぜですか?

Aug 24 2020

vimで新しいフォールドを作成すると、ファイル全体がフォールドすることがあります。どうして?
foldmethod=manual

例えば、

  1. zi (すべての折り目が開いています)
  2. zi (すべての折り目が閉じられました)
  3. 1〜309行目は閉じて折りたたまれ、617〜662行目は閉じて折りたたまれています(ファイルには662行あります)
  4. 私のカーソルは377行目にあります
  5. 私がやるzfGのファイル終了する行377からのすべての行を折り返すために
    期待エンド・オブ・ファイルスルーライン377は閉じられ、ライン310から366が表示されます:
    実際:ファイル内のすべての行が閉鎖されています

回避策:

  1. zD (すべての折り目を削除します)
  2. :1,309fold (フォールド1-309)
  3. :377,$fold (折りたたむ377-eof)

私のフォールド*設定:

  foldclose=
  foldcolumn=0
  foldenable
  foldexpr=0
  foldignore=#
  foldlevel=0
  foldlevelstart=-1
  foldmarker={{{,}}}
  foldmethod=manual
  foldminlines=1
  foldnestmax=20
  foldopen=block,hor,mark,percent,quickfix,tag,undo
  foldtext=foldtext()

回答

1 filbranden Aug 24 2020 at 11:23

この動作は、377行目がファイルの先頭から始まる折り畳みの一部であり、その折り畳みが現在開いている場合に発生します

その場合、Vimが作成する新しい折り畳みは実際には(377行目ではなく)1行目から始まり、Vimは新しい折り畳みを閉じて、ファイル全体を効果的に折り畳みます。

この動作は次の方法で再現できます。

  1. zE (すべての折り目を削除します。)
  2. :1,309fold (フォールド1-309、あなたが説明した最初の最初のフォールド。)
  3. :617,$fold (折り目617-eof、あなたが説明した2番目の最初の折り目。)
  4. :1,400fold (上部から始まり、377行目を含む折り目。)
  5. zo (この最後の折り目を開きます!)
  6. 377G (377行目に移動します。)
  7. zfG (最後まで折りますが、これは実際には1-eofを折ります!)

そのフォールドを明示的に開いていない可能性がありますが'foldopen'、タグのフォローやマークへの移動など、のアクションの1つを介して開いている可能性があります。水平方向の動き(など377G0)でさえ、その折り目を開くようにトリガーします。

折り目を視覚的に確認したい場合は、次のコマンドを使用して、各行の先頭に折りレベルを追加できます。

:%s/^/\=foldlevel('.')."\t"/

(これによりバッファが変更されますが、別の:%sコマンドで簡単に元に戻すことができます。折り目を作成または削除すると同期がとれなくなり、行ごとの折り畳みレベルを更新できるようになります。同様の:%sコマンドでこのような操作を行った後。)

また、ziコマンドがすべての折り畳みを閉じる(折り畳みを有効にする場合)と述べましたが、それは実際には正確ではありません... Vimは手動で閉じて開いた折り畳みを追跡し、で切り替えたときにそれらの選択を保持'foldenable'ziます。

すべての折り目を閉じるコマンドは実際にはzMです。