gpt4 book ai didi

count - 简单的 Vim 编程(vimrc 文件)

转载 作者:行者123 更新时间:2023-12-02 07:46:01 24 4
gpt4 key购买 nike

我正在尝试学习如何使用我自己的函数配置我的 .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)
  • 我已重命名countchar_count因为你不能有一个与函数同名的变量和 count()是一个内置函数
  • 同样适用于 line :我将其重命名为 l
  • 文件中的第一行是第 1 行,而不是第 0 行,因此我初始化了 l至 1
  • while 循环计数到最后一行,但不包括最后一行,我假设您想要文件中的所有行(这可能与从 1 开始的行编号有关):我将您的代码更改为使用 <=而不是<
  • vim 中的 block 不是基于缩进,因此 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+= 等)。

希望这对您有帮助。

关于count - 简单的 Vim 编程(vimrc 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5291196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com