Scite Lua Prompt |
|
This is a little script which uses the SciteExtMan script manager and is one of the examples in the download.
It uses the extman scite_OnOutputLine
event to grab lines entered in SciTE's output pane, and compile them using loadstring
. It gives you a very useful way to interactively evaluate Lua expressions. One-line functions can be defined.
Scite/Lua > = 10 + 20 30 > print 'hello dolly' hello dolly > function showkeys(t) for i in t do print(i) end end > showkeys(table) setn insert getn foreachi foreach sort remove concat >
Event if you don't see yourself as doing Lua programming, this Lua prompt is useful as an intelligent calculator.
Any global function is available. A function load
is supplied, which will load Lua code from a file. If called with no argument, it will use the current buffer. The function edit
will open the specified file in a new buffer. There is pop-down history list available using Tools|Last Command
, which is Ctrl-Alt-P
.
It is particularly useful for learning the SciTE and Scintilla API, since both the editor
and output
pane objects are directly accessible. You can test a particular operation before writing a full-blown script.
> = output.Length 405 > output:AppendText('hello, world!\n') hello, world! >
The SciTE Lua environment has a nasty suprise for people expecting global objects to survive for the whole session. If you switch buffers in SciTE, the global environment is cleared out. Only global objects created initially in files loaded by your Lua startup script will be preserved.
-- prompt.lua scite_Command('Last Command|do_command_list|Ctrl+Alt+P') local prompt = '> ' local history_len = 4 local prompt_len = string.len(prompt) print 'Scite/Lua' trace(prompt) function load(file) if not file then file = props['FilePath'] end dofile(file) end function edit(file) scite.Open(file) end local sub = string.sub local commands = {} local function strip_prompt(line) if sub(line,1,prompt_len) == prompt then line = sub(line,prompt_len+1) end return line end scite_OnOutputLine (function (line) line = strip_prompt(line) table.insert(commands,1,line) if table.getn(commands) > history_len then table.remove(commands,history_len+1) end if sub(line,1,1) == '=' then line = 'print('..sub(line,2)..')' end local f,err = loadstring(line,'local') if not f then print(err) else local ok,res = pcall(f) if ok then if res then print('result= '..res) end else print(res) end end trace(prompt) return true end) function insert_command(cmd) output:AppendText(cmd) output:GotoPos(output.Length) end function do_command_list() if table.getn(commands) > 1 then scite_UserListShow(commands,1,insert_command) end end