Vim'deki her bloktaki ilk satıra göre birden çok metin bloğunu nasıl sıralayabilirim?


11

Birden çok metin bloğu var, ya da başka bir deyişle, böyle birden çok işlevi:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

İşlevleri işlev imzasına göre alfabetik olarak sıralamak istiyorum. Bu Vim'de en kolay nasıl yapılabilir?


işlev imzası ile ne demek istediğinizi açıklayınız. Bunlar ne tür fonksiyonlar? Ayrıca, işletim sistemi altında hangi platformda çalışıyorsunuz, dağıtım ve sürüm numarası ÇOK yardımcı olacaktır.
mdpc

1
bunun neden VIM'de yapılması gerekiyor? kolayca bu tür şeyler için birlikte Arnavut kaldırımı olabilir mükemmel yerleşik unix / linux yarar vardır .... awk akla geliyor.
mdpc

@mdpc: İşlev imzası ile sadece içeren satırı kastediyorum def .... Linux'tayım, bu yüzden bu yardımcı programlardan herhangi biri benim için çalışacak.
Hubro

Yanıtlar:


12

Nispeten basittir (ve sanırım Jason'ın aklında olanlara yakın):

  1. tüm yeni satırları süslü bir karakterle değiştirerek tüm işlevlerinizi bir astara dönüştürün:

    :g/def/,/end/s/\n/§
    
  2. bu astarları aşağıdakilerle sıralayın:

    :%sort
    
  3. tüm işlevlerinizi başlangıçtaki bireysel durumlarına geri genişletme:

    :g/def/s/§/\r
    

1
Benzer şekilde, boş satırlar benzersiz ayırıcılar olarak kabul edilebilirse, o zaman :g/./,/^$/-s/\n/§/gve sonra :%sortve sonra yapılabilirs/§/\r/g
ArtBIT

3

@ Romainl'in cevabında verilen üç ayrı adımı tek bir komutta basitleştirmek için AdvancedSorters eklentisini yazdım :

:SortRangesByRange /^def\>/,/^end\>\_s*\zs$/

Buradaki desen, ayırma boş çizgilerini de uygun şekilde dahil etmek için biraz daha karmaşıktır.


Not: Şu anda bunun için oldukça yeni bir Vim 7.4.218'e ihtiyacınız olacak; Yakında eski Vim sürümlerini de destekleyen bir güncelleme sunacağım.
Ingo Karkat

2

Bunu, tanımları ayrıştıran bir işlev yazmadan yapmayı düşünebilmemin en iyi yolu, daha önce endbaşka bir benzersiz sınırlayıcı (+ EOL +?) Yerine :sortkullanılmayan satır sınırlayıcılarını değiştirmek ve sonra satır sınırlayıcılarını değiştirmek olacaktır. Muhtemelen bir makroya kaydedilebilir.

Görsel seçimi kullanmak istediğinizde bir fonksiyon daha iyi olabilir.


2

Vissort eklentisini deneyin. Bir blok sıralama tesisini destekler:

  • : '<'> BS nextblock bitiş bloğu findtag tagpat etiketleriub
  • : [aralık] çağrı BlockSort (nextblock, endblock, findtag, tagpat, tagsub)

Herhangi bir bağımsız değişken eksikse, BlockSort () sizi bunlar için sorgulayacaktır. Nextblock / endblock desenleri bir bloğu sınırlar, findtag deseni sıralama için kullanılacak bir "etiket" içeren bir çizgi bulmak için kullanılır; tagpat ve tabsub, etiket içeren satırdan sıralama etiketini çıkarmak için bir yedekte kullanılır.

Http://www.drchip.org/astronaut/vim/index.html#VISSORT adresinden vissort.vim adresini alabilirsiniz.

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.