basic mode for google's go language

--HG--
branch : pmacs2
This commit is contained in:
Erik Osheim 2009-11-11 17:54:12 -05:00
parent 7e4bcea160
commit 75d354c2f5
2 changed files with 154 additions and 1 deletions

View File

@ -175,7 +175,7 @@ class Application(object):
'xml', 'cheetah', 'colortext', 'latex', 'insertmini', 'conf',
'haskell', 'erlang', 'iperl', 'iperlmini', 'ipython', 'ipythonmini',
'awk', 'shell', 'shellmini', 'fstab', 'yacc', 'pipe', 'mbox',
'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest',
'error', 'lua', 'lily', 'forth', 'ebnf', 'colortest', 'go',
)
for name in names:
exec("import mode.%s; mode.%s.install(self)" % (name, name))

153
mode/go.py Normal file
View File

@ -0,0 +1,153 @@
import os.path
from subprocess import Popen, PIPE, STDOUT
from method.shell import Exec
from mode import Fundamental
import tab
from lex import Grammar, PatternRule, RegionRule, PatternMatchRule, OverridePatternRule
from mode.python import StringGrammar2
from mode.c import CommentGrammar
# TODO: actually handle unicode correctly
# In The Unicode Standard 5.1, Section 4.5 General Category-Normative defines a
# set of character categories. Go treats those characters in category Lu, Ll,
# Lt, Lm, or Lo as Unicode letters, and those in category Nd as Unicode digits.
chr1 = '[a-zA-Z_]'
chr2 = '[a-zA-Z0-9_]'
word = chr1 + chr2 + '*'
class StringGrammar(Grammar):
rules = [
PatternRule('escaped', r'\\[abfnrtv\\\'"]'),
PatternRule('octal', r'\\[0-7]{3}'),
PatternRule('hex', r'\\x[a-fA-F0-9]{2}'),
PatternRule('unicode', r'\\u[a-fA-F0-9]{4}'),
PatternRule('unicode', r'\\U[a-fA-F0-9]{8}'),
PatternRule('illegal', r'\\.*'),
PatternRule('data', r'[^\\"]+'),
]
class RawStringGrammar(Grammar):
rules = [
PatternRule('data', '[^`]+'),
]
class GoGrammar(Grammar):
rules = [
PatternRule('spaces', r' +'),
PatternRule('go.comment', '//.*$'),
RegionRule('go.comment', r'/\*', CommentGrammar, r'\*/'),
PatternRule("delimiter", r"(?:\(|\)|\[|\]|\{|\}|,|;|:=|:|!=|!|&\^=|&\^|\.\.\.|\.|>>=|>>|<<=|<<|%=|%|--|-=|-|\+\+|\+=|\+|==|=|\&\&|\&=|\&|\|\||\|=|\||<-|<=|<|>=|>|\^=|\^|\*=|\*|/=|/)"),
PatternRule('eol', r"\n$"),
PatternMatchRule('', '(func)( +)(' + word + ')', 'go.keyword', 'spaces', 'go.function'),
PatternMatchRule('', '(package)( +)(' + word + ')', 'go.keyword', 'spaces', 'go.package'),
PatternRule('go.keyword', r"(?:var|type|switch|struct|select|return|range|package|map|interface|import|if|goto|go|func|for|fallthrough|else|defer|default|continue|const|chan|case|break)(?!" + chr2 + ")"),
PatternRule('go.predeclared', r'(?:uint64|uint32|uint16|uint8|uintptr|uint|true|string|println|print|panicln|panic|nil|new|make|len|iota|int64|int32|int16|int8|int|float64|float32|float|false|closed|close|cap|byte|bool)(?!' + chr2 + ")"),
PatternRule('go.integer', r'(?:[1-9][0-9]*|0[0-9]*|0[xX][a-fA-F0-9]+)'),
RegionRule('go.char', "'", StringGrammar, "'"),
RegionRule('go.string', '"', StringGrammar, '"'),
RegionRule('go.string', '`', RawStringGrammar, '`'),
]
# white is for delimiters, operators, numbers
default = ('default', 'default')
# magenta is for keywords/builtins
lo_magenta = ('magenta202', 'default')
hi_magenta = ('magenta505', 'default')
# red is for comments
lo_red = ('red300', 'default')
hi_red = ('red511', 'default')
# orange is for macro definitions, headers and constants
hi_orange = ('yellow531', 'default')
lo_orange = ('yellow520', 'default')
# yellow is for parts of macros
hi_yellow = ('yellow551', 'default')
lo_yellow = ('yellow330', 'default')
# green is for strings and characters
lo_green = ('green030', 'default')
hi_green = ('green050', 'default')
# cyan is for types
lo_cyan = ('cyan033', 'default')
hi_cyan = ('cyan155', 'default')
# blue is definitions, functions and some macros
lo_blue = ('blue113', 'default')
hi_blue = ('blue225', 'default')
class Go(Fundamental):
name = 'Go'
grammar = GoGrammar
opentokens = ('delimiter',)
opentags = {'(': ')', '[': ']', '{': '}'}
closetokens = ('delimiter',)
closetags = {')': '(', ']': '[', '}': '{'}
#actions = [CCheckSyntax, CMake]
format = "%(flag)s %(bname)s (%(mname)s) %(indent)s %(cursor)s %(perc)s [%(func)s]"
commentc = '//'
colors = {
'go.comment': hi_red,
'go.comment.start': hi_red,
'go.comment.data': hi_red,
'go.comment.end': hi_red,
'go.char.start': lo_green,
'go.char.end': lo_green,
'go.char.data': hi_green,
'go.char.escaped': hi_magenta,
'go.char.octal': hi_magenta,
'go.char.unicode': hi_magenta,
'go.char.hex': hi_magenta,
'go.string.start': lo_green,
'go.string.end': lo_green,
'go.string.data': hi_green,
'go.string.escaped': hi_magenta,
'go.string.octal': hi_magenta,
'go.string.unicode': hi_magenta,
'go.string.hex': hi_magenta,
'go.package': hi_magenta,
'go.predeclared': hi_magenta,
'go.keyword': hi_cyan,
}
#config = {
# 'go.syntax-cmd': "gcc -x c -fsyntax-only %(path)s",
# 'go.syntax-rel-dir': False,
# 'go.make-cmd': "make",
# 'go.make-rel-dir': True,
#}
#lconfig = {
# 'ignore_suffix': ['.o'],
#}
#_bindings = {
# 'close-paren': (')',),
# 'close-brace': ('}',),
# 'close-bracket': (']',),
# 'c-check-syntax': ('C-c s',),
# 'c-make': ('C-c C-c',),
#}
#
#def get_functions(self): return {}
#def get_function_names(self): return []
#def get_line_function(self, y): return None
#def get_status_names(self):
# names = Fundamental.get_status_names(self)
# c = self.window.logical_cursor()
# names['func'] = self.get_line_function(c.y)
# return names
install = Go.install