Normal ifade arama modeline göre katlama


13

Boşluk ayrılmış değer sütunları içeren düz bir metin dosyası aldım. Bunun gibi:

AU 3030 .... ... ....  
AU 3031 .... ... ....  
AU 3032 .... ... .... 
AU 3033 .... ... .... 
IT 48100 ... .. .....
IT 40100 ... .. .....
IT 48123 ... .. .....
UK 3333 ... ... ..... 
UK 4444 ... ... .....
UK 5555 ... ... .....

Ayrıca, son sütunda aynı değerde herhangi bir bitişik satırı eşleştirecek olan bu normal ifadeyi aldım (dosyanın ilk sütunda sıralandığını varsayın):

/^\(\([A-Z0-9]\+\)\s\+.*\n\)\(\2\)\@=

(veya daha az "kıllı" yapmak için):

/^\v([A-Z0-9]+)\s+.*\n(\1)@=

Eşleşmeyen çizginin üzerine çizgiler katlanabilir mi? Bu sonuca sahip olmak:

+-- 4 lines AU ....
+-- 3 lines IT ....
+-- 3 lines UK ....

Yanıtlar:


14

Yapın set foldmethod=exprve 'foldexpr'katlama başlangıç ​​noktalarını tanımlayacak bir vim komut dosyası ifadesi ayarlamak için kullanın .

set foldmethod=expr
set foldexpr=get(split(getline(v:lnum-1)),0,'')!=get(split(getline(v:lnum)),0,'')?'>1':'='

Bu, olduğundan daha karmaşık görünüyor, çünkü boşlukları kolayca kullanamıyoruz :set, ancak boşluklarla ve bir satır veya 2 ile, şöyle görünüyor:

get(split(getline(v:lnum - 1)), 0, '') != get(split(getline(v:lnum)), 0, '')
    \ ? '>1'
    \ : '='

genel bakış

Temel olarak bu, her satırın ilk kelimesini bir önceki satırla karşılaştırır. Sözcükler farklıysa, satır katlamanın başlangıcıdır >1. Aksi takdirde aynı kat seviyesini korur =.

Zafer Ayrıntıları

  • set foldmethod=expr Vim'e, katlamaları belirlemek için bir vim komut dosyası ifadesi kullanmasını söyleme
  • 'foldexpr' seçeneği vim komut dosyası ifadesini tutar
  • >1Bir katlamanın =ne zaman başlaması gerektiğini ve katlama düzeyinin ne zaman devam etmesi gerektiğini döndüren üçlü ile durumun değerlendirilmesi
  • v:lnum'foldexpr'kıvrımları güncellemek için üzerinde çalışmakta olan geçerli satırdır
  • İçeriği geçerli satırın ( v:lnum) ve önceki satırın ( v:lnum - 1)getline()
  • Her satırı şu kelimelere bölün: split()
  • get()Yeni bölünmüş kelimelerin ilk dizinini almak için kullanın
  • ''Boş satır olması durumunda varsayılan değerini kullanın . Örneğinget(words, 0, '')
  • Geçerli satırın ilk sözcüğünü, üçgenin koşul bölümündeki bir önceki satırın ilk sözcüğü ile karşılaştırın

Not: Bu yöntemde çok büyük belgelerle ilgili bazı performans sorunları olabilir

Daha fazla yardım için bkz:

:h 'foldmethod'
:h 'foldexpr'
:h getline(
:h v:lnum
:h split(
:h get(
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.