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


Ответить с цитированием
но у меня руки не скоро дойдут... так что если есть желание - я только рад.