39

通常我只想#include按长度对源文件和头文件顶部的所有 's 进行排序。

vim允许我以与:{range} sort u.

vim中,如何按行的长度对一系列行进行排序?这样较短的行后面跟着较长的行。

在互联网上搜索,我发现了这个:

:% s/.*/\=printf("%03d", len(submatch(0)))."|".submatch(0)/ | sor n | %s/..../

但这只能对整个文件进行排序,无论如何对我来说都是黑魔法。我试图弄清楚如何在第 4 行到第 18 行等范围内进行相同的排序,如:4,18 s/...你有什么想法吗?

4

3 回答 3

37

使用 awk 过滤视觉选择

在 vim 中执行此操作的一种方法是在排序之前使用 awk 的 length() 函数过滤视觉选择。例如:

:'<,'> ! awk '{ print length(), $0 | "sort -n | cut -d\\  -f2-" }'
于 2012-07-17T22:35:15.787 回答
7

一种方式,既不优雅也不高效,但它有效:

将以下功能添加到您的vimrc文件中。它在每行的开头插入其字符数,按数字排序并删除数字。

function! SortLines() range
    execute a:firstline . "," . a:lastline . 's/^\(.*\)$/\=strdisplaywidth( submatch(0) ) . " " . submatch(0)/'
    execute a:firstline . "," . a:lastline . 'sort n'
    execute a:firstline . "," . a:lastline . 's/^\d\+\s//'
endfunction

用一系列数字调用它,比如

:4,18call SortLines()

或在可视模式下使用V,例如:

:'<,'>call SortLines()

编辑:操作,现在我意识到这个解决方案与你的非常相似。很好,只是这%意味着完整的缓冲区,:4,18或者:'<,:'>选择特定的行。

于 2012-07-17T22:19:53.193 回答
6

我编写了AdvancedSorters 插件来处理这些复杂的排序要求。

就像在@Birei 的回答中一样,这个插件提供了扩展命令,每行评估一个表达式,将该数字放在该行的前面,进行数字排序,然后再次删除临时数字。专业化按字符数和行的显示宽度处理常见排序,因此您可以使用:

:SortByWidth
于 2014-06-11T09:20:11.260 回答