Como classifico vários blocos de texto pela primeira linha em cada bloco no Vim?

9

Eu tenho vários blocos de texto ou, em outras palavras, várias funções como esta:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

Eu quero classificar as funções em ordem alfabética pela assinatura da função. Como isso pode ser feito mais facilmente no Vim?

    
por Hubro 10.05.2014 / 22:53

4 respostas

10

É relativamente simples (e, acredito, próximo do que Jason tinha em mente):

  1. Transforme todas as suas funções em uma única linha, substituindo todas as novas linhas com algum caractere sofisticado:

    :g/def/,/end/s/\n/§
    
  2. ordene aqueles forros com:

    :%sort
    
  3. expanda todas as suas funções para o estado inicial:

    :g/def/s/§/\r
    
por 13.05.2014 / 10:05
3

Eu escrevi o plug-in AdvancedSorters para simplificar as três etapas separadas fornecidas na @ romainl's responda em um único comando:

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

O padrão aqui é um pouco mais complexo para incluir adequadamente as linhas vazias separadas.

    
por 11.06.2014 / 11:14
2

A melhor maneira que posso pensar em fazer isso sem escrever uma função que analise as definições, seria substituir os delimitadores de linha não precedidos por end por outro delimitador exclusivo (+ EOL +?) e, em seguida, :sort , e substitua novamente os delimitadores de linha. Provavelmente poderia ser gravado em uma macro.

Uma função pode ser melhor, no caso de você querer usar a seleção visual.

    
por 10.05.2014 / 23:56
2

Experimente o plugin vissort. Ele suporta um recurso de classificação de blocos:

  • : '< '> BS próximo bloco de extremidade endblock findtag tagpat tagsub
  • : [intervalo] chamada BlockSort (nextblock, endblock, findtag, tagpat, tagsub)

Se algum argumento estiver faltando, BlockSort () irá consultá-lo para eles. Os padrões nextblock / endblock delimitam um bloco, o padrão findtag é usado para encontrar uma linha contendo uma "tag" que será usada para classificação; o tagpat e o tabsub são usados em um substituto para extrair a tag de classificação da linha contendo tags.

Você pode obter o vissort.vim no link

    
por 14.06.2014 / 07:35

Tags