J'ai plusieurs blocs de texte, ou en d'autres termes, plusieurs fonctions comme celle-ci:
def ==(other)
...
end
def to_s(full=false)
...
end
def to_a
...
end
def to_hash
...
end
def inspect
...
end
Je veux trier les fonctions par ordre alphabétique selon la signature de la fonction. Comment cela peut-il se faire le plus facilement dans Vim?
def ...
. Je suis sous Linux, donc l'un de ces utilitaires fonctionnera pour moi.Réponses:
C'est relativement simple (et, je crois, proche de ce que Jason avait en tête):
transformez toutes vos fonctions en une seule ligne en remplaçant toutes les nouvelles lignes par un caractère fantaisie:
trier ces doublures avec:
étendez toutes vos fonctions à leur état individuel initial:
la source
:g/./,/^$/-s/\n/§/g
, puis:%sort
, et ensuites/§/\r/g
J'ai écrit le plugin AdvancedSorters pour simplifier les trois étapes distinctes données dans la réponse de @ romainl en une seule commande:
Le modèle ici est légèrement plus complexe pour inclure également correctement les lignes vides de séparation.
la source
La meilleure façon de penser à cela sans écrire une fonction qui analyse les définitions, serait de remplacer les délimiteurs de ligne non précédés par
end
un autre délimiteur unique (+ EOL +?), Puis de:sort
remplacer les délimiteurs de ligne. Il pourrait probablement être enregistré dans une macro.Une fonction pourrait être meilleure cependant, dans le cas où vous souhaitez utiliser la sélection visuelle.
la source
Essayez le plugin vissort. Il prend en charge une fonction de tri des blocs:
Si des arguments manquent, BlockSort () vous interrogera pour eux. Les modèles de bloc suivant / bloc de fin délimitent un bloc, le modèle findtag est utilisé pour trouver une ligne contenant une "balise" qui sera utilisée pour le tri; tagpat et tabsub sont utilisés dans un substitut pour extraire la balise de tri de la ligne contenant la balise.
Vous pouvez obtenir vissort.vim sur http://www.drchip.org/astronaut/vim/index.html#VISSORT
la source