diff --git a/plugin/UltiSnips/Buffer.py b/plugin/UltiSnips/Buffer.py index fdd6e44..6cbbfc7 100644 --- a/plugin/UltiSnips/Buffer.py +++ b/plugin/UltiSnips/Buffer.py @@ -23,7 +23,7 @@ class TextBuffer(object): new_end = Position(start.line + len(text)-1, len(text[-1])) return new_end - def to_vim(self, start, end): # TODO: better take a span + def to_vim(self, start, end): buf = vim.current.buffer # Open any folds this might have created diff --git a/plugin/UltiSnips/Geometry.py b/plugin/UltiSnips/Geometry.py index 2c208f6..1e28f55 100644 --- a/plugin/UltiSnips/Geometry.py +++ b/plugin/UltiSnips/Geometry.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 -__all__ = [ "Position", "Span" ] +__all__ = [ "Position" ] class Position(object): def __init__(self, line, col): @@ -80,33 +80,6 @@ class Position(object): def __repr__(self): return "(%i,%i)" % (self._line, self._col) -class Span(object): - def __init__(self, start, end): - self._s = start - self._e = end - - def __contains__(self, pos): - return self._s <= pos <= self._e - - def start(): - def fget(self): - return self._s - def fset(self, value): - self._s = value - return locals() - start = property(**start()) - - def end(): - def fget(self): - return self._e - def fset(self, value): - self._e = value - return locals() - end = property(**end()) - - def __repr__(self): - return "(%s -> %s)" % (self._s, self._e) - import unittest class _MPBase(object): diff --git a/plugin/UltiSnips/TextObjects/_base.py b/plugin/UltiSnips/TextObjects/_base.py index 1278ef8..f5383d3 100755 --- a/plugin/UltiSnips/TextObjects/_base.py +++ b/plugin/UltiSnips/TextObjects/_base.py @@ -5,7 +5,7 @@ import vim from UltiSnips.Buffer import TextBuffer from UltiSnips.Compatibility import as_unicode -from UltiSnips.Geometry import Span, Position +from UltiSnips.Geometry import Position __all__ = ["TextObject", "EditableTextObject", "NoneditableTextObject"] @@ -66,22 +66,17 @@ class TextObject(object): ############## @property def current_text(self): - _span = self.span buf = vim.current.buffer - if _span.start.line == _span.end.line: - return as_unicode(buf[_span.start.line])[_span.start.col:_span.end.col] + if self._start.line == self._end.line: + return as_unicode(buf[self._start.line])[self._start.col:self._end.col] else: lines = [] - lines.append(as_unicode(buf[_span.start.line])[_span.start.col:]) - lines.extend(map(as_unicode, buf[_span.start.line+1:_span.end.line])) - lines.append(as_unicode(buf[_span.end.line])[:_span.end.col]) + lines.append(as_unicode(buf[self._start.line])[self._start.col:]) + lines.extend(map(as_unicode, buf[self._start.line+1:self._end.line])) + lines.append(as_unicode(buf[self._end.line])[:self._end.col]) return as_unicode('\n').join(lines) - def span(self): - return Span(self._start, self._end) - span = property(span) - def start(self): return self._start start = property(start) @@ -119,8 +114,6 @@ class EditableTextObject(TextObject): # Public Functions # #################### def find_parent_for_new_to(self, pos): - assert(pos in self.span) - for c in self._editable_childs: if (c._start <= pos < c._end): return c.find_parent_for_new_to(pos) diff --git a/plugin/UltiSnips/__init__.py b/plugin/UltiSnips/__init__.py index 5e4d6da..54d2dc9 100644 --- a/plugin/UltiSnips/__init__.py +++ b/plugin/UltiSnips/__init__.py @@ -3,6 +3,7 @@ # TODO: Currently Caches whole buffer. Is this really needed? # TODO: Currently searches whole buffer. Is this really needed? +# TODO: hijack two marks instead of running through the whole buffer import edit_distance from debug import debug, echo_to_hierarchy @@ -16,7 +17,7 @@ import traceback import vim -from UltiSnips.Geometry import Position, Span +from UltiSnips.Geometry import Position from UltiSnips.Compatibility import make_suitable_for_vim, set_vim_cursor, vim_cursor from UltiSnips.TextObjects import * from UltiSnips.Buffer import TextBuffer @@ -68,11 +69,11 @@ def echom(mes, *args): # TODO: all the vim wrapper functions should go into one module # TODO: this function should be moved -def select_span(r): +def select(start, end): _unmap_select_mode_mapping() - delta = r.end - r.start - lineno, col = r.start.line, r.start.col + delta = end - start + lineno, col = start.line, start.col set_vim_cursor(lineno + 1, col) @@ -114,14 +115,14 @@ def select_span(r): # one column less since Vim's visual selection is including the # ending while Python slicing is excluding the ending. inclusive = "inclusive" in vim.eval("&selection") - if r.end.col == 0: + if end.col == 0: # Selecting should end at beginning of line -> Select the # previous line till its end do_select = "k$" if not inclusive: do_select += "j0" - elif r.end.col > 1: - do_select = "0%il" % (r.end.col-1 if inclusive else r.end.col) + elif end.col > 1: + do_select = "0%il" % (end.col-1 if inclusive else end.col) else: do_select = "0" if inclusive else "0l" @@ -829,14 +830,11 @@ class SnippetManager(object): self._vstate.update() debug("vim.eval('mode()'): %r" % (vim.eval('mode()'))) debug("in cursor_moved self._vstate.pos: %r" % (self._vstate.pos)) - # TODO: hijack two marks instead of running through the whole buffer if vim.eval("mode()") not in 'in': return - # TODO: really necessary? if self._ignore_movements: - debug("Ignored") self._ignore_movements = False return @@ -884,7 +882,7 @@ class SnippetManager(object): debug("Before edits!") echo_to_hierarchy(self._csnippets[-1]) self._csnippets[0].update_textobjects() - self._lvb = TextBuffer('\n'.join(vim.current.buffer)) # TODO: no need to cache everything and not on every movement? + self._lvb = TextBuffer('\n'.join(vim.current.buffer)) self._vstate.update() def leaving_window(self): @@ -923,10 +921,7 @@ class SnippetManager(object): def _check_if_still_inside_snippet(self): # Did we leave the snippet with this movement? - if self._cs: - debug("self._cs.span: %r" % (self._cs.span)) - debug("self._vstate.pos: %r" % (self._vstate.pos)) - if self._cs and not (self._vstate.pos in self._cs.span): + if self._cs and not self._cs.start <= self._vstate.pos <= self._cs.end: self._current_snippet_is_done() self._reinit() @@ -945,7 +940,7 @@ class SnippetManager(object): if self._cs: self._ctab = self._cs.select_next_tab(backwards) if self._ctab: - select_span(self._ctab.span) + select(self._ctab.start, self._ctab.end) jumped = True if self._ctab.no == 0: self._current_snippet_is_done() @@ -1067,7 +1062,6 @@ class SnippetManager(object): start = Position(lineno-1, len(text_before)) end = Position(lineno-1, len(before)) - # TODO: private parts? maybe handle this in add_child si = snippet.launch(text_before, self._visual_content, self._cs.find_parent_for_new_to(start), start, end) self._visual_content.reset() @@ -1080,7 +1074,7 @@ class SnippetManager(object): self._visual_content.reset() self._ignore_movements = True - self._lvb = TextBuffer('\n'.join(vim.current.buffer)) # TODO: no need to cache everything + self._lvb = TextBuffer('\n'.join(vim.current.buffer)) self._jump()