pmacs updates

--HG--
branch : pmacs2
This commit is contained in:
moculus 2009-01-28 21:28:33 +00:00
parent 85a067f5f3
commit 84c9dad374
8 changed files with 69 additions and 16 deletions

5
BUGS
View File

@ -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.

6
IDEAS
View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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)

View File

@ -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']

View File

@ -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