web-dev-qa-db-ja.com

最後のヤンクを上書きせずにvimで削除する方法はありますか?

私はvimが大好きですが、よくある落とし穴の1つは次のとおりです。

  • 行をヤンク
  • 貼り付けたい場所に行きます
  • そこにあるものを削除する
  • ヤンクを貼り付けます。削除したものが貼り付けられていることがわかります

明らかに、ワークフローは最初に削除され、次にヤンクされます。しかし、私がhave toをしなかったら、それはreeeeeaaaaaallllyニースでしょう。誰もがこれのためのトリックを持っていますか? vimにはうまく機能する貼り付けバッファーがありますか、または変更できる.vimrc設定はありますか?

260
tedsuo

ブラックホールである_レジスタに渡します。

レジスタに貼り付けずに行を削除するには:

"_dd

:help registers も参照してください。

何かを何度も貼り付けて「名前付き」レジスタにヤンクする場合は、おそらく最も安全です。

"aY

aレジスタに行をヤンクします。 "apで貼り付けます。

301
dash-tom-bang

ヤンクした行はまだレジスタ0にあるはずです。

"0p

行を貼り付ける(必要に応じて削除する)

169
mb14

すべてのヤンクおよび削除操作は、デフォルトで名前のないレジスタに書き込みます。ただし、最新のヤンクと最新の削除は常に番号付きレジスタに(別々に)格納されます。 レジスタ0は、最新のyankを保持します。レジスタ1-9は、最新の9個の削除を保持します(1が最新です)。

つまり、a deleteは、名前のないレジスタの最新のヤンクを上書きしますが、0レジスタに残っています。ブラックホール-他の回答で言及されているレジスタトリック("_dd)は、名前のないレジスタの上書きを防ぐため機能しますが、必ずしも必要ではありません。

二重引用符を使用してレジスタを参照するため、最後にヤンクしたテキストを次のように貼り付けることができます。

"0p

これは優れたリファレンスです。

84
Wayne Burkett

別の可能性は次のとおりです。

通常のように線を引きます

それらを貼り付けたい場所に行き、視覚的なラインモードに入ります(V

置換する行を選択します

pを押して、行を貼り付けます。

これには、バッファが置き換えられたコンテンツと「スワップ」されるという追加の利点もあります

39
knittl

次のマッピングを使用して、ブラックホールレジスタへの削除を少し簡単にします。

nnoremap R "_d

このようにして、ddRdになり、d$R$になります。 Rは通常、置換モードに入るようにバインドされていることに注意してください。しかし、私はそれを使用したことがないため、「本当に削除」機能のキーを覚えるのが最も簡単でした。

23
Jörn Horstmann
" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp
8
Pencilcheck

このプラグイン(yankstack.vim) と書いて、この問題を解決しました。 Emacsのキルリング vimのようなものを提供します。複数の項目をヤンクまたは削除し、貼り付けてから、ヤンク/キルされたテキストの履歴を前後に切り替えることができます。どんなレジスターをヤンクしたかを覚えるよりも簡単です。

.vimrcには、次のマッピングがあります。

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste

aLT-pまたはALT-SHIFT-pを押すと、貼り付け履歴が前後に切り替わります。

5
max

具体的な質問、質問どおり、最後の2つのステップの順序を入れ替えることはできませんでしたか?

  • ヤンク線(同じ
  • 新しい場所に移動(same
  • ヤンク線を貼り付けます(ステップ4でした
  • 不要な行を削除します(ステップ

確かに、私は通常、この種のことに対して名前付きレジスタを使用しますが、解決策は最初に思い浮かぶものよりも簡単な場合があります。

4
Dan

次のレジスタを使用できます:"<register><command>

例えば。:

これは、行をレジスタaにヤンクし、別の行を削除してから、レジスタaを貼り付けます。

"ayy` (move) `dd"aP
1
DarkDust

これらの重要なコンボはすべて面倒です。代わりに、削除操作からバッファーを上書きするvimの「副作用」動作のオンとオフを切り替える関数を作成しました。そうすれば、それをオフに切り替え、自由に削除し、完了したら再びオンに切り替えることができます。

ここで私の答えを参照してください: https://stackoverflow.com/a/12649560/778118

使用するには、.vimrcに置くだけです

1
Magnus

また、次のスクリプトを試すこともできます。 ReplaceWithRegister at vim.org/scripts/

1
dmedvinsky

悪意のあるユーザーであれば、Xを再マッピングして「_d」と同等の処理を行うことを検討できます。ただし、実装を完成させるのは少し厄介でした。それにもかかわらず、

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

非常にうまく統合します。たとえば、XXと入力するとddと同様に機能し、X $とd $、X0とd0などが機能します。

どのように機能するかについて興味がある場合は、「95」は「_レジスタ」を表します。したがって、「_が押されたレジスタであるかのように、コールを削除するようにルーティングし直すだけです。

0
RussellStewart

秘Theは、何かをつかんで移動したいということを知っていて、「怠 'な」最初のレジスターを使用していることです(削除したばかりのものに置き換えられます)。

Vimで「カット」することを学ぶ必要があります。

削除する前に、"以外のレジスタを指定してください。ヒント::regを使用してレジスタをチェックアウトします

ここで、コマンドの前に"を押して新しいレジスターを選択します(明らかにコマンドモードで)

  1. 「カット」するものを選択します(または手順2で範囲を指定します)
  2. レジスタを任意のものに変更し(ここで1)、削除します:"1dまたは"1xまたはさらに"1c
  3. 新しい場所に行き、さらに削除する
  4. これで、カットしてレジスタ1に保存したものを貼り付ける準備ができました。"1pまたは"1P

できた。これには、ユースケースを解決するという利点もあります:1つの場所から5つの異なるものを削除し、各ピースが異なる宛先に移動します... "1に別のものを置き、"2に別のものを配置します...各宛先に移動して貼り付けます。

0
gcb