all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
blob d991950fdcc6822d32ab57a50cf1f71d6f61fdce 7220 bytes (raw)
name: emacs/pretty-sha-path.el 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
 
;;; pretty-sha-path.el --- Prettify Guix store paths

;; Copyright © 2014 Alex Kost <alezost@gmail.com>

;; This file is part of GNU Guix.

;; GNU Guix 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 of the License, or
;; (at your option) any later version.

;; GNU Guix 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.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This package provides minor-mode for prettifying Guix/Nix store
;; paths, i.e. after enabling `pretty-sha-path-mode',
;; '/gnu/store/herewehavefancylettersandnumbers-foo-0.1' paths will be
;; replaced with '/gnu/store/…-foo-0.1' paths in the current buffer.
;; There is also `pretty-sha-path-global-mode' for global prettifying.

;; To install, add the following to your emacs init file:
;;
;;   (add-to-list 'load-path "/path/to/pretty-sha-path")
;;   (autoload 'pretty-sha-path-mode "pretty-sha-path" nil t)
;;   (autoload 'pretty-sha-path-global-mode "pretty-sha-path" nil t)

;; If you want to enable/disable composition after "M-x font-lock-mode",
;; use the following setting:
;;
;;   (setq font-lock-extra-managed-props
;;         (cons 'composition font-lock-extra-managed-props))

;; Credits:
;;
;; Thanks to Ludovic Courtès for the idea of this package.
;;
;; Thanks to the authors of `prettify-symbols-mode' (part of Emacs 24.4)
;; and "pretty-symbols.el" <http://github.com/drothlis/pretty-symbols>
;; for the code.  It helped to write this package.

;;; Code:

(defgroup pretty-sha-path nil
  "Prettify Guix/Nix store paths."
  :prefix "pretty-sha-path-"
  :group 'font-lock
  :group 'convenience)

(defcustom pretty-sha-path-char ?…
  "Character used for prettifying."
  :type 'character
  :group 'pretty-sha-path)

(defcustom pretty-sha-path-decompose-force nil
  "If non-nil, remove any composition.

By default, after disabling `pretty-sha-path-mode',
compositions (prettifying paths with `pretty-sha-path-char') are
removed only from strings matching `pretty-sha-path-regexp', so
that compositions created by other modes are left untouched.

Set this variable to non-nil, if you want to remove any
composition unconditionally (like `prettify-symbols-mode' does).
Most likely it will do no harm and will make the process of
disabling `pretty-sha-path-mode' a little faster."
  :type 'boolean
  :group 'pretty-sha-path)

(defcustom pretty-sha-path-regexp
  (rx "/"
      (or "nix" "gnu")
      "/store/"
      (group (= 32 alnum)))
  "Regexp matching SHA paths.

Disable `pretty-sha-path-mode' before modifying this variable and
make sure to modify `pretty-sha-path-regexp-group' if needed.

Example of a \"deeper\" prettifying:

  (setq pretty-sha-path-regexp \"store/[[:alnum:]]\\\\\\={32\\\\}\"
        pretty-sha-path-regexp-group 0)

This will transform
'/gnu/store/onecansee32lettersandnumbershere-foo-0.1' into
'/gnu/…-foo-0.1'"
  :type 'regexp
  :group 'pretty-sha-path)

(defcustom pretty-sha-path-regexp-group 1
  "Regexp group in `pretty-sha-path-regexp' for prettifying."
  :type 'integer
  :group 'pretty-sha-path)

(defvar pretty-sha-path-special-modes
  '(guix-info-mode ibuffer-mode)
  "List of special modes that support font-locking.

By default, \\[pretty-sha-path-global-mode] enables prettifying
in all buffers except the ones where `font-lock-defaults' is
nil (see Info node `(elisp) Font Lock Basics'), because it may
break the existing highlighting.

Modes from this list and all derived modes are exceptions
\(`pretty-sha-path-global-mode' enables prettifying there).")

(defvar pretty-sha-path-flush-function
  (cond ((fboundp 'font-lock-flush) #'font-lock-flush)
        ((fboundp 'jit-lock-refontify) #'jit-lock-refontify))
  "Function used to refontify buffer.
This function is called without arguments after
enabling/disabling `pretty-sha-path-mode'.
If nil, do nothing.")

(defun pretty-sha-path-compose ()
  "Compose matching region in the current buffer."
  (let ((beg (match-beginning pretty-sha-path-regexp-group))
        (end (match-end       pretty-sha-path-regexp-group)))
    (compose-region beg end pretty-sha-path-char 'decompose-region))
  ;; Return nil because we're not adding any face property.
  nil)

(defun pretty-sha-path-decompose-buffer ()
  "Remove path compositions from the current buffer."
  (with-silent-modifications
    (let ((inhibit-read-only t))
      (if pretty-sha-path-decompose-force
          (remove-text-properties (point-min)
                                  (point-max)
                                  '(composition nil))
        (save-excursion
          (goto-char (point-min))
          (while (re-search-forward pretty-sha-path-regexp nil t)
            (remove-text-properties
             (match-beginning pretty-sha-path-regexp-group)
             (match-end       pretty-sha-path-regexp-group)
             '(composition nil))))))))

;;;###autoload
(define-minor-mode pretty-sha-path-mode
  "Toggle Pretty SHA Path mode.

With a prefix argument ARG, enable Pretty SHA Path mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
the mode if ARG is omitted or nil.

When Pretty SHA Path mode is enabled, SHA-parts of the Guix/Nix
store paths (see `pretty-sha-path-regexp') are prettified,
i.e. displayed as `pretty-sha-path-char' character.  This mode
can be enabled programmatically using hooks:

  (add-hook 'shell-mode-hook 'pretty-sha-path-mode)

It is possible to enable the mode in any buffer, however not any
buffer's highlighting may survive after adding new elements to
`font-lock-keywords' (see `pretty-sha-path-special-modes' for
details).

Also you can use `pretty-sha-path-global-mode' to enable Pretty
SHA Path mode for all modes that support font-locking."
  :init-value nil
  :lighter " …"
  (let ((keywords `((,pretty-sha-path-regexp
                     (,pretty-sha-path-regexp-group
                      (pretty-sha-path-compose))))))
    (if pretty-sha-path-mode
        ;; Turn on.
        (font-lock-add-keywords nil keywords)
      ;; Turn off.
      (font-lock-remove-keywords nil keywords)
      (pretty-sha-path-decompose-buffer))
    (and pretty-sha-path-flush-function
         (funcall pretty-sha-path-flush-function))))

(defun pretty-sha-path-supported-p ()
  "Return non-nil, if the mode can be harmlessly enabled in current buffer."
  (or font-lock-defaults
      (apply #'derived-mode-p pretty-sha-path-special-modes)))

(defun pretty-sha-path-turn-on ()
  "Enable `pretty-sha-path-mode' in the current buffer if needed.
See `pretty-sha-path-special-modes' for details."
  (and (not pretty-sha-path-mode)
       (pretty-sha-path-supported-p)
       (pretty-sha-path-mode)))

;;;###autoload
(define-globalized-minor-mode pretty-sha-path-global-mode
  pretty-sha-path-mode pretty-sha-path-turn-on)

(provide 'pretty-sha-path)

;;; pretty-sha-path.el ends here

debug log:

solving d991950 ...
found d991950 in https://yhetil.org/guix/87d2926he1.fsf@gmail.com/

applying [1/1] https://yhetil.org/guix/87d2926he1.fsf@gmail.com/
diff --git a/emacs/pretty-sha-path.el b/emacs/pretty-sha-path.el
new file mode 100644
index 0000000..d991950

Checking patch emacs/pretty-sha-path.el...
Applied patch emacs/pretty-sha-path.el cleanly.

index at:
100644 d991950fdcc6822d32ab57a50cf1f71d6f61fdce	emacs/pretty-sha-path.el

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.