1

次のようなテキストファイルにいくつかのパラメーターがあります

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

私の要件は、パラメーターの値の合計が 100 になる必要があり、パラメーターの数が存在する可能性があることです。合計を計算してどこかに表示できる関数を Vim で記述できるかどうか疑問に思っていましたか? そのような関数に引数を渡す方法がわかりません。パラメーター値を持つ行をブロックで選択することで何とかできると思っていました。

4

2 に答える 2

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:firstlineなり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()

どちらも機能するはずです。

于 2013-07-01T08:54:05.120 に答える
0

これは、(疑似) ワンライナーでも実行できます。

: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\\+")'), '+'))
于 2013-07-02T09:44:43.567 に答える