Менять дело внутри фрагментов Snipmate.vim? - PullRequest
6 голосов
/ 21 февраля 2011

Можно ли изменить регистр значений переменных внутри фрагментов Snipmate?

Например:

snippet dc
  def create
    @${1} = $1.new
  end

Должен вывести:

def create
  @product = Product.new
end

Я пыталсяиспользуйте backticks для вызова пользовательской функции:

snippet dc
  def create
    @${1} = `ToUpperCase('$1')`.new
  end

И определили эту функцию в Vim:

function! ToUpperCase(str)
    let result = substitute(a:str, '\(\w\)', '\u\1', '')
    return result
endfunction

Это не работает, так как кажется, что Snipmate расширяет свои переменные $ n после он выполнил обратные метки.

Ответы [ 3 ]

9 голосов
/ 27 июля 2011

Отказ от ответственности: я являюсь основным автором UltiSnips.

Для вашего интереса и для роллинговых барабанов я приведу два определения фрагмента для UltiSnips , которые упоминались здесь ранее.Оба делают то, что хочет ОП.Первый использует преобразования (синтаксис TextMate):

snippet dc "create" b
def create
   @$1 = ${1/.*/\u$0/}.new
end
endsnippet

Второй использует интерполяцию кода Python.На мой вкус это легче читать, но оно немного более многословно.

snippet dc "create" b
def create
   @$1 = `!p snip.rv = t[1].title()`.new
end
endsnippet

Начиная с версии 1.3 UltiSnips поставляется со скриптом, который может преобразовывать фрагменты snipMate, поэтому переключение должно быть простым.

3 голосов
/ 21 февраля 2011

Текущая версия snipMate не способна выполнять преобразования для зеркального текста. Посмотрите :help snipMate-disadvantages, где написано:

Невозможно выполнить регулярное выражение для переменных, таких как "$ {1 /.*/ \ U &}"

Если вы действительно хотите эту функцию, вы можете попробовать один из других плагинов сниппета там. UltiSnips использует тот же синтаксис для определения фрагментов и утверждает, что обладает всеми теми же функциями, что и TextMate.

2 голосов
/ 22 февраля 2011

Я немного взломал snipMate, чтобы разрешить нужную функциональность.

Поместите этот код в autoload / snipMate.vim до конца функции s: RemoveSnippet () (после строки #14):

let linecount = len(getline("1", "$"))
for linenum in range(1, linecount)
    let line = getline(linenum)
    let line = substitute(line, '\v\%uc\(([^)]+)\)', '\U\1\E', 'g')
    let line = substitute(line, '\v\%ucfirst\(([^)]+)\)', '\u\1', 'g')
    call setline(linenum, line)
endfor

Теперь вы можете определять фрагменты следующим образом:

snippet dc
  def create
    @${1:product} = %ucfirst($1).new
    %uc($1) = "This is Ruby %uc(constant) example."
  end

Вывод:

def create
  @product = Product.new
  PRODUCT = "This is Ruby CONSTANT example."
end

Обратите внимание, что замена не выполняется в реальном временино после того, как вы "выйдете" из фрагмента.

...