[英]Simple Vim Programming (vimrc file)
我正在尝试学习如何使用自己的函数配置我的.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
我可以用哪个功能代码替换该注释行?
如果我正确理解了这个问题,那么你需要计算一行中非空白字符的数量。 一个相当简单的方法是删除空格并查看结果行的长度。 因此,这样的事情:
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('.')
,它给出了当前行的行号。 getline('.')
给出当前行的内容,因此while行的比较将比较当前行的内容与最后一行的数量,这将失败。 另一个问题是你实际上并没有在文件中移动,因此当你调用函数时,当前行将是你所在的行,并且永远不会改变,从而导致无限循环。 我已用一个简单的+= 1
代替它来逐步执行该文件。
有一些方法可以使当前行成为一种有用的方法,例如,如果你正在编写一个带有一系列行的函数,但我认为我已经写了足够的内容了,上面的内容将有希望得到你现在去 stackoverflow上有很多人可以帮助解决任何问题!
看一下:
:help usr_41.txt
:help function-list
:help user-functions
:help substitute()
以及:help
后跟我在函数中使用的各种东西( getline()
, line()
, let+=
etc)。
希望这很有帮助。
此方法使用列表:
function! Countchars()
let n = 0
for line in getline(1,line('$'))
let n += len(split(line,'\zs\s*'))
endfor
return n
endfunction
我想你已经找到了解决方案。
仅供参考:我使用它来计算Vim中没有空格的字符: %s/\\S/&/gn
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.