Perché la creazione di una nuova piegatura a volte causa la piegatura dell'intero file?

Aug 24 2020

A volte quando creo una nuova piega in vim, piega l'intero file. Come mai?
( foldmethod=manual)

per esempio,

  1. zi(tutte le pieghe ora sono aperte)
  2. zi(tutte le pieghe ora sono chiuse)
  3. le righe 1-309 sono piegate chiuse e le righe 617-662 sono piegate chiuse (il file ha 662 righe)
  4. il mio cursore è sulla riga 377
  5. Faccio zfGpiegare tutte le righe dalla riga 377 alla fine del file
    Previsto : le righe da 377 fino alla fine del file sono chiuse e le righe 310-366 sono visibili
    Effettivo : tutte le righe nel file sono chiuse

Soluzione alternativa:

  1. zD(elimina tutte le pieghe)
  2. :1,309fold(piega 1-309)
  3. :377,$fold(piega 377-eof)

Le mie impostazioni piega*:

  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()

Risposte

1 filbranden Aug 24 2020 at 11:23

Questo comportamento si verificherà se la riga 377 fa parte di una piega che inizia nella parte superiore del file e quella piega che è attualmente aperta .

In tal caso, la nuova piega che Vim creerà inizierà effettivamente alla riga 1 (non alla riga 377) e Vim chiuderà la nuova piega, piegando effettivamente l'intero file.

Puoi riprodurre questo comportamento con:

  1. zE(elimina tutte le pieghe.)
  2. :1,309fold(piega 1-309, prima piega iniziale che hai descritto.)
  3. :617,$fold(piega 617-eof, seconda piega iniziale che hai descritto.)
  4. :1,400fold(una piega che inizia dall'alto e include la riga 377.)
  5. zo(apri quest'ultima piega!)
  6. 377G(vai alla riga 377.)
  7. zfG(piega fino alla fine, ma in realtà piega 1-eof!)

È possibile che tu non stia aprendo quella piega in modo esplicito, ma attraverso una delle azioni in 'foldopen', come seguire un tag o andare a un segno. Anche un movimento orizzontale (come 377G0) attiverà l'apertura di quella piega.

Se desideri vedere visivamente le pieghe, puoi utilizzare questo comando per aggiungere il livello di piegatura all'inizio di ogni riga:

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

(Nota che questo modificherà il tuo buffer, ma dovrebbe essere facile ripristinarlo con un altro :%scomando. Anche questo andrà fuori sincrono mentre crei o elimini le piegature, dovresti anche essere in grado di aggiornare il livello di piegatura per riga dopo tale operazione con un :%scomando simile .)

Hai anche detto che il zicomando chiuderebbe tutte le pieghe (quando si abilita la piegatura), ma non è molto preciso ... Vim terrà traccia delle pieghe manualmente chiuse e aperte e conserverà quelle scelte quando si passa 'foldenable'a zi.

Il comando che chiuderà tutte le pieghe è in realtà zM.