Show stash counts in button in vc-dir
Based on suggestions from Mattias Engdegård. * lisp/vc/vc-git.el (vc-git--make-button-text): New function to generate text for stash button. (vc-git-make-stash-button): Show stash counts. Delete and recreate button when toggling. (vc-git-dir-extra-headers): Pass counts to vc-git-make-stash-button. Treat stash count <= vc-git-show-stash as equivalent to showing entire list.
This commit is contained in:
parent
d45740cd9f
commit
4a9d8bdca3
1 changed files with 37 additions and 16 deletions
|
@ -650,17 +650,34 @@ or an empty string if none."
|
|||
(define-key map "S" 'vc-git-stash-snapshot)
|
||||
map))
|
||||
|
||||
(defun vc-git-make-stash-button ()
|
||||
(make-text-button "Show/hide stashes" nil
|
||||
'action
|
||||
(lambda (&rest _ignore)
|
||||
(let* ((inhibit-read-only t)
|
||||
(start (next-single-property-change (point-min) 'vc-git-hideable))
|
||||
(end (next-single-property-change start 'vc-git-hideable)))
|
||||
(add-text-properties
|
||||
start end
|
||||
`(invisible ,(not (get-text-property start 'invisible))))))
|
||||
'help-echo "mouse-2, RET: Show/hide stashes"))
|
||||
(defun vc-git--make-button-text (show count1 count2)
|
||||
(if show
|
||||
(format "Show all stashes (%s)" count2)
|
||||
(if (= count1 count2)
|
||||
(format "Hide all stashes (%s)" count2)
|
||||
(format "Show %s stash%s (of %s)" count1 (if (= count1 1) "" "es") count2))))
|
||||
|
||||
(defun vc-git-make-stash-button (show count1 count2)
|
||||
(let ((orig-text (vc-git--make-button-text show count1 count2)))
|
||||
(make-text-button
|
||||
orig-text nil
|
||||
'action
|
||||
(lambda (counts)
|
||||
(let* ((inhibit-read-only t)
|
||||
(start (next-single-property-change
|
||||
(point-min) 'vc-git-hideable))
|
||||
(end (next-single-property-change
|
||||
start 'vc-git-hideable))
|
||||
(state (get-text-property start 'invisible)))
|
||||
(add-text-properties
|
||||
start end
|
||||
`(invisible ,(not state)))
|
||||
(save-excursion
|
||||
(delete-region (button-start (point)) (button-end (point)))
|
||||
(insert (vc-git-make-stash-button
|
||||
(not state) (car counts) (cdr counts))))))
|
||||
'button-data (cons count1 count2)
|
||||
'help-echo "mouse-2, RET: Show/hide stashes")))
|
||||
|
||||
(defvar vc-git-stash-menu-map
|
||||
(let ((map (make-sparse-keymap "Git Stash")))
|
||||
|
@ -707,14 +724,18 @@ or an empty string if none."
|
|||
(setq remote-url (match-string 1 remote-url))))
|
||||
(setq branch "not (detached HEAD)"))
|
||||
(when stash-list
|
||||
(let* ((limit
|
||||
(let* ((len (length stash-list))
|
||||
(limit
|
||||
(if (integerp vc-git-show-stash)
|
||||
(min vc-git-show-stash (length stash-list))
|
||||
(length stash-list)))
|
||||
(min vc-git-show-stash len)
|
||||
len))
|
||||
(shown-stashes (cl-subseq stash-list 0 limit))
|
||||
(hidden-stashes (cl-subseq stash-list limit))
|
||||
(all-hideable (eq vc-git-show-stash t)))
|
||||
(setq stash-button (vc-git-make-stash-button)
|
||||
(all-hideable (or (eq vc-git-show-stash t)
|
||||
(<= len vc-git-show-stash))))
|
||||
(setq stash-button (if all-hideable
|
||||
(vc-git-make-stash-button nil limit limit)
|
||||
(vc-git-make-stash-button t vc-git-show-stash len))
|
||||
stash-string
|
||||
(concat
|
||||
(when shown-stashes
|
||||
|
|
Loading…
Add table
Reference in a new issue