improve handling of indenting/whitespace in tab-using buffers

--HG--
branch : pmacs2
This commit is contained in:
Erik Osheim 2010-07-27 15:26:42 -04:00
parent 3bcf14bbb0
commit 6fd32c02df
2 changed files with 24 additions and 9 deletions

View File

@ -950,7 +950,8 @@ class Application(object):
for j in xrange(0, w.mode.header): for j in xrange(0, w.mode.header):
k = 0 k = 0
for rstr in rstrs[j]: for rstr in rstrs[j]:
rstr.draw(self.win, slot.y_offset + j, slot.x_offset + k, slot.width) #rstr.draw(self.win, slot.y_offset + j, slot.x_offset + k, slot.width)
rstr.draw(self.win, slot.y_offset + j, slot.x_offset + k)
#k += len(rstr.string) #k += len(rstr.string)
k += rstr.width(w) k += rstr.width(w)

View File

@ -282,7 +282,7 @@ class DeleteLeftWhitespace(Method):
l = w.point_left(p) l = w.point_left(p)
if l is None: if l is None:
return return
while l is not None and w.point_char(l) in (' ', '\n'): while l is not None and w.point_char(l) in (' ', '\t', '\n'):
p = l p = l
l = w.point_left(p) l = w.point_left(p)
if p < c: if p < c:
@ -292,7 +292,7 @@ class DeleteRightWhitespace(Method):
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
c = w.logical_cursor() c = w.logical_cursor()
p = c p = c
while w.point_char(p) in (' ', '\n'): while w.point_char(p) in (' ', '\t', '\n'):
r = w.point_right(p) r = w.point_right(p)
if r is None: if r is None:
break break
@ -307,7 +307,7 @@ class DeleteLeftSpace(Method):
l = w.point_left(p) l = w.point_left(p)
if l is None: if l is None:
return return
while l is not None and w.point_char(l) == ' ': while l is not None and w.point_char(l) in (' ', '\t'):
p = l p = l
l = w.point_left(p) l = w.point_left(p)
if p < c: if p < c:
@ -317,7 +317,7 @@ class DeleteRightSpace(Method):
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
c = w.logical_cursor() c = w.logical_cursor()
p = c p = c
while w.point_char(p) == ' ': while w.point_char(p) in (' ', '\t'):
r = w.point_right(p) r = w.point_right(p)
if r is None: if r is None:
break break
@ -490,7 +490,6 @@ class InsertTab(Method):
# if no lvl, insert a literal tab # if no lvl, insert a literal tab
if lvl is None: if lvl is None:
#w.insert_string_at_cursor(' ' * w.mode.tabwidth)
if w.buffer.usetabs: if w.buffer.usetabs:
# see HACK in buffer # see HACK in buffer
w.insert_string_at_cursor('\t \t') w.insert_string_at_cursor('\t \t')
@ -839,7 +838,14 @@ class Redo(Method):
class UnindentBlock(Method): class UnindentBlock(Method):
'''Prepend a tab of space to each line in region''' '''Prepend a tab of space to each line in region'''
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
if w.buffer.usetabs:
# see HACK in buffer
lvl = 4
tstr = '\t \t'
else:
lvl = w.mode.tabwidth lvl = w.mode.tabwidth
tstr = ' ' * lvl
cursor = w.logical_cursor() cursor = w.logical_cursor()
if cursor < w.mark: if cursor < w.mark:
p1 = cursor p1 = cursor
@ -850,9 +856,11 @@ class UnindentBlock(Method):
else: else:
w.input_line = "Empty kill region" w.input_line = "Empty kill region"
return return
lines = w.buffer.lines[p1.y:p2.y] lines = w.buffer.lines[p1.y:p2.y]
for i in xrange(0, len(lines)): for i in xrange(0, len(lines)):
if lines[i].startswith(' '): if lines[i].startswith(tstr):
lines[i] = lines[i][lvl:] lines[i] = lines[i][lvl:]
w.buffer.delete(Point(0, p1.y), Point(0, p2.y)) w.buffer.delete(Point(0, p1.y), Point(0, p2.y))
w.buffer.insert_string(Point(0, p1.y), '\n'.join(lines) + '\n') w.buffer.insert_string(Point(0, p1.y), '\n'.join(lines) + '\n')
@ -870,7 +878,13 @@ class IndentBlock(Method):
w.input_line = "Empty kill region" w.input_line = "Empty kill region"
return return
lines = w.buffer.lines[p1.y:p2.y] lines = w.buffer.lines[p1.y:p2.y]
if w.buffer.usetabs:
# see HACK in buffer
tstr = '\t \t'
else:
tstr = ' ' * w.mode.tabwidth tstr = ' ' * w.mode.tabwidth
for i in xrange(0, len(lines)): for i in xrange(0, len(lines)):
lines[i] = tstr + lines[i] lines[i] = tstr + lines[i]
w.buffer.delete(Point(0, p1.y), Point(0, p2.y)) w.buffer.delete(Point(0, p1.y), Point(0, p2.y))