Tengo múltiples bloques de texto, o en otras palabras, múltiples funciones como esta:
def ==(other)
...
end
def to_s(full=false)
...
end
def to_a
...
end
def to_hash
...
end
def inspect
...
end
Quiero ordenar las funciones alfabéticamente por la firma de la función. ¿Cómo se puede hacer esto más fácilmente en Vim?
def ...
. Estoy en Linux, por lo que cualquiera de esas utilidades funcionará para mí.Respuestas:
Es relativamente simple (y, creo, cercano a lo que Jason tenía en mente):
Convierta todas sus funciones en un solo revestimiento reemplazando todas las líneas nuevas con un carácter elegante:
ordenar aquellos con los que se recubre:
expanda todas sus funciones a su estado individual inicial:
fuente
:g/./,/^$/-s/\n/§/g
, y luego:%sort
, y luegos/§/\r/g
He escrito el complemento AdvancedSorters para simplificar los tres pasos separados dados en la respuesta de @ romainl en un solo comando:
El patrón aquí es un poco más complejo para incluir también correctamente las líneas vacías de separación.
fuente
La mejor manera en que puedo pensar en hacer esto sin escribir una función que analice las definiciones, sería sustituir los delimitadores de línea no precedidos por
end
otro delimitador único (+ EOL +?), Y luego:sort
, y volver a sustituir los delimitadores de línea. Probablemente podría grabarse en una macro.Sin embargo, una función podría ser mejor, en el caso de que desee utilizar la selección visual.
fuente
Prueba el plugin vissort. Es compatible con una instalación de clasificación de bloques:
Si falta algún argumento, BlockSort () lo consultará por ellos. Los patrones nextblock / endblock delimitan un bloque, el patrón findtag se usa para encontrar una línea que contenga una "etiqueta" que se usará para ordenar; el tagpat y el tabsub se usan como sustituto para extraer la etiqueta de clasificación de la línea que contiene la etiqueta.
Puede obtener vissort.vim en http://www.drchip.org/astronaut/vim/index.html#VISSORT
fuente