我正在尝试学习如何使用自己的函数配置我的.vimrc文件。
我想编写一个遍历文件中每一行的函数并计算字符总数,但忽略所有空格。这是一个编程练习,也是更复杂程序的跳板(我知道还有其他方法可以使用Vim或外部程序获得这个示例值。)
这是我到目前为止所拥有的:
function countchars()
let line = 0
let count = 0
while line < line("$")
" update count here, don't count whitespace
let line = getline(".")
return count
endfun
我可以用?
替换该注释行的功能代码答案 0 :(得分:8)
如果我正确理解了这个问题,那么您需要计算一行中非空白字符的数量。一个相当简单的方法是删除空格并查看结果行的长度。因此,像这样:
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
l
初始化为1 <=
<
需要while
endwhile
let line = getline('.')
定义上添加了!
,因为它使增量开发变得更加容易(每次重新获取文件时,它都将使用新版本覆盖函数,而不是吐出错误关于它的消息已经存在)。在您的函数中,您有function
。忽略变量名称,此实现仍存在一些问题。我认为意味着的是let line = getline('.')
,它给出了当前行的行号。 let l = line('.')
给出当前行的内容,因此while行的比较将比较当前行的内容与最后一行的数量,这将失败。另一个问题是你实际上并没有在文件中移动,因此当你调用函数时,当前行将是你所在的行,并且永远不会改变,从而导致无限循环。我用一个简单的getline('.')
替换了它来逐步浏览文件。
有一些方法可以使当前行成为一种有用的方法,例如,如果你正在编写一个带有一系列行的函数,但我认为我已经写了足够的内容,以上希望能帮到你。 stackoverflow上有很多人可以帮助解决任何问题!
看看:
+= 1
以及:help usr_41.txt
:help function-list
:help user-functions
:help substitute()
后跟我在函数中使用的各种内容(:help
,getline()
,line()
等。
希望这很有用。
答案 1 :(得分:3)
此方法使用列表:
function! Countchars()
let n = 0
for line in getline(1,line('$'))
let n += len(split(line,'\zs\s*'))
endfor
return n
endfunction
答案 2 :(得分:3)
我想你已经找到了解决方案。
仅供参考:
我使用它来计算Vim中没有空格的字符:
%s/\S/&/gn