more work on the refactor. most duplicated code is gone now.

This commit is contained in:
rygwdn@gmail.com 2010-08-08 08:23:24 -03:00
parent 4e0102b3fa
commit fb54432ff0

View File

@ -165,6 +165,9 @@ class Snippet(object):
# boundary). # boundary).
word = self._word_for_line(trigger) word = self._word_for_line(trigger)
if trigger and trigger[-1] in string.whitespace:
return False
if "b" in self._opts: if "b" in self._opts:
text_before = trigger.rstrip()[:-len(word)] text_before = trigger.rstrip()[:-len(word)]
if text_before.strip(" \t") != '': if text_before.strip(" \t") != '':
@ -189,6 +192,9 @@ class Snippet(object):
def could_match(self, trigger): def could_match(self, trigger):
word = self._word_for_line(trigger) word = self._word_for_line(trigger)
if trigger and trigger[-1] in string.whitespace:
return False
if "b" in self._opts: if "b" in self._opts:
text_before = trigger.rstrip()[:-len(word)] text_before = trigger.rstrip()[:-len(word)]
if text_before.strip(" \t") != '': if text_before.strip(" \t") != '':
@ -216,11 +222,6 @@ class Snippet(object):
return "!" in self._opts return "!" in self._opts
overwrites_previous = property(overwrites_previous) overwrites_previous = property(overwrites_previous)
# TODO: this in matches
def needs_ws_in_front(self):
return "b" in self._opts
needs_ws_in_front = property(needs_ws_in_front)
def description(self): def description(self):
return ("(%s) %s" % (self._t, self._d)).strip() return ("(%s) %s" % (self._t, self._d)).strip()
description = property(description) description = property(description)
@ -229,6 +230,11 @@ class Snippet(object):
return self._t return self._t
trigger = property(trigger) trigger = property(trigger)
def used_trigger(self):
#TODO here
return self._t
used_trigger = property(used_trigger)
def launch(self, text_before, parent, start, end = None): def launch(self, text_before, parent, start, end = None):
indent = self._INDENT.match(text_before).group(0) indent = self._INDENT.match(text_before).group(0)
v = self._v v = self._v
@ -388,74 +394,16 @@ class SnippetManager(object):
def list_snippets(self): def list_snippets(self):
before, after = self._get_before_after() before, after = self._get_before_after()
snippets = self._snips(before, True) snippets = self._snips(before, True)
lineno,col = vim.current.window.cursor if not snippets:
filetypes = self._ensure_snippets_loaded()
word = ''
if len(before):
word = before.split()[-1]
found_snippets = []
for ft in filetypes[::-1]:
found_snippets += self._find_snippets(ft, word, True)
if len(found_snippets) == 0:
return True return True
display = [ "%i %s" % (idx+1,s.description) snippet = self._ask_snippets(snippets)
for idx,s in enumerate(found_snippets) ] if not snippet:
# TODO: this code is also mirrored below
try:
rv = vim.eval("inputlist(%s)" % display)
if rv is None or rv == '0':
return True return True
rv = int(rv)
if rv > len(found_snippets):
rv = len(found_snippets)
snippet = found_snippets[rv-1]
except: # vim.error, e:
if str(e) == 'invalid expression':
return True
raise
# TODO: even more code duplicated below self._do_snippet(snippet, before, after)
# Adjust before, maybe the trigger is not the complete word
text_before = before.rstrip()[:-len(word)]
text_before += word[:-len(snippet.trigger)]
self._expect_move_wo_change = True
if self._cs:
# Determine position
pos = self._vstate.pos
p_start = self._ctab.abs_start
if pos.line == p_start.line:
end = Position(0, pos.col - p_start.col)
else:
end = Position(pos.line - p_start.line, pos.col)
start = Position(end.line, end.col - len(snippet.trigger))
si = snippet.launch(text_before, self._ctab, start, end)
self._update_vim_buffer()
if si.has_tabs:
self._csnippets.append(si)
self._jump()
else:
self._vb = VimBuffer(text_before, after)
start = Position(lineno-1, len(text_before))
self._csnippets.append(snippet.launch(text_before, None, start))
self._vb.replace_lines(lineno-1, lineno-1,
self._cs._current_text)
self._jump()
return True return True
@ -669,9 +617,6 @@ class SnippetManager(object):
lineno,col = vim.current.window.cursor lineno,col = vim.current.window.cursor
line = vim.current.line line = vim.current.line
#TODO: don't do this
if col > 0 and line[col-1] in string.whitespace:
return (None, None)
# Get the word to the left of the current edit position # Get the word to the left of the current edit position
before, after = line[:col], line[col:] before, after = line[:col], line[col:]