vimにわずかな違いがある繰り返しのテキストを挿入する方法は?


11

このようなテキストを挿入したい:

similar text wordA similar text ...
similar text wordB similar text ...
similar text wordC similar text ...

テキストを何度も貼り付けてから、置換を使用して各行の1つの単語を変更できることはわかっていますが、この方法は依然として非常に不便です。

単語または単語リストを「変数」に保存し、この変数を使用して同様のテキストを生成する方法はありますか?


編集私は元の質問で何かを不明確にしました、実際私はいくつかの非常によく似た関数定義を作ろうとしているので、wordA wordB...はテキストの各クローンに何度も現れ、テキストには多くの行が含まれる場合があります。パターンは次のとおりです。

similar_text1 wordA similar_text2 wordA similar_text3 ...
similar_text1 wordB similar_text2 wordB similar_text3 ...
similar_text1 wordC similar_text2 wordC similar_text3 ...

(テキストには改行が含まれている可能性があり、wordA、wordB ...は何度も存在する可能性があります)


2番目の編集 "similar_text"の部分は、そのような仕事をするたびに異なる可能性があるため、この仕事の解決策は再利用可能である方がよいでしょう。私は非常によく似た関数定義、または文字列から関数へのマッピングテーブルを作成しようとしているためです。

回答といくつかの練習を読んだ後、改行を含む可能性のある別々の「part1」、「part2」...「partN」を書くのは難しいので、この仕事をある種の置換と考える方が便利だと思います。まずテンプレート:

similar_text1 $WORD similar_text2 $WORD similar_text3 ...
(text may contain <ENTER>, make sure $WORD not exist in "similar_text" parts )

次に、テキストのクローンを配置しようとしますが、$ WORDを単語のリストで置き換えた方がより直観的です。

それで、私の問題は「テキストブロックを何度も複製する方法ですが、毎回、その中のキーワードをリストの単語で置き換えることによって」に変わったようです。


それがレジスターが使用される理由です。テキストをレジスターにヤンク(コピー)して、そのレジスターを使用できます。マクロを使用して、同様のタスクや反復的なタスクを実行できます。
SibiCoder 2016

回答:


7

次の関数を使用できます。

function! GenerateLines()
    let firstpart="similar text part 1"
    let secondpart="similar text part 2"

    let words=["wordA","wordB","wordC","wordD","wordE"]

    for word in words
        let line = firstpart . word . secondpart
        call append(line('.')+1, line)
        normal j
    endfor
endfunction

変数ではfirstpartsecondpartの言葉の前と後のrepeateにテキストを入れて、リストには、words変更すべき単語を置きます。

次に、ループはリストの各単語の行のコンテンツを作成し、行をバッファに挿入して、この新しい行に移動します。

その後、単純に関数を呼び出すことができますcall GenerateLines()


編集操作を簡単にするために、さまざまな部分を引数として渡すこともできます。関数は次のようになります。

function! GenerateLines(firstpart, secondpart, words)
    for word in a:words
        call append(line('.')+1, a:firstpart . word . a:secondpart)
        normal j
    endfor
endfunction

そして、次のように呼び出すことができます。

call GenerateLines("first part", "second part", ["wordA","wordB","wordC","wordD","wordE"])

call map(a:words, 'a:firstpart . v:val . a:secondpart')とでループを回避できますcall append(line('.'), a:words)
アントニー

このような編集は非常に長い「第1部」と「第2部」、さらに「第3部」で行うことが多く、これらの部分には改行が含まれている可能性があるため、コマンドモードでそれほど長く入力するには長すぎるようです。テキストをレジスターにヤンクし、関数を使用してレジスターからテキストを生成するには?
social_loser 16

私は質問を編集しました、それは多くのことを変えます、不便をおかけして申し訳ありません。
social_loser

5

そのような場合の私の戦略は異なりますが、多くの場合、次の手順に従います。

  1. ユニークな単語を書いてください、例えば

    wordA
    wordB
    ...
    wordK
    
  2. どちらか

    a)検索を実行して置換する、例えば

    :%s/\w\+/similar text \0 similar text .../
    

    b)またはビジュアルブロックモードを使用してください:h blockwise-visual。を見てください。特に、単語を選択して、I類似のテキストを前に挿入したりA、類似のテキストを後に追加したりするために使用します。

この種の編集作業を比較的ほとんど行わない場合、この戦略は理にかなっていると私は主張します。ただし、これを頻繁に行う必要がある場合は、@ statoxの提案に従って、単語のリストを拡張する関数を使用する必要があります。


解決策は、単語リストがどこから来ているかに依存すると思います。それがファイルからのものである場合、その後に:read置換を続けることは非常に理にかなっています。
アントニー

あなたの解決策は簡単で、元の質問で私が尋ねた問題を簡単に解決します。しかし、私の元の投稿にはいくつかの間違いがあり、2つの編集を行ったところ、大幅に変更されました。回答をありがとうございます。私の変更と悪い英語は申し訳ありません:)
social_loser

@social_loser置換の置換部分の改行を表す「\ r」を使用してこのソリューションを適応させることができます
frangio

2

これはビジュアルブロック(Ctrl+ v)の仕事だと主張します。まず、すべての異なる単語を書きます。

wordA
wordB
wordC
wordD
wordE

最初wにカーソルを置いて、次に実行します:

<c-v>5j$yA <esc>pA <esc>p

A <esc>p何回でも押すことで、必要な列数を制御できます。上記のコマンドが示すように、3つの列が必要だったと仮定します。今、これがあります:

wordA wordA wordA
wordB wordB wordB
wordC wordC wordC
wordD wordD wordD
wordE wordE wordE

そして、カーソルはwordA最初の行の3番目の先頭にあります。次に、列の間の空白の列を逆方向に選択し、その間にテキストを追加します。現在のカーソル位置から:

h<c-v>5jI similar text 3<esc>

この結果(%はカーソル位置を示します):

wordA wordA%similar text 3 wordA
wordB wordB similar text 3 wordB
wordC wordC similar text 3 wordC
wordD wordD similar text 3 wordD
wordE wordE similar text 3 wordE

次の列について繰り返します。

bh<c-v>5jI similar text 2<esc>

そして最後/最初の列(左側にある列):

b<c-v>5jIsimilar text 1 <esc>

最終的には:

similar text 1 wordA similar text 2 wordA similar text 3 wordA
similar text 1 wordB similar text 2 wordB similar text 3 wordB
similar text 1 wordC similar text 2 wordC similar text 3 wordC
similar text 1 wordD similar text 2 wordD similar text 3 wordD
similar text 1 wordE similar text 2 wordE similar text 3 wordE

更新:スクリーンキャストを追加しました

ここに画像の説明を入力してください


これはタイピングが多いように見えますが、慣れるのは実際には非常に簡単です。単語数、列数、列間の間隔を自由に変更できます。

欠点は、使用している個別の単語のを知る必要があることです。私がしている5、それはコマンドが上で動作している行の数であるため、上記のすべてのコマンドにハード。

デバッグに関する注意:すべてのコマンドは通常モードで開始および終了します。コマンドの最後でビジュアルモードまたは挿入モードになっている場合は、何か問題があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.