@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

vimdiffの代わりにemacs-vdiffを使う

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 alternativeemacsで実現した。

やってることは

と、ここまで書いてみてまだ修正の余地がありそう。気が向いたら更新する

  • TODO 引数の数に応じて呼び出す関数を変える
  • TODO 毎回パッケージをインストールしなくてもいいよな…
    • ~/.emacs.d/emacs-vdiffみたいなディレクトリに固定して存在すればスキップするかなぁ
    • そういえばホームディレクトリにWSLのホストのディレクトリをマウントしてるのを思い出した
    • 読み込みが遅いからマウントしてない/tmpを選んだんだった
    • でも毎回パッケージインストールしてたらもっと遅いな

参考

github.com

www.chezmoi.io