Hi,


The hack of the day involves enabling Lua support for OnMacro, and
defining a simple Lua implementation of keystroke macros. Most of the
infrastructure is already there, we just need to get Lua to listen.

I had this in scite-tools for a while, with the full interface of saving, loading on init, choosing to play them from a dialog box, etc., but since it required Ruby/GTK for the dialog, I axed it a week or so ago after 1.74 came out and I switched scite-tools back to being extension scripts, not forks of the SciTE binaries. Good to see someone else is thinking to expand SciTE's capabilities though, heh.

Take care,
-Mitchell;


The source modification:
LuaExtension.h:
add this to the LuaExtension class, just before the }; line:
    virtual bool OnMacro(const char *, const char *);

LuaExtension.cpp:
 add this to the end of the file:
bool LuaExtension::OnMacro(const char *cmd, const char *arg)
{
    char buff[256];
    snprintf(buff,sizeof(buff),"%s|%s",cmd,arg);
    return CallNamedFunction("OnMacro",buff);
}

macro.lua can then be defined as:

-- macro.lua
-- simple SciTE macros
-- note the standard (tho undocumented) macro key bindings
-- Start Recording Ctrl+F9
-- End Recording Shift+Ctrl+F9
-- Play Macro F9

local append = table.insert
local state,mac
-- you need to add $(status.msg) to the end of your statusbar.text.1 definition
-- to see these messages on the status bar
local function set_state(s)
    state = s
    props['status.msg'] = state
    scite.UpdateStatusBar()
end

function OnMacro(line)
    local idx = line:find('|')
    local cmd = line:sub(1,idx-1)
    local arg = line:sub(idx+1)
    if cmd == 'macro:record' then
        if state ~= 'recording' then
            set_state 'recording'
            mac = {}
        end
        local _,_,msg,wparam,isstr,str = arg:find('(%d+);(%d+);(%d+);(.*)')
        if isstr == '0' then str = '' end
        append(mac,{MSG=msg,WPARAM=wparam,STR=str})
    elseif cmd == 'macro:stoprecord' then
        set_state ''
    elseif cmd == 'macro:run' then
        for i,m in ipairs(mac) do
            if m.STR ~= '' then
                scite.SendEditor(m.MSG,m.STR)
            else
                scite.SendEditor(m.MSG,m.wparam)
            end
        end
    end
end

To use, hit ctrl+F9 to start recording, and start entering keystrokes
- you will only see 'recording' on the first key hit. When finished,
stop recording with Shift+Ctrl+F9 and then F9 will play back the
macro.

These shortcuts are not enabled by default for GTK, so you will need
to add this to your properties file:

user.shortcuts=\
Shift+F9|IDM_MACROLIST| \
F9|IDM_MACROPLAY|\
Ctrl+F9|IDM_MACRORECORD| \
Shift+Ctrl+F9|IDM_MACROSTOPRECORD|

Yes, I know: you can't save the macro to file. This is meant for doing
some ad-hoc automation; can save a lot of typing!

steve d.

_______________________________________________
Scite-interest mailing list
Scite-interest@lyra.org
http://mailman.lyra.org/mailman/listinfo/scite-interest

Reply via email to