Vimにテキストを登録せずに削除する方法はありますか?


470

Vimを使用して、コードのブロックを、先ほどヤンクしたブロックに置き換えたいことがよくあります。

しかし、置き換えられるコードのブロックを削除すると、そのブロック自体がレジスターに入り、先ほどヤンクしたブロックを消去します。だから私はヤンクして、挿入してから不要なものを削除する習慣を持っていますが、コードのブロックが大きいと、挿入したブロックと削除するブロックを別々にしておくのが面倒になります。

それでは、Vimでテキストを置き換える最も滑らかで迅速な方法は何ですか?

  • レジスタに入れずにテキストを削除する方法はありますか?
  • 「次の単語を置換する」または「次の段落まで置換する」などと言う方法はありますか
  • または、どうにかして複数レジスタ機能を使用するための最良の方法は何ですか?

1
vim-easyclip(github.com/svermeulen/vim-easyclip)は、この正確な問題に対処するように設計されています
Steve Vermeulen

1
私は無意識のうちに(当時は)あなたの実際の問題の複製を質問しましたが、タイトルの質問はそれほどではありませんでした。TL; DR- viwpwordの場合)使用してヤンクしたものに置き換えます。
OJFord 2015

回答:


429

レジスタに保存せずに何かを削除するには、「ブラックホールレジスタ」を使用できます。

"_d

もちろん、興味のあるものを保持していない他のレジスタを使用することもできます。


4
最初は、このコマンドが正しく機能していないと思いました。その後、私はアメリカンキーボードの「デッドキー」バージョンを使用していることに気付きました。このキーボードレイアウトでは、入力する必要があり"<space>_dます。。スペースは、実際に」と入力するのに必要とされる
セバスティアンGrignoli

4
空の行だけで選択的にこれを行うことについてのアイデアはありますか?(dd空行の場合はブラックホールに入り、それ以外はdd通常のようになります)。
Jonathan Dumaine、2013年

6
1つの文字を削除するには、試してみてください"_x
kenorb

54
これは、標準のテキストエディタが勝つ分野の1つです。削除キーを押すだけです。
Vince Panuccio 2013

22
yyまたは '3yy'(または何でも)で何かをヤンクして、名前のないレジスターだけでなく0にも入れることができます。その後に"0p使用しdたにもかかわらず、それをで貼り付け続けることができます。
Halfgaar

102

うん。最初に「古い」テキストを削除するよりも少し複雑ですが、次のようになります。

最初に..

line1
line2
line3
line4

old1
old2
old3
old4

I shift+ vライン1、ライン2、3と4を選択し、それらを削除するdコマンド

次に、同じ方法で古い1〜4行を削除します。

次に、

"2p

最後から2番目にヤンクした行(1〜4行目)を貼り付けます。"3p最後から3番目を行う、など

だから私は

line1
line2
line3
line4

参照: 番号付きレジスタに関するVimドキュメント


<Shift-v>で行を選択すると、ddではなくdだけで行を削除します
Heikki Naski

31
1〜9は削除に使用できます。。最後に貼り付けるには、本当にそれはあなたが最初に何か他のものを交換しようとする何かをヤンク場合に便利だあなたは」0Pを使用する必要があります(「Y」で)ヤンクが、その後何か他のものは、デフォルトのペーストレジスタが上書きされます。
ラファエル・デ・F.をフェレイラ

より高度な元に戻す機能については、Gundo(グラフィカルな元に戻す)スクリプトを確認しください。
ルミ

@ RafaeldeF.Ferreira:あなたのコメントはこの質問への回答ではありませんが、それはおそらく、OPが最初に質問をする原因となった実際の問題をおそらく解決します。私にとっては、それが本当の問題でした。
0xc0de

76

