git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] git.el: Diff only file at point by default

From
David Kågedal <davidk@lysator.liu.se>
Date
Aug 22, 2008, 07:58 UTC
Message-ID
<87vdxtpjkd.fsf@lysator.liu.se>
Use prefix (C-u) to diff all marked files instead.
Signed-off-by: David Kågedal <davidk@lysator.liu.se>
---
 contrib/emacs/git.el |   13 +++++++++----
 1 files changed, 9 insertions(+), 4 deletions(-)

For anyone who has used pcvs (or dsvn) this makes much more sense. The typical usage scenario is that you want to mark the files that are relevant, and you do it incrementally by checking if file A is relevant and has no strange changes by pressing = and then marking it, proceeding to check file B by pressing = on it and potentially marking it as well and so on.

The current way that = works means that you have to check each file first and remember which one you want to mark. Or diff everything and then read through the whole diff and find match the output against the files to mark. It is possible to do it like that as well, but it is much more convenient to do it as described above, and there is a strong precedent in emacs frontends to make the diff command only diff the current file by default.

The old behaviour can be restored by using C-u =.
diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el
index c30d20a..a3477a4 100644
--- a/contrib/emacs/git.el
+++ b/contrib/emacs/git.el
@@ -772,6 +772,11 @@ Return the list of files that haven't been handled."
               (setq file (pop files))
             (setq node (ewoc-next status node))))))))
 
+(defun git-current-file ()
+  "Return the file at point."
+  (unless git-status (error "Not in git-status buffer."))
+  (ewoc-data (ewoc-locate git-status)))
+
 (defun git-marked-files ()
   "Return a list of all marked files, or if none a list containing just the file at cursor position."
   (unless git-status (error "Not in git-status buffer."))
@@ -1138,10 +1143,10 @@ Return the list of files that haven't been handled."
   (when (eq (window-buffer) (current-buffer))
     (shrink-window-if-larger-than-buffer)))
 
-(defun git-diff-file ()
-  "Diff the marked file(s) against HEAD."
-  (interactive)
-  (let ((files (git-marked-files)))
+(defun git-diff-file (arg)
+  "Diff the marked file(s) against HEAD, or the marked files if a prefix arg is given."
+  (interactive "P")
+  (let ((files (if arg (git-marked-files) (list (git-current-file)))))
     (git-setup-diff-buffer
      (apply #'git-run-command-buffer "*git-diff*" "diff-index" "-p" "-M" "HEAD" "--" (git-get-filenames files)))))
 
-- 
1.6.0.rc2.7.gbf8a


-- 
David Kågedal
Next: Junio C Hamano
Message 1 of 7 in “git.el: Diff only file at point by default”
  1. git.el: Diff only file at point by defaultDavid Kågedal, Aug 22, 2008
  2. Junio C HamanoAug 24, 2008
  3. Alexandre JulliardAug 25, 2008
  4. David KågedalAug 25, 2008
  5. git.el: Diff only file at point by defaultDavid Kågedal, Aug 26, 2008
  6. Junio C HamanoAug 27, 2008
  7. Alexandre JulliardAug 30, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.