bugfix(es)

--HG--
branch : pmacs2
This commit is contained in:
moculus 2007-07-03 16:53:14 +00:00
parent f8c2173b5c
commit a691863149
4 changed files with 106 additions and 108 deletions

View File

@ -47,20 +47,17 @@ class Application(object):
def __init__(self, stdscr, buffers=[], jump_to_line=None, init_mode=None):
# initalize curses primitives
self.stdscr = stdscr
self.y, self.x = self.stdscr.getmaxyx()
(self.y, self.x) = self.stdscr.getmaxyx()
# initialize some basic stuff
self.margins_visible = False
#self.margins = [(80, 'blue'), (90, 'red')]
self.margins = [(80, 'blue'), ]
# each highlighted_range contains three things: [window, start_p, end_p]
self.highlighted_ranges = []
self.mini_active = False
self.mini_buffer = None
self.mini_prompt = ""
self.error_string = ""
self.error_timestamp = None
self.input = keyinput.Handler()
self.mini_active = False
self.mini_buffer = None
self.mini_prompt = ""
self.error_string = ""
self.error_timestamp = None
self.input = keyinput.Handler()
# initialize our colors
if curses.has_colors():
@ -489,7 +486,9 @@ class Application(object):
def highlight_char(self, sy, sx):
junk = self.win.inch(sy, sx)
c = junk & 255
attr = (junk & (curses.A_COLOR|curses.A_ATTRIBUTES)) | curses.A_REVERSE
# FIXME?
#attr = (junk & (curses.A_COLOR|curses.A_ATTRIBUTES)) | curses.A_REVERSE
attr = curses.A_REVERSE
self.win.addch(sy, sx, c, attr)
def highlight_chars(self, sy, sx1, sx2):
for x in range(sx1, sx2):
@ -511,14 +510,7 @@ class Application(object):
# highlighted regions
for (high_w, p1, p2) in self.highlighted_ranges:
if w is not high_w:
# this region isn't in the current window so skip it
pass
elif p2 < w.first or p1 > w.last:
# this region is not visible, so skip it
pass
else:
# ok, so now we need to do some highlighting
if w is high_w and p2 >= w.first and p1 <= w.last:
count = 0
(x, y) = w.first.xy()
px = p1.x
@ -537,9 +529,9 @@ class Application(object):
x += slot.width
count += 1
if self.margins_visible:
for (limit, shade) in self.margins:
if self.x > limit:
if w.margins_visible:
for (limit, shade) in w.margins:
if limit <= self.x:
for j in range(0, slot.height):
char = self.win.inch(j + slot.offset, limit) & 255
attr = color.build('default', shade, 'bold')

View File

@ -151,19 +151,14 @@ class Search(Method):
self.old_cursor = w.logical_cursor()
self.old_window = w
self.direction = 'next'
w.application.open_mini_buffer('I-Search: ', lambda x: None, self,
None, 'search')
w.application.open_mini_buffer('I-Search: ', lambda x: None, self, None, 'search')
class ReverseSearch(Method):
'''Interactive search; finds previous occurance of text in buffer'''
def execute(self, w, **vargs):
self.old_cursor = w.logical_cursor()
self.old_window = w
self.direction = 'previous'
w.application.open_mini_buffer('I-Search: ',
lambda x: None,
self,
None,
'search')
w.application.open_mini_buffer('I-Search: ', lambda x: None, self, None, 'search')
class Replace(Method):
'''Replace occurances of string X with string Y'''
def _args(self):
@ -450,6 +445,14 @@ class DeleteRightWhitespace(Method):
w.kill(c, p)
# random stuff
class DumpRegions(Method):
'''debug region highlighting'''
def _execute(self, w, **vargs):
lines = []
for (w, p1, p2) in w.application.highlighted_ranges:
lines.append("%r %s %s" % (w, p1, p2))
output = "\n".join(lines)
w.application.data_buffer("region-dump", output, switch_to=True)
class DumpMarkers(Method):
'''Dump all tab markers (tab debugging)'''
def _execute(self, w, **vargs):
@ -501,8 +504,7 @@ class MetaX(Method):
class ToggleMargins(Method):
'''Show or hide column margins'''
def _execute(self, w, **vargs):
a = w.application
a.margins_visible = not a.margins_visible
w.margins_visible = not w.margins_visible
class CenterView(Method):
'''Move view to center on cursor'''
def _execute(self, w, **vargs):

View File

@ -36,63 +36,65 @@ class Search(mode2.Fundamental):
return "Search"
class SearchNext(method.Method):
def execute(self, window, **vargs):
window.buffer.method.direction = 'next'
s = window.buffer.make_string()
def execute(self, w, **vargs):
w.buffer.method.direction = 'next'
s = w.buffer.make_string()
if not s:
s = window.application.last_search
window.buffer.set_data(s)
s = w.application.last_search
w.buffer.set_data(s)
else:
old_window = window.buffer.method.old_window
_find_next(old_window, window, move=True)
old_w = w.buffer.method.old_window
_find_next(old_w, w, move=True)
class SearchPrevious(method.Method):
def execute(self, window, **vargs):
window.buffer.method.direction = 'previous'
s = window.buffer.make_string()
def execute(self, w, **vargs):
w.buffer.method.direction = 'previous'
s = w.buffer.make_string()
if not s:
return
else:
old_window = window.buffer.method.old_window
_find_previous(old_window, window, move=True)
old_w = w.buffer.method.old_window
_find_previous(old_w, w, move=True)
class EndSearch(method.Method):
def execute(self, window, **vargs):
old_window = window.buffer.method.old_window
old_cursor = window.buffer.method.old_cursor
_end(window)
old_window.set_mark_point(old_cursor)
window.application.set_error("Mark set to search start")
def execute(self, w, **vargs):
old_w = w.buffer.method.old_window
old_cursor = w.buffer.method.old_cursor
_end(w)
old_w.set_mark_point(old_cursor)
w.set_error("Mark set to search start")
class CancelSearch(method.Method):
def execute(self, window, **vargs):
old_window = window.buffer.method.old_window
old_cursor = window.buffer.method.old_cursor
old_window.goto(old_cursor)
_end(window)
window.application.set_error("Search cancelled")
def execute(self, w, **vargs):
old_w = w.buffer.method.old_window
old_cursor = w.buffer.method.old_cursor
old_w.goto(old_cursor)
_end(w)
w.set_error("Search cancelled")
class DeleteLeft(method.Method):
def execute(self, window, **vargs):
window.left_delete()
old_cursor = window.buffer.method.old_cursor
old_window = window.buffer.method.old_window
old_window.goto(old_cursor)
if window.buffer.method.direction == 'next':
_find_next(old_window, window, move=False)
def execute(self, w, **vargs):
w.left_delete()
old_cursor = w.buffer.method.old_cursor
old_w = w.buffer.method.old_window
old_w.goto(old_cursor)
_end(w)
return
if w.buffer.method.direction == 'next':
_find_next(old_w, w, move=False)
else:
_find_previous(old_window, window, move=False)
_find_previous(old_w, w, move=False)
class DeleteLeftWord(method.Method):
def execute(self, window, **vargs):
window.kill_left_word()
old_cursor = window.buffer.method.old_cursor
old_window = window.buffer.method.old_window
old_window.goto(old_cursor)
if window.buffer.method.direction == 'next':
_find_next(old_window, window, move=False)
def execute(self, w, **vargs):
w.kill_left_word()
old_cursor = w.buffer.method.old_cursor
old_w = w.buffer.method.old_window
old_w.goto(old_cursor)
if w.buffer.method.direction == 'next':
_find_next(old_w, w, move=False)
else:
_find_previous(old_window, window, move=False)
_find_previous(old_w, w, move=False)
class InsertSearchString(method.Method):
def __init__(self, s):
@ -100,79 +102,79 @@ class InsertSearchString(method.Method):
self.string = s
self.args = []
self.help = None
def execute(self, window, **vargs):
window.insert_string_at_cursor(self.string)
s = window.buffer.make_string()
def execute(self, w, **vargs):
w.insert_string_at_cursor(self.string)
s = w.buffer.make_string()
if not s:
return
else:
old_window = window.buffer.method.old_window
if window.buffer.method.direction == 'next':
_find_next(old_window, window, move=False)
old_w = w.buffer.method.old_window
if w.buffer.method.direction == 'next':
_find_next(old_w, w, move=False)
else:
_find_previous(old_window, window, move=False)
_find_previous(old_w, w, move=False)
def _end(window):
s = window.buffer.make_string()
window.application.last_search = s
window.application.close_mini_buffer()
#window.application.highlighted_range = []
window.application.clear_highlighted_ranges()
window.buffer.method.old_cursor = None
window.buffer.method.old_window = None
def _end(w):
s = w.buffer.make_string()
w.application.last_search = s
w.application.close_mini_buffer()
#w.application.highlighted_range = []
w.application.clear_highlighted_ranges()
w.buffer.method.old_cursor = None
w.buffer.method.old_window = None
def _find_previous(old_window, new_window, move=False):
s = new_window.buffer.make_string()
old_buffer = old_window.buffer
c = old_window.logical_cursor()
def _find_previous(old_w, new_w, move=False):
s = new_w.buffer.make_string()
old_b = old_w.buffer
c = old_w.logical_cursor()
(x, y) = (c.x, c.y)
if move:
x -= 1
l = old_buffer.lines[y][:x + len(s)]
l = old_b.lines[y][:x + len(s)]
# for each line available
while y >= 0:
if s in l:
# success
x = l.index(s)
old_window.goto(Point(x, y))
old_window.application.clear_highlighted_ranges()
new_window.application.add_highlighted_range(old_window,
old_w.goto(Point(x, y))
old_w.application.clear_highlighted_ranges()
new_w.application.add_highlighted_range(old_w,
Point(x,y),
Point(x + len(s), y))
break
elif y >= len(old_buffer.lines) - 1:
elif y >= len(old_b.lines) - 1:
# failure
break
else:
# keep trying
y -= 1
l = old_buffer.lines[y]
l = old_b.lines[y]
x = 0
def _find_next(old_window, new_window, move=False):
s = new_window.buffer.make_string()
old_buffer = old_window.buffer
c = old_window.logical_cursor()
def _find_next(old_w, new_w, move=False):
s = new_w.buffer.make_string()
old_b = old_w.buffer
c = old_w.logical_cursor()
(x, y) = (c.x, c.y)
if move:
x += 1
l = old_buffer.lines[y][x:]
l = old_b.lines[y][x:]
# for each line available
while y < len(old_buffer.lines):
while y < len(old_b.lines):
if s in l:
# success
x = l.index(s) + x
old_window.goto(Point(x, y))
old_window.application.clear_highlighted_ranges()
new_window.application.add_highlighted_range(old_window,
old_w.goto(Point(x, y))
old_w.application.clear_highlighted_ranges()
new_w.application.add_highlighted_range(old_w,
Point(x,y),
Point(x + len(s), y))
break
elif y >= len(old_buffer.lines) - 1:
elif y >= len(old_b.lines) - 1:
# failure
break
else:
# keep trying
y += 1
l = old_buffer.lines[y]
l = old_b.lines[y]
x = 0

View File

@ -25,7 +25,9 @@ class Window(object):
self.height = height
self.width = width
self.input_line = ""
self.input_line = ""
self.margins = [(80, 'blue')]
self.margins_visible = False
if mode_name is not None:
pass