VIM docs:コマンドが["x]で別のレジスタを指定していない限り、番号付きレジスタ0には最新のyankコマンドからのテキストが含まれます。

たとえば、「foo」をヤンクして「bar」を削除します-レジストリ0にはまだ「foo」が含まれています!したがって、「foo」は以下を使用して貼り付けることができます"0p


53

現在の選択をバッファに置き換えることができる簡単なマッピングがあると便利です。

たとえば、これを.vimrcに入れると

vmap r "_dP       // it's a capital 'p' on the end

次に、何かをレジスターにコピーした後(つまり、「y」を使用)、置換するテキストを選択し、キーボードの「r」を押すだけです。選択は現在のレジスタに置き換えられます。

説明:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

1
より高度なバージョンについては、stackoverflow.com
questions / 290465 /…を

使用したいvmap <C-P> "_dP
ハリー・リー

7
選択範囲を削除せずにテキストを置くだけです。たとえばVp、現在の行をすぐにヤンクした行に置き換えます。
ボビー・マリノフ2015年

このソリューションはd、削除によく使用されるという問題を修正しません。
Victor Yarema

35

私は私のvimrcに以下を入れました:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

これで、クリップボードレジスターをヤンクしてそこから追加しました。デフォルトレジスターで何が起こるかを気にする必要はありません。追加の利点は、最小限の手間で他のアプリから貼り付けることができることです。一部の機能が失われていることはわかっていますが、とにかく複数のレジスタ/クリップボードを追跡することはできません。


6
これらすべてのリマップの代わりに、set clipboard=unnamedまたはset clipboard=unnamedplusを使用して、デフォルトのクリップボードをそれぞれ*またはに変更することもできます+
スティーブ

5
@Steveこれを行うと、dは最後のヤンクをクリップボードレジスタにも上書きします。これは、質問が回避しようとしていることです。
79E09796 2013年

1
@ 79E09796、私はそれがそうであると示唆するつもりはありませんでした。私は元の質問ではなく、この答えについてコメントしていました。
Steve

1
これらを.vimrcに入れましたが、現在、ヤンクは機能しません。なぜか?
tba 2016

2
@tbaは、noremapをnnoremap(2つのn)に置き換えれば、正常に動作するはずです。
2016年

24

あなたが与えた特定の例について、私が質問を理解すれば、これはうまくいくかもしれません:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

6
これは、複数の選択範囲に貼り付けたい場合を除き、うまく機能します。

23

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

言い換えると、削除は名前のないレジスターの最新のヤンクを上書きしますが、それはまだ0レジスターにあります。"_dd他の回答で述べたブラックホールレジスタトリック()は、名前のないレジスタの上書きを防ぐため機能しますが、必須ではありません。

二重引用符を使用してレジスターを参照するため、直近にヤンクされたテキストの貼り付けは次のように実行できます。

"0p

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


16

EBGreenの発言を強調するに

テキストを選択して貼り付けると、選択したテキストが貼り付けたテキストに置き換わります。

テキストをコピーして複数の場所に貼り付ける場合は、を使用"0pして貼り付けます。番号付きレジスター0には、最新のyankコマンドからのテキストが含まれています。


また、すべてのレジスターの内容をリストすることができます。

:registers

このコマンドを使用すると、dbr's answerのようなことをするときに必要なレジスターを簡単に見つけることができます。/、%、#レジスタも表示されます。(も参照:help registers


そして最後に、末尾のスペースを含む単語と含まない単語をチェックアウトcWcWて変更します。(大文字の使用にWは句読点が含まれます。)


10

Vimを使用している場合は、選択に似たビジュアルモードが表示されますが、分離モードではvi / vimの基礎となります。

やりたいことは、ビジュアルモードを使用してソースを選択し、次にヤンクし、ビジュアルモードを再度使用して宛先のスコープを選択し、デフォルトのバッファーからテキストに貼り付けます。

例:

テキストファイルで:

1 | qwer
2 | asdf
3 | zxcv
4 | ポイウ

次のシーケンスで:ggVjyGVkpあなたは次で終わるでしょう:

1 | qwer
2 | asdf
3 | クワー
4 | asdf

説明:

  • gg:最初の行に移動
  • V:行全体でビジュアルモードを開始
  • j:1行下に移動(前の行から選択を開始すると、選択が1行下に拡大します)
  • y:デフォルトのバッファにヤンクします(選択された2つの行、および自動的にビジュアルモードを終了します)
  • G:最後の行に移動
  • V:ビジュアルモードを開始(以前と同じ)
  • k:1行上に移動します(以前と同様に、ビジュアルモードを有効にすると、選択が1行上に拡大します)。
  • p:貼り付け(最後の2行を選択すると、それらの行がバッファーにあるものに置き換えられます-この場合、最初の2行)

これは、最後のブロックをバッファに置くという少し不便な点があるため、同じものを繰り返し貼り付けるのはどういうわけか望ましくないので、"ay(「a」というバッファに) 「)とのようなものを貼り付ける"ap(しかし、あなたは、あなたはおそらく数回を貼り付けたが、右?関数を作成し、それを呼び出すようにしているプログラミングをしたくない場合は権利を?)。

viのみを使用している場合は、ビジュアルモードの代わりに非表示のマークを使用する必要があります。:he markこれについては、申し訳ありませんが、この非表示のマークはあまり得意ではありません。ビジュアルモードでかなり汚染されています。


10

「単語を置き換える」にはcw、通常モードで試してください。

「段落を置き換える」にはcap、通常モードで試してください。


1
「次の段落まで置き換える」にはc}、通常モードで試してください。
jabirali 2010

