Scite 内置计算器

lua-users home
wiki

一个基于用户公式的简单计算器。它需要 luawin.dll。公式是一个字符串,包含 "<>" 作为数字的占位符。

执行现有公式的脚本

如果有选择(行或矩形选择),操作将在选择中进行;否则,将更新右侧的下一个数字。它只支持非常简单的数字格式。

function executeFormula()
    editor:BeginUndoAction()
    if not formula or formula =="" then 
        print('Please set formula first by ALT+SHIFT+F.')
        return
    end

    local expr = editor:GetSelText()
    local ss = editor.CurrentPos
    local se = editor.Anchor  
    if not expr or expr == "" then
        ss, se = editor:findtext("\-*[0-9]+[.0-9]*", SCFIND_REGEXP, ss)
    end
    
    if ss > se then ss,se = se, ss end
    local cs, ce
    if editor.SelectionIsRectangle then
        cs = editor.Column[ss]
        ce = editor.Column[se] 
        -- print (cs..' '..ce)
    end
    -- print (ss..' '..se)
      
    for m in editor:match("\-*[0-9]+[.0-9]*", SCFIND_REGEXP, ss) do
        local c = m.pos
        if c > se then break end
          
        local width = m.len
        local col = editor.Column[c]
        local chFlag
        -- print(col .. ' ' ..width ..'|'..cs..' '..ce)
        if not editor.SelectionIsRectangle or 
            (col >= cs and (col + width -1) <= ce) then 
            chFlag = true
        else
            chFlag = false      
        end
          
         if chFlag then
            expr = m.text
            local pt = string.find(expr, '.', 1, true)
            local acc, fmt
            if pt then
                acc = width - pt
                if acc < 0 then acc = 0 end
                fmt = "%"..width.."."..acc.."f"
            else
                fmt = "%"..width.."i"
            end
            -- print (expr .. "|" .. fmt.."|"..pt)
            expr = string.gsub(formula, '<>', expr)
            local f, msg = loadstring("return "..expr)
            if f then
                m:replace(string.format(fmt, f()))
            else
                print(">Execute Formula: cannot evaluate the formula")
            end
        end
    end
    editor:EndUndoAction()
end
--JRN

提示输入公式并执行操作的脚本

它需要 luawin.dll 来询问公式。

local formula
local Init =loadlib('C:\\Program Files\\Scintilla Text Editor\\luawin.dll', 'Init')
Init()

function setFormula()
    local flag, msg = win.InputBox('Formula: <> as the place holder. e.g. <>*10')
    if flag and string.find(msg,'<>',1,true) then
        formula = msg
    end
    
    if formula then msg = formula else msg = "NONE" end
    print("FORMULA: "..msg)
    
    executeFormula()
end
--JRN
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2006 年 8 月 31 日下午 7:32 GMT (差异)