我有多个文本块,或者换句话说,多个像这样的功能:
def ==(other)
...
end
def to_s(full=false)
...
end
def to_a
...
end
def to_hash
...
end
def inspect
...
end
我想按照函数签名的字母顺序对函数进行排序。如何在 Vim 中轻松实现此操作?
答案1
它相对简单(并且我相信,接近 Jason 所想的):
将所有换行符替换为一些特殊的字符,将所有函数变成一行:
:g/def/,/end/s/\n/§
按照以下方式对这几行进行排序:
:%sort
将所有功能展开回其初始状态:
: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