Merged my fix for bug 501727

This commit is contained in:
Holger Rapp 2010-08-18 12:54:23 +02:00
commit 9011515686
2 changed files with 72 additions and 8 deletions

View File

@ -24,6 +24,10 @@ def _vim_quote(s):
"""Quote string s as Vim literal string.""" """Quote string s as Vim literal string."""
return "'" + s.replace("'", "''") + "'" return "'" + s.replace("'", "''") + "'"
def feedkeys(s, mode='n'):
"""Wrapper around vim's feedkeys function. Mainly for convenience."""
vim.command(r'call feedkeys("%s", "%s")' % (s, mode))
class _SnippetDictionary(object): class _SnippetDictionary(object):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self._snippets = [] self._snippets = []
@ -364,6 +368,44 @@ class Snippet(object):
return SnippetInstance(parent, indent, v, start, return SnippetInstance(parent, indent, v, start,
end, last_re = self._last_re, globals = self._globals) end, last_re = self._last_re, globals = self._globals)
class LangMapTranslator(object):
"""
This object cares for the vim langmap option and basically reverses
the mappings. This was the only solution to get UltiSnips to work
nicely with langmap; other stuff I tried was using inoremap movement
commands and caching and restoring the langmap option.
Note that this will not work if the langmap overwrites a character
completely, for example if 'j' is remapped, but nothing is mapped
back to 'j', then moving one line down is no longer possible and
UltiSnips will fail.
"""
_maps = {}
def _create_translation(self, langmap):
from_chars, to_chars = "", ""
for c in langmap.split(','):
if ";" in c:
a,b = c.split(';')
from_chars += a
to_chars += b
else:
from_chars += c[::2]
to_chars += c[1::2]
self._maps[langmap] = string.maketrans(to_chars, from_chars)
def translate(self, s):
langmap = vim.eval("&langmap").strip()
if langmap == "":
return s
if langmap not in self._maps:
self._create_translation(langmap)
return s.translate(self._maps[langmap])
class VimState(object): class VimState(object):
def __init__(self): def __init__(self):
self._abs_pos = None self._abs_pos = None
@ -419,9 +461,9 @@ class VimState(object):
if delta.line == delta.col == 0: if delta.line == delta.col == 0:
if col == 0 or vim.eval("mode()") != 'i': if col == 0 or vim.eval("mode()") != 'i':
vim.command(r'call feedkeys("\<Esc>i")') feedkeys(r"\<Esc>i")
else: else:
vim.command(r'call feedkeys("\<Esc>a")') feedkeys(r"\<Esc>a")
else: else:
if delta.line: if delta.line:
move_lines = "%ij" % delta.line move_lines = "%ij" % delta.line
@ -442,9 +484,11 @@ class VimState(object):
else: else:
do_select = "%ih" % (-delta.col+1) do_select = "%ih" % (-delta.col+1)
move_cmd = LangMapTranslator().translate(
r"\<Esc>%sv%s%s\<c-g>" % (move_one_right, move_lines, do_select)
)
vim.command(r'call feedkeys("\<Esc>%sv%s%s\<c-g>")' % feedkeys(move_cmd)
(move_one_right, move_lines, do_select))
def buf_changed(self): def buf_changed(self):
@ -556,10 +600,10 @@ class SnippetManager(object):
if self._cs and (self._span_selected is not None): if self._cs and (self._span_selected is not None):
# This only happens when a default value is delted using backspace # This only happens when a default value is delted using backspace
vim.command(r'call feedkeys("i")') feedkeys(r"i")
self._chars_entered('') self._chars_entered('')
else: else:
vim.command(r'call feedkeys("\<BS>")') feedkeys(r"\<BS>")
def cursor_moved(self): def cursor_moved(self):
self._vstate.update() self._vstate.update()
@ -709,7 +753,7 @@ class SnippetManager(object):
break break
if feedkey: if feedkey:
vim.command(r'call feedkeys("%s", "%s")' % (feedkey, mode)) feedkeys(feedkey, mode)
def _ensure_snippets_loaded(self): def _ensure_snippets_loaded(self):
filetypes = vim.eval("&filetype").split(".") + [ "all" ] filetypes = vim.eval("&filetype").split(".") + [ "all" ]

20
test.py
View File

@ -1841,6 +1841,26 @@ endsnippet
wanted = "x first a bob b y" wanted = "x first a bob b y"
###########################################################################
# Test for bug 501727 #
###########################################################################
class TestNonEmptyLangmap_ExceptCorrectResult(_VimTest):
snippets = ("testme",
"""my snipped ${1:some_default}
and a mirror: $1
$2...$3
$0""")
keys = "testme" + EX + "hi1" + JF + "hi2" + JF + "hi3" + JF + "hi4"
wanted ="""my snipped hi1
and a mirror: hi1
hi2...hi3
hi4"""
def _options_on(self):
self.send(":set langmap=dj,rk,nl,ln,jd,kr,DJ,RK,NL,LN,JD,KR\n")
def _options_off(self):
self.send(":set langmap=\n")
########################################################################### ###########################################################################
# END OF TEST # # END OF TEST #
########################################################################### ###########################################################################