なぜ「キャップ」がこれを行うのですか?「a」と「p」は「append」と「paste」を表していないのですか?
WiSaGaN 2013年

2
@WiSaGaN "ap"は "a段落"を意味します:vimhelp.appspot.com/motion.txt.html#object-select
Swaroop CH

9

怠惰なもののための最小限の侵襲的ソリューション:

レジスターには0常に最後のヤンクが含まれます(Rafaelalex2k8、およびidbriiはすでに述べたように)。残念ながら0、常にレジスタを選択するのは非常に煩わしいので、デフォルトでp使用すると便利"0です。これは、次の行をに入れることで実現できます.vimrc

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

最初の行は、各pストロークをにマップし"0pます。ただし、これによりp他のレジスタにアクセスできなくなります。したがってp、明示的に選択されたレジスタを持つすべてのストロークは、forループ内の同等のコマンドライン式にマップされます。同じことがに対しても行われPます。

このようにして、デフォルトでレジスタを使用する暗黙的pおよびPストロークを除いて、標準の動作が保持さ0れます。

ヒント1:カットコマンドは"0d、単なるではなくになりましたd。しかし、私は怠惰なので、これは私には長すぎます;)したがって、私は次のマッピングを使用しています:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

リーダーキーは\デフォルトであるので、\dまたはを入力して簡単にテキストを切り取ることができます\D

ヒント2:マルチキーマッピングのデフォルトのタイムアウトはかなり短いです。レジスタを選択するときに時間を増やすために、値を大きくすることをお勧めします。詳細:help timeoutlenについては、私が使用しています:

set timeout timeoutlen=3000 ttimeoutlen=100

7

さて、最初にこのコマンドを実行します:

:h d

次に、特定のレジスタに削除できることがわかります。そうすれば、デフォルトレジスタの内容を変更することはありません。


