如果我正确理解了这个问题,您希望计算一行中非空白字符的数量。一个相当简单的方法是删除空格并查看结果行的长度。因此,像这样:
function! Countchars()
let l = 1
let char_count = 0
while l <= line("$")
let char_count += len(substitute(getline(l), '\s', '', 'g'))
let l += 1
endwhile
return char_count
endfunction
问题答案的关键部分是使用替代品。命令是:
substitute(expr,pattern,repl,flags)
expr 在这种情况下是getline(l),其中l 是被迭代的行号。 getline() 返回该行的内容,所以这就是正在解析的内容。该模式是匹配任何单个空白字符的正则表达式\s。它被替换为'',即一个空字符串。标志g 使它重复替换的次数与在行上找到空格一样多。
替换完成后,len() 会给出非空白字符的数量,并将其添加到 char_count 的当前值和 +=。
我对您的示例进行了一些更改:
- 函数名以大写字母开头(这是用户定义函数的要求:参见
:help user-functions)
- 我已将
count 重命名为 char_count,因为您不能拥有与函数同名的变量,而 count() 是一个内置函数
-
line 也是如此:我将其重命名为 l
- 文件的第一行是第 1 行,而不是第 0 行,所以我将
l 初始化为 1
- while 循环计数到但不包括最后一行,我假设您想要文件中的所有行(这可能与从 1 开始的行编号有关):我将您的代码更改为使用
<= <
- 块不是基于vim中的缩进,所以
while需要endwhile
- 在你的函数中,你有
let line = getline('.')
- 我在
function 定义上添加了!,因为它使增量开发变得更加容易(每次重新获取文件时,它都会用新版本覆盖该函数,而不是已经吐出有关它的错误消息现有)。
- 文件递增的工作方式略有不同...
在你的函数中,你有let line = getline('.')。忽略变量名,这个实现还是有一些问题。我想你的意思是let l = line('.'),它给出了当前行的行号。 getline('.') 给出了当前行的内容,因此 while 行的比较会将当前行的内容与最后一行的编号进行比较,这将失败。另一个问题是您实际上并没有在文件中移动,因此当前行将是您调用函数时所在的任何一行并且永远不会更改,从而导致无限循环。我已将其替换为简单的 += 1 以单步执行文件。
有一些方法可以使当前行成为一种有用的方法,例如,如果您正在编写一个需要一系列行的函数,但我认为我现在已经写得足够多了,上面的内容将希望让你现在开始。无论如何,stackoverflow 上有很多人可以帮助解决任何问题!
看看:
:help usr_41.txt
:help function-list
:help user-functions
:help substitute()
以及:help,后面是我在函数中使用的各种东西(getline()、line()、let+= 等)。
希望对您有所帮助。