無職です。はたらいてます。 旧ブログ: 1 Entry per Day

日本語の文字単位diffオプションをgit aliasに設定する

まとめ

  • ある正規表現を指定することで、日本語文章のdiffを文字単位で見れるようにできる
  • それをgit aliasに設定したかったけど、正規表現エスケープ周りでうまくいかなかった
  • スクリプトファイル化したものをgit aliasで実行することで解決した

日本語を文字単位でdiffを見るいい感じの方法

gitで日本語の文章を扱っていると、行ではなく文字単位でdiffが見たかったりする。

そういう場合、↓の記事で紹介されているdiffのオプションがとても便利で重宝しています。

skoji.jp

git diff --word-diff=color --word-diff-regex=$'[^\x80-\xbf][\x80-\xbf]*' またはショートハンドで git diff --color-words=$'[^\x80-\xbf][\x80-\xbf]*' と実行すると、空白文字は無視して文字単位での挿入・削除だけが表示できる。

例えば簡単な例で、 id:mstsskJSer.infoさんに出したtypo修正のdiffで試してみると、次のように削除した文字列と追加した文字列だけがインラインで表示できている。

f:id:mstssk:20210819234353p:plain

ただgit aliasに設定するとエラー

これをgit aliasとして .gitconfig に次のように設定し git diffrgit showr <commit> のように簡単に実行したかったが、この書き方では正規表現が問題になるらしく実行時にbad configエラーが発生してしまった。

[alias]
    diffr = diff --color-words=$'[^\x80-\xbf][\x80-\xbf]*'
    showr = show --color-words=$'[^\x80-\xbf][\x80-\xbf]*'

頑張ってエスケープしようとしたが、通るやり方を結局見つけられなかった。 普通のaliasでやる方法もあるが、個人的にはgitのaliasとして設定しておきたい。

同じことで悩んだ方の記事: Git Diff で日本語の文章も綺麗に差分を出す - Neo's World

しばらくは diffr = diff --color-words="[^€-¿][€-¿]*" という正規表現を使わない設定の仕方で回避していたが、これは正規表現から文字の実態に置き換える時に盛大に間違えていて、動作したりしなかったりの駄目な設定だった。

外部のシェルスクリプトとして実行してしまえばいい!

どうにかならんもんかと最近あらためて見直したところ、git aliasなんだから外部化してしまえばええやん、と思い至った。

git aliasは ! を先頭につける書き方をすると任意の外部コマンドやシェルスクリプトを実行できるので、やりたいことをシェルスクリプトにしてそれを呼び出す様にしてしまえばいい。 むかーし自分の過去blogにも書いていたやり方だったのに、すっかり忘れていた。

mstssk.blogspot.com

というわけで、次のような感じに設定してうまくいきました。

~/.gitconfig

[alias]
    diffr = !~/path-to-shell-dir/git-color-words.sh diff
    showr = !~/path-to-shell-dir/git-color-words.sh show

git-color-words.sh

#!/bin/bash

cmd=$1
shift
git $cmd --color-words=$'[^\x80-\xbf][\x80-\xbf]*' $*

前述のファイル内容はサンプルで、実例はdotfilesリポジトリを適当に参照してください。

github.com