2011-09-11 2 views
2

後で繰り返しなければならない行がある長いテキストがあります。Vimの後の行で最初に一致するパターンを置き換えます。

私はテキストで、このようなタグを置く:

{F1}text need to be repeated later{/F1} 

ので、私は後のセクションに複数の{F1}{/F1}を追加し、それらの間の最初の行の内容を置くことができます。

問題が{F2}{/F2}などのように、このようなタグがたくさんあるだろうということです...そしてこのパターンがあまりにもそれらのすべてに一致します。

{\(.*\)}.*{\/\1} 

だから、私は別のすべての最初の発生を検索しますタグを置き換えて後の行に置き換えます。最初の行を変更してもう一度代用すると、すべての行が更新されます。おそらく自動的にautocmd BufWriteで更新されます。

どうすればいいですか?最初の行に{}{/}というタグを付ける考えは必ずしも必要ではありません。タグがたくさんあるので、私は個々の代替コマンドを使ってそれを1つずつ実行したくありません。

私はこれを試みた:

:g/{\(.*\)}\(.*\){\/\1}/s/{\1}.*{\/\1}/{\1}\2{\/\1}/ 

それは言う:

E65 Illegal back reference. 
+2

正確に何をしたいのかわかりやすくするために、例文(前後)を投稿することはできますか? – Benoit

+1

私は間違っているかもしれませんが、私は、マッチ部分にキャプチャせずにs ///の置換部分で逆参照を使用することによってエラーが発生したと思います。 – johnny

答えて

2

以下に記載されているReplicateTags()関数はその記述に従って(各タグの内容を置換する置換 コマンドを実行 質問)、そのタグが最初に出現したときにテキストが表示されます。置換 は、バッファ全体に対して作用し、1回のパスですべてのタグを処理します(複数行の重複しないタグを受け入れる)。 この関数は、タグ名を最初に出現する内容にマップする辞書 を返します。

function! ReplicateTags() 
    let dict = {} 
    %s/{\([^}]\+\)}\(\_.\{-}\){\/\1}/\=Tag(dict, submatch(1), submatch(2))/ge 
    return dict 
endfunction 

function! Tag(dict, tag, str) 
    let a:dict[a:tag] = get(a:dict, a:tag, a:str) 
    return printf('{%s}%s{/%s}', a:tag, a:dict[a:tag], a:tag) 
endfunction 
+0

男、これは最高です! :Dまさに私が望むもの。 – kissgyorgy

関連する問題