我正在寻找一种在Vim中选择块进行排序的方法。场景是我有类似的东西
{:a
:c
:b}
# after sort, it should be
{:a
:b
:c}
我现在该怎么做是因为我必须将:a
和:c
输入到新行,在选定块上运行sort,然后稍后将括号放回去。我正在寻找一种无需进行额外操作即可进行排序的方法。
答案 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