Come posso ordinare più blocchi di testo in base alla prima riga di ciascun blocco in Vim?


11

Ho più blocchi di testo o, in altre parole, più funzioni come questa:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

Voglio ordinare le funzioni in ordine alfabetico in base alla firma della funzione. Come è possibile farlo più facilmente in Vim?


definire cosa intendi per firma della funzione per favore. Che tipo di funzioni sono queste? Inoltre, su quale piattaforma stai lavorando sotto il sistema operativo, la distribuzione e il numero di versione sarebbero MOLTO utili.
mdpc,

1
perché questo deve essere fatto in VIM? ci sono eccellenti utility unix / linux integrate che possono essere facilmente messe insieme per questo tipo di cose .... awk mi viene in mente.
mdpc,

@mdpc: Per firma della funzione intendo solo la riga che contiene def .... Sono su Linux, quindi una di quelle utility funzionerà per me.
Hubro,

Risposte:


12

È relativamente semplice (e, credo, vicino a ciò che Jason aveva in mente):

  1. trasforma tutte le tue funzioni in una fodera sostituendo tutte le nuove righe con un carattere di fantasia:

    :g/def/,/end/s/\n/§
    
  2. ordina quelle fodere con:

    :%sort
    
  3. espandi tutte le tue funzioni al loro stato individuale iniziale:

    :g/def/s/§/\r
    

1
Allo stesso modo, se le righe vuote possono essere considerate come separatori univoci, allora potrebbe essere fatto con :g/./,/^$/-s/\n/§/g, e quindi :%sort, e pois/§/\r/g
ArtBIT

3

Ho scritto il plug-in AdvancedSorters per semplificare i tre passaggi separati indicati nella risposta di @ romainl in un unico comando:

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

Il modello qui è leggermente più complesso per includere correttamente anche le linee vuote di separazione.


Nota: al momento è necessario un Vim 7.4.218 abbastanza nuovo; Presto fornirò un aggiornamento che supporta anche le versioni precedenti di Vim.
Ingo Karkat,

2

Il modo migliore in cui riesco a pensare di farlo senza scrivere una funzione che analizza le definizioni sarebbe quello di sostituire i delimitatori di linea non preceduti da endun altro delimitatore univoco (+ EOL +?), E quindi :sortsostituire i delimitatori di linea. Probabilmente potrebbe essere registrato su una macro.

Una funzione potrebbe essere migliore, nel caso in cui si desideri utilizzare la selezione visiva.


2

Prova il plugin vissort. Supporta una funzione di smistamento dei blocchi:

  • : '<'> Blocco nextblock BS trova tag tagpat tagsub
  • : [range] chiama BlockSort (nextblock, endblock, findtag, tagpat, tagsub)

Se mancano argomenti, BlockSort () ti interrogherà per essi. I modelli nextblock / endblock delimitano un blocco, il pattern findtag viene utilizzato per trovare una riga contenente un "tag" che verrà utilizzato per l'ordinamento; tagpat e tabsub vengono utilizzati in un sostituto per estrarre il tag di ordinamento dalla riga contenente il tag.

Puoi ottenere vissort.vim da http://www.drchip.org/astronaut/vim/index.html#VISSORT

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.