7

Snipmateスニペット内の変数値の大文字と小文字を変更することは可能ですか?

例えば:

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

出力する必要があります:

def create
  @product = Product.new
end

バックティックを使用してカスタム関数を呼び出そうとしました。

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変数を展開しているように見えるため、これは機能しません。

4

3 に答える 3

10

免責事項:私はUltiSnipsの主な作者です。

あなたの興味とドラムのロールインの目的のために、私はここで前に言及されたUltiSnipsの2つのスニペット定義を提示します。どちらもOPが望むことを行います。最初のものは変換(TextMate構文)を使用します:

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

2つ目は、Pythonコード補間を使用します。私の好みでは、これは読みやすいですが、もう少し冗長です。

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

バージョン1.3のUltiSnipsには、snipMateスニペットを変換できるスクリプトが付属しているため、切り替えは簡単です。

于 2011-07-27T05:36:41.237 に答える
3

snipMateの現在のリリースでは、ミラーリングされたテキストに対して変換を実行することはできません。それが言うところを調べてください:help snipMate-disadvantages

「${1/.*/\U&}」などの変数に対して正規表現を実行することはできません

この機能が本当に必要な場合は、他のスニペットプラグインの1つを試してみることをお勧めします。UltiSnipsは、スニペットを定義するために同じ構文を使用し、TextMateと同じ機能をすべて備えていると主張しています。

于 2011-02-21T13:25:44.193 に答える
2

探していた機能を許可するために、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

置換はリアルタイムではなく、スニペットを「終了」した後に行われることに注意してください。

于 2011-02-21T21:44:06.403 に答える