basic mode for google's go language
--HG-- branch : pmacs2
This commit is contained in:
parent
7e4bcea160
commit
75d354c2f5
|
@ -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))
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue