жалкое подобие 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"
			}
		]
	}