513

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

しかし、置き換えられるコードのブロックを削除すると、そのブロック自体がレジスターに入り、ヤンクしたばかりのブロックが消去されます。そのため、不要なものをヤンクして挿入し、削除する習慣がありますが、コードのブロックが大きいと、挿入されたブロックと削除するブロックを別々に保持しようとすると、面倒になります。

では、Vim でテキストを置き換える最もスマートで迅速な方法は何でしょうか?

  • テキストを登録せずに削除する方法はありますか?
  • 「次の単語を置き換える」または「次の段落まで置き換える」などと言う方法はありますか
  • または、マルチレジスタ機能を何らかの形で使用する最良の方法はありますか?
4

29 に答える 29

458

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

"_d

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

于 2008-09-10T15:36:42.830 に答える
104

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

私はから始めます..

line1
line2
line3
line4

old1
old2
old3
old4

I shift+ vline1、line 2、3、および 4 を選択し、dコマンドでそれらを削除します

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

次に、する

"2p

これにより、最後から 2 番目のヤンクされた行 (1 ~ 4 行目) が貼り付けられます。"3pは最後から 3 番目、などを行います。

だから私はで終わる

line1
line2
line3
line4

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

于 2008-09-12T10:36:24.753 に答える
79

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

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

于 2009-02-04T00:07:33.200 に答える
57

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

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

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

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

説明:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste
于 2009-05-28T10:11:00.133 に答える
40

私は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

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

于 2009-08-17T20:27:40.030 に答える
24

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

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)
于 2008-09-10T14:52:33.890 に答える
16

EBGreen の発言を強調するには:

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

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


また、すべてのレジスタの内容を一覧表示できます。

:registers

このコマンドを使用すると、 dbr の answer のようなことを行うときに、必要なレジスタを簡単に把握できます。/,%,# レジスタも表示されます。( も参照:help registers)


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

于 2010-04-01T01:45:02.013 に答える
10

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

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

例:

次のテキストファイルの場合:

1 | qwer
2 | asdf
3 | zxcv
4 | poiu

次のシーケンスでggVjyGVkp終了します:で終わります:

1 | qwer
2 | asdf
3 | qewr
4 | asdf

説明:

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

これには、最後のブロックをバッファに配置するという少し不便な点があるため、同じものを繰り返し貼り付けることは望ましくないため、ソースを次のような名前のバッファに保存する必要があります"ay(「a」という名前のバッファに")そして次のようなもので貼り付け"apます(ただし、プログラミングしている場合は、おそらく何度も貼り付けるのではなく、関数を作成して呼び出す必要がありますよね?そうですか?)。

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

于 2008-09-10T15:34:03.757 に答える
10

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

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

于 2008-09-12T10:15:57.017 に答える
7

まず、次のコマンドを実行します。

:h d

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

于 2008-09-10T14:49:56.483 に答える
6

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

受け入れられた回答 ( ) の提案を試しました"_dが、うまくいきませんでした。

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

nnoremap x "_x

つまり、通常の yank ( y)、delete ( d)、paste ( p) コマンドを実行できるようになり、削除した文字はx最新のレジスタに入力されなくなりました。

于 2018-12-20T16:56:32.540 に答える
4

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

于 2008-09-11T10:05:01.373 に答える
3

あなたの目的に非常に役立つマッピングを見つけました:

xnoremap p "_dP

削除されたテキストは「ブラック ホール レジスタ」に格納され、ヤンクされたテキストが残ります。

ソース: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

于 2015-02-25T18:04:00.800 に答える
3

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

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

2番目の解決策をずっと後で見つけただけなので、私はこれをほとんど習慣から使用しています。

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

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

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

于 2011-03-20T19:04:34.963 に答える
2

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

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

于 2008-09-15T13:41:05.377 に答える
2

私はしばしば、「y」ank してから「_d」でブラック ホールに削除し、次に「p」するというコマンドに従うときに間違いを犯します。最後にコピーされたテキストがプッシュされる場所である 0 レジスタ。

于 2009-10-12T17:23:41.900 に答える
2

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

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

于 2011-12-16T11:46:37.127 に答える
1

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

簡単で私に最適な次のソリューションを使用できます。

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

ここの回答(およびコメント)からです: 登録を上書きせずに貼り付ける方法

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

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

vnoremap p pgvy

于 2018-05-19T10:09:15.243 に答える
1

次の vscode 設定により、たとえば dd と dw が "_dd と "_dw になり、リマッパーで正しく機能するようになります。

{
     "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": ["d"],
            "after": [ "\"", "_", "d" ]
        }
    ]
}
于 2020-07-17T10:21:21.973 に答える
0

主な問題はp、ビジュアル モードで使用することです。次の関数は、ビジュアル モードで何かを貼り付けた後、名前のないレジスタの内容を回復します。

 function! MyPaste(ex)
  let save_reg = @"
  let reg = v:register
  let l:count = v:count1
  let save_map = maparg('_', 'v', 0, 1)
  exec 'vnoremap _ '.a:ex
  exec 'normal gv"'.reg.l:count.'_'
  call mapset('v', 0, save_map)
  let @" = save_reg
endfunction

vmap p :<c-u>call MyPaste('p')<cr>
vmap P :<c-u>call MyPaste('P')<cr>

使い方は以前と同じで、レジスタ " の内容は変更されていません。

于 2020-11-02T07:00:11.757 に答える
0

以下を使用して簡単なマクロを作成できます。 q"_dwq

レジスタを上書きせずに次の単語を削除するには、次を使用できます@d

于 2020-10-25T21:41:32.723 に答える