From aea61b34693f164ced731cf3b0f0e8ee798c342c Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Mon, 3 Nov 2025 16:10:13 -0600 Subject: feat: Upgrade diff-buffer-with-file to ediff and add difftastic for git MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two improvements for better diff experience: 1. **Upgraded cj/diff-buffer-with-file to use ediff** (custom-buffer-file.el) - Replaced basic unified diff with ediff-current-file - Now uses existing ediff config (horizontal split, j/k navigation) - C-; b D now launches interactive ediff instead of text diff - Simplified from 17 lines to 5 lines - Removed TODO comment about difftastic integration 2. **Added difftastic for git diffs** (vc-config.el) - Installed binary: difftastic 0.64.0 via pacman - Added difftastic.el package integrated with magit - Keybindings in magit-diff: - D → difftastic-magit-diff (dwim) - S → difftastic-magit-show - Provides structural, language-aware diffs for git changes - Better visualization of code structure changes **Result:** - Buffer vs file: Interactive ediff (can navigate, merge, revert) - Git history: Structural difftastic (language-aware visualization) - Right tool for each job Serves Method 3: "Make Fixing Emacs Frictionless" - Better diffs = easier debugging and code review Updated todo.org: Method 1 progress 7/13 (was 5/13) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- modules/custom-buffer-file.el | 22 ++++++---------------- modules/vc-config.el | 15 +++++++++++++++ todo.org | 20 +++++++++++++++++--- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/modules/custom-buffer-file.el b/modules/custom-buffer-file.el index 007fbe1a..105ed4ff 100644 --- a/modules/custom-buffer-file.el +++ b/modules/custom-buffer-file.el @@ -252,23 +252,13 @@ Do not save the deleted text in the kill ring." (message "Copied: %s" (buffer-name))) (defun cj/diff-buffer-with-file () - "Compare the current modified buffer with the saved version. -Uses unified diff format (-u) for better readability. -Signal an error if the buffer is not visiting a file. - -TODO: Future integration with difftastic for structural diffs (Method 3)." + "Compare the current modified buffer with the saved version using ediff. +Uses the same ediff configuration from diff-config.el (horizontal split, j/k navigation). +Signal an error if the buffer is not visiting a file." (interactive) - (let ((file-path (buffer-file-name))) - (cond - ((not file-path) - (user-error "Current buffer is not visiting a file")) - ((not (file-exists-p file-path)) - (user-error "File %s does not exist on disk" file-path)) - ((not (buffer-modified-p)) - (message "Buffer has no unsaved changes")) - (t - (let ((diff-switches "-u")) ; unified diff format - (diff-buffer-with-file (current-buffer))))))) + (if (buffer-file-name) + (ediff-current-file) + (user-error "Current buffer is not visiting a file"))) ;; --------------------------- Buffer And File Keymap -------------------------- diff --git a/modules/vc-config.el b/modules/vc-config.el index 21a4380c..b9b61c29 100644 --- a/modules/vc-config.el +++ b/modules/vc-config.el @@ -123,6 +123,21 @@ interactive selection to jump to any changed line in the buffer." (require 'git-gutter) (consult-line "^[+\\-]")) +;; -------------------------------- Difftastic --------------------------------- +;; Structural diffs for better git change visualization + +(use-package difftastic + :demand t + :after magit + :bind (:map magit-blame-read-only-mode-map + ("D" . difftastic-magit-show) + ("S" . difftastic-magit-show)) + :config + (eval-after-load 'magit-diff + '(transient-append-suffix 'magit-diff '(-1 -1) + [("D" "Difftastic diff (dwim)" difftastic-magit-diff) + ("S" "Difftastic show" difftastic-magit-show)]))) + ;; --------------------------------- VC Keymap --------------------------------- ;; Ordering & sorting prefix and keymap diff --git a/todo.org b/todo.org index 10e555b4..d74524e2 100644 --- a/todo.org +++ b/todo.org @@ -17,7 +17,7 @@ If the answer is "no" to all five → DON'T ADD IT. V2MOM is located at: [[file:docs/emacs-config-v2mom.org][emacs-config-v2mom.org]] Research/ideas that don't serve vision: [[file:docs/someday-maybe.org][someday-maybe.org]] -* Method 1: Make Using Emacs Frictionless [5/13] +* Method 1: Make Using Emacs Frictionless [7/13] ** DONE [#A] Remove network check from startup (saves 1+ seconds) CLOSED: [2025-10-31 Fri] @@ -269,9 +269,23 @@ Complex workflow testing capability. Repeatable installs and safe rollbacks. -** TODO [#C] Integrate difftastic (structural diffs) +** DONE [#C] Integrate difftastic (structural diffs) +CLOSED: [2025-11-03 Sun] + +✅ Completed difftastic integration: +1. **Upgraded cj/diff-buffer-with-file to use ediff** (modules/custom-buffer-file.el) + - Replaced basic unified diff with ediff-current-file + - Now uses same ediff config (horizontal split, j/k navigation) + - Keybinding C-; b D now launches interactive ediff + +2. **Added difftastic for git diffs** (modules/vc-config.el) + - Installed binary: difftastic 0.64.0 + - Added difftastic.el package integrated with magit + - Keybindings in magit-diff: D for dwim, S for show + - Provides structural, language-aware diffs for git changes -Structural diffs that show semantic changes. Hook into cj/diff-buffer-with-file. +Result: Better diffs everywhere - ediff for interactive buffer comparison, +difftastic for understanding git changes. * Method 4: Contribute to the Emacs Ecosystem [0/4] -- cgit v1.2.3