web-dev-qa-db-ja.com

Vim diffでブロック全体ではなく、dpだけ、または行だけを実行するにはどうすればよいですか?

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

ファイルはDjangoのmy settings.pyバージョン1.3.1からバージョン1.4の新しいファイルに。

Screenshot

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

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

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

2番目のブロックを見ると、2行目と3行目から、2つの単語だけが異なることがわかります:mysitehobbes3。ブロック全体ではなく行ごとを置き換えたいだけです。

だから置換するコマンドは何ですか do そして dp ブロック全体ではなく、行ごとに手動で入力する必要がありますか?

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

MacVim固有ではなく、Vim全般の回答を保持するようにしてください。

28
hobbes3

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

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

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

差分のコピーについての詳細を読むことができます

:help copy-diffs
31
garyjohn

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

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

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

おまけとして、別の単純なマップを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は、現在のウィンドウの変更のみを元に戻すためです。

4
lucky85dog