Mercurial > emacs
changeset 106384:8272f561b710
Support applying stashes. Improve UI.
* vc-git.el (vc-git-dir-extra-headers): Add tooltips.
(vc-git-stash-apply, vc-git-stash-pop)
(vc-git-stash-apply-at-point, vc-git-stash-pop-at-point)
(vc-git-stash-menu): New functions.
(vc-git-stash-menu-map): New variable.
(vc-git-stash-map): Add bindings to popup a menu and to apply stashes.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Thu, 03 Dec 2009 04:08:08 +0000 |
parents | 09d0cce6cdd3 |
children | cd8b405d57c6 |
files | etc/NEWS lisp/ChangeLog lisp/vc-git.el |
diffstat | 3 files changed, 64 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/etc/NEWS Thu Dec 03 03:11:14 2009 +0000 +++ b/etc/NEWS Thu Dec 03 04:08:08 2009 +0000 @@ -264,7 +264,7 @@ Signed-off-by line when committing. **** Support for operating with stashes has been added to vc-dir: the stash list is -displayed in the *vc-dir* header, stashes can be created, removed and +displayed in the *vc-dir* header, stashes can be created, removed, applied and their content displayed. **** vc-dir displays the stash status
--- a/lisp/ChangeLog Thu Dec 03 03:11:14 2009 +0000 +++ b/lisp/ChangeLog Thu Dec 03 04:08:08 2009 +0000 @@ -1,3 +1,13 @@ +2009-12-03 Dan Nicolaescu <dann@ics.uci.edu> + + Support applying stashes. Improve UI. + * vc-git.el (vc-git-dir-extra-headers): Add tooltips. + (vc-git-stash-apply, vc-git-stash-pop) + (vc-git-stash-apply-at-point, vc-git-stash-pop-at-point) + (vc-git-stash-menu): New functions. + (vc-git-stash-menu-map): New variable. + (vc-git-stash-map): Add bindings to popup a menu and to apply stashes. + 2009-12-03 Glenn Morris <rgm@gnu.org> * vc.el (log-view-vc-backend, log-view-vc-fileset): Declare.
--- a/lisp/vc-git.el Thu Dec 03 03:11:14 2009 +0000 +++ b/lisp/vc-git.el Thu Dec 03 04:08:08 2009 +0000 @@ -405,9 +405,31 @@ (defvar vc-git-stash-map (let ((map (make-sparse-keymap))) + ;; Turn off vc-dir marking + (define-key map [mouse-2] 'ignore) + + (define-key map [down-mouse-3] 'vc-git-stash-menu) (define-key map "\C-k" 'vc-git-stash-delete-at-point) (define-key map "=" 'vc-git-stash-show-at-point) (define-key map "\C-m" 'vc-git-stash-show-at-point) + (define-key map "A" 'vc-git-stash-apply-at-point) + (define-key map "P" 'vc-git-stash-pop-at-point) + map)) + +(defvar vc-git-stash-menu-map + (let ((map (make-sparse-keymap "Git Stash"))) + (define-key map [de] + '(menu-item "Delete stash" vc-git-stash-delete-at-point + :help "Delete the current stash")) + (define-key map [ap] + '(menu-item "Apply stash" vc-git-stash-apply-at-point + :help "Apply the current stash and keep it in the stash list")) + (define-key map [po] + '(menu-item "Apply and remove stash (pop)" vc-git-stash-pop-at-point + :help "Apply the current stash and remove it")) + (define-key map [sh] + '(menu-item "Show stash" vc-git-stash-show-at-point + :help "Show the contents of the current stash")) map)) (defun vc-git-dir-extra-headers (dir) @@ -415,6 +437,7 @@ (with-current-buffer standard-output (vc-git--out-ok "symbolic-ref" "HEAD")))) (stash (vc-git-stash-list)) + (stash-help-echo "Use M-x vc-git-stash to create stashes.") branch remote remote-url) (if (string-match "^\\(refs/heads/\\)?\\(.+\\)$" str) (progn @@ -447,17 +470,21 @@ "\n" (if stash (concat - (propertize "Stash :\n" 'face 'font-lock-type-face) + (propertize "Stash :\n" 'face 'font-lock-type-face + 'help-echo stash-help-echo) (mapconcat (lambda (x) (propertize x 'face 'font-lock-variable-name-face 'mouse-face 'highlight + 'help-echo "mouse-3: Show stash menu\nRET: Show stash\nA: Apply stash\nP: Apply and remove stash (pop)\nC-k: Delete stash" 'keymap vc-git-stash-map)) stash "\n")) (concat - (propertize "Stash : " 'face 'font-lock-type-face) + (propertize "Stash : " 'face 'font-lock-type-face + 'help-echo stash-help-echo) (propertize "Nothing stashed" + 'help-echo stash-help-echo 'face 'font-lock-variable-name-face)))))) ;;; STATE-CHANGING FUNCTIONS @@ -816,6 +843,18 @@ (setq buffer-read-only t) (pop-to-buffer (current-buffer))) +(defun vc-git-stash-apply (name) + "Apply stash NAME." + (interactive "sApply stash: ") + (vc-git-command "*vc-git-stash*" 0 nil "stash" "apply" "-q" name) + (vc-resynch-buffer (vc-git-root default-directory) t t)) + +(defun vc-git-stash-pop (name) + "Pop stash NAME." + (interactive "sPop stash: ") + (vc-git-command "*vc-git-stash*" 0 nil "stash" "pop" "-q" name) + (vc-resynch-buffer (vc-git-root default-directory) t t)) + (defun vc-git-stash-list () (delete "" @@ -843,6 +882,18 @@ (interactive) (vc-git-stash-show (format "stash@%s" (vc-git-stash-get-at-point (point))))) +(defun vc-git-stash-apply-at-point () + (interactive) + (vc-git-stash-apply (format "stash@%s" (vc-git-stash-get-at-point (point))))) + +(defun vc-git-stash-pop-at-point () + (interactive) + (vc-git-stash-pop (format "stash@%s" (vc-git-stash-get-at-point (point))))) + +(defun vc-git-stash-menu (e) + (interactive "e") + (vc-dir-at-event e (popup-menu vc-git-stash-menu-map e))) + ;;; Internal commands