繁体   English   中英

简单的Vim编程(vimrc文件)

[英]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)

在这种情况下, exprgetline(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+= 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM