如何在Vim中对两行代码块进行排序?

8

我有一个包含以下内容的文件:

/** doxygen comment for enum member1 */
COMMON_PREFIX_name1 = 1,
/** doxygen comment for enum member2 */
COMMON_PREFIX_name2 = 2,
/** doxygen comment for enum member3 */
COMMON_PREFIX_name3 = 3,
/** doxygen comment for enum member4 */
COMMON_PREFIX_name4 = 4,
...

是否可以按照成员名称后缀name1name2等对定义进行排序,并将每个注释保留在相应的定义上方?

1个回答

7
我建议执行以下操作序列。
  1. Join the paired lines:

    :g/^\s*COMMON_PREFIX_/-j!
    
  2. Sort the joined lines by the variable names’ suffixes:

    :sort#\*/\s*COMMON_PREFIX_#
    
  3. Split the sorted lines back:

    :g#\*/\zs\ze\s*COMMON_PREFIX_#s//\r/
    
你可以一次性运行这三个命令:
:exe'g/^\s*COMMON_PREFIX_/-j!' | sort#\*/\s*COMMON_PREFIX_# | g#\*/\zs\ze\s*COMMON_PREFIX_#s//\r/

1
你能否加些解释?我不确定 -j! 的作用是什么。 - johnny
1
@johnny:当然可以。:global 命令的结束部分(第二个斜杠后面)是另一个要在匹配给定模式的行上执行的 Ex 命令。-j!- 行范围内运行带有 ! 修饰符的 :join 命令。- 是一行范围 . -1 的最短形式,指的是当前行上面的那一行。 - ib.
谢谢,我一直只用j,没有使用-或!。我从来不知道我可以与上一行连接。很抱歉,但我仍然不理解'!'的效果。 - johnny
@johnny:使用!修饰符,:join命令不会在连接的行之间插入或删除任何空格。 :j:j! Ex命令之间的区别与正常模式下的JgJ之间的区别相同。 - ib.
太好了,谢谢你抽出时间来解释。我尝试了vim帮助,但只找到了其他的意思。 - johnny

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