fordon_greeman / voidfiles

Branch: 2079ec5
Switch branches/tags
main
theidioticdev add emacs 2079ec5 23h ago
176 lines · 5.7 KB Raw Blame History
1 ;;; magit-bookmark.el --- Bookmarks for Magit buffers -*- lexical-binding:t -*-
2
3 ;; Copyright (C) 2008-2026 The Magit Project Contributors
4
5 ;; Inspired by an earlier implementation by Yuri Khan.
6
7 ;; Author: Jonas Bernoulli <emacs.magit@jonas.bernoulli.dev>
8 ;; Maintainer: Jonas Bernoulli <emacs.magit@jonas.bernoulli.dev>
9
10 ;; SPDX-License-Identifier: GPL-3.0-or-later
11
12 ;; Magit is free software: you can redistribute it and/or modify it
13 ;; under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation, either version 3 of the License, or
15 ;; (at your option) any later version.
16 ;;
17 ;; Magit is distributed in the hope that it will be useful, but WITHOUT
18 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
20 ;; License for more details.
21 ;;
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with Magit. If not, see <https://www.gnu.org/licenses/>.
24
25 ;;; Commentary:
26
27 ;; Support for bookmarks for most Magit buffers.
28
29 ;;; Code:
30
31 (require 'magit)
32
33 (require 'bookmark)
34
35 ;;; Common
36
37 (cl-defmethod magit-bookmark-get-filename (&context (major-mode magit-mode))
38 (magit-toplevel))
39
40 (cl-defmethod magit-bookmark--store-buffer-values
41 (bookmark &context (major-mode magit-mode))
42 (dolist (var (get major-mode 'magit-bookmark-variables))
43 (bookmark-prop-set bookmark var (symbol-value var))))
44
45 (cl-defmethod magit-bookmark-get-buffer-create
46 (bookmark (mode (derived-mode magit-mode)))
47 (let ((default-directory (bookmark-get-filename bookmark))
48 (magit-display-buffer-function #'identity)
49 (magit-display-buffer-noselect t))
50 (apply (intern (format "%s-setup-buffer"
51 (substring (symbol-name mode) 0 -5)))
52 (mapcar (##bookmark-prop-get bookmark %)
53 (get mode 'magit-bookmark-variables)))))
54
55 ;;; Diff
56 ;;;; Diff
57
58 (put 'magit-diff-mode 'magit-bookmark-variables
59 '(magit-buffer-diff-range-oids
60 magit-buffer-diff-typearg
61 magit-buffer-diff-args
62 magit-buffer-diff-files))
63
64 (cl-defmethod magit-bookmark-name (&context (major-mode magit-diff-mode))
65 (format "magit-diff(%s%s)"
66 (pcase (magit-diff-type)
67 ('staged "staged")
68 ('unstaged "unstaged")
69 ('committed magit-buffer-diff-range)
70 ('undefined
71 (delq nil
72 (list magit-buffer-diff-typearg magit-buffer-diff-range-oids))))
73 (if magit-buffer-diff-files
74 (concat " -- " (string-join magit-buffer-diff-files " "))
75 "")))
76
77 ;;;; Revision
78
79 (put 'magit-revision-mode 'magit-bookmark-variables
80 '(magit-buffer-revision-oid
81 magit-buffer-diff-args
82 magit-buffer-diff-files))
83
84 (cl-defmethod magit-bookmark-name (&context (major-mode magit-revision-mode))
85 (format "magit-revision(%s %s)"
86 (magit-rev-abbrev magit-buffer-revision)
87 (if magit-buffer-diff-files
88 (string-join magit-buffer-diff-files " ")
89 (magit-rev-format "%s" magit-buffer-revision))))
90
91 ;;;; Stash
92
93 (put 'magit-stash-mode 'magit-bookmark-variables
94 '(magit-buffer-revision-oid
95 magit-buffer-diff-args
96 magit-buffer-diff-files))
97
98 (cl-defmethod magit-bookmark-name (&context (major-mode magit-stash-mode))
99 (format "magit-stash(%s %s)"
100 (magit-rev-abbrev magit-buffer-revision)
101 (if magit-buffer-diff-files
102 (string-join magit-buffer-diff-files " ")
103 (magit-rev-format "%s" magit-buffer-revision))))
104
105 (cl-defmethod magit-bookmark--get-child-value
106 (section &context (major-mode magit-stash-mode))
107 (string-replace magit-buffer-revision
108 magit-buffer-revision-oid
109 (oref section value)))
110
111 ;;; Log
112 ;;;; Log
113
114 (put 'magit-log-mode 'magit-bookmark-variables
115 '(magit-buffer-log-revisions
116 magit-buffer-log-args
117 magit-buffer-log-files))
118
119 (cl-defmethod magit-bookmark-name (&context (major-mode magit-log-mode))
120 (format "magit-log(%s%s)"
121 (string-join magit-buffer-log-revisions " ")
122 (if magit-buffer-log-files
123 (concat " -- " (string-join magit-buffer-log-files " "))
124 "")))
125
126 ;;;; Cherry
127
128 (put 'magit-cherry-mode 'magit-bookmark-variables
129 '(magit-buffer-refname
130 magit-buffer-cherry-upstream))
131
132 (cl-defmethod magit-bookmark-name (&context (major-mode magit-cherry-mode))
133 (format "magit-cherry(%s > %s)"
134 magit-buffer-refname
135 magit-buffer-cherry-upstream))
136
137 ;;;; Reflog
138
139 (put 'magit-reflog-mode 'magit-bookmark-variables
140 '(magit-buffer-refname))
141
142 (cl-defmethod magit-bookmark-name (&context (major-mode magit-reflog-mode))
143 (format "magit-reflog(%s)" magit-buffer-refname))
144
145 ;;; Misc
146
147 (put 'magit-status-mode 'magit-bookmark-variables nil)
148
149 (put 'magit-refs-mode 'magit-bookmark-variables
150 '(magit-buffer-refs-upstream
151 magit-buffer-refs-args))
152
153 (put 'magit-stashes-mode 'magit-bookmark-variables nil)
154
155 (cl-defmethod magit-bookmark-name (&context (major-mode magit-stashes-mode))
156 (format "magit-states(%s)" magit-buffer-refname))
157
158 ;;; _
159 (provide 'magit-bookmark)
160 ;; Local Variables:
161 ;; read-symbol-shorthands: (
162 ;; ("and$" . "cond-let--and$")
163 ;; ("thread$" . "cond-let--thread$")
164 ;; ("when$" . "cond-let--when$")
165 ;; ("and-let*" . "cond-let--and-let*")
166 ;; ("and-let" . "cond-let--and-let")
167 ;; ("if-let*" . "cond-let--if-let*")
168 ;; ("if-let" . "cond-let--if-let")
169 ;; ("when-let*" . "cond-let--when-let*")
170 ;; ("when-let" . "cond-let--when-let")
171 ;; ("while-let*" . "cond-let--while-let*")
172 ;; ("while-let" . "cond-let--while-let")
173 ;; ("match-string" . "match-string")
174 ;; ("match-str" . "match-string-no-properties"))
175 ;; End:
176 ;;; magit-bookmark.el ends here