我在一个文本文件中有一些参数,如下所示
parameter1 =5
parameter2=4
----------
---------
parameter(n-1) = 6
parameter(n)=11
我的要求是参数的值总和应为 100,并且可以有多个参数。我想知道是否可以在 Vim 中编写一个可以计算总和并将其显示在某处的函数?我不知道如何将争论传递给这样的函数,我认为可以通过阻止选择具有参数值的行来以某种方式完成。
我在一个文本文件中有一些参数,如下所示
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
and的输入参数a: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()
两者都应该工作。
这也可以使用(伪)单线来完成:
:let s=0
:g/parameter\d\+\s*=\s*\d\+/let s+=matchstr(getline('.'), '\d\+\s*$')
:echo s
如果您想要一个功能,您可以退回到Birei 的解决方案
编辑:顺便说一句,我们也可以直接回应它:
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\\+")'), '+'))