Skip to content

Instantly share code, notes, and snippets.

@ynkdir
Last active December 14, 2015 03:19
Show Gist options
  • Save ynkdir/5019859 to your computer and use it in GitHub Desktop.
Save ynkdir/5019859 to your computer and use it in GitHub Desktop.
vimlparser.py
call extend(s:, vimlparser#import())
let s:PythonCompiler = {}
function s:PythonCompiler.new(...)
let obj = copy(self)
call call(obj.__init__, a:000, obj)
return obj
endfunction
function s:PythonCompiler.__init__()
let self.indent = ['']
let self.lines = []
endfunction
function s:PythonCompiler.out(...)
if len(a:000) == 1
if a:000[0] =~ '^)\+$'
let self.lines[-1] .= a:000[0]
else
call add(self.lines, self.indent[0] . a:000[0])
endif
else
call add(self.lines, self.indent[0] . call('printf', a:000))
endif
endfunction
function s:PythonCompiler.emptyline()
call add(self.lines, '')
endfunction
function s:PythonCompiler.incindent(s)
call insert(self.indent, self.indent[0] . a:s)
endfunction
function s:PythonCompiler.decindent()
call remove(self.indent, 0)
endfunction
function s:PythonCompiler.compile(node)
if a:node.type == 'TOPLEVEL'
return self.compile_toplevel(a:node)
elseif a:node.type == 'COMMENT'
return self.compile_comment(a:node)
elseif a:node.type == 'EXCMD'
return self.compile_excmd(a:node)
elseif a:node.type == 'FUNCTION'
return self.compile_function(a:node)
elseif a:node.type == 'DELFUNCTION'
return self.compile_delfunction(a:node)
elseif a:node.type == 'RETURN'
return self.compile_return(a:node)
elseif a:node.type == 'EXCALL'
return self.compile_excall(a:node)
elseif a:node.type == 'LET'
return self.compile_let(a:node)
elseif a:node.type == 'UNLET'
return self.compile_unlet(a:node)
elseif a:node.type == 'LOCKVAR'
return self.compile_lockvar(a:node)
elseif a:node.type == 'UNLOCKVAR'
return self.compile_unlockvar(a:node)
elseif a:node.type == 'IF'
return self.compile_if(a:node)
elseif a:node.type == 'WHILE'
return self.compile_while(a:node)
elseif a:node.type == 'FOR'
return self.compile_for(a:node)
elseif a:node.type == 'CONTINUE'
return self.compile_continue(a:node)
elseif a:node.type == 'BREAK'
return self.compile_break(a:node)
elseif a:node.type == 'TRY'
return self.compile_try(a:node)
elseif a:node.type == 'THROW'
return self.compile_throw(a:node)
elseif a:node.type == 'ECHO'
return self.compile_echo(a:node)
elseif a:node.type == 'ECHON'
return self.compile_echon(a:node)
elseif a:node.type == 'ECHOHL'
return self.compile_echohl(a:node)
elseif a:node.type == 'ECHOMSG'
return self.compile_echomsg(a:node)
elseif a:node.type == 'ECHOERR'
return self.compile_echoerr(a:node)
elseif a:node.type == 'EXECUTE'
return self.compile_execute(a:node)
elseif a:node.type == 'CONDEXP'
return self.compile_condexp(a:node)
elseif a:node.type == 'LOGOR'
return self.compile_logor(a:node)
elseif a:node.type == 'LOGAND'
return self.compile_logand(a:node)
elseif a:node.type == 'EQEQQ'
return self.compile_eqeqq(a:node)
elseif a:node.type == 'EQEQH'
return self.compile_eqeqh(a:node)
elseif a:node.type == 'NOTEQQ'
return self.compile_noteqq(a:node)
elseif a:node.type == 'NOTEQH'
return self.compile_noteqh(a:node)
elseif a:node.type == 'GTEQQ'
return self.compile_gteqq(a:node)
elseif a:node.type == 'GTEQH'
return self.compile_gteqh(a:node)
elseif a:node.type == 'LTEQQ'
return self.compile_lteqq(a:node)
elseif a:node.type == 'LTEQH'
return self.compile_lteqh(a:node)
elseif a:node.type == 'EQTILDQ'
return self.compile_eqtildq(a:node)
elseif a:node.type == 'EQTILDH'
return self.compile_eqtildh(a:node)
elseif a:node.type == 'NOTTILDQ'
return self.compile_nottildq(a:node)
elseif a:node.type == 'NOTTILDH'
return self.compile_nottildh(a:node)
elseif a:node.type == 'GTQ'
return self.compile_gtq(a:node)
elseif a:node.type == 'GTH'
return self.compile_gth(a:node)
elseif a:node.type == 'LTQ'
return self.compile_ltq(a:node)
elseif a:node.type == 'LTH'
return self.compile_lth(a:node)
elseif a:node.type == 'EQEQ'
return self.compile_eqeq(a:node)
elseif a:node.type == 'NOTEQ'
return self.compile_noteq(a:node)
elseif a:node.type == 'GTEQ'
return self.compile_gteq(a:node)
elseif a:node.type == 'LTEQ'
return self.compile_lteq(a:node)
elseif a:node.type == 'EQTILD'
return self.compile_eqtild(a:node)
elseif a:node.type == 'NOTTILD'
return self.compile_nottild(a:node)
elseif a:node.type == 'GT'
return self.compile_gt(a:node)
elseif a:node.type == 'LT'
return self.compile_lt(a:node)
elseif a:node.type == 'ISQ'
return self.compile_isq(a:node)
elseif a:node.type == 'ISH'
return self.compile_ish(a:node)
elseif a:node.type == 'ISNOTQ'
return self.compile_isnotq(a:node)
elseif a:node.type == 'ISNOTH'
return self.compile_isnoth(a:node)
elseif a:node.type == 'IS'
return self.compile_is(a:node)
elseif a:node.type == 'ISNOT'
return self.compile_isnot(a:node)
elseif a:node.type == 'ADD'
return self.compile_add(a:node)
elseif a:node.type == 'SUB'
return self.compile_sub(a:node)
elseif a:node.type == 'CONCAT'
return self.compile_concat(a:node)
elseif a:node.type == 'MUL'
return self.compile_mul(a:node)
elseif a:node.type == 'DIV'
return self.compile_div(a:node)
elseif a:node.type == 'MOD'
return self.compile_mod(a:node)
elseif a:node.type == 'NOT'
return self.compile_not(a:node)
elseif a:node.type == 'PLUS'
return self.compile_plus(a:node)
elseif a:node.type == 'MINUS'
return self.compile_minus(a:node)
elseif a:node.type == 'INDEX'
return self.compile_index(a:node)
elseif a:node.type == 'SLICE'
return self.compile_slice(a:node)
elseif a:node.type == 'DOT'
return self.compile_dot(a:node)
elseif a:node.type == 'CALL'
return self.compile_call(a:node)
elseif a:node.type == 'NUMBER'
return self.compile_number(a:node)
elseif a:node.type == 'STRING'
return self.compile_string(a:node)
elseif a:node.type == 'LIST'
return self.compile_list(a:node)
elseif a:node.type == 'DICT'
return self.compile_dict(a:node)
elseif a:node.type == 'NESTING'
return self.compile_nesting(a:node)
elseif a:node.type == 'OPTION'
return self.compile_option(a:node)
elseif a:node.type == 'IDENTIFIER'
return self.compile_identifier(a:node)
elseif a:node.type == 'ENV'
return self.compile_env(a:node)
elseif a:node.type == 'REG'
return self.compile_reg(a:node)
else
throw self.err('Compiler: unknown node: %s', string(a:node))
endif
endfunction
function s:PythonCompiler.compile_body(body)
let empty = 1
for node in a:body
call self.compile(node)
if node.type != 'COMMENT'
let empty = 0
endif
endfor
if empty
call self.out('pass')
endif
endfunction
function s:PythonCompiler.compile_toplevel(node)
call self.compile_body(a:node.body)
return self.lines
endfunction
function s:PythonCompiler.compile_comment(node)
call self.out('#%s', a:node.str)
endfunction
function s:PythonCompiler.compile_excmd(node)
throw 'NotImplemented: excmd'
endfunction
function s:PythonCompiler.compile_function(node)
let name = self.compile(a:node.name)
if !empty(a:node.args) && a:node.args[-1] == '...'
let a:node.args[-1] = '*a000'
endif
if name =~ '^\(VimLParser\|ExprTokenizer\|ExprParser\|LvalueParser\|StringReader\|Compiler\)\.'
let name = matchstr(name, '\.\zs.*')
if name == 'new'
return
endif
call insert(a:node.args, 'self')
call self.incindent(' ')
call self.out('def %s(%s):', name, join(a:node.args, ', '))
call self.incindent(' ')
call self.compile_body(a:node.body)
call self.decindent()
call self.decindent()
else
call self.out('def %s(%s):', name, join(a:node.args, ', '))
call self.incindent(' ')
call self.compile_body(a:node.body)
call self.decindent()
endif
call self.emptyline()
endfunction
function s:PythonCompiler.compile_delfunction(node)
throw 'NotImplemented: delfunction'
endfunction
function s:PythonCompiler.compile_return(node)
if a:node.arg is s:NIL
call self.out('return')
else
call self.out('return %s', self.compile(a:node.arg))
endif
endfunction
function s:PythonCompiler.compile_excall(node)
call self.out('%s', self.compile(a:node.expr))
endfunction
function s:PythonCompiler.compile_let(node)
let args = map(a:node.lhs.args, 'self.compile(v:val)')
if a:node.lhs.rest isnot s:NIL
call add(args, '*' . self.compile, a:node.lhs.rest)
endif
let op = a:node.op
if op == '.='
let op = '+='
endif
let lhs = join(args, ', ')
let rhs = self.compile(a:node.rhs)
if lhs == 'LvalueParser'
call self.out('class LvalueParser(ExprParser):')
elseif lhs =~ '^\(VimLParser\|ExprTokenizer\|ExprParser\|LvalueParser\|StringReader\|Compiler\)$'
call self.out('class %s:', lhs)
elseif lhs =~ '^\(VimLParser\|ExprTokenizer\|ExprParser\|LvalueParser\|StringReader\|Compiler\)\.$'
let lhs = matchstr(name, '\.\zs.*')
call self.incindent(' ')
call self.out('%s %s %s', lhs, op. rhs)
call self.decindent()
else
call self.out('%s %s %s', lhs, op, rhs)
endif
endfunction
function s:PythonCompiler.compile_unlet(node)
let args = map(a:node.args, 'self.compile(v:val)')
call self.out('del %s', join(args, ', '))
endfunction
function s:PythonCompiler.compile_lockvar(node)
throw 'NotImplemented: lockvar'
endfunction
function s:PythonCompiler.compile_unlockvar(node)
throw 'NotImplemented: unlockvar'
endfunction
function s:PythonCompiler.compile_if(node)
call self.out('if %s:', self.compile(a:node.cond))
call self.incindent(' ')
call self.compile_body(a:node.body)
call self.decindent()
for node in a:node.elseif
call self.out('elif %s:', self.compile(node.cond))
call self.incindent(' ')
call self.compile_body(node.body)
call self.decindent()
endfor
if a:node.else isnot s:NIL
call self.out('else:')
call self.incindent(' ')
call self.compile_body(a:node.else.body)
call self.decindent()
endif
endfunction
function s:PythonCompiler.compile_while(node)
call self.out('while %s:', self.compile(a:node.cond))
call self.incindent(' ')
call self.compile_body(a:node.body)
call self.decindent()
endfunction
function s:PythonCompiler.compile_for(node)
let args = map(a:node.lhs.args, 'self.compile(v:val)')
if a:node.lhs.rest isnot s:NIL
call add(args, '*' . self.compile(a:node.lhs.rest))
endif
let lhs = join(args, ', ')
let rhs = self.compile(a:node.rhs)
call self.out('for %s in %s:', lhs, rhs)
call self.incindent(' ')
call self.compile_body(a:node.body)
call self.decindent()
endfunction
function s:PythonCompiler.compile_continue(node)
call self.out('continue')
endfunction
function s:PythonCompiler.compile_break(node)
call self.out('break')
endfunction
function s:PythonCompiler.compile_try(node)
call self.out('try:')
call self.incindent(' ')
call self.compile_body(a:node.body)
call self.decindent()
for node in a:node.catch
if node.pattern isnot s:NIL
call self.out('except:')
call self.incindent(' ')
call self.compile_body(node.body)
call self.decindent()
else
call self.out('except:')
call self.incindent(' ')
call self.compile_body(node.body)
call self.decindent()
endif
endfor
if a:node.finally isnot s:NIL
call self.out('finally:')
call self.incindent(' ')
call self.compile_body(a:node.finally.body)
call self.decindent()
endif
endfunction
function s:PythonCompiler.compile_throw(node)
call self.out('raise Exception(%s)', self.compile(a:node.arg))
endfunction
function s:PythonCompiler.compile_echo(node)
let args = map(a:node.args, 'self.compile(v:val)')
call self.out('print(%s)', join(args, ', '))
endfunction
function s:PythonCompiler.compile_echon(node)
let args = map(a:node.args, 'self.compile(v:val)')
call self.out('print(%s)', join(args, ', '))
endfunction
function s:PythonCompiler.compile_echohl(node)
throw 'NotImplemented: echohl'
endfunction
function s:PythonCompiler.compile_echomsg(node)
let args = map(a:node.args, 'self.compile(v:val)')
call self.out('print(%s)', join(args, ', '))
endfunction
function s:PythonCompiler.compile_echoerr(node)
let args = map(a:node.args, 'self.compile(v:val)')
call self.out('raise Exception([%s]))', join(args, ', '))
endfunction
function s:PythonCompiler.compile_execute(node)
throw 'NotImplemented: execute'
endfunction
function s:PythonCompiler.compile_condexp(node)
return printf('%s if %s else %s', self.compile(a:node.then), self.compile(a:node.cond), self.compile(a:node.else))
endfunction
function s:PythonCompiler.compile_logor(node)
return printf('%s or %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_logand(node)
return printf('%s and %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_eqeqq(node)
return printf('%s.lower() == %s.lower()', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_eqeqh(node)
return printf('%s == %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_noteqq(node)
return printf('%s.lower() != %s.lower()', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_noteqh(node)
return printf('%s != %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_gteqq(node)
throw 'NotImplemented: >=?'
endfunction
function s:PythonCompiler.compile_gteqh(node)
throw 'NotImplemented: >=#'
endfunction
function s:PythonCompiler.compile_lteqq(node)
throw 'NotImplemented: <=?'
endfunction
function s:PythonCompiler.compile_lteqh(node)
throw 'NotImplemented: <=#'
endfunction
function s:PythonCompiler.compile_eqtildq(node)
return printf('viml_eqregq(%s, %s)', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_eqtildh(node)
return printf('viml_eqregh(%s, %s)', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_nottildq(node)
return printf('not viml_eqregq(%s, %s, flags=re.IGNORECASE)', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_nottildh(node)
return printf('not viml_eqregh(%s, %s)', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_gtq(node)
throw 'NotImplemented: >?'
endfunction
function s:PythonCompiler.compile_gth(node)
throw 'NotImplemented: >#'
endfunction
function s:PythonCompiler.compile_ltq(node)
throw 'NotImplemented: <?'
endfunction
function s:PythonCompiler.compile_lth(node)
throw 'NotImplemented: <#'
endfunction
function s:PythonCompiler.compile_eqeq(node)
return printf('%s == %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_noteq(node)
return printf('%s != %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_gteq(node)
return printf('%s >= %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_lteq(node)
return printf('%s <= %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_eqtild(node)
return printf('viml_eqreg(%s, %s)', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_nottild(node)
return printf('not viml_eqreg(%s, %s)', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_gt(node)
return printf('%s > %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_lt(node)
return printf('%s < %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_isq(node)
throw 'NotImplemented: is?'
endfunction
function s:PythonCompiler.compile_ish(node)
throw 'NotImplemented: is#'
endfunction
function s:PythonCompiler.compile_isnotq(node)
throw 'NotImplemented: isnot?'
endfunction
function s:PythonCompiler.compile_isnoth(node)
throw 'NotImplemented: isnot#'
endfunction
function s:PythonCompiler.compile_is(node)
return printf('%s is %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_isnot(node)
return printf('%s is not %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_add(node)
return printf('%s + %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_sub(node)
return printf('%s - %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_concat(node)
return printf('%s + %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_mul(node)
return printf('%s * %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_div(node)
return printf('%s // %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_mod(node)
return printf('%s % %s', self.compile(a:node.lhs), self.compile(a:node.rhs))
endfunction
function s:PythonCompiler.compile_not(node)
return printf('not %s', self.compile(a:node.expr))
endfunction
function s:PythonCompiler.compile_plus(node)
return printf('+%s', self.compile(a:node.expr))
endfunction
function s:PythonCompiler.compile_minus(node)
return printf('-%s', self.compile(a:node.expr))
endfunction
function s:PythonCompiler.compile_index(node)
let expr = self.compile(a:node.expr)
let expr1 = self.compile(a:node.expr1)
if expr == 'self'
return printf('getattr(%s, %s)', expr, expr1)
else
return printf('%s[%s]', expr, expr1)
endif
endfunction
function s:PythonCompiler.compile_slice(node)
let expr1 = a:node.expr1 is s:NIL ? 'nil' : self.compile(a:node.expr1)
let expr2 = a:node.expr2 is s:NIL ? 'nil' : self.compile(a:node.expr2)
return printf('%s[%s : %s]', self.compile(a:node.expr), expr1, expr2)
endfunction
function s:PythonCompiler.compile_dot(node)
let lhs = self.compile(a:node.lhs)
let rhs = self.compile(a:node.rhs)
if rhs =~ '^\(else\|finally\)$'
let rhs = '_' . rhs
endif
return printf('%s.%s', lhs, rhs)
endfunction
function s:PythonCompiler.compile_call(node)
let args = map(a:node.args, 'self.compile(v:val)')
let expr = self.compile(a:node.expr)
if expr == 'map'
let r = s:StringReader.new([eval(args[1])])
let p = s:ExprParser.new(s:ExprTokenizer.new(r))
let n = p.parse()
return printf('[%s for vval in %s]', self.compile(n), args[0])
elseif expr == 'call' && args[0][0] =~ '[''"]'
return printf('viml_%s(*%s)', args[0][1:-2], args[1])
endif
if expr =~ '\.new$'
let expr = matchstr(expr, '.*\ze\.new$')
endif
if index(s:viml_builtin_functions, expr) != -1
let expr = printf('viml_%s', expr)
endif
return printf('%s(%s)', expr, join(args, ', '))
endfunction
function s:PythonCompiler.compile_number(node)
return a:node.value
endfunction
function s:PythonCompiler.compile_string(node)
if a:node.value[0] == "'"
let s = substitute(a:node.value[1:-2], "''", "'", 'g')
return '"' . escape(s, '\"') . '"'
else
return a:node.value
endif
endfunction
function s:PythonCompiler.compile_list(node)
let items = map(a:node.items, 'self.compile(v:val)')
if empty(items)
return '[]'
else
return printf('[%s]', join(items, ', '))
endif
endfunction
function s:PythonCompiler.compile_dict(node)
let items = map(a:node.items, 'self.compile(v:val[0]) . ":" . self.compile(v:val[1])')
if empty(items)
return 'AttributeDict({})'
else
return printf('AttributeDict({%s})', join(items, ', '))
endif
endfunction
function s:PythonCompiler.compile_nesting(node)
return '(' . self.compile(a:node.expr) . ')'
endfunction
function s:PythonCompiler.compile_option(node)
throw 'NotImplemented: option'
endfunction
function s:PythonCompiler.compile_identifier(node)
let v = ''
for x in a:node.value
if x.curly
throw 'NotImplemented: curly'
else
let v .= x.value
endif
endfor
if v == 'a:000'
let v = 'a000'
elseif v == 'v:val'
let v = 'vval'
elseif v =~ '^[sa]:'
let v = v[2:]
endif
return v
endfunction
function s:PythonCompiler.compile_env(node)
throw 'NotImplemented: env'
endfunction
function s:PythonCompiler.compile_reg(node)
throw 'NotImplemented: reg'
endfunction
let s:viml_builtin_functions = ['abs', 'acos', 'add', 'and', 'append', 'append', 'argc', 'argidx', 'argv', 'argv', 'asin', 'atan', 'atan2', 'browse', 'browsedir', 'bufexists', 'buflisted', 'bufloaded', 'bufname', 'bufnr', 'bufwinnr', 'byte2line', 'byteidx', 'call', 'ceil', 'changenr', 'char2nr', 'cindent', 'clearmatches', 'col', 'complete', 'complete_add', 'complete_check', 'confirm', 'copy', 'cos', 'cosh', 'count', 'cscope_connection', 'cursor', 'cursor', 'deepcopy', 'delete', 'did_filetype', 'diff_filler', 'diff_hlID', 'empty', 'escape', 'eval', 'eventhandler', 'executable', 'exists', 'extend', 'exp', 'expand', 'feedkeys', 'filereadable', 'filewritable', 'filter', 'finddir', 'findfile', 'float2nr', 'floor', 'fmod', 'fnameescape', 'fnamemodify', 'foldclosed', 'foldclosedend', 'foldlevel', 'foldtext', 'foldtextresult', 'foreground', 'function', 'garbagecollect', 'get', 'get', 'getbufline', 'getbufvar', 'getchar', 'getcharmod', 'getcmdline', 'getcmdpos', 'getcmdtype', 'getcwd', 'getfperm', 'getfsize', 'getfontname', 'getftime', 'getftype', 'getline', 'getline', 'getloclist', 'getmatches', 'getpid', 'getpos', 'getqflist', 'getreg', 'getregtype', 'gettabvar', 'gettabwinvar', 'getwinposx', 'getwinposy', 'getwinvar', 'glob', 'globpath', 'has', 'has_key', 'haslocaldir', 'hasmapto', 'histadd', 'histdel', 'histget', 'histnr', 'hlexists', 'hlID', 'hostname', 'iconv', 'indent', 'index', 'input', 'inputdialog', 'inputlist', 'inputrestore', 'inputsave', 'inputsecret', 'insert', 'invert', 'isdirectory', 'islocked', 'items', 'join', 'keys', 'len', 'libcall', 'libcallnr', 'line', 'line2byte', 'lispindent', 'localtime', 'log', 'log10', 'luaeval', 'map', 'maparg', 'mapcheck', 'match', 'matchadd', 'matcharg', 'matchdelete', 'matchend', 'matchlist', 'matchstr', 'max', 'min', 'mkdir', 'mode', 'mzeval', 'nextnonblank', 'nr2char', 'or', 'pathshorten', 'pow', 'prevnonblank', 'printf', 'pumvisible', 'pyeval', 'py3eval', 'range', 'readfile', 'reltime', 'reltimestr', 'remote_expr', 'remote_foreground', 'remote_peek', 'remote_read', 'remote_send', 'remove', 'remove', 'rename', 'repeat', 'resolve', 'reverse', 'round', 'screencol', 'screenrow', 'search', 'searchdecl', 'searchpair', 'searchpairpos', 'searchpos', 'server2client', 'serverlist', 'setbufvar', 'setcmdpos', 'setline', 'setloclist', 'setmatches', 'setpos', 'setqflist', 'setreg', 'settabvar', 'settabwinvar', 'setwinvar', 'sha256', 'shellescape', 'shiftwidth', 'simplify', 'sin', 'sinh', 'sort', 'soundfold', 'spellbadword', 'spellsuggest', 'split', 'sqrt', 'str2float', 'str2nr', 'strchars', 'strdisplaywidth', 'strftime', 'stridx', 'string', 'strlen', 'strpart', 'strridx', 'strtrans', 'strwidth', 'submatch', 'substitute', 'synID', 'synIDattr', 'synIDtrans', 'synconcealed', 'synstack', 'system', 'tabpagebuflist', 'tabpagenr', 'tabpagewinnr', 'taglist', 'tagfiles', 'tempname', 'tan', 'tanh', 'tolower', 'toupper', 'tr', 'trunc', 'type', 'undofile', 'undotree', 'values', 'virtcol', 'visualmode', 'wildmenumode', 'winbufnr', 'wincol', 'winheight', 'winline', 'winnr', 'winrestcmd', 'winrestview', 'winsaveview', 'winwidth', 'writefile', 'xor']
function! s:test(filename)
try
let r = s:StringReader.new(readfile(a:filename))
let p = s:VimLParser.new()
let c = s:PythonCompiler.new()
let lines = c.compile(p.parse(r))
call writefile(lines, 'pyout.py')
echo join(lines, "\n")
catch
echoerr substitute(v:throwpoint, '\.\.\zs\d\+', '\=s:numtoname(submatch(0))', 'g') . "\n" . v:exception
endtry
endfunction
function! s:numtoname(num)
let sig = printf("function('%s')", a:num)
for k in keys(s:)
if type(s:[k]) == type({})
for name in keys(s:[k])
if type(s:[k][name]) == type(function('tr')) && string(s:[k][name]) == sig
return printf('%s.%s', k, name)
endif
endfor
endif
endfor
return a:num
endfunction
call s:test('autoload/vimlparser.vim')
#!/usr/bin/env python3
# usage: python3 vimlparser.py foo.vim
import sys
import re
# vimlparser.py foo.vim
def main():
r = StringReader(viml_readfile(sys.argv[1]))
p = VimLParser()
c = Compiler()
for line in c.compile(p.parse(r)):
print(line)
class AttributeDict(dict):
__getattribute__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
pat_vim2py = {
":\\|\\s" : ":|\\s",
"[-+]" : "[-+]",
"[/?]" : "[/?]",
"[0-9A-Za-z_]" : "[0-9A-Za-z_]",
"[0-9a-zA-Z]" : "[0-9a-zA-Z]",
"[@*!=><&~#]" : "[@*!=><&~#]",
"[gj]" : "[gj]",
"\\.\\d" : "\\.\\d",
"\\<ARGOPT\\>" : "\\bARGOPT\\b",
"\\<BANG\\>" : "\\bBANG\\b",
"\\<EDITCMD\\>" : "\\bEDITCMD\\b",
"\\<NOTRLCOM\\>" : "\\bNOTRLCOM\\b",
"\\<TRLBAR\\>" : "\\bTRLBAR\\b",
"\\<USECTRLV\\>" : "\\bUSECTRLV\\b",
"\\<\\(XFILE\\|FILES\\|FILE1\\)\\>" : "\\b(XFILE|FILES|FILE1)\\b",
"\\S" : "\\S",
"\\a" : "[A-Za-z]",
"\\d" : "\\d",
"\\h" : "[A-Za-z_]",
"\\s" : "\\s",
"\\v^%(IDENTIFIER|INDEX|DOT|OPTION|ENV|REG)$" : "^(IDENTIFIER|INDEX|DOT|OPTION|ENV|REG)$",
"\\v^%(IF|ELSEIF|ELSE)$" : "^(IF|ELSEIF|ELSE)$",
"\\v^%(TRY|CATCH|FINALLY)$" : "^(TRY|CATCH|FINALLY)$",
"\\v^%(substitute|smagic|snomagic)$" : "^(substitute|smagic|snomagic)$",
"\\v^%(write|update)$" : "^(write|update)$",
"\\v^d%[elete][lp]$" : "^d(elete|elet|ele|el|e)[lp]$",
"\\v^s%(c[^sr][^i][^p]|g|i[^mlg]|I|r[^e])" : "^s(c[^sr][^i][^p]|g|i[^mlg]|I|r[^e])",
"\\w" : "[0-9A-Za-z_]",
"\\w\\|[:#]" : "[0-9A-Za-z_]|[:#]",
"\\x" : "[0-9A-Fa-f]",
"^!" : "^!",
"^!$" : "^!$",
"^!=" : "^!=",
"^!=#" : "^!=#",
"^!=?" : "^!=\\?",
"^!\\~" : "^!~",
"^!\\~#" : "^!~#",
"^!\\~?" : "^!~\\?",
"^#$" : "^#$",
"^%" : "^%",
"^&$" : "^&$",
"^&&" : "^&&",
"^&\\(g:\\|l:\\|\\w\\w\\)" : "^&(g:|l:|[0-9A-Za-z_][0-9A-Za-z_])",
"^'" : "^'",
"^(" : "^\(",
"^)" : "^\)",
"^)\\+$" : "^\)+$",
"^+" : "^\+",
"^++" : "^\+\+",
"^++bad=\\(keep\\|drop\\|.\\)\\>" : "^\\+\\+bad=(keep|drop|.)\\b",
"^++bad=drop" : "^\\+\\+bad=drop",
"^++bad=keep" : "^\\+\\+bad=keep",
"^++bin\\>" : "^\\+\\+bin\\b",
"^++edit\\>" : "^\\+\\+edit\\b",
"^++enc=\\S" : "^\\+\\+enc=\\S",
"^++encoding=\\S" : "^\\+\\+encoding=\\S",
"^++ff=\\(dos\\|unix\\|mac\\)\\>" : "^\\+\\+ff=(dos|unix|mac)\\b",
"^++fileformat=\\(dos\\|unix\\|mac\\)\\>" : "^\\+\\+fileformat=(dos|unix|mac)\\b",
"^++nobin\\>" : "^\\+\\+nobin\\b",
"^," : "^,",
"^-" : "^-",
"^/" : "^/",
"^0x\\x" : "^0x[0-9A-Fa-f]",
"^:" : "^:",
"^;" : "^;",
"^<" : "^<",
"^<#" : "^<#",
"^<$" : "^<$",
"^<=" : "^<=",
"^<=#" : "^<=#",
"^<=?" : "^<=\\?",
"^<?" : "^<\\?",
"^<[Ss][Ii][Dd]>\\h" : "^<[Ss][Ii][Dd]>[A-Za-z_]",
"^=" : "^=",
"^=$" : "^=$",
"^==" : "^==",
"^==#" : "^==#",
"^==?" : "^==\\?",
"^=\\~" : "^=~",
"^=\\~#" : "^=~#",
"^=\\~?" : "^=~\\?",
"^>" : "^>",
"^>#" : "^>#",
"^>$" : "^>$",
"^>=" : "^>=",
"^>=#" : "^>=#",
"^>=?" : "^>=\\?",
"^>?" : "^>\\?",
"^?" : "^\\?",
"^@$" : "^@$",
"^@." : "^@.",
"^FUNCTION$" : "^FUNCTION$",
"^N\\%[ext]$" : "^N(ext|ex|e)$",
"^P\\%[rint]$" : "^P(rint|rin|ri|r)$",
"^X$" : "^X$",
"^[<>]$" : "^[<>]$",
"^[A-Z]" : "^[A-Z]",
"^\"" : "^\"",
"^\\$\\w\\+" : "^\\$[0-9A-Za-z_]+",
"^\\(!\\|global\\|vglobal\\)$" : "^(!|global|vglobal)$",
"^\\(WHILE\\|FOR\\)$" : "^(WHILE|FOR)$",
"^\\(vimgrep\\|vimgrepadd\\|lvimgrep\\|lvimgrepadd\\)$" : "^(vimgrep|vimgrepadd|lvimgrep|lvimgrepadd)$",
"^\\*" : "^\\*",
"^\\*$" : "^\\*$",
"^\\." : "^\\.",
"^\\[" : "^\[",
"^\\d" : "^\\d",
"^\\h" : "^[A-Za-z_]",
"^\\s" : "^\\s",
"^\\~$" : "^~$",
"^]" : "^]",
"^`" : "^`",
"^a\\%[ppend]$" : "^a(ppend|ppen|ppe|pp|p)?$",
"^ab\\%[breviate]$" : "^ab(breviate|breviat|brevia|brevi|brev|bre|br|b)?$",
"^abc\\%[lear]$" : "^abc(lear|lea|le|l)?$",
"^abo\\%[veleft]$" : "^abo(veleft|velef|vele|vel|ve|v)?$",
"^al\\%[l]$" : "^al(l)?$",
"^am\\%[enu]$" : "^am(enu|en|e)?$",
"^an\\%[oremenu]$" : "^an(oremenu|oremen|oreme|orem|ore|or|o)?$",
"^ar\\%[gs]$" : "^ar(gs|g)?$",
"^arga\\%[dd]$" : "^arga(dd|d)?$",
"^argd\\%[elete]$" : "^argd(elete|elet|ele|el|e)?$",
"^argdo$" : "^argdo$",
"^arge\\%[dit]$" : "^arge(dit|di|d)?$",
"^argg\\%[lobal]$" : "^argg(lobal|loba|lob|lo|l)?$",
"^argl\\%[ocal]$" : "^argl(ocal|oca|oc|o)?$",
"^argu\\%[ment]$" : "^argu(ment|men|me|m)?$",
"^as\\%[cii]$" : "^as(cii|ci|c)?$",
"^au\\%[tocmd]$" : "^au(tocmd|tocm|toc|to|t)?$",
"^aug\\%[roup]$" : "^aug(roup|rou|ro|r)?$",
"^aun\\%[menu]$" : "^aun(menu|men|me|m)?$",
"^bN\\%[ext]$" : "^bN(ext|ex|e)?$",
"^b\\%[uffer]$" : "^b(uffer|uffe|uff|uf|u)?$",
"^ba\\%[ll]$" : "^ba(ll|l)?$",
"^bad\\%[d]$" : "^bad(d)?$",
"^bd\\%[elete]$" : "^bd(elete|elet|ele|el|e)?$",
"^be\\%[have]$" : "^be(have|hav|ha|h)?$",
"^bel\\%[owright]$" : "^bel(owright|owrigh|owrig|owri|owr|ow|o)?$",
"^bf\\%[irst]$" : "^bf(irst|irs|ir|i)?$",
"^bl\\%[ast]$" : "^bl(ast|as|a)?$",
"^bm\\%[odified]$" : "^bm(odified|odifie|odifi|odif|odi|od|o)?$",
"^bn\\%[ext]$" : "^bn(ext|ex|e)?$",
"^bo\\%[tright]$" : "^bo(tright|trigh|trig|tri|tr|t)?$",
"^bp\\%[revious]$" : "^bp(revious|reviou|revio|revi|rev|re|r)?$",
"^br\\%[ewind]$" : "^br(ewind|ewin|ewi|ew|e)?$",
"^brea\\%[k]$" : "^brea(k)?$",
"^breaka\\%[dd]$" : "^breaka(dd|d)?$",
"^breakd\\%[el]$" : "^breakd(el|e)?$",
"^breakl\\%[ist]$" : "^breakl(ist|is|i)?$",
"^bro\\%[wse]$" : "^bro(wse|ws|w)?$",
"^bufdo$" : "^bufdo$",
"^buffers$" : "^buffers$",
"^bun\\%[load]$" : "^bun(load|loa|lo|l)?$",
"^bw\\%[ipeout]$" : "^bw(ipeout|ipeou|ipeo|ipe|ip|i)?$",
"^cN\\%[ext]$" : "^cN(ext|ex|e)?$",
"^cNf\\%[ile]$" : "^cNf(ile|il|i)?$",
"^c\\%[hange]$" : "^c(hange|hang|han|ha|h)?$",
"^ca\\%[bbrev]$" : "^ca(bbrev|bbre|bbr|bb|b)?$",
"^cabc\\%[lear]$" : "^cabc(lear|lea|le|l)?$",
"^cad\\%[dexpr]$" : "^cad(dexpr|dexp|dex|de|d)?$",
"^caddb\\%[uffer]$" : "^caddb(uffer|uffe|uff|uf|u)?$",
"^caddf\\%[ile]$" : "^caddf(ile|il|i)?$",
"^cal\\%[l]$" : "^cal(l)?$",
"^cat\\%[ch]$" : "^cat(ch|c)?$",
"^cb\\%[uffer]$" : "^cb(uffer|uffe|uff|uf|u)?$",
"^cc$" : "^cc$",
"^ccl\\%[ose]$" : "^ccl(ose|os|o)?$",
"^cd$" : "^cd$",
"^ce\\%[nter]$" : "^ce(nter|nte|nt|n)?$",
"^cex\\%[pr]$" : "^cex(pr|p)?$",
"^cf\\%[ile]$" : "^cf(ile|il|i)?$",
"^cfir\\%[st]$" : "^cfir(st|s)?$",
"^cg\\%[etfile]$" : "^cg(etfile|etfil|etfi|etf|et|e)?$",
"^cgetb\\%[uffer]$" : "^cgetb(uffer|uffe|uff|uf|u)?$",
"^cgete\\%[xpr]$" : "^cgete(xpr|xp|x)?$",
"^cha\\%[nges]$" : "^cha(nges|nge|ng|n)?$",
"^chd\\%[ir]$" : "^chd(ir|i)?$",
"^che\\%[ckpath]$" : "^che(ckpath|ckpat|ckpa|ckp|ck|c)?$",
"^checkt\\%[ime]$" : "^checkt(ime|im|i)?$",
"^cl\\%[ist]$" : "^cl(ist|is|i)?$",
"^cla\\%[st]$" : "^cla(st|s)?$",
"^clo\\%[se]$" : "^clo(se|s)?$",
"^cm\\%[ap]$" : "^cm(ap|a)?$",
"^cmapc\\%[lear]$" : "^cmapc(lear|lea|le|l)?$",
"^cme\\%[nu]$" : "^cme(nu|n)?$",
"^cn\\%[ext]$" : "^cn(ext|ex|e)?$",
"^cnew\\%[er]$" : "^cnew(er|e)?$",
"^cnf\\%[ile]$" : "^cnf(ile|il|i)?$",
"^cno\\%[remap]$" : "^cno(remap|rema|rem|re|r)?$",
"^cnorea\\%[bbrev]$" : "^cnorea(bbrev|bbre|bbr|bb|b)?$",
"^cnoreme\\%[nu]$" : "^cnoreme(nu|n)?$",
"^co\\%[py]$" : "^co(py|p)?$",
"^col\\%[der]$" : "^col(der|de|d)?$",
"^colo\\%[rscheme]$" : "^colo(rscheme|rschem|rsche|rsch|rsc|rs|r)?$",
"^com\\%[mand]$" : "^com(mand|man|ma|m)?$",
"^comc\\%[lear]$" : "^comc(lear|lea|le|l)?$",
"^comp\\%[iler]$" : "^comp(iler|ile|il|i)?$",
"^con\\%[tinue]$" : "^con(tinue|tinu|tin|ti|t)?$",
"^conf\\%[irm]$" : "^conf(irm|ir|i)?$",
"^cope\\%[n]$" : "^cope(n)?$",
"^cp\\%[revious]$" : "^cp(revious|reviou|revio|revi|rev|re|r)?$",
"^cpf\\%[ile]$" : "^cpf(ile|il|i)?$",
"^cq\\%[uit]$" : "^cq(uit|ui|u)?$",
"^cr\\%[ewind]$" : "^cr(ewind|ewin|ewi|ew|e)?$",
"^cs\\%[cope]$" : "^cs(cope|cop|co|c)?$",
"^cst\\%[ag]$" : "^cst(ag|a)?$",
"^cu\\%[nmap]$" : "^cu(nmap|nma|nm|n)?$",
"^cuna\\%[bbrev]$" : "^cuna(bbrev|bbre|bbr|bb|b)?$",
"^cunme\\%[nu]$" : "^cunme(nu|n)?$",
"^cw\\%[indow]$" : "^cw(indow|indo|ind|in|i)?$",
"^d\\%[elete]$" : "^d(elete|elet|ele|el|e)?$",
"^deb\\%[ug]$" : "^deb(ug|u)?$",
"^debugg\\%[reedy]$" : "^debugg(reedy|reed|ree|re|r)?$",
"^delc\\%[ommand]$" : "^delc(ommand|omman|omma|omm|om|o)?$",
"^delf\\%[unction]$" : "^delf(unction|unctio|uncti|unct|unc|un|u)?$",
"^delm\\%[arks]$" : "^delm(arks|ark|ar|a)?$",
"^di\\%[splay]$" : "^di(splay|spla|spl|sp|s)?$",
"^dif\\%[fupdate]$" : "^dif(fupdate|fupdat|fupda|fupd|fup|fu|f)?$",
"^diffg\\%[et]$" : "^diffg(et|e)?$",
"^diffo\\%[ff]$" : "^diffo(ff|f)?$",
"^diffp\\%[atch]$" : "^diffp(atch|atc|at|a)?$",
"^diffpu\\%[t]$" : "^diffpu(t)?$",
"^diffs\\%[plit]$" : "^diffs(plit|pli|pl|p)?$",
"^diffthis$" : "^diffthis$",
"^dig\\%[raphs]$" : "^dig(raphs|raph|rap|ra|r)?$",
"^dj\\%[ump]$" : "^dj(ump|um|u)?$",
"^dl\\%[ist]$" : "^dl(ist|is|i)?$",
"^do\\%[autocmd]$" : "^do(autocmd|autocm|autoc|auto|aut|au|a)?$",
"^doautoa\\%[ll]$" : "^doautoa(ll|l)?$",
"^dr\\%[op]$" : "^dr(op|o)?$",
"^ds\\%[earch]$" : "^ds(earch|earc|ear|ea|e)?$",
"^dsp\\%[lit]$" : "^dsp(lit|li|l)?$",
"^e\\%[dit]$" : "^e(dit|di|d)?$",
"^ea\\%[rlier]$" : "^ea(rlier|rlie|rli|rl|r)?$",
"^ec\\%[ho]$" : "^ec(ho|h)?$",
"^echoe\\%[rr]$" : "^echoe(rr|r)?$",
"^echoh\\%[l]$" : "^echoh(l)?$",
"^echom\\%[sg]$" : "^echom(sg|s)?$",
"^echon$" : "^echon$",
"^el\\%[se]$" : "^el(se|s)?$",
"^elsei\\%[f]$" : "^elsei(f)?$",
"^em\\%[enu]$" : "^em(enu|en|e)?$",
"^en\\%[dif]$" : "^en(dif|di|d)?$",
"^endf\\%[unction]$" : "^endf(unction|unctio|uncti|unct|unc|un|u)?$",
"^endfo\\%[r]$" : "^endfo(r)?$",
"^endt\\%[ry]$" : "^endt(ry|r)?$",
"^endw\\%[hile]$" : "^endw(hile|hil|hi|h)?$",
"^ene\\%[w]$" : "^ene(w)?$",
"^ex$" : "^ex$",
"^exe\\%[cute]$" : "^exe(cute|cut|cu|c)?$",
"^exi\\%[t]$" : "^exi(t)?$",
"^exu\\%[sage]$" : "^exu(sage|sag|sa|s)?$",
"^f\\%[ile]$" : "^f(ile|il|i)?$",
"^files$" : "^files$",
"^filet\\%[ype]$" : "^filet(ype|yp|y)?$",
"^fin\\%[d]$" : "^fin(d)?$",
"^fina\\%[lly]$" : "^fina(lly|ll|l)?$",
"^fini\\%[sh]$" : "^fini(sh|s)?$",
"^fir\\%[st]$" : "^fir(st|s)?$",
"^fix\\%[del]$" : "^fix(del|de|d)?$",
"^fo\\%[ld]$" : "^fo(ld|l)?$",
"^foldc\\%[lose]$" : "^foldc(lose|los|lo|l)?$",
"^foldd\\%[oopen]$" : "^foldd(oopen|oope|oop|oo|o)?$",
"^folddoc\\%[losed]$" : "^folddoc(losed|lose|los|lo|l)?$",
"^foldo\\%[pen]$" : "^foldo(pen|pe|p)?$",
"^for$" : "^for$",
"^fu\\%[nction]$" : "^fu(nction|nctio|ncti|nct|nc|n)?$",
"^g\\%[lobal]$" : "^g(lobal|loba|lob|lo|l)?$",
"^go\\%[to]$" : "^go(to|t)?$",
"^gr\\%[ep]$" : "^gr(ep|e)?$",
"^grepa\\%[dd]$" : "^grepa(dd|d)?$",
"^gu\\%[i]$" : "^gu(i)?$",
"^gv\\%[im]$" : "^gv(im|i)?$",
"^h\\%[elp]$" : "^h(elp|el|e)?$",
"^ha\\%[rdcopy]$" : "^ha(rdcopy|rdcop|rdco|rdc|rd|r)?$",
"^helpf\\%[ind]$" : "^helpf(ind|in|i)?$",
"^helpg\\%[rep]$" : "^helpg(rep|re|r)?$",
"^helpt\\%[ags]$" : "^helpt(ags|ag|a)?$",
"^hi\\%[ghlight]$" : "^hi(ghlight|ghligh|ghlig|ghli|ghl|gh|g)?$",
"^hid\\%[e]$" : "^hid(e)?$",
"^his\\%[tory]$" : "^his(tory|tor|to|t)?$",
"^i\\%[nsert]$" : "^i(nsert|nser|nse|ns|n)?$",
"^ia\\%[bbrev]$" : "^ia(bbrev|bbre|bbr|bb|b)?$",
"^iabc\\%[lear]$" : "^iabc(lear|lea|le|l)?$",
"^if$" : "^if$",
"^ij\\%[ump]$" : "^ij(ump|um|u)?$",
"^il\\%[ist]$" : "^il(ist|is|i)?$",
"^im\\%[ap]$" : "^im(ap|a)?$",
"^imapc\\%[lear]$" : "^imapc(lear|lea|le|l)?$",
"^ime\\%[nu]$" : "^ime(nu|n)?$",
"^ino\\%[remap]$" : "^ino(remap|rema|rem|re|r)?$",
"^inorea\\%[bbrev]$" : "^inorea(bbrev|bbre|bbr|bb|b)?$",
"^inoreme\\%[nu]$" : "^inoreme(nu|n)?$",
"^int\\%[ro]$" : "^int(ro|r)?$",
"^is#" : "^is#",
"^is?" : "^is\\?",
"^is\\%[earch]$" : "^is(earch|earc|ear|ea|e)?$",
"^is\\>" : "^is\\b",
"^isnot#" : "^isnot#",
"^isnot?" : "^isnot\\?",
"^isnot\\>" : "^isnot\\b",
"^isp\\%[lit]$" : "^isp(lit|li|l)?$",
"^iu\\%[nmap]$" : "^iu(nmap|nma|nm|n)?$",
"^iuna\\%[bbrev]$" : "^iuna(bbrev|bbre|bbr|bb|b)?$",
"^iunme\\%[nu]$" : "^iunme(nu|n)?$",
"^j\\%[oin]$" : "^j(oin|oi|o)?$",
"^ju\\%[mps]$" : "^ju(mps|mp|m)?$",
"^k$" : "^k$",
"^kee\\%[pmarks]$" : "^kee(pmarks|pmark|pmar|pma|pm|p)?$",
"^keepa\\%[lt]$" : "^keepa(lt|l)?$",
"^keepj\\%[umps]$" : "^keepj(umps|ump|um|u)?$",
"^lN\\%[ext]$" : "^lN(ext|ex|e)?$",
"^lNf\\%[ile]$" : "^lNf(ile|il|i)?$",
"^l\\%[ist]$" : "^l(ist|is|i)?$",
"^la\\%[st]$" : "^la(st|s)?$",
"^lad\\%[dexpr]$" : "^lad(dexpr|dexp|dex|de|d)?$",
"^laddb\\%[uffer]$" : "^laddb(uffer|uffe|uff|uf|u)?$",
"^laddf\\%[ile]$" : "^laddf(ile|il|i)?$",
"^lan\\%[guage]$" : "^lan(guage|guag|gua|gu|g)?$",
"^lat\\%[er]$" : "^lat(er|e)?$",
"^lb\\%[uffer]$" : "^lb(uffer|uffe|uff|uf|u)?$",
"^lc\\%[d]$" : "^lc(d)?$",
"^lch\\%[dir]$" : "^lch(dir|di|d)?$",
"^lcl\\%[ose]$" : "^lcl(ose|os|o)?$",
"^lcs\\%[cope]$" : "^lcs(cope|cop|co|c)?$",
"^le\\%[ft]$" : "^le(ft|f)?$",
"^lefta\\%[bove]$" : "^lefta(bove|bov|bo|b)?$",
"^let$" : "^let$",
"^lex\\%[pr]$" : "^lex(pr|p)?$",
"^lf\\%[ile]$" : "^lf(ile|il|i)?$",
"^lfir\\%[st]$" : "^lfir(st|s)?$",
"^lg\\%[etfile]$" : "^lg(etfile|etfil|etfi|etf|et|e)?$",
"^lgetb\\%[uffer]$" : "^lgetb(uffer|uffe|uff|uf|u)?$",
"^lgete\\%[xpr]$" : "^lgete(xpr|xp|x)?$",
"^lgr\\%[ep]$" : "^lgr(ep|e)?$",
"^lgrepa\\%[dd]$" : "^lgrepa(dd|d)?$",
"^lh\\%[elpgrep]$" : "^lh(elpgrep|elpgre|elpgr|elpg|elp|el|e)?$",
"^ll$" : "^ll$",
"^lla\\%[st]$" : "^lla(st|s)?$",
"^lli\\%[st]$" : "^lli(st|s)?$",
"^lm\\%[ap]$" : "^lm(ap|a)?$",
"^lmak\\%[e]$" : "^lmak(e)?$",
"^lmapc\\%[lear]$" : "^lmapc(lear|lea|le|l)?$",
"^ln\\%[oremap]$" : "^ln(oremap|orema|orem|ore|or|o)?$",
"^lne\\%[xt]$" : "^lne(xt|x)?$",
"^lnew\\%[er]$" : "^lnew(er|e)?$",
"^lnf\\%[ile]$" : "^lnf(ile|il|i)?$",
"^lo\\%[adview]$" : "^lo(adview|advie|advi|adv|ad|a)?$",
"^loadk\\%[eymap]$" : "^loadk(eymap|eyma|eym|ey|e)?$",
"^loc\\%[kmarks]$" : "^loc(kmarks|kmark|kmar|kma|km|k)?$",
"^lockv\\%[ar]$" : "^lockv(ar|a)?$",
"^lol\\%[der]$" : "^lol(der|de|d)?$",
"^lope\\%[n]$" : "^lope(n)?$",
"^lp\\%[revious]$" : "^lp(revious|reviou|revio|revi|rev|re|r)?$",
"^lpf\\%[ile]$" : "^lpf(ile|il|i)?$",
"^lr\\%[ewind]$" : "^lr(ewind|ewin|ewi|ew|e)?$",
"^ls$" : "^ls$",
"^lt\\%[ag]$" : "^lt(ag|a)?$",
"^lu\\%[nmap]$" : "^lu(nmap|nma|nm|n)?$",
"^lua$" : "^lua$",
"^luad\\%[o]$" : "^luad(o)?$",
"^luaf\\%[ile]$" : "^luaf(ile|il|i)?$",
"^lv\\%[imgrep]$" : "^lv(imgrep|imgre|imgr|img|im|i)?$",
"^lvimgrepa\\%[dd]$" : "^lvimgrepa(dd|d)?$",
"^lw\\%[indow]$" : "^lw(indow|indo|ind|in|i)?$",
"^m\\%[ove]$" : "^m(ove|ov|o)?$",
"^ma\\%[rk]$" : "^ma(rk|r)?$",
"^mak\\%[e]$" : "^mak(e)?$",
"^map$" : "^map$",
"^mapc\\%[lear]$" : "^mapc(lear|lea|le|l)?$",
"^marks$" : "^marks$",
"^mat\\%[ch]$" : "^mat(ch|c)?$",
"^me\\%[nu]$" : "^me(nu|n)?$",
"^menut\\%[ranslate]$" : "^menut(ranslate|ranslat|ransla|ransl|rans|ran|ra|r)?$",
"^mes\\%[sages]$" : "^mes(sages|sage|sag|sa|s)?$",
"^mk\\%[exrc]$" : "^mk(exrc|exr|ex|e)?$",
"^mks\\%[ession]$" : "^mks(ession|essio|essi|ess|es|e)?$",
"^mksp\\%[ell]$" : "^mksp(ell|el|e)?$",
"^mkv\\%[imrc]$" : "^mkv(imrc|imr|im|i)?$",
"^mkvie\\%[w]$" : "^mkvie(w)?$",
"^mod\\%[e]$" : "^mod(e)?$",
"^mz\\%[scheme]$" : "^mz(scheme|schem|sche|sch|sc|s)?$",
"^mzf\\%[ile]$" : "^mzf(ile|il|i)?$",
"^n\\%[ext]$" : "^n(ext|ex|e)?$",
"^nb\\%[key]$" : "^nb(key|ke|k)?$",
"^nbc\\%[lose]$" : "^nbc(lose|los|lo|l)?$",
"^nbs\\%[art]$" : "^nbs(art|ar|a)?$",
"^new$" : "^new$",
"^nm\\%[ap]$" : "^nm(ap|a)?$",
"^nmapc\\%[lear]$" : "^nmapc(lear|lea|le|l)?$",
"^nme\\%[nu]$" : "^nme(nu|n)?$",
"^nn\\%[oremap]$" : "^nn(oremap|orema|orem|ore|or|o)?$",
"^nnoreme\\%[nu]$" : "^nnoreme(nu|n)?$",
"^no\\%[remap]$" : "^no(remap|rema|rem|re|r)?$",
"^noa\\%[utocmd]$" : "^noa(utocmd|utocm|utoc|uto|ut|u)?$",
"^noh\\%[lsearch]$" : "^noh(lsearch|lsearc|lsear|lsea|lse|ls|l)?$",
"^norea\\%[bbrev]$" : "^norea(bbrev|bbre|bbr|bb|b)?$",
"^noreme\\%[nu]$" : "^noreme(nu|n)?$",
"^norm\\%[al]$" : "^norm(al|a)?$",
"^nu\\%[mber]$" : "^nu(mber|mbe|mb|m)?$",
"^nun\\%[map]$" : "^nun(map|ma|m)?$",
"^nunme\\%[nu]$" : "^nunme(nu|n)?$",
"^o\\%[pen]$" : "^o(pen|pe|p)?$",
"^ol\\%[dfiles]$" : "^ol(dfiles|dfile|dfil|dfi|df|d)?$",
"^om\\%[ap]$" : "^om(ap|a)?$",
"^omapc\\%[lear]$" : "^omapc(lear|lea|le|l)?$",
"^ome\\%[nu]$" : "^ome(nu|n)?$",
"^on\\%[ly]$" : "^on(ly|l)?$",
"^ono\\%[remap]$" : "^ono(remap|rema|rem|re|r)?$",
"^onoreme\\%[nu]$" : "^onoreme(nu|n)?$",
"^opt\\%[ions]$" : "^opt(ions|ion|io|i)?$",
"^ou\\%[nmap]$" : "^ou(nmap|nma|nm|n)?$",
"^ounme\\%[nu]$" : "^ounme(nu|n)?$",
"^ow\\%[nsyntax]$" : "^ow(nsyntax|nsynta|nsynt|nsyn|nsy|ns|n)?$",
"^p\\%[rint]$" : "^p(rint|rin|ri|r)?$",
"^pc\\%[lose]$" : "^pc(lose|los|lo|l)?$",
"^pe\\%[rl]$" : "^pe(rl|r)?$",
"^ped\\%[it]$" : "^ped(it|i)?$",
"^perld\\%[o]$" : "^perld(o)?$",
"^po\\%[p]$" : "^po(p)?$",
"^pop\\%[up]$" : "^pop(up|u)?$",
"^pp\\%[op]$" : "^pp(op|o)?$",
"^pre\\%[serve]$" : "^pre(serve|serv|ser|se|s)?$",
"^prev\\%[ious]$" : "^prev(ious|iou|io|i)?$",
"^pro\\%[mptfind]$" : "^pro(mptfind|mptfin|mptfi|mptf|mpt|mp|m)?$",
"^prof\\%[ile]$" : "^prof(ile|il|i)?$",
"^profd\\%[el]$" : "^profd(el|e)?$",
"^promptr\\%[epl]$" : "^promptr(epl|ep|e)?$",
"^ps\\%[earch]$" : "^ps(earch|earc|ear|ea|e)?$",
"^ptN\\%[ext]$" : "^ptN(ext|ex|e)?$",
"^pt\\%[ag]$" : "^pt(ag|a)?$",
"^ptf\\%[irst]$" : "^ptf(irst|irs|ir|i)?$",
"^ptj\\%[ump]$" : "^ptj(ump|um|u)?$",
"^ptl\\%[ast]$" : "^ptl(ast|as|a)?$",
"^ptn\\%[ext]$" : "^ptn(ext|ex|e)?$",
"^ptp\\%[revious]$" : "^ptp(revious|reviou|revio|revi|rev|re|r)?$",
"^ptr\\%[ewind]$" : "^ptr(ewind|ewin|ewi|ew|e)?$",
"^pts\\%[elect]$" : "^pts(elect|elec|ele|el|e)?$",
"^pu\\%[t]$" : "^pu(t)?$",
"^pw\\%[d]$" : "^pw(d)?$",
"^py3$" : "^py3$",
"^py3f\\%[ile]$" : "^py3f(ile|il|i)?$",
"^py\\%[thon]$" : "^py(thon|tho|th|t)?$",
"^pyf\\%[ile]$" : "^pyf(ile|il|i)?$",
"^python3$" : "^python3$",
"^q\\%[uit]$" : "^q(uit|ui|u)?$",
"^qa\\%[ll]$" : "^qa(ll|l)?$",
"^quita\\%[ll]$" : "^quita(ll|l)?$",
"^r\\%[ead]$" : "^r(ead|ea|e)?$",
"^rec\\%[over]$" : "^rec(over|ove|ov|o)?$",
"^red\\%[o]$" : "^red(o)?$",
"^redi\\%[r]$" : "^redi(r)?$",
"^redr\\%[aw]$" : "^redr(aw|a)?$",
"^redraws\\%[tatus]$" : "^redraws(tatus|tatu|tat|ta|t)?$",
"^reg\\%[isters]$" : "^reg(isters|ister|iste|ist|is|i)?$",
"^res\\%[ize]$" : "^res(ize|iz|i)?$",
"^ret\\%[ab]$" : "^ret(ab|a)?$",
"^retu\\%[rn]$" : "^retu(rn|r)?$",
"^rew\\%[ind]$" : "^rew(ind|in|i)?$",
"^ri\\%[ght]$" : "^ri(ght|gh|g)?$",
"^rightb\\%[elow]$" : "^rightb(elow|elo|el|e)?$",
"^ru\\%[ntime]$" : "^ru(ntime|ntim|nti|nt|n)?$",
"^rub\\%[y]$" : "^rub(y)?$",
"^rubyd\\%[o]$" : "^rubyd(o)?$",
"^rubyf\\%[ile]$" : "^rubyf(ile|il|i)?$",
"^rund\\%[o]$" : "^rund(o)?$",
"^rv\\%[iminfo]$" : "^rv(iminfo|iminf|imin|imi|im|i)?$",
"^sN\\%[ext]$" : "^sN(ext|ex|e)?$",
"^s\\%[ubstitute]$" : "^s(ubstitute|ubstitut|ubstitu|ubstit|ubsti|ubst|ubs|ub|u)?$",
"^sa\\%[rgument]$" : "^sa(rgument|rgumen|rgume|rgum|rgu|rg|r)?$",
"^sal\\%[l]$" : "^sal(l)?$",
"^san\\%[dbox]$" : "^san(dbox|dbo|db|d)?$",
"^sav\\%[eas]$" : "^sav(eas|ea|e)?$",
"^sbN\\%[ext]$" : "^sbN(ext|ex|e)?$",
"^sb\\%[uffer]$" : "^sb(uffer|uffe|uff|uf|u)?$",
"^sba\\%[ll]$" : "^sba(ll|l)?$",
"^sbf\\%[irst]$" : "^sbf(irst|irs|ir|i)?$",
"^sbl\\%[ast]$" : "^sbl(ast|as|a)?$",
"^sbm\\%[odified]$" : "^sbm(odified|odifie|odifi|odif|odi|od|o)?$",
"^sbn\\%[ext]$" : "^sbn(ext|ex|e)?$",
"^sbp\\%[revious]$" : "^sbp(revious|reviou|revio|revi|rev|re|r)?$",
"^sbr\\%[ewind]$" : "^sbr(ewind|ewin|ewi|ew|e)?$",
"^scrip\\%[tnames]$" : "^scrip(tnames|tname|tnam|tna|tn|t)?$",
"^scripte\\%[ncoding]" : "^scripte(ncoding|ncodin|ncodi|ncod|nco|nc|n)",
"^scs\\%[cope]$" : "^scs(cope|cop|co|c)?$",
"^se\\%[t]$" : "^se(t)?$",
"^setf\\%[iletype]$" : "^setf(iletype|iletyp|ilety|ilet|ile|il|i)?$",
"^setg\\%[lobal]$" : "^setg(lobal|loba|lob|lo|l)?$",
"^setl\\%[ocal]$" : "^setl(ocal|oca|oc|o)?$",
"^sf\\%[ind]$" : "^sf(ind|in|i)?$",
"^sfir\\%[st]$" : "^sfir(st|s)?$",
"^sh\\%[ell]$" : "^sh(ell|el|e)?$",
"^sig\\%[n]$" : "^sig(n)?$",
"^sil\\%[ent]$" : "^sil(ent|en|e)?$",
"^sim\\%[alt]$" : "^sim(alt|al|a)?$",
"^sl\\%[eep]$" : "^sl(eep|ee|e)?$",
"^sla\\%[st]$" : "^sla(st|s)?$",
"^sm\\%[agic]$" : "^sm(agic|agi|ag|a)?$",
"^sma\\%[p]$" : "^sma(p)?$",
"^smapc\\%[lear]$" : "^smapc(lear|lea|le|l)?$",
"^sme\\%[nu]$" : "^sme(nu|n)?$",
"^sn\\%[ext]$" : "^sn(ext|ex|e)?$",
"^sni\\%[ff]$" : "^sni(ff|f)?$",
"^sno\\%[magic]$" : "^sno(magic|magi|mag|ma|m)?$",
"^snor\\%[emap]$" : "^snor(emap|ema|em|e)?$",
"^snoreme\\%[nu]$" : "^snoreme(nu|n)?$",
"^so\\%[urce]$" : "^so(urce|urc|ur|u)?$",
"^sor\\%[t]$" : "^sor(t)?$",
"^sp\\%[lit]$" : "^sp(lit|li|l)?$",
"^spe\\%[llgood]$" : "^spe(llgood|llgoo|llgo|llg|ll|l)?$",
"^spelld\\%[ump]$" : "^spelld(ump|um|u)?$",
"^spelli\\%[nfo]$" : "^spelli(nfo|nf|n)?$",
"^spellr\\%[epall]$" : "^spellr(epall|epal|epa|ep|e)?$",
"^spellu\\%[ndo]$" : "^spellu(ndo|nd|n)?$",
"^spellw\\%[rong]$" : "^spellw(rong|ron|ro|r)?$",
"^spr\\%[evious]$" : "^spr(evious|eviou|evio|evi|ev|e)?$",
"^sre\\%[wind]$" : "^sre(wind|win|wi|w)?$",
"^st\\%[op]$" : "^st(op|o)?$",
"^sta\\%[g]$" : "^sta(g)?$",
"^star\\%[tinsert]$" : "^star(tinsert|tinser|tinse|tins|tin|ti|t)?$",
"^startg\\%[replace]$" : "^startg(replace|replac|repla|repl|rep|re|r)?$",
"^startr\\%[eplace]$" : "^startr(eplace|eplac|epla|epl|ep|e)?$",
"^stj\\%[ump]$" : "^stj(ump|um|u)?$",
"^stopi\\%[nsert]$" : "^stopi(nsert|nser|nse|ns|n)?$",
"^sts\\%[elect]$" : "^sts(elect|elec|ele|el|e)?$",
"^sun\\%[hide]$" : "^sun(hide|hid|hi|h)?$",
"^sunm\\%[ap]$" : "^sunm(ap|a)?$",
"^sunme\\%[nu]$" : "^sunme(nu|n)?$",
"^sus\\%[pend]$" : "^sus(pend|pen|pe|p)?$",
"^sv\\%[iew]$" : "^sv(iew|ie|i)?$",
"^sw\\%[apname]$" : "^sw(apname|apnam|apna|apn|ap|a)?$",
"^sy\\%[ntax]$" : "^sy(ntax|nta|nt|n)?$",
"^sync\\%[bind]$" : "^sync(bind|bin|bi|b)?$",
"^t$" : "^t$",
"^tN\\%[ext]$" : "^tN(ext|ex|e)?$",
"^ta\\%[g]$" : "^ta(g)?$",
"^tab$" : "^tab$",
"^tabN\\%[ext]$" : "^tabN(ext|ex|e)?$",
"^tabc\\%[lose]$" : "^tabc(lose|los|lo|l)?$",
"^tabdo$" : "^tabdo$",
"^tabe\\%[dit]$" : "^tabe(dit|di|d)?$",
"^tabf\\%[ind]$" : "^tabf(ind|in|i)?$",
"^tabfir\\%[st]$" : "^tabfir(st|s)?$",
"^tabl\\%[ast]$" : "^tabl(ast|as|a)?$",
"^tabm\\%[ove]$" : "^tabm(ove|ov|o)?$",
"^tabn\\%[ext]$" : "^tabn(ext|ex|e)?$",
"^tabnew$" : "^tabnew$",
"^tabo\\%[nly]$" : "^tabo(nly|nl|n)?$",
"^tabp\\%[revious]$" : "^tabp(revious|reviou|revio|revi|rev|re|r)?$",
"^tabr\\%[ewind]$" : "^tabr(ewind|ewin|ewi|ew|e)?$",
"^tabs$" : "^tabs$",
"^tags$" : "^tags$",
"^tc\\%[l]$" : "^tc(l)?$",
"^tcld\\%[o]$" : "^tcld(o)?$",
"^tclf\\%[ile]$" : "^tclf(ile|il|i)?$",
"^te\\%[aroff]$" : "^te(aroff|arof|aro|ar|a)?$",
"^tf\\%[irst]$" : "^tf(irst|irs|ir|i)?$",
"^th\\%[row]$" : "^th(row|ro|r)?$",
"^tj\\%[ump]$" : "^tj(ump|um|u)?$",
"^tl\\%[ast]$" : "^tl(ast|as|a)?$",
"^tm\\%[enu]$" : "^tm(enu|en|e)?$",
"^tn\\%[ext]$" : "^tn(ext|ex|e)?$",
"^to\\%[pleft]$" : "^to(pleft|plef|ple|pl|p)?$",
"^tp\\%[revious]$" : "^tp(revious|reviou|revio|revi|rev|re|r)?$",
"^tr\\%[ewind]$" : "^tr(ewind|ewin|ewi|ew|e)?$",
"^try$" : "^try$",
"^ts\\%[elect]$" : "^ts(elect|elec|ele|el|e)?$",
"^tu\\%[nmenu]$" : "^tu(nmenu|nmen|nme|nm|n)?$",
"^u\\%[ndo]$" : "^u(ndo|nd|n)?$",
"^una\\%[bbreviate]$" : "^una(bbreviate|bbreviat|bbrevia|bbrevi|bbrev|bbre|bbr|bb|b)?$",
"^undoj\\%[oin]$" : "^undoj(oin|oi|o)?$",
"^undol\\%[ist]$" : "^undol(ist|is|i)?$",
"^unh\\%[ide]$" : "^unh(ide|id|i)?$",
"^unl\\%[et]$" : "^unl(et|e)?$",
"^unlo\\%[ckvar]$" : "^unlo(ckvar|ckva|ckv|ck|c)?$",
"^unm\\%[ap]$" : "^unm(ap|a)?$",
"^unme\\%[nu]$" : "^unme(nu|n)?$",
"^uns\\%[ilent]$" : "^uns(ilent|ilen|ile|il|i)?$",
"^up\\%[date]$" : "^up(date|dat|da|d)?$",
"^v\\%[global]$" : "^v(global|globa|glob|glo|gl|g)?$",
"^ve\\%[rsion]$" : "^ve(rsion|rsio|rsi|rs|r)?$",
"^verb\\%[ose]$" : "^verb(ose|os|o)?$",
"^vert\\%[ical]$" : "^vert(ical|ica|ic|i)?$",
"^vi\\%[sual]$" : "^vi(sual|sua|su|s)?$",
"^vie\\%[w]$" : "^vie(w)?$",
"^vim\\%[grep]$" : "^vim(grep|gre|gr|g)?$",
"^vimgrepa\\%[dd]$" : "^vimgrepa(dd|d)?$",
"^viu\\%[sage]$" : "^viu(sage|sag|sa|s)?$",
"^vm\\%[ap]$" : "^vm(ap|a)?$",
"^vmapc\\%[lear]$" : "^vmapc(lear|lea|le|l)?$",
"^vme\\%[nu]$" : "^vme(nu|n)?$",
"^vn\\%[oremap]$" : "^vn(oremap|orema|orem|ore|or|o)?$",
"^vne\\%[w]$" : "^vne(w)?$",
"^vnoreme\\%[nu]$" : "^vnoreme(nu|n)?$",
"^vs\\%[plit]$" : "^vs(plit|pli|pl|p)?$",
"^vu\\%[nmap]$" : "^vu(nmap|nma|nm|n)?$",
"^vunme\\%[nu]$" : "^vunme(nu|n)?$",
"^wN\\%[ext]$" : "^wN(ext|ex|e)?$",
"^w\\%[rite]$" : "^w(rite|rit|ri|r)?$",
"^wa\\%[ll]$" : "^wa(ll|l)?$",
"^wh\\%[ile]$" : "^wh(ile|il|i)?$",
"^wi\\%[nsize]$" : "^wi(nsize|nsiz|nsi|ns|n)?$",
"^winc\\%[md]$" : "^winc(md|m)?$",
"^windo$" : "^windo$",
"^winp\\%[os]$" : "^winp(os|o)?$",
"^wn\\%[ext]$" : "^wn(ext|ex|e)?$",
"^wp\\%[revious]$" : "^wp(revious|reviou|revio|revi|rev|re|r)?$",
"^wq$" : "^wq$",
"^wqa\\%[ll]$" : "^wqa(ll|l)?$",
"^ws\\%[verb]$" : "^ws(verb|ver|ve|v)?$",
"^wu\\%[ndo]$" : "^wu(ndo|nd|n)?$",
"^wv\\%[iminfo]$" : "^wv(iminfo|iminf|imin|imi|im|i)?$",
"^x\\%[it]$" : "^x(it|i)?$",
"^xa\\%[ll]$" : "^xa(ll|l)?$",
"^xm\\%[ap]$" : "^xm(ap|a)?$",
"^xmapc\\%[lear]$" : "^xmapc(lear|lea|le|l)?$",
"^xme\\%[nu]$" : "^xme(nu|n)?$",
"^xn\\%[oremap]$" : "^xn(oremap|orema|orem|ore|or|o)?$",
"^xnoreme\\%[nu]$" : "^xnoreme(nu|n)?$",
"^xu\\%[nmap]$" : "^xu(nmap|nma|nm|n)?$",
"^xunme\\%[nu]$" : "^xunme(nu|n)?$",
"^y\\%[ank]$" : "^y(ank|an|a)?$",
"^z$" : "^z$",
"^{" : "^{",
"^|" : "^\\|",
"^||" : "^\\|\\|",
"^}" : "^}",
"[Ee][-+]\\d" : "[Ee][-+]\\d",
"^\\s*\\\\" : "^\\s*\\\\",
}
def viml_add(lst, item):
lst.append(item)
def viml_call(func, *args):
func(*args)
def viml_empty(obj):
return len(obj) == 0
def viml_eqreg(s, reg):
return re.search(pat_vim2py[reg], s, re.IGNORECASE)
def viml_eqregh(s, reg):
return re.search(pat_vim2py[reg], s)
def viml_eqregq(s, reg):
return re.search(pat_vim2py[reg], s, re.IGNORECASE)
def viml_escape(s, chars):
r = ''
for c in s:
if c in chars:
r += "\\" + c
else:
r += c
return r
def viml_extend(obj, item):
obj.extend(item)
def viml_insert(lst, item, idx = 0):
lst.insert(idx, item)
def viml_join(lst, sep):
return sep.join(lst)
def viml_keys(obj):
return obj.keys()
def viml_len(obj):
return len(obj)
def viml_printf(*args):
if len(args) == 1:
return args[0]
else:
return args[0] % args[1:]
def viml_range(start, end=None):
if end is None:
return range(start)
else:
return range(start, end + 1)
def viml_readfile(path):
lines = []
f = open(path)
for line in f.readlines():
lines.append(line.rstrip("\r\n"))
f.close()
return lines
def viml_remove(lst, idx):
del lst[idx]
def viml_split(s, sep):
if sep == "\\zs":
return s
raise Exception("NotImplemented")
def viml_str2nr(s, base=10):
return int(s, base)
def viml_string(obj):
return str(obj)
#!/usr/bin/env python3
# usage: python3 vimlparser.py foo.vim
import sys
import re
# vimlparser.py foo.vim
def main():
r = StringReader(viml_readfile(sys.argv[1]))
p = VimLParser()
c = Compiler()
for line in c.compile(p.parse(r)):
print(line)
class AttributeDict(dict):
__getattribute__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
pat_vim2py = {
":\\|\\s" : ":|\\s",
"[-+]" : "[-+]",
"[/?]" : "[/?]",
"[0-9A-Za-z_]" : "[0-9A-Za-z_]",
"[0-9a-zA-Z]" : "[0-9a-zA-Z]",
"[@*!=><&~#]" : "[@*!=><&~#]",
"[gj]" : "[gj]",
"\\.\\d" : "\\.\\d",
"\\<ARGOPT\\>" : "\\bARGOPT\\b",
"\\<BANG\\>" : "\\bBANG\\b",
"\\<EDITCMD\\>" : "\\bEDITCMD\\b",
"\\<NOTRLCOM\\>" : "\\bNOTRLCOM\\b",
"\\<TRLBAR\\>" : "\\bTRLBAR\\b",
"\\<USECTRLV\\>" : "\\bUSECTRLV\\b",
"\\<\\(XFILE\\|FILES\\|FILE1\\)\\>" : "\\b(XFILE|FILES|FILE1)\\b",
"\\S" : "\\S",
"\\a" : "[A-Za-z]",
"\\d" : "\\d",
"\\h" : "[A-Za-z_]",
"\\s" : "\\s",
"\\v^%(IDENTIFIER|INDEX|DOT|OPTION|ENV|REG)$" : "^(IDENTIFIER|INDEX|DOT|OPTION|ENV|REG)$",
"\\v^%(IF|ELSEIF|ELSE)$" : "^(IF|ELSEIF|ELSE)$",
"\\v^%(TRY|CATCH|FINALLY)$" : "^(TRY|CATCH|FINALLY)$",
"\\v^%(substitute|smagic|snomagic)$" : "^(substitute|smagic|snomagic)$",
"\\v^%(write|update)$" : "^(write|update)$",
"\\v^d%[elete][lp]$" : "^d(elete|elet|ele|el|e)[lp]$",
"\\v^s%(c[^sr][^i][^p]|g|i[^mlg]|I|r[^e])" : "^s(c[^sr][^i][^p]|g|i[^mlg]|I|r[^e])",
"\\w" : "[0-9A-Za-z_]",
"\\w\\|[:#]" : "[0-9A-Za-z_]|[:#]",
"\\x" : "[0-9A-Fa-f]",
"^!" : "^!",
"^!$" : "^!$",
"^!=" : "^!=",
"^!=#" : "^!=#",
"^!=?" : "^!=\\?",
"^!\\~" : "^!~",
"^!\\~#" : "^!~#",
"^!\\~?" : "^!~\\?",
"^#$" : "^#$",
"^%" : "^%",
"^&$" : "^&$",
"^&&" : "^&&",
"^&\\(g:\\|l:\\|\\w\\w\\)" : "^&(g:|l:|[0-9A-Za-z_][0-9A-Za-z_])",
"^'" : "^'",
"^(" : "^\(",
"^)" : "^\)",
"^)\\+$" : "^\)+$",
"^+" : "^\+",
"^++" : "^\+\+",
"^++bad=\\(keep\\|drop\\|.\\)\\>" : "^\\+\\+bad=(keep|drop|.)\\b",
"^++bad=drop" : "^\\+\\+bad=drop",
"^++bad=keep" : "^\\+\\+bad=keep",
"^++bin\\>" : "^\\+\\+bin\\b",
"^++edit\\>" : "^\\+\\+edit\\b",
"^++enc=\\S" : "^\\+\\+enc=\\S",
"^++encoding=\\S" : "^\\+\\+encoding=\\S",
"^++ff=\\(dos\\|unix\\|mac\\)\\>" : "^\\+\\+ff=(dos|unix|mac)\\b",
"^++fileformat=\\(dos\\|unix\\|mac\\)\\>" : "^\\+\\+fileformat=(dos|unix|mac)\\b",
"^++nobin\\>" : "^\\+\\+nobin\\b",
"^," : "^,",
"^-" : "^-",
"^/" : "^/",
"^0x\\x" : "^0x[0-9A-Fa-f]",
"^:" : "^:",
"^;" : "^;",
"^<" : "^<",
"^<#" : "^<#",
"^<$" : "^<$",
"^<=" : "^<=",
"^<=#" : "^<=#",
"^<=?" : "^<=\\?",
"^<?" : "^<\\?",
"^<[Ss][Ii][Dd]>\\h" : "^<[Ss][Ii][Dd]>[A-Za-z_]",
"^=" : "^=",
"^=$" : "^=$",
"^==" : "^==",
"^==#" : "^==#",
"^==?" : "^==\\?",
"^=\\~" : "^=~",
"^=\\~#" : "^=~#",
"^=\\~?" : "^=~\\?",
"^>" : "^>",
"^>#" : "^>#",
"^>$" : "^>$",
"^>=" : "^>=",
"^>=#" : "^>=#",
"^>=?" : "^>=\\?",
"^>?" : "^>\\?",
"^?" : "^\\?",
"^@$" : "^@$",
"^@." : "^@.",
"^FUNCTION$" : "^FUNCTION$",
"^N\\%[ext]$" : "^N(ext|ex|e)$",
"^P\\%[rint]$" : "^P(rint|rin|ri|r)$",
"^X$" : "^X$",
"^[<>]$" : "^[<>]$",
"^[A-Z]" : "^[A-Z]",
"^\"" : "^\"",
"^\\$\\w\\+" : "^\\$[0-9A-Za-z_]+",
"^\\(!\\|global\\|vglobal\\)$" : "^(!|global|vglobal)$",
"^\\(WHILE\\|FOR\\)$" : "^(WHILE|FOR)$",
"^\\(vimgrep\\|vimgrepadd\\|lvimgrep\\|lvimgrepadd\\)$" : "^(vimgrep|vimgrepadd|lvimgrep|lvimgrepadd)$",
"^\\*" : "^\\*",
"^\\*$" : "^\\*$",
"^\\." : "^\\.",
"^\\[" : "^\[",
"^\\d" : "^\\d",
"^\\h" : "^[A-Za-z_]",
"^\\s" : "^\\s",
"^\\~$" : "^~$",
"^]" : "^]",
"^`" : "^`",
"^a\\%[ppend]$" : "^a(ppend|ppen|ppe|pp|p)?$",
"^ab\\%[breviate]$" : "^ab(breviate|breviat|brevia|brevi|brev|bre|br|b)?$",
"^abc\\%[lear]$" : "^abc(lear|lea|le|l)?$",
"^abo\\%[veleft]$" : "^abo(veleft|velef|vele|vel|ve|v)?$",
"^al\\%[l]$" : "^al(l)?$",
"^am\\%[enu]$" : "^am(enu|en|e)?$",
"^an\\%[oremenu]$" : "^an(oremenu|oremen|oreme|orem|ore|or|o)?$",
"^ar\\%[gs]$" : "^ar(gs|g)?$",
"^arga\\%[dd]$" : "^arga(dd|d)?$",
"^argd\\%[elete]$" : "^argd(elete|elet|ele|el|e)?$",
"^argdo$" : "^argdo$",
"^arge\\%[dit]$" : "^arge(dit|di|d)?$",
"^argg\\%[lobal]$" : "^argg(lobal|loba|lob|lo|l)?$",
"^argl\\%[ocal]$" : "^argl(ocal|oca|oc|o)?$",
"^argu\\%[ment]$" : "^argu(ment|men|me|m)?$",
"^as\\%[cii]$" : "^as(cii|ci|c)?$",
"^au\\%[tocmd]$" : "^au(tocmd|tocm|toc|to|t)?$",
"^aug\\%[roup]$" : "^aug(roup|rou|ro|r)?$",
"^aun\\%[menu]$" : "^aun(menu|men|me|m)?$",
"^bN\\%[ext]$" : "^bN(ext|ex|e)?$",
"^b\\%[uffer]$" : "^b(uffer|uffe|uff|uf|u)?$",
"^ba\\%[ll]$" : "^ba(ll|l)?$",
"^bad\\%[d]$" : "^bad(d)?$",
"^bd\\%[elete]$" : "^bd(elete|elet|ele|el|e)?$",
"^be\\%[have]$" : "^be(have|hav|ha|h)?$",
"^bel\\%[owright]$" : "^bel(owright|owrigh|owrig|owri|owr|ow|o)?$",
"^bf\\%[irst]$" : "^bf(irst|irs|ir|i)?$",
"^bl\\%[ast]$" : "^bl(ast|as|a)?$",
"^bm\\%[odified]$" : "^bm(odified|odifie|odifi|odif|odi|od|o)?$",
"^bn\\%[ext]$" : "^bn(ext|ex|e)?$",
"^bo\\%[tright]$" : "^bo(tright|trigh|trig|tri|tr|t)?$",
"^bp\\%[revious]$" : "^bp(revious|reviou|revio|revi|rev|re|r)?$",
"^br\\%[ewind]$" : "^br(ewind|ewin|ewi|ew|e)?$",
"^brea\\%[k]$" : "^brea(k)?$",
"^breaka\\%[dd]$" : "^breaka(dd|d)?$",
"^breakd\\%[el]$" : "^breakd(el|e)?$",
"^breakl\\%[ist]$" : "^breakl(ist|is|i)?$",
"^bro\\%[wse]$" : "^bro(wse|ws|w)?$",
"^bufdo$" : "^bufdo$",
"^buffers$" : "^buffers$",
"^bun\\%[load]$" : "^bun(load|loa|lo|l)?$",
"^bw\\%[ipeout]$" : "^bw(ipeout|ipeou|ipeo|ipe|ip|i)?$",
"^cN\\%[ext]$" : "^cN(ext|ex|e)?$",
"^cNf\\%[ile]$" : "^cNf(ile|il|i)?$",
"^c\\%[hange]$" : "^c(hange|hang|han|ha|h)?$",
"^ca\\%[bbrev]$" : "^ca(bbrev|bbre|bbr|bb|b)?$",
"^cabc\\%[lear]$" : "^cabc(lear|lea|le|l)?$",
"^cad\\%[dexpr]$" : "^cad(dexpr|dexp|dex|de|d)?$",
"^caddb\\%[uffer]$" : "^caddb(uffer|uffe|uff|uf|u)?$",
"^caddf\\%[ile]$" : "^caddf(ile|il|i)?$",
"^cal\\%[l]$" : "^cal(l)?$",
"^cat\\%[ch]$" : "^cat(ch|c)?$",
"^cb\\%[uffer]$" : "^cb(uffer|uffe|uff|uf|u)?$",
"^cc$" : "^cc$",
"^ccl\\%[ose]$" : "^ccl(ose|os|o)?$",
"^cd$" : "^cd$",
"^ce\\%[nter]$" : "^ce(nter|nte|nt|n)?$",
"^cex\\%[pr]$" : "^cex(pr|p)?$",
"^cf\\%[ile]$" : "^cf(ile|il|i)?$",
"^cfir\\%[st]$" : "^cfir(st|s)?$",
"^cg\\%[etfile]$" : "^cg(etfile|etfil|etfi|etf|et|e)?$",
"^cgetb\\%[uffer]$" : "^cgetb(uffer|uffe|uff|uf|u)?$",
"^cgete\\%[xpr]$" : "^cgete(xpr|xp|x)?$",
"^cha\\%[nges]$" : "^cha(nges|nge|ng|n)?$",
"^chd\\%[ir]$" : "^chd(ir|i)?$",
"^che\\%[ckpath]$" : "^che(ckpath|ckpat|ckpa|ckp|ck|c)?$",
"^checkt\\%[ime]$" : "^checkt(ime|im|i)?$",
"^cl\\%[ist]$" : "^cl(ist|is|i)?$",
"^cla\\%[st]$" : "^cla(st|s)?$",
"^clo\\%[se]$" : "^clo(se|s)?$",
"^cm\\%[ap]$" : "^cm(ap|a)?$",
"^cmapc\\%[lear]$" : "^cmapc(lear|lea|le|l)?$",
"^cme\\%[nu]$" : "^cme(nu|n)?$",
"^cn\\%[ext]$" : "^cn(ext|ex|e)?$",
"^cnew\\%[er]$" : "^cnew(er|e)?$",
"^cnf\\%[ile]$" : "^cnf(ile|il|i)?$",
"^cno\\%[remap]$" : "^cno(remap|rema|rem|re|r)?$",
"^cnorea\\%[bbrev]$" : "^cnorea(bbrev|bbre|bbr|bb|b)?$",
"^cnoreme\\%[nu]$" : "^cnoreme(nu|n)?$",
"^co\\%[py]$" : "^co(py|p)?$",
"^col\\%[der]$" : "^col(der|de|d)?$",
"^colo\\%[rscheme]$" : "^colo(rscheme|rschem|rsche|rsch|rsc|rs|r)?$",
"^com\\%[mand]$" : "^com(mand|man|ma|m)?$",
"^comc\\%[lear]$" : "^comc(lear|lea|le|l)?$",
"^comp\\%[iler]$" : "^comp(iler|ile|il|i)?$",
"^con\\%[tinue]$" : "^con(tinue|tinu|tin|ti|t)?$",
"^conf\\%[irm]$" : "^conf(irm|ir|i)?$",
"^cope\\%[n]$" : "^cope(n)?$",
"^cp\\%[revious]$" : "^cp(revious|reviou|revio|revi|rev|re|r)?$",
"^cpf\\%[ile]$" : "^cpf(ile|il|i)?$",
"^cq\\%[uit]$" : "^cq(uit|ui|u)?$",
"^cr\\%[ewind]$" : "^cr(ewind|ewin|ewi|ew|e)?$",
"^cs\\%[cope]$" : "^cs(cope|cop|co|c)?$",
"^cst\\%[ag]$" : "^cst(ag|a)?$",
"^cu\\%[nmap]$" : "^cu(nmap|nma|nm|n)?$",
"^cuna\\%[bbrev]$" : "^cuna(bbrev|bbre|bbr|bb|b)?$",
"^cunme\\%[nu]$" : "^cunme(nu|n)?$",
"^cw\\%[indow]$" : "^cw(indow|indo|ind|in|i)?$",
"^d\\%[elete]$" : "^d(elete|elet|ele|el|e)?$",
"^deb\\%[ug]$" : "^deb(ug|u)?$",
"^debugg\\%[reedy]$" : "^debugg(reedy|reed|ree|re|r)?$",
"^delc\\%[ommand]$" : "^delc(ommand|omman|omma|omm|om|o)?$",
"^delf\\%[unction]$" : "^delf(unction|unctio|uncti|unct|unc|un|u)?$",
"^delm\\%[arks]$" : "^delm(arks|ark|ar|a)?$",
"^di\\%[splay]$" : "^di(splay|spla|spl|sp|s)?$",
"^dif\\%[fupdate]$" : "^dif(fupdate|fupdat|fupda|fupd|fup|fu|f)?$",
"^diffg\\%[et]$" : "^diffg(et|e)?$",
"^diffo\\%[ff]$" : "^diffo(ff|f)?$",
"^diffp\\%[atch]$" : "^diffp(atch|atc|at|a)?$",
"^diffpu\\%[t]$" : "^diffpu(t)?$",
"^diffs\\%[plit]$" : "^diffs(plit|pli|pl|p)?$",
"^diffthis$" : "^diffthis$",
"^dig\\%[raphs]$" : "^dig(raphs|raph|rap|ra|r)?$",
"^dj\\%[ump]$" : "^dj(ump|um|u)?$",
"^dl\\%[ist]$" : "^dl(ist|is|i)?$",
"^do\\%[autocmd]$" : "^do(autocmd|autocm|autoc|auto|aut|au|a)?$",
"^doautoa\\%[ll]$" : "^doautoa(ll|l)?$",
"^dr\\%[op]$" : "^dr(op|o)?$",
"^ds\\%[earch]$" : "^ds(earch|earc|ear|ea|e)?$",
"^dsp\\%[lit]$" : "^dsp(lit|li|l)?$",
"^e\\%[dit]$" : "^e(dit|di|d)?$",
"^ea\\%[rlier]$" : "^ea(rlier|rlie|rli|rl|r)?$",
"^ec\\%[ho]$" : "^ec(ho|h)?$",
"^echoe\\%[rr]$" : "^echoe(rr|r)?$",
"^echoh\\%[l]$" : "^echoh(l)?$",
"^echom\\%[sg]$" : "^echom(sg|s)?$",
"^echon$" : "^echon$",
"^el\\%[se]$" : "^el(se|s)?$",
"^elsei\\%[f]$" : "^elsei(f)?$",
"^em\\%[enu]$" : "^em(enu|en|e)?$",
"^en\\%[dif]$" : "^en(dif|di|d)?$",
"^endf\\%[unction]$" : "^endf(unction|unctio|uncti|unct|unc|un|u)?$",
"^endfo\\%[r]$" : "^endfo(r)?$",
"^endt\\%[ry]$" : "^endt(ry|r)?$",
"^endw\\%[hile]$" : "^endw(hile|hil|hi|h)?$",
"^ene\\%[w]$" : "^ene(w)?$",
"^ex$" : "^ex$",
"^exe\\%[cute]$" : "^exe(cute|cut|cu|c)?$",
"^exi\\%[t]$" : "^exi(t)?$",
"^exu\\%[sage]$" : "^exu(sage|sag|sa|s)?$",
"^f\\%[ile]$" : "^f(ile|il|i)?$",
"^files$" : "^files$",
"^filet\\%[ype]$" : "^filet(ype|yp|y)?$",
"^fin\\%[d]$" : "^fin(d)?$",
"^fina\\%[lly]$" : "^fina(lly|ll|l)?$",
"^fini\\%[sh]$" : "^fini(sh|s)?$",
"^fir\\%[st]$" : "^fir(st|s)?$",
"^fix\\%[del]$" : "^fix(del|de|d)?$",
"^fo\\%[ld]$" : "^fo(ld|l)?$",
"^foldc\\%[lose]$" : "^foldc(lose|los|lo|l)?$",
"^foldd\\%[oopen]$" : "^foldd(oopen|oope|oop|oo|o)?$",
"^folddoc\\%[losed]$" : "^folddoc(losed|lose|los|lo|l)?$",
"^foldo\\%[pen]$" : "^foldo(pen|pe|p)?$",
"^for$" : "^for$",
"^fu\\%[nction]$" : "^fu(nction|nctio|ncti|nct|nc|n)?$",
"^g\\%[lobal]$" : "^g(lobal|loba|lob|lo|l)?$",
"^go\\%[to]$" : "^go(to|t)?$",
"^gr\\%[ep]$" : "^gr(ep|e)?$",
"^grepa\\%[dd]$" : "^grepa(dd|d)?$",
"^gu\\%[i]$" : "^gu(i)?$",
"^gv\\%[im]$" : "^gv(im|i)?$",
"^h\\%[elp]$" : "^h(elp|el|e)?$",
"^ha\\%[rdcopy]$" : "^ha(rdcopy|rdcop|rdco|rdc|rd|r)?$",
"^helpf\\%[ind]$" : "^helpf(ind|in|i)?$",
"^helpg\\%[rep]$" : "^helpg(rep|re|r)?$",
"^helpt\\%[ags]$" : "^helpt(ags|ag|a)?$",
"^hi\\%[ghlight]$" : "^hi(ghlight|ghligh|ghlig|ghli|ghl|gh|g)?$",
"^hid\\%[e]$" : "^hid(e)?$",
"^his\\%[tory]$" : "^his(tory|tor|to|t)?$",
"^i\\%[nsert]$" : "^i(nsert|nser|nse|ns|n)?$",
"^ia\\%[bbrev]$" : "^ia(bbrev|bbre|bbr|bb|b)?$",
"^iabc\\%[lear]$" : "^iabc(lear|lea|le|l)?$",
"^if$" : "^if$",
"^ij\\%[ump]$" : "^ij(ump|um|u)?$",
"^il\\%[ist]$" : "^il(ist|is|i)?$",
"^im\\%[ap]$" : "^im(ap|a)?$",
"^imapc\\%[lear]$" : "^imapc(lear|lea|le|l)?$",
"^ime\\%[nu]$" : "^ime(nu|n)?$",
"^ino\\%[remap]$" : "^ino(remap|rema|rem|re|r)?$",
"^inorea\\%[bbrev]$" : "^inorea(bbrev|bbre|bbr|bb|b)?$",
"^inoreme\\%[nu]$" : "^inoreme(nu|n)?$",
"^int\\%[ro]$" : "^int(ro|r)?$",
"^is#" : "^is#",
"^is?" : "^is\\?",
"^is\\%[earch]$" : "^is(earch|earc|ear|ea|e)?$",
"^is\\>" : "^is\\b",
"^isnot#" : "^isnot#",
"^isnot?" : "^isnot\\?",
"^isnot\\>" : "^isnot\\b",
"^isp\\%[lit]$" : "^isp(lit|li|l)?$",
"^iu\\%[nmap]$" : "^iu(nmap|nma|nm|n)?$",
"^iuna\\%[bbrev]$" : "^iuna(bbrev|bbre|bbr|bb|b)?$",
"^iunme\\%[nu]$" : "^iunme(nu|n)?$",
"^j\\%[oin]$" : "^j(oin|oi|o)?$",
"^ju\\%[mps]$" : "^ju(mps|mp|m)?$",
"^k$" : "^k$",
"^kee\\%[pmarks]$" : "^kee(pmarks|pmark|pmar|pma|pm|p)?$",
"^keepa\\%[lt]$" : "^keepa(lt|l)?$",
"^keepj\\%[umps]$" : "^keepj(umps|ump|um|u)?$",
"^lN\\%[ext]$" : "^lN(ext|ex|e)?$",
"^lNf\\%[ile]$" : "^lNf(ile|il|i)?$",
"^l\\%[ist]$" : "^l(ist|is|i)?$",
"^la\\%[st]$" : "^la(st|s)?$",
"^lad\\%[dexpr]$" : "^lad(dexpr|dexp|dex|de|d)?$",
"^laddb\\%[uffer]$" : "^laddb(uffer|uffe|uff|uf|u)?$",
"^laddf\\%[ile]$" : "^laddf(ile|il|i)?$",
"^lan\\%[guage]$" : "^lan(guage|guag|gua|gu|g)?$",
"^lat\\%[er]$" : "^lat(er|e)?$",
"^lb\\%[uffer]$" : "^lb(uffer|uffe|uff|uf|u)?$",
"^lc\\%[d]$" : "^lc(d)?$",
"^lch\\%[dir]$" : "^lch(dir|di|d)?$",
"^lcl\\%[ose]$" : "^lcl(ose|os|o)?$",
"^lcs\\%[cope]$" : "^lcs(cope|cop|co|c)?$",
"^le\\%[ft]$" : "^le(ft|f)?$",
"^lefta\\%[bove]$" : "^lefta(bove|bov|bo|b)?$",
"^let$" : "^let$",
"^lex\\%[pr]$" : "^lex(pr|p)?$",
"^lf\\%[ile]$" : "^lf(ile|il|i)?$",
"^lfir\\%[st]$" : "^lfir(st|s)?$",
"^lg\\%[etfile]$" : "^lg(etfile|etfil|etfi|etf|et|e)?$",
"^lgetb\\%[uffer]$" : "^lgetb(uffer|uffe|uff|uf|u)?$",
"^lgete\\%[xpr]$" : "^lgete(xpr|xp|x)?$",
"^lgr\\%[ep]$" : "^lgr(ep|e)?$",
"^lgrepa\\%[dd]$" : "^lgrepa(dd|d)?$",
"^lh\\%[elpgrep]$" : "^lh(elpgrep|elpgre|elpgr|elpg|elp|el|e)?$",
"^ll$" : "^ll$",
"^lla\\%[st]$" : "^lla(st|s)?$",
"^lli\\%[st]$" : "^lli(st|s)?$",
"^lm\\%[ap]$" : "^lm(ap|a)?$",
"^lmak\\%[e]$" : "^lmak(e)?$",
"^lmapc\\%[lear]$" : "^lmapc(lear|lea|le|l)?$",
"^ln\\%[oremap]$" : "^ln(oremap|orema|orem|ore|or|o)?$",
"^lne\\%[xt]$" : "^lne(xt|x)?$",
"^lnew\\%[er]$" : "^lnew(er|e)?$",
"^lnf\\%[ile]$" : "^lnf(ile|il|i)?$",
"^lo\\%[adview]$" : "^lo(adview|advie|advi|adv|ad|a)?$",
"^loadk\\%[eymap]$" : "^loadk(eymap|eyma|eym|ey|e)?$",
"^loc\\%[kmarks]$" : "^loc(kmarks|kmark|kmar|kma|km|k)?$",
"^lockv\\%[ar]$" : "^lockv(ar|a)?$",
"^lol\\%[der]$" : "^lol(der|de|d)?$",
"^lope\\%[n]$" : "^lope(n)?$",
"^lp\\%[revious]$" : "^lp(revious|reviou|revio|revi|rev|re|r)?$",
"^lpf\\%[ile]$" : "^lpf(ile|il|i)?$",
"^lr\\%[ewind]$" : "^lr(ewind|ewin|ewi|ew|e)?$",
"^ls$" : "^ls$",
"^lt\\%[ag]$" : "^lt(ag|a)?$",
"^lu\\%[nmap]$" : "^lu(nmap|nma|nm|n)?$",
"^lua$" : "^lua$",
"^luad\\%[o]$" : "^luad(o)?$",
"^luaf\\%[ile]$" : "^luaf(ile|il|i)?$",
"^lv\\%[imgrep]$" : "^lv(imgrep|imgre|imgr|img|im|i)?$",
"^lvimgrepa\\%[dd]$" : "^lvimgrepa(dd|d)?$",
"^lw\\%[indow]$" : "^lw(indow|indo|ind|in|i)?$",
"^m\\%[ove]$" : "^m(ove|ov|o)?$",
"^ma\\%[rk]$" : "^ma(rk|r)?$",
"^mak\\%[e]$" : "^mak(e)?$",
"^map$" : "^map$",
"^mapc\\%[lear]$" : "^mapc(lear|lea|le|l)?$",
"^marks$" : "^marks$",
"^mat\\%[ch]$" : "^mat(ch|c)?$",
"^me\\%[nu]$" : "^me(nu|n)?$",
"^menut\\%[ranslate]$" : "^menut(ranslate|ranslat|ransla|ransl|rans|ran|ra|r)?$",
"^mes\\%[sages]$" : "^mes(sages|sage|sag|sa|s)?$",
"^mk\\%[exrc]$" : "^mk(exrc|exr|ex|e)?$",
"^mks\\%[ession]$" : "^mks(ession|essio|essi|ess|es|e)?$",
"^mksp\\%[ell]$" : "^mksp(ell|el|e)?$",
"^mkv\\%[imrc]$" : "^mkv(imrc|imr|im|i)?$",
"^mkvie\\%[w]$" : "^mkvie(w)?$",
"^mod\\%[e]$" : "^mod(e)?$",
"^mz\\%[scheme]$" : "^mz(scheme|schem|sche|sch|sc|s)?$",
"^mzf\\%[ile]$" : "^mzf(ile|il|i)?$",
"^n\\%[ext]$" : "^n(ext|ex|e)?$",
"^nb\\%[key]$" : "^nb(key|ke|k)?$",
"^nbc\\%[lose]$" : "^nbc(lose|los|lo|l)?$",
"^nbs\\%[art]$" : "^nbs(art|ar|a)?$",
"^new$" : "^new$",
"^nm\\%[ap]$" : "^nm(ap|a)?$",
"^nmapc\\%[lear]$" : "^nmapc(lear|lea|le|l)?$",
"^nme\\%[nu]$" : "^nme(nu|n)?$",
"^nn\\%[oremap]$" : "^nn(oremap|orema|orem|ore|or|o)?$",
"^nnoreme\\%[nu]$" : "^nnoreme(nu|n)?$",
"^no\\%[remap]$" : "^no(remap|rema|rem|re|r)?$",
"^noa\\%[utocmd]$" : "^noa(utocmd|utocm|utoc|uto|ut|u)?$",
"^noh\\%[lsearch]$" : "^noh(lsearch|lsearc|lsear|lsea|lse|ls|l)?$",
"^norea\\%[bbrev]$" : "^norea(bbrev|bbre|bbr|bb|b)?$",
"^noreme\\%[nu]$" : "^noreme(nu|n)?$",
"^norm\\%[al]$" : "^norm(al|a)?$",
"^nu\\%[mber]$" : "^nu(mber|mbe|mb|m)?$",
"^nun\\%[map]$" : "^nun(map|ma|m)?$",
"^nunme\\%[nu]$" : "^nunme(nu|n)?$",
"^o\\%[pen]$" : "^o(pen|pe|p)?$",
"^ol\\%[dfiles]$" : "^ol(dfiles|dfile|dfil|dfi|df|d)?$",
"^om\\%[ap]$" : "^om(ap|a)?$",
"^omapc\\%[lear]$" : "^omapc(lear|lea|le|l)?$",
"^ome\\%[nu]$" : "^ome(nu|n)?$",
"^on\\%[ly]$" : "^on(ly|l)?$",
"^ono\\%[remap]$" : "^ono(remap|rema|rem|re|r)?$",
"^onoreme\\%[nu]$" : "^onoreme(nu|n)?$",
"^opt\\%[ions]$" : "^opt(ions|ion|io|i)?$",
"^ou\\%[nmap]$" : "^ou(nmap|nma|nm|n)?$",
"^ounme\\%[nu]$" : "^ounme(nu|n)?$",
"^ow\\%[nsyntax]$" : "^ow(nsyntax|nsynta|nsynt|nsyn|nsy|ns|n)?$",
"^p\\%[rint]$" : "^p(rint|rin|ri|r)?$",
"^pc\\%[lose]$" : "^pc(lose|los|lo|l)?$",
"^pe\\%[rl]$" : "^pe(rl|r)?$",
"^ped\\%[it]$" : "^ped(it|i)?$",
"^perld\\%[o]$" : "^perld(o)?$",
"^po\\%[p]$" : "^po(p)?$",
"^pop\\%[up]$" : "^pop(up|u)?$",
"^pp\\%[op]$" : "^pp(op|o)?$",
"^pre\\%[serve]$" : "^pre(serve|serv|ser|se|s)?$",
"^prev\\%[ious]$" : "^prev(ious|iou|io|i)?$",
"^pro\\%[mptfind]$" : "^pro(mptfind|mptfin|mptfi|mptf|mpt|mp|m)?$",
"^prof\\%[ile]$" : "^prof(ile|il|i)?$",
"^profd\\%[el]$" : "^profd(el|e)?$",
"^promptr\\%[epl]$" : "^promptr(epl|ep|e)?$",
"^ps\\%[earch]$" : "^ps(earch|earc|ear|ea|e)?$",
"^ptN\\%[ext]$" : "^ptN(ext|ex|e)?$",
"^pt\\%[ag]$" : "^pt(ag|a)?$",
"^ptf\\%[irst]$" : "^ptf(irst|irs|ir|i)?$",
"^ptj\\%[ump]$" : "^ptj(ump|um|u)?$",
"^ptl\\%[ast]$" : "^ptl(ast|as|a)?$",
"^ptn\\%[ext]$" : "^ptn(ext|ex|e)?$",
"^ptp\\%[revious]$" : "^ptp(revious|reviou|revio|revi|rev|re|r)?$",
"^ptr\\%[ewind]$" : "^ptr(ewind|ewin|ewi|ew|e)?$",
"^pts\\%[elect]$" : "^pts(elect|elec|ele|el|e)?$",
"^pu\\%[t]$" : "^pu(t)?$",
"^pw\\%[d]$" : "^pw(d)?$",
"^py3$" : "^py3$",
"^py3f\\%[ile]$" : "^py3f(ile|il|i)?$",
"^py\\%[thon]$" : "^py(thon|tho|th|t)?$",
"^pyf\\%[ile]$" : "^pyf(ile|il|i)?$",
"^python3$" : "^python3$",
"^q\\%[uit]$" : "^q(uit|ui|u)?$",
"^qa\\%[ll]$" : "^qa(ll|l)?$",
"^quita\\%[ll]$" : "^quita(ll|l)?$",
"^r\\%[ead]$" : "^r(ead|ea|e)?$",
"^rec\\%[over]$" : "^rec(over|ove|ov|o)?$",
"^red\\%[o]$" : "^red(o)?$",
"^redi\\%[r]$" : "^redi(r)?$",
"^redr\\%[aw]$" : "^redr(aw|a)?$",
"^redraws\\%[tatus]$" : "^redraws(tatus|tatu|tat|ta|t)?$",
"^reg\\%[isters]$" : "^reg(isters|ister|iste|ist|is|i)?$",
"^res\\%[ize]$" : "^res(ize|iz|i)?$",
"^ret\\%[ab]$" : "^ret(ab|a)?$",
"^retu\\%[rn]$" : "^retu(rn|r)?$",
"^rew\\%[ind]$" : "^rew(ind|in|i)?$",
"^ri\\%[ght]$" : "^ri(ght|gh|g)?$",
"^rightb\\%[elow]$" : "^rightb(elow|elo|el|e)?$",
"^ru\\%[ntime]$" : "^ru(ntime|ntim|nti|nt|n)?$",
"^rub\\%[y]$" : "^rub(y)?$",
"^rubyd\\%[o]$" : "^rubyd(o)?$",
"^rubyf\\%[ile]$" : "^rubyf(ile|il|i)?$",
"^rund\\%[o]$" : "^rund(o)?$",
"^rv\\%[iminfo]$" : "^rv(iminfo|iminf|imin|imi|im|i)?$",
"^sN\\%[ext]$" : "^sN(ext|ex|e)?$",
"^s\\%[ubstitute]$" : "^s(ubstitute|ubstitut|ubstitu|ubstit|ubsti|ubst|ubs|ub|u)?$",
"^sa\\%[rgument]$" : "^sa(rgument|rgumen|rgume|rgum|rgu|rg|r)?$",
"^sal\\%[l]$" : "^sal(l)?$",
"^san\\%[dbox]$" : "^san(dbox|dbo|db|d)?$",
"^sav\\%[eas]$" : "^sav(eas|ea|e)?$",
"^sbN\\%[ext]$" : "^sbN(ext|ex|e)?$",
"^sb\\%[uffer]$" : "^sb(uffer|uffe|uff|uf|u)?$",
"^sba\\%[ll]$" : "^sba(ll|l)?$",
"^sbf\\%[irst]$" : "^sbf(irst|irs|ir|i)?$",
"^sbl\\%[ast]$" : "^sbl(ast|as|a)?$",
"^sbm\\%[odified]$" : "^sbm(odified|odifie|odifi|odif|odi|od|o)?$",
"^sbn\\%[ext]$" : "^sbn(ext|ex|e)?$",
"^sbp\\%[revious]$" : "^sbp(revious|reviou|revio|revi|rev|re|r)?$",
"^sbr\\%[ewind]$" : "^sbr(ewind|ewin|ewi|ew|e)?$",
"^scrip\\%[tnames]$" : "^scrip(tnames|tname|tnam|tna|tn|t)?$",
"^scripte\\%[ncoding]" : "^scripte(ncoding|ncodin|ncodi|ncod|nco|nc|n)",
"^scs\\%[cope]$" : "^scs(cope|cop|co|c)?$",
"^se\\%[t]$" : "^se(t)?$",
"^setf\\%[iletype]$" : "^setf(iletype|iletyp|ilety|ilet|ile|il|i)?$",
"^setg\\%[lobal]$" : "^setg(lobal|loba|lob|lo|l)?$",
"^setl\\%[ocal]$" : "^setl(ocal|oca|oc|o)?$",
"^sf\\%[ind]$" : "^sf(ind|in|i)?$",
"^sfir\\%[st]$" : "^sfir(st|s)?$",
"^sh\\%[ell]$" : "^sh(ell|el|e)?$",
"^sig\\%[n]$" : "^sig(n)?$",
"^sil\\%[ent]$" : "^sil(ent|en|e)?$",
"^sim\\%[alt]$" : "^sim(alt|al|a)?$",
"^sl\\%[eep]$" : "^sl(eep|ee|e)?$",
"^sla\\%[st]$" : "^sla(st|s)?$",
"^sm\\%[agic]$" : "^sm(agic|agi|ag|a)?$",
"^sma\\%[p]$" : "^sma(p)?$",
"^smapc\\%[lear]$" : "^smapc(lear|lea|le|l)?$",
"^sme\\%[nu]$" : "^sme(nu|n)?$",
"^sn\\%[ext]$" : "^sn(ext|ex|e)?$",
"^sni\\%[ff]$" : "^sni(ff|f)?$",
"^sno\\%[magic]$" : "^sno(magic|magi|mag|ma|m)?$",
"^snor\\%[emap]$" : "^snor(emap|ema|em|e)?$",
"^snoreme\\%[nu]$" : "^snoreme(nu|n)?$",
"^so\\%[urce]$" : "^so(urce|urc|ur|u)?$",
"^sor\\%[t]$" : "^sor(t)?$",
"^sp\\%[lit]$" : "^sp(lit|li|l)?$",
"^spe\\%[llgood]$" : "^spe(llgood|llgoo|llgo|llg|ll|l)?$",
"^spelld\\%[ump]$" : "^spelld(ump|um|u)?$",
"^spelli\\%[nfo]$" : "^spelli(nfo|nf|n)?$",
"^spellr\\%[epall]$" : "^spellr(epall|epal|epa|ep|e)?$",
"^spellu\\%[ndo]$" : "^spellu(ndo|nd|n)?$",
"^spellw\\%[rong]$" : "^spellw(rong|ron|ro|r)?$",
"^spr\\%[evious]$" : "^spr(evious|eviou|evio|evi|ev|e)?$",
"^sre\\%[wind]$" : "^sre(wind|win|wi|w)?$",
"^st\\%[op]$" : "^st(op|o)?$",
"^sta\\%[g]$" : "^sta(g)?$",
"^star\\%[tinsert]$" : "^star(tinsert|tinser|tinse|tins|tin|ti|t)?$",
"^startg\\%[replace]$" : "^startg(replace|replac|repla|repl|rep|re|r)?$",
"^startr\\%[eplace]$" : "^startr(eplace|eplac|epla|epl|ep|e)?$",
"^stj\\%[ump]$" : "^stj(ump|um|u)?$",
"^stopi\\%[nsert]$" : "^stopi(nsert|nser|nse|ns|n)?$",
"^sts\\%[elect]$" : "^sts(elect|elec|ele|el|e)?$",
"^sun\\%[hide]$" : "^sun(hide|hid|hi|h)?$",
"^sunm\\%[ap]$" : "^sunm(ap|a)?$",
"^sunme\\%[nu]$" : "^sunme(nu|n)?$",
"^sus\\%[pend]$" : "^sus(pend|pen|pe|p)?$",
"^sv\\%[iew]$" : "^sv(iew|ie|i)?$",
"^sw\\%[apname]$" : "^sw(apname|apnam|apna|apn|ap|a)?$",
"^sy\\%[ntax]$" : "^sy(ntax|nta|nt|n)?$",
"^sync\\%[bind]$" : "^sync(bind|bin|bi|b)?$",
"^t$" : "^t$",
"^tN\\%[ext]$" : "^tN(ext|ex|e)?$",
"^ta\\%[g]$" : "^ta(g)?$",
"^tab$" : "^tab$",
"^tabN\\%[ext]$" : "^tabN(ext|ex|e)?$",
"^tabc\\%[lose]$" : "^tabc(lose|los|lo|l)?$",
"^tabdo$" : "^tabdo$",
"^tabe\\%[dit]$" : "^tabe(dit|di|d)?$",
"^tabf\\%[ind]$" : "^tabf(ind|in|i)?$",
"^tabfir\\%[st]$" : "^tabfir(st|s)?$",
"^tabl\\%[ast]$" : "^tabl(ast|as|a)?$",
"^tabm\\%[ove]$" : "^tabm(ove|ov|o)?$",
"^tabn\\%[ext]$" : "^tabn(ext|ex|e)?$",
"^tabnew$" : "^tabnew$",
"^tabo\\%[nly]$" : "^tabo(nly|nl|n)?$",
"^tabp\\%[revious]$" : "^tabp(revious|reviou|revio|revi|rev|re|r)?$",
"^tabr\\%[ewind]$" : "^tabr(ewind|ewin|ewi|ew|e)?$",
"^tabs$" : "^tabs$",
"^tags$" : "^tags$",
"^tc\\%[l]$" : "^tc(l)?$",
"^tcld\\%[o]$" : "^tcld(o)?$",
"^tclf\\%[ile]$" : "^tclf(ile|il|i)?$",
"^te\\%[aroff]$" : "^te(aroff|arof|aro|ar|a)?$",
"^tf\\%[irst]$" : "^tf(irst|irs|ir|i)?$",
"^th\\%[row]$" : "^th(row|ro|r)?$",
"^tj\\%[ump]$" : "^tj(ump|um|u)?$",
"^tl\\%[ast]$" : "^tl(ast|as|a)?$",
"^tm\\%[enu]$" : "^tm(enu|en|e)?$",
"^tn\\%[ext]$" : "^tn(ext|ex|e)?$",
"^to\\%[pleft]$" : "^to(pleft|plef|ple|pl|p)?$",
"^tp\\%[revious]$" : "^tp(revious|reviou|revio|revi|rev|re|r)?$",
"^tr\\%[ewind]$" : "^tr(ewind|ewin|ewi|ew|e)?$",
"^try$" : "^try$",
"^ts\\%[elect]$" : "^ts(elect|elec|ele|el|e)?$",
"^tu\\%[nmenu]$" : "^tu(nmenu|nmen|nme|nm|n)?$",
"^u\\%[ndo]$" : "^u(ndo|nd|n)?$",
"^una\\%[bbreviate]$" : "^una(bbreviate|bbreviat|bbrevia|bbrevi|bbrev|bbre|bbr|bb|b)?$",
"^undoj\\%[oin]$" : "^undoj(oin|oi|o)?$",
"^undol\\%[ist]$" : "^undol(ist|is|i)?$",
"^unh\\%[ide]$" : "^unh(ide|id|i)?$",
"^unl\\%[et]$" : "^unl(et|e)?$",
"^unlo\\%[ckvar]$" : "^unlo(ckvar|ckva|ckv|ck|c)?$",
"^unm\\%[ap]$" : "^unm(ap|a)?$",
"^unme\\%[nu]$" : "^unme(nu|n)?$",
"^uns\\%[ilent]$" : "^uns(ilent|ilen|ile|il|i)?$",
"^up\\%[date]$" : "^up(date|dat|da|d)?$",
"^v\\%[global]$" : "^v(global|globa|glob|glo|gl|g)?$",
"^ve\\%[rsion]$" : "^ve(rsion|rsio|rsi|rs|r)?$",
"^verb\\%[ose]$" : "^verb(ose|os|o)?$",
"^vert\\%[ical]$" : "^vert(ical|ica|ic|i)?$",
"^vi\\%[sual]$" : "^vi(sual|sua|su|s)?$",
"^vie\\%[w]$" : "^vie(w)?$",
"^vim\\%[grep]$" : "^vim(grep|gre|gr|g)?$",
"^vimgrepa\\%[dd]$" : "^vimgrepa(dd|d)?$",
"^viu\\%[sage]$" : "^viu(sage|sag|sa|s)?$",
"^vm\\%[ap]$" : "^vm(ap|a)?$",
"^vmapc\\%[lear]$" : "^vmapc(lear|lea|le|l)?$",
"^vme\\%[nu]$" : "^vme(nu|n)?$",
"^vn\\%[oremap]$" : "^vn(oremap|orema|orem|ore|or|o)?$",
"^vne\\%[w]$" : "^vne(w)?$",
"^vnoreme\\%[nu]$" : "^vnoreme(nu|n)?$",
"^vs\\%[plit]$" : "^vs(plit|pli|pl|p)?$",
"^vu\\%[nmap]$" : "^vu(nmap|nma|nm|n)?$",
"^vunme\\%[nu]$" : "^vunme(nu|n)?$",
"^wN\\%[ext]$" : "^wN(ext|ex|e)?$",
"^w\\%[rite]$" : "^w(rite|rit|ri|r)?$",
"^wa\\%[ll]$" : "^wa(ll|l)?$",
"^wh\\%[ile]$" : "^wh(ile|il|i)?$",
"^wi\\%[nsize]$" : "^wi(nsize|nsiz|nsi|ns|n)?$",
"^winc\\%[md]$" : "^winc(md|m)?$",
"^windo$" : "^windo$",
"^winp\\%[os]$" : "^winp(os|o)?$",
"^wn\\%[ext]$" : "^wn(ext|ex|e)?$",
"^wp\\%[revious]$" : "^wp(revious|reviou|revio|revi|rev|re|r)?$",
"^wq$" : "^wq$",
"^wqa\\%[ll]$" : "^wqa(ll|l)?$",
"^ws\\%[verb]$" : "^ws(verb|ver|ve|v)?$",
"^wu\\%[ndo]$" : "^wu(ndo|nd|n)?$",
"^wv\\%[iminfo]$" : "^wv(iminfo|iminf|imin|imi|im|i)?$",
"^x\\%[it]$" : "^x(it|i)?$",
"^xa\\%[ll]$" : "^xa(ll|l)?$",
"^xm\\%[ap]$" : "^xm(ap|a)?$",
"^xmapc\\%[lear]$" : "^xmapc(lear|lea|le|l)?$",
"^xme\\%[nu]$" : "^xme(nu|n)?$",
"^xn\\%[oremap]$" : "^xn(oremap|orema|orem|ore|or|o)?$",
"^xnoreme\\%[nu]$" : "^xnoreme(nu|n)?$",
"^xu\\%[nmap]$" : "^xu(nmap|nma|nm|n)?$",
"^xunme\\%[nu]$" : "^xunme(nu|n)?$",
"^y\\%[ank]$" : "^y(ank|an|a)?$",
"^z$" : "^z$",
"^{" : "^{",
"^|" : "^\\|",
"^||" : "^\\|\\|",
"^}" : "^}",
"[Ee][-+]\\d" : "[Ee][-+]\\d",
"^\\s*\\\\" : "^\\s*\\\\",
}
def viml_add(lst, item):
lst.append(item)
def viml_call(func, *args):
func(*args)
def viml_empty(obj):
return len(obj) == 0
def viml_eqreg(s, reg):
return re.search(pat_vim2py[reg], s, re.IGNORECASE)
def viml_eqregh(s, reg):
return re.search(pat_vim2py[reg], s)
def viml_eqregq(s, reg):
return re.search(pat_vim2py[reg], s, re.IGNORECASE)
def viml_escape(s, chars):
r = ''
for c in s:
if c in chars:
r += "\\" + c
else:
r += c
return r
def viml_extend(obj, item):
obj.extend(item)
def viml_insert(lst, item, idx = 0):
lst.insert(idx, item)
def viml_join(lst, sep):
return sep.join(lst)
def viml_keys(obj):
return obj.keys()
def viml_len(obj):
return len(obj)
def viml_printf(*args):
if len(args) == 1:
return args[0]
else:
return args[0] % args[1:]
def viml_range(start, end=None):
if end is None:
return range(start)
else:
return range(start, end + 1)
def viml_readfile(path):
lines = []
f = open(path)
for line in f.readlines():
lines.append(line.rstrip("\r\n"))
f.close()
return lines
def viml_remove(lst, idx):
del lst[idx]
def viml_split(s, sep):
if sep == "\\zs":
return s
raise Exception("NotImplemented")
def viml_str2nr(s, base=10):
return int(s, base)
def viml_string(obj):
return str(obj)
NIL = []
class VimLParser:
def __init__(self):
pass
def err(self, *a000):
pos = self.reader.getpos()
if viml_len(a000) == 1:
msg = a000[0]
else:
msg = viml_printf(*a000)
return viml_printf("%s: line %d col %d", msg, pos.lnum, pos.col)
def exnode(self, type):
node = AttributeDict({"type":type})
node.parent = self.context
node.prev = self.lastnode
node.next = NIL
if node.prev is not NIL:
node.prev.next = node
self.lastnode = node
return node
def blocknode(self, type):
node = self.exnode(type)
node.body = []
return node
def push_context(self, node):
self.context = node
def pop_context(self):
self.context = self.context.parent
def find_context(self, pat):
i = 0
node = self.context
while 1:
if viml_eqregh(node.type, pat):
return i
elif node.parent is NIL:
break
node = node.parent
i += 1
return -1
def add_node(self, node):
viml_add(self.context.body, node)
def check_missing_endfunction(self, ends):
if self.context.type == "FUNCTION":
raise Exception(self.err("VimLParser: E126: Missing :endfunction: %s", ends))
def check_missing_endif(self, ends):
if viml_eqregh(self.context.type, "\\v^%(IF|ELSEIF|ELSE)$"):
raise Exception(self.err("VimLParser: E171: Missing :endif: %s", ends))
def check_missing_endtry(self, ends):
if viml_eqregh(self.context.type, "\\v^%(TRY|CATCH|FINALLY)$"):
raise Exception(self.err("VimLParser: E600: Missing :endtry: %s", ends))
def check_missing_endwhile(self, ends):
if self.context.type == "WHILE":
raise Exception(self.err("VimLParser: E170: Missing :endwhile: %s", ends))
def check_missing_endfor(self, ends):
if self.context.type == "FOR":
raise Exception(self.err("VimLParser: E170: Missing :endfor: %s", ends))
def parse(self, reader):
self.reader = reader
self.lastnode = NIL
self.context = NIL
toplevel = self.blocknode("TOPLEVEL")
self.push_context(toplevel)
while self.reader.peek() != "<EOF>":
self.parse_one_cmd()
self.check_missing_endfunction("TOPLEVEL")
self.check_missing_endif("TOPLEVEL")
self.check_missing_endtry("TOPLEVEL")
self.check_missing_endwhile("TOPLEVEL")
self.check_missing_endfor("TOPLEVEL")
self.pop_context()
return toplevel
def parse_one_cmd(self):
self.ea = AttributeDict({})
self.ea.forceit = 0
self.ea.addr_count = 0
self.ea.line1 = 0
self.ea.line2 = 0
self.ea.flags = 0
self.ea.do_ecmd_cmd = ""
self.ea.do_ecmd_lnum = 0
self.ea.append = 0
self.ea.usefilter = 0
self.ea.amount = 0
self.ea.regname = 0
self.ea.regname = 0
self.ea.force_bin = 0
self.ea.read_edit = 0
self.ea.force_ff = 0
self.ea.force_enc = 0
self.ea.bad_char = 0
self.ea.linepos = []
self.ea.cmdpos = []
self.ea.argpos = []
self.ea.cmd = AttributeDict({})
self.ea.modifiers = []
self.ea.range = []
self.ea.argopt = AttributeDict({})
self.ea.argcmd = AttributeDict({})
if self.reader.peekn(2) == "#!":
self.parse_hashbang()
self.reader.get()
return
self.skip_white_and_colon()
if self.reader.peekn(1) == "":
self.reader.get()
return
if self.reader.peekn(1) == "\"":
self.parse_comment()
self.reader.get()
return
self.ea.linepos = self.reader.getpos()
self.parse_command_modifiers()
self.parse_range()
self.parse_command()
self.parse_trail()
# FIXME:
def parse_command_modifiers(self):
modifiers = []
while 1:
pos = self.reader.getpos()
if viml_eqregh(self.reader.peekn(1), "\\d"):
d = self.read_digits()
self.skip_white()
else:
d = ""
k = self.read_alpha()
c = self.reader.peekn(1)
self.skip_white()
if viml_eqregh(k, "^abo\\%[veleft]$"):
viml_add(modifiers, AttributeDict({"name":"aboveleft"}))
elif viml_eqregh(k, "^bel\\%[owright]$"):
viml_add(modifiers, AttributeDict({"name":"belowright"}))
elif viml_eqregh(k, "^bro\\%[wse]$"):
viml_add(modifiers, AttributeDict({"name":"browse"}))
elif viml_eqregh(k, "^bo\\%[tright]$"):
viml_add(modifiers, AttributeDict({"name":"botright"}))
elif viml_eqregh(k, "^conf\\%[irm]$"):
viml_add(modifiers, AttributeDict({"name":"confirm"}))
elif viml_eqregh(k, "^kee\\%[pmarks]$"):
viml_add(modifiers, AttributeDict({"name":"keepmarks"}))
elif viml_eqregh(k, "^keepa\\%[lt]$"):
viml_add(modifiers, AttributeDict({"name":"keepalt"}))
elif viml_eqregh(k, "^keepj\\%[umps]$"):
viml_add(modifiers, AttributeDict({"name":"keepjumps"}))
elif viml_eqregh(k, "^hid\\%[e]$"):
if self.ends_excmds(c):
break
viml_add(modifiers, AttributeDict({"name":"hide"}))
elif viml_eqregh(k, "^loc\\%[kmarks]$"):
viml_add(modifiers, AttributeDict({"name":"lockmarks"}))
elif viml_eqregh(k, "^lefta\\%[bove]$"):
viml_add(modifiers, AttributeDict({"name":"leftabove"}))
elif viml_eqregh(k, "^noa\\%[utocmd]$"):
viml_add(modifiers, AttributeDict({"name":"noautocmd"}))
elif viml_eqregh(k, "^rightb\\%[elow]$"):
viml_add(modifiers, AttributeDict({"name":"rightbelow"}))
elif viml_eqregh(k, "^san\\%[dbox]$"):
viml_add(modifiers, AttributeDict({"name":"sandbox"}))
elif viml_eqregh(k, "^sil\\%[ent]$"):
if c == "!":
self.reader.get()
viml_add(modifiers, AttributeDict({"name":"silent", "bang":1}))
else:
viml_add(modifiers, AttributeDict({"name":"silent", "bang":0}))
elif viml_eqregh(k, "^tab$"):
if d != "":
viml_add(modifiers, AttributeDict({"name":"tab", "count":viml_str2nr(d, 10)}))
else:
viml_add(modifiers, AttributeDict({"name":"tab"}))
elif viml_eqregh(k, "^to\\%[pleft]$"):
viml_add(modifiers, AttributeDict({"name":"topleft"}))
elif viml_eqregh(k, "^uns\\%[ilent]$"):
viml_add(modifiers, AttributeDict({"name":"unsilent"}))
elif viml_eqregh(k, "^vert\\%[ical]$"):
viml_add(modifiers, AttributeDict({"name":"vertical"}))
elif viml_eqregh(k, "^verb\\%[ose]$"):
if d != "":
viml_add(modifiers, AttributeDict({"name":"verbose", "count":viml_str2nr(d, 10)}))
else:
viml_add(modifiers, AttributeDict({"name":"verbose", "count":1}))
else:
self.reader.setpos(pos)
break
self.ea.modifiers = modifiers
# FIXME:
def parse_range(self):
tokens = []
while 1:
while 1:
self.skip_white()
c = self.reader.peekn(1)
if c == "":
break
if c == ".":
viml_add(tokens, self.reader.getn(1))
elif c == "$":
viml_add(tokens, self.reader.getn(1))
elif c == "'":
self.reader.getn(1)
m = self.reader.getn(1)
if m == "":
break
viml_add(tokens, "'" + m)
elif c == "/":
self.reader.getn(1)
pattern, endc = self.parse_pattern(c)
viml_add(tokens, pattern)
elif c == "?":
self.reader.getn(1)
pattern, endc = self.parse_pattern(c)
viml_add(tokens, pattern)
elif c == "\\":
self.reader.getn(1)
m = self.reader.getn(1)
if m == "&" or m == "?" or m == "/":
viml_add(tokens, "\\" + m)
else:
raise Exception(self.err("VimLParser: E10: \\\\ should be followed by /, ? or &"))
elif viml_eqregh(c, "\\d"):
viml_add(tokens, self.read_digits())
while 1:
self.skip_white()
if self.reader.peekn(1) == "":
break
n = self.read_integer()
if n == "":
break
viml_add(tokens, n)
if not viml_eqregh(self.reader.peekn(1), "[/?]"):
break
if self.reader.peekn(1) == "%":
viml_add(tokens, self.reader.getn(1))
elif self.reader.peekn(1) == "*":
# && &cpoptions !~ '\*'
viml_add(tokens, self.reader.getn(1))
if self.reader.peekn(1) == ";":
viml_add(tokens, self.reader.getn(1))
continue
elif self.reader.peekn(1) == ",":
viml_add(tokens, self.reader.getn(1))
continue
break
self.ea.range = tokens
# FIXME:
def parse_pattern(self, delimiter):
pattern = ""
endc = ""
inbracket = 0
while 1:
c = self.reader.getn(1)
if c == "":
break
if c == delimiter and inbracket == 0:
endc = c
break
pattern += c
if c == "\\":
c = self.reader.getn(1)
if c == "":
raise Exception(self.err("VimLParser: E682: Invalid search pattern or delimiter"))
pattern += c
elif c == "[":
inbracket += 1
elif c == "]":
inbracket -= 1
return [pattern, endc]
def parse_command(self):
self.skip_white_and_colon()
if self.reader.peekn(1) == "" or self.reader.peekn(1) == "\"":
if not viml_empty(self.ea.modifiers) or not viml_empty(self.ea.range):
self.parse_cmd_modifier_range()
return
self.ea.cmdpos = self.reader.getpos()
self.ea.cmd = self.find_command()
if self.ea.cmd is NIL:
self.reader.setpos(self.ea.cmdpos)
raise Exception(self.err("VimLParser: E492: Not an editor command: %s", self.reader.peekline()))
if self.reader.peekn(1) == "!" and not viml_eqregh(self.ea.cmd.name, "\\v^%(substitute|smagic|snomagic)$"):
self.reader.getn(1)
self.ea.forceit = 1
else:
self.ea.forceit = 0
if not viml_eqregh(self.ea.cmd.flags, "\\<BANG\\>") and self.ea.forceit:
raise Exception(self.err("VimLParser: E477: No ! allowed"))
if self.ea.cmd.name != "!":
self.skip_white()
self.ea.argpos = self.reader.getpos()
if viml_eqregh(self.ea.cmd.flags, "\\<ARGOPT\\>"):
self.parse_argopt()
if viml_eqregh(self.ea.cmd.name, "\\v^%(write|update)$"):
if self.reader.peekn(1) == ">":
self.reader.getn(1)
if self.reader.peekn(1) == ">":
raise Exception(self.err("VimLParser: E494: Use w or w>>"))
self.skip_white()
self.ea.append = 1
elif self.reader.peekn(1) == "!" and self.ea.cmd.name == "write":
self.reader.getn(1)
self.ea.usefilter = 1
if self.ea.cmd.name == "read":
if self.ea.forceit:
self.ea.usefilter = 1
self.ea.forceit = 0
elif self.reader.peekn(1) == "!":
self.reader.getn(1)
self.ea.usefilter = 1
if viml_eqregh(self.ea.cmd.name, "^[<>]$"):
self.ea.amount = 1
while self.reader.peekn(1) == self.ea.cmd.name:
self.reader.getn(1)
self.ea.amount += 1
self.skip_white()
if viml_eqregh(self.ea.cmd.flags, "\\<EDITCMD\\>") and not self.ea.usefilter:
self.parse_argcmd()
getattr(self, self.ea.cmd.parser)()
def find_command(self):
c = self.reader.peekn(1)
if c == "k":
self.reader.getn(1)
name = "k"
elif c == "s" and viml_eqregh(self.reader.peekn(5), "\\v^s%(c[^sr][^i][^p]|g|i[^mlg]|I|r[^e])"):
self.reader.getn(1)
name = "substitute"
elif viml_eqregh(c, "[@*!=><&~#]"):
self.reader.getn(1)
name = c
elif self.reader.peekn(2) == "py":
name = self.read_alnum()
else:
pos = self.reader.getpos()
name = self.read_alpha()
if name != "del" and viml_eqregh(name, "\\v^d%[elete][lp]$"):
self.reader.setpos(pos)
name = self.reader.getn(viml_len(name) - 1)
cmd = NIL
for x in self.builtin_commands:
if viml_eqregh(name, x.pat):
del cmd
cmd = x
break
# FIXME: user defined command
if (cmd is NIL or cmd.name == "Print") and viml_eqregh(name, "^[A-Z]"):
name += self.read_alnum()
del cmd
cmd = AttributeDict({"name":name, "flags":"USERCMD", "parser":"parse_cmd_usercmd"})
return cmd
# TODO:
def parse_hashbang(self):
self.reader.getn(-1)
# TODO:
# ++opt=val
def parse_argopt(self):
while 1:
s = self.reader.peekn(20)
if viml_eqregh(s, "^++bin\\>"):
self.reader.getn(5)
self.ea.force_bin = 1
elif viml_eqregh(s, "^++nobin\\>"):
self.reader.getn(7)
self.ea.force_bin = 2
elif viml_eqregh(s, "^++edit\\>"):
self.reader.getn(6)
self.ea.read_edit = 1
elif viml_eqregh(s, "^++ff=\\(dos\\|unix\\|mac\\)\\>"):
self.reader.getn(5)
self.ea.force_ff = self.read_alpha()
elif viml_eqregh(s, "^++fileformat=\\(dos\\|unix\\|mac\\)\\>"):
self.reader.getn(13)
self.ea.force_ff = self.read_alpha()
elif viml_eqregh(s, "^++enc=\\S"):
self.reader.getn(6)
self.ea.force_enc = self.readx("\\S")
elif viml_eqregh(s, "^++encoding=\\S"):
self.reader.getn(11)
self.ea.force_enc = self.readx("\\S")
elif viml_eqregh(s, "^++bad=\\(keep\\|drop\\|.\\)\\>"):
self.reader.getn(6)
if viml_eqregh(s, "^++bad=keep"):
self.ea.bad_char = self.reader.getn(4)
elif viml_eqregh(s, "^++bad=drop"):
self.ea.bad_char = self.reader.getn(4)
else:
self.ea.bad_char = self.reader.getn(1)
elif viml_eqregh(s, "^++"):
raise Exception("VimLParser: E474: Invalid Argument")
else:
break
self.skip_white()
# TODO:
# +command
def parse_argcmd(self):
if self.reader.peekn(1) == "+":
self.reader.getn(1)
if self.reader.peekn(1) == " ":
self.ea.do_ecmd_cmd = "$"
else:
self.ea.do_ecmd_cmd = self.read_cmdarg()
def read_cmdarg(self):
r = ""
while 1:
c = self.reader.peekn(1)
if c == "" or viml_eqregh(c, "\\s"):
break
self.reader.getn(1)
if c == "\\":
c = self.reader.getn(1)
r += c
return r
def parse_comment(self):
c = self.reader.get()
if c != "\"":
raise Exception(self.err("VimLParser: unexpected character: %s", c))
node = self.exnode("COMMENT")
node.str = self.reader.getn(-1)
self.add_node(node)
def parse_trail(self):
self.skip_white()
c = self.reader.peek()
if c == "<EOF>":
# pass
pass
elif c == "<EOL>":
self.reader.get()
elif c == "|":
self.reader.get()
elif c == "\"":
self.parse_comment()
self.reader.get()
else:
raise Exception(self.err("VimLParser: E488: Trailing characters: %s", c))
# modifier or range only command line
def parse_cmd_modifier_range(self):
node = self.exnode("EXCMD")
node.ea = self.ea
node.str = self.reader.getstr(self.ea.linepos, self.reader.getpos())
self.add_node(node)
# TODO:
def parse_cmd_common(self):
if viml_eqregh(self.ea.cmd.flags, "\\<TRLBAR\\>") and not self.ea.usefilter:
end = self.separate_nextcmd()
elif viml_eqregh(self.ea.cmd.name, "^\\(!\\|global\\|vglobal\\)$") or self.ea.usefilter:
while 1:
end = self.reader.getpos()
if self.reader.getn(1) == "":
break
else:
while 1:
end = self.reader.getpos()
if self.reader.getn(1) == "":
break
node = self.exnode("EXCMD")
node.ea = self.ea
node.str = self.reader.getstr(self.ea.linepos, end)
self.add_node(node)
def separate_nextcmd(self):
if viml_eqregh(self.ea.cmd.name, "^\\(vimgrep\\|vimgrepadd\\|lvimgrep\\|lvimgrepadd\\)$"):
self.skip_vimgrep_pat()
pc = ""
end = self.reader.getpos()
nospend = end
while 1:
end = self.reader.getpos()
if not viml_eqregh(pc, "\\s"):
nospend = end
c = self.reader.peek()
if c == "<EOF>" or c == "<EOL>":
break
elif c == "\<C-V>":
self.reader.get()
end = self.reader.getpos()
nospend = self.reader.getpos()
c = self.reader.peek()
if c == "<EOF>" or c == "<EOL>":
break
self.reader.get()
elif self.reader.peekn(2) == "`=" and viml_eqregh(self.ea.cmd.flags, "\\<\\(XFILE\\|FILES\\|FILE1\\)\\>"):
self.reader.getn(2)
self.parse_expr()
c = self.reader.getn(1)
if c != "`":
raise Exception(self.err("VimLParser: unexpected character: %s", c))
elif c == "|" or c == "\n" or (c == "\"" and not viml_eqregh(self.ea.cmd.flags, "\\<NOTRLCOM\\>") and ((self.ea.cmd.name != "@" and self.ea.cmd.name != "*") or self.reader.getpos() != self.ea.argpos) and (self.ea.cmd.name != "redir" or self.reader.getpos().i != self.ea.argpos.i + 1 or pc != "@")):
has_cpo_bar = 0
# &cpoptions =~ 'b'
if (not has_cpo_bar or not viml_eqregh(self.ea.cmd.flags, "\\<USECTRLV\\>")) and pc == "\\":
self.reader.get()
else:
break
else:
self.reader.get()
pc = c
if not viml_eqregh(self.ea.cmd.flags, "\\<NOTRLCOM\\>"):
end = nospend
return end
# FIXME
def skip_vimgrep_pat(self):
if self.reader.peekn(1) == "":
# pass
pass
elif self.isidc(self.reader.peekn(1)):
# :vimgrep pattern fname
self.readx("\\S")
else:
# :vimgrep /pattern/[g][j] fname
c = self.reader.getn(1)
pattern, endc = self.parse_pattern(c)
if c != endc:
return
while viml_eqregh(self.reader.peekn(1), "[gj]"):
self.reader.getn(1)
def parse_cmd_append(self):
self.reader.setpos(self.ea.linepos)
cmdline = self.reader.readline()
lines = [cmdline]
m = "."
while 1:
if self.reader.peek() == "<EOF>":
break
line = self.reader.getn(-1)
viml_add(lines, line)
if line == m:
break
self.reader.get()
node = self.exnode("EXCMD")
node.ea = self.ea
node.str = viml_join(lines, "\n")
self.add_node(node)
def parse_cmd_insert(self):
return self.parse_cmd_append()
def parse_cmd_loadkeymap(self):
self.reader.setpos(self.ea.linepos)
cmdline = self.reader.readline()
lines = [cmdline]
while 1:
if self.reader.peek() == "<EOF>":
break
line = self.reader.readline()
viml_add(lines, line)
node = self.exnode("EXCMD")
node.ea = self.ea
node.str = viml_join(lines, "\n")
self.add_node(node)
def parse_cmd_lua(self):
pos = self.reader.getpos()
self.reader.setpos(self.ea.linepos)
cmdline = self.reader.readline()
self.reader.setpos(pos)
self.skip_white()
lines = [cmdline]
if self.reader.peekn(2) == "<<":
self.reader.getn(2)
self.skip_white()
m = self.reader.readline()
if m == "":
m = "."
while 1:
if self.reader.peek() == "<EOF>":
break
line = self.reader.getn(-1)
viml_add(lines, line)
if line == m:
break
self.reader.get()
node = self.exnode("EXCMD")
node.ea = self.ea
node.str = viml_join(lines, "\n")
self.add_node(node)
def parse_cmd_mzscheme(self):
return self.parse_cmd_lua()
def parse_cmd_perl(self):
return self.parse_cmd_lua()
def parse_cmd_python(self):
return self.parse_cmd_lua()
def parse_cmd_python3(self):
return self.parse_cmd_lua()
def parse_cmd_ruby(self):
return self.parse_cmd_lua()
def parse_cmd_tcl(self):
return self.parse_cmd_lua()
def parse_cmd_finish(self):
self.parse_cmd_common()
if self.context.type == "TOPLEVEL":
while self.reader.peek() != "<EOF>":
self.reader.get()
# FIXME
def parse_cmd_usercmd(self):
return self.parse_cmd_common()
def parse_cmd_function(self):
pos = self.reader.getpos()
self.skip_white()
# :function
if self.ends_excmds(self.reader.peek()):
self.reader.setpos(pos)
return self.parse_cmd_common()
# :function /pattern
if self.reader.peekn(1) == "/":
self.reader.setpos(pos)
return self.parse_cmd_common()
name = self.parse_lvalue()
self.skip_white()
# :function {name}
if self.reader.peekn(1) != "(":
self.reader.setpos(pos)
return self.parse_cmd_common()
# :function[!] {name}([arguments]) [range] [abort] [dict]
node = self.blocknode("FUNCTION")
node.ea = self.ea
node.name = name
node.args = []
node.attr = AttributeDict({"range":0, "abort":0, "dict":0})
node.endfunction = NIL
self.reader.getn(1)
c = self.reader.peekn(1)
if c == ")":
self.reader.getn(1)
else:
while 1:
self.skip_white()
if viml_eqregh(self.reader.peekn(1), "\\h"):
arg = self.readx("\\w")
viml_add(node.args, arg)
self.skip_white()
c = self.reader.peekn(1)
if c == ",":
self.reader.getn(1)
continue
elif c == ")":
self.reader.getn(1)
break
else:
raise Exception(self.err("VimLParser: unexpected characters: %s", c))
elif self.reader.peekn(3) == "...":
self.reader.getn(3)
viml_add(node.args, "...")
self.skip_white()
c = self.reader.peekn(1)
if c == ")":
self.reader.getn(1)
break
else:
raise Exception(self.err("VimLParser: unexpected characters: %s", c))
else:
raise Exception(self.err("VimLParser: unexpected characters: %s", c))
while 1:
self.skip_white()
key = self.read_alpha()
if key == "":
break
elif key == "range":
node.attr.range = 1
elif key == "abort":
node.attr.abort = 1
elif key == "dict":
node.attr.dict = 1
else:
raise Exception(self.err("VimLParser: unexpected token: %s", key))
self.add_node(node)
self.push_context(node)
def parse_cmd_endfunction(self):
self.check_missing_endif("ENDFUNCTION")
self.check_missing_endtry("ENDFUNCTION")
self.check_missing_endwhile("ENDFUNCTION")
self.check_missing_endfor("ENDFUNCTION")
if self.context.type != "FUNCTION":
raise Exception(self.err("VimLParser: E193: :endfunction not inside a function"))
self.reader.getn(-1)
node = self.exnode("ENDFUNCTION")
node.ea = self.ea
self.context.endfunction = node
self.pop_context()
def parse_cmd_delfunction(self):
node = self.exnode("DELFUNCTION")
node.ea = self.ea
node.name = self.parse_lvalue()
self.add_node(node)
def parse_cmd_return(self):
if self.find_context("^FUNCTION$") == -1:
raise Exception(self.err("VimLParser: E133: :return not inside a function"))
node = self.exnode("RETURN")
node.ea = self.ea
node.arg = NIL
self.skip_white()
c = self.reader.peek()
if not self.ends_excmds(c):
node.arg = self.parse_expr()
self.add_node(node)
def parse_cmd_call(self):
node = self.exnode("EXCALL")
node.ea = self.ea
node.expr = NIL
self.skip_white()
c = self.reader.peek()
if self.ends_excmds(c):
raise Exception(self.err("VimLParser: call error: %s", c))
node.expr = self.parse_expr()
if node.expr.type != "CALL":
raise Exception(self.err("VimLParser: call error: %s", node.expr.type))
self.add_node(node)
def parse_cmd_let(self):
pos = self.reader.getpos()
self.skip_white()
# :let
if self.ends_excmds(self.reader.peek()):
self.reader.setpos(pos)
return self.parse_cmd_common()
lhs = self.parse_letlhs()
self.skip_white()
s1 = self.reader.peekn(1)
s2 = self.reader.peekn(2)
# :let {var-name} ..
if self.ends_excmds(s1) or (s2 != "+=" and s2 != "-=" and s2 != ".=" and s1 != "="):
self.reader.setpos(pos)
return self.parse_cmd_common()
# :let lhs op rhs
node = self.exnode("LET")
node.ea = self.ea
node.op = ""
node.lhs = lhs
node.rhs = NIL
if s2 == "+=" or s2 == "-=" or s2 == ".=":
self.reader.getn(2)
node.op = s2
elif s1 == "=":
self.reader.getn(1)
node.op = s1
else:
raise Exception("NOT REACHED")
node.rhs = self.parse_expr()
self.add_node(node)
def parse_cmd_unlet(self):
node = self.exnode("UNLET")
node.ea = self.ea
node.args = self.parse_lvaluelist()
self.add_node(node)
def parse_cmd_lockvar(self):
node = self.exnode("LOCKVAR")
node.ea = self.ea
node.depth = 2
node.args = []
self.skip_white()
if viml_eqregh(self.reader.peekn(1), "\\d"):
node.depth = viml_str2nr(self.read_digits(), 10)
node.args = self.parse_lvaluelist()
self.add_node(node)
def parse_cmd_unlockvar(self):
node = self.exnode("UNLOCKVAR")
node.ea = self.ea
node.depth = 2
node.args = []
self.skip_white()
if viml_eqregh(self.reader.peekn(1), "\\d"):
node.depth = viml_str2nr(self.read_digits(), 10)
node.args = self.parse_lvaluelist()
self.add_node(node)
def parse_cmd_if(self):
node = self.blocknode("IF")
node.ea = self.ea
node.cond = self.parse_expr()
node.elseif = []
node._else = NIL
node.endif = NIL
self.add_node(node)
self.push_context(node)
def parse_cmd_elseif(self):
if self.context.type != "IF" and self.context.type != "ELSEIF":
raise Exception(self.err("VimLParser: E582: :elseif without :if"))
if self.context.type != "IF":
self.pop_context()
node = self.blocknode("ELSEIF")
node.ea = self.ea
node.cond = self.parse_expr()
viml_add(node.parent.elseif, node)
self.push_context(node)
def parse_cmd_else(self):
if self.context.type != "IF" and self.context.type != "ELSEIF":
raise Exception(self.err("VimLParser: E581: :else without :if"))
if self.context.type != "IF":
self.pop_context()
node = self.blocknode("ELSE")
node.ea = self.ea
node.parent._else = node
self.push_context(node)
def parse_cmd_endif(self):
if self.context.type != "IF" and self.context.type != "ELSEIF" and self.context.type != "ELSE":
raise Exception(self.err("VimLParser: E580: :endif without :if"))
if self.context.type != "IF":
self.pop_context()
node = self.exnode("ENDIF")
node.ea = self.ea
node.parent.endif = node
self.pop_context()
def parse_cmd_while(self):
node = self.blocknode("WHILE")
node.ea = self.ea
node.cond = self.parse_expr()
node.endwhile = NIL
self.add_node(node)
self.push_context(node)
def parse_cmd_endwhile(self):
if self.context.type != "WHILE":
raise Exception(self.err("VimLParser: E588: :endwhile without :while"))
node = self.exnode("ENDWHILE")
node.ea = self.ea
node.parent.endwhile = node
self.pop_context()
def parse_cmd_for(self):
node = self.blocknode("FOR")
node.ea = self.ea
node.lhs = NIL
node.rhs = NIL
node.endfor = NIL
node.lhs = self.parse_letlhs()
self.skip_white()
if self.read_alpha() != "in":
raise Exception(self.err("VimLParser: Missing \"in\" after :for"))
node.rhs = self.parse_expr()
self.add_node(node)
self.push_context(node)
def parse_cmd_endfor(self):
if self.context.type != "FOR":
raise Exception(self.err("VimLParser: E588: :endfor without :for"))
node = self.exnode("ENDFOR")
node.ea = self.ea
node.parent.endfor = node
self.pop_context()
def parse_cmd_continue(self):
if self.find_context("^\\(WHILE\\|FOR\\)$") == -1:
raise Exception(self.err("VimLParser: E586: :continue without :while or :for"))
node = self.exnode("CONTINUE")
node.ea = self.ea
self.add_node(node)
def parse_cmd_break(self):
if self.find_context("^\\(WHILE\\|FOR\\)$") == -1:
raise Exception(self.err("VimLParser: E587: :break without :while or :for"))
node = self.exnode("BREAK")
node.ea = self.ea
self.add_node(node)
def parse_cmd_try(self):
node = self.blocknode("TRY")
node.ea = self.ea
node.catch = []
node._finally = NIL
node.endtry = NIL
self.add_node(node)
self.push_context(node)
def parse_cmd_catch(self):
if self.context.type == "FINALLY":
raise Exception(self.err("VimLParser: E604: :catch after :finally"))
elif self.context.type != "TRY" and self.context.type != "CATCH":
raise Exception(self.err("VimLParser: E603: :catch without :try"))
if self.context.type != "TRY":
self.pop_context()
node = self.blocknode("CATCH")
node.ea = self.ea
node.pattern = NIL
self.skip_white()
if not self.ends_excmds(self.reader.peek()):
node.pattern, endc = self.parse_pattern(self.reader.get())
viml_add(node.parent.catch, node)
self.push_context(node)
def parse_cmd_finally(self):
if self.context.type != "TRY" and self.context.type != "CATCH":
raise Exception(self.err("VimLParser: E606: :finally without :try"))
if self.context.type != "TRY":
self.pop_context()
node = self.blocknode("FINALLY")
node.ea = self.ea
node.parent._finally = node
self.push_context(node)
def parse_cmd_endtry(self):
if self.context.type != "TRY" and self.context.type != "CATCH" and self.context.type != "FINALLY":
raise Exception(self.err("VimLParser: E602: :endtry without :try"))
if self.context.type != "TRY":
self.pop_context()
node = self.exnode("ENDTRY")
node.ea = self.ea
node.parent.endtry = node
self.pop_context()
def parse_cmd_throw(self):
node = self.exnode("THROW")
node.ea = self.ea
node.arg = self.parse_expr()
self.add_node(node)
def parse_cmd_echo(self):
node = self.exnode("ECHO")
node.ea = self.ea
node.args = self.parse_exprlist()
self.add_node(node)
def parse_cmd_echon(self):
node = self.exnode("ECHON")
node.ea = self.ea
node.args = self.parse_exprlist()
self.add_node(node)
def parse_cmd_echohl(self):
node = self.exnode("ECHOHL")
node.ea = self.ea
node.name = ""
while not self.ends_excmds(self.reader.peek()):
node.name += self.reader.get()
self.add_node(node)
def parse_cmd_echomsg(self):
node = self.exnode("ECHOMSG")
node.ea = self.ea
node.args = self.parse_exprlist()
self.add_node(node)
def parse_cmd_echoerr(self):
node = self.exnode("ECHOERR")
node.ea = self.ea
node.args = self.parse_exprlist()
self.add_node(node)
def parse_cmd_execute(self):
node = self.exnode("EXECUTE")
node.ea = self.ea
node.args = self.parse_exprlist()
self.add_node(node)
def parse_expr(self):
return ExprParser(ExprTokenizer(self.reader)).parse()
def parse_exprlist(self):
args = []
while 1:
self.skip_white()
c = self.reader.peek()
if c != "\"" and self.ends_excmds(c):
break
node = self.parse_expr()
viml_add(args, node)
return args
# FIXME:
def parse_lvalue(self):
p = LvalueParser(ExprTokenizer(self.reader))
node = p.parse()
if viml_eqregh(node.type, "\\v^%(IDENTIFIER|INDEX|DOT|OPTION|ENV|REG)$"):
return node
raise Exception(self.err("VimLParser: lvalue error: %s", node.value))
def parse_lvaluelist(self):
args = []
node = self.parse_expr()
viml_add(args, node)
while 1:
self.skip_white()
if self.ends_excmds(self.reader.peek()):
break
node = self.parse_lvalue()
viml_add(args, node)
return args
# FIXME:
def parse_letlhs(self):
values = AttributeDict({"args":[], "rest":NIL})
tokenizer = ExprTokenizer(self.reader)
if tokenizer.peek().type == "LBRA":
tokenizer.get()
while 1:
node = self.parse_lvalue()
viml_add(values.args, node)
if tokenizer.peek().type == "RBRA":
tokenizer.get()
break
elif tokenizer.peek().type == "COMMA":
tokenizer.get()
continue
elif tokenizer.peek().type == "SEMICOLON":
tokenizer.get()
node = self.parse_lvalue()
values.rest = node
token = tokenizer.peek()
if token.type == "RBRA":
tokenizer.get()
break
else:
raise Exception(self.err("VimLParser: E475 Invalid argument: %s", token.value))
else:
raise Exception(self.err("VimLParser: E475 Invalid argument: %s", token.value))
else:
node = self.parse_lvalue()
viml_add(values.args, node)
return values
def readx(self, pat):
r = ""
while viml_eqregh(self.reader.peekn(1), pat):
r += self.reader.getn(1)
return r
def read_alpha(self):
return self.readx("\\a")
def read_digits(self):
return self.readx("\\d")
def read_integer(self):
if viml_eqregh(self.reader.peekn(1), "[-+]"):
c = self.reader.getn(1)
else:
c = ""
return c + self.read_digits()
def read_alnum(self):
return self.readx("[0-9a-zA-Z]")
def skip_white(self):
self.readx("\\s")
def skip_white_and_colon(self):
self.readx(":\\|\\s")
def ends_excmds(self, c):
return c == "" or c == "|" or c == "\"" or c == "<EOF>" or c == "<EOL>"
# FIXME:
def isidc(self, c):
return viml_eqregh(c, "[0-9A-Za-z_]")
VimLParser.builtin_commands = [AttributeDict({"name":"append", "pat":"^a\\%[ppend]$", "flags":"BANG|RANGE|ZEROR|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_append"}), AttributeDict({"name":"abbreviate", "pat":"^ab\\%[breviate]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"abclear", "pat":"^abc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"aboveleft", "pat":"^abo\\%[veleft]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"all", "pat":"^al\\%[l]$", "flags":"BANG|RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"amenu", "pat":"^am\\%[enu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"anoremenu", "pat":"^an\\%[oremenu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"args", "pat":"^ar\\%[gs]$", "flags":"BANG|FILES|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"argadd", "pat":"^arga\\%[dd]$", "flags":"BANG|NEEDARG|RANGE|NOTADR|ZEROR|FILES|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"argdelete", "pat":"^argd\\%[elete]$", "flags":"BANG|RANGE|NOTADR|FILES|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"argedit", "pat":"^arge\\%[dit]$", "flags":"BANG|NEEDARG|RANGE|NOTADR|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"argdo", "pat":"^argdo$", "flags":"BANG|NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"argglobal", "pat":"^argg\\%[lobal]$", "flags":"BANG|FILES|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"arglocal", "pat":"^argl\\%[ocal]$", "flags":"BANG|FILES|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"argument", "pat":"^argu\\%[ment]$", "flags":"BANG|RANGE|NOTADR|COUNT|EXTRA|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ascii", "pat":"^as\\%[cii]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"autocmd", "pat":"^au\\%[tocmd]$", "flags":"BANG|EXTRA|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"augroup", "pat":"^aug\\%[roup]$", "flags":"BANG|WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"aunmenu", "pat":"^aun\\%[menu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"buffer", "pat":"^b\\%[uffer]$", "flags":"BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"bNext", "pat":"^bN\\%[ext]$", "flags":"BANG|RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ball", "pat":"^ba\\%[ll]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"badd", "pat":"^bad\\%[d]$", "flags":"NEEDARG|FILE1|EDITCMD|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"bdelete", "pat":"^bd\\%[elete]$", "flags":"BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"behave", "pat":"^be\\%[have]$", "flags":"NEEDARG|WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"belowright", "pat":"^bel\\%[owright]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"bfirst", "pat":"^bf\\%[irst]$", "flags":"BANG|RANGE|NOTADR|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"blast", "pat":"^bl\\%[ast]$", "flags":"BANG|RANGE|NOTADR|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"bmodified", "pat":"^bm\\%[odified]$", "flags":"BANG|RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"bnext", "pat":"^bn\\%[ext]$", "flags":"BANG|RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"botright", "pat":"^bo\\%[tright]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"bprevious", "pat":"^bp\\%[revious]$", "flags":"BANG|RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"brewind", "pat":"^br\\%[ewind]$", "flags":"BANG|RANGE|NOTADR|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"break", "pat":"^brea\\%[k]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_break"}), AttributeDict({"name":"breakadd", "pat":"^breaka\\%[dd]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"breakdel", "pat":"^breakd\\%[el]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"breaklist", "pat":"^breakl\\%[ist]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"browse", "pat":"^bro\\%[wse]$", "flags":"NEEDARG|EXTRA|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"bufdo", "pat":"^bufdo$", "flags":"BANG|NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"buffers", "pat":"^buffers$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"bunload", "pat":"^bun\\%[load]$", "flags":"BANG|RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"bwipeout", "pat":"^bw\\%[ipeout]$", "flags":"BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"change", "pat":"^c\\%[hange]$", "flags":"BANG|WHOLEFOLD|RANGE|COUNT|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"cNext", "pat":"^cN\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cNfile", "pat":"^cNf\\%[ile]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cabbrev", "pat":"^ca\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cabclear", "pat":"^cabc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"caddbuffer", "pat":"^caddb\\%[uffer]$", "flags":"RANGE|NOTADR|WORD1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"caddexpr", "pat":"^cad\\%[dexpr]$", "flags":"NEEDARG|WORD1|NOTRLCOM|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"caddfile", "pat":"^caddf\\%[ile]$", "flags":"TRLBAR|FILE1", "parser":"parse_cmd_common"}), AttributeDict({"name":"call", "pat":"^cal\\%[l]$", "flags":"RANGE|NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_call"}), AttributeDict({"name":"catch", "pat":"^cat\\%[ch]$", "flags":"EXTRA|SBOXOK|CMDWIN", "parser":"parse_cmd_catch"}), AttributeDict({"name":"cbuffer", "pat":"^cb\\%[uffer]$", "flags":"BANG|RANGE|NOTADR|WORD1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"cc", "pat":"^cc$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cclose", "pat":"^ccl\\%[ose]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"cd", "pat":"^cd$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"center", "pat":"^ce\\%[nter]$", "flags":"TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"cexpr", "pat":"^cex\\%[pr]$", "flags":"NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cfile", "pat":"^cf\\%[ile]$", "flags":"TRLBAR|FILE1|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cfirst", "pat":"^cfir\\%[st]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cgetbuffer", "pat":"^cgetb\\%[uffer]$", "flags":"RANGE|NOTADR|WORD1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"cgetexpr", "pat":"^cgete\\%[xpr]$", "flags":"NEEDARG|WORD1|NOTRLCOM|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"cgetfile", "pat":"^cg\\%[etfile]$", "flags":"TRLBAR|FILE1", "parser":"parse_cmd_common"}), AttributeDict({"name":"changes", "pat":"^cha\\%[nges]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"chdir", "pat":"^chd\\%[ir]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"checkpath", "pat":"^che\\%[ckpath]$", "flags":"TRLBAR|BANG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"checktime", "pat":"^checkt\\%[ime]$", "flags":"RANGE|NOTADR|BUFNAME|COUNT|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"clist", "pat":"^cl\\%[ist]$", "flags":"BANG|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"clast", "pat":"^cla\\%[st]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"close", "pat":"^clo\\%[se]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cmap", "pat":"^cm\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cmapclear", "pat":"^cmapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cmenu", "pat":"^cme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cnext", "pat":"^cn\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cnewer", "pat":"^cnew\\%[er]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"cnfile", "pat":"^cnf\\%[ile]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cnoremap", "pat":"^cno\\%[remap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cnoreabbrev", "pat":"^cnorea\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cnoremenu", "pat":"^cnoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"copy", "pat":"^co\\%[py]$", "flags":"RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"colder", "pat":"^col\\%[der]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"colorscheme", "pat":"^colo\\%[rscheme]$", "flags":"WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"command", "pat":"^com\\%[mand]$", "flags":"EXTRA|BANG|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"comclear", "pat":"^comc\\%[lear]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"compiler", "pat":"^comp\\%[iler]$", "flags":"BANG|TRLBAR|WORD1|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"continue", "pat":"^con\\%[tinue]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_continue"}), AttributeDict({"name":"confirm", "pat":"^conf\\%[irm]$", "flags":"NEEDARG|EXTRA|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"copen", "pat":"^cope\\%[n]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"cprevious", "pat":"^cp\\%[revious]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cpfile", "pat":"^cpf\\%[ile]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cquit", "pat":"^cq\\%[uit]$", "flags":"TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"crewind", "pat":"^cr\\%[ewind]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"cscope", "pat":"^cs\\%[cope]$", "flags":"EXTRA|NOTRLCOM|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"cstag", "pat":"^cst\\%[ag]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"cunmap", "pat":"^cu\\%[nmap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cunabbrev", "pat":"^cuna\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cunmenu", "pat":"^cunme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"cwindow", "pat":"^cw\\%[indow]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"delete", "pat":"^d\\%[elete]$", "flags":"RANGE|WHOLEFOLD|REGSTR|COUNT|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"delmarks", "pat":"^delm\\%[arks]$", "flags":"BANG|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"debug", "pat":"^deb\\%[ug]$", "flags":"NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"debuggreedy", "pat":"^debugg\\%[reedy]$", "flags":"RANGE|NOTADR|ZEROR|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"delcommand", "pat":"^delc\\%[ommand]$", "flags":"NEEDARG|WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"delfunction", "pat":"^delf\\%[unction]$", "flags":"NEEDARG|WORD1|CMDWIN", "parser":"parse_cmd_delfunction"}), AttributeDict({"name":"diffupdate", "pat":"^dif\\%[fupdate]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"diffget", "pat":"^diffg\\%[et]$", "flags":"RANGE|EXTRA|TRLBAR|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"diffoff", "pat":"^diffo\\%[ff]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"diffpatch", "pat":"^diffp\\%[atch]$", "flags":"EXTRA|FILE1|TRLBAR|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"diffput", "pat":"^diffpu\\%[t]$", "flags":"RANGE|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"diffsplit", "pat":"^diffs\\%[plit]$", "flags":"EXTRA|FILE1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"diffthis", "pat":"^diffthis$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"digraphs", "pat":"^dig\\%[raphs]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"display", "pat":"^di\\%[splay]$", "flags":"EXTRA|NOTRLCOM|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"djump", "pat":"^dj\\%[ump]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA", "parser":"parse_cmd_common"}), AttributeDict({"name":"dlist", "pat":"^dl\\%[ist]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"doautocmd", "pat":"^do\\%[autocmd]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"doautoall", "pat":"^doautoa\\%[ll]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"drop", "pat":"^dr\\%[op]$", "flags":"FILES|EDITCMD|NEEDARG|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"dsearch", "pat":"^ds\\%[earch]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"dsplit", "pat":"^dsp\\%[lit]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA", "parser":"parse_cmd_common"}), AttributeDict({"name":"edit", "pat":"^e\\%[dit]$", "flags":"BANG|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"earlier", "pat":"^ea\\%[rlier]$", "flags":"TRLBAR|EXTRA|NOSPC|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"echo", "pat":"^ec\\%[ho]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_echo"}), AttributeDict({"name":"echoerr", "pat":"^echoe\\%[rr]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_echoerr"}), AttributeDict({"name":"echohl", "pat":"^echoh\\%[l]$", "flags":"EXTRA|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_echohl"}), AttributeDict({"name":"echomsg", "pat":"^echom\\%[sg]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_echomsg"}), AttributeDict({"name":"echon", "pat":"^echon$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_echon"}), AttributeDict({"name":"else", "pat":"^el\\%[se]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_else"}), AttributeDict({"name":"elseif", "pat":"^elsei\\%[f]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_elseif"}), AttributeDict({"name":"emenu", "pat":"^em\\%[enu]$", "flags":"NEEDARG|EXTRA|TRLBAR|NOTRLCOM|RANGE|NOTADR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"endif", "pat":"^en\\%[dif]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_endif"}), AttributeDict({"name":"endfor", "pat":"^endfo\\%[r]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_endfor"}), AttributeDict({"name":"endfunction", "pat":"^endf\\%[unction]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_endfunction"}), AttributeDict({"name":"endtry", "pat":"^endt\\%[ry]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_endtry"}), AttributeDict({"name":"endwhile", "pat":"^endw\\%[hile]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_endwhile"}), AttributeDict({"name":"enew", "pat":"^ene\\%[w]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ex", "pat":"^ex$", "flags":"BANG|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"execute", "pat":"^exe\\%[cute]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_execute"}), AttributeDict({"name":"exit", "pat":"^exi\\%[t]$", "flags":"RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"exusage", "pat":"^exu\\%[sage]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"file", "pat":"^f\\%[ile]$", "flags":"RANGE|NOTADR|ZEROR|BANG|FILE1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"files", "pat":"^files$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"filetype", "pat":"^filet\\%[ype]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"find", "pat":"^fin\\%[d]$", "flags":"RANGE|NOTADR|BANG|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"finally", "pat":"^fina\\%[lly]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_finally"}), AttributeDict({"name":"finish", "pat":"^fini\\%[sh]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_finish"}), AttributeDict({"name":"first", "pat":"^fir\\%[st]$", "flags":"EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"fixdel", "pat":"^fix\\%[del]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"fold", "pat":"^fo\\%[ld]$", "flags":"RANGE|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"foldclose", "pat":"^foldc\\%[lose]$", "flags":"RANGE|BANG|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"folddoopen", "pat":"^foldd\\%[oopen]$", "flags":"RANGE|DFLALL|NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"folddoclosed", "pat":"^folddoc\\%[losed]$", "flags":"RANGE|DFLALL|NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"foldopen", "pat":"^foldo\\%[pen]$", "flags":"RANGE|BANG|WHOLEFOLD|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"for", "pat":"^for$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_for"}), AttributeDict({"name":"function", "pat":"^fu\\%[nction]$", "flags":"EXTRA|BANG|CMDWIN", "parser":"parse_cmd_function"}), AttributeDict({"name":"global", "pat":"^g\\%[lobal]$", "flags":"RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"goto", "pat":"^go\\%[to]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"grep", "pat":"^gr\\%[ep]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"grepadd", "pat":"^grepa\\%[dd]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"gui", "pat":"^gu\\%[i]$", "flags":"BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"gvim", "pat":"^gv\\%[im]$", "flags":"BANG|FILES|EDITCMD|ARGOPT|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"hardcopy", "pat":"^ha\\%[rdcopy]$", "flags":"RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"help", "pat":"^h\\%[elp]$", "flags":"BANG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"helpfind", "pat":"^helpf\\%[ind]$", "flags":"EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"helpgrep", "pat":"^helpg\\%[rep]$", "flags":"EXTRA|NOTRLCOM|NEEDARG", "parser":"parse_cmd_common"}), AttributeDict({"name":"helptags", "pat":"^helpt\\%[ags]$", "flags":"NEEDARG|FILES|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"highlight", "pat":"^hi\\%[ghlight]$", "flags":"BANG|EXTRA|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"hide", "pat":"^hid\\%[e]$", "flags":"BANG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"history", "pat":"^his\\%[tory]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"insert", "pat":"^i\\%[nsert]$", "flags":"BANG|RANGE|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_insert"}), AttributeDict({"name":"iabbrev", "pat":"^ia\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"iabclear", "pat":"^iabc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"if", "pat":"^if$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_if"}), AttributeDict({"name":"ijump", "pat":"^ij\\%[ump]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA", "parser":"parse_cmd_common"}), AttributeDict({"name":"ilist", "pat":"^il\\%[ist]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"imap", "pat":"^im\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"imapclear", "pat":"^imapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"imenu", "pat":"^ime\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"inoremap", "pat":"^ino\\%[remap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"inoreabbrev", "pat":"^inorea\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"inoremenu", "pat":"^inoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"intro", "pat":"^int\\%[ro]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"isearch", "pat":"^is\\%[earch]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"isplit", "pat":"^isp\\%[lit]$", "flags":"BANG|RANGE|DFLALL|WHOLEFOLD|EXTRA", "parser":"parse_cmd_common"}), AttributeDict({"name":"iunmap", "pat":"^iu\\%[nmap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"iunabbrev", "pat":"^iuna\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"iunmenu", "pat":"^iunme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"join", "pat":"^j\\%[oin]$", "flags":"BANG|RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"jumps", "pat":"^ju\\%[mps]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"k", "pat":"^k$", "flags":"RANGE|WORD1|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"keepalt", "pat":"^keepa\\%[lt]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"keepmarks", "pat":"^kee\\%[pmarks]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"keepjumps", "pat":"^keepj\\%[umps]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"lNext", "pat":"^lN\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lNfile", "pat":"^lNf\\%[ile]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"list", "pat":"^l\\%[ist]$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"laddexpr", "pat":"^lad\\%[dexpr]$", "flags":"NEEDARG|WORD1|NOTRLCOM|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"laddbuffer", "pat":"^laddb\\%[uffer]$", "flags":"RANGE|NOTADR|WORD1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"laddfile", "pat":"^laddf\\%[ile]$", "flags":"TRLBAR|FILE1", "parser":"parse_cmd_common"}), AttributeDict({"name":"last", "pat":"^la\\%[st]$", "flags":"EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"language", "pat":"^lan\\%[guage]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"later", "pat":"^lat\\%[er]$", "flags":"TRLBAR|EXTRA|NOSPC|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lbuffer", "pat":"^lb\\%[uffer]$", "flags":"BANG|RANGE|NOTADR|WORD1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lcd", "pat":"^lc\\%[d]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lchdir", "pat":"^lch\\%[dir]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lclose", "pat":"^lcl\\%[ose]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lcscope", "pat":"^lcs\\%[cope]$", "flags":"EXTRA|NOTRLCOM|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"left", "pat":"^le\\%[ft]$", "flags":"TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"leftabove", "pat":"^lefta\\%[bove]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"let", "pat":"^let$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_let"}), AttributeDict({"name":"lexpr", "pat":"^lex\\%[pr]$", "flags":"NEEDARG|WORD1|NOTRLCOM|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lfile", "pat":"^lf\\%[ile]$", "flags":"TRLBAR|FILE1|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lfirst", "pat":"^lfir\\%[st]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lgetbuffer", "pat":"^lgetb\\%[uffer]$", "flags":"RANGE|NOTADR|WORD1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lgetexpr", "pat":"^lgete\\%[xpr]$", "flags":"NEEDARG|WORD1|NOTRLCOM|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lgetfile", "pat":"^lg\\%[etfile]$", "flags":"TRLBAR|FILE1", "parser":"parse_cmd_common"}), AttributeDict({"name":"lgrep", "pat":"^lgr\\%[ep]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"lgrepadd", "pat":"^lgrepa\\%[dd]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"lhelpgrep", "pat":"^lh\\%[elpgrep]$", "flags":"EXTRA|NOTRLCOM|NEEDARG", "parser":"parse_cmd_common"}), AttributeDict({"name":"ll", "pat":"^ll$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"llast", "pat":"^lla\\%[st]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"llist", "pat":"^lli\\%[st]$", "flags":"BANG|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lmake", "pat":"^lmak\\%[e]$", "flags":"BANG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"lmap", "pat":"^lm\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lmapclear", "pat":"^lmapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lnext", "pat":"^lne\\%[xt]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lnewer", "pat":"^lnew\\%[er]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lnfile", "pat":"^lnf\\%[ile]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lnoremap", "pat":"^ln\\%[oremap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"loadkeymap", "pat":"^loadk\\%[eymap]$", "flags":"CMDWIN", "parser":"parse_cmd_loadkeymap"}), AttributeDict({"name":"loadview", "pat":"^lo\\%[adview]$", "flags":"FILE1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lockmarks", "pat":"^loc\\%[kmarks]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"lockvar", "pat":"^lockv\\%[ar]$", "flags":"BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN", "parser":"parse_cmd_lockvar"}), AttributeDict({"name":"lolder", "pat":"^lol\\%[der]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lopen", "pat":"^lope\\%[n]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"lprevious", "pat":"^lp\\%[revious]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lpfile", "pat":"^lpf\\%[ile]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"lrewind", "pat":"^lr\\%[ewind]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR|BANG", "parser":"parse_cmd_common"}), AttributeDict({"name":"ls", "pat":"^ls$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"ltag", "pat":"^lt\\%[ag]$", "flags":"NOTADR|TRLBAR|BANG|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"lunmap", "pat":"^lu\\%[nmap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lua", "pat":"^lua$", "flags":"RANGE|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_lua"}), AttributeDict({"name":"luado", "pat":"^luad\\%[o]$", "flags":"RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"luafile", "pat":"^luaf\\%[ile]$", "flags":"RANGE|FILE1|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"lvimgrep", "pat":"^lv\\%[imgrep]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"lvimgrepadd", "pat":"^lvimgrepa\\%[dd]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"lwindow", "pat":"^lw\\%[indow]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"move", "pat":"^m\\%[ove]$", "flags":"RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"mark", "pat":"^ma\\%[rk]$", "flags":"RANGE|WORD1|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"make", "pat":"^mak\\%[e]$", "flags":"BANG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"map", "pat":"^map$", "flags":"BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"mapclear", "pat":"^mapc\\%[lear]$", "flags":"EXTRA|BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"marks", "pat":"^marks$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"match", "pat":"^mat\\%[ch]$", "flags":"RANGE|NOTADR|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"menu", "pat":"^me\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"menutranslate", "pat":"^menut\\%[ranslate]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"messages", "pat":"^mes\\%[sages]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"mkexrc", "pat":"^mk\\%[exrc]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"mksession", "pat":"^mks\\%[ession]$", "flags":"BANG|FILE1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"mkspell", "pat":"^mksp\\%[ell]$", "flags":"BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"mkvimrc", "pat":"^mkv\\%[imrc]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"mkview", "pat":"^mkvie\\%[w]$", "flags":"BANG|FILE1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"mode", "pat":"^mod\\%[e]$", "flags":"WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"mzscheme", "pat":"^mz\\%[scheme]$", "flags":"RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN|SBOXOK", "parser":"parse_cmd_mzscheme"}), AttributeDict({"name":"mzfile", "pat":"^mzf\\%[ile]$", "flags":"RANGE|FILE1|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nbclose", "pat":"^nbc\\%[lose]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nbkey", "pat":"^nb\\%[key]$", "flags":"EXTRA|NOTADR|NEEDARG", "parser":"parse_cmd_common"}), AttributeDict({"name":"nbstart", "pat":"^nbs\\%[art]$", "flags":"WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"next", "pat":"^n\\%[ext]$", "flags":"RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"new", "pat":"^new$", "flags":"BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"nmap", "pat":"^nm\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nmapclear", "pat":"^nmapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nmenu", "pat":"^nme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nnoremap", "pat":"^nn\\%[oremap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nnoremenu", "pat":"^nnoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"noautocmd", "pat":"^noa\\%[utocmd]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"noremap", "pat":"^no\\%[remap]$", "flags":"BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nohlsearch", "pat":"^noh\\%[lsearch]$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"noreabbrev", "pat":"^norea\\%[bbrev]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"noremenu", "pat":"^noreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"normal", "pat":"^norm\\%[al]$", "flags":"RANGE|BANG|EXTRA|NEEDARG|NOTRLCOM|USECTRLV|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"number", "pat":"^nu\\%[mber]$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nunmap", "pat":"^nun\\%[map]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"nunmenu", "pat":"^nunme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"oldfiles", "pat":"^ol\\%[dfiles]$", "flags":"BANG|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"open", "pat":"^o\\%[pen]$", "flags":"RANGE|BANG|EXTRA", "parser":"parse_cmd_common"}), AttributeDict({"name":"omap", "pat":"^om\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"omapclear", "pat":"^omapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"omenu", "pat":"^ome\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"only", "pat":"^on\\%[ly]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"onoremap", "pat":"^ono\\%[remap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"onoremenu", "pat":"^onoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"options", "pat":"^opt\\%[ions]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ounmap", "pat":"^ou\\%[nmap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"ounmenu", "pat":"^ounme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"ownsyntax", "pat":"^ow\\%[nsyntax]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"pclose", "pat":"^pc\\%[lose]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"pedit", "pat":"^ped\\%[it]$", "flags":"BANG|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"perl", "pat":"^pe\\%[rl]$", "flags":"RANGE|EXTRA|DFLALL|NEEDARG|SBOXOK|CMDWIN", "parser":"parse_cmd_perl"}), AttributeDict({"name":"print", "pat":"^p\\%[rint]$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|SBOXOK", "parser":"parse_cmd_common"}), AttributeDict({"name":"profdel", "pat":"^profd\\%[el]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"profile", "pat":"^prof\\%[ile]$", "flags":"BANG|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"promptfind", "pat":"^pro\\%[mptfind]$", "flags":"EXTRA|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"promptrepl", "pat":"^promptr\\%[epl]$", "flags":"EXTRA|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"perldo", "pat":"^perld\\%[o]$", "flags":"RANGE|EXTRA|DFLALL|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"pop", "pat":"^po\\%[p]$", "flags":"RANGE|NOTADR|BANG|COUNT|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"popup", "pat":"^pop\\%[up]$", "flags":"NEEDARG|EXTRA|BANG|TRLBAR|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"ppop", "pat":"^pp\\%[op]$", "flags":"RANGE|NOTADR|BANG|COUNT|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"preserve", "pat":"^pre\\%[serve]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"previous", "pat":"^prev\\%[ious]$", "flags":"EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"psearch", "pat":"^ps\\%[earch]$", "flags":"BANG|RANGE|WHOLEFOLD|DFLALL|EXTRA", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptag", "pat":"^pt\\%[ag]$", "flags":"RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptNext", "pat":"^ptN\\%[ext]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptfirst", "pat":"^ptf\\%[irst]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptjump", "pat":"^ptj\\%[ump]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptlast", "pat":"^ptl\\%[ast]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptnext", "pat":"^ptn\\%[ext]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptprevious", "pat":"^ptp\\%[revious]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptrewind", "pat":"^ptr\\%[ewind]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"ptselect", "pat":"^pts\\%[elect]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"put", "pat":"^pu\\%[t]$", "flags":"RANGE|WHOLEFOLD|BANG|REGSTR|TRLBAR|ZEROR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"pwd", "pat":"^pw\\%[d]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"py3", "pat":"^py3$", "flags":"RANGE|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_python3"}), AttributeDict({"name":"python3", "pat":"^python3$", "flags":"RANGE|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_python3"}), AttributeDict({"name":"py3file", "pat":"^py3f\\%[ile]$", "flags":"RANGE|FILE1|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"python", "pat":"^py\\%[thon]$", "flags":"RANGE|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_python"}), AttributeDict({"name":"pyfile", "pat":"^pyf\\%[ile]$", "flags":"RANGE|FILE1|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"quit", "pat":"^q\\%[uit]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"quitall", "pat":"^quita\\%[ll]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"qall", "pat":"^qa\\%[ll]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"read", "pat":"^r\\%[ead]$", "flags":"BANG|RANGE|WHOLEFOLD|FILE1|ARGOPT|TRLBAR|ZEROR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"recover", "pat":"^rec\\%[over]$", "flags":"BANG|FILE1|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"redo", "pat":"^red\\%[o]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"redir", "pat":"^redi\\%[r]$", "flags":"BANG|FILES|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"redraw", "pat":"^redr\\%[aw]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"redrawstatus", "pat":"^redraws\\%[tatus]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"registers", "pat":"^reg\\%[isters]$", "flags":"EXTRA|NOTRLCOM|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"resize", "pat":"^res\\%[ize]$", "flags":"RANGE|NOTADR|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"retab", "pat":"^ret\\%[ab]$", "flags":"TRLBAR|RANGE|WHOLEFOLD|DFLALL|BANG|WORD1|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"return", "pat":"^retu\\%[rn]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_return"}), AttributeDict({"name":"rewind", "pat":"^rew\\%[ind]$", "flags":"EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"right", "pat":"^ri\\%[ght]$", "flags":"TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"rightbelow", "pat":"^rightb\\%[elow]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"ruby", "pat":"^rub\\%[y]$", "flags":"RANGE|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_ruby"}), AttributeDict({"name":"rubydo", "pat":"^rubyd\\%[o]$", "flags":"RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"rubyfile", "pat":"^rubyf\\%[ile]$", "flags":"RANGE|FILE1|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"rundo", "pat":"^rund\\%[o]$", "flags":"NEEDARG|FILE1", "parser":"parse_cmd_common"}), AttributeDict({"name":"runtime", "pat":"^ru\\%[ntime]$", "flags":"BANG|NEEDARG|FILES|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"rviminfo", "pat":"^rv\\%[iminfo]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"substitute", "pat":"^s\\%[ubstitute]$", "flags":"RANGE|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"sNext", "pat":"^sN\\%[ext]$", "flags":"EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sandbox", "pat":"^san\\%[dbox]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"sargument", "pat":"^sa\\%[rgument]$", "flags":"BANG|RANGE|NOTADR|COUNT|EXTRA|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sall", "pat":"^sal\\%[l]$", "flags":"BANG|RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"saveas", "pat":"^sav\\%[eas]$", "flags":"BANG|DFLALL|FILE1|ARGOPT|CMDWIN|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbuffer", "pat":"^sb\\%[uffer]$", "flags":"BANG|RANGE|NOTADR|BUFNAME|BUFUNL|COUNT|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbNext", "pat":"^sbN\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sball", "pat":"^sba\\%[ll]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbfirst", "pat":"^sbf\\%[irst]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sblast", "pat":"^sbl\\%[ast]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbmodified", "pat":"^sbm\\%[odified]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbnext", "pat":"^sbn\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbprevious", "pat":"^sbp\\%[revious]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sbrewind", "pat":"^sbr\\%[ewind]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"scriptnames", "pat":"^scrip\\%[tnames]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"scriptencoding", "pat":"^scripte\\%[ncoding]", "flags":"WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"scscope", "pat":"^scs\\%[cope]$", "flags":"EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"set", "pat":"^se\\%[t]$", "flags":"TRLBAR|EXTRA|CMDWIN|SBOXOK", "parser":"parse_cmd_common"}), AttributeDict({"name":"setfiletype", "pat":"^setf\\%[iletype]$", "flags":"TRLBAR|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"setglobal", "pat":"^setg\\%[lobal]$", "flags":"TRLBAR|EXTRA|CMDWIN|SBOXOK", "parser":"parse_cmd_common"}), AttributeDict({"name":"setlocal", "pat":"^setl\\%[ocal]$", "flags":"TRLBAR|EXTRA|CMDWIN|SBOXOK", "parser":"parse_cmd_common"}), AttributeDict({"name":"sfind", "pat":"^sf\\%[ind]$", "flags":"BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sfirst", "pat":"^sfir\\%[st]$", "flags":"EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"shell", "pat":"^sh\\%[ell]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"simalt", "pat":"^sim\\%[alt]$", "flags":"NEEDARG|WORD1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"sign", "pat":"^sig\\%[n]$", "flags":"NEEDARG|RANGE|NOTADR|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"silent", "pat":"^sil\\%[ent]$", "flags":"NEEDARG|EXTRA|BANG|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"sleep", "pat":"^sl\\%[eep]$", "flags":"RANGE|NOTADR|COUNT|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"slast", "pat":"^sla\\%[st]$", "flags":"EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"smagic", "pat":"^sm\\%[agic]$", "flags":"RANGE|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"smap", "pat":"^sma\\%[p]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"smapclear", "pat":"^smapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"smenu", "pat":"^sme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"snext", "pat":"^sn\\%[ext]$", "flags":"RANGE|NOTADR|BANG|FILES|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sniff", "pat":"^sni\\%[ff]$", "flags":"EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"snomagic", "pat":"^sno\\%[magic]$", "flags":"RANGE|WHOLEFOLD|EXTRA|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"snoremap", "pat":"^snor\\%[emap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"snoremenu", "pat":"^snoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"sort", "pat":"^sor\\%[t]$", "flags":"RANGE|DFLALL|WHOLEFOLD|BANG|EXTRA|NOTRLCOM|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"source", "pat":"^so\\%[urce]$", "flags":"BANG|FILE1|TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"spelldump", "pat":"^spelld\\%[ump]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"spellgood", "pat":"^spe\\%[llgood]$", "flags":"BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"spellinfo", "pat":"^spelli\\%[nfo]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"spellrepall", "pat":"^spellr\\%[epall]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"spellundo", "pat":"^spellu\\%[ndo]$", "flags":"BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"spellwrong", "pat":"^spellw\\%[rong]$", "flags":"BANG|RANGE|NOTADR|NEEDARG|EXTRA|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"split", "pat":"^sp\\%[lit]$", "flags":"BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sprevious", "pat":"^spr\\%[evious]$", "flags":"EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"srewind", "pat":"^sre\\%[wind]$", "flags":"EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"stop", "pat":"^st\\%[op]$", "flags":"TRLBAR|BANG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"stag", "pat":"^sta\\%[g]$", "flags":"RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"startinsert", "pat":"^star\\%[tinsert]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"startgreplace", "pat":"^startg\\%[replace]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"startreplace", "pat":"^startr\\%[eplace]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"stopinsert", "pat":"^stopi\\%[nsert]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"stjump", "pat":"^stj\\%[ump]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"stselect", "pat":"^sts\\%[elect]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"sunhide", "pat":"^sun\\%[hide]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"sunmap", "pat":"^sunm\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"sunmenu", "pat":"^sunme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"suspend", "pat":"^sus\\%[pend]$", "flags":"TRLBAR|BANG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"sview", "pat":"^sv\\%[iew]$", "flags":"BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"swapname", "pat":"^sw\\%[apname]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"syntax", "pat":"^sy\\%[ntax]$", "flags":"EXTRA|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"syncbind", "pat":"^sync\\%[bind]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"t", "pat":"^t$", "flags":"RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"tNext", "pat":"^tN\\%[ext]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabNext", "pat":"^tabN\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabclose", "pat":"^tabc\\%[lose]$", "flags":"RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabdo", "pat":"^tabdo$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabedit", "pat":"^tabe\\%[dit]$", "flags":"BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabfind", "pat":"^tabf\\%[ind]$", "flags":"BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|NEEDARG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabfirst", "pat":"^tabfir\\%[st]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tablast", "pat":"^tabl\\%[ast]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabmove", "pat":"^tabm\\%[ove]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabnew", "pat":"^tabnew$", "flags":"BANG|FILE1|RANGE|NOTADR|ZEROR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabnext", "pat":"^tabn\\%[ext]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabonly", "pat":"^tabo\\%[nly]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabprevious", "pat":"^tabp\\%[revious]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabrewind", "pat":"^tabr\\%[ewind]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tabs", "pat":"^tabs$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tab", "pat":"^tab$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"tag", "pat":"^ta\\%[g]$", "flags":"RANGE|NOTADR|BANG|WORD1|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tags", "pat":"^tags$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tcl", "pat":"^tc\\%[l]$", "flags":"RANGE|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_tcl"}), AttributeDict({"name":"tcldo", "pat":"^tcld\\%[o]$", "flags":"RANGE|DFLALL|EXTRA|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tclfile", "pat":"^tclf\\%[ile]$", "flags":"RANGE|FILE1|NEEDARG|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tearoff", "pat":"^te\\%[aroff]$", "flags":"NEEDARG|EXTRA|TRLBAR|NOTRLCOM|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tfirst", "pat":"^tf\\%[irst]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"throw", "pat":"^th\\%[row]$", "flags":"EXTRA|NEEDARG|SBOXOK|CMDWIN", "parser":"parse_cmd_throw"}), AttributeDict({"name":"tjump", "pat":"^tj\\%[ump]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"tlast", "pat":"^tl\\%[ast]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"tmenu", "pat":"^tm\\%[enu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"tnext", "pat":"^tn\\%[ext]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"topleft", "pat":"^to\\%[pleft]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"tprevious", "pat":"^tp\\%[revious]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"trewind", "pat":"^tr\\%[ewind]$", "flags":"RANGE|NOTADR|BANG|TRLBAR|ZEROR", "parser":"parse_cmd_common"}), AttributeDict({"name":"try", "pat":"^try$", "flags":"TRLBAR|SBOXOK|CMDWIN", "parser":"parse_cmd_try"}), AttributeDict({"name":"tselect", "pat":"^ts\\%[elect]$", "flags":"BANG|TRLBAR|WORD1", "parser":"parse_cmd_common"}), AttributeDict({"name":"tunmenu", "pat":"^tu\\%[nmenu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"undo", "pat":"^u\\%[ndo]$", "flags":"RANGE|NOTADR|COUNT|ZEROR|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"undojoin", "pat":"^undoj\\%[oin]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"undolist", "pat":"^undol\\%[ist]$", "flags":"TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"unabbreviate", "pat":"^una\\%[bbreviate]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"unhide", "pat":"^unh\\%[ide]$", "flags":"RANGE|NOTADR|COUNT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"unlet", "pat":"^unl\\%[et]$", "flags":"BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN", "parser":"parse_cmd_unlet"}), AttributeDict({"name":"unlockvar", "pat":"^unlo\\%[ckvar]$", "flags":"BANG|EXTRA|NEEDARG|SBOXOK|CMDWIN", "parser":"parse_cmd_unlockvar"}), AttributeDict({"name":"unmap", "pat":"^unm\\%[ap]$", "flags":"BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"unmenu", "pat":"^unme\\%[nu]$", "flags":"BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"unsilent", "pat":"^uns\\%[ilent]$", "flags":"NEEDARG|EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"update", "pat":"^up\\%[date]$", "flags":"RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"vglobal", "pat":"^v\\%[global]$", "flags":"RANGE|WHOLEFOLD|EXTRA|DFLALL|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"version", "pat":"^ve\\%[rsion]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"verbose", "pat":"^verb\\%[ose]$", "flags":"NEEDARG|RANGE|NOTADR|EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vertical", "pat":"^vert\\%[ical]$", "flags":"NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"vimgrep", "pat":"^vim\\%[grep]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"vimgrepadd", "pat":"^vimgrepa\\%[dd]$", "flags":"RANGE|NOTADR|BANG|NEEDARG|EXTRA|NOTRLCOM|TRLBAR|XFILE", "parser":"parse_cmd_common"}), AttributeDict({"name":"visual", "pat":"^vi\\%[sual]$", "flags":"BANG|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"viusage", "pat":"^viu\\%[sage]$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"view", "pat":"^vie\\%[w]$", "flags":"BANG|FILE1|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"vmap", "pat":"^vm\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vmapclear", "pat":"^vmapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vmenu", "pat":"^vme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vnew", "pat":"^vne\\%[w]$", "flags":"BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"vnoremap", "pat":"^vn\\%[oremap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vnoremenu", "pat":"^vnoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vsplit", "pat":"^vs\\%[plit]$", "flags":"BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"vunmap", "pat":"^vu\\%[nmap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"vunmenu", "pat":"^vunme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"windo", "pat":"^windo$", "flags":"BANG|NEEDARG|EXTRA|NOTRLCOM", "parser":"parse_cmd_common"}), AttributeDict({"name":"write", "pat":"^w\\%[rite]$", "flags":"RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"wNext", "pat":"^wN\\%[ext]$", "flags":"RANGE|WHOLEFOLD|NOTADR|BANG|FILE1|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"wall", "pat":"^wa\\%[ll]$", "flags":"BANG|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"while", "pat":"^wh\\%[ile]$", "flags":"EXTRA|NOTRLCOM|SBOXOK|CMDWIN", "parser":"parse_cmd_while"}), AttributeDict({"name":"winsize", "pat":"^wi\\%[nsize]$", "flags":"EXTRA|NEEDARG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"wincmd", "pat":"^winc\\%[md]$", "flags":"NEEDARG|WORD1|RANGE|NOTADR", "parser":"parse_cmd_common"}), AttributeDict({"name":"winpos", "pat":"^winp\\%[os]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"wnext", "pat":"^wn\\%[ext]$", "flags":"RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"wprevious", "pat":"^wp\\%[revious]$", "flags":"RANGE|NOTADR|BANG|FILE1|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"wq", "pat":"^wq$", "flags":"RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"wqall", "pat":"^wqa\\%[ll]$", "flags":"BANG|FILE1|ARGOPT|DFLALL|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"wsverb", "pat":"^ws\\%[verb]$", "flags":"EXTRA|NOTADR|NEEDARG", "parser":"parse_cmd_common"}), AttributeDict({"name":"wundo", "pat":"^wu\\%[ndo]$", "flags":"BANG|NEEDARG|FILE1", "parser":"parse_cmd_common"}), AttributeDict({"name":"wviminfo", "pat":"^wv\\%[iminfo]$", "flags":"BANG|FILE1|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xit", "pat":"^x\\%[it]$", "flags":"RANGE|WHOLEFOLD|BANG|FILE1|ARGOPT|DFLALL|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xall", "pat":"^xa\\%[ll]$", "flags":"BANG|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"xmapclear", "pat":"^xmapc\\%[lear]$", "flags":"EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xmap", "pat":"^xm\\%[ap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xmenu", "pat":"^xme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xnoremap", "pat":"^xn\\%[oremap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xnoremenu", "pat":"^xnoreme\\%[nu]$", "flags":"RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xunmap", "pat":"^xu\\%[nmap]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"xunmenu", "pat":"^xunme\\%[nu]$", "flags":"EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"yank", "pat":"^y\\%[ank]$", "flags":"RANGE|WHOLEFOLD|REGSTR|COUNT|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"z", "pat":"^z$", "flags":"RANGE|WHOLEFOLD|EXTRA|EXFLAGS|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"!", "pat":"^!$", "flags":"RANGE|WHOLEFOLD|BANG|FILES|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"#", "pat":"^#$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"&", "pat":"^&$", "flags":"RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"*", "pat":"^\\*$", "flags":"RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"<", "pat":"^<$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"=", "pat":"^=$", "flags":"RANGE|TRLBAR|DFLALL|EXFLAGS|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":">", "pat":"^>$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN|MODIFY", "parser":"parse_cmd_common"}), AttributeDict({"name":"@", "pat":"^@$", "flags":"RANGE|WHOLEFOLD|EXTRA|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"Next", "pat":"^N\\%[ext]$", "flags":"EXTRA|RANGE|NOTADR|COUNT|BANG|EDITCMD|ARGOPT|TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"Print", "pat":"^P\\%[rint]$", "flags":"RANGE|WHOLEFOLD|COUNT|EXFLAGS|TRLBAR|CMDWIN", "parser":"parse_cmd_common"}), AttributeDict({"name":"X", "pat":"^X$", "flags":"TRLBAR", "parser":"parse_cmd_common"}), AttributeDict({"name":"~", "pat":"^\\~$", "flags":"RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY", "parser":"parse_cmd_common"})]
class ExprTokenizer:
def __init__(self, reader):
self.reader = reader
def err(self, *a000):
pos = self.reader.getpos()
if viml_len(a000) == 1:
msg = a000[0]
else:
msg = viml_printf(*a000)
return viml_printf("%s: line %d col %d", msg, pos.lnum, pos.col)
def token(self, type, value):
return AttributeDict({"type":type, "value":value})
def peek(self):
pos = self.reader.getpos()
r = self.get()
self.reader.setpos(pos)
return r
def get(self):
while 1:
r = self.get_keepspace()
if r.type != "SPACE":
return r
def peek_keepspace(self):
pos = self.reader.getpos()
r = self.get_keepspace()
self.reader.setpos(pos)
return r
def get_keepspace(self):
while 1:
c = self.reader.peek()
s = self.reader.peekn(10)
if c == "<EOF>":
return self.token("EOF", c)
elif c == "<EOL>":
self.reader.get()
return self.token("NEWLINE", c)
elif viml_eqregh(s, "^\\s"):
s = ""
while viml_eqregh(self.reader.peekn(1), "\\s"):
s += self.reader.getn(1)
return self.token("SPACE", s)
elif viml_eqregh(s, "^0x\\x"):
s = self.reader.getn(3)
while viml_eqregh(self.reader.peekn(1), "\\x"):
s += self.reader.getn(1)
return self.token("NUMBER", s)
elif viml_eqregh(s, "^\\d"):
s = ""
while viml_eqregh(self.reader.peekn(1), "\\d"):
s += self.reader.getn(1)
if viml_eqregh(self.reader.peekn(2), "\\.\\d"):
s += self.reader.getn(1)
while viml_eqregh(self.reader.peekn(1), "\\d"):
s += self.reader.getn(1)
if viml_eqregh(self.reader.peekn(3), "[Ee][-+]\\d"):
s += self.reader.getn(3)
while viml_eqregh(self.reader.peekn(1), "\\d"):
s += self.reader.getn(1)
return self.token("NUMBER", s)
elif viml_eqregh(s, "^is#"):
self.reader.getn(3)
return self.token("ISH", "is#")
elif viml_eqregh(s, "^is?"):
self.reader.getn(3)
return self.token("ISQ", "is?")
elif viml_eqregh(s, "^isnot#"):
self.reader.getn(6)
return self.token("ISNOTH", "is#")
elif viml_eqregh(s, "^isnot?"):
self.reader.getn(6)
return self.token("ISNOTQ", "is?")
elif viml_eqregh(s, "^is\\>"):
self.reader.getn(2)
return self.token("IS", "is")
elif viml_eqregh(s, "^isnot\\>"):
self.reader.getn(5)
return self.token("ISNOT", "isnot")
elif viml_eqregh(s, "^<[Ss][Ii][Dd]>\\h"):
s = self.reader.getn(6)
while viml_eqregh(self.reader.peekn(1), "\\w\\|[:#]"):
s += self.reader.getn(1)
return self.token("IDENTIFIER", s)
elif viml_eqregh(s, "^\\h"):
s = self.reader.getn(1)
while viml_eqregh(self.reader.peekn(1), "\\w\\|[:#]"):
s += self.reader.getn(1)
return self.token("IDENTIFIER", s)
elif viml_eqregh(s, "^==?"):
self.reader.getn(3)
return self.token("EQEQQ", "==?")
elif viml_eqregh(s, "^==#"):
self.reader.getn(3)
return self.token("EQEQH", "==#")
elif viml_eqregh(s, "^!=?"):
self.reader.getn(3)
return self.token("NOTEQQ", "!=?")
elif viml_eqregh(s, "^!=#"):
self.reader.getn(3)
return self.token("NOTEQH", "!=#")
elif viml_eqregh(s, "^>=?"):
self.reader.getn(3)
return self.token("GTEQQ", ">=?")
elif viml_eqregh(s, "^>=#"):
self.reader.getn(3)
return self.token("GTEQH", ">=#")
elif viml_eqregh(s, "^<=?"):
self.reader.getn(3)
return self.token("LTEQQ", "<=?")
elif viml_eqregh(s, "^<=#"):
self.reader.getn(3)
return self.token("LTEQH", "<=#")
elif viml_eqregh(s, "^=\\~?"):
self.reader.getn(3)
return self.token("EQTILDQ", "=\\~?")
elif viml_eqregh(s, "^=\\~#"):
self.reader.getn(3)
return self.token("EQTILDH", "=\\~#")
elif viml_eqregh(s, "^!\\~?"):
self.reader.getn(3)
return self.token("NOTTILDQ", "!\\~?")
elif viml_eqregh(s, "^!\\~#"):
self.reader.getn(3)
return self.token("NOTTILDH", "!\\~#")
elif viml_eqregh(s, "^>?"):
self.reader.getn(2)
return self.token("GTQ", ">?")
elif viml_eqregh(s, "^>#"):
self.reader.getn(2)
return self.token("GTH", ">#")
elif viml_eqregh(s, "^<?"):
self.reader.getn(2)
return self.token("LTQ", "<?")
elif viml_eqregh(s, "^<#"):
self.reader.getn(2)
return self.token("LTH", "<#")
elif viml_eqregh(s, "^||"):
self.reader.getn(2)
return self.token("OROR", "||")
elif viml_eqregh(s, "^&&"):
self.reader.getn(2)
return self.token("ANDAND", "&&")
elif viml_eqregh(s, "^=="):
self.reader.getn(2)
return self.token("EQEQ", "==")
elif viml_eqregh(s, "^!="):
self.reader.getn(2)
return self.token("NOTEQ", "!=")
elif viml_eqregh(s, "^>="):
self.reader.getn(2)
return self.token("GTEQ", ">=")
elif viml_eqregh(s, "^<="):
self.reader.getn(2)
return self.token("LTEQ", "<=")
elif viml_eqregh(s, "^=\\~"):
self.reader.getn(2)
return self.token("EQTILD", "=\\~")
elif viml_eqregh(s, "^!\\~"):
self.reader.getn(2)
return self.token("NOTTILD", "!\\~")
elif viml_eqregh(s, "^>"):
self.reader.getn(1)
return self.token("GT", ">")
elif viml_eqregh(s, "^<"):
self.reader.getn(1)
return self.token("LT", "<")
elif viml_eqregh(s, "^+"):
self.reader.getn(1)
return self.token("PLUS", "+")
elif viml_eqregh(s, "^-"):
self.reader.getn(1)
return self.token("MINUS", "-")
elif viml_eqregh(s, "^\\."):
self.reader.getn(1)
return self.token("DOT", ".")
elif viml_eqregh(s, "^\\*"):
self.reader.getn(1)
return self.token("STAR", "*")
elif viml_eqregh(s, "^/"):
self.reader.getn(1)
return self.token("SLASH", "/")
elif viml_eqregh(s, "^%"):
self.reader.getn(1)
return self.token("PER", "%")
elif viml_eqregh(s, "^!"):
self.reader.getn(1)
return self.token("NOT", "!")
elif viml_eqregh(s, "^?"):
self.reader.getn(1)
return self.token("QUESTION", "?")
elif viml_eqregh(s, "^:"):
self.reader.getn(1)
return self.token("COLON", ":")
elif viml_eqregh(s, "^("):
self.reader.getn(1)
return self.token("LPAR", "(")
elif viml_eqregh(s, "^)"):
self.reader.getn(1)
return self.token("RPAR", ")")
elif viml_eqregh(s, "^\\["):
self.reader.getn(1)
return self.token("LBRA", "[")
elif viml_eqregh(s, "^]"):
self.reader.getn(1)
return self.token("RBRA", "]")
elif viml_eqregh(s, "^{"):
self.reader.getn(1)
return self.token("LBPAR", "{")
elif viml_eqregh(s, "^}"):
self.reader.getn(1)
return self.token("RBPAR", "}")
elif viml_eqregh(s, "^,"):
self.reader.getn(1)
return self.token("COMMA", ",")
elif viml_eqregh(s, "^'"):
self.reader.getn(1)
return self.token("SQUOTE", "'")
elif viml_eqregh(s, "^\""):
self.reader.getn(1)
return self.token("DQUOTE", "\"")
elif viml_eqregh(s, "^\\$\\w\\+"):
s = self.reader.getn(1)
while viml_eqregh(self.reader.peekn(1), "\\w"):
s += self.reader.getn(1)
return self.token("ENV", s)
elif viml_eqregh(s, "^@."):
return self.token("REG", self.reader.getn(2))
elif viml_eqregh(s, "^&\\(g:\\|l:\\|\\w\\w\\)"):
s = self.reader.getn(3)
while viml_eqregh(self.reader.peekn(1), "\\w"):
s += self.reader.getn(1)
return self.token("OPTION", s)
elif viml_eqregh(s, "^="):
self.reader.getn(1)
return self.token("EQ", "=")
elif viml_eqregh(s, "^|"):
self.reader.getn(1)
return self.token("OR", "|")
elif viml_eqregh(s, "^;"):
self.reader.getn(1)
return self.token("SEMICOLON", ";")
elif viml_eqregh(s, "^`"):
self.reader.getn(1)
return self.token("BACKTICK", "`")
else:
raise Exception(self.err("ExprTokenizer: %s", s))
def get_sstring(self):
s = ""
while viml_eqregh(self.reader.peekn(1), "\\s"):
self.reader.getn(1)
c = self.reader.getn(1)
if c != "'":
raise Exception(sefl.err("ExprTokenizer: unexpected character: %s", c))
while 1:
c = self.reader.getn(1)
if c == "":
raise Exception(self.err("ExprTokenizer: unexpected EOL"))
elif c == "'":
if self.reader.peekn(1) == "'":
self.reader.getn(1)
s += c
else:
break
else:
s += c
return s
def get_dstring(self):
s = ""
while viml_eqregh(self.reader.peekn(1), "\\s"):
self.reader.getn(1)
c = self.reader.getn(1)
if c != "\"":
raise Exception(self.err("ExprTokenizer: unexpected character: %s", c))
while 1:
c = self.reader.getn(1)
if c == "":
raise Exception(self.err("ExprTokenizer: unexpectd EOL"))
elif c == "\"":
break
elif c == "\\":
s += c
c = self.reader.getn(1)
if c == "":
raise Exception(self.err("ExprTokenizer: unexpected EOL"))
s += c
else:
s += c
return s
class ExprParser:
def __init__(self, tokenizer):
self.tokenizer = tokenizer
def err(self, *a000):
pos = self.tokenizer.reader.getpos()
if viml_len(a000) == 1:
msg = a000[0]
else:
msg = viml_printf(*a000)
return viml_printf("%s: line %d col %d", msg, pos.lnum, pos.col)
def exprnode(self, type):
return AttributeDict({"type":type})
def parse(self):
return self.parse_expr1()
# expr1: expr2 ? expr1 : expr1
def parse_expr1(self):
lhs = self.parse_expr2()
token = self.tokenizer.peek()
if token.type == "QUESTION":
self.tokenizer.get()
node = self.exprnode("CONDEXP")
node.cond = lhs
node.then = self.parse_expr1()
token = self.tokenizer.peek()
if token.type != "COLON":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
self.tokenizer.get()
node._else = self.parse_expr1()
lhs = node
return lhs
# expr2: expr3 || expr3 ..
def parse_expr2(self):
lhs = self.parse_expr3()
token = self.tokenizer.peek()
while token.type == "OROR":
self.tokenizer.get()
node = self.exprnode("LOGOR")
node.lhs = lhs
node.rhs = self.parse_expr3()
lhs = node
token = self.tokenizer.peek()
return lhs
# expr3: expr4 && expr4
def parse_expr3(self):
lhs = self.parse_expr4()
token = self.tokenizer.peek()
while token.type == "ANDAND":
self.tokenizer.get()
node = self.exprnode("LOGAND")
node.lhs = lhs
node.rhs = self.parse_expr4()
lhs = node
token = self.tokenizer.peek()
return lhs
# expr4: expr5 == expr5
# expr5 != expr5
# expr5 > expr5
# expr5 >= expr5
# expr5 < expr5
# expr5 <= expr5
# expr5 =~ expr5
# expr5 !~ expr5
#
# expr5 ==? expr5
# expr5 ==# expr5
# etc.
#
# expr5 is expr5
# expr5 isnot expr5
def parse_expr4(self):
lhs = self.parse_expr5()
token = self.tokenizer.peek()
if token.type == "EQEQQ":
self.tokenizer.get()
node = self.exprnode("EQEQQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "EQEQH":
self.tokenizer.get()
node = self.exprnode("EQEQH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "NOTEQQ":
self.tokenizer.get()
node = self.exprnode("NOTEQQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "NOTEQH":
self.tokenizer.get()
node = self.exprnode("NOTEQH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "GTEQQ":
self.tokenizer.get()
node = self.exprnode("GTEQQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "GTEQH":
self.tokenizer.get()
node = self.exprnode("GTEQH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "LTEQQ":
self.tokenizer.get()
node = self.exprnode("LTEQQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "LTEQH":
self.tokenizer.get()
node = self.exprnode("LTEQH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "EQTILDQ":
self.tokenizer.get()
node = self.exprnode("EQTILDQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "EQTILDH":
self.tokenizer.get()
node = self.exprnode("EQTILDH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "NOTTILDQ":
self.tokenizer.get()
node = self.exprnode("NOTTILDQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "NOTTILDH":
self.tokenizer.get()
node = self.exprnode("NOTTILDH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "GTQ":
self.tokenizer.get()
node = self.exprnode("GTQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "GTH":
self.tokenizer.get()
node = self.exprnode("GTH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "LTQ":
self.tokenizer.get()
node = self.exprnode("LTQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "LTH":
self.tokenizer.get()
node = self.exprnode("LTH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "EQEQ":
self.tokenizer.get()
node = self.exprnode("EQEQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "NOTEQ":
self.tokenizer.get()
node = self.exprnode("NOTEQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "GTEQ":
self.tokenizer.get()
node = self.exprnode("GTEQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "LTEQ":
self.tokenizer.get()
node = self.exprnode("LTEQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "EQTILD":
self.tokenizer.get()
node = self.exprnode("EQTILD")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "NOTTILD":
self.tokenizer.get()
node = self.exprnode("NOTTILD")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "GT":
self.tokenizer.get()
node = self.exprnode("GT")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "LT":
self.tokenizer.get()
node = self.exprnode("LT")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "ISH":
self.tokenizer.get()
node = self.exprnode("ISH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "ISQ":
self.tokenizer.get()
node = self.exprnode("ISQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "ISNOTH":
self.tokenizer.get()
node = self.exprnode("ISNOTH")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "ISNOTQ":
self.tokenizer.get()
node = self.exprnode("ISNOTQ")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "IS":
self.tokenizer.get()
node = self.exprnode("IS")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
elif token.type == "ISNOT":
self.tokenizer.get()
node = self.exprnode("ISNOT")
node.lhs = lhs
node.rhs = self.parse_expr5()
lhs = node
return lhs
# expr5: expr6 + expr6 ..
# expr6 - expr6 ..
# expr6 . expr6 ..
def parse_expr5(self):
lhs = self.parse_expr6()
while 1:
token = self.tokenizer.peek()
if token.type == "PLUS":
self.tokenizer.get()
node = self.exprnode("ADD")
node.lhs = lhs
node.rhs = self.parse_expr6()
lhs = node
elif token.type == "MINUS":
self.tokenizer.get()
node = self.exprnode("SUB")
node.lhs = lhs
node.rhs = self.parse_expr6()
lhs = node
elif token.type == "DOT":
self.tokenizer.get()
node = self.exprnode("CONCAT")
node.lhs = lhs
node.rhs = self.parse_expr6()
lhs = node
else:
break
return lhs
# expr6: expr7 * expr7 ..
# expr7 / expr7 ..
# expr7 % expr7 ..
def parse_expr6(self):
lhs = self.parse_expr7()
while 1:
token = self.tokenizer.peek()
if token.type == "STAR":
self.tokenizer.get()
node = self.exprnode("MUL")
node.lhs = lhs
node.rhs = self.parse_expr7()
lhs = node
elif token.type == "SLASH":
self.tokenizer.get()
node = self.exprnode("DIV")
node.lhs = lhs
node.rhs = self.parse_expr7()
lhs = node
elif token.type == "PER":
self.tokenizer.get()
node = self.exprnode("MOD")
node.lhs = lhs
node.rhs = self.parse_expr7()
lhs = node
else:
break
return lhs
# expr7: ! expr7
# - expr7
# + expr7
def parse_expr7(self):
token = self.tokenizer.peek()
if token.type == "NOT":
self.tokenizer.get()
node = self.exprnode("NOT")
node.expr = self.parse_expr7()
elif token.type == "MINUS":
self.tokenizer.get()
node = self.exprnode("MINUS")
node.expr = self.parse_expr7()
elif token.type == "PLUS":
self.tokenizer.get()
node = self.exprnode("PLUS")
node.expr = self.parse_expr7()
else:
node = self.parse_expr8()
return node
# expr8: expr8[expr1]
# expr8[expr1 : expr1]
# expr8.name
# expr8(expr1, ...)
def parse_expr8(self):
lhs = self.parse_expr9()
while 1:
token = self.tokenizer.peek()
token2 = self.tokenizer.peek_keepspace()
if token2.type == "LBRA":
self.tokenizer.get()
if self.tokenizer.peek().type == "COLON":
self.tokenizer.get()
node = self.exprnode("SLICE")
node.expr = lhs
node.expr1 = NIL
node.expr2 = NIL
token = self.tokenizer.peek()
if token.type != "RBRA":
node.expr2 = self.parse_expr1()
token = self.tokenizer.peek()
if token.type != "RBRA":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
self.tokenizer.get()
else:
expr1 = self.parse_expr1()
if self.tokenizer.peek().type == "COLON":
self.tokenizer.get()
node = self.exprnode("SLICE")
node.expr = lhs
node.expr1 = expr1
node.expr2 = NIL
token = self.tokenizer.peek()
if token.type != "RBRA":
node.expr2 = self.parse_expr1()
token = self.tokenizer.peek()
if token.type != "RBRA":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
self.tokenizer.get()
else:
node = self.exprnode("INDEX")
node.expr = lhs
node.expr1 = expr1
token = self.tokenizer.peek()
if token.type != "RBRA":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
self.tokenizer.get()
lhs = node
elif token.type == "LPAR":
self.tokenizer.get()
node = self.exprnode("CALL")
node.expr = lhs
node.args = []
if self.tokenizer.peek().type == "RPAR":
self.tokenizer.get()
else:
while 1:
viml_add(node.args, self.parse_expr1())
token = self.tokenizer.peek()
if token.type == "COMMA":
self.tokenizer.get()
elif token.type == "RPAR":
self.tokenizer.get()
break
else:
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
lhs = node
elif token2.type == "DOT":
# INDEX or CONCAT
pos = self.tokenizer.reader.getpos()
self.tokenizer.get()
token2 = self.tokenizer.peek_keepspace()
if token2.type == "IDENTIFIER":
rhs = self.exprnode("IDENTIFIER")
rhs.value = self.parse_identifier()
node = self.exprnode("DOT")
node.lhs = lhs
node.rhs = rhs
else:
# to be CONCAT
self.tokenizer.reader.setpos(pos)
break
lhs = node
else:
break
return lhs
# expr9: number
# "string"
# 'string'
# [expr1, ...]
# {expr1: expr1, ...}
# &option
# (expr1)
# variable
# var{ria}ble
# $VAR
# @r
# function(expr1, ...)
# func{ti}on(expr1, ...)
def parse_expr9(self):
token = self.tokenizer.peek()
if token.type == "NUMBER":
self.tokenizer.get()
node = self.exprnode("NUMBER")
node.value = token.value
elif token.type == "DQUOTE":
node = self.exprnode("STRING")
node.value = "\"" + self.tokenizer.get_dstring() + "\""
elif token.type == "SQUOTE":
node = self.exprnode("STRING")
node.value = "'" + self.tokenizer.get_sstring() + "'"
elif token.type == "LBRA":
self.tokenizer.get()
node = self.exprnode("LIST")
node.items = []
token = self.tokenizer.peek()
if token.type == "RBRA":
self.tokenizer.get()
else:
while 1:
viml_add(node.items, self.parse_expr1())
token = self.tokenizer.peek()
if token.type == "COMMA":
self.tokenizer.get()
if self.tokenizer.peek().type == "RBRA":
self.tokenizer.get()
break
elif token.type == "RBRA":
self.tokenizer.get()
break
else:
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
elif token.type == "LBPAR":
pos = self.tokenizer.reader.getpos()
self.tokenizer.get()
node = self.exprnode("DICT")
node.items = []
token = self.tokenizer.peek()
if token.type == "RBPAR":
self.tokenizer.get()
else:
while 1:
key = self.parse_expr1()
token = self.tokenizer.get()
if token.type == "RBPAR":
if not viml_empty(node.items):
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
self.tokenizer.reader.setpos(pos)
node = self.exprnode("IDENTIFIER")
node.value = self.parse_identifier()
break
if token.type != "COLON":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
val = self.parse_expr1()
viml_add(node.items, [key, val])
token = self.tokenizer.peek()
if token.type == "COMMA":
self.tokenizer.get()
if self.tokenizer.peek().type == "RBPAR":
self.tokenizer.get()
break
elif token.type == "RBPAR":
self.tokenizer.get()
break
else:
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
elif token.type == "LPAR":
self.tokenizer.get()
node = self.exprnode("NESTING")
node.expr = self.parse_expr1()
token = self.tokenizer.get()
if token.type != "RPAR":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
elif token.type == "OPTION":
self.tokenizer.get()
node = self.exprnode("OPTION")
node.value = token.value
elif token.type == "IDENTIFIER":
node = self.exprnode("IDENTIFIER")
node.value = self.parse_identifier()
elif token.type == "ENV":
self.tokenizer.get()
node = self.exprnode("ENV")
node.value = token.value
elif token.type == "REG":
self.tokenizer.get()
node = self.exprnode("REG")
node.value = token.value
else:
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
return node
def parse_identifier(self):
id = []
token = self.tokenizer.peek()
while 1:
if token.type == "IDENTIFIER":
self.tokenizer.get()
viml_add(id, AttributeDict({"curly":0, "value":token.value}))
elif token.type == "LBPAR":
self.tokenizer.get()
node = self.parse_expr1()
token = self.tokenizer.get()
if token.type != "RBPAR":
raise Exception(self.err("ExprParser: unexpected token: %s", token.value))
viml_add(id, AttributeDict({"curly":1, "value":node}))
else:
break
token = self.tokenizer.peek_keepspace()
return id
class LvalueParser(ExprParser):
def parse(self):
return self.parse_lv8()
# expr8: expr8[expr1]
# expr8[expr1 : expr1]
# expr8.name
def parse_lv8(self):
lhs = self.parse_lv9()
while 1:
token = self.tokenizer.peek()
token2 = self.tokenizer.peek_keepspace()
if token2.type == "LBRA":
self.tokenizer.get()
if self.tokenizer.peek().type == "COLON":
self.tokenizer.get()
node = self.exprnode("SLICE")
node.expr = lhs
node.expr1 = NIL
node.expr2 = NIL
token = self.tokenizer.peek()
if token.type != "RBRA":
node.expr2 = self.parse_expr1()
token = self.tokenizer.peek()
if token.type != "RBRA":
raise Exception(self.err("LvalueParser: unexpected token: %s", token.value))
self.tokenizer.get()
else:
expr1 = self.parse_expr1()
if self.tokenizer.peek().type == "COLON":
self.tokenizer.get()
node = self.exprnode("SLICE")
node.expr = lhs
node.expr1 = expr1
node.expr2 = NIL
token = self.tokenizer.peek()
if token.type != "RBRA":
node.expr2 = self.parse_expr1()
token = self.tokenizer.peek()
if token.type != "RBRA":
raise Exception(self.err("LvalueParser: unexpected token: %s", token.value))
self.tokenizer.get()
else:
node = self.exprnode("INDEX")
node.expr = lhs
node.expr1 = expr1
token = self.tokenizer.peek()
if token.type != "RBRA":
raise Exception(self.err("LvalueParser: unexpected token: %s", token.value))
self.tokenizer.get()
lhs = node
elif token2.type == "DOT":
# INDEX or CONCAT
pos = self.tokenizer.reader.getpos()
self.tokenizer.get()
token2 = self.tokenizer.peek_keepspace()
if token2.type == "IDENTIFIER":
rhs = self.exprnode("IDENTIFIER")
rhs.value = self.parse_identifier()
node = self.exprnode("DOT")
node.lhs = lhs
node.rhs = rhs
else:
# to be CONCAT
self.tokenizer.reader.setpos(pos)
break
lhs = node
else:
break
return lhs
# expr9: &option
# variable
# var{ria}ble
# $VAR
# @r
def parse_lv9(self):
token = self.tokenizer.peek()
if token.type == "LBPAR":
node = self.exprnode("IDENTIFIER")
node.value = self.parse_identifier()
elif token.type == "OPTION":
self.tokenizer.get()
node = self.exprnode("OPTION")
node.value = token.value
elif token.type == "IDENTIFIER":
node = self.exprnode("IDENTIFIER")
node.value = self.parse_identifier()
elif token.type == "ENV":
self.tokenizer.get()
node = self.exprnode("ENV")
node.value = token.value
elif token.type == "REG":
self.tokenizer.get()
node = self.exprnode("REG")
node.value = token.value
else:
raise Exception(self.err("LvalueParser: unexpected token: %s", token.value))
return node
class StringReader:
def __init__(self, lines):
self.lines = lines
self.buf = []
self.pos = []
lnum = 0
while lnum < viml_len(lines):
col = 0
for c in viml_split(lines[lnum], "\\zs"):
viml_add(self.buf, c)
viml_add(self.pos, [lnum, col])
col += viml_len(c)
while lnum + 1 < viml_len(lines) and viml_eqregh(lines[lnum + 1], "^\\s*\\\\"):
skip = 1
col = 0
for c in viml_split(lines[lnum + 1], "\\zs"):
if skip:
if c == "\\":
skip = 0
else:
viml_add(self.buf, c)
viml_add(self.pos, [lnum, col])
col += viml_len(c)
lnum += 1
viml_add(self.buf, "<EOL>")
viml_add(self.pos, [lnum, col])
lnum += 1
# for <EOF>
viml_add(self.pos, [lnum, 0])
self.i = 0
def peek(self):
if self.i >= viml_len(self.buf):
return "<EOF>"
return self.buf[self.i]
def get(self):
if self.i >= viml_len(self.buf):
return "<EOF>"
self.i += 1
return self.buf[self.i - 1]
def peekn(self, n):
pos = self.getpos()
r = self.getn(n)
self.setpos(pos)
return r
def getn(self, n):
r = ""
j = 0
while self.i <= viml_len(self.buf) and (n < 0 or j < n):
c = self.buf[self.i]
if c == "<EOL>":
break
r += c
self.i += 1
j += 1
return r
def peekline(self):
return self.peekn(-1)
def readline(self):
r = self.getn(-1)
self.get()
return r
def getstr(self, begin, end):
r = ""
for i in viml_range(begin.i, end.i - 1):
if i >= viml_len(self.buf):
break
c = self.buf[i]
if c == "<EOL>":
c = "\n"
r += c
return r
def getpos(self):
lnum, col = self.pos[self.i]
return AttributeDict({"i":self.i, "lnum":lnum, "col":col})
def setpos(self, pos):
self.i = pos.i
class Compiler:
def __init__(self):
self.indent = [""]
self.lines = []
def out(self, *a000):
if viml_len(a000) == 1:
if viml_eqregh(a000[0], "^)\\+$"):
self.lines[-1] += a000[0]
else:
viml_add(self.lines, self.indent[0] + a000[0])
else:
viml_add(self.lines, self.indent[0] + viml_printf(*a000))
def incindent(self, s):
viml_insert(self.indent, self.indent[0] + s)
def decindent(self):
viml_remove(self.indent, 0)
def compile(self, node):
if node.type == "TOPLEVEL":
return self.compile_toplevel(node)
elif node.type == "COMMENT":
return self.compile_comment(node)
elif node.type == "EXCMD":
return self.compile_excmd(node)
elif node.type == "FUNCTION":
return self.compile_function(node)
elif node.type == "DELFUNCTION":
return self.compile_delfunction(node)
elif node.type == "RETURN":
return self.compile_return(node)
elif node.type == "EXCALL":
return self.compile_excall(node)
elif node.type == "LET":
return self.compile_let(node)
elif node.type == "UNLET":
return self.compile_unlet(node)
elif node.type == "LOCKVAR":
return self.compile_lockvar(node)
elif node.type == "UNLOCKVAR":
return self.compile_unlockvar(node)
elif node.type == "IF":
return self.compile_if(node)
elif node.type == "WHILE":
return self.compile_while(node)
elif node.type == "FOR":
return self.compile_for(node)
elif node.type == "CONTINUE":
return self.compile_continue(node)
elif node.type == "BREAK":
return self.compile_break(node)
elif node.type == "TRY":
return self.compile_try(node)
elif node.type == "THROW":
return self.compile_throw(node)
elif node.type == "ECHO":
return self.compile_echo(node)
elif node.type == "ECHON":
return self.compile_echon(node)
elif node.type == "ECHOHL":
return self.compile_echohl(node)
elif node.type == "ECHOMSG":
return self.compile_echomsg(node)
elif node.type == "ECHOERR":
return self.compile_echoerr(node)
elif node.type == "EXECUTE":
return self.compile_execute(node)
elif node.type == "CONDEXP":
return self.compile_condexp(node)
elif node.type == "LOGOR":
return self.compile_logor(node)
elif node.type == "LOGAND":
return self.compile_logand(node)
elif node.type == "EQEQQ":
return self.compile_eqeqq(node)
elif node.type == "EQEQH":
return self.compile_eqeqh(node)
elif node.type == "NOTEQQ":
return self.compile_noteqq(node)
elif node.type == "NOTEQH":
return self.compile_noteqh(node)
elif node.type == "GTEQQ":
return self.compile_gteqq(node)
elif node.type == "GTEQH":
return self.compile_gteqh(node)
elif node.type == "LTEQQ":
return self.compile_lteqq(node)
elif node.type == "LTEQH":
return self.compile_lteqh(node)
elif node.type == "EQTILDQ":
return self.compile_eqtildq(node)
elif node.type == "EQTILDH":
return self.compile_eqtildh(node)
elif node.type == "NOTTILDQ":
return self.compile_nottildq(node)
elif node.type == "NOTTILDH":
return self.compile_nottildh(node)
elif node.type == "GTQ":
return self.compile_gtq(node)
elif node.type == "GTH":
return self.compile_gth(node)
elif node.type == "LTQ":
return self.compile_ltq(node)
elif node.type == "LTH":
return self.compile_lth(node)
elif node.type == "EQEQ":
return self.compile_eqeq(node)
elif node.type == "NOTEQ":
return self.compile_noteq(node)
elif node.type == "GTEQ":
return self.compile_gteq(node)
elif node.type == "LTEQ":
return self.compile_lteq(node)
elif node.type == "EQTILD":
return self.compile_eqtild(node)
elif node.type == "NOTTILD":
return self.compile_nottild(node)
elif node.type == "GT":
return self.compile_gt(node)
elif node.type == "LT":
return self.compile_lt(node)
elif node.type == "ISQ":
return self.compile_isq(node)
elif node.type == "ISH":
return self.compile_ish(node)
elif node.type == "ISNOTQ":
return self.compile_isnotq(node)
elif node.type == "ISNOTH":
return self.compile_isnoth(node)
elif node.type == "IS":
return self.compile_is(node)
elif node.type == "ISNOT":
return self.compile_isnot(node)
elif node.type == "ADD":
return self.compile_add(node)
elif node.type == "SUB":
return self.compile_sub(node)
elif node.type == "CONCAT":
return self.compile_concat(node)
elif node.type == "MUL":
return self.compile_mul(node)
elif node.type == "DIV":
return self.compile_div(node)
elif node.type == "MOD":
return self.compile_mod(node)
elif node.type == "NOT":
return self.compile_not(node)
elif node.type == "PLUS":
return self.compile_plus(node)
elif node.type == "MINUS":
return self.compile_minus(node)
elif node.type == "INDEX":
return self.compile_index(node)
elif node.type == "SLICE":
return self.compile_slice(node)
elif node.type == "DOT":
return self.compile_dot(node)
elif node.type == "CALL":
return self.compile_call(node)
elif node.type == "NUMBER":
return self.compile_number(node)
elif node.type == "STRING":
return self.compile_string(node)
elif node.type == "LIST":
return self.compile_list(node)
elif node.type == "DICT":
return self.compile_dict(node)
elif node.type == "NESTING":
return self.compile_nesting(node)
elif node.type == "OPTION":
return self.compile_option(node)
elif node.type == "IDENTIFIER":
return self.compile_identifier(node)
elif node.type == "ENV":
return self.compile_env(node)
elif node.type == "REG":
return self.compile_reg(node)
else:
raise Exception(self.err("Compiler: unknown node: %s", viml_string(node)))
def compile_body(self, body):
for node in body:
self.compile(node)
def compile_begin(self, body):
if viml_len(body) == 1:
self.compile_body(body)
else:
self.out("(begin")
self.incindent(" ")
self.compile_body(body)
self.out(")")
self.decindent()
def compile_toplevel(self, node):
self.compile_body(node.body)
return self.lines
def compile_comment(self, node):
self.out(";%s", node.str)
def compile_excmd(self, node):
self.out("(excmd \"%s\")", viml_escape(node.str, "\\\""))
def compile_function(self, node):
name = self.compile(node.name)
if not viml_empty(node.args) and node.args[-1] == "...":
node.args[-1] = ". ..."
self.out("(function %s (%s)", name, viml_join(node.args, " "))
self.incindent(" ")
self.compile_body(node.body)
self.out(")")
self.decindent()
def compile_delfunction(self, node):
self.out("(delfunction %s)", self.compile(node.name))
def compile_return(self, node):
if node.arg is NIL:
self.out("(return)")
else:
self.out("(return %s)", self.compile(node.arg))
def compile_excall(self, node):
self.out("(call %s)", self.compile(node.expr))
def compile_let(self, node):
lhs = viml_join([self.compile(vval) for vval in node.lhs.args], " ")
if node.lhs.rest is not NIL:
lhs += " . " + self.compile(node.lhs.rest)
rhs = self.compile(node.rhs)
self.out("(let %s (%s) %s)", node.op, lhs, rhs)
def compile_unlet(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(unlet %s)", viml_join(args, " "))
def compile_lockvar(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(lockvar %s %s)", node.depth, viml_join(args, " "))
def compile_unlockvar(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(unlockvar %s %s)", node.depth, viml_join(args, " "))
def compile_if(self, node):
self.out("(if %s", self.compile(node.cond))
self.incindent(" ")
self.compile_begin(node.body)
self.decindent()
for enode in node.elseif:
self.out(" elseif %s", self.compile(enode.cond))
self.incindent(" ")
self.compile_begin(enode.body)
self.decindent()
if node._else is not NIL:
self.out(" else")
self.incindent(" ")
self.compile_begin(node._else.body)
self.decindent()
self.incindent(" ")
self.out(")")
self.decindent()
def compile_while(self, node):
self.out("(while %s", self.compile(node.cond))
self.incindent(" ")
self.compile_body(node.body)
self.out(")")
self.decindent()
def compile_for(self, node):
lhs = viml_join([self.compile(vval) for vval in node.lhs.args], " ")
if node.lhs.rest is not NIL:
lhs += " . " + self.compile(node.lhs.rest)
rhs = self.compile(node.rhs)
self.out("(for (%s) %s", lhs, rhs)
self.incindent(" ")
self.compile_body(node.body)
self.out(")")
self.decindent()
def compile_continue(self, node):
self.out("(continue)")
def compile_break(self, node):
self.out("(break)")
def compile_try(self, node):
self.out("(try")
self.incindent(" ")
self.compile_begin(node.body)
for cnode in node.catch:
if cnode.pattern is not NIL:
self.out("(#/%s/", cnode.pattern)
self.incindent(" ")
self.compile_body(cnode.body)
self.out(")")
self.decindent()
else:
self.out("(else")
self.incindent(" ")
self.compile_body(cnode.body)
self.out(")")
self.decindent()
if node._finally is not NIL:
self.out("(finally")
self.incindent(" ")
self.compile_body(node._finally.body)
self.out(")")
self.decindent()
self.out(")")
self.decindent()
def compile_throw(self, node):
self.out("(throw %s)", self.compile(node.arg))
def compile_echo(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(echo %s)", viml_join(args, " "))
def compile_echon(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(echon %s)", viml_join(args, " "))
def compile_echohl(self, node):
self.out("(echohl \"%s\")", viml_escape(node.name, "\\\""))
def compile_echomsg(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(echomsg %s)", viml_join(args, " "))
def compile_echoerr(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(echoerr %s)", viml_join(args, " "))
def compile_execute(self, node):
args = [self.compile(vval) for vval in node.args]
self.out("(execute %s)", viml_join(args, " "))
def compile_condexp(self, node):
return viml_printf("(?: %s %s %s)", self.compile(node.cond), self.compile(node.then), self.compile(node._else))
def compile_logor(self, node):
return viml_printf("(|| %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_logand(self, node):
return viml_printf("(&& %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_eqeqq(self, node):
return viml_printf("(==? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_eqeqh(self, node):
return viml_printf("(==# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_noteqq(self, node):
return viml_printf("(!=? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_noteqh(self, node):
return viml_printf("(!=# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_gteqq(self, node):
return viml_printf("(>=? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_gteqh(self, node):
return viml_printf("(>=# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_lteqq(self, node):
return viml_printf("(<=? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_lteqh(self, node):
return viml_printf("(<=# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_eqtildq(self, node):
return viml_printf("(=~? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_eqtildh(self, node):
return viml_printf("(=~# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_nottildq(self, node):
return viml_printf("(!~? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_nottildh(self, node):
return viml_printf("(!~# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_gtq(self, node):
return viml_printf("(>? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_gth(self, node):
return viml_printf("(># %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_ltq(self, node):
return viml_printf("(<? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_lth(self, node):
return viml_printf("(<# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_eqeq(self, node):
return viml_printf("(== %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_noteq(self, node):
return viml_printf("(!= %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_gteq(self, node):
return viml_printf("(>= %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_lteq(self, node):
return viml_printf("(<= %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_eqtild(self, node):
return viml_printf("(=~ %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_nottild(self, node):
return viml_printf("(!~ %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_gt(self, node):
return viml_printf("(> %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_lt(self, node):
return viml_printf("(< %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_isq(self, node):
return viml_printf("(is? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_ish(self, node):
return viml_printf("(is# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_isnotq(self, node):
return viml_printf("(isnot? %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_isnoth(self, node):
return viml_printf("(isnot# %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_is(self, node):
return viml_printf("(is %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_isnot(self, node):
return viml_printf("(isnot %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_add(self, node):
return viml_printf("(+ %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_sub(self, node):
return viml_printf("(- %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_concat(self, node):
return viml_printf("(concat %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_mul(self, node):
return viml_printf("(* %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_div(self, node):
return viml_printf("(/ %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_mod(self, node):
return viml_printf("(%% %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_not(self, node):
return viml_printf("(! %s)", self.compile(node.expr))
def compile_plus(self, node):
return viml_printf("(+ %s)", self.compile(node.expr))
def compile_minus(self, node):
return viml_printf("(- %s)", self.compile(node.expr))
def compile_index(self, node):
return viml_printf("(index %s %s)", self.compile(node.expr), self.compile(node.expr1))
def compile_slice(self, node):
expr1 = "nil" if node.expr1 is NIL else self.compile(node.expr1)
expr2 = "nil" if node.expr2 is NIL else self.compile(node.expr2)
return viml_printf("(slice %s %s %s)", self.compile(node.expr), expr1, expr2)
def compile_dot(self, node):
return viml_printf("(dot %s %s)", self.compile(node.lhs), self.compile(node.rhs))
def compile_call(self, node):
args = [self.compile(vval) for vval in node.args]
return viml_printf("(%s %s)", self.compile(node.expr), viml_join(args, " "))
def compile_number(self, node):
return node.value
def compile_string(self, node):
return node.value
def compile_list(self, node):
items = [self.compile(vval) for vval in node.items]
if viml_empty(items):
return "(list)"
else:
return viml_printf("(list %s)", viml_join(items, " "))
def compile_dict(self, node):
items = ["(" + self.compile(vval[0]) + " " + self.compile(vval[1]) + ")" for vval in node.items]
if viml_empty(items):
return "(dict)"
else:
return viml_printf("(dict %s)", viml_join(items, " "))
def compile_nesting(self, node):
return self.compile(node.expr)
def compile_option(self, node):
return node.value
def compile_identifier(self, node):
v = ""
for x in node.value:
if x.curly:
v += "{" + self.compile(x.value) + "}"
else:
v += x.value
return v
def compile_env(self, node):
return node.value
def compile_reg(self, node):
return node.value
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment