如何在 Vim 中按每个块的第一行对多个文本块进行排序?

如何在 Vim 中按每个块的第一行对多个文本块进行排序?

我有多个文本块,或者换句话说,多个像这样的功能:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

我想按照函数签名的字母顺序对函数进行排序。如何在 Vim 中轻松实现此操作?

答案1

它相对简单(并且我相信,接近 Jason 所想的):

  1. 将所有换行符替换为一些特殊的字符,将所有函数变成一行:

    :g/def/,/end/s/\n/§
    
  2. 按照以下方式对这几行进行排序:

    :%sort
    
  3. 将所有功能展开回其初始状态:

    :g/def/s/§/\r
    

答案2

我写了AdvancedSorters 插件将@romainl 的答案中给出的三个独立步骤简化为一个命令:

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

这里的模式稍微复杂一些,也正确地包含了分隔的空线。

答案3

我能想到的最好的方法是,在不编写解析定义的函数的情况下,将未以 开头的行分隔符替换end为另一个唯一分隔符 (+EOL+?),然后:sort,并重新替换行分隔符。它可能被记录到宏中。

不过,如果您想使用视觉选择,功能可能会更好。

答案4

尝试 vissort 插件。它支持块排序功能:

  • :'< '>BS nextblock endblock findtag tagpat tagsub
  • :[范围]调用 BlockSort(nextblock,endblock,findtag,tagpat,tagsub)

如果缺少任何参数,BlockSort() 将向您查询这些参数。nextblock/endblock 模式用于界定一个块,findtag 模式用于查找包含将用于排序的“标签”的行;tagpat 和 tabsub 用于替代从包含标签的行中提取排序标签。

您可以从以下位置获取 vissort.vimhttp://www.drchip.org/astronaut/vim/index.html#VISSORT

相关内容