diff --git a/application.py b/application.py index 4cbd46f..53f231b 100755 --- a/application.py +++ b/application.py @@ -819,40 +819,7 @@ class Application(object): slot = self.bufferlist.slots[slotname] if slot.window is None: return - - w = slot.window - b = w.buffer - cursor = w.logical_cursor() - first = w.first - last = w.last - - if b.readonly(): - if b.changed(): - modflag = '%*' - else: - modflag = '%%' - else: - if b.changed(): - modflag = '**' - else: - modflag = '--' - - if w.mark: - mark = w.mark - else: - mark = Point(-1, -1) - name = b.name() - - if w.first_is_visible(): - perc = "Top" - elif w.last_is_visible(): - perc = "Bot" - else: - perc = "%2d%%" % (first.y*100 / len(b.lines)) - - # XYZ: we should actually use more of the 'state' variables - format = "%s %-18s (%s)--L%d--C%d--%s" - status = format % (modflag, name, w.mode.name(), cursor.y+1, cursor.x+1, perc) + status = slot.window.mode.get_status_bar() status = status.ljust(slot.width)[:slot.width] self.win.addstr(slot.height + slot.y_offset, 0, status, curses.A_REVERSE) diff --git a/mode/__init__.py b/mode/__init__.py index d0d1703..7aca4f4 100644 --- a/mode/__init__.py +++ b/mode/__init__.py @@ -90,6 +90,7 @@ class Fundamental(Handler): config = {} actions = [] completers = {} + format = "%(flag)s %(bname)-18s (%(mname)s) %(cursor)s/%(mark)s %(perc)s" # margin/line numbering show_line_numbers = False @@ -254,6 +255,47 @@ class Fundamental(Handler): def name(self): return self.modename + def _get_flag(self): + b = self.window.buffer + if b.readonly(): + if b.changed(): + return '%*' + else: + return '%%' + else: + if b.changed(): + return '**' + else: + return '--' + def _get_perc(self): + w = self.window + if w.first_is_visible(): + return "Top" + elif w.last_is_visible(): + return "Bot" + else: + return "%2d%%" % (w.first.y*100 / len(w.buffer.lines)) + def _get_mark(self): + w = self.window + if w.mark: + return '(%d,%d)' % (w.mark.y + 1, w.mark.x + 1) + else: + return '(None)' + def get_status_names(self): + w = self.window + c = w.logical_cursor() + return { + 'bname': w.buffer.name(), + 'mname': self.name(), + 'flag': self._get_flag(), + 'perc': self._get_perc(), + 'cursor': '(%d,%d)' % (c.y + 1, c.x + 1), + 'mark': self._get_mark(), + } + def get_status_bar(self): + names = self.get_status_names() + return self.format % names + # handle input tokens def handle_token(self, t): '''self.handle_token(token): handles input "token"''' diff --git a/mode/perl.py b/mode/perl.py index f43264c..0868fc7 100644 --- a/mode/perl.py +++ b/mode/perl.py @@ -688,6 +688,20 @@ class Perl(mode.Fundamental): completers = { 'perlfunction': PerlFunctionCompleter(), } + format = "%(flag)s %(bname)-18s (%(mname)s) %(cursor)s/%(mark)s %(perc)s [%(func)s]" + def get_status_names(self): + w = self.window + c = w.logical_cursor() + names = { + 'bname': w.buffer.name(), + 'mname': self.name(), + 'flag': self._get_flag(), + 'perc': self._get_perc(), + 'cursor': '(%d,%d)' % (c.y + 1, c.x + 1), + 'mark': self._get_mark(), + 'func': self.get_line_function(c.y), + } + return names def __init__(self, w): mode.Fundamental.__init__(self, w) self.add_bindings('perl-set-lib', ('C-c l',))