65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
#!/usr/bin/env python
|
||
# encoding: utf-8
|
||
|
||
"""A ${VISUAL} placeholder that will use the text that was last visually
|
||
selected and insert it here.
|
||
|
||
If there was no text visually selected, this will be the empty string.
|
||
|
||
"""
|
||
|
||
import re
|
||
import textwrap
|
||
|
||
from UltiSnips import _vim
|
||
from UltiSnips.indent_util import IndentUtil
|
||
from UltiSnips.text_objects._transformation import TextObjectTransformation
|
||
from UltiSnips.text_objects._base import NoneditableTextObject
|
||
|
||
_REPLACE_NON_WS = re.compile(r"[^ \t]")
|
||
|
||
|
||
class Visual(NoneditableTextObject, TextObjectTransformation):
|
||
|
||
"""See module docstring."""
|
||
|
||
def __init__(self, parent, token):
|
||
# Find our containing snippet for visual_content
|
||
snippet = parent
|
||
while snippet:
|
||
try:
|
||
self._text = snippet.visual_content.text
|
||
self._mode = snippet.visual_content.mode
|
||
break
|
||
except AttributeError:
|
||
snippet = snippet._parent # pylint:disable=protected-access
|
||
if not self._text:
|
||
self._text = token.alternative_text
|
||
self._mode = 'v'
|
||
|
||
NoneditableTextObject.__init__(self, parent, token)
|
||
TextObjectTransformation.__init__(self, token)
|
||
|
||
def _update(self, done):
|
||
if self._mode == 'v': # Normal selection.
|
||
text = self._text
|
||
else: # Block selection or line selection.
|
||
text_before = _vim.buf[self.start.line][:self.start.col]
|
||
indent = _REPLACE_NON_WS.sub(' ', text_before)
|
||
iu = IndentUtil()
|
||
indent = iu.indent_to_spaces(indent)
|
||
indent = iu.spaces_to_indent(indent)
|
||
text = ''
|
||
for idx, line in enumerate(textwrap.dedent(
|
||
self._text).splitlines(True)):
|
||
if idx != 0:
|
||
text += indent
|
||
text += line
|
||
text = text[:-1] # Strip final '\n'
|
||
|
||
text = self._transform(text)
|
||
self.overwrite(text)
|
||
self._parent._del_child(self) # pylint:disable=protected-access
|
||
|
||
return True
|