Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vim中使用函数计算总和的可能性_Vim - Fatal编程技术网

在vim中使用函数计算总和的可能性

在vim中使用函数计算总和的可能性,vim,Vim,我在一个文本文件中有一些参数,如下所示 parameter1 =5 parameter2=4 ---------- --------- parameter(n-1) = 6 parameter(n)=11 我的要求是参数值的总和应达到100,并且可以有多个参数。我想知道我是否可以在Vim中编写一个函数,它可以计算和并在某处显示它? 我不知道如何将参数传递给这样一个函数,我想它可以通过块选择带有参数值的行来实现。将以下函数添加到vimrc文件中: function! CustomSum()

我在一个文本文件中有一些参数,如下所示

parameter1  =5
parameter2=4
----------
---------
parameter(n-1) = 6
parameter(n)=11
我的要求是参数值的总和应达到100,并且可以有多个参数。我想知道我是否可以在Vim中编写一个函数,它可以计算和并在某处显示它?
我不知道如何将参数传递给这样一个函数,我想它可以通过块选择带有参数值的行来实现。

将以下函数添加到
vimrc
文件中:

function! CustomSum()
        let sum = 0
        for l in range( 1, line('$') )
                let fields = split( getline(l), '\s*=\s*' )
                if ( len( fields ) != 2 || fields[1] =~? '\D' )
                        continue
                endif
                let sum = sum + fields[1]
        endfor
        return sum
endfunction
然后运行它:

:echo CustomSum()
使用您的输入数据生成:

26

编辑向上一个函数添加范围。现在接受一个范围作为名为
a:firstline
a:lastline
的输入参数。我用
0
递增它们以将它们转换为整数,否则
range
函数会抱怨。最后一行回显调试结果,但最好在返回调用中处理结果(仅取消注释)

现在,您可以进行视觉选择或正常范围,如:

:'<,'>call CustomSum()

两者都应该起作用。

这也可以通过(伪)一个衬里来实现:

:let s=0
:g/parameter\d\+\s*=\s*\d\+/let s+=matchstr(getline('.'), '\d\+\s*$')
:echo s
你想要一个你可以使用的函数

编辑:顺便说一句,我们也可以直接使用以下内容进行回应:

echo eval(join(map(filter(getline(1,'$'), 'v:val =~ "=\\s*\\d"'), 'matchstr(v:val, "=\\s*\\zs\\d\\+")'), '+'))
或者,如果您喜欢命令:

command! -nargs=0 -range=% Sum echo eval(join(map(filter(getline(<line1>,<line2>), 'v:val =~ "=\\s*\\d"'), 'matchstr(v:val, "=\\s*\\zs\\d\\+")'), '+'))
命令-nargs=0-范围=%Sum echo eval(连接(映射(过滤器(getline)(,),'v:val=~“=\\s*\\d“),'matchstr(v:val,=\\s*\\zs\\d\\\\”),'+'))

谢谢您的回答。我想知道如何将参数传递给函数。例如,参数列表可能会更改,列表可能会出现在其他文本之间。有没有办法通过选择合适的文本将争论传递给函数?@Gautam:我编辑了答案,以计算作为参数传递的一系列行的总和。
echo eval(join(map(filter(getline(1,'$'), 'v:val =~ "=\\s*\\d"'), 'matchstr(v:val, "=\\s*\\zs\\d\\+")'), '+'))
command! -nargs=0 -range=% Sum echo eval(join(map(filter(getline(<line1>,<line2>), 'v:val =~ "=\\s*\\d"'), 'matchstr(v:val, "=\\s*\\zs\\d\\+")'), '+'))