54
54
55
55
(defvar cider-browse-spec-mode-map
56
56
(let ((map (make-sparse-keymap )))
57
- (set-keymap-parent map cider-popup-buffer-mode-map)
58
- (define-key map (kbd " RET" ) #'cider-browse-spec--browse-at-point )
59
- (define-key map " n" #'cider-browse-spec--next-spec )
60
- (define-key map " p" #'cider-browse-spec--prev-spec )
57
+ (set-keymap-parent map (make-composed-keymap button-buffer-map
58
+ cider-popup-buffer-mode-map))
59
+ (define-key map (kbd " RET" ) #'cider-browse-spec--browse-at )
60
+ (define-key map " n" #'forward-button )
61
+ (define-key map " p" #'backward-button )
61
62
map)
62
63
" Keymap for `cider-browse-spec-mode' ." )
63
64
64
- (defvar cider-browse-spec-mouse-map
65
- (let ((map (make-sparse-keymap )))
66
- (define-key map [mouse-1] #'cider-browse-spec-handle-mouse )
67
- map))
68
-
69
65
(define-derived-mode cider-browse-spec-mode special-mode " Specs"
70
66
" Major mode for browsing Clojure specs.
71
67
79
75
(defvar cider-browse-spec-view-mode-map
80
76
(let ((map (make-sparse-keymap )))
81
77
(set-keymap-parent map help-mode-map)
82
- (define-key map (kbd " RET" ) #'cider-browse-spec--browse-at-point )
78
+ (define-key map (kbd " RET" ) #'cider-browse-spec--browse-at )
83
79
(define-key map " ^" #'cider-browse-spec-all )
84
80
(define-key map " e" #'cider-browse-spec--print-curr-spec-example )
85
- (define-key map " n" #'cider-browse-spec--next-spec )
86
- (define-key map " p" #'cider-browse-spec--prev-spec )
81
+ (define-key map " n" #'forward-button )
82
+ (define-key map " p" #'backward-button )
87
83
map)
88
84
" Keymap for `cider-browse-spec-view-mode' ." )
89
85
116
112
117
113
; ; Non interactive functions
118
114
119
- (defun cider-browse-spec--propertize-keyword (kw )
120
- " Add properties to KW text needed by the spec browser."
121
- (propertize (cider-font-lock-as-clojure kw)
122
- 'spec-name kw
123
- 'mouse-face 'highlight
124
- 'keymap cider-browse-spec-mouse-map))
125
-
126
- (defun cider-browse-spec--propertize-fn (fname )
127
- " Add properties to FNAME symbol text needed by the spec browser."
128
- (propertize fname
129
- 'font-lock-face 'font-lock-function-name-face
130
- 'spec-name fname
131
- 'mouse-face 'highlight
132
- 'keymap cider-browse-spec-mouse-map))
115
+ (define-button-type 'cider-browse-spec--spec
116
+ 'action #'cider-browse-spec--browse-at
117
+ 'face nil
118
+ 'follow-link t
119
+ 'help-echo " View spec" )
133
120
134
121
(defun cider-browse-spec--draw-list-buffer (buffer title specs )
135
122
" Reset contents of BUFFER.
@@ -141,12 +128,11 @@ Display TITLE at the top and SPECS are indented underneath."
141
128
(goto-char (point-max ))
142
129
(insert (cider-propertize title 'emph ) " \n " )
143
130
(dolist (spec-name specs)
144
- (let ((propertize-fn (if (char-equal (elt spec-name 0 ) ?: )
145
- #'cider-browse-spec--propertize-keyword
146
- #'cider-browse-spec--propertize-fn )))
147
- (thread-first (concat " " (funcall propertize-fn spec-name) " \n " )
148
- (propertize 'spec-name spec-name)
149
- insert)))
131
+ (insert (propertize " " 'spec-name spec-name))
132
+ (thread-first (cider-font-lock-as-clojure spec-name)
133
+ (insert-text-button 'type 'cider-browse-spec--spec )
134
+ (button-put 'spec-name spec-name))
135
+ (insert (propertize " \n " 'spec-name spec-name)))
150
136
(goto-char (point-min )))))
151
137
152
138
(defun cider--qualified-keyword-p (str )
@@ -161,7 +147,11 @@ Display TITLE at the top and SPECS are indented underneath."
161
147
" Given a spec FORM builds a multi line string with a pretty render of that FORM."
162
148
(cond ((stringp form)
163
149
(if (cider--qualified-keyword-p form)
164
- (cider-browse-spec--propertize-keyword form)
150
+ (with-temp-buffer
151
+ (thread-first form
152
+ (insert-text-button 'type 'cider-browse-spec--spec )
153
+ (button-put 'spec-name form))
154
+ (buffer-string ))
165
155
; ; to make it easier to read replace all clojure.spec ns with s/
166
156
; ; and remove all clojure.core ns
167
157
(thread-last form
@@ -284,25 +274,18 @@ a more user friendly representation of SPEC-FORM."
284
274
(goto-char (point-min ))
285
275
(current-buffer )))
286
276
287
- ; ; Interactive Functions
277
+ (defun cider-browse-spec--browse-at (&optional pos )
278
+ " View the definition of a spec.
288
279
289
- (defun cider-browse-spec--next-spec ()
290
- " Move to the next spec in the buffer."
291
- (interactive )
292
- (when-let ((pos (next-single-property-change (point ) 'spec-name )))
293
- (if (get-text-property (point ) 'spec-name )
294
- (when-let ((next-pos (next-single-property-change pos 'spec-name )))
295
- (goto-char next-pos))
296
- (goto-char pos))))
297
-
298
- (defun cider-browse-spec--prev-spec ()
299
- " Move to the previous spec in the buffer."
280
+ Optional argument POS is the position of a spec, defaulting to point. POS
281
+ may also be a button, so this function can be used a the button's `action'
282
+ property."
300
283
(interactive )
301
- (when- let ((pos (previous-single-property-change (point ) 'spec-name )))
302
- (if ( get-text-property ( point ) 'spec-name )
303
- ( when-let ((prev-pos ( previous-single-property-change pos ' spec-name )))
304
- ( goto-char prev-pos))
305
- ( goto-char pos))))
284
+ (let ((pos (or pos (point ))))
285
+ (when-let ((spec ( button-get pos 'spec-name )) )
286
+ (cider-browse-spec--browse spec) )))
287
+
288
+ ; ; Interactive Functions
306
289
307
290
(defun cider-browse-spec--print-curr-spec-example ()
308
291
" Generate and print an example of the current spec."
@@ -355,18 +338,6 @@ No filter applied if the regexp is the empty string."
355
338
(format " All specs matching regex `%s' in registry " filter-regex))
356
339
specs)))))
357
340
358
- (defun cider-browse-spec--browse-at-point ()
359
- " Go to the definition of the spec at point inside `cider-browse-spec-buffer' ."
360
- (interactive )
361
- (when-let ((spec (get-text-property (point ) 'spec-name )))
362
- (cider-browse-spec--browse spec)))
363
-
364
- (defun cider-browse-spec-handle-mouse (event )
365
- " Handle mouse click EVENT."
366
- (interactive " e" )
367
- (when (eq 'highlight (get-text-property (point ) 'mouse-face ))
368
- (cider-browse-spec--browse-at-point)))
369
-
370
341
(provide 'cider-browse-spec )
371
342
372
343
; ;; cider-browse-spec.el ends here
0 commit comments