From 38f02bb20b9925cf5301917c42e392c22554dacc Mon Sep 17 00:00:00 2001 From: moculus Date: Fri, 12 Sep 2008 14:43:15 +0000 Subject: [PATCH] --HG-- branch : pmacs2 --- buffer.py | 59 +++++++++++++++++++++++++++-------------------- highlight.py | 2 +- mode/__init__.py | 1 + mode/shellmini.py | 32 +++++++++++++++++++++---- 4 files changed, 64 insertions(+), 30 deletions(-) diff --git a/buffer.py b/buffer.py index c84e35c..e0fa0b2 100644 --- a/buffer.py +++ b/buffer.py @@ -395,24 +395,6 @@ class ConsoleBuffer(Buffer): def readonly(self): return True -class ConsoleBuffer(Buffer): - btype = 'shell' - modename = 'shell' - def __init__(self): - Buffer.__init__(self) - self.clear() - def clear(self): - lines = ['Shell\n'] - self.set_data(''.join(lines), force=True) - def name(self): - return '*Shell*' - def changed(self): - return False - def close(self): - pass - def readonly(self): - return True - class InterpreterPipeError(Exception): pass @@ -846,10 +828,17 @@ class ColorHighlighter(highlight.Highlighter): t = lex.Token('color_data', None, y, x, s2, color) self.tokens[y].append(t) return len(s) - len(s2) + def delete_token(self, y, i): + pass + def relex(self, lines, y1, x1, y2, x2, token=None): + pass + def relex_del(self, lines, y1, x1, y2, x2): + pass def highlight(self, lines): if self.tokens: return - self.tokens = [None] * len(lines) + self.tokens = [[] for l in lines] + #self.tokens = [None] * len(lines) for y in range(0, len(lines)): self.tokens[y] = [] line = lines[y] @@ -874,18 +863,22 @@ class ColorDataBuffer(DataBuffer): btype = 'colordata' modename = 'colortext' color_re = re.compile(r'\[([a-z:]+)\]') - def __init__(self, name, data): + def _highlight(self, data): data2 = ColorHighlighter.color_re.sub('', data) data2 = data2.replace('\\[', '[') data2 = data2.replace('\\]', ']') data2 = data2.replace('\\\\', '\\') - DataBuffer.__init__(self, name, data2) + Buffer.set_data(self, data2, force=True) lines = data.split(self.nl) - self.highlights = { - 'Colortext': ColorHighlighter(), - } + self.highlights = {'Colortext': ColorHighlighter()} self.highlights['Colortext'].highlight(lines) - + self.modified = False + def __init__(self, name, data): + DataBuffer.__init__(self, name, '') + self._highlight(data) + def set_data(self, data, force=True): + self._highlight(data) + ABOUT_DATA = ''' [r:d:*]=============================================================================== @@ -909,3 +902,19 @@ ABOUT_DATA = ''' class AboutBuffer(ColorDataBuffer): def __init__(self): ColorDataBuffer.__init__(self, '*About*', ABOUT_DATA) + +class ShellBuffer(ColorDataBuffer): + btype = 'shell' + intro = '[red:default:bold]Welcome to Hell[default:default]\n' + def __init__(self): + ColorDataBuffer.__init__(self, '*XYZ*', self.intro) + def clear(self): + self.set_data(self.intro, force=True) + def name(self): + return '*Shell*' + def changed(self): + return False + def close(self): + pass + def readonly(self): + return True diff --git a/highlight.py b/highlight.py index 5c0b5a7..2e14748 100644 --- a/highlight.py +++ b/highlight.py @@ -84,7 +84,7 @@ class Highlighter(object): y += 1 def highlight(self, lines): - self.tokens = [[] for l in lines] + self.tokens = [[] for l in lines] for token in self.lexer.lex(lines, y=0, x=0): self.tokens[token.y].append(token) diff --git a/mode/__init__.py b/mode/__init__.py index 0c56993..4d761f0 100644 --- a/mode/__init__.py +++ b/mode/__init__.py @@ -324,6 +324,7 @@ class Fundamental(Handler): self.window.set_error(err) def region_added(self, p, newlines): + mname = self.name() if self.lexer is not None: ydelta = len(newlines) - 1 xdelta = len(newlines[-1]) diff --git a/mode/shellmini.py b/mode/shellmini.py index f15076e..dafeac5 100644 --- a/mode/shellmini.py +++ b/mode/shellmini.py @@ -1,5 +1,5 @@ import code, os, re, string, StringIO, sys, traceback -import color, completer, lex, method, mode +import buffer, color, completer, lex, method, mode, window from lex import Grammar, PatternRule from mode.sh import ShGrammar from point import Point @@ -11,6 +11,12 @@ PAD = '' LIMIT = 79 class ShellExec(Method): + sequences = { + '\x1b[01;32m': "[green:default]", + '\x1b[01;34m': "[blue:default]", + '\x1b[01;36m': "[cyan:default]", + '\x1b[0m': "[default:default]", + } def _execute(self, w, **vargs): a = w.application if a.completion_window_is_open(): @@ -40,8 +46,19 @@ class ShellExec(Method): output = p.stdout.read() output2 = [] i = 0 + escaped = [] for c in output: - if c == '\n': + if escaped: + escaped.append(c) + if c == 'm': + seq = ''.join(escaped) + if seq in self.sequences: + #output2.append(self.sequences[seq]) + output2.append('{foo:bar}') + escaped = [] + elif c == '\x1b': + escaped.append(c) + elif c == '\n': output2.append(c) i = 0 elif c == '\t': @@ -69,6 +86,11 @@ class ShellExec(Method): if output: newlines = [] for line in output.split('\n'): + line = line.replace('\x1b[01;32m', "[green:default]") + line = line.replace('\x1b[01;34m', "[blue:default]") + line = line.replace('\x1b[01;36m', "[cyan:default]") + line = line.replace('\x1b[0m', "[default:default]") + #line = repr(line) i = 0 while i + limit < len(line): j = limit @@ -81,9 +103,11 @@ class ShellExec(Method): newlines.append(PAD + line[i:i + j]) i += j + 1 newlines.append(PAD + line[i:]) - assert newlines[-1] == PAD + #assert newlines[-1] == PAD newlines[-1] = '' - b.insert_lines(b.get_buffer_end(), newlines, force=True) + #b.insert_lines(b.get_buffer_end(), newlines, force=True) + #b.set_lines(newlines, force=True) + b.set_data("\n".join(newlines)) for w2 in b.windows: w2.goto_end(force=True)