選択したテキストブロックのテキストを部分的に置き換える方法は?


14

私の問題にぴったりのタイトルを見つけるのは簡単ではありません。

私はテキストブロックの前に挿入することを知っています:

Ctrl- v 種のテキストを選択しI ます ESC

これを実行したいのですが、ブロック選択でパーツを交換することもできます。現在2つの操作を行っています

Ctrl- v ブロックを選択 して最初に戻りますx

上記のシーケンスが続きます。

ブロックを1回だけ(Ctrl- v)選択してこれら2つの操作を組み合わせる方法はありますか?

ここに小さな例があります:

次のブロックを変換したい

1  text
2  text
3  text
4  text
5  text

new text 
new text 
new text 
new text 
new text

「操作」は1つだけです。


1
私はあなたが何を望んでいるか100%確信していません、おそらく実際の例が役立つでしょう(あなたが何を持っているか、あなたが何を望んでいるか)。あなたはgvを知っていますか?最後のビジュアル選択を再選択し、ここで役立つ場合があります。
PhilippFrank 2015年

回答:


21

タイピングcあなたのブロックを選択する代わりに、後には、x選択ブロック内のテキストを削除し、挿入モードに入ります。何かを入力して挿入モードを終了すると、すべての行で同じ変更が行われるはずです。

やってみる

Ctrl-- vブロックを選択-- c何でも挿入-Esc


1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

上記のような3つの異なるブロック文字の行を想像してください。 ^V上記を選択するAと、行の長さが等しくないため、行の最後の文字のすべてをに変更できませんでした。前のブロックの文字がで罰金を働いた :s/\%V1/T/g Tは、1つの」から作られた「前のブロックの手紙。変更/T/何でもします。

しかし、上記の最後のブロック文字を選択すると、すべての「1」が「A」に変わり、A *のポイントになり、残りは1のままでした。

*最短ライン。

すべての行を同じ長さにするために、スペースを入れました。(私はvimが初めてなので、もっと良いスクリプトを書くことができると思います。)

注:Aのピークはライン2から始まりました。

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

この後:s/\%V1/T/g 、行の最後のブロックレターで宣伝されたとおりに働きました。

PS私はexecute上の行がドットなしで機能するはずだと読んだのですが、私には機能しませんでした。


実行行、ブロック文字の行iの先頭に移動し、行の末尾にbスペースを追加します。「b」は、現在の行と最長の行の長さの差です。
ロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.