Fixed bug 400105 and 400114
This commit is contained in:
parent
f60417cdee
commit
318b2726ae
@ -10,14 +10,6 @@ function! UltiSnips_ExpandSnippet()
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if pumvisible() " Update snippet if completion is used, or deal with supertab
|
|
||||||
if exists('SuperTabKey')
|
|
||||||
call feedkeys(SuperTabKey) | return ''
|
|
||||||
endif
|
|
||||||
call feedkeys("\<esc>a", 'n') " Close completion menu
|
|
||||||
call feedkeys("\<tab>") | return ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Now, really expand something
|
" Now, really expand something
|
||||||
py << EOF
|
py << EOF
|
||||||
if not UltiSnips_Manager.try_expand():
|
if not UltiSnips_Manager.try_expand():
|
||||||
|
@ -50,6 +50,7 @@ class VimState(object):
|
|||||||
self._dlines = None
|
self._dlines = None
|
||||||
self._cols = None
|
self._cols = None
|
||||||
self._dcols = None
|
self._dcols = None
|
||||||
|
self._cline = None
|
||||||
self._lline = None
|
self._lline = None
|
||||||
self._text_changed = None
|
self._text_changed = None
|
||||||
|
|
||||||
@ -83,8 +84,9 @@ class VimState(object):
|
|||||||
# If the length didn't change but we moved a column, check if
|
# If the length didn't change but we moved a column, check if
|
||||||
# the char under the cursor has changed (might be one char tab).
|
# the char under the cursor has changed (might be one char tab).
|
||||||
elif self.moved.col == 1:
|
elif self.moved.col == 1:
|
||||||
self._text_changed = self._lline != vim.current.buffer[line]
|
self._text_changed = self._cline != vim.current.buffer[line]
|
||||||
self._lline = vim.current.buffer[line]
|
self._lline = self._cline
|
||||||
|
self._cline = vim.current.buffer[line]
|
||||||
|
|
||||||
def select_span(self, r):
|
def select_span(self, r):
|
||||||
delta = r.end - r.start
|
delta = r.end - r.start
|
||||||
@ -144,6 +146,10 @@ class VimState(object):
|
|||||||
return bool(self._moved.line or self._moved.col)
|
return bool(self._moved.line or self._moved.col)
|
||||||
has_moved = property(has_moved)
|
has_moved = property(has_moved)
|
||||||
|
|
||||||
|
def last_line(self):
|
||||||
|
return self._lline
|
||||||
|
last_line = property(last_line)
|
||||||
|
|
||||||
class SnippetManager(object):
|
class SnippetManager(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.reset()
|
self.reset()
|
||||||
@ -188,7 +194,6 @@ class SnippetManager(object):
|
|||||||
if "all" not in self._snippets:
|
if "all" not in self._snippets:
|
||||||
self._load_snippets_for("all")
|
self._load_snippets_for("all")
|
||||||
|
|
||||||
self._ctab = None
|
|
||||||
self._expect_move_wo_change = False
|
self._expect_move_wo_change = False
|
||||||
|
|
||||||
lineno,col = vim.current.window.cursor
|
lineno,col = vim.current.window.cursor
|
||||||
@ -275,9 +280,23 @@ class SnippetManager(object):
|
|||||||
if self._vstate.buf_changed and self._ctab:
|
if self._vstate.buf_changed and self._ctab:
|
||||||
# Detect a carriage return
|
# Detect a carriage return
|
||||||
if self._vstate.moved.col <= 0 and self._vstate.moved.line == 1:
|
if self._vstate.moved.col <= 0 and self._vstate.moved.line == 1:
|
||||||
|
# Multiple things might have happened: either the user entered
|
||||||
|
# a newline character or pasted some text which means we have
|
||||||
|
# to copy everything he entered on the last line and keep the
|
||||||
|
# indent vim chose for this line.
|
||||||
lline = vim.current.buffer[self._vstate.ppos.line]
|
lline = vim.current.buffer[self._vstate.ppos.line]
|
||||||
pentered = lline[self._vstate.ppos.col:]
|
|
||||||
|
|
||||||
|
# Another thing that might have happened is that a word
|
||||||
|
# wrapped, in this case the last line is shortened and we must
|
||||||
|
# delete what vim deleted there
|
||||||
|
line_was_shortened = len(self._vstate.last_line) > len(lline)
|
||||||
|
user_didnt_enter_newline = len(lline) != self._vstate.ppos.col
|
||||||
|
if line_was_shortened and user_didnt_enter_newline:
|
||||||
|
cline = vim.current.buffer[self._vstate.pos.line]
|
||||||
|
self._backspace(len(self._vstate.last_line)-len(lline))
|
||||||
|
self._chars_entered('\n' + cline, 1)
|
||||||
|
else:
|
||||||
|
pentered = lline[self._vstate.ppos.col:]
|
||||||
this_entered = vim.current.line[:self._vstate.pos.col]
|
this_entered = vim.current.line[:self._vstate.pos.col]
|
||||||
|
|
||||||
self._chars_entered(pentered + '\n' + this_entered)
|
self._chars_entered(pentered + '\n' + this_entered)
|
||||||
@ -305,7 +324,7 @@ class SnippetManager(object):
|
|||||||
# Private/Protect Functions Below #
|
# Private/Protect Functions Below #
|
||||||
###################################
|
###################################
|
||||||
# Input Handling
|
# Input Handling
|
||||||
def _chars_entered(self, chars):
|
def _chars_entered(self, chars, del_more_lines = 0):
|
||||||
if (self._span_selected is not None):
|
if (self._span_selected is not None):
|
||||||
self._ctab.current_text = chars
|
self._ctab.current_text = chars
|
||||||
|
|
||||||
@ -313,10 +332,10 @@ class SnippetManager(object):
|
|||||||
self._span_selected.end.line
|
self._span_selected.end.line
|
||||||
self._span_selected = None
|
self._span_selected = None
|
||||||
|
|
||||||
self._update_vim_buffer(moved)
|
self._update_vim_buffer(moved + del_more_lines)
|
||||||
else:
|
else:
|
||||||
self._ctab.current_text += chars
|
self._ctab.current_text += chars
|
||||||
self._update_vim_buffer()
|
self._update_vim_buffer(del_more_lines)
|
||||||
|
|
||||||
|
|
||||||
def _backspace(self, count):
|
def _backspace(self, count):
|
||||||
|
10
test.py
10
test.py
@ -170,6 +170,16 @@ class MultilineExpandTestTyping_ExceptCorrectResult(_VimTest):
|
|||||||
wanted = "Wie Hallo Welt!\nUnd Wie gehtsHuiui! gehts"
|
wanted = "Wie Hallo Welt!\nUnd Wie gehtsHuiui! gehts"
|
||||||
keys = "Wie hallo gehts" + ESC + "bhi" + EX + "Huiui!"
|
keys = "Wie hallo gehts" + ESC + "bhi" + EX + "Huiui!"
|
||||||
|
|
||||||
|
class MultilineExpandWithFormatoptionsOn_ExceptCorrectResult(_VimTest):
|
||||||
|
snippets = ("test", "${1:longer expand}\n$0")
|
||||||
|
keys = "test" + EX + "This is a longer text that should wrap"
|
||||||
|
wanted = "This is a longer\ntext that should\nwrap\n"
|
||||||
|
def _options_on(self):
|
||||||
|
self.send(":set tw=20\n")
|
||||||
|
def _options_off(self):
|
||||||
|
self.send(":set tw=0\n")
|
||||||
|
|
||||||
|
|
||||||
############
|
############
|
||||||
# TabStops #
|
# TabStops #
|
||||||
############
|
############
|
||||||
|
Loading…
x
Reference in New Issue
Block a user