diff --git a/buffer/emul.py b/buffer/emul.py index 2c200f5..76bbeec 100644 --- a/buffer/emul.py +++ b/buffer/emul.py @@ -8,6 +8,8 @@ from point import Point class XTermBuffer(Buffer, XTerm): btype = 'term' modename = 'pipe' + termtype = 'xterm' + #termtype = 'vt100' def __init__(self, cmd, args, name=None): XTerm.__init__(self) Buffer.__init__(self) @@ -15,7 +17,7 @@ class XTermBuffer(Buffer, XTerm): self._pid, self._pty = pty.fork() if self._pid == 0: # child process - os.execve(cmd, [cmd] + args, {'TERM': 'xterm'}) + os.execve(cmd, [cmd] + args, {'TERM': self.termtype}) self._lock = threading.Lock() self._towrite = '' diff --git a/term.py b/term.py index def53cf..f360df1 100644 --- a/term.py +++ b/term.py @@ -1,8 +1,11 @@ import os, re, string from point import Point +# NOTE: i should write a python module to build a statemachine from a terminfo +# entry. otherwise this project is probably hopeless. + def show(c): - if c in string.printable: + if c in string.letters + string.digits + string.punctuation: return c else: return '\\%03o' % ord(c) @@ -79,7 +82,8 @@ class Dumb: return self.outs + ''.join(self.outc) class XTerm(Dumb): - name = 'xterm' + name = 'xterm' + termtype = 'xterm' comment_re = re.compile('^ *#') header_re = re.compile('^[a-zA-Z0-9]+\|') @@ -88,16 +92,27 @@ class XTerm(Dumb): num_re = re.compile('^([a-zA-Z0-9]+)#(.+)$') str_re = re.compile('^([a-zA-Z0-9]+)=(.+)$') - style_re = re.compile('^\033[[0-9;]+m') + style_re = re.compile('^\033[[0-9;]+m') + text_signal_re = re.compile('^\033][0-9]+;.+\007') + cup_re = re.compile('^\033\[[0-9]+;[0-9]+H') callbacks = { 'clear': 'term_do_clear', 'home': 'term_do_creturn', + 'rmm': 'term_nop', + 'smm': 'term_nop', + 'op': 'term_nop', #original color-pair + + 'smacs': 'term_nop', #orig charset + 'rmacs': 'term_nop', + 'smso': 'term_nop', #enter standout mode + 'rmso': 'term_nop', + 'cup': 'term_nop', } def __init__(self): self._meta = [] - f = os.popen('infocmp xterm', 'r') - #f = open('xterm.terminfo') + f = os.popen('infocmp %s' % self.termtype, 'r') + #f = open('%s.terminfo' % self.termtype) self.sequences = {} for line in f: if self.comment_re.match(line) or self.header_re.match(line): @@ -114,6 +129,8 @@ class XTerm(Dumb): self.sequences[val.replace('\\E', '\033')] = name f.close() + def term_nop(self, *args): + pass def term_filter(self, s): self._meta = [] return Dumb.term_filter(self, s) @@ -139,7 +156,11 @@ class XTerm(Dumb): self._meta = [] elif self.style_re.match(s): self._meta = [] - elif len(s) > 20: + elif self.text_signal_re.match(s): + self._meta = [] + elif self.cup_re.match(s): + self._meta = [] + elif s.endswith('\n'): self._term_insert(''.join([show(c) for c in self._meta])) self._meta = [] else: