Vim:行を以前にヤンクした別の行に置き換える


112

少なくとも1日1回、私は次の状況にあります。

A: This line should also replace line X
...
X: This is line should be replaced

私はその仕事を効率的に行っていないと思います。

私がやること:

  • A行に行く:AG
  • ヤンクラインA:yy
  • 行Xに移動:XG
  • 行Aを貼り付け:P
  • 古い行に移動:j
  • 古い行を削除:dd

これは、(私はA.ヤンクに置き換える必要があり、別の行を見つけて、追加のレジスタから貼り付ける場合はラインXは迷惑であるデフォルトレジスタ、に今あるというさらなる欠点を持っている「ayy」APが)も、この単純な作業になります効率が悪い。

私の質問:

  • 以前にヤンクされた行を置き換える組み込みのVimコマンドを見逃しましたか?
  • そうでない場合は、どのようにして、デフォルトのレジスターにヤンクされた行を残す(または復元する)独自のコマンドをバインドできますか?

2
これは、Vimの編集モデルに関する私の最大の問題です。解決策を知りたいです。CUAエディターは切り取りと削除を区別するため、テキストをいくつか切り取り、必要なすべてを削除して貼り付けることができます。Vimを使用すると、削除するとカットしたテキストがゴミになります。他のエディターよりもはるかに多くのキーストロークを使用することになります。


@Mud :moveブラックホールレジスター(_)について学習します(実際にはレジスターのみ)
sehe

2
@seheレジスタは完全に認識していますが、カット/ペースト操作ごとに4回のキーストロークが追加され、より多くの予測が必要になります。たくさんの編集をしているとき、それはすぐに追加されます。
マッド

数バイトのメモリを節約する以外に、他のレジスタとは対照的に、ブラックホールレジスタを使用する利点はありますか?読み返さなければ、どのレジスタもブラックホールレジスタになる可能性があると私は主張します。
sleblanc 2015年

回答:


91

私がすること:

  1. aG
  2. Y
  3. xG
  4. Vp

あなたは、通常モードのままにする必要はありませんが、それはない行をヤンク。ただし、V"0pどちらを使用しても、ステップ2で常に線が引かれます。


11
@duddle:はい、Y同義語ですyy
アイス犯罪

8
手順1と2は、:ayを使用して組み合わせることができます[例:20y] Vpが後に続くとうまくいきます。ヤンクするために行に行く必要はありません。
Bharad 2013

2
代わりにV「0PのccCTRL + r0ESCとあなた上書き追加の行は、すべての次の行だけに置き換えることができた場合(リピータ)。
ヨルダンモリス

Y同義語ですyyが、私はそれがために再マッピングすることをお勧めy$一致するDC
mgold 2013

以下のJordan Morrisの回答をチェックしてください。stackoverflow.com/ users / 970673 / jordan-morrisを以下に示します。実際にvimコマンドを最大限に使用して、コマンドを複数回繰り返すことができます。
JESii 2014年

105

Vp:行を選択し、ヤンクしたものを貼り付けます


3
VPシーケンス全体でShiftキーを押したままにできるので便利です。
ジョージヒリアード2015

23
非常に素晴らしいトリックですが、(おそらく)重要な注意点があります。これにより、ヤンクレジスタが上書きされている行の内容で更新されるため、一部のタスクではうまく機能しない可能性があります。たとえば、上書きしたい場合複数の宛先への同じ線。
underscore_d

8
@underscore_d、それを実行するとうまくV"0p再生されます。これは、最後にヤンクされたレジスタから貼り付けます。
timblaktu 2017年

@timblaktu何を説明できますV"0pか?VはVisual line lineモードになり、pは貼り付け用です。"と0とは何ですか?ありがとう
プログラマー

43

これには、行Xがデフォルトレジスターにあるという追加の欠点があります。

通常のレジスタに影響を与えずにテキストを削除するには、ブラックホールレジスタを使用できます"_

"_dd

10
私が作るために私の.vimrcにいくつかのマッピングを追加dし、dd常にブラックホールを使用し、xそしてxxほとんどの編集者は「カット」と呼ぶ(削除し、デフォルトのレジスタに保存する)だろうか実行しますnoremap x d noremap xx dd noremap d "_d noremap dd "_dd
IMSoP

2
VIMでの再マッピングには注意が必要です。これは、他のコンピューターやIDEのVIMスタイルのプラグインでは簡単ではないためです。また、VIMの設計者は、本当に掘り下げた場合、デフォルトのマッピングの問題を解決する傾向があります。
ジョーダンモリス

15

行の使用VpまたはVP貼り付けを提案する答えに基づいて構築します。ヤンクレジスターの内容が変更されないようにするために、最も人間工学に基づいたコマンドは次のとおりです。

VPY


これは、ヤンクの内容をそのままにする最も簡単なソリューションです。どうもありがとう!
heylookltsme

14
  1. yy
  2. j(置き換える行に移動)、次に
  3. Vp(大文字のv、次にpは、ヤンクされたコンテンツで置き換えられます)

驚くばかり!非常に短く、ビジュアルモードで複数の行を簡単に選択できます。また、貼り付けバッファーをそのまま維持します。ddがそのバッファーを上書きするのは煩わしい...
Aktau 2013年

@Aktauこれは、バッファーをそのまま残しません。
ジョーダンモリス

9

コマンドライン(Ex)モードを使用して、次の2つのコマンドを実行します

:XmA
:Ad

これは単に行XをAの真下に移動し、次にAを削除するとその行を上に移動します

例えば

:7m3
:3d

例を挙げていただけますか?たとえば50Gm30Gを押すと、Vimは50行目に移動し、次に下に移動します。また、A = 50またはA = 50Gの場合、広告は何もしません
サクサク

7
  1. 最初の行の先頭に移動します。

  2. y$–末尾に改行なしで行をコピーします

  3. ターゲット行の先頭に移動します。

    1. Vp– 1行のターゲット行のみを置き換える

    2. ccCtrlr0Esc-元ヤンクとターゲットラインを置き換えます

  4. 次のターゲット行の先頭に移動します。

  5. . – 4.2で発行されたコマンドを繰り返します。

ノート:

  • 4.1でありy$あなたがしなければためyyまたはYあなたは改行をコピーします、そしてCtrlr、  0実際にあなたのターゲットライン下に改行が追加されます。

  • 4.2 replacesはV p、技術的には最後のアクションが削除であるため、繰り返しでは機能しません.。行を削除するだけです。

  • EXモード(コマンドライン)から '現在の行をレジスタに置き換える'を発行する方法を知っている人がいる場合は、(およびドキュメントがどこにあるかを知りたい)ご意見をお聞かせください。4.2よりも高速で、かつ/または改行の警告がない反復可能なEXコマンドがある可能性があります。


1
ステップ4.2は、4.3のようにdotコマンドでプロセス全体を繰り返すことができるので、ここではキラーです-それがvimのすべてです!
JESii 2014年

1
わかりません。'AG'は、私のメーカーを行末に置き、挿入モードに入り、 'G'に入ります。私が得ていないのは何ですか?
gustafbstrom

@gustafbstrom公正な批判-申し訳ありませんが、Aは行番号を表すはずでしたが、私はそれを指摘できませんでした。編集。
ジョーダンモリス

5

これが私がすることです

  • 行Aの先頭を移動しますAG(Aは明らかに行番号です)。
  • a(改行なし)などのレジスターに行をヤンクします。タイプ"ay$
  • 行を挿入するために移動し、 XG
  • 代替ライン、 S
  • レジスターaから挿入 Ctrl-Ra

4

これはビジュアルモードで使用できます。

  • 行Aに移動します。 AG
  • ビジュアルモードでラインを選択します。 VESC
  • 行Xに移動します。 XG
  • 行の代替モードに入ります: S
  • コピーした行を貼り付けます:shift+ insert(または、クリップボードから貼り付けるためにマッピングした他の任意の要素)。

ああ。VSについて知りませんでした。ただし、挿入モードでアクセスできるのはOSクリップボードだけなので、OSのクリップボードにヤンクしないので、あなたの手順は機能しません。したがって、最初に挿入モードを終了する必要があります。
サクサク

3

あなたも行うことができます:

Vy (in normal mode at the line you want to copy)
Vp (in normal mode at the line you want to replace)
  • スペースや行末を作成しません。
  • コピーされたテキストの先頭にカーソルが置かれます。

同じキーを使用して、複数の行をヤンク/貼り付けできます。

V (in normal mode at what you want to yank)
(use jk to move the selection)
y (to yank the selection)
V (in normal mode at where you want to paste)
(use jk to move the selection)
p (to replace the selection with the yanked lines)

2

このコマンドは通常モードで使用できます。

:AmX | Xd

m以下のためのコマンドがありm[ove]ますが、コピーの代わりに、使用する線を移動したい場合は、行番号Xの後に行番号Aを移動します、co[py]dコマンドがためのものですd[elete]

coを使用して行の範囲を移動(コピーを使用)できます

:start,end m X

2

cicld(ありがとう!)の最近のコメントに照らして、私は元の問題を完全に理解していないようです。行を移動することは適切ではありませんが、コピーは適切です(行がヤンクされているためです)。したがって、次のように修正します。

:1t20:20d_
  1. 1行目(:tコマンドはのエイリアス:copy)を20行目の後にコピーします(21行目に配置します)

  2. 行20を削除し、削除した行を「ブラックホール」レジスター(_)に入れます(つまり、現在のヤンクバッファーには影響しません)。

最近のコメントで述べたように、これは現在のカーソル位置には影響しません。


1
  1. :ay(aは行番号です。例:20y)。これは行をヤンクします(意図的にしゃれました)。
  2. VP

1

これにはExコマンドを使用する方が簡単です。例。行9を46に移動するには:

 :46|9m.|-1d

これにより、カーソルが行46に移動し、行9が現在の下に移動し、前の行が削除されます(移動した行が現在の行であるため)。

または、マーク「a」を使用してマークを使用します。

:46ma a|9m'a|'ad

EXコマンドの優れた点は、カーソルがどこにあっても(通常モードで)コマンドを実行できることです。私は好みます:1m20|.+1d(1行目を20行目に移動し、次の行、つまり以前に20行目にあったテキストを削除します)。同じアイデアですが!
5

1

私はしばしば1行をYに変換し、それを複数の場所で置き換える必要があります。それぞれが異なる値を持っています(つまり、正規表現を実行できません)。

Y 元の行をヤンクするには

そして、置き換えたいすべての行で、 VpzeroY


0

「ブラックホール」レジスタを単純に使用します。

与えられた:

nnoremap <Cd> "_dd

解決策は次のとおりです。

<Cd> yy

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