neovim+diffchar.vimでgitコンフリクト解消時に単語の差分も見れるようにする


概要

gitのマージツールをneovimにしていたのだが、デフォルトのままだと単語ごとの差分が表示されないため、csvなどのマージの際にコンフリクトした箇所をわざわざ違うdiffツールを使って差分を確認するなどの面倒な作業が発生していた。

これが不便だったので、diffchar.vimを使って、単語ごとの差分を出すようにした。

環境

OS

macOS High Sierra 10.13.6

neovim

NVIM v0.2.2
Build type: Release
LuaJIT 2.0.5
Compilation: /usr/local/Homebrew/Library/Homebrew/shims/super/clang -Wconversion -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -DNDEBUG -DMIN_LOG_LEVEL=3 -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wimplicit-fallthrough -Wvla -fstack-protector-strong -fdiagnostics-color=auto -DINCLUDE_GENERATED_DECLARATIONS -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/build/config -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/src -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/include -I/usr/local/opt/gettext/include -I/usr/include -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/build/src/nvim/auto -I/tmp/neovim-20180209-92407-udkzoo/neovim-0.2.2/build/include
Compiled by [email protected]

Features: +acl +iconv +jemalloc +tui
See ":help feature-compile"

      システム vimrc: "$VIM/sysinit.vim"
       省略時の $VIM: "/usr/local/Cellar/neovim/0.2.2_1/share/nvim"

Run :checkhealth for more info

git

git version 2.17.0

導入手順

diffchar.vimをインストール

プラグインマネージャーを使うのが楽。
自分の場合はdeinを使用。

dein.toml
[[plugins]]
repo = 'rickhowe/diffchar.vim'

diffchar.vimの設定

ドキュメントを参考にdiff表示の設定。
自分は以下のように設定。

init.vim
let g:DiffUnit = 'Char' " any single character
let g:DiffColors = 3 " 16 colors in fixed order

gitconfigの設定

以下のコマンドでgitconfigを編集

git config --global --edit
[merge]
  tool = nvim
[mergetool "nvim"]
  cmd = nvim -c '2wincmd w | diffthis | 3wincmd w | diffthis | 1wincmd w | wincmd J' -O $MERGED $LOCAL $REMOTE

$LOCALペインと$REMOTEペインをdiffモードで比較し、$MERGEDペインを下部に移動している。
まわりくどいように思えるが、こうすることで$MERGEDペインをdiffモードに入れずに表示することができる。

結果

単語ごとの差分が表示されるようになった!

参考

2018/9/9追記

こちら@rickhowe さんに

cmd = nvim -d \"$LOCAL\" \"$REMOTE\" \"$MERGED\" -c '2 wincmd l | wincmd J | wincmd k'

だと、$MERGEDのペインもdiffモードで比較されてしまうので、よくないとのことで改良案をいただいたのでそちらのコマンドに変更しました。
ありがとうございます。