On Thu, Sep 28, 2006 at 02:30:37PM -0300, Luis A. Florit wrote: > Pals: I want to evaluate a block selection with formulas to its value. > So, if you have 2 lines like: > > home roof 89.4 + 76 home roof > home roof 17 + 13.3 home roof > > I would like to replace "89.4 + 76" by 165.4 and "17 + 13.3" by 30.3 > by selecting the block with the formulas and applying some command > sequence (for example, using perl, bc, python, etc). > Of course, I want this for arbitrary aritmetic formulas. > > Thanks! > > Luis.
On Linux, I can use the bc command like this: :s/\d[0-9 .+*/-]*/\=substitute(system('echo ' . submatch(0) . ' | bc'), '\n', '', 'g') That is, :s/<pat>/\=<expr> where my pattern <pat> is '\d[0-9 .+*/-]*', a first attempt at capturing the sort of "arithmetic string" you have in mind. Inside <expr>, submatch(0) is replaced by the matched text, such as "89.4 + 76". Then system('echo 89.4 + 76 | bc') will pass the string to bc as stdin and return the result. I wrapped this in substitute() to strip off the trailing newline character. It will be easier to read and maintain if you do something like this (untested): fun! EvalMath(str) let res = system('echo ' . a:str . ' | bc') return substitute(res, '\n', '', 'g') endfun :s/\d[0-9 .+*/-]*/\=EvalMath(submatch(0)) HTH --Benji Fisher