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
|