简单的Vim编程(vimrc文件)

时间:2011-03-13 17:45:44

标签: count vim character

我正在尝试学习如何使用自己的函数配置我的.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

我可以用?

替换该注释行的功能代码

3 个答案:

答案 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)
在这种情况下,

exprgetline(l),其中l是要迭代的行号。 getline()返回该行的内容,因此这就是要解析的内容。模式是正则表达式\s,它匹配任何单个空白字符。它被替换为'',即空字符串。标志g使得重复替换的次数与在线上找到的空格一样多次。

替换完成后,len()会提供非空白字符数,并使用char_count将其添加到+=的当前值。


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

  • 函数名称以大写字母开头(这是用户定义函数的要求:请参阅:help user-functions
  • 我已将count重命名为char_count,因为您不能拥有与函数同名的变量,count()是内置函数
  • 同样适用于line:我将其重命名为l
  • 文件中的第一行是第1行,而不是第0行,因此我将l初始化为1
  • while循环计数到但不包括最后一行,我假设您想要文件中的所有行(这可能与从1开始的行编号有关):我将您的代码更改为使用{{1}而不是<=
  • 块不是基于vim中的缩进,因此<需要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() 后跟我在函数中使用的各种内容(:helpgetline()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