Fixed various smaller bugs I encountered

This commit is contained in:
Holger Rapp 2012-01-27 22:48:36 +01:00
parent 0f37d62f8a
commit f2ce576fbd
5 changed files with 58 additions and 23 deletions

View File

@ -603,25 +603,24 @@ class SnippetManager(object):
debug("lt: %r" % (lt))
debug("ct: %r" % (ct))
debug("self._lpos: %r, pos: %r" % (self._lpos, pos))
# Cut down on lines searched for changes. Start from behind and
# remove all equal lines. Then do the same from the front.
while (lt[lt_span[1]-1] == ct[ct_span[1]-1] and
self._lpos.line < lt_span[1] and pos.line < ct_span[1] and
(lt_span[0] < lt_span[1]) and
(ct_span[0] < ct_span[1])):
ct_span[1] -= 1
lt_span[1] -= 1
debug("1 lt_span: %r, ct_span: %r" % (lt_span ,ct_span))
try:
while (lt[lt_span[0]] == ct[ct_span[0]] and
self._lpos.line <= lt_span[0] and pos.line <= ct_span[0] and
if lt and ct:
while (lt[lt_span[1]-1] == ct[ct_span[1]-1] and
self._lpos.line < initial_line + lt_span[1]-1 and pos.line < initial_line + ct_span[1]-1 and
(lt_span[0] < lt_span[1]) and
(ct_span[0] < ct_span[1])):
ct_span[1] -= 1
lt_span[1] -= 1
debug("1 lt_span: %r, ct_span: %r" % (lt_span ,ct_span))
while (lt_span[0] < lt_span[1] and
ct_span[0] < ct_span[1] and
lt[lt_span[0]] == ct[ct_span[0]] and
self._lpos.line >= initial_line and pos.line >= initial_line):
ct_span[0] += 1
lt_span[0] += 1
initial_line += 1
except IndexError:
pass
debug("2 lt_span: %r, ct_span: %r" % (lt_span ,ct_span))
ct_span[0] = max(0, ct_span[0] - 1)
lt_span[0] = max(0, lt_span[0] - 1)
@ -656,6 +655,7 @@ class SnippetManager(object):
snippets must be properly terminated
"""
while len(self._csnippets):
debug("*** Current snippet is done ***")
self._current_snippet_is_done()
self._reinit()

View File

@ -27,6 +27,12 @@ def guess_edit(initial_line, lt, ct, ppos, pos):
movements like insertion, deletion of a line or carriage return.
"""
if not len(lt) and not len(ct): return True, ()
if len(lt) and not ct:
es = []
for i in lt:
es.append(("D", pos.line, pos.col, lt))
es.append(("D", pos.line, pos.col, "\n"))
if is_complete_edit(initial_line, lt, ct, es): return True, es
if pos.line == ppos.line: # Movement only in one line
llen = len(lt[ppos.line - initial_line])
clen = len(ct[pos.line - initial_line])

View File

@ -39,6 +39,7 @@ class TextObject(object):
# We explicitly do not want to move our childs around here as we
# either have non or we are replacing text initially which means we do
# not want to mess with their positions
if self.current_text == gtext: return
old_end = self._end
self._end = _vim.text_to_vim(
self._start, self._end, gtext or self._initial_text)
@ -133,23 +134,32 @@ class EditableTextObject(TextObject):
if ctype == "I": # Insertion
if c._start < pos < Position(c._end.line, c._end.col) and isinstance(c, NoneditableTextObject):
to_kill.add(c)
new_cmds.add(cmd)
break
elif (c._start <= pos <= c._end) and isinstance(c, EditableTextObject):
c._do_edit(cmd)
return
else: # Deletion
delend = pos + Position(0, len(text)) if text != "\n"\
delend = pos + Position(0, len(text)) if text != "\n" \
else Position(line + 1, 0)
if (c._start <= pos < c._end) and (c._start < delend <= c._end):
debug("Case 1")
# this edit command is completely for the child
if isinstance(c, NoneditableTextObject):
to_kill.add(c)
continue
c._do_edit(cmd)
return
new_cmds.append(cmd)
break
else:
c._do_edit(cmd)
return
elif (pos < c._start and c._end <= delend) or (pos <= c._start and c._end < delend):
debug("Case 2")
# Case: this deletion removes the child
to_kill.add(c)
new_cmds.append(cmd)
break
elif (pos < c._start and (c._start < delend <= c._end)):
debug("Case 3")
# Case: partially for us, partially for the child
my_text = text[:(c._start-pos).col]
c_text = text[(c._start-pos).col:]
@ -157,6 +167,7 @@ class EditableTextObject(TextObject):
new_cmds.append((ctype, line, col, c_text))
break
elif (delend >= c._end and (c._start <= pos < c._end)):
debug("Case 4")
# Case: partially for us, partially for the child
c_text = text[(c._end-pos).col:]
my_text = text[:(c._end-pos).col]
@ -238,7 +249,7 @@ class EditableTextObject(TextObject):
break
i -= 1
c = [ c._get_prev_tab(no) for c in self._childs ]
c = [ c._get_prev_tab(no) for c in self._editable_childs ]
c = filter(lambda i: i, c)
possible_sol += c
@ -251,7 +262,7 @@ class EditableTextObject(TextObject):
def _get_tabstop(self, requester, no):
if no in self._tabstops:
return self._tabstops[no]
for c in self._childs:
for c in self._editable_childs:
if c is requester:
continue

View File

@ -48,17 +48,17 @@ class SnippetInstance(EditableTextObject):
def replay_user_edits(self, cmds):
"""Replay the edits the user has done to keep endings of our
Text objects in sync with reality"""
debug("---- BEFORE")
debug("---- BEGIN USER EDITS")
echo_to_hierarchy(self)
for cmd in cmds:
self._do_edit(cmd)
echo_to_hierarchy(self)
debug("---- AFTER")
def update_textobjects(self):
"""Update the text objects that should change automagically after
the users edits have been replayed. This might also move the Cursor
"""
debug("---- BEGIN UPDATE TEXTOBJECTS")
vc = _VimCursor(self)
done = set()
@ -77,10 +77,12 @@ class SnippetInstance(EditableTextObject):
done.add(obj)
counter -= 1
if counter == 0:
raise RuntimeError("Cyclic dependency in TextElements!")
raise RuntimeError("Cyclic dependency in Snippet definition!")
vc.to_vim()
self._del_child(vc)
debug("--- ALL DONE")
echo_to_hierarchy(self)
def select_next_tab(self, backwards = False):
if self._cts is None:

20
test.py
View File

@ -25,8 +25,6 @@
# and will compare the resulting output to expected results.
#
#
# TODO: more edits that cross boundaries between text objects
# TODO: delete hallo snippet -> hallo '' and then delete snippet
# TODO: remove formatoption tests
# TODO: python3 tests
import os
@ -1156,6 +1154,14 @@ class PythonCode_LongerTextThanSource_MultiLine(_VimTest):
keys = """test""" + EX + JF + "ups"
wanted = "hi" + 100*"a" + 100*"\n" + 100*"a" + "endups"
class PythonCode_AccessKilledTabstop_OverwriteSecond(_VimTest):
snippets = ("test", r"`!p snip.rv = t[2].upper()`${1:h${2:welt}o}`!p snip.rv = t[2].upper()`")
keys = "test" + EX + JF + "okay"
wanted = "OKAYhokayoOKAY"
class PythonCode_AccessKilledTabstop_OverwriteFirst(_VimTest):
snippets = ("test", r"`!p snip.rv = t[2].upper()`${1:h${2:welt}o}`!p snip.rv = t[2].upper()`")
keys = "test" + EX + "aaa"
wanted = "aaa"
# End: New Implementation #}}}
# End: PythonCode Interpolation #}}}
@ -2497,6 +2503,16 @@ class Undo_RemoveEditInTabstop(_VimTest):
snippets = ("test", "$1 Hello\naaa ${1} bbb\nWorld")
keys = "hello test" + EX + "upsi" + ESC + "hh" + "iabcdef" + ESC + "u"
wanted = "hello upsi Hello\naaa upsi bbb\nWorld"
class Undo_RemoveWholeSnippet(_VimTest):
snippets = ("test", "Hello\n${1:Hello}World")
keys = "first line\n\n\n\n\n\nthird line" + \
ESC + "3k0itest" + EX + ESC + "uiupsy"
wanted = "first line\n\n\nupsy\n\n\nthird line"
class JumpForward_DefSnippet(_VimTest):
snippets = ("test", "${1}\n`!p snip.rv = '\\n'.join(t[1].split())`\n\n${0:pass}")
keys = "test" + EX + "a b c" + JF + "shallnot" + JF + "end"
wanted = "a b c\na\nb\nc\n\nshallnotend"
# End: Undo of Snippet insertion #}}}
# Tab Completion of Words {{{#
class Completion_SimpleExample_ECR(_VimTest):