Vim diffのブロック全体ではなく、行のみをdpまたは実行する方法は?


28

現在、MacVim(Snapshot 64)の[Split Diff by ...]メニューオプションを使用しています。

このファイルはsettings.py、バージョン1.3.1からDjangoのバージョン1.4までの新しいファイルです。

スクリーンショット

私は2つの基本的なコマンドを知っています

  1. do 反対側からブロックを「取得」(および置換)します。
  2. dp ブロックを反対側に「配置」(および置換)します。

しかし、これらの2つのコマンドはブロック全体を書き込みます。これはMacVimでは紫色のハイライトです。

あなたは第二ブロックを見れば、あなたはライン2から3のみが異なる2つの単語を持っていることがわかりますmysitehobbes3。ブロック全体ではなく、行ごとに置き換えたいだけです。

では、ブロック全体に対抗するためにdo doおよびdplineごとに置き換えるコマンドはありますか、それとも手動で入力する必要がありますか?

ボーナスの質問:ブロックを手動で編集すると、紫色の強調表示が失われることに気付きました。ファイルを再度開かずにハイライトを含めるために、diffを再度「リフレッシュ」するにはどうすればよいですか?

MacVim固有のものとは反対に、Vimの一般的な回答を維持するようにしてください。

回答:


30

これを行うにはいくつかの方法があります。

  1. ソースバッファから取得する宛先バッファ内の行の範囲を選択して使用します:diffget。たとえば、を使用して行の範囲を視覚的に選択しV、を入力でき:diffgetます。
  2. 宛先バッファに配置するソースバッファ内の行の範囲を選択して使用します:diffput。たとえば、現在の行を他のバッファーに入れるには、と入力し:.diffputます。
  3. ヤンクを使用して配置します。コピー先バッファにコピーするソースバッファ内の行の範囲を選択し、を使用してそれらをヤンクしY、カーソルをコピー先バッファに移動し、pまたはで必要な場所に配置し、不要なP行を削除します。
  4. 上記のようにヤンクしますが、宛先バッファーで、置換する行の範囲(必ずしも同じ行数である必要はありません)を視覚的に選択し、を入力し"0pます。これは、常に最新のヤンクのテキストを含む0(ゼロ)レジスタを使用します。

ディスプレイを「更新」して適切な強調表示を表示するには、:diffupdateまたはを実行します:diffu。それだけでは不十分な場合があり、リフレッシュを完了するにはカーソルを他のウィンドウに移動する必要があります。

diffのコピーの詳細については、

:help copy-diffs

3

また、差分中の特定の瞬間に1行を変更したかったのです。そこで、簡単なマップを作成し、vimrcファイルに入れました。

nnoremap <silent> <leader>dp V:diffput<cr>
nnoremap <silent> <leader>dg V:diffget<cr>

dgの代わりにdoを使用できますが、[o] btainの代わりに「diffget」を考えることに慣れています。

ボーナスとして、もう1つの単純なマップを2回使用します。

nnoremap <silent> <leader>df :call DiffToggle()<CR>

これで、dfはdiffmodeをオフ/オンにするので、オフにしてから再びオンにします。

ボーナスオプションは追加することです

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr>

これにより、他のファイル/ウィンドウのタイプミスや不要な変更を元に戻すことができます。これは、uのみの:undoが現在のウィンドウの変更のみを元に戻すためです。

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