summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThanosApollo <[email protected]>2022-11-21 22:12:17 +0200
committerThanosApollo <[email protected]>2022-11-21 22:12:17 +0200
commitfcd1dc50007d286ed479b3267080a33fd60ab555 (patch)
treecb91a72daba2409adec7a70cf99a7534768b9a30
parent1f9d4c98a8b7b752893ca18c34d2a19c4b8e9814 (diff)
Add all-the-icons-dired.el
-rw-r--r--.emacs.d/lisp/all-the-icons-dired.el106
1 files changed, 106 insertions, 0 deletions
diff --git a/.emacs.d/lisp/all-the-icons-dired.el b/.emacs.d/lisp/all-the-icons-dired.el
new file mode 100644
index 0000000..babaff5
--- /dev/null
+++ b/.emacs.d/lisp/all-the-icons-dired.el
@@ -0,0 +1,106 @@
+;;; all-the-icons-dired.el --- Shows icons for each file in dired mode -*- lexical-binding: t; -*-
+
+
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'dired)
+(require 'all-the-icons)
+
+(defface all-the-icons-dired-dir-face
+ '((((background dark)) :foreground "white")
+ (((background light)) :foreground "black"))
+ "Face for the directory icon"
+ :group 'all-the-icons-faces)
+
+(defcustom all-the-icons-dired-v-adjust 0.01
+ "The default vertical adjustment of the icon in the dired buffer."
+ :group 'all-the-icons
+ :type 'number)
+
+(defvar all-the-icons-dired-mode)
+
+(defun all-the-icons-dired--add-overlay (pos string)
+ "Add overlay to display STRING at POS."
+ (let ((ov (make-overlay (1- pos) pos)))
+ (overlay-put ov 'all-the-icons-dired-overlay t)
+ (overlay-put ov 'after-string string)))
+
+(defun all-the-icons-dired--overlays-in (beg end)
+ "Get all all-the-icons-dired overlays between BEG to END."
+ (cl-remove-if-not
+ (lambda (ov)
+ (overlay-get ov 'all-the-icons-dired-overlay))
+ (overlays-in beg end)))
+
+(defun all-the-icons-dired--overlays-at (pos)
+ "Get all-the-icons-dired overlays at POS."
+ (apply #'all-the-icons-dired--overlays-in `(,pos ,pos)))
+
+(defun all-the-icons-dired--remove-all-overlays ()
+ "Remove all `all-the-icons-dired' overlays."
+ (save-restriction
+ (widen)
+ (mapc #'delete-overlay
+ (all-the-icons-dired--overlays-in (point-min) (point-max)))))
+
+(defun all-the-icons-dired--refresh ()
+ "Display the icons of files in a dired buffer."
+ (all-the-icons-dired--remove-all-overlays)
+ (save-excursion
+ (goto-char (point-min))
+ (while (not (eobp))
+ (when (dired-move-to-filename nil)
+ (let ((file (dired-get-filename 'relative 'noerror)))
+ (when file
+ (let ((icon (if (file-directory-p file)
+ (all-the-icons-icon-for-dir file
+ :face 'all-the-icons-dired-dir-face
+ :v-adjust all-the-icons-dired-v-adjust)
+ (all-the-icons-icon-for-file file :v-adjust all-the-icons-dired-v-adjust))))
+ (if (member file '("." ".."))
+ (all-the-icons-dired--add-overlay (point) " \t")
+ (all-the-icons-dired--add-overlay (point) (concat icon "\t")))))))
+ (forward-line 1))))
+
+(defun all-the-icons-dired--refresh-advice (fn &rest args)
+ "Advice function for FN with ARGS."
+ (apply fn args)
+ (when all-the-icons-dired-mode
+ (all-the-icons-dired--refresh)))
+
+(defun all-the-icons-dired--setup ()
+ "Setup `all-the-icons-dired'."
+ (when (derived-mode-p 'dired-mode)
+ (setq-local tab-width 1)
+ (advice-add 'dired-readin :around #'all-the-icons-dired--refresh-advice)
+ (advice-add 'dired-revert :around #'all-the-icons-dired--refresh-advice)
+ (advice-add 'dired-internal-do-deletions :around #'all-the-icons-dired--refresh-advice)
+ (advice-add 'dired-insert-subdir :around #'all-the-icons-dired--refresh-advice)
+ (advice-add 'dired-do-kill-lines :around #'all-the-icons-dired--refresh-advice)
+ (with-eval-after-load 'dired-narrow
+ (advice-add 'dired-narrow--internal :around #'all-the-icons-dired--refresh-advice))
+ (all-the-icons-dired--refresh)))
+
+(defun all-the-icons-dired--teardown ()
+ "Functions used as advice when redisplaying buffer."
+ (advice-remove 'dired-readin #'all-the-icons-dired--refresh-advice)
+ (advice-remove 'dired-revert #'all-the-icons-dired--refresh-advice)
+ (advice-remove 'dired-internal-do-deletions #'all-the-icons-dired--refresh-advice)
+ (advice-remove 'dired-narrow--internal #'all-the-icons-dired--refresh-advice)
+ (advice-remove 'dired-insert-subdir #'all-the-icons-dired--refresh-advice)
+ (advice-remove 'dired-do-kill-lines #'all-the-icons-dired--refresh-advice)
+ (all-the-icons-dired--remove-all-overlays))
+
+;;;###autoload
+(define-minor-mode all-the-icons-dired-mode
+ "Display all-the-icons icon for each files in a dired buffer."
+ :lighter " all-the-icons-dired-mode"
+ (when (and (derived-mode-p 'dired-mode) (display-graphic-p))
+ (if all-the-icons-dired-mode
+ (all-the-icons-dired--setup)
+ (all-the-icons-dired--teardown))))
+
+(provide 'all-the-icons-dired)
+;;; all-the-icons-dired.el ends here