1
["x]d{motion} Delete text that {motion} moves over [into register x]-Vim:h d
Wes Turner

5

私の状況:Normalモードで、xキープレスを使用して文字を削除すると、それらの削除により最新のレジスタが上書きされます- を使用して文字を削除し、最新のレジスタにx何かを貼り付けたい場合は編集が複雑になります(たとえば、同じテキストを2つに貼り付けたり、その他の場所)。

承認された回答("_d)で提案を試しましたが、うまくいきませんでした。

ただし、https://vi.stackexchange.com/questions/122/performing-certain-operations-without-clearing-registerで受け入れられた回答/コメントから、これをmyに追加しましたが~/.vimrc、機能します(Vimを再起動する必要がある場合があります) ):

nnoremap x "_x

つまり、これで通常のヤンク(y)、削除(d)、および貼り付け(p)コマンドを実行できるようにxなり、削除した文字を使用して、最新のレジスタにデータを入力しなくなりました。


4

挿入モードで削除されたテキストは、デフォルトのレジスターには入れられません。


2
ただし、デフォルトモードで大量のテキストを削除するのは遅い
Hamish Downer

3

適切なコンテキストで使用する2つのソリューションは次のとおりです。

  • Vims VISUALモードを使用して置き換えたいものを強調表示し、レジスタを貼り付けます。

私はこれをほとんど習慣から使用しています

yiw   " yank the whole word
viwp  " replace any word with the default register
  • YankRing。このプラグインを使用すると、キーバインディング<ctrl>+<p>を使用して、以前に番号付けされたレジスターを貼り付けたばかりのレジスターに置き換えることができます。

基本的には貼り付けを行いますが、デフォルトのレジスターを上書きしているため、実際に貼り付けたいものが失われていることがわかった場合は<C-P>、YankRingの履歴から検索して置き換えることができます。

それらの1つにはプラグインが必要です...



2

Windowsバージョンでは(おそらくLinuxでも)、システムのコピー/貼り付けバッファーにヤンクでき"*yます(つまり、ヤンクコマンドの前に二重引用符とアスタリスクを付けます)。

次に、置換可能な行を通常どおり削除し、コピーしたテキストをを使用して貼り付けることができます"*p


2

'y'ank、' "_ d'elete、 'y'ank、' p'asteのコマンドを実行するときに、よく間違えます。最後にコピーされたテキストがプッシュされる0レジスタ。


2

emacs-evilユーザーの場合、この機能(evil-paste-pop)は貼り付け後にトリガーでき、kill-ringの以前のエントリを循環します。あなたがそれを<C-p>(Spacemacsのデフォルト)にバインドすると仮定すると、必要なp<C-p>だけ続けてヒットします。


1

Dvorakユーザーにとって非常に便利な方法の1つは、不要なテキストを "_ブラックホールレジスターではなく" 1レジスターに削除することです。これは、同じシフトプレスで "+ 1を押すことができ、1なので高速な小指の動きになるためです" Dvorakのすぐ上のキー(PLUS dはその一方で、コマンド全体を地獄のように高速にします)。

もちろん、「1レジスターは便利なので他の目的で使用することもできますが、テキストを置き換えるよりも一般的な目的がない限り、レジスターのかなりの使い方だと思います。


1

仮想選択を介してテキストを置き換えて貼り付けるときに、名前のないレジスタを上書きしないことに主に関心がある人のために。

簡単で私にとって最も効果的な次のソリューションを使用できます。

xnoremap <expr> p 'pgv"'.v:register.'y'

それはここでの回答(およびコメント)からです: レジスタを上書きせずに貼り付ける方法

最初に選択範囲を通過し、次に新しいテキストを含む選択範囲が再び選択されます(gv)。これで、ビジュアルモードで最後に使用されたレジスター(通常、名前のないレジスターですが、貼り付けに別のレジスターを使用すると、副作用なしで機能します)。そして、新しい値をレジスターに再度ヤンクします。

PS:intellj ideaプラグインvim-simulationでも機能する単純なバリアントが必要な場合は、これを使用できます(欠点:貼り付け用に別のレジスタが指定されていても、名前のないレジスタを上書きします):

vnoremap p pgvy


1

JetBrans IDE(PhpStorm、WebStorm、IntelliJ IDEA)をIdeaVimで使用するユーザー向け。のように再マッピングnnoremap d "_dし、それを使用して行を削除すると問題が発生する場合がありますdd。あなたのための可能な解決策:nnoremap dd "_dd

youtrackに問題があります。投票してください:https ://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363


0

Vimが実用性よりも複雑になりがちな場合があるため、コピー/削除アクションにレジスタを適用することでユーザーに負担がかかります。多くの場合、コピーしたものを貼り付け、削除したものを「忘れる」だけです。

ただし、vimの複雑なレジスタと戦うのではなく、それらをより便利にします。最新の削除を保存する「デフォルト」のレジスタを選択します。たとえば、削除をdレジスタに送信します(アドホックな使用のためにacを開いたままにします。dはニーモニックです):

nnoremap d "dd           "send latest delete to d register
nnoremap D "dD           "send latest delete to d register 
nnoremap dd "ddd         "send latest delete to d register
nnoremap x "_x           "send char deletes to black hole, not worth saving
nnoremap <leader>p "dp   "paste what was deleted
nnoremap <leader>P "dP   "paste what was deleted

このアプローチは、削除がヤンクを破壊することを防ぎますが、削除の登録を失効しません-削除されたものをブラックホールに失う代わりに(受け入れられた回答のように)貼り付けることができます。上記の例では、このリコールは2つのリーダーpマッピングで行われます。このアプローチの利点は、何を貼り付けるかを選択できることです:(a)何がヤンクされたか、または(b)何が削除されたか。


0

レジスター0から9は、ヤンクまたはカットなどの最新のものであり、削除されたものなどは含めないでください。したがって、何かをヤンク/カットした場合、それはレジスター0にも含まれます。それでも、あなたがヤンク/カットした最後のものです。

yiw#デフォルトのレジスターとレジスター0の両方に移動

カーソルがある単語をヤンクします

削除されたものなどはデフォルトのレジスタに行きますが、0は登録されません

標準モード:

"0p#レジスター0の内容を入力

挿入モード:

ctrl-r 0#レジスター0の内容を入力

私はまた、笑いを登録するために常にヤンク/カットした友人がいました。

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