Vim内置了针对文本进行排序的:sort
命令。你可以使用:help :sort
命令,查看详细的帮助信息。
请注意,Vim内置的sort命令与Linux系统下的!sort命令并非完全一致。
使用以下命令,可以针对指定行范围内的文本进行排序:
:3,16sort
如下图所示,将第3至16行内的CSS属性进行排序:
在可视化模式下选中文本,然后执行以下命令可以对选择的文本进行排序:
:'<,'>sort
使用以下命令,将在排序时去除重复的行。对于重复的多行,将仅仅保留第一行,而其它的行将被删除。
:%sort u
使用以下命令,可以针对所有文本进行倒序排序:
:%sort!
使用以下命令,将按照数字进行排序:
:%sort n
组合以上命令,则可以按照数字倒序排序:
:%sort! n
假设我们需要对以下文本进行排序。其中,每个条目是被“.KS”和“.KE”包围的文本块;而其定义的每个术语则是以“.IP”开头的多行文字。
如果我们希望按术语进行排序,那么可以通过合并行将文本块整合为一个整体,然后进行排序;稍后再重新拆分行,来恢复原有的文本格式。具体步骤如下:
1)将换行符替换为“@@”字符:
:g/^\.KS/,/^\.KE/-1s/$/@@/
.KS@@ .IP "TTY_ARGV" 2n@@ The command, specified as an argument vector,@@ that the TTY subwindow executes.@@ .KE .KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets the remote image for icon's image.@@ .KE .KS@@ .IP "XV_LABEL" 2n@@ Specifies a frame's header or an icon's label.@@ .KE .KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with the server once.@@ Does not set synchronous mode.@@ .KE
2)以“.KS”和“.KE”作为首尾标记来合并行:
:g/^\.KS/,/^\.KE/j
.KS@@ .IP "TTY_ARGV" 2n@@ The ... vector,@@ ... .@@ .KE .KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets ... image.@@ .KE .KS@@ .IP "XV_LABEL" 2n@@ Specifies a ... an icon's label.@@ .KE .KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with ... mode.@@ .KE
3)对文本排序:
:%sort
.KS@@ .IP "ICON_IMAGE" 2n@@ Sets or gets ... image.@@ .KE .KS@@ .IP "SERVER_SYNC" 2n@@ Synchronizes with ... mode.@@ .KE .KS@@ .IP "TTY_ARGV" 2n@@ The ... vector,@@ ... .@@ .KE .KS@@ .IP "XV_LABEL" 2n@@ Specifies a ... an icon's label.@@ .KE
4)将“@@ ”字符重新替换为换行符,以恢复原有格式:
:%s/@@ /^M/g
.KS .IP "ICON_IMAGE" 2n Sets or gets the remote image for icon's image. .KE .KS .IP "SERVER_SYNC" 2n Synchronizes with the server once. Does not set synchronous mode. .KE .KS .IP "TTY_ARGV" 2n The command, specified as an argument vector, that the TTY subwindow executes. .KE .KS .IP "XV_LABEL" 2n Specifies a frame's header or an icon's label. .KE
通过以上全局替换命令和排序命令,对文档中的特定术语进行了排序,而且保持格式不变。请注意:
j
命令合并行时,自动新增了一个空格;所以在第3步的替换命令中,需要查找“@@”字符以及紧随其后的一个空格;