tl;dr
以下のシェルスクリプトをvdiff
みたいな名前でパスの通ったところにおいて実行権限をつければ使える。
#!/bin/bash # -*- shell-script -*- tmpdir=$(mktemp -d /tmp/emacs-vdiff.XXXXX) emacs -Q --eval "(progn (setq user-emacs-directory \"${tmpdir}/\") (package-refresh-contents) (package-install 'vdiff) (require 'vdiff) (define-key vdiff-3way-mode-map (kbd \"C-c\") vdiff-mode-prefix-map) (vdiff-files3 \"$1\" \"$2\" \"$3\"))" rm -rf $tmpdir # C-c n/p move cursor to next/previous hunk # C-c s sends current hunk to other files # C-c r receives from other files to current hunk # C-c w write changes to files
背景とか
dotfilesを3wayマージしたかった
最近dotfilesをchezmoiで管理し始めた。golangのテンプレートエンジンが使え、環境間の差異をいい感じに区別しながら一つのリポジトリで管理できるのが便利に感じている。
(私のdotfilesはここ。ユーザー名/dotfiles
というリポジトリにすればGitHubのCodespacesで自動的に読み込むようにも設定できてよい)
リポジトリの内容と今の環境の差分を3wayマージする機能(chezmoi merge
があるが、それにはvimdiffもしくはそれに類する、引数に3ファイル指定できる何かが必要だった。
スクリプトの中身
vimdiffは入れてないがemacsは入ってる。vimdiffの操作方法わからんがemacsならわかるので、vimdiff alternativeをemacsで実現した。
やってることは
- /tmpにemacs-vdiffのtmpディレクトリを作り
- そこをemacsのユーザーディレクトリ(
~/.emacs.d
の代わり)としてemacsを起動-Q
を指定してデフォルトの設定を読まないようにしている
- emacs-vdiff をインストール
C-c
をvdiff 3wayモードのプレフィックスに指定- スクリプトの引数3つを指定してvdiffを起動
- 終わったらtmpディレクトリを消す
と、ここまで書いてみてまだ修正の余地がありそう。気が向いたら更新する
- TODO 引数の数に応じて呼び出す関数を変える
- TODO 毎回パッケージをインストールしなくてもいいよな…