计算VIM中突出显示的字符串长度


24

我想知道是否有一种方法可以计算vim(包括空格中)突出显示的符号?

更新

VIM可视模式

如果我的选择在多行上,它将显示行数。我需要符号计数。

Answers:


28

除非我缺少任何东西,否则Vim已经做到了。如果我使用鼠标或通过键入v并移动光标来突出显示某些文本,则会在屏幕底部看到

-视觉-12

其中右边的数字是突出显示的字符数。仅当选择位于单行上时,此方法才有效,否则将显示行数。

您还可以直观地选择一些文本区域和类型g Ctrl-G,以显示所选的行数,单词数和字节数。


4
(目瞪口呆)如何赫克为什么我用Vim了这么久,从来没有注意到?但是为了辩护,我正在考虑以编程方式获取该数字。
2011年

好的答案,但看看更新的问题。和@njd一样,我也没有注意到。
尼莫登

1
@Nemoden:尝试garyjohn建议的第二部分(g Ctrl-G)。它应该显示一行,例如“ Selected#of#Lines;#of#Words;#of#Bytes”。
peth 2011年

哦。我的错。我不知道为什么我跳过了第二个解决方案。有用。谢谢!
Nemoden 2011年

12
在某些系统上,默认情况下未启用此功能。只需添加set showcmd到您vimrc的启用它。
泰勒·霍利恩

8

Vim根据显示的内容和方式在显示的字符数和行数之间切换,具体取决于可视化内容和方式(Vim 7.4已于2015年9月发布)

V will display line count
v$ will display character count

如果可视化多行,则仅显示行数

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line

如问题所述,v如果选择跨越多行,那么即使是普通的也从字符计数转换为行计数。但是g CTRL-G做得很好。
joeytwiddle

2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. 首先,您要拉动当前选择(进入缓冲区x)

  2. 然后你显示缓冲区的长度:strlen(@x)
    (本- VISUAL -在状态栏显示掩盖这一点,所以我们必须添加一个换行符)

  3. 突出显示以前的视觉范围: gv

这没有考虑视觉模式是行模式,字符模式还是块模式,但是对于大多数情况而言已经足够了。


2

我从屏幕截图中看到您正在Windows中运行,因此此答案可能对您没有太大帮助。但是对于其他人...

Vim的未充分利用(IMO)功能是让外部命令来执行繁重的工作。

对于这种情况,如果您使用的是类似UNIX的系统,则可以使用该wc命令执行此操作。

最简单的方法是通过键入(带有选定的文本),用命令的输出替换选定的文本:

:!wc

(然后按Enter)。

这将在您的命令行中显示为:

'<,'>!wc

阅读完相关信息后,您可以撤消u以返回到开始的位置。

注意:此处理仅在整行上完成。如果您想要分行,我认为@ garyjohn's g_CTRL-G是最好的选择。

您可以通过运行以下命令来避免撤消操作:

:w !wc

这会将选定的行“写入”到命令的标准输入中,命令的输出将显示在新的临时缓冲区中,而原始缓冲区保持不变。请参阅:help :write_c以获取更多信息。

注意:我:write_c从以下地方获得了信息:https : //stackoverflow.com/questions/1237780/vim-execute-shell-command-without-filtering

现在,更一般地:

这个示例wc非常简单,但是您可以想象这是一个强大的方法。UNIX已经有许多可用的文本处理命令,您可以很容易地在Vim中使用它们,而无需触摸Vimscript(yech)。

此外,您编写的任何处理stdin / stdout的命令行程序现在都不仅可以使您的终端受益,而且可以使Vim内部受益。

例如,我发现自己正在运行,tidy并且json-format从vim内部运行,使我正在查看的文件更具可读性。

您可以在Windows上执行相同的操作,但是Windows没有内置的如此丰富的命令集。不过,您始终可以安装GNUWin32或类似版本以获得这些好处。


1

对于vimscript中的一种编程方式,当选择限于一行内时,这对我有用:

let amount = virtcol("'>") - virtcol("'<")

(使用virtcol(..)代替col(..),以使其在:set ve=all活动时按预期方式工作。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.