C'è un modo per utilizzare più metodi di piegatura VIM contemporaneamente?


14

Ho foldmethod=indentimpostato il mio ~/.vimrc, e in generale, che funziona per me e mi piacerebbe tenerlo.

Tuttavia, ci sono alcuni file che ho che modifico regolarmente (e che sono sotto il mio controllo esclusivo), che vorrei aggiungere in un sistema basato su marker, in particolare in modo che quando apro il file una grande sezione I raramente guardare (che è già "delimitato" dal rientro) è pre-piegato. Sembra che foldmethod=markermi avrebbe permesso di farlo (non mi importa il commento dispari nel file per indicare questi 'pre-pieghe' se necessario), ma ho ancora voglia foldmethod=indentimpostato in modo che posso usare zc, zoe così via, per poi piega o spiega le sezioni per rientro. Per quanto ne so, non posso impostare foldmethod su più valori.

C'è un altro modo in cui posso raggiungere questo obiettivo (usando idealmente qualcosa incorporato nel file stesso)?


Sto anche cercando di far funzionare contemporaneamente entrambi i metodi di marcatura e rientro. Credo anche che usare l'espressione fold sia l'opzione migliore. Hai trovato un'espressione da abbinare sia al rientro che al marcatore?
Jp_

1
@Jp_ no, 'fragile no.
Andrew Ferrier

Risposte:


10

Ogni finestra può avere il proprio valore locale di 'foldmethod'; quello che hai impostato ~/.vimrcè solo il default globale. Esistono diversi modi per impostare un valore locale diverso per un determinato buffer :

  1. Manualmente con :setlocal foldmethod=marker
  2. Per un particolare tipo di file (ad es. File Java): :autocmd FileType java setlocal foldmethod=marker(o in ~/.vim/after/ftplugin/java.vim)
  3. Per file particolari: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. All'interno del file stesso tramite una modeline (poiché è necessario aggiungere comunque i marker, preferirei questo):

/* vim: set fdm=manual : */

Può esserci ancora un solo metodo di piega all'interno di una singola finestra. Se si desidera utilizzare strategie diverse, è necessario scegliere un metodo più flessibile (ad es. expr) E implementare nuovamente gli "altri" metodi (es. Facendo in modo che 'foldexpr'il trattino sia considerato). Oppure si utilizzano due divisioni di finestre per lo stesso buffer e si impostano metodi di piegatura diversi per ciascuna divisione.

Dal momento che probabilmente non è quello che vuoi sentire, potresti hackerare qualcosa insieme a uno :autocmd CursorMovedche cambia il metodo pieghevole in base alla linea corrente:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
Grazie. Quindi questo mi dice che posso impostare foldmethod su marker all'interno di quel buffer. Ma quello che sto cercando è qualcosa che mi permetta ancora di usare il metodo del rientro, mentre alcune sezioni (che sono delimitate da un rientro) sono pre-piegate. Se faccio (4) di cui sopra, zc, zo, e così via non funzionerà come previsto in tale buffer. Ho chiarito la mia domanda.
Andrew Ferrier

La tua domanda non era chiara in questo aspetto, grazie per il chiarimento. Ho modificato la mia risposta.
Ingo Karkat,

Sì, mi scuso se non sono stato chiaro. Il foldexpr sembra l'approccio migliore ma anche complicato. Ci proverò comunque. +1 per il puntatore.
Andrew Ferrier

Grazie ancora. Ho cercato di scrivere il foldexpr e ho aperto qui una Q correlata che potrebbe essere di interesse: superuser.com/questions/560167/…
Andrew Ferrier

@IngoKarkat: Nel primo paragrafo sotto la riga hai scritto che può esserci un solo metodo di piega per buffer . Credo che dovrebbe essere per finestra .
garyjohn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.