pmacs3/mode/lua.py

98 lines
3.3 KiB
Python

import commands
import time
from tab import StackTabber
from method import Method
from mode import Fundamental
from lex import Grammar, PatternRule, RegionRule, PatternMatchRule
from mode.python import StringGrammar1, StringGrammar2
from mode.pipe import Pipe
from method.shell import Interact
chr1 = '[a-zA-Z_]'
chr2 = '[a-zA-Z_0-9]'
word = chr1 + chr2 + '*'
class LuaGrammar(Grammar):
rules = [
PatternRule('comment', r'--.*$'),
PatternRule('spaces', r' +'),
PatternRule('eol', r'\n'),
RegionRule('lua.string', r"'", StringGrammar1, r"'"),
RegionRule('lua.string', r'"', StringGrammar2, r'"'),
PatternMatchRule('x', '(function)( +)('+word+')',
'lua.keyword', 'spaces', 'lua.function'),
PatternRule('lua.keyword', '(?:while|until|true|then|return|repeat|or|not|nil|local|in|if|function|for|false|end|elseif|else|done|do|break|and)(?!'+chr2+')'),
PatternRule('lua.internal', '_[A-Z]+'),
PatternRule('lua.identifier', word),
PatternRule('delimiter', r'(?:[=(){}\[\];:,.])'),
PatternRule('lua.operator', r'(?:\.\.\.|\.\.|==|~=|<=|>=|<|>)'),
PatternRule('lua.operator', r'(?:\+|-|/|\*|%|\^)'),
PatternRule('lua.integer', r"(?<![\.0-9a-zA-Z_])(?:0|-?[1-9][0-9]*|0[0-7]+|0[xX][0-9a-fA-F]+)[lL]?(?![\.0-9a-zA-Z_])"),
PatternRule('lua.float', r"(?<![\.0-9a-zA-Z_])(?:-?[0-9]+\.[0-9]*|-?\.[0-9]+|(?:[0-9]|[0-9]+\.[0-9]*|-?\.[0-9]+)[eE][\+-]?[0-9]+)(?![\.0-9a-zA-Z_])"),
]
class LuaCheckSyntax(Method):
'''Check the syntax of a lua file'''
def _execute(self, w, **vargs):
app = w.application
cmd = "luac -p %r" % (w.buffer.path)
(status, output) = commands.getstatusoutput(cmd)
if status == 0:
app.set_error("Syntax OK")
app.data_buffer("*Lua-Check-Syntax*", output, switch_to=False)
else:
app.data_buffer("*Lua-Check-Syntax*", output)
class LuaStart(Interact):
args = []
modename = 'luapipe'
def _execute(self, w, **vargs):
a = w.application
if a.has_buffer_name('*Lua*'):
a.switch_buffer(a.get_buffer_by_name('*Lua*'))
else:
Interact._execute(self, w, bname='*Lua*', cmd='lua')
class LuaLoadFile(Interact):
args = []
modename = 'luapipe'
def _execute(self, w, **vargs):
a = w.application
if a.has_buffer_name('*Lua*'):
b = a.get_buffer_by_name('*Lua*')
a.switch_buffer(b)
else:
Interact._execute(self, w, bname='*Lua*', cmd='lua')
b = a.get_buffer_by_name('*Lua*')
path = w.buffer.path
b.pipe_write('dofile("' + path + '");\n')
class Lua(Fundamental):
name = 'Lua'
extensions = ['.lua']
grammar = LuaGrammar
commentc = '--'
opentokens = ('delimiter',)
opentags = {'(': ')', '[': ']', '{': '}'}
closetokens = ('delimiter',)
closetags = {')': '(', ']': '[', '}': '{'}
colors = {}
actions = [LuaCheckSyntax, LuaStart, LuaLoadFile]
_bindings = {
'close-paren': (')',),
'close-brace': ('}',),
'close-bracket': (']',),
'lua-check-syntax': ('C-c s',),
}
class LuaPipe(Pipe):
name = 'luapipe'
grammar = LuaGrammar
def install(*args):
Lua.install(*args)
LuaPipe.install(*args)