2009-06-23 08:45:04 -04:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# encoding: utf-8
|
|
|
|
|
|
|
|
import vim
|
|
|
|
import string
|
2009-06-28 08:51:27 -04:00
|
|
|
import re
|
|
|
|
|
2009-07-01 11:11:33 -04:00
|
|
|
def debug(s):
|
|
|
|
f = open("/tmp/file.txt","a")
|
|
|
|
f.write(s+'\n')
|
|
|
|
f.close()
|
|
|
|
|
2009-07-02 05:48:35 -04:00
|
|
|
def _line_count_and_len_of_last_line(txt):
|
|
|
|
lines = txt.splitlines()
|
|
|
|
if not len(lines):
|
|
|
|
return 1, 0 # empty line has zero columns but one line
|
|
|
|
return len(lines), len(lines[-1])
|
|
|
|
|
2009-07-02 02:25:58 -04:00
|
|
|
class Position(object):
|
|
|
|
def __init__(self, line, col):
|
|
|
|
self.line = line
|
|
|
|
self.col = col
|
|
|
|
|
|
|
|
def col():
|
|
|
|
def fget(self):
|
|
|
|
return self._col
|
|
|
|
def fset(self, value):
|
|
|
|
if value < 0:
|
|
|
|
raise RuntimeError, "Invalid Column: %i" % col
|
|
|
|
self._col = value
|
|
|
|
return locals()
|
|
|
|
col = property(**col())
|
|
|
|
|
|
|
|
def line():
|
|
|
|
doc = "Zero base line numbers"
|
|
|
|
def fget(self):
|
|
|
|
return self._line
|
|
|
|
def fset(self, value):
|
|
|
|
if value < 0:
|
|
|
|
raise RuntimeError, "Invalid Line: %i" % line
|
|
|
|
self._line = value
|
|
|
|
return locals()
|
|
|
|
line = property(**line())
|
|
|
|
|
2009-07-01 09:29:14 -04:00
|
|
|
class TextObject(object):
|
2009-07-01 14:03:29 -04:00
|
|
|
"""
|
|
|
|
This base class represents any object in the text
|
|
|
|
that has a span in any ways
|
|
|
|
"""
|
2009-07-01 09:29:14 -04:00
|
|
|
def __init__(self, start, end):
|
2009-07-02 03:49:42 -04:00
|
|
|
self._parent = None
|
2009-07-01 09:29:14 -04:00
|
|
|
self._start = start
|
|
|
|
self._end = end
|
|
|
|
|
2009-07-02 03:49:42 -04:00
|
|
|
def parent():
|
|
|
|
doc = "The parent TextObject this TextObject resides in"
|
|
|
|
def fget(self):
|
|
|
|
return self._parent
|
|
|
|
def fset(self, value):
|
|
|
|
self._parent = value
|
|
|
|
return locals()
|
|
|
|
parent = property(**parent())
|
|
|
|
|
2009-07-01 09:29:14 -04:00
|
|
|
@property
|
|
|
|
def start(self):
|
|
|
|
return self._start
|
|
|
|
|
|
|
|
@property
|
|
|
|
def end(self):
|
|
|
|
return self._end
|
|
|
|
|
2009-07-01 11:11:33 -04:00
|
|
|
|
|
|
|
class Mirror(TextObject):
|
2009-07-01 14:03:29 -04:00
|
|
|
"""
|
|
|
|
A Mirror object mirrors a TabStop that is, text is repeated here
|
|
|
|
"""
|
2009-07-02 02:25:58 -04:00
|
|
|
def __init__(self, ts, idx, start_col):
|
|
|
|
start = Position(idx,start_col)
|
|
|
|
end = Position(idx,start_col)
|
|
|
|
TextObject.__init__(self, start, end)
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
self._tabstop = ts
|
2009-07-01 09:20:40 -04:00
|
|
|
|
|
|
|
@property
|
2009-07-01 14:03:29 -04:00
|
|
|
def tabstop(self):
|
|
|
|
return self._tabstop
|
2009-07-01 09:20:40 -04:00
|
|
|
|
2009-07-01 14:14:54 -04:00
|
|
|
def update(self,ts):
|
|
|
|
if ts != self._tabstop:
|
|
|
|
return 0
|
|
|
|
|
2009-07-02 05:48:35 -04:00
|
|
|
text = self._tabstop.current_text.splitlines()
|
|
|
|
|
|
|
|
first_line_idx = self._parent.start.line + self.start.line
|
|
|
|
first_line = vim.current.buffer[first_line_idx][:self.start.col]
|
|
|
|
|
|
|
|
last_line_idx = self._parent.start.line + self.end.line
|
|
|
|
last_line = vim.current.buffer[last_line_idx][self.end.col:]
|
|
|
|
# last_line = text[-1] + last_line
|
|
|
|
|
|
|
|
debug("Trying to write:")
|
|
|
|
|
|
|
|
if not len(text):
|
|
|
|
arr = [ first_line + last_line ]
|
|
|
|
elif len(text) == 1:
|
|
|
|
arr = [ first_line + text[0] + last_line ]
|
|
|
|
else:
|
|
|
|
arr = [ first_line ] + text + [ last_line ]
|
|
|
|
|
|
|
|
debug("%s" % (arr,))
|
|
|
|
vim.current.buffer[first_line_idx:last_line_idx+1] = arr
|
2009-07-01 14:14:54 -04:00
|
|
|
|
2009-07-02 05:48:35 -04:00
|
|
|
oldcolspan = self.end.col-self.start.col
|
|
|
|
lcol = len(text[-1]) if len(text) else 0
|
|
|
|
self._end.col = self.start.col + lcol
|
|
|
|
newcolspan = self.end.col-self.start.col
|
2009-07-01 14:14:54 -04:00
|
|
|
|
2009-07-02 05:48:35 -04:00
|
|
|
oldlinespan = self.end.line - self.start.line
|
|
|
|
ll = len(text)-1 if len(text) else 0
|
|
|
|
self._end.line = self.start.line + ll
|
|
|
|
newlinespan = self.end.line - self.start.line
|
2009-07-01 14:14:54 -04:00
|
|
|
|
|
|
|
|
2009-07-02 05:48:35 -04:00
|
|
|
return newlinespan-oldlinespan, newcolspan-oldcolspan
|
2009-07-01 14:14:54 -04:00
|
|
|
|
|
|
|
|
2009-07-01 11:11:33 -04:00
|
|
|
class TabStop(TextObject):
|
2009-07-01 14:03:29 -04:00
|
|
|
"""
|
|
|
|
This is the most important TextObject. A TabStop is were the cursor
|
|
|
|
comes to rest when the user taps through the Snippet.
|
|
|
|
"""
|
2009-07-01 14:14:54 -04:00
|
|
|
def __init__(self, idx, span, default_text = ""):
|
2009-07-02 02:25:58 -04:00
|
|
|
start = Position(idx,span[0])
|
|
|
|
end = Position(idx,span[1])
|
|
|
|
TextObject.__init__(self, start, end)
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
self._ct = default_text
|
|
|
|
|
|
|
|
def current_text():
|
|
|
|
def fget(self):
|
|
|
|
return self._ct
|
|
|
|
def fset(self, value):
|
|
|
|
self._ct = value
|
|
|
|
return locals()
|
|
|
|
current_text = property(**current_text())
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-02 03:49:42 -04:00
|
|
|
def select(self):
|
|
|
|
lineno, col = self._parent.start.line, self._parent.start.col
|
2009-07-01 14:27:28 -04:00
|
|
|
|
2009-07-02 02:25:58 -04:00
|
|
|
newline = lineno + self._start.line
|
|
|
|
newcol = self._start.col
|
2009-07-01 17:09:20 -04:00
|
|
|
|
2009-07-01 14:27:28 -04:00
|
|
|
if newline == lineno:
|
2009-07-01 17:09:20 -04:00
|
|
|
newcol += col
|
2009-07-01 14:27:28 -04:00
|
|
|
|
2009-07-02 02:25:58 -04:00
|
|
|
vim.current.window.cursor = newline + 1, newcol
|
2009-07-01 14:27:28 -04:00
|
|
|
|
|
|
|
# Select the word
|
|
|
|
# Depending on the current mode and position, we
|
|
|
|
# might need to move escape out of the mode and this
|
|
|
|
# will move our cursor one left
|
2009-07-01 17:09:20 -04:00
|
|
|
if len(self._ct) > 0:
|
2009-07-01 14:27:28 -04:00
|
|
|
if newcol != 0 and vim.eval("mode()") == 'i':
|
|
|
|
move_one_right = "l"
|
|
|
|
else:
|
|
|
|
move_one_right = ""
|
|
|
|
|
|
|
|
vim.command(r'call feedkeys("\<Esc>%sv%il\<c-g>")'
|
2009-07-01 17:09:20 -04:00
|
|
|
% (move_one_right, len(self._ct)-1))
|
2009-07-01 14:27:28 -04:00
|
|
|
|
|
|
|
|
2009-07-01 11:11:33 -04:00
|
|
|
class SnippetInstance(TextObject):
|
2009-07-01 14:03:29 -04:00
|
|
|
"""
|
|
|
|
A Snippet instance is an instance of a Snippet Definition. That is,
|
|
|
|
when the user expands a snippet, a SnippetInstance is created to
|
|
|
|
keep track of the corresponding TextObjects. The Snippet itself is
|
|
|
|
also a TextObject because it has a start an end
|
|
|
|
"""
|
|
|
|
|
2009-07-02 02:25:58 -04:00
|
|
|
def __init__(self, start, end, ts, mirrors):
|
2009-07-01 11:11:33 -04:00
|
|
|
TextObject.__init__(self, start, end)
|
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
self._tabstops = ts
|
2009-07-01 09:20:40 -04:00
|
|
|
self._mirrors = mirrors
|
2009-07-01 11:11:33 -04:00
|
|
|
self._text_objects = ts.values() + mirrors
|
|
|
|
self._selected_tab = None
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
self._cts = None
|
2009-06-28 16:22:19 -04:00
|
|
|
|
2009-07-02 03:49:42 -04:00
|
|
|
for to in self._text_objects:
|
|
|
|
to.parent = self
|
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
for ts in self._tabstops.values():
|
|
|
|
self._update_mirrors(ts)
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-02 03:49:42 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
def select_next_tab(self, backwards = False):
|
|
|
|
if self._cts == 0:
|
|
|
|
if not backwards:
|
|
|
|
return False
|
|
|
|
|
|
|
|
if backwards:
|
|
|
|
cts_bf = self._cts
|
|
|
|
|
|
|
|
if self._cts == 0:
|
|
|
|
self._cts = max(self._tabstops.keys())
|
2009-06-28 16:22:19 -04:00
|
|
|
else:
|
2009-07-01 14:03:29 -04:00
|
|
|
self._cts -= 1
|
|
|
|
if self._cts <= 0:
|
|
|
|
self._cts = cts_bf
|
|
|
|
else:
|
|
|
|
# All tabs handled?
|
|
|
|
if self._cts is None:
|
2009-06-28 16:22:19 -04:00
|
|
|
self._cts = 1
|
2009-07-01 14:03:29 -04:00
|
|
|
else:
|
|
|
|
self._cts += 1
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
if self._cts not in self._tabstops:
|
|
|
|
self._cts = 0
|
|
|
|
if 0 not in self._tabstops:
|
|
|
|
return False
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
ts = self._tabstops[self._cts]
|
2009-06-28 16:22:19 -04:00
|
|
|
|
2009-07-02 03:49:42 -04:00
|
|
|
ts.select()
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-01 14:27:28 -04:00
|
|
|
self._selected_tab = ts
|
2009-07-01 14:03:29 -04:00
|
|
|
return True
|
|
|
|
|
2009-06-28 16:22:19 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
def _update_mirrors(self,for_ts):
|
|
|
|
for m in self._mirrors:
|
2009-07-02 05:48:35 -04:00
|
|
|
moved_lines, moved_cols = m.update(for_ts)
|
|
|
|
self._move_textobjects_behind(moved_lines, moved_cols, m)
|
2009-07-01 14:03:29 -04:00
|
|
|
|
|
|
|
|
2009-07-02 05:48:35 -04:00
|
|
|
def _move_textobjects_behind(self, lines, cols, obj):
|
|
|
|
if lines == 0 and cols == 0:
|
2009-07-01 14:03:29 -04:00
|
|
|
return
|
|
|
|
|
2009-07-01 11:11:33 -04:00
|
|
|
for m in self._text_objects:
|
2009-07-02 03:49:42 -04:00
|
|
|
if m.start.line != obj.start.line:
|
2009-07-01 09:20:40 -04:00
|
|
|
continue
|
2009-07-02 03:49:42 -04:00
|
|
|
if m.start.col >= obj.start.col and m != obj:
|
2009-07-02 05:48:35 -04:00
|
|
|
m.start.col += cols
|
|
|
|
m.end.col += cols
|
2009-07-01 09:20:40 -04:00
|
|
|
|
|
|
|
def backspace(self,count):
|
2009-07-01 14:03:29 -04:00
|
|
|
cts = self._tabstops[self._cts]
|
2009-07-01 11:11:33 -04:00
|
|
|
ll = len(cts.current_text)
|
2009-07-01 09:20:40 -04:00
|
|
|
|
2009-07-01 11:11:33 -04:00
|
|
|
cts.current_text = cts.current_text[:-count]
|
2009-07-02 05:48:35 -04:00
|
|
|
self._move_textobjects_behind(0, len(cts.current_text)-ll, cts)
|
2009-07-01 09:20:40 -04:00
|
|
|
|
|
|
|
self._update_mirrors(cts)
|
|
|
|
|
|
|
|
def chars_entered(self, chars):
|
2009-07-01 14:03:29 -04:00
|
|
|
cts = self._tabstops[self._cts]
|
2009-07-01 11:11:33 -04:00
|
|
|
|
|
|
|
if self._selected_tab is not None:
|
2009-07-02 05:48:35 -04:00
|
|
|
self._move_textobjects_behind(0, len(chars)-len(cts.current_text), cts)
|
2009-07-01 14:03:29 -04:00
|
|
|
cts.current_text = ""
|
2009-07-01 11:11:33 -04:00
|
|
|
self._selected_tab = None
|
2009-07-01 14:03:29 -04:00
|
|
|
else:
|
2009-07-02 05:48:35 -04:00
|
|
|
self._move_textobjects_behind(0, len(chars), cts)
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
cts.current_text += chars
|
|
|
|
|
|
|
|
self._update_mirrors(cts)
|
|
|
|
|
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
class Snippet(object):
|
2009-07-01 09:20:40 -04:00
|
|
|
_TABSTOP = re.compile(r'''(?xms)
|
|
|
|
(?:\${(\d+):(.*?)})| # A simple tabstop with default value
|
|
|
|
(?:\$(\d+)) # A mirror or a tabstop without default value.
|
|
|
|
''')
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
def __init__(self,trigger,value):
|
|
|
|
self._t = trigger
|
|
|
|
self._v = value
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 14:14:54 -04:00
|
|
|
@property
|
2009-06-23 08:45:04 -04:00
|
|
|
def trigger(self):
|
|
|
|
return self._t
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
def _handle_tabstop(self, m, val, tabstops, mirrors):
|
|
|
|
no = int(m.group(1))
|
|
|
|
def_text = m.group(2)
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
start, end = m.span()
|
|
|
|
val = val[:start] + def_text + val[end:]
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
line_idx = val[:start].count('\n')
|
|
|
|
line_start = val[:start].rfind('\n') + 1
|
|
|
|
start_in_line = start - line_start
|
2009-07-02 03:49:42 -04:00
|
|
|
ts = TabStop(line_idx,
|
|
|
|
(start_in_line,start_in_line+len(def_text)), def_text)
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
tabstops[no] = ts
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
return val
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
def _handle_ts_or_mirror(self, m, val, tabstops, mirrors):
|
|
|
|
no = int(m.group(3))
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
start, end = m.span()
|
|
|
|
val = val[:start] + val[end:]
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
line_idx = val[:start].count('\n')
|
|
|
|
line_start = val[:start].rfind('\n') + 1
|
|
|
|
start_in_line = start - line_start
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
if no in tabstops:
|
|
|
|
m = Mirror(tabstops[no], line_idx, start_in_line)
|
|
|
|
mirrors.append(m)
|
|
|
|
else:
|
2009-07-01 14:14:54 -04:00
|
|
|
ts = TabStop(line_idx, (start_in_line,start_in_line))
|
2009-07-01 14:03:29 -04:00
|
|
|
tabstops[no] = ts
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
return val
|
|
|
|
|
|
|
|
def _find_tabstops(self, val):
|
|
|
|
tabstops = {}
|
|
|
|
mirrors = []
|
|
|
|
|
|
|
|
while 1:
|
|
|
|
m = self._TABSTOP.search(val)
|
|
|
|
|
|
|
|
if m is not None:
|
|
|
|
if m.group(1) is not None: # ${1:hallo}
|
|
|
|
val = self._handle_tabstop(m,val,tabstops,mirrors)
|
|
|
|
elif m.group(3) is not None: # $1
|
|
|
|
val = self._handle_ts_or_mirror(m,val,tabstops,mirrors)
|
|
|
|
else:
|
|
|
|
break
|
|
|
|
|
2009-07-01 14:14:54 -04:00
|
|
|
return tabstops, mirrors, val.split('\n')
|
2009-06-23 08:45:04 -04:00
|
|
|
|
2009-06-28 16:22:19 -04:00
|
|
|
def launch(self, before, after):
|
2009-06-23 08:45:04 -04:00
|
|
|
lineno,col = vim.current.window.cursor
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
col -= len(self._t)
|
|
|
|
|
2009-07-01 14:14:54 -04:00
|
|
|
ts, mirrors, lines = self._find_tabstops(self._v)
|
2009-06-28 08:51:27 -04:00
|
|
|
|
|
|
|
endcol = None
|
2009-06-28 16:22:19 -04:00
|
|
|
newline = 1
|
|
|
|
newcol = 0
|
|
|
|
if not len(ts):
|
2009-06-28 08:51:27 -04:00
|
|
|
newline = lineno + len(lines) - 1
|
|
|
|
if len(lines) == 1:
|
|
|
|
newcol = col + len(lines[-1])
|
|
|
|
else:
|
|
|
|
newcol = len(lines[-1])
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
lines[0] = before + lines[0]
|
|
|
|
lines[-1] += after
|
|
|
|
|
2009-07-02 03:49:42 -04:00
|
|
|
vim.current.buffer[lineno-1:lineno-1+1] = lines
|
2009-06-28 08:51:27 -04:00
|
|
|
|
|
|
|
vim.current.window.cursor = newline, newcol
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
if len(ts) or len(mirrors):
|
2009-07-02 02:25:58 -04:00
|
|
|
s = SnippetInstance(
|
|
|
|
Position(lineno-1,col), Position(newline-1,newcol),
|
|
|
|
ts, mirrors)
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-06-28 16:22:19 -04:00
|
|
|
s.select_next_tab()
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-06-28 16:22:19 -04:00
|
|
|
return s
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
class SnippetManager(object):
|
|
|
|
def __init__(self):
|
2009-06-28 16:22:19 -04:00
|
|
|
self.reset()
|
2009-07-01 09:20:40 -04:00
|
|
|
self._last_cursor_pos = None
|
2009-06-28 16:22:19 -04:00
|
|
|
|
|
|
|
def reset(self):
|
2009-07-01 04:39:46 -04:00
|
|
|
self._snippets = {}
|
2009-06-28 16:22:19 -04:00
|
|
|
self._current_snippets = []
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
def add_snippet(self,trigger,value):
|
|
|
|
self._snippets[trigger] = Snippet(trigger,value)
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-07-01 14:03:29 -04:00
|
|
|
def try_expand(self, backwards = False):
|
2009-06-28 16:22:19 -04:00
|
|
|
if len(self._current_snippets):
|
2009-07-01 14:03:29 -04:00
|
|
|
cs = self._current_snippets[-1]
|
|
|
|
if not cs.select_next_tab(backwards):
|
|
|
|
self._current_snippets.pop()
|
2009-07-01 11:11:33 -04:00
|
|
|
self._last_cursor_pos = vim.current.window.cursor
|
2009-06-28 16:22:19 -04:00
|
|
|
return
|
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
line = vim.current.line
|
2009-06-28 08:51:27 -04:00
|
|
|
|
2009-06-23 08:45:04 -04:00
|
|
|
dummy,col = vim.current.window.cursor
|
|
|
|
|
|
|
|
if col > 0 and line[col-1] in string.whitespace:
|
|
|
|
return
|
|
|
|
|
|
|
|
# Get the word to the left of the current edit position
|
|
|
|
before,after = line[:col], line[col:]
|
|
|
|
|
|
|
|
word = before.split()[-1]
|
|
|
|
if word in self._snippets:
|
2009-06-28 16:22:19 -04:00
|
|
|
s = self._snippets[word].launch(before.rstrip()[:-len(word)], after)
|
2009-07-01 14:03:29 -04:00
|
|
|
self._last_cursor_pos = vim.current.window.cursor
|
2009-06-28 16:22:19 -04:00
|
|
|
if s is not None:
|
|
|
|
self._current_snippets.append(s)
|
2009-07-01 04:39:46 -04:00
|
|
|
|
2009-06-28 16:22:19 -04:00
|
|
|
def cursor_moved(self):
|
2009-07-01 09:20:40 -04:00
|
|
|
cp = vim.current.window.cursor
|
|
|
|
|
2009-07-01 09:29:14 -04:00
|
|
|
if len(self._current_snippets) and self._last_cursor_pos is not None:
|
2009-07-01 09:20:40 -04:00
|
|
|
lineno,col = cp
|
|
|
|
llineo,lcol = self._last_cursor_pos
|
|
|
|
# If we moved the line, somethings fishy.
|
|
|
|
if lineno == self._last_cursor_pos[0]:
|
|
|
|
cs = self._current_snippets[-1]
|
|
|
|
|
|
|
|
if lcol > col: # Some deleting was going on
|
|
|
|
cs.backspace(lcol-col)
|
|
|
|
else:
|
|
|
|
line = vim.current.line
|
|
|
|
|
|
|
|
chars = line[lcol:col]
|
|
|
|
cs.chars_entered(chars)
|
2009-07-01 11:11:33 -04:00
|
|
|
|
2009-07-01 09:20:40 -04:00
|
|
|
self._last_cursor_pos = cp
|
2009-06-28 16:22:19 -04:00
|
|
|
|
|
|
|
def entered_insert_mode(self):
|
|
|
|
pass
|
2009-06-23 08:45:04 -04:00
|
|
|
|
|
|
|
PySnipSnippets = SnippetManager()
|
2009-07-01 14:14:54 -04:00
|
|
|
|