branch: elpa/magit
commit 223461b52c35b0f426c053f4c6e7e7637c4a9b73
Author: Jonas Bernoulli <[email protected]>
Commit: Jonas Bernoulli <[email protected]>
magit-format-file-function: New option
Closes #5308.
---
CHANGELOG | 4 ++++
docs/magit.org | 8 ++++++++
docs/magit.texi | 8 ++++++++
lisp/magit-diff.el | 56 +++++++++++++++++++++++++++++++++++++++++++++-------
lisp/magit-status.el | 3 ++-
5 files changed, 71 insertions(+), 8 deletions(-)
diff --git a/CHANGELOG b/CHANGELOG
index 57a2ab052d..0369e9ca5f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
# -*- mode: org -*-
* v4.3.1 UNRELEASED
+- Added new option ~magit-format-file-function,~ and two functions to
+ optionally prefix file names with icons, with the help of either
+ ~all-the-icons~ or ~nerd-icons~. #5308
+
Bugfixes:
- ~magit-commit-revise~ failed if no arguments were used. #5306
diff --git a/docs/magit.org b/docs/magit.org
index 4441ca1bba..23d5373620 100644
--- a/docs/magit.org
+++ b/docs/magit.org
@@ -3476,6 +3476,14 @@ that they are available here too.
allowed here: ~--stat-width~, ~--stat-name-width~,
~--stat-graph-width~ and ~--compact-summary~. Also see [[man:git-diff]]
+- User Option: magit-format-file-function ::
+
+ This function is used to format lines representing a file. It is
+ used for file headings in diffs, in diffstats and for lists of files
+ (such as the untracked files). Depending on the caller, it receives
+ either three or five arguments; the signature has to be ~(kind file
+ face &optional status orig)~. KIND is one of ~diff~, ~stat~ and ~list~.
+
*** Revision Buffer
- User Option: magit-revision-insert-related-refs ::
diff --git a/docs/magit.texi b/docs/magit.texi
index 24f0a425ef..4a547d6c65 100644
--- a/docs/magit.texi
+++ b/docs/magit.texi
@@ -4094,6 +4094,14 @@ the git-diff(1) manpage.
@end iftex
@end defopt
+@defopt magit-format-file-function
+This function is used to format lines representing a file. It is
+used for file headings in diffs, in diffstats and for lists of files
+(such as the untracked files). Depending on the caller, it receives
+either three or five arguments; the signature has to be @code{(kind file
+ face &optional status orig)}. KIND is one of @code{diff}, @code{stat} and
@code{list}.
+@end defopt
+
@anchor{Revision Buffer}
@subsection Revision Buffer
diff --git a/lisp/magit-diff.el b/lisp/magit-diff.el
index 8dc934ac68..5004502972 100644
--- a/lisp/magit-diff.el
+++ b/lisp/magit-diff.el
@@ -85,6 +85,9 @@
(declare-function magit-smerge-keep-base "magit-apply" ())
(declare-function magit-smerge-keep-lower "magit-apply" ())
+(declare-function all-the-icons-icon-for-file "ext:all-the-icons")
+(declare-function nerd-icons-icon-for-file "ext:nerd-icons")
+
(eval-when-compile
(cl-pushnew 'orig-rev eieio--known-slot-names)
(cl-pushnew 'action-type eieio--known-slot-names)
@@ -322,6 +325,21 @@ and `--compact-summary'. See the git-diff(1) manpage."
(list string)
(const :tag "None" nil)))
+(defcustom magit-format-file-function #'magit-format-file-default
+ "Function used to format lines representing a file.
+
+This function is used for file headings in diffs, in diffstats and for
+lists of files (such as the untracked files). Depending on the caller,
+it receives either three or five arguments; the signature has to be
+(kind file face &optional status orig). KIND is one of `diff', `stat'
+and `list'."
+ :package-version '(magit . "4.3.1")
+ :group 'magit-diff
+ :type `(choice (function-item ,#'magit-format-file-default)
+ (function-item ,#'magit-format-file-all-the-icons)
+ (function-item ,#'magit-format-file-nerd-icons)
+ function))
+
;;;; File Diff
(defcustom magit-diff-buffer-file-locked t
@@ -2310,8 +2328,9 @@ section or a child thereof."
(when (> le ld)
(setq sep (concat (make-string (- le ld) ?\s) sep))))
(magit-insert-section (file (pop files))
- (insert (propertize file 'font-lock-face 'magit-filename)
- sep cnt " ")
+ (insert (funcall magit-format-file-function
+ 'stat file 'magit-filename))
+ (insert sep cnt " ")
(when add
(insert (propertize add 'font-lock-face
'magit-diffstat-added)))
@@ -2462,11 +2481,9 @@ section or a child thereof."
:source (and (not (equal orig file)) orig)
:header header
:binary binary)
- (insert (propertize (format "%-10s %s" status
- (if (or (not orig) (equal orig file))
- file
- (format "%s -> %s" orig file)))
- 'font-lock-face 'magit-diff-file-heading))
+ (insert (funcall magit-format-file-function
+ 'diff file 'magit-diff-file-heading status
+ (and (not (equal orig file)) orig)))
(cond ((and binary long-status)
(insert (format " (%s, binary)" long-status)))
((or binary long-status)
@@ -2482,6 +2499,31 @@ section or a child thereof."
(magit-insert-heading)))
(magit-wash-sequence #'magit-diff-wash-hunk)))
+(defun magit-format-file-default (_kind file face &optional status orig)
+ (propertize (concat (and status (format "%-11s" status))
+ (if orig (format "%s -> %s" orig file) file))
+ 'font-lock-face face))
+
+(defun magit-format-file-all-the-icons (_kind file face &optional status orig)
+ (propertize
+ (concat (and status (format "%-11s" status))
+ (if orig
+ (format "%s %s -> %s %s"
+ (all-the-icons-icon-for-file orig) orig
+ (all-the-icons-icon-for-file file) file)
+ (format "%s %s" (all-the-icons-icon-for-file file) file)))
+ 'font-lock-face face))
+
+(defun magit-format-file-nerd-icons (_kind file face &optional status orig)
+ (propertize
+ (concat (and status (format "%-11s" status))
+ (if orig
+ (format "%s %s -> %s %s"
+ (nerd-icons-icon-for-file orig) orig
+ (nerd-icons-icon-for-file file) file)
+ (format "%s %s" (nerd-icons-icon-for-file file) file)))
+ 'font-lock-face face))
+
(defun magit-diff-wash-submodule ()
;; See `show_submodule_summary' in submodule.c and "this" commit.
(when (looking-at "^Submodule \\([^ ]+\\)")
diff --git a/lisp/magit-status.el b/lisp/magit-status.el
index 182130e520..494c940b26 100644
--- a/lisp/magit-status.el
+++ b/lisp/magit-status.el
@@ -812,7 +812,8 @@ Honor the buffer's file filter, which can be set using \"D
- -\"."
(cl-decf limit)
(let ((file (pop files)))
(magit-insert-section (file file)
- (insert (propertize file 'font-lock-face 'magit-filename))
+ (insert (funcall magit-format-file-function
+ 'list file 'magit-filename))
(insert ?\n))))
(when files
(magit-insert-section (info)