Vim: 按级别排序

Vim: sorting with levels

我有以下带有 Markdown 标记的文件:

* [B](B)
  * b
  * c
* [C](C)
* [A](a)
  * a

我尝试对其进行排序并得到以下结果:

* [A](a)
  * a
* [B](B)
  * b
  * c
* [C](C)

只需要对主层级进行排序,子层级必须跟在主层级之后,即保持在原来的层级。第一个想到的当然是:sort;但不幸的是,这也会对子级别进行排序。我们将得到:

  * a
  * b
  * c
* [A](a)
* [B](B)
* [C](C)

这种排序有什么技巧或插件吗?谢谢!

解决这个 class 问题的通常方法是内联每个块,然后对它们进行排序,然后将它们“反内联”回原来的状态。

第一步:内联每个块。

我们通过将每个 EOL 后跟 SPACE-SPACE-STAR 替换为一些不太可能在我们的文档中找到的奇特符号来做到这一点:

:%s/\n\(  \*\)/§

这给了我们以下内容:

* [B](B)§  * b§  * c
* [C](C)
* [A](a)§  * a

第二步:对缓冲区进行排序

我们简单地使用:help :sort:

:sort

获得这个:

* [A](a)§  * a
* [B](B)§  * b§  * c
* [C](C)

第三步:将每个“方块”恢复到初始状态。

我们通过将上面的替换还原为另一个更简单的替换来做到这一点:

:%s/§/\r

这给了我们想要的结果:

* [A](a)
  * a
* [B](B)
  * b
  * c
* [C](C)

一些注意事项:

  • 第一个替换中使用的确切模式取决于文档的确切结构。那部分是,IMO,太过高度上下文化,无法概括。
  • §只是一个例子,使用任何你想要的符号。