在vim中进行块排序

3

我希望能找到一种在Vim中对选定块进行排序的方法。场景是这样的,我有如下内容:

{:a
 :c 
 :b}

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

目前我需要输入:a:c到新行,对所选块运行排序,然后再把括号放回原处。我正在寻找一种不需要进行这个额外操作的排序方法。


1
如果插件适合您,您可以尝试_vis.vim_,请参见此处:https://vi.stackexchange.com/questions/9869/sorting-a-column-without-altering-other-columns - BillyJoe
3个回答

1
以下方法可以稍微减少你的工作量,但并不能完全解决问题,基本上它会根据冒号后面的内容进行排序,然后去掉括号,但不会再次为你插入括号:
:'<,'>sort /^.\{-}:/ |%s/{\|}//g

希望这有所帮助,愉快地使用 Vim。

1

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

"ayi{

这将复制内容和行,但不包括花括号。然后您可以将其输入到排序函数中。
sort(split(getreg('a')))

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

显然,您应该将整个过程放在函数/宏或命令中。


1
这里有一种使用Ex命令的方法。使用:global:sort对范围进行排序非常容易。以下命令将对花括号之间的行进行排序:

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

但是这里的复杂之处在于(以您的示例为例),括号与数据在同一行上。我们需要先将它们分开到相邻的行,然后再撤消这个操作。使用:substitute可以做到这一点:
:%s/{\zs\|\ze}/\r/g
:g/^{/+1,/^}/-1sort
:%s/{\zs\n\|\n\ze}//g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接