diff --git a/BUGS b/BUGS index 7f51484..0f091c2 100644 --- a/BUGS +++ b/BUGS @@ -1,5 +1,10 @@ === OUSTANDING BUGS === +2009/01/28: + completion-buffer needs to save window, instead of just saving + the buffer. otherwise you lose window-customization (e.g. margins, headers, + etc). + 2008/12/13: python mode needs to not indent "if foo: bar()" lines. diff --git a/IDEAS b/IDEAS index 215617a..a8fdb95 100644 --- a/IDEAS +++ b/IDEAS @@ -1,3 +1,9 @@ +2009/01/28: + +Move modes into buffers and out of windows. This should reduce the memory +footprint a little bit, as well as fixing some weird bugs and making some +interfaces more consistent. + 2008/09/21: Tab completion, paren matching, and scope detection should be done by one module diff --git a/application.py b/application.py index 9156b07..e8d67a8 100755 --- a/application.py +++ b/application.py @@ -327,6 +327,7 @@ class Application(object): blist.set_slot(i, blist.hidden_buffers[0]) else: blist.set_slot(i, active_slot.window.buffer) + assert blist.slots[i].window is not None def open_path(self, path, binary=False, cipher=None, password=None): path = os.path.abspath(os.path.realpath(util.expand_tilde(path))) @@ -708,7 +709,8 @@ class Application(object): p = w.logical_cursor() blen = len(w.buffer.lines) - count = 0 + #count = 0 + count = w.mode.header #XYZ (x, y) = w.first.xy() (vy, vx) = (None, None) while count < slot.height: @@ -752,7 +754,8 @@ class Application(object): for x in range(sx1, sx2): self.highlight_char(sy, x, fg, bg) - def map_point(self, p): + # NOTE: this is totally broken + def map_point(self, w, p): count = 0 x, y = w.first.xy() while count < slot.height: @@ -776,13 +779,21 @@ class Application(object): w = slot.window modename = w.mode.name() + # XYZ + rstrs = w.mode.get_header(w) + assert len(rstrs) >= w.mode.header + for i in range(0, w.mode.header): + rstrs[i].draw(self.win, slot.y_offset + i, slot.x_offset) + # XYZ + self._draw_slot(i) # highlighted regions for hr in self.highlighted_ranges: (high_w, p1, p2, fg, bg) = hr if w is high_w and p2 >= w.first and p1 <= w.last: - count = 0 + #count = 0 + count = w.mode.header #XYZ x, y = w.first.xy() px = p1.x while count < slot.height: @@ -817,7 +828,8 @@ class Application(object): x, y = w.first.xy() lm, rm = w.mode.lmargin, w.mode.rmargin lines = w.buffer.lines - count = 0 + #count = 0 + count = w.mode.header #XYZ k = x // (slot.width - lm - rm) modename = w.mode.name() lit = w.mode.name() in w.buffer.highlights diff --git a/method/__init__.py b/method/__init__.py index e764bda..d0196fc 100644 --- a/method/__init__.py +++ b/method/__init__.py @@ -1006,9 +1006,18 @@ class SetConfigVariable(Method): else: w.set_error("previously unset param %r set to %r" % (name, value)) +class ToggleHeader(Method): + def _execute(self, w, **vargs): + if w.mode.showing_header(): + w.mode.disable_header() + w.set_error('Header hidden') + else: + w.mode.enable_header() + w.set_error('Header visible') + class ToggleLineNumbers(Method): def _execute(self, w, **vargs): - if w.mode.show_line_numbers: + if w.mode.showing_line_numbers(): w.mode.disable_line_numbers() w.set_error('Line numbers hidden') else: diff --git a/mode/__init__.py b/mode/__init__.py index 93356e8..5fa97c3 100644 --- a/mode/__init__.py +++ b/mode/__init__.py @@ -100,8 +100,9 @@ class Fundamental(Handler): completers = {} format = "%(flag)s %(bname)-18s (%(mname)s) %(indent)s %(cursor)s/%(mark)s %(perc)s" - # margin/line numbering - show_line_numbers = False + # margins + header = 0 + footer = 0 lmargin = 0 rmargin = 1 @@ -257,14 +258,30 @@ class Fundamental(Handler): if self.tabbercls: self.tabber = self.tabbercls(self) + # header + def showing_header(self): + return self.header != 0 + def enable_header(self): + self.header = 1 + def disable_header(self): + self.header = 0 + + # line numbers + def showing_line_numbers(self): + return self.lmargin != 0 def enable_line_numbers(self): - self.show_line_numbers = True l = len(self.window.buffer.lines) self.lmargin = int(math.log(l, 10)) + 3 def disable_line_numbers(self): - self.show_line_numbers = False self.lmargin = 0 + # headers and margins + def get_header(self, w): + fg, bg = "default", "red" + return [RenderString(s='header', attrs=color.build(fg, bg))] + def get_footer(self, w): + fg, bg = "default", "red" + return [RenderString(s='footer', attrs=color.build(fg, bg))] def get_rmargin(self, w, y, x, ended=False, cont=False): c, fg, bg = " ", "red", "default" if cont: @@ -388,6 +405,8 @@ class Fundamental(Handler): self.tabber.region_added(p, newlines) if self.context is not None: self.context.region_added(p, newlines) + if self.lmargin != 0: + self.enable_line_numbers() def region_removed(self, p1, p2): if self.lexer is not None: @@ -417,5 +436,7 @@ class Fundamental(Handler): self.tabber.region_removed(p1, p2) if self.context is not None: self.context.region_removed(p1, p2) + if self.lmargin != 0: + self.enable_line_numbers() install = Fundamental.install diff --git a/mode/mbox.py b/mode/mbox.py index 35f2ee5..55fb9bf 100644 --- a/mode/mbox.py +++ b/mode/mbox.py @@ -5,6 +5,7 @@ from lex import Grammar, PatternRule, RegionRule, PatternGroupRule from point import Point from buffer import Buffer from method import Method, Argument, arg +import util class LineGrammar(Grammar): rules = [PatternRule(name=r'data', pattern=r'^.*\n$')] @@ -171,7 +172,9 @@ class MboxOpenPath(Method): args = [arg('mbox', dt="path", p="Open Mbox: ", dv=default.path_dirname, ld=True, h="mbox to open")] def _execute(self, w, **vargs): - b = MboxListBuffer(vargs['mbox']) + path = util.expand_tilde(vargs['mbox']) + path = os.path.abspath(os.path.realpath(path)) + b = MboxListBuffer(path) b.open() window.Window(b, w.application, height=0, width=0, mode_name='mbox') w.application.add_buffer(b) diff --git a/mode/xml.py b/mode/xml.py index cf9c8e4..71bfb9a 100644 --- a/mode/xml.py +++ b/mode/xml.py @@ -49,7 +49,7 @@ class XmlValidate(method.shell.Exec): self._doit(w, w.buffer.path, 'xmlwf %(path)r', cmdname='xml-validate') class XmlCreateTag(method.Method): - '''''' + '''Create an opening and closing tag''' args = [method.Argument('tagname', prompt="Tag Name: ", help="Create an open/close tag pair")] def _execute(self, w, **vargs): t = vargs['tagname'] diff --git a/window.py b/window.py index 4df861f..d97b00e 100644 --- a/window.py +++ b/window.py @@ -17,9 +17,6 @@ from render import RenderString # the shorter line will "set" the cursor to its position on the shorter line. class Window(object): - #margins = ((80, 'blue'),) - #margin_limit = 80 - #margin_color = 'blue' margins_visible = False def __init__(self, b, a, height=24, width=80, mode_name=None): self.buffer = b @@ -160,8 +157,8 @@ class Window(object): def set_size(self, width, height): assert type(width) == type(0), width assert type(height) == type(0), height - self.width = width - self.mode.lmargin - self.mode.rmargin - self.height = height + self.width = width - self.mode.lmargin - self.mode.rmargin - 10 + self.height = height - self.mode.header - self.mode.footer self.redraw() # region added