diff --git a/mode/mutt.py b/mode/mutt.py index 6e4a413..8fd32d2 100644 --- a/mode/mutt.py +++ b/mode/mutt.py @@ -44,10 +44,10 @@ class Mutt(mode.Fundamental): config = { 'mutt.margin': 72, } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('learn-word', ('C-c l',)) - self.add_bindings('mutt-wrap-paragraph', ('M-q',)) - self.add_bindings('mutt-insert-space', ('SPACE',)) + _bindings = { + 'learn-word': ('C-c l',), + 'mutt-wrap-paragraph': ('M-q',), + 'mutt-insert-space': ('SPACE',), + } install = Mutt.install diff --git a/mode/nasm.py b/mode/nasm.py index 9d451d3..81a7f2c 100644 --- a/mode/nasm.py +++ b/mode/nasm.py @@ -1,28 +1,29 @@ import color, mode -from lex import Grammar, PatternRule, RegionRule +from lex import Grammar, PatternRule, RegionRule, PatternMatchRule +from mode.python import StringGrammar1, StringGrammar2, StringGrammar3, StringGrammar4 -class StringGrammar(Grammar): - rules = [ - PatternRule(r'octal', r'\\[0-7]{3}'), - PatternRule(r'escaped', r'\\.'), - ] +chr1 = '[a-zA-Z_.?]' +chr2 = '[a-zA-Z0-9_.?$#@~]' +word = chr1 + chr2 + '*' class NasmGrammar(Grammar): rules = [ - PatternRule(r'nasm_keyword', r"(?:section|global|extern)(?![a-zA-Z_])"), - PatternRule(r'macros', r"%(?:define|undef|assign|strlen|macro|endmacro|if|elif|else|endif|ifdef|ifndef|include|push|pop|stacksize)(?![a-zA-Z_])"), - PatternRule(r'instructions', r"(?:jeq|jne|ja|jmp|push|pushad|pushfd|call|ret|sub|add|pop|popa|popad|popfd|call|and|cwd|cdq|cmp|cmpxchg|cpuid|div|divpd|enter|leave|fadd|fld|fmul|fsqrt|fsub|hlt|imul|inc|int|int3|lea|mov|movd|mul|neg|not|nop|or|sal|sar|shl|shr|shld|shrd|syscall|sysenter|sysexit|test|xchg|xadd|xor)(?![a-zA-Z_])"), - PatternRule(r'registers', r"(?:eax|ax|ah|al|ebx|bx|bh|bl|ecx|cx|ch|cl|esi|edi|esp|ebp)(?![a-zA-Z_])"), - PatternRule(r'prefix', r"(?:dword|word|lock)(?![a-zA-Z_])"), - PatternRule(r'nasm_label', r"[a-zA-Z_.][a-zA-Z0-9_.]*:"), - PatternRule(r"identifier", r"[a-zA-Z_][a-zA-Z0-9_]*"), - PatternRule(r"integer", r"(0|[1-9][0-9]*|0[0-7]+|0[xX][0-9a-fA-F]+)[lL]?"), - PatternRule(r"float", r"[0-9]+\.[0-9]*|\.[0-9]+|([0-9]|[0-9]+\.[0-9]*|\.[0-9]+)[eE][\+-]?[0-9]+"), - RegionRule(r'string', r'"""', StringGrammar, r'"""'), - RegionRule(r'string', r"'''", StringGrammar, r"'''"), - RegionRule(r'string', r'"', StringGrammar, r'"'), - RegionRule(r'string', r"'", StringGrammar, r"'"), - PatternRule(r'comment', r';.*$'), + PatternRule('continuation', r'\\\n$'), + PatternRule('nasm_keyword', "(?:section|global|extern)(?!" + chr2 + ")"), + PatternRule('macros', "%(?:define|undef|assign|strlen|macro|endmacro|if|elif|else|endif|ifdef|ifndef|include|push|pop|stacksize)(?!" + chr2 + ")"), + PatternRule('instructions', "(?:jeq|jne|ja|jmp|push|pushad|pushfd|call|ret|sub|add|pop|popa|popad|popfd|call|and|cwd|cdq|cmp|cmpxchg|cpuid|div|divpd|enter|leave|fadd|fld|fmul|fsqrt|fsub|hlt|imul|inc|int|int3|lea|mov|movd|mul|neg|not|nop|or|sal|sar|shl|shr|shld|shrd|syscall|sysenter|sysexit|test|xchg|xadd|xor)(?!" + chr2 + ")"), + PatternRule('registers', "(?:eax|ax|ah|al|ebx|bx|bh|bl|ecx|cx|ch|cl|esi|edi|esp|ebp)(?!" + chr2 + ")"), + PatternRule('prefix', "(?:dword|word|lock)(?!" + chr2 + ")"), + PatternMatchRule('x', '(' + word + ')(:)', 'nasm_label', 'delimiter'), + #PatternRule('nasm_label', word + ":"), + PatternRule("identifier", r'\$?' + word), + PatternRule("integer", "(0|[1-9][0-9]*|0[0-7]+|0[xX][0-9a-fA-F]+)[lL]?"), + PatternRule("float", r"[0-9]+\.[0-9]*|\.[0-9]+|([0-9]|[0-9]+\.[0-9]*|\.[0-9]+)[eE][\+-]?[0-9]+"), + RegionRule('string', "'''", StringGrammar3, "'''"), + RegionRule('string', '"""', StringGrammar4, '"""'), + RegionRule('string', "'", StringGrammar1, "'"), + RegionRule('string', '"', StringGrammar2, '"'), + PatternRule('comment', ';.*$'), ] class Nasm(mode.Fundamental): diff --git a/mode/ocaml.py b/mode/ocaml.py index 4211f82..9572628 100644 --- a/mode/ocaml.py +++ b/mode/ocaml.py @@ -11,9 +11,12 @@ class StringGrammar(Grammar): PatternRule(r'hex', r'\\x[0-9A-Fa-f]{2}'), ] +#class CommentGrammar(Grammar): +# rules = [] +#CommentGrammar.rules.append(RegionRule(r'comment', r'\(\*', CommentGrammar, r'\*\)')) + class CommentGrammar(Grammar): - rules = [] -CommentGrammar.rules.append(RegionRule(r'comment', r'\(\*', CommentGrammar, r'\*\)')) + rules = [RegionRule(r'comment', r'\(\*', None, r'\*\)')] class OcamlGrammar(Grammar): rules = [ diff --git a/mode/php.py b/mode/php.py index 8cdcef1..db34a84 100644 --- a/mode/php.py +++ b/mode/php.py @@ -1,7 +1,6 @@ -import color, mode, tab +from mode import Fundamental from lex import Grammar, PatternRule, RegionRule from mode.python import StringGrammar -#from mode.c import CTabber class PHPGrammar(Grammar): rules = [ @@ -35,132 +34,7 @@ class PHPGrammar(Grammar): PatternRule(r"eol", r"\n$"), ] -#class JavaTabber(CTabber): -# def is_base(self, y): -# if y == 0: -# return True -# -# highlighter = self.mode.window.buffer.highlights[self.mode.name] -# if not highlighter.tokens[y]: -# return False -# -# for t in highlighter.tokens[y]: -# if t.name == 'null': -# pass -# elif t.name == 'keyword': -# if t.string in ('class', 'interface'): -# return True -# elif t.string in ('public', 'private', 'protected', 'static', -# 'final', 'native', 'synchronized', 'abstract', -# 'threadsafe', 'transient'): -# pass -# else: -# return False -# else: -# return False -# -# return False -# -# # detecting function declarations is annoying; this assumes that people -# # won't put a variable type and name on different lines, but that they -# # might do that for function return type and name. -# # -# # unfortunately, valid function return types might include any of the -# # four types of tokens below -# decl = False -# for t in highlighter.tokens[y]: -# if t.name in ('keyword', 'identifier', 'structname', 'enumname'): -# decl = True -# continue -# if decl and t.name == 'function': -# break -# else: -# decl = False -# break -# if decl: -# return True -# -# return False -# -# def _handle_open_token(self, currlvl, y, i): -# self._opt_pop('cont') -# token = self.get_token(y, i) -# if token.string == '{': -# self._opt_pop('cond') -# currlvl = tab.StackTabber._handle_open_token(self, currlvl, y, i) -# return currlvl -# def _handle_close_token(self, currlvl, y, i): -# w = self.mode.tabwidth -# self._opt_pop('cont') -# currlvl = tab.StackTabber._handle_close_token(self, currlvl, y, i) -# token = self.get_token(y, i) -# if self.is_rightmost_token(y, i): -# if token.string == '}': -# self._opt_pop('cond') -# self._opt_pop('cont') -# elif self._peek_name() == 'cond': -# pass -# else: -# self._opt_append('cont', currlvl + w) -# return currlvl -# def _handle_other_token(self, currlvl, y, i): -# w = self.mode.tabwidth -# token = self.get_token(y, i) -# fqname = token.fqname() -# if fqname == 'delimiter' and token.string == ';': -# self._opt_pop('cond') -# self._opt_pop('cont') -# self._opt_pop('cond') -# -# elif fqname == 'keyword': -# if token.string in ('do', 'else', 'for', 'if', 'while'): -# self._append('cond', currlvl + w) -# elif token.string == 'break': -# self._opt_pop('case', 'while', 'for') -# elif token.string == 'continue': -# self._opt_pop('while', 'for') -# elif token.string == 'case': -# self._opt_pop('case') -# currlvl = self.get_curr_level() -# self._opt_append('case', currlvl + w) -# -# elif fqname == 'string.start': -# self._opt_append('string', None) -# elif fqname == 'string.end': -# self._opt_pop('string') -# if self.is_rightmost_token(y, i): -# self._opt_append('cont', currlvl + w) -# -# # TODO: this could be a lot better -# elif fqname == 'macro': -# currlvl = 0 -# elif fqname.startswith('macro.start'): -# self._opt_append('macro', None) -# currlvl = 0 -# elif fqname.startswith('macro.end'): -# self._opt_pop('macro', None) -# -# elif fqname.startswith('macroblock.start'): -# self._opt_append('macroblock', None) -# currlvl = 0 -# elif fqname.startswith('macroblock.end'): -# self._opt_pop('macroblock', None) -# -# if self.is_rightmost_token(y, i): -# if self._has_markers() and self._peek_name() == 'cond': -# pass -# elif(not fqname.startswith('string') and -# not fqname.startswith('comment') and -# not fqname.startswith('macro') and -# not fqname == 'delimiter' and -# not fqname == 'header' and -# not fqname == 'null' and -# not fqname == 'eol' and -# token.string not in ('}', ';', '(', '{', '[', ',')): -# self._opt_append('cont', currlvl + w) -# return currlvl - -class PHP(mode.Fundamental): +class PHP(Fundamental): name = 'PHP' extensions = ['.php'] #tabbercls = JavaTabber @@ -175,14 +49,19 @@ class PHP(mode.Fundamental): 'doccomment.end': ('red', 'default', 'bold'), 'doccomment.null': ('red', 'default', 'bold'), 'import': ('blue', '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'), + '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'), + } + _bindings = { + 'close-paren': (')',), + 'close-brace': ('}',), + 'close-bracket': (']',), } def __init__(self, w): - mode.Fundamental.__init__(self, w) + Fundamental.__init__(self, w) self.add_bindings('close-paren', (')',)) self.add_bindings('close-brace', ('}',)) self.add_bindings('close-bracket', (']',)) diff --git a/mode/replace.py b/mode/replace.py index 3b5e830..2ac9a8d 100644 --- a/mode/replace.py +++ b/mode/replace.py @@ -1,11 +1,11 @@ -import re, string - -import color, method, minibuffer, mode, searchutil -from point import Point +import re +from method import Method +from mode import Fundamental +import minibuffer, searchutil subgroup_re = re.compile(r'((?:\\\\)*)\\(0|[1-9][0-9]*)') -class ReplaceOne(method.Method): +class ReplaceOne(Method): 'In a replace command, replace the next occurance' def execute(self, w, **vargs): m = w.buffer.method @@ -13,7 +13,7 @@ class ReplaceOne(method.Method): _find_next(m, False) _finish(m, w) -class ReplaceDone(method.Method): +class ReplaceDone(Method): 'In a replace command, replace the next occurance and exit' def execute(self, w, **vargs): m = w.buffer.method @@ -21,14 +21,14 @@ class ReplaceDone(method.Method): _end(w) w.set_error("Replace done") -class SkipReplace(method.Method): +class SkipReplace(Method): 'In a replace command, skip the next occurance' def execute(self, w, **vargs): m = w.buffer.method _find_next(m, True) _finish(m, w) -class ReplaceAll(method.Method): +class ReplaceAll(Method): 'In a replace command, replace all remaining occurances' def execute(self, w, **vargs): m = w.buffer.method @@ -38,7 +38,7 @@ class ReplaceAll(method.Method): _end(w) w.set_error("Replace ended") -class CancelReplace(method.Method): +class CancelReplace(Method): 'Cancel a currently running replace command' def execute(self, w, **vargs): _end(w) @@ -137,11 +137,11 @@ def _end(w): w.buffer.method.old_window = None assert not w.application.mini_active -class Replace(mode.Fundamental): +class Replace(Fundamental): name = 'Replace' actions = [ReplaceAll, ReplaceDone, ReplaceOne, SkipReplace, CancelReplace] def __init__(self, w): - mode.Fundamental.__init__(self, w) + Fundamental.__init__(self, w) self.actions = {} self.bindings = {} diff --git a/mode/search.py b/mode/search.py index e9227c7..bc1acf9 100644 --- a/mode/search.py +++ b/mode/search.py @@ -1,7 +1,7 @@ import re, string - -import color, method, minibuffer, mode, searchutil -from point import Point +import method, minibuffer, searchutil +from method import Method +from mode import Fundamental selected_color = 'magenta' unselected_color = 'yellow' @@ -19,7 +19,7 @@ def _make_regex(w, s): except: raise searchutil.IllegalPatternError("failed to compile: %r" % s) -class SearchNext(method.Method): +class SearchNext(Method): 'In a search command, move to the next occurance' def execute(self, w, **vargs): w.buffer.method.direction = 'next' @@ -34,7 +34,7 @@ class SearchNext(method.Method): action = InsertSearchString(w.application.last_search) action.execute(w) -class SearchPrevious(method.Method): +class SearchPrevious(Method): 'In a search command, move to the previous occurance' def execute(self, w, **vargs): w.buffer.method.direction = 'previous' @@ -49,7 +49,7 @@ class SearchPrevious(method.Method): except searchutil.IllegalPatternError: w.application.clear_highlighted_ranges('search') -class EndSearch(method.Method): +class EndSearch(Method): 'End the current search command, leaving the cursor in place' def execute(self, w, **vargs): old_w = w.buffer.method.old_window @@ -58,18 +58,18 @@ class EndSearch(method.Method): old_w.set_mark_point(old_c) w.set_error("Mark set to search start") -class CancelSearch(method.Method): +class CancelSearch(Method): 'End the current search command, restoring the cursor to the search start' def execute(self, w, **vargs): w.buffer.method.old_window.goto(w.buffer.method.old_cursor) _end(w) w.set_error("Search cancelled") -class SearchDeleteLeft(method.Method): +class SearchDeleteLeft(Method): def execute(self, w, **vargs): w.left_delete() _post_delete(w) -class SearchDeleteLeftWord(method.Method): +class SearchDeleteLeftWord(Method): def execute(self, w, **vargs): w.delete_left_word() _post_delete(w) @@ -91,7 +91,7 @@ def _post_delete(w): except searchutil.IllegalPatternError: w.application.clear_highlighted_ranges('search') -class InsertSearchString(method.Method): +class InsertSearchString(Method): def __init__(self, s): self.name = 'insert-search-string-%s' % (s) self.string = s @@ -119,12 +119,12 @@ def _end(w): w.application.clear_highlighted_ranges('search') w.application.last_search = w.buffer.make_string() -class Search(mode.Fundamental): +class Search(Fundamental): name = 'Search' actions = [SearchNext, SearchPrevious, EndSearch, CancelSearch, SearchDeleteLeft, SearchDeleteLeftWord] def __init__(self, w): - mode.Fundamental.__init__(self, w) + Fundamental.__init__(self, w) # clear out all the defaults that we don't want/need, and add ours self.actions = {} diff --git a/mode/sh.py b/mode/sh.py index dd08ab0..bb4a99e 100644 --- a/mode/sh.py +++ b/mode/sh.py @@ -1,5 +1,6 @@ import commands -import color, mode, tab +from tab import StackTabber +from mode import Fundamental from lex import Grammar, PatternRule, RegionRule, PatternMatchRule, OverridePatternRule from method import Method @@ -129,7 +130,7 @@ ShGrammar.rules = [ PatternRule(r'eol', r'\n$'), ] -class ShTabber(tab.StackTabber): +class ShTabber(StackTabber): def is_base(self, y): if y == 0: return True @@ -144,7 +145,7 @@ class ShTabber(tab.StackTabber): # we have to ignore ) when used in "case" statements. return currlvl else: - return tab.StackTabber._handle_close_token(self, currlvl, y, i) + return StackTabber._handle_close_token(self, currlvl, y, i) def _handle_other_token(self, currlvl, y, i): w = self.mode.tabwidth token = self.get_token(y, i) @@ -169,7 +170,7 @@ class ShCheckSyntax(Method): else: app.data_buffer("*Sh-Check-Syntax*", output) -class Sh(mode.Fundamental): +class Sh(Fundamental): name = 'sh' paths = ['/etc/profile'] basenames = ['.bashrc', '.bash_profile', '.profile'] diff --git a/mode/shell.py b/mode/shell.py index 4b4ca6e..abdfd84 100644 --- a/mode/shell.py +++ b/mode/shell.py @@ -1,4 +1,4 @@ -import color, mode +from mode import Fundamental from lex import Grammar, PatternRule, RegionRule from mode.sh import ShGrammar @@ -7,7 +7,7 @@ class ShellGrammar(Grammar): PatternRule(r'shell_input', r'^>>>.*$'), PatternRule(r'shell_mesg', r'^===.*$'), ] -class Shell(mode.Fundamental): +class Shell(Fundamental): name = 'Shell' grammar = ShellGrammar() colors = { diff --git a/mode/sql.py b/mode/sql.py index c5c2ee5..bd0e96d 100644 --- a/mode/sql.py +++ b/mode/sql.py @@ -1,4 +1,5 @@ -import mode, tab +from tab import StackTabber +from mode import Fundamental from lex import Grammar, PatternRule, NocasePatternRule, RegionRule, NocaseRegionRule, OverridePatternRule from mode.python import StringGrammar1, StringGrammar2 @@ -81,7 +82,7 @@ PlPgSqlGrammar2.rules = [ class SqlGrammar(Grammar): rules = base_rules + function_rules + sql_rules + string_rules + end_rules -class SqlTabber(tab.StackTabber): +class SqlTabber(StackTabber): wst = ('spaces', 'null', 'eol', 'function.body.spaces', 'function.body.eol') st = ('spaces', 'null', 'function.body.spaces') def is_base(self, y): @@ -144,7 +145,7 @@ class SqlTabber(tab.StackTabber): return currlvl -class Sql(mode.Fundamental): +class Sql(Fundamental): name = 'Sql' extensions = ['.sql'] grammar = SqlGrammar diff --git a/mode/text.py b/mode/text.py index 2ebafc9..2bee8a7 100644 --- a/mode/text.py +++ b/mode/text.py @@ -1,4 +1,5 @@ -import color, mode, method, ispell +import mode, method, ispell +from mode import Fundamental from lex import Token, Rule, PatternRule, RegionRule, Grammar class WordRule(PatternRule): @@ -71,7 +72,7 @@ class LearnWord(method.Method): w.insert_string_at_cursor(' ') w.left_delete() -class Text(mode.Fundamental): +class Text(Fundamental): name = 'Text' extensions = ['.txt'] grammar = TextGrammar @@ -79,10 +80,10 @@ class Text(mode.Fundamental): config = { 'text.margin': 78, } - def __init__(self, w): - mode.Fundamental.__init__(self, w) - self.add_bindings('learn-word', ('C-c l',)) - self.add_bindings('text-insert-space', ('SPACE',)) - self.add_bindings('text-wrap-paragraph', ('M-q',)) + _bindings = { + 'learn-word': ('C-c l',), + 'text-insert-space': ('SPACE',), + 'text-wrap-paragraph': ('M-q',), + } install = Text.install