简单的Vim编程(vimrc文件)

dva*_*ria 4 vim character count

我正在尝试学习如何使用自己的函数配置我的.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
Run Code Online (Sandbox Code Playgroud)

我可以用哪个功能代码替换该注释行?

DrA*_*rAl 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
Run Code Online (Sandbox Code Playgroud)

问题答案的关键部分是使用替代品.命令是:

substitute(expr,pattern,repl,flags)
Run Code Online (Sandbox Code Playgroud)

expr在这种情况下getline(l),l迭代的行数在哪里. getline()返回行的内容,因此这是正在解析的内容.模式是\s匹配任何单个空白字符的正则表达式.它被替换为'',即一个空字符串.该标志g使其重复替换次数,因为该行上有空格.

替换完成后,len()给出非空白字符的数量,并将其添加到char_countwith 的当前值+=.


我从您的示例中更改了一些内容:

  • 函数名称以大写字母开头(这是用户定义函数的要求:请参阅: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()
Run Code Online (Sandbox Code Playgroud)

沿着:help接着我在函数(所使用的各种事情getline(),line(),let+=等等).

希望这很有帮助.