жалкое подобие XAS'ного автоформата, парсер тупейший, автоформатируем по enter'у
пишем с начала строки, без таба и пробела. если первый кусок строки похож на название регистра, то считаем что это LD. если кусок похож на флаг и второго аргумента нет, то это ret. если второй аргумент есть - call
мнемоники, регистры и флаги переводим в верхний регистр.
стоит на это тратить время?
Код:
import re
from operator import methodcaller
unify = methodcaller('upper')
mnemonics = set('adc|add|and|bit|call|ccf|cp|cpl|cpd|cpdr|cpi|cpir|daa|dec|di|djnz|ei|ex|exx|halt|im|in|inc|ind|indr|inf|ini|inir|jp|jr|ld|ldd|lddr|ldi|ldir|neg|nop|exx|or|otdr|otir|out|outd|outi|pop|push|res|ret|reti|retn|rl|rla|rlc|rlca|rld|rr|rra|rrc|rrca|rrd|rst|sbc|scf|set|sla|sli|sll|sra|srl|sub|xor'.split('|'))
registers = set("a|b|c|d|e|h|l|i|r|xl|lx|xh|hx|ixl|ixh|yl|ly|yh|hy|iyl|iyh|af|bc|de|hl|sp|ix|iy|af'|(hl)|(de)|(bc)|(ix)|(iy)".split('|'))
flags = set('z|nz|c|nc|po|pe|p|m'.split('|'))
def format_args(args, extra):
r = []
if args:
r.append(' ')
if len(args) > 1:
r.append(','.join(args))
else:
r.append(args[0])
if extra:
r.append('\t')
r.append(extra)
return r
def parse_args(line, parts, split_base):
args = []
extra = None
for i, p in enumerate(parts[split_base:]):
if i > 1:
parts = re.split('\s+|,\s*', line, maxsplit=split_base + 2)
extra = parts[-1]
break
if p.startswith(';'):
parts = re.split('\s+|,\s*', line, maxsplit=split_base + i)
extra = parts[-1]
break
else:
if p.lower() in registers or p.lower() in flags:
args.append(unify(p))
else:
args.append(p)
return args, extra
class xasify(sublime_plugin.TextCommand):
def run(self, edit):
line = self.view.line(self.view.sel()[0])
l = self.view.substr(line)
if l.startswith((' ', '\t', ';')):
return
parts = re.split('\s+|,\s*', l)
tokens = []
if parts[0].lower() in mnemonics:
tokens.append('\t')
tokens.append(unify(parts[0]))
args, extra = parse_args(l, parts, 1)
elif len(parts) > 1 and parts[1].lower() in mnemonics:
tokens.append(parts[0])
tokens.append('\t')
tokens.append(unify(parts[1]))
args, extra = parse_args(l, parts, 2)
elif parts[0] in registers:
tokens.append('\t' + unify('LD'))
args, extra = parse_args(l, parts, 0)
elif parts[0] in flags:
args, extra = parse_args(l, parts, 0)
if len(args) == 1:
tokens.append('\t' + unify('RET'))
else:
tokens.append('\t' + unify('CALL'))
tokens.extend(format_args(args, extra))
new_line = ''.join(tokens)
self.view.replace(edit, line, new_line + '\n')
Код:
{
"keys": ["enter"], "command": "xasify",
"context": [
{
"operand": "source.z80asm",
"operator": "equal",
"key": "selector"
}
]
}