Vim:状态线'%V'如何工作?

gre*_*uan 8 vim statusline

这是一个我无法找到答案的Vim问题.什么是%V状态行变量呢?

我检查了我可以找到的文档,但它不是很清楚,我知道它显示了虚拟列,但是这些数字/字母在-均值之前是什么?

例如,以下各项是什么意思?

0-1
17-18
Run Code Online (Sandbox Code Playgroud)

从我可以管理的内容中,找到这些例子.前面的数字-是最后一个实心列,换句话说就是真实列.它是否正确?

谢谢你的帮助!

Hug*_*ler 17

在Vim中statusline,在您可以设置的许多标志中,存在:

  • %c - 列号,即字节数.
  • %v%V- 虚拟列号,即屏幕上的列号.

那么实际和虚拟列号之间有什么区别?答案是,使用制表符时,虚拟列号是当前列号的近似值,就像使用空格而不是制表符一样.

例.Vim状态行中有用的组合是:

%c%V
Run Code Online (Sandbox Code Playgroud)

正如帮助中所述,显示虚拟列号的%V标志只有在与实际列号不同时才会打印(带有前面的短划线).因此,通常您的状态行仅显示实际列号(例如8),但如果您在带有制表符或多字节字符的行上,您将看到两个数字(例如1-8).

例如,试试这个:

echo -e "\tHello world." > /tmp/test
Run Code Online (Sandbox Code Playgroud)

然后,/tmp/test在Vim中打开并注意您的状态行,指示实列和虚拟列之间的差异.如果将tabstop设置更改为其他值,则虚拟列将更改.

最后,如果你:set expandtab这样做:retab,那么虚拟列指示器将被隐藏.

  • @Eduan列和虚拟列之间的差异不仅仅由选项卡覆盖.还有其他例子:```UTF-8表示的字符占3列(3字节:E2 80 9C),但只有1个虚拟列.`A`(FULLWIDTH LATIN CAPITAL A)占据3列(UTF-8)和2列虚拟列(全宽!).如您所见"虚拟列号是您当前列号的近似值,就好像使用空格而不是制表符"是完全错误的语句,虚拟列号是一些显示单元格,其中某些字符结束(官方:"屏幕列文件位置"). (2认同)