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,太过高度上下文化,无法概括。
§
只是一个例子,使用任何你想要的符号。
我有以下带有 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,太过高度上下文化,无法概括。
§
只是一个例子,使用任何你想要的符号。