diff options
-rw-r--r-- | modules/lua/api | 164 | ||||
-rw-r--r-- | modules/lua/commands.lua | 91 | ||||
-rw-r--r-- | modules/lua/init.lua | 31 | ||||
-rw-r--r-- | modules/lua/snippets.lua | 47 |
4 files changed, 333 insertions, 0 deletions
diff --git a/modules/lua/api b/modules/lua/api new file mode 100644 index 00000000..f26e0b16 --- /dev/null +++ b/modules/lua/api @@ -0,0 +1,164 @@ +_G () holds global environment, setfenv changes environments +_VERSION () current interpreter version "Lua 5.0" +assert (v [, message]) error if v nil or false, otherwise returns v +collectgarbage ([limit]) [Lua 5.0] set threshold to limit KBytes, default 0, may run GC +collectgarbage (opt [, arg]) [Lua 5.1] opts: stop, restart, collect, count, step, setpause, setstepmul +coroutine.create (f) creates coroutine from function f, returns coroutine +coroutine.resume (co, val1, ...) continues execution of co, returns bool status plus any values +coroutine.status (co) returns co status: "running", "suspended" or "dead" +coroutine.wrap (f) creates coroutine with body f, returns function that resumes co +coroutine.yield (val1, ...) suspend execution of calling coroutine +debug.debug () enters interactive debug mode, line with only "cont" terminates +debug.gethook () returns current hook function, hook mask, hook count +debug.getinfo (function [, what]) returns table with information about a function +debug.getlocal (level, local) returns name and value of local variable with index local at stack level +debug.getupvalue (func, up) returns name and value of upvalue with index up of function func +debug.sethook (hook, mask [, count]) sets given function as a hook, mask="[crl]" +debug.setlocal (level, local, value) sets local variable with index local at stack level with value +debug.setupvalue (func, up, value) sets upvalue with index up of function func with value +debug.traceback ([message]) returns a string with a traceback of the call stack +dofile (filename) executes as Lua chunk, default stdin, returns value +error (message [, level]) terminates protected func, never returns, level 1 (default), 2=parent +file:close () closes file +file:flush () saves any written data to file +file:lines () returns iterator function to return lines, nil ends +file:read (format1, ...) reads file according to given formats, returns read values or nil +file:seek ([whence] [, offset]) sets file pos, whence="set"|"cur"|"end", defaults "curr",0, returns file pos +file:write (value1, ...) writes strings or numbers to file +gcinfo () [Lua 5.0] returns dynamic mem in use (KB), and current GC threshold (KB) +getfenv (f) gets env, f can be a function or number (stack level, default=1), 0=global env +getmetatable (object) returns metatable of given object, otherwise nil +io.close ([file]) closes file, or the default output file +io.flush () flushes the default output file +io.input ([file]) opens file in text mode, sets as default input file, or returns current default input file +io.lines ([filename]) open file in read mode, returns iterator function to return lines, nil ends +io.open (filename [, mode]) opens file in specified mode "[rawb+]", returns handle or nil +io.output ([file]) opens file in text mode, sets as default output file, or returns current default output file +io.read (format1, ...) reads file according to given formats, returns read values or nil +io.stderr +io.stdin +io.stdout +io.tmpfile () returns a handle for a temporary file, opened in update mode +io.type (obj) returns "file" if obj is an open file handle, "close file" if closed, or nil if not a file handle +io.write (value1, ...) writes strings or numbers to file +ipairs (t) returns an iterator function, table t and 0 +loadfile (filename) loads chunk without execution, returns chunk as function, else nil plus error +loadlib (libname, funcname) [Lua 5.0] links to dynamic library libname, returns funcname as a C function +loadstring (string [, chunkname]) loads string as chunk, returns chunk as function, else nil plus error +math.abs (v) returns absolute value of v +math.acos (v) returns arc cosine value of v in radians +math.asin (v) returns arc sine value of v in radians +math.atan (v) returns arc tangent value of v in radians +math.atan2 (v1, v2) returns arc tangent value of v1/v2 in radians +math.ceil (v) returns smallest integer >= v +math.cos (rad) returns cosine value of angle rad +math.deg (rad) returns angle in degrees of radians rad +math.exp (v) returns e^v +math.floor (v) returns largest integer <= v +math.frexp (v) returns mantissa [0.5,1) and exponent values of v +math.ldexp (v1, v2) returns v1*2^v2 +math.log (v) returns natural logarithm of v +math.log10 (v) returns logarithm 10 of v +math.max (v1, ...) returns maximum in a list of one or more values +math.min (v1, ...) returns minimum in a list of one or more values +math.mod (v1, v2) [Lua 5.0] returns remainder of v1/v2 which is v1 - iV2 for some integer i +math.fmod (v1, v2) [Lua 5.1] returns remainder of v1/v2 which is v1 - iV2 for some integer i +math.pow (v1, v2) returns v1 raised to the power of v2 +math.rad (deg) returns angle in radians of degrees deg +math.random ([n [, u]]) returns random real [0,1), integer [1,n] or real [1,u] (with n=1) +math.randomseed (seed) sets seed for pseudo-random number generator +math.sin (rad) returns sine value of angle rad +math.sqrt (v) returns square root of v +math.tan (rad) returns tangent value of angle rad +next (table [, index]) returns next index,value pair, if index=nil (default), returns first index +package.cpath +package.loaded +package.loadlib(libname, funcname) [Lua 5.1] +package.path +package.preload +package.seeall(module) [Lua 5.1] +os.clock () returns CPU time used by program in seconds +os.date ([format [, time]]) returns a string or table containing date and time, "*t" returns a table +os.difftime (t2, t1) returns number of seconds from time t1 to time t2 +os.execute (command) executes command using C function system, returns status code +os.exit ([code]) terminates host program with optional code, default is success code +os.getenv (varname) returns value of environment variable varname. nil if not defined +os.remove (filename) deletes file with given name, nil if fails +os.rename (oldname, newname) renames file oldname to newname, nil if fails +os.setlocale (locale [, category]) set current locale of program, returns name of new locate or nil +os.time ([table]) returns current time (usually seconds) or time as represented by table +os.tmpname () returns a string with a filename for a temporary file (dangerous! tmpfile is better) +pairs (t) returns the next function and table t plus a nil, iterates over all key-value pairs +pcall (f, arg1, arg2, ...) protected mode call, catches errors, returns status code first (true=success) +print (e1, e2, ...) prints values to stdout using tostring +rawequal (v1, v2) non-metamethod v1==v2, returns boolean +rawget (table, index) non-metamethod get value of table[index], index != nil +rawset (table, index, value) non-metamethod set value of table[index], index != nil +require (packagename) loads package, updates _LOADED, returns boolean +setfenv (f, table) sets env, f can be a function or number (stack level, default=1), 0=global env +setmetatable (table, metatable) sets metatable, nil to remove metatable +string.byte (s [, i]) returns numerical code, nil if index out of range, default i=1 +string.char (i1, i2, ...) returns a string built from 0 or more integers +string.dump (function) returns binary representation of function, used with loadstring +string.find (s, pattern [, init [, plain]]) matches pattern in s, returns start,end indices, else nil +string.format (formatstring, e1, e2, ...) returns formatted string, printf-style +string.gfind (s, pat) [Lua 5.0] returns iterator function that returns next captures from pattern pat on s +string.gmatch (s, pat) [Lua 5.1] returns iterator function that returns next captures from pattern pat on s +string.gsub (s, pat, repl [, n]) returns copy of s with pat replaced by repl, and substitutions made +string.len (s) returns string length +string.lower (s) returns string with letters in lower case +string.rep (s, n) returns string with n copies of string s +string.sub (s, i [, j]) returns substring from index i to j of s, default j=-1 (string length) +string.upper (s) returns string with letters in upper case +table.concat (table [, sep [, i [, j]]]) returns concatenated table elements i to j separated by sep +table.foreach (table, f) [Lua 5.0] executes f(index,value) over all elements of table, returns first non-nil of f +table.foreachi (table, f) [Lua 5.0] executes f(index,value) in sequential order 1 to n, returns first non-nil of f +table.getn (table) returns size of table, or n field, or table.setn value, or 1 less first index with nil value\n [Deprecated in Lua 5.1, use # operator] +table.insert (table, [pos,] value) insert value at location pos in table, default pos=n+1 +table.remove (table [, pos]) removes element at pos from table, default pos=n +table.setn (table, n) [Lua 5.0] sets size of table, n field of table if it exists +table.sort (table [, comp]) sorts in-place elements 1 to n, comp(v1,v2) true if v1<v2, default < +tonumber (e [, base]) convert to number, returns number, nil if non-convertible, 2<=base<=36 +tostring (e) convert to string, returns string +type (v) returns type of v as a string +unpack (list) returns all elements from list +xpcall (f, err) pcall function f with new error handler err + +# lunit +lunit.assert (assertion, [msg]) Fails, if 'assertion' is false or nil. +lunit.assert_fail ([msg]) Always fails. +lunit.assert_true (actual, [msg]) Fails, if 'actual' isn't true. +lunit.assert_false (actual, [msg]) Fails, if 'actual' isn't false. (Even fails if 'actual' is a nil value!) +lunit.assert_equal (expected, actual, [msg]) Fails, if 'actual' is different from 'expected'. +lunit.assert_not_equal (unexpected, actual, [msg]) Fails, if 'actual' and 'unexpected' are equal. +lunit.assert_match (pattern, actual, [msg]) Fails, if the string 'actual' doesn't match 'pattern'. +lunit.assert_not_match (pattern, actual, [msg]) Fails, if the string 'actual' match 'pattern'. +lunit.assert_nil (actual, [msg]) Fails, if 'actual' isn't a nil value. +lunit.assert_not_nil (actual, [msg]) Fails, if 'actual' is a nil value. +lunit.assert_boolean (actual, [msg]) Fails, if 'actual' isn't true or false. +lunit.assert_not_boolean (actual, [msg]) Fails, if 'actual' is true or false. +lunit.assert_number (actual, [msg]) Fails, if 'actual' isn't a number. +lunit.assert_not_number (actual, [msg]) Fails, if 'actual' is a number. +lunit.assert_string (actual, [msg]) Fails, if 'actual' isn't a string. +lunit.assert_not_string (actual, [msg]) Fails, if 'actual' is a string. +lunit.assert_table (actual, [msg]) Fails, if 'actual' isn't a table. +lunit.assert_not_table (actual, [msg]) Fails, if 'actual' is a table. +lunit.assert_function (actual, [msg]) Fails, if 'actual' isn't a function. +lunit.assert_not_function (actual, [msg]) Fails, if 'actual' is a function. +lunit.assert_thread (actual, [msg]) Fails, if 'actual' isn't a thread (created by coroutine.create or coroutine.wrap). +lunit.assert_not_thread (actual, [msg]) Fails, if 'actual' is a thread. +lunit.assert_userdata (actual, [msg]) Fails, if 'actual' isn't userdata. +lunit.assert_not_userdata (actual, [msg]) Fails, if 'actual' is userdata. +lunit.assert_error ([msg], func) Fails, if 'func' doesn't raises an error (using error ()). +lunit.assert_pass ([msg], func) Fails, if 'func' raises an error. +lunit.is_nil (actual) +lunit.is_boolean (actual) +lunit.is_number (actual) +lunit.is_string (actual) +lunit.is_table (actual) +lunit.is_function (actual) +lunit.is_thread (actual) +lunit.is_userdata (actual) +lunit.run () Run all testcases +lunit.wrap (func) Wrap a single function to form a independent testcase +lunit.TestCase (description) Group related tests into a testcase object diff --git a/modules/lua/commands.lua b/modules/lua/commands.lua new file mode 100644 index 00000000..8cf25c87 --- /dev/null +++ b/modules/lua/commands.lua @@ -0,0 +1,91 @@ +-- Copyright 2007 Mitchell mitchell<att>caladbolg.net. See LICENSE. + +--- +-- Commands for the lua module. +module('modules.lua.commands', package.seeall) + +--- +-- Patterns for auto 'end' completion for control structures. +-- @class table +-- @name control_structure_patterns +-- @see try_to_autocomplete_end +local control_structure_patterns = { + '^%s*for', '^%s*function', '^%s*if', '^%s*repeat', '^%s*while', + 'function%s*%b()%s*$', '^%s*local%s*function' +} + +--- +-- Try to autocomplete Lua's 'end' keyword for control structures like 'if', +-- 'while', 'for', etc. +-- @see control_structure_patterns +function try_to_autocomplete_end() + local buffer = buffer + buffer:begin_undo_action() + buffer:line_end() buffer:new_line() + local line_num = buffer:line_from_position(buffer.current_pos) + local line = buffer:get_line(line_num - 1) + for _, patt in ipairs(control_structure_patterns) do + if line:match(patt) then + local indent = buffer.line_indentation[line_num - 1] + buffer:add_text( patt:match('repeat') and '\nuntil' or '\nend' ) + buffer.line_indentation[line_num + 1] = indent + buffer.line_indentation[line_num] = indent + buffer.indent + buffer:line_up() buffer:line_end() + break + end + end + buffer:end_undo_action() +end + +--- +-- Determine the Lua file being 'require'd, and search through package.path for +-- that file and open it in Textadept. +function goto_required() + local buffer = buffer + local line = buffer:get_line( buffer:line_from_position(buffer.current_pos) ) + local patterns = { 'require%s*(%b())', 'require%s*(([\'"])[^%2]+%2)' } + local file + for _, patt in ipairs(patterns) do + file = line:match(patt) + if file then break end + end + file = file:sub(2, -2):gsub('%.', '/') + for path in package.path:gmatch('[^;]+') do + path = path:gsub('?', file) + local f = io.open(path) + if f then f:close() textadept.io.open(path) break end + end +end + +--- +-- Executes the current file. +function run() + local buffer = buffer + local out = io.popen('lua "'..buffer.filename..'" 2>&1'):read('*all') + buffer = textadept.new_buffer() + buffer:set_text('Command output:\n'..out) + buffer:set_save_point() +end + +-- Lua-specific key commands. +local keys = _G.keys +if type(keys) == 'table' then + local m_editing = modules.textadept.editing + local m_handlers = textadept.handlers + keys.lua = { + al = { textadept.io.open, _HOME..'/modules/lua/init.lua' }, + ac = { + g = { goto_required } + }, + ['s\n'] = { try_to_autocomplete_end }, + cq = { m_editing.block_comment, '--~' }, + cg = { run }, + ['('] = { function() + buffer.word_chars = + '_.:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + m_editing.show_call_tip(modules.lua.api, true) + buffer:set_chars_default() + return false + end }, + } +end diff --git a/modules/lua/init.lua b/modules/lua/init.lua new file mode 100644 index 00000000..751aa281 --- /dev/null +++ b/modules/lua/init.lua @@ -0,0 +1,31 @@ +-- Copyright 2007 Mitchell mitchell<att>caladbolg.net. See LICENSE. + +--- +-- The lua module. +-- It provides utilities for editing Lua code. +module('modules.lua', package.seeall) + +if type(_G.snippets) == 'table' then +--- +-- Container for Lua-specific snippets. +-- @class table +-- @name snippets.lua + _G.snippets.lua = {} +end + +if type(_G.keys) == 'table' then +--- +-- Container for Lua-specific key commands. +-- @class table +-- @name keys.lua + _G.keys.lua = {} +end + +require 'lua.commands' +require 'lua.snippets' + +function set_buffer_properties() + +end + +api = textadept.io.read_api_file(_HOME..'/modules/lua/api', '%w_.:') diff --git a/modules/lua/snippets.lua b/modules/lua/snippets.lua new file mode 100644 index 00000000..eb884a8a --- /dev/null +++ b/modules/lua/snippets.lua @@ -0,0 +1,47 @@ +-- Copyright 2007 Mitchell mitchell<att>caladbolg.net. See LICENSE. + +--- +-- Snippets for the lua module. +module('modules.lua.snippets', package.seeall) + +local snippets = _G.snippets + +if type(snippets) == 'table' then + snippets.lua = { + l = "local ${1:expr}${2: = ${3:value}}", + p = "print(${0})", + f = "function ${1:name}(${2:args})\n ${0}\nend", + fori = "for ${1:i}, ${2:val} in ipairs(${3:table}) do\n ${0}\nend", + ['for'] = "for i=${1:1}, ${2:10}${3:, -1} do\n ${0}\nend", + forp = "for ${1:k}, ${2:v} in pairs(${3:table}) do\n ${0}\nend", + find = "string.find(${1:str}, ${2:pattern})", + len = "string.len(${1:str})", + gsub = "string.gsub(${1:str}, ${2:pattern}, ${3:repl})", + gfind = "for ${1:match} in string.gfind(${2:str}, ${3:pattern}) do\n ${0}\nend", + c = "-- ", + + tc = "local ${1:tc} = lunit.TestCase('${2:description}')", + ae = "lunit.assert_equal(${1:expected}, ${2:actual})", + ane = "lunit.assert_not_equal(${1:unexpected}, ${2:actual})", + at = "lunit.assert_true(${1:actual})", + af = "lunit.assert_false(${1:actual})", + run = "lunit.run()", + abool = "lunit.assert_boolean(${1:expr})", + anbool = "lunit.assert_not_boolean(${1:expr})", + ['anil'] = "lunit.assert_nil(${1:expr})", + annil = "lunit.assert_not_nil(${1:expr})", + anum = "lunit.assert_number(${1:expr})", + annum = "lunit.assert_not_number(${1:expr})", + astr = "lunit.assert_string(${1:expr})", + anstr = "lunit.assert_not_string(${1:expr})", + atab = "lunit.assert_table(${1:expr})", + antab = "lunit.assert_not_table(${1:expr})", + athr = "lunit.assert_thread(${1:expr})", + anthr = "lunit.assert_not_thread(${1:expr})", + afunc = "lunit.assert_function(${1:expr})", + anfunc = "lunit.assert_not_function(${1:expr})", + aud = "lunit.assert_userdata(${1:expr})", + anud = "lunit.assert_not_userdata(${1:expr})" + } +end + |