在vim中排序

时间:2017-06-26 00:18:15

标签: sorting vim

我正在寻找一种在Vim中选择块进行排序的方法。场景是我有类似的东西

{:a
 :c 
 :b}

# after sort, it should be 
{:a
 :b
 :c}

我现在该怎么做是因为我必须将:a:c输入到新行,在选定块上运行sort,然后稍后将括号放回去。我正在寻找一种无需进行额外操作即可进行排序的方法。

3 个答案:

答案 0 :(得分:1)

以下将减少你的努力轻微但仍然没有完全解决它,基本上它会根据冒号后面的内容进行排序,然后删除括号但它不再插入它们为你:

:'<,'>sort /^.\{-}:/ |%s/{\|}//g

希望它有所帮助,快乐的vimming。

答案 1 :(得分:1)

您可以通过将大括号内部读入寄存器来实现此目的。

"ayi{

这将复制内容和线条,而不会在它们周围添加大括号。

然后你可以将它运行到sort函数

sort(split(getreg('a')))

这需要设置modifiable标志,因为您正在更改非可见缓冲区。它对缓冲区a进行了排序。然后,您可以将其粘贴到大括号vi{"ap内。

显然你应该将while事物放在函数/宏或命令中。

答案 2 :(得分:1)

这是使用Ex命令的一种方法。 :global:sort可以非常轻松地对范围进行排序。以下命令对之间的行进行排序由大括号分隔的行

:g/^{/+1,/^}/-1sort

但是这里的复杂性是(在你的例子中),封闭的大括号 on 与数据相同(第一个,最后一个)行。我们需要先将它们分开到相邻的行,然后再撤消它。 :substitute可以做到这一点:

:%s/{\zs\|\ze}/\r/g
:g/^{/+1,/^}/-1sort
:%s/{\zs\n\|\n\ze}//g