Mercurial > emacs
diff lisp/vc-git.el @ 105129:5fc493595567
(vc-git-dir-extra-headers): Add keymap and mouse-face
properties to the stash strings.
(vc-git-stash-list): Return a list of strings.
(vc-git-stash-get-at-point, vc-git-stash-delete-at-point)
(vc-git-stash-show-at-point): New functions.
(vc-git-stash-map): New keymap.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Sun, 20 Sep 2009 19:51:35 +0000 |
parents | f43dfae3e132 |
children | 1987d1800365 |
line wrap: on
line diff
--- a/lisp/vc-git.el Sun Sep 20 18:22:37 2009 +0000 +++ b/lisp/vc-git.el Sun Sep 20 19:51:35 2009 +0000 @@ -408,7 +408,6 @@ (if (string-match "^\\(refs/heads/\\)?\\(.+\\)$" str) (progn (setq branch (match-string 2 str)) - (message "branch (%s)" branch) (setq remote (with-output-to-string (with-current-buffer standard-output @@ -424,7 +423,6 @@ (setq remote-url (match-string 1 remote-url)))) "not (detached HEAD)") ;; FIXME: maybe use a different face when nothing is stashed. - (when (string= stash "") (setq stash "Nothing stashed")) (concat (propertize "Branch : " 'face 'font-lock-type-face) (propertize branch @@ -436,10 +434,20 @@ (propertize remote-url 'face 'font-lock-variable-name-face))) "\n" - (propertize "Stash : " 'face 'font-lock-type-face) - (propertize - stash - 'face 'font-lock-variable-name-face)))) + (if stash + (concat + (propertize "Stash :\n" 'face 'font-lock-type-face) + (mapconcat + (lambda (x) + (propertize x + 'face 'font-lock-variable-name-face + 'mouse-face 'highlight + 'keymap vc-git-stash-map)) + stash "\n")) + (concat + (propertize "Stash : " 'face 'font-lock-type-face) + (propertize "Nothing stashed" + 'face 'font-lock-variable-name-face)))))) ;;; STATE-CHANGING FUNCTIONS @@ -797,10 +805,38 @@ (pop-to-buffer (current-buffer))) (defun vc-git-stash-list () - (replace-regexp-in-string - "\n" "\n " - (replace-regexp-in-string - "^stash@" "" (vc-git--run-command-string nil "stash" "list")))) + (delete + "" + (split-string + (replace-regexp-in-string + "^stash@" " " (vc-git--run-command-string nil "stash" "list")) + "\n"))) + +(defun vc-git-stash-get-at-point (point) + (save-excursion + (goto-char point) + (beginning-of-line) + (if (looking-at "^ +\\({[0-9]+}\\):") + (match-string 1) + (error "Cannot find stash at point")))) + +(defun vc-git-stash-delete-at-point () + (interactive) + (let ((stash (vc-git-stash-get-at-point (point)))) + (when (y-or-n-p (format "Remove stash %s ?" stash)) + (vc-git--run-command-string nil "stash" "drop" (format "stash@%s" stash)) + (vc-dir-refresh)))) + +(defun vc-git-stash-show-at-point () + (interactive) + (vc-git-stash-show (format "stash@%s" (vc-git-stash-get-at-point (point))))) + +(defvar vc-git-stash-map + (let ((map (make-sparse-keymap))) + (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) + map)) ;;; Internal commands