diff --git a/method/__init__.py b/method/__init__.py index 36dcd56..dcb33bd 100644 --- a/method/__init__.py +++ b/method/__init__.py @@ -492,10 +492,8 @@ class GetIndentionLevel(Method): w.set_error('Indention level: %r' % i) # commenting -# commenting in python class CommentRegion(Method): '''Prepend a comment to every line in the current buffer''' - commentc = '#' def _execute(self, w, **vargs): cursor = w.logical_cursor() if cursor < w.mark: @@ -508,16 +506,17 @@ class CommentRegion(Method): w.input_line = "Empty kill region" return + commentc = w.mode.commentc or '#' + x = w.buffer.detect_indent_level(p1.y, p2.y) or 0 for y in range(p1.y, p2.y): - c = self.commentc + c = commentc if len(w.buffer.lines[y]) < x: c += ' ' * (x - len(w.buffer.lines[y])) w.buffer.insert_string(Point(x, y), c) class UncommentRegion(Method): '''Remove a comment from every line in the current buffer''' - commentre = re.compile('^( *)(#+)') def _execute(self, w, **vargs): cursor = w.logical_cursor() if cursor < w.mark: @@ -530,9 +529,12 @@ class UncommentRegion(Method): w.input_line = "Empty kill region" return + commentc = w.mode.commentc or '#' + commentre = re.compile('^( *)((?:%s)+)' % commentc) + for y in range(p1.y, p2.y): line = w.buffer.lines[y] - m = self.commentre.match(line) + m = commentre.match(line) if not m: continue s1, s2 = m.groups() diff --git a/mode/__init__.py b/mode/__init__.py index 923f2af..bf21525 100644 --- a/mode/__init__.py +++ b/mode/__init__.py @@ -32,11 +32,12 @@ class Handler(object): del self.bindings[binding] def add_binding(self, name, sequence): if self.window is None: - return + #return + raise Exception("No window available") elif not hasattr(self.window, 'application'): - raise Exception, "argh %r %r" % (self, self.window) + raise Exception("No application available") elif name not in self.window.application.methods: - raise Exception, "No action called %r found" % name + raise Exception("No action called %r found" % name) else: self.bindings[sequence] = name def add_bindings(self, name, sequences): @@ -89,6 +90,7 @@ class Fundamental(Handler): context = None colors = {} word_letters = None + commentc = None # config settings installed/modified by the mode config = {} @@ -97,6 +99,7 @@ class Fundamental(Handler): sconfig = {} actions = [] + _bindings = {} completers = {} format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s" @@ -151,6 +154,7 @@ class Fundamental(Handler): return else: app.methods[m.name] = m + for (datatype, completer) in cls.completers.iteritems(): app.set_completer(datatype, completer) install = classmethod(install) @@ -264,6 +268,10 @@ class Fundamental(Handler): for c in string.letters + string.digits + string.punctuation: self.add_binding('insert-string-%s' % c, c) + # per-mode bindings + for (name, sequences) in self._bindings.iteritems(): + self.add_bindings(name, sequences) + # lexing for highlighting, etc. if self.grammar: self.lexer = Lexer(self, self.grammar) @@ -405,7 +413,6 @@ class Fundamental(Handler): return '%d%s' % (b.indentlvl, t) def _get_mark(self): w = self.window - return '(%d,%d)' % (w.first.y + 1, w.first.x + 1), if w.mark: return '(%d,%d)' % (w.mark.y + 1, w.mark.x + 1) else: diff --git a/mode/awk.py b/mode/awk.py index 5f10646..181eff0 100644 --- a/mode/awk.py +++ b/mode/awk.py @@ -132,10 +132,16 @@ class AwkFilterInput(Method): class Awk(mode.Fundamental): tabbercls = AwkTabber - modename = 'awk' - extensions = ['.awk'] - grammar = AwkGrammar - colors = { + modename = 'awk' + extensions = ['.awk'] + grammar = AwkGrammar + opentokens = ('delimiter',) + opentags = {'(': ')', '[': ']', '{': '}'} + closetokens = ('delimiter',) + closetags = {')': '(', ']': '[', '}': '{'} + config = {'awk.cmd-opts': ""} + actions = [AwkFilterFile, AwkFilterBuffer, AwkFilterInput] + colors = { 'awk_global': ('yellow', 'default', 'bold'), 'awk_function': ('magenta', 'default', 'bold'), 'awk_field': ('yellow', 'default', 'bold'), @@ -145,7 +151,9 @@ class Awk(mode.Fundamental): 'awk_regex.data': ('cyan', 'default', 'bold'), 'awk_regex.end': ('cyan', 'default', 'bold'), } - config = {'awk.cmd-opts': ""} - actions = [AwkFilterFile, AwkFilterBuffer, AwkFilterInput] - + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = Awk.install diff --git a/mode/c.py b/mode/c.py index 52f8593..001da3d 100644 --- a/mode/c.py +++ b/mode/c.py @@ -137,6 +137,10 @@ class C(mode.Fundamental): opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) closetags = {')': '(', ']': '[', '}': '{'} + actions = [CCheckSyntax, CMake] + format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s [%(func)s]" + commentc = '//' + colors = { 'macrocomment.start': ('red', 'default', 'bold'), 'macrocomment.null': ('red', 'default', 'bold'), @@ -170,9 +174,14 @@ class C(mode.Fundamental): lconfig = { 'ignore-suffix': ['.o'], } - actions = [CCheckSyntax, CMake] - format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s [%(func)s]" + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + 'c-check-syntax': ('C-c s',), + 'c-make': ('C-c C-c',), + } def get_status_names(self): names = mode.Fundamental.get_status_names(self) @@ -180,14 +189,6 @@ class C(mode.Fundamental): names['func'] = self.get_line_function(c.y) return names - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('c-check-syntax', ('C-c s',)) - self.add_bindings('c-make', ('C-c C-c',)) - def get_functions(self): return {} def get_function_names(self): diff --git a/mode/cheetah.py b/mode/cheetah.py index c7bd1b5..268e0f2 100644 --- a/mode/cheetah.py +++ b/mode/cheetah.py @@ -36,6 +36,7 @@ class Template(mode.Fundamental): modename = 'Cheetah' extensions = ['.tmpl'] grammar = TemplateGrammar + commentc = '##' colors = { 'cheetah_directive': ('magenta', 'default', 'bold'), 'cheetah_placeholder': ('magenta', 'default', 'bold'), @@ -48,10 +49,10 @@ class Template(mode.Fundamental): 'cheetah_tag.string.end': ('green', 'default', 'bold'), 'cheetah_tag.end': ('default', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = Template.install diff --git a/mode/console.py b/mode/console.py index b879b1a..3ede815 100644 --- a/mode/console.py +++ b/mode/console.py @@ -2,23 +2,7 @@ import color, mode from lex import Grammar, PatternRule, RegionRule from mode.python import StringGrammar1, StringGrammar2, PythonGrammar -#class ConsoleGrammar(Grammar): -# rules = [ -# RegionRule(r'string', r'"', StringGrammar2, r'"'), -# RegionRule(r'string', r"'", StringGrammar1, r"'"), -# RegionRule(r'console_input', r'^(?:>>>|-->)', PythonGrammar, '\n$'), -# PatternRule(r'console_mesg', r'^[A-Za-z].*$'), -# PatternRule(r'console_reserved', r'True|False|None'), -# PatternRule(r'console_bareword', r'[a-zA-Z_][a-zA-Z0-9_]*'), -# ] class Console(mode.Fundamental): modename = 'Console' -# grammar = ConsoleGrammar() -# colors = { -# 'console_mesg': ('red', 'default', 'bold'), -# 'console_input.start': ('red', 'default', 'bold'), -# 'console_reserved': ('magenta', 'default', 'bold'), -# 'console_bareword': ('default', 'default', 'bold'), -# } install = Console.install diff --git a/mode/consolemini.py b/mode/consolemini.py index ad289a8..71b4863 100644 --- a/mode/consolemini.py +++ b/mode/consolemini.py @@ -5,7 +5,6 @@ from mode.python import PythonGrammar from point import Point PAD = ' ' -LIMIT = 79 class ConsoleExec(method.Method): def _execute(self, w, **vargs): @@ -57,12 +56,7 @@ class ConsoleExec(method.Method): t = sys.exc_traceback output = str(e) + traceback.format_exc() - limit = 1000 - for w2 in b.windows: - limit = min(w.width, limit) - if limit == 1000: - limit = LIMIT - limit -= len(PAD) + limit = min([w.width for w in b.windows]) - len(PAD) if output: newlines = [] @@ -224,6 +218,18 @@ class ConsoleMini(mode.Fundamental): actions = [ConsoleExec, ConsoleClear, ConsoleCancel, ConsoleHistoryPrev, ConsoleHistoryNext, ConsoleTab, ConsolePageUp, ConsolePageDown, ConsoleGotoBeginning, ConsoleGotoEnd] + _bindings = { + 'console-exec': ('RETURN',), + 'console-clear': ('C-l',), + 'console-cancel': ('C-]', 'C-g'), + 'console-history-prev': ('C-p', 'UP'), + 'console-history-next': ('C-n', 'DOWN'), + 'console-tab': ('TAB',), + 'console-page-up': ('M-v',), + 'console-page-down': ('C-v',), + 'console-goto-beginning': ('M-<',), + 'console-goto-end': ('M->',), + } def __init__(self, w): mode.Fundamental.__init__(self, w) self.globals = dict(w.application.globals()) @@ -231,15 +237,5 @@ class ConsoleMini(mode.Fundamental): self.saved_input = "" self.history = [''] self.hindex = 0 - self.add_bindings('console-exec', ('RETURN',)) - self.add_bindings('console-clear', ('C-l',)) - self.add_bindings('console-cancel', ('C-]', 'C-g')) - self.add_bindings('console-history-prev', ('C-p', 'UP')) - self.add_bindings('console-history-next', ('C-n', 'DOWN')) - self.add_bindings('console-tab', ('TAB',)) - self.add_bindings('console-page-up', ('M-v',)) - self.add_bindings('console-page-down', ('C-v',)) - self.add_bindings('console-goto-beginning', ('M-<',)) - self.add_bindings('console-goto-end', ('M->',)) install = ConsoleMini.install diff --git a/mode/css.py b/mode/css.py index 0df1144..2b9e6d7 100644 --- a/mode/css.py +++ b/mode/css.py @@ -80,10 +80,10 @@ class CSS(mode.Fundamental): 'css_keyword.escaped': ('magenta', 'default', 'bold'), 'css_keyword.end': ('default', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = CSS.install diff --git a/mode/elisp.py b/mode/elisp.py index cfcdd83..61e9d68 100644 --- a/mode/elisp.py +++ b/mode/elisp.py @@ -2,7 +2,7 @@ import commands, os.path, string, sys, traceback import color, completer, default, mode, method, regex, tab from point import Point from lex import Grammar, PatternRule, RegionRule, OverridePatternRule -from mode.lisp import LispTabber, LispCommentRegion, LispUncommentRegion +from mode.lisp import LispTabber class StringGrammar(Grammar): rules = [ @@ -35,6 +35,7 @@ class ELisp(mode.Fundamental): extensions = ['.el'] tabbercls = LispTabber grammar = ELispGrammar + commentc = ';' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) @@ -45,12 +46,12 @@ class ELisp(mode.Fundamental): 'elisp_symbol': ('magenta', 'default', 'bold'), 'elisp_type': ('blue', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('lisp-comment-region', ('C-c #',)) - self.add_bindings('lisp-uncomment-region', ('C-u C-C #',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + 'lisp-comment-region': ('C-c #',), + 'lisp-uncomment-region': ('C-u C-C #',), + } install = ELisp.install diff --git a/mode/erlang.py b/mode/erlang.py index 5714846..1fcfe27 100644 --- a/mode/erlang.py +++ b/mode/erlang.py @@ -82,6 +82,7 @@ class Erlang(mode.Fundamental): tabwidth = 4 tabbercls = ErlangTabber grammar = ErlangGrammar + commentc = '%' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) @@ -100,10 +101,10 @@ class Erlang(mode.Fundamental): 'erl_atom.null': ('magenta', 'default', 'bold'), 'erl_atom.end': ('magenta', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = Erlang.install diff --git a/mode/haskell.py b/mode/haskell.py index b0433c1..67896f4 100644 --- a/mode/haskell.py +++ b/mode/haskell.py @@ -29,16 +29,17 @@ class HaskellGrammar(Grammar): ] class Haskell(mode.Fundamental): - modename = 'Haskell' - extensions = ['.hs'] - tabwidth = 4 + modename = 'Haskell' + extensions = ['.hs'] + tabwidth = 4 + commentc = '--' #tabbercls = mode.lisp.LispTabber - grammar = HaskellGrammar + grammar = HaskellGrammar #opentokens = ('delimiter',) #opentags = {'(': ')'} #closetokens = ('delimiter',) #closetags = {')': '('} - colors = { + colors = { 'hs_reserved': ('cyan', 'default', 'bold'), 'hs_constructor': ('magenta', 'default', 'bold'), 'hs_declaration': ('blue', 'default', 'bold'), @@ -51,10 +52,5 @@ class Haskell(mode.Fundamental): 'hs_string.gap.null': ('red', 'default', 'bold'), 'hs_string.gap.end': ('red', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - #self.add_bindings('close-paren', (')',)) - #self.add_bindings('close-brace', ('}',)) - #self.add_bindings('close-bracket', (']',)) install = Haskell.install diff --git a/mode/html.py b/mode/html.py index d5cc047..ddeb7ab 100644 --- a/mode/html.py +++ b/mode/html.py @@ -99,13 +99,12 @@ class HTML(mode.Fundamental): colors['style.%s' % _name] = _colorbase[_name] colors['tag.%s' % _name] = _colorbase[_name] actions = [HtmlViewPage, HtmlValidatePage, HtmlCheckSpelling] - - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('xml-create-tag', ('M-t',)) - self.url = None + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + 'xml-create-tag': ('M-t',), + } + url = None install = HTML.install diff --git a/mode/java.py b/mode/java.py index bf3e9d1..9484a82 100644 --- a/mode/java.py +++ b/mode/java.py @@ -121,6 +121,7 @@ class Java(mode.Fundamental): extensions = ['.java'] tabbercls = JavaTabber2 grammar = JavaGrammar + commentc = '//' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) diff --git a/mode/javascript.py b/mode/javascript.py index b3caf56..6b33fb5 100644 --- a/mode/javascript.py +++ b/mode/javascript.py @@ -91,6 +91,7 @@ class Javascript(mode.Fundamental): extensions = ['.js'] grammar = JavascriptGrammar tabbercls = JavascriptTabber2 + commentc = '//' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) @@ -106,10 +107,10 @@ class Javascript(mode.Fundamental): 'js_regex.escaped': ('magenta', 'default', 'bold'), 'js_regex.end': ('cyan', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = Javascript.install diff --git a/mode/latex.py b/mode/latex.py index c716544..286d562 100644 --- a/mode/latex.py +++ b/mode/latex.py @@ -78,10 +78,10 @@ class LatexViewPdf(LatexBuildPdf): pdfpath = self._modpath(w, '.pdf') os.execvp(viewcmd, (viewcmd, pdfpath)) -class LatexCommentRegion(method.CommentRegion): - commentc = '%' -class LatexUncommentRegion(method.UncommentRegion): - commentc = '%' +#class LatexCommentRegion(method.CommentRegion): +# commentc = '%' +#class LatexUncommentRegion(method.UncommentRegion): +# commentc = '%' class LatexInsertSquotes(method.Method): '''Insert a pair of LaTeX-style single-quotes into the buffer''' @@ -116,6 +116,7 @@ class LatexCheckSpelling(method.Method): class Latex(mode.Fundamental): modename = 'Latex' extensions = ['.latex', '.tex'] + commentc = '%' grammar = LatexGrammar colors = { 'latex_wrapper': ('magenta', 'default', 'bold'), @@ -133,21 +134,19 @@ class Latex(mode.Fundamental): 'latex.pdfbuildcmd': 'pdflatex', 'latex.pdfviewcmd': 'evince', } - actions = [LatexCommentRegion, LatexUncommentRegion, LatexInsertSquotes, + actions = [LatexInsertSquotes, LatexInsertDquotes, LatexInsertBraces, LatexBuild, LatexInsertSpace, LatexBuildPdf, LatexViewPdf, LatexCheckSpelling] - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('wrap-paragraph', ('M-q',)) - self.add_bindings('latex-comment-region', ('C-c #', "C-c \%")) - self.add_bindings('latex-uncomment-region', ('C-u C-c #', "C-u C-c \%")) - self.add_bindings('latex-insert-squotes', ("M-'",)) - self.add_bindings('latex-insert-dquotes', ('M-"',)) - self.add_bindings('latex-insert-braces', ('M-{',)) - self.add_bindings('latex-build', ("C-c C-c", 'C-c B')) - self.add_bindings('latex-insert-space', ('SPACE',)) - self.add_bindings('latex-build-pdf', ("C-c C-p",)) - self.add_bindings('latex-view-pdf', ('C-c C-v',)) + _bindings = { + 'wrap-paragraph': ('M-q',), + 'latex-insert-squotes': ("M-'",), + 'latex-insert-dquotes': ('M-"',), + 'latex-insert-braces': ('M-{',), + 'latex-build': ("C-c C-c", 'C-c B'), + 'latex-insert-space': ('SPACE',), + 'latex-build-pdf': ("C-c C-p",), + 'latex-view-pdf': ('C-c C-v',), + } install = Latex.install diff --git a/mode/lisp.py b/mode/lisp.py index eb3f811..c19cd9f 100644 --- a/mode/lisp.py +++ b/mode/lisp.py @@ -14,11 +14,6 @@ class LispGrammar(Grammar): PatternRule(r'eol', r'\n'), ] -class LispCommentRegion(CommentRegion): - commentc = ';' -class LispUncommentRegion(UncommentRegion): - commentc = ';' - class LispTabber(tab.StackTabber): wsre = regex.whitespace wst = ('spaces', 'null', 'eol',) @@ -49,14 +44,11 @@ class Lisp(mode.Fundamental): opentags = {'(': ')'} closetokens = ('delimiter',) closetags = {')': '('} - actions = [LispCommentRegion, LispUncommentRegion] - - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('lisp-comment-region', ('C-c #',)) - self.add_bindings('lisp-uncomment-region', ('C-u C-C #',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } + commentc = ';' install = Lisp.install diff --git a/mode/lua.py b/mode/lua.py index 7938c19..e250318 100644 --- a/mode/lua.py +++ b/mode/lua.py @@ -40,19 +40,20 @@ class LuaCheckSyntax(method.Method): class Lua(mode.Fundamental): modename = 'Lua' extensions = ['.lua'] - #tabbercls = mode.lisp.LispTabber + #tabbercls = mode.lisp.LispTabber grammar = LuaGrammar + commentc = '--' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) closetags = {')': '(', ']': '[', '}': '{'} colors = {} - actions = [LuaCheckSyntax] - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('lua-check-syntax', ('C-c s',)) + actions = [LuaCheckSyntax] + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + 'lua-check-syntax': ('C-c s',), + } install = Lua.install diff --git a/mode/make.py b/mode/make.py index cc939f4..6188816 100644 --- a/mode/make.py +++ b/mode/make.py @@ -36,6 +36,7 @@ class Make(mode.Fundamental): modename = 'Make' basenames = ['Makefile'] grammar = MakeGrammar + commentc = '#' savetabs = True colors = { 'targets.start': ('cyan', 'default', 'bold'), diff --git a/mode/nasm.py b/mode/nasm.py index 689854f..e2160db 100644 --- a/mode/nasm.py +++ b/mode/nasm.py @@ -25,11 +25,11 @@ class NasmGrammar(Grammar): PatternRule(r'comment', r';.*$'), ] - class Nasm(mode.Fundamental): modename = 'nasm' extensions = ['.s'] grammar = NasmGrammar + commentc = ';' colors = { 'nasm_keyword': ('cyan', 'default', 'bold'), 'macros': ('blue', 'default', 'bold'), diff --git a/mode/ocaml.py b/mode/ocaml.py index 881e9d2..910af7e 100644 --- a/mode/ocaml.py +++ b/mode/ocaml.py @@ -67,10 +67,10 @@ class Ocaml(mode.Fundamental): 'ocaml_string.escaped': ('magenta', 'default', 'bold'), 'ocaml_string.end': ('green', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = Ocaml.install diff --git a/mode/perl.py b/mode/perl.py index 734d967..ab26cdc 100644 --- a/mode/perl.py +++ b/mode/perl.py @@ -619,6 +619,7 @@ class Perl(mode.Fundamental): detection = ['perl'] tabbercls = PerlTabber2 grammar = PerlGrammar + commentc = '#' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) diff --git a/mode/php.py b/mode/php.py index 5189677..bcc9c49 100644 --- a/mode/php.py +++ b/mode/php.py @@ -3,7 +3,7 @@ from lex import Grammar, PatternRule, RegionRule from mode.python import StringGrammar #from mode.c import CTabber -class JavaGrammar(Grammar): +class PHPGrammar(Grammar): rules = [ #PatternRule(r'import', r'(?<=import ) *[a-zA-Z0-9_.*]+'), #PatternRule(r'package', r'(?<=package ) *[a-zA-Z0-9_.*]+'), @@ -19,19 +19,19 @@ class JavaGrammar(Grammar): PatternRule(r'php_constants', r'PHP_VERSION|PHP_OS|DEFAULT_INCLUDE_PATH|PEAR_INSTALL_DIR|PEAR_EXTENSION_DIR|PHP_EXTENSION_DIR|PHP_BINDIR|PHP_LIBDIR|PHP_DATADIR|PHP_SYSCONFDIR|PHP_LOCALSTATEDIR|PHP_CONFIG_FILE_PATH|PHP_OUTPUT_HANDLER_START|PHP_OUTPUT_HANDLER_CONT|PHP_OUTPUT_HANDLER_END|E_ERROR|E_WARNING|E_PARSE|E_NOTICE|E_CORE_ERROR|E_CORE_WARNING|E_COMPILE_ERROR|E_COMPILE_WARNING|E_USER_ERROR|E_USER_WARNING|E_USER_NOTICE|E_ALL'), PatternRule(r'keyword', r"(?:abstract|assert|boolean|break|byte|case|catch|char|class|continue|default|double|do|else|extends|finally|final|float|for|if|implements|import|instanceof|interface|int|long|native|new|package|private|protected|public|return|short|static|switch|super|synchronized|threadsafe|throws|throw|transient|try|void|while)(?![a-zA-Z_])"), - PatternRule(r'java_label', r'[a-zA-Z_][a-zA-Z0-9_]*(?=:)'), + PatternRule(r'php_label', r'[a-zA-Z_][a-zA-Z0-9_]*(?=:)'), - PatternRule(r'java_builtin', r"(?:null|true|false|this)"), + PatternRule(r'php_builtin', r"(?:null|true|false|this)"), PatternRule(r'identifier', r"[a-zA-Z_][a-zA-Z0-9_]*"), PatternRule(r"unop", r"\+=|-=|\*=|/=|//=|%=|&=\|\^=|>>=|<<=|\*\*="), PatternRule(r'binop', r"\+|<>|<<|<=|<|-|>>|>=|>|\*\*|&|\*|\||/|\^|==|//|~|!=|%"), PatternRule(r"delimiter", r"->|\.|\(|\)|\[|\]|{|}|@|,|:|`|;|=|\?"), - PatternRule(r"java_integer", r"(?:0(?![x0-9])|[1-9][0-9]*|0[0-7]+|0[xX][0-9a-fA-F]+)[lL]?"), - PatternRule(r"java_float", r"[0-9]+\.[0-9]*|\.[0-9]+|(?:[0-9]|[0-9]+\.[0-9]*|\.[0-9]+)[eE][\+-]?[0-9]+"), + PatternRule(r"php_integer", r"(?:0(?![x0-9])|[1-9][0-9]*|0[0-7]+|0[xX][0-9a-fA-F]+)[lL]?"), + PatternRule(r"php_float", r"[0-9]+\.[0-9]*|\.[0-9]+|(?:[0-9]|[0-9]+\.[0-9]*|\.[0-9]+)[eE][\+-]?[0-9]+"), RegionRule(r'string', '"', StringGrammar, '"'), - PatternRule(r'java_char', r"'.'|'\\.'|'\\[0-7]{3}'"), + PatternRule(r'php_char', r"'.'|'\\.'|'\\[0-7]{3}'"), PatternRule(r"eol", r"\n$"), ] @@ -160,11 +160,12 @@ class JavaGrammar(Grammar): # self._opt_append('cont', currlvl + w) # return currlvl -class Java(mode.Fundamental): - modename = 'Java' - extensions = ['.java'] - #tabbercls = JavaTabber - grammar = JavaGrammar +class PHP(mode.Fundamental): + modename = 'PHP' + extensions = ['.php'] + #tabbercls = JavaTabber + grammar = PHPGrammar + commentc = '#' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) @@ -174,11 +175,11 @@ class Java(mode.Fundamental): 'doccomment.end': ('red', 'default', 'bold'), 'doccomment.null': ('red', 'default', 'bold'), 'import': ('blue', 'default', 'bold'), - 'java_label': ('magenta', 'default', 'bold'), - 'java_builtin': ('magenta', 'default', 'bold'), - 'java_char': ('green', 'default', 'bold'), - 'java_integer': ('green', 'default', 'bold'), - 'java_float': ('green', 'default', 'bold'), + 'php_label': ('magenta', 'default', 'bold'), + 'php_builtin': ('magenta', 'default', 'bold'), + 'php_char': ('green', 'default', 'bold'), + 'php_integer': ('green', 'default', 'bold'), + 'php_float': ('green', 'default', 'bold'), } def __init__(self, w): mode.Fundamental.__init__(self, w) @@ -186,4 +187,4 @@ class Java(mode.Fundamental): self.add_bindings('close-brace', ('}',)) self.add_bindings('close-bracket', (']',)) -install = Java.install +install = PHP.install diff --git a/mode/python.py b/mode/python.py index 0f699e8..7faecfc 100644 --- a/mode/python.py +++ b/mode/python.py @@ -402,54 +402,6 @@ class PythonBrmFindReferences(method.Method): else: w.set_error('%d references found' % n) -# commenting in python -class PythonCommentRegion(Method): - '''Prepend a comment to every line in the current buffer''' - commentc = '#' - def _execute(self, w, **vargs): - cursor = w.logical_cursor() - if cursor < w.mark: - p1 = cursor - p2 = w.mark - elif w.mark < cursor: - p1 = w.mark - p2 = cursor - else: - w.input_line = "Empty kill region" - return - - x = w.buffer.detect_indent_level(p1.y, p2.y) - for y in range(p1.y, p2.y): - c = self.commentc - if len(w.buffer.lines[y]) < x: - c += ' ' * (x - len(w.buffer.lines[y])) - w.buffer.insert_string(Point(x, y), c) - -class PythonUncommentRegion(Method): - '''Remove a comment from every line in the current buffer''' - commentre = re.compile('^( *)(#+)') - def _execute(self, w, **vargs): - cursor = w.logical_cursor() - if cursor < w.mark: - p1 = cursor - p2 = w.mark - elif w.mark < cursor: - p1 = w.mark - p2 = cursor - else: - w.input_line = "Empty kill region" - return - - x = w.buffer.detect_indent_level(p1.y, p2.y) - for y in range(p1.y, p2.y): - line = w.buffer.lines[y] - m = self.commentre.match(line) - if not m: - continue - s1, s2 = m.groups() - x1, x2 = len(s1), len(s1) + len(s2) - w.buffer.delete(Point(x1, y), Point(x2, y)) - class PythonNameCompleter(completer.Completer): def _get_dict(self, w): return w.buffer.method.old_window.mode.context.get_names() @@ -586,6 +538,7 @@ class Python(mode.Fundamental): opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) closetags = {')': '(', ']': '[', '}': '{'} + commentc = '#' colors = { 'python_keyword': ('cyan', 'default', 'bold'), 'python_reserved': ('magenta', 'default', 'bold'), @@ -605,8 +558,7 @@ class Python(mode.Fundamental): lconfig = { 'ignore-suffix': ['.pyc', '.pyo'], } - actions = [PythonCommentRegion, PythonUncommentRegion, - PythonInitNames, PythonListNames, PythonGotoName, + actions = [PythonInitNames, PythonListNames, PythonGotoName, PythonGotoFunction, PythonGotoClass, PythonCheckSyntax, PythonDictCleanup, PythonSemanticComplete, PythonBrmFindReferences, PythonInsertTripleSquotes, PythonInsertTripleDquotes] diff --git a/mode/rst.py b/mode/rst.py index 0d90a3a..8871ebe 100644 --- a/mode/rst.py +++ b/mode/rst.py @@ -102,9 +102,9 @@ class RST(mode.Fundamental): config = { 'rst.margin': 75, } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('rst-insert-space', ('SPACE',)) - self.add_bindings('rst-wrap-paragraph', ('M-q',)) + _bindings = { + 'rst-insert-space': ('SPACE',), + 'rst-wrap-paragraph': ('M-q',), + } install = RST.install diff --git a/mode/scheme.py b/mode/scheme.py index 378e2f6..511c54c 100644 --- a/mode/scheme.py +++ b/mode/scheme.py @@ -43,6 +43,7 @@ class Scheme(mode.Fundamental): tabwidth = 2 tabbercls = mode.lisp.LispTabber grammar = SchemeGrammar + commentc = ';' opentokens = ('delimiter',) opentags = {'(': ')'} closetokens = ('delimiter',) @@ -54,13 +55,11 @@ class Scheme(mode.Fundamental): 'scheme_number': ('default', 'default', 'bold'), } actions = [SchemeCheckSyntax] - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('scheme-check-syntax', ('C-c s',)) - self.add_bindings('lisp-comment-region', ('C-c #',)) - self.add_bindings('lisp-uncomment-region', ('C-u C-C #',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + 'scheme-check-syntax': ('C-c s',), + } install = Scheme.install diff --git a/mode/sh.py b/mode/sh.py index bfb1357..d53e68b 100644 --- a/mode/sh.py +++ b/mode/sh.py @@ -209,8 +209,8 @@ class Sh(mode.Fundamental): 'neval.end': ('yellow', 'default', 'bold'), } actions = [ShCheckSyntax] - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('sh-check-syntax', ('C-c s',)) + _bindings = { + 'sh-check-syntax': ('C-c s',), + } install = Sh.install diff --git a/mode/sql.py b/mode/sql.py index c71a24d..b6a6c82 100644 --- a/mode/sql.py +++ b/mode/sql.py @@ -1,7 +1,6 @@ import mode, tab from lex import Grammar, PatternRule, NocasePatternRule, RegionRule, NocaseRegionRule from mode.python import StringGrammar1, StringGrammar2 -from method import CommentRegion, UncommentRegion class BitStringGrammar(Grammar): rules = [PatternRule(r'data', r'[01]+')] @@ -60,23 +59,9 @@ sql_rules = [ PlPgSqlGrammar.rules = base_rules + sql_rules + end_rules -#class FunctionGrammar(Grammar): -# rules = base_rules + [ -# PatternRule(r'name', r'[a-zA-Z_][a-zA-Z0-9_]*(?=\()'), -# NocasePatternRule(r'sql_keyword', r'(?:as|returns|language)'), -# sql_type_rule, -# NocasePatternRule(r'language', r'(?<=language ) *[a-zA-Z_][a-zA-Z0-9_]+'), -# RegionRule(r'definition', "'", PlPgSqlGrammar, "'(?!')"), -# ] + end_rules - class SqlGrammar(Grammar): rules = base_rules + function_rules + sql_rules + end_rules -class SqlCommentRegion(CommentRegion): - commentc = '--' -class SqlUncommentRegion(UncommentRegion): - commentc = '--' - class SqlTabber(tab.StackTabber): wst = ('null', 'eol',) def is_base(self, y): @@ -126,26 +111,24 @@ class Sql(mode.Fundamental): extensions = ['.sql'] grammar = SqlGrammar tabbercls = SqlTabber + commentc = '--' opentokens = ('delimiter',) opentags = {'(': ')', '[': ']', '{': '}'} closetokens = ('delimiter',) closetags = {')': '(', ']': '[', '}': '{'} - actions = [SqlCommentRegion, SqlUncommentRegion] - - colors = { - 'sql_operator': ('yellow', 'default', 'bold'), - 'attribute': ('magenta', 'default', 'bold'), - 'sql_keyword': ('cyan', 'default', 'bold'), - 'pseudokeyword': ('cyan', 'default', 'bold'), - 'sql_type': ('green', 'default', 'bold'), - 'sql_builtin': ('yellow', 'default', 'bold'), - 'sql_quoted.start': ('yellow', 'default', 'bold'), - 'sql_quoted.data': ('yellow', 'default', 'bold'), - 'sql_quoted.null': ('yellow', 'default', 'bold'), - 'sql_quoted.end': ('yellow', 'default', 'bold'), - 'sql_variable': ('yellow', 'default', 'bold'), - 'sql_bareword': ('default', 'default', 'bold'), - + colors = { + 'sql_operator': ('yellow', 'default', 'bold'), + 'attribute': ('magenta', 'default', 'bold'), + 'sql_keyword': ('cyan', 'default', 'bold'), + 'pseudokeyword': ('cyan', 'default', 'bold'), + 'sql_type': ('green', 'default', 'bold'), + 'sql_builtin': ('yellow', 'default', 'bold'), + 'sql_quoted.start': ('yellow', 'default', 'bold'), + 'sql_quoted.data': ('yellow', 'default', 'bold'), + 'sql_quoted.null': ('yellow', 'default', 'bold'), + 'sql_quoted.end': ('yellow', 'default', 'bold'), + 'sql_variable': ('yellow', 'default', 'bold'), + 'sql_bareword': ('default', 'default', 'bold'), 'function.start': ('cyan', 'default', 'bold'), 'function.data': ('default', 'default', 'bold'), 'function.null': ('default', 'default', 'bold'), @@ -159,12 +142,12 @@ class Sql(mode.Fundamental): 'function.definition.null': ('magenta', 'default', 'bold'), 'function.definition.end': ('magenta', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - self.add_bindings('sql-comment-region', ('C-c #',)) - self.add_bindings('sql-uncomment-region', ('C-u C-c #',)) + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + 'sql-comment-region': ('C-c #',), + 'sql-uncomment-region': ('C-u C-c #',), + } install = Sql.install diff --git a/mode/tt.py b/mode/tt.py index fae9152..abb8f97 100644 --- a/mode/tt.py +++ b/mode/tt.py @@ -52,10 +52,9 @@ class Template(mode.Fundamental): 'tt_tag.string.end': ('green', 'default', 'bold'), 'tt_tag.end': ('default', 'default', 'bold'), } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('close-paren', (')',)) - self.add_bindings('close-brace', ('}',)) - self.add_bindings('close-bracket', (']',)) - + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), + } install = Template.install diff --git a/mode/xml.py b/mode/xml.py index 71bfb9a..d5069b2 100644 --- a/mode/xml.py +++ b/mode/xml.py @@ -77,8 +77,7 @@ class XML(mode.Fundamental): 'xml_entity': ('magenta', 'default', 'bold'), } actions = [XmlValidate, XmlCreateTag] - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('xml-create-tag', ('M-t',)) - + _bindings = { + 'xml-create-tag': ('M-t',), + } install = XML.install diff --git a/mode/yacc.py b/mode/yacc.py index 701ac86..52e3e54 100644 --- a/mode/yacc.py +++ b/mode/yacc.py @@ -2,6 +2,7 @@ import color, mode, tab from lex import Grammar, PatternRule, RegionRule from mode.c import C, CGrammar, CTabber2 +# ugh _rules = list(CGrammar.rules) _rules.insert(0, PatternRule(r"yacc_directive", r"^%[a-zA-Z_]+")) _rules.insert(1, PatternRule(r"yacc_section", r"%%")) @@ -10,6 +11,7 @@ _rules.insert(3, PatternRule(r"yacc_production", r"^[a-z_]+:")) _rules.insert(4, PatternRule(r"yacc_var", r"\$[0-9\$]")) _rules.insert(5, PatternRule(r"yacc_empty", r"^ +\n$")) +# TODO: don't think we need this anymore class TrueDict(dict): def __contains__(self, k): return True def __getitem__(self, k): return True @@ -23,10 +25,14 @@ class YaccGrammar(CGrammar): rules = _rules class YaccTabber(CTabber2): - open_tokens = {'delimiter': {'{': '}', '(': ')', '[': ']'}, - 'yacc_delimiter': {'%{': '%}'}} - close_tokens = {'delimiter': {'}': '{', ')': '(', ']': '['}, - 'yacc_delimiter': {'%}': '%{'}} + open_tokens = { + 'delimiter': {'{': '}', '(': ')', '[': ']'}, + 'yacc_delimiter': {'%{': '%}'}, + } + close_tokens = { + 'delimiter': {'}': '{', ')': '(', ']': '['}, + 'yacc_delimiter': {'%}': '%{'}, + } control_tokens = {'yacc_production': TrueDict()} scope_tokens = {} end_at_eof = False