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

时间:2013-07-01 08:17:40

标签: vim

我在文本文件中有一些参数如下

parameter1  =5
parameter2=4
----------
---------
parameter(n-1) = 6
parameter(n)=11

我的要求是参数的值应该总和为100,并且可以有多个参数。我想知道我是否可以在Vim中编写一个函数,它可以计算总和并将其显示在某处?   我不知道如何将争论传递给这样一个函数,我认为它可以通过块选择带参数值的行来完成。

2 个答案:

答案 0 :(得分:2)

将以下功能添加到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:firstlinea:lastline的输入参数。我用0递增它们以将它们转换为整数,否则range函数会抱怨。最后一行回应调试的结果,但更好的办法是在返回调用中处理结果(仅取消注释)。

function! CustomSum() range
        let sum = 0
        for l in range( a:firstline + 0, a:lastline + 0 )
                let fields = split( getline(l), '\s*=\s*' )
                if ( len( fields ) != 2 || fields[1] =~? '\D' )
                        continue
                endif
                let sum = sum + fields[1]
        endfor
        echo sum
        "" return sum
endfunction

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

:'<,'>call CustomSum()

:1,5call CustomSum()

两者都应该有用。

答案 1 :(得分:0)

这也可以使用(伪)单线程来完成:

:let s=0
:g/parameter\d\+\s*=\s*\d\+/let s+=matchstr(getline('.'), '\d\+\s*$')
:echo s

你需要一个功能,你可以回到Birei's solution

编辑:顺便说一下,我们也可以直接回复:

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\\+")'), '+'))