Vim按虚拟列排序

时间:2013-09-21 19:45:05

标签: sorting vim

为什么我不能在第三栏中对下表进行排序?

第1列按:sort /.*\%1v/排序:

Audi       ***     ****      **
BMW        *****   ***       *****
Mercedes   ****    *****     ***
Opel       ***     ***       *

第2列也可以使用:sort /.*\%2v/排序:

BMW        *****   ***       *****
Mercedes   ****    *****     ***
Opel       ***     ***       *
Audi       ***     ****      **

但是第3列没有按:sort /.*\%3v/排序:

BMW        *****   ***       *****
Audi       ***     ****      **
Opel       ***     ***       *
Mercedes   ****    *****     ***

我做错了什么?

2 个答案:

答案 0 :(得分:3)

你被一种误解所欺骗:\%v原子指定了字符列(但不会将它们作为匹配使用);我想你想根据空白分隔的文本/报纸或表格中所谓的“列”进行排序。

即。你的第一个例子对字符B,A,O和M进行排序;第二个关于*上的M,u,p,e,(取决于您的语言环境,大写字母排在小写之前)。

如果您有:set ruler,则会在右下角看到当前列。在您的示例中,第三个文本列从位置20开始,因此您必须使用

:%sort /.*\%20v/

对第三个文本列进行排序。

对于Vim,虚拟列表示屏幕列,以一个(单宽)字符占用的值来衡量。还有,这意味着(有点不直观地)字符表示的字节数。这种区别对非ASCII,不可打印和<Tab>字符很重要。

答案 1 :(得分:2)

你做错了是考虑

**
*****
***
*

作为“虚拟专栏”。

“虚拟列”是单格宽列。

在您的第一个代码段中,这些是您匹配的列:

\%1v  \%2v  \%3v

A     u     d
B     M     W
M     e     r
O     p     e

因此,您的行不按星号数排序,而是按字母顺序排列。

我已尝试使用以下命令按星号数量排序,但它们似乎不可靠。

:%sort /.*\%12c.*\%16c/
:%sort /.*\%20c.*\%24c/
:%sort /.*\%30c.*\%34c/