add dired-rainbow-listing

This commit is contained in:
KemoNine 2022-04-22 17:00:07 -04:00
parent b99c6c0f53
commit c81cf68c73
6 changed files with 430 additions and 0 deletions

View File

@ -0,0 +1,32 @@
#+TITLE: dired-rainbow-listing
This Emacs package adds customizable highlighting to =dired= listings. It works well alongside [[https://github.com/Fuco1/dired-hacks][dired-hacks]],
and specifically [[https://github.com/Fuco1/dired-hacks#dired-rainbow][dired-rainbow]].
* Screenshot
[[file:screenshot.png]]
Notice the (somtimes subtile) coloring of the file attributes, user, group, date, etc. Also notice that file extensions are left un-highlighted to draw attention to the main part of the file name. I think it makes it easier and more pleasant to read and scan through.
* Install
** Manually
Install it by cloning the repository
#+begin_src sh
git clone https://github.com/mnewt/dired-rainbow-listing ~/.emacs.d/lisp/
#+end_src
Add it to the =load-path=
#+begin_src emacs-lisp
(add-to-list 'load-path "~/.emacs.d/lisp/dired-rainbow-listing")
(require 'dired-rainbow-listing)
(add-hook 'dired-mode-hook #'dired-rainbow-listing-mode)
#+end_src
** Using straight.el
#+begin_src emacs-lisp
(use-package dired-rainbow-listing
:straight (:type git :host github :repo "mnewt/dired-rainbow-listing")
:hook
(dired-mode . dired-rainbow-listing-mode))
#+end_src
* Prior Art
This package was created to compliment [[https://github.com/Fuco1/dired-hacks][dired-hacks]]. Much of its functionality is similar to [[https://github.com/purcell/diredfl][diredfl]]. I created it as a replacement for =diredfl= that is compatible with =dired-rainbow=. And since I was designing it, I made it a little simpler and picked a default color scheme that I like better.

View File

@ -0,0 +1,183 @@
;;; dired-rainbow-listing.el --- Colorful Dired listings -*- lexical-binding: t -*-
;; Author: Matthew Sojourner Newton
;; Maintainer: Matthew Sojourner Newton
;; Version: 0.1
;; Package-Requires: ((emacs "25.1"))
;; Homepage: https://github.com/mnewt/dired-rainbow-listing
;; Keywords: convenience faces files
;; This file is not part of GNU Emacs
;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; For a full copy of the GNU General Public License
;; see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This Emacs package adds customizable highlighting to `dired' listings. It
;; works well alongside dired-hacks, and specifically dired-rainbow.
;;; Code:
(defface dired-rainbow-listing-inodes '((t (:inherit shadow)))
"Face for Dired links."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-user '((t (:inherit default)))
"Face for Dired user."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-group
'((((background dark)) (:inherit default :foreground "#999"))
(t (:inherit default :foreground "#777")))
"Face for Dired group."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-size '((t (:inherit default)))
"Face for Dired file size."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-datetime
'((((background dark)) (:inherit default :foreground "#999"))
(t (:inherit default :foreground "#777")))
"Face for Dired timestamp."
:group 'dired-rainbow-listing)
(defface dired-rainbow-file-listing-extension '((t (:inherit shadow)))
"Face for Dired file extensions."
:group 'dired-rainbow-listing)
(defface dired-rainbow-file-listing-decoration '((t (:inherit font-lock-comment-face)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-dash '((t (:inherit shadow)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-permissions-r
'((((background dark)) (:inherit default :foreground "#999"))
(t (:inherit default :foreground "#777")))
"Face for the r in Dired permissions"
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-permissions-w
'((((background dark)) (:inherit default :foreground "#AAA"))
(t (:inherit default :foreground "#666")))
"Face for the w in Dired permissions"
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-permissions-x
'((((background dark)) (:inherit default :foreground "#BBB"))
(t (:inherit default :foreground "#555")))
"Face for the x in Dired permissions"
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-filetype-directory '((t (:inherit font-lock-function-name-face)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-filetype-link '((t (:inherit font-lock-string-face)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defvar dired-rainbow-listing-permissions-regexp "[-dl][-rwxlsStT]\\{9\\}[.+-@]?"
"A regexp matching the permissions in the dired listing.")
(defvar dired-rainbow-listing-inodes-regexp "[0-9]+"
"A regexp matching the number of links in the dired listing.")
(defvar dired-rainbow-listing-user-or-group-regexp "[a-z_][a-z0-9_-]*"
"A regexp matching the user and group in the dired listing.")
(defvar dired-rainbow-listing-size-regexp "[0-9.]+[kKmMgGtTpPi]\\{0,3\\}"
"A regexp matching the file size in the dired listing.")
(defvar dired-rainbow-listing-datetime-regexp
"\\sw\\sw\\sw....\\(?:[0-9][0-9]:[0-9][0-9]\\|.[0-9]\\{4\\}\\)"
"A regexp matching the date/time in the dired listing.
It is used to determine where the filename starts. It should
*not* match any characters after the last character of the
timestamp. It is assumed that the timestamp is preceded and
followed by at least one space character. You should only use
shy groups (prefixed with ?:) because the first group is used by
the font-lock to determine what portion of the name should be
colored.
Stolen from `dired-hacks'.")
(defvar dired-rainbow-listing-details-regexp
(let ((sep "\\) +\\("))
(concat "^ +\\("
dired-rainbow-listing-permissions-regexp sep
dired-rainbow-listing-inodes-regexp sep
dired-rainbow-listing-user-or-group-regexp sep
dired-rainbow-listing-user-or-group-regexp sep
dired-rainbow-listing-size-regexp sep
dired-rainbow-listing-datetime-regexp
"\\)")))
(defvar dired-rainbow-listing-keywords
`((,(concat "\\(total used in directory\\|available\\) +\\("
dired-rainbow-listing-size-regexp "\\)")
(1 'font-lock-comment-face)
(2 'default))
("^ +\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +\\(d\\)" 1 'dired-rainbow-listing-filetype-directory)
("^ +\\(l\\)" 1 'dired-rainbow-listing-filetype-link)
("^ +.\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +..\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +...\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +....\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.....\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +......\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.......\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +........\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.........\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.\\(r\\)" 1 'dired-rainbow-listing-permissions-r)
("^ +....\\(r\\)" 1 'dired-rainbow-listing-permissions-r)
("^ +.......\\(r\\)" 1 'dired-rainbow-listing-permissions-r)
("^ +..\\(w\\)" 1 'dired-rainbow-listing-permissions-w)
("^ +.....\\(w\\)" 1 'dired-rainbow-listing-permissions-w)
("^ +........\\(w\\)" 1 'dired-rainbow-listing-permissions-w)
("^ +...\\(x\\)" 1 'dired-rainbow-listing-permissions-x)
("^ +......\\(x\\)" 1 'dired-rainbow-listing-permissions-x)
("^ +.........\\(x\\)" 1 'dired-rainbow-listing-permissions-x)
(,dired-rainbow-listing-details-regexp
(2 'dired-rainbow-listing-inodes)
(3 'dired-rainbow-listing-user)
(4 'dired-rainbow-listing-group)
(5 'dired-rainbow-listing-size)
(6 'dired-rainbow-listing-datetime))
("\\.[^. /:*]+$" 0 'dired-rainbow-file-listing-extension t)
("\\([*/]\\| -> .*\\)" 1 'dired-rainbow-file-listing-decoration t)))
;;;###autoload
(define-minor-mode dired-rainbow-listing-mode
"Toggle highlighting of file listing details in Dired."
:group 'dired-rainbow
:lighter nil
(setq font-lock-defaults
(if dired-rainbow-listing-mode
'((dired-font-lock-keywords
dired-rainbow-listing-keywords)
t nil nil beginning-of-line)
'(dired-font-lock-keywords t nil nil beginning-of-line)))
(font-lock-refresh-defaults))
(provide 'dired-rainbow-listing)
;;; dired-rainbow-listing.el ends here

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

View File

@ -0,0 +1,32 @@
#+TITLE: dired-rainbow-listing
This Emacs package adds customizable highlighting to =dired= listings. It works well alongside [[https://github.com/Fuco1/dired-hacks][dired-hacks]],
and specifically [[https://github.com/Fuco1/dired-hacks#dired-rainbow][dired-rainbow]].
* Screenshot
[[file:screenshot.png]]
Notice the (somtimes subtile) coloring of the file attributes, user, group, date, etc. Also notice that file extensions are left un-highlighted to draw attention to the main part of the file name. I think it makes it easier and more pleasant to read and scan through.
* Install
** Manually
Install it by cloning the repository
#+begin_src sh
git clone https://github.com/mnewt/dired-rainbow-listing ~/.emacs.d/lisp/
#+end_src
Add it to the =load-path=
#+begin_src emacs-lisp
(add-to-list 'load-path "~/.emacs.d/lisp/dired-rainbow-listing")
(require 'dired-rainbow-listing)
(add-hook 'dired-mode-hook #'dired-rainbow-listing-mode)
#+end_src
** Using straight.el
#+begin_src emacs-lisp
(use-package dired-rainbow-listing
:straight (:type git :host github :repo "mnewt/dired-rainbow-listing")
:hook
(dired-mode . dired-rainbow-listing-mode))
#+end_src
* Prior Art
This package was created to compliment [[https://github.com/Fuco1/dired-hacks][dired-hacks]]. Much of its functionality is similar to [[https://github.com/purcell/diredfl][diredfl]]. I created it as a replacement for =diredfl= that is compatible with =dired-rainbow=. And since I was designing it, I made it a little simpler and picked a default color scheme that I like better.

View File

@ -0,0 +1,183 @@
;;; dired-rainbow-listing.el --- Colorful Dired listings -*- lexical-binding: t -*-
;; Author: Matthew Sojourner Newton
;; Maintainer: Matthew Sojourner Newton
;; Version: 0.1
;; Package-Requires: ((emacs "25.1"))
;; Homepage: https://github.com/mnewt/dired-rainbow-listing
;; Keywords: convenience faces files
;; This file is not part of GNU Emacs
;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; For a full copy of the GNU General Public License
;; see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; This Emacs package adds customizable highlighting to `dired' listings. It
;; works well alongside dired-hacks, and specifically dired-rainbow.
;;; Code:
(defface dired-rainbow-listing-inodes '((t (:inherit shadow)))
"Face for Dired links."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-user '((t (:inherit default)))
"Face for Dired user."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-group
'((((background dark)) (:inherit default :foreground "#999"))
(t (:inherit default :foreground "#777")))
"Face for Dired group."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-size '((t (:inherit default)))
"Face for Dired file size."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-datetime
'((((background dark)) (:inherit default :foreground "#999"))
(t (:inherit default :foreground "#777")))
"Face for Dired timestamp."
:group 'dired-rainbow-listing)
(defface dired-rainbow-file-listing-extension '((t (:inherit shadow)))
"Face for Dired file extensions."
:group 'dired-rainbow-listing)
(defface dired-rainbow-file-listing-decoration '((t (:inherit font-lock-comment-face)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-dash '((t (:inherit shadow)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-permissions-r
'((((background dark)) (:inherit default :foreground "#999"))
(t (:inherit default :foreground "#777")))
"Face for the r in Dired permissions"
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-permissions-w
'((((background dark)) (:inherit default :foreground "#AAA"))
(t (:inherit default :foreground "#666")))
"Face for the w in Dired permissions"
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-permissions-x
'((((background dark)) (:inherit default :foreground "#BBB"))
(t (:inherit default :foreground "#555")))
"Face for the x in Dired permissions"
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-filetype-directory '((t (:inherit font-lock-function-name-face)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defface dired-rainbow-listing-filetype-link '((t (:inherit font-lock-string-face)))
"Face for file decoration."
:group 'dired-rainbow-listing)
(defvar dired-rainbow-listing-permissions-regexp "[-dl][-rwxlsStT]\\{9\\}[.+-@]?"
"A regexp matching the permissions in the dired listing.")
(defvar dired-rainbow-listing-inodes-regexp "[0-9]+"
"A regexp matching the number of links in the dired listing.")
(defvar dired-rainbow-listing-user-or-group-regexp "[a-z_][a-z0-9_-]*"
"A regexp matching the user and group in the dired listing.")
(defvar dired-rainbow-listing-size-regexp "[0-9.]+[kKmMgGtTpPi]\\{0,3\\}"
"A regexp matching the file size in the dired listing.")
(defvar dired-rainbow-listing-datetime-regexp
"\\sw\\sw\\sw....\\(?:[0-9][0-9]:[0-9][0-9]\\|.[0-9]\\{4\\}\\)"
"A regexp matching the date/time in the dired listing.
It is used to determine where the filename starts. It should
*not* match any characters after the last character of the
timestamp. It is assumed that the timestamp is preceded and
followed by at least one space character. You should only use
shy groups (prefixed with ?:) because the first group is used by
the font-lock to determine what portion of the name should be
colored.
Stolen from `dired-hacks'.")
(defvar dired-rainbow-listing-details-regexp
(let ((sep "\\) +\\("))
(concat "^ +\\("
dired-rainbow-listing-permissions-regexp sep
dired-rainbow-listing-inodes-regexp sep
dired-rainbow-listing-user-or-group-regexp sep
dired-rainbow-listing-user-or-group-regexp sep
dired-rainbow-listing-size-regexp sep
dired-rainbow-listing-datetime-regexp
"\\)")))
(defvar dired-rainbow-listing-keywords
`((,(concat "\\(total used in directory\\|available\\) +\\("
dired-rainbow-listing-size-regexp "\\)")
(1 'font-lock-comment-face)
(2 'default))
("^ +\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +\\(d\\)" 1 'dired-rainbow-listing-filetype-directory)
("^ +\\(l\\)" 1 'dired-rainbow-listing-filetype-link)
("^ +.\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +..\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +...\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +....\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.....\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +......\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.......\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +........\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.........\\(-\\)" 1 'dired-rainbow-listing-dash)
("^ +.\\(r\\)" 1 'dired-rainbow-listing-permissions-r)
("^ +....\\(r\\)" 1 'dired-rainbow-listing-permissions-r)
("^ +.......\\(r\\)" 1 'dired-rainbow-listing-permissions-r)
("^ +..\\(w\\)" 1 'dired-rainbow-listing-permissions-w)
("^ +.....\\(w\\)" 1 'dired-rainbow-listing-permissions-w)
("^ +........\\(w\\)" 1 'dired-rainbow-listing-permissions-w)
("^ +...\\(x\\)" 1 'dired-rainbow-listing-permissions-x)
("^ +......\\(x\\)" 1 'dired-rainbow-listing-permissions-x)
("^ +.........\\(x\\)" 1 'dired-rainbow-listing-permissions-x)
(,dired-rainbow-listing-details-regexp
(2 'dired-rainbow-listing-inodes)
(3 'dired-rainbow-listing-user)
(4 'dired-rainbow-listing-group)
(5 'dired-rainbow-listing-size)
(6 'dired-rainbow-listing-datetime))
("\\.[^. /:*]+$" 0 'dired-rainbow-file-listing-extension t)
("\\([*/]\\| -> .*\\)" 1 'dired-rainbow-file-listing-decoration t)))
;;;###autoload
(define-minor-mode dired-rainbow-listing-mode
"Toggle highlighting of file listing details in Dired."
:group 'dired-rainbow
:lighter nil
(setq font-lock-defaults
(if dired-rainbow-listing-mode
'((dired-font-lock-keywords
dired-rainbow-listing-keywords)
t nil nil beginning-of-line)
'(dired-font-lock-keywords t nil nil beginning-of-line)))
(font-lock-refresh-defaults))
(provide 'dired-rainbow-listing)
;;; dired-rainbow-listing.el ends here

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB