Skip to content

Instantly share code, notes, and snippets.

@syohex
Created July 24, 2016 03:09
Show Gist options
  • Save syohex/d51da18c9c7bccecfa96fa808b11a956 to your computer and use it in GitHub Desktop.
Save syohex/d51da18c9c7bccecfa96fa808b11a956 to your computer and use it in GitHub Desktop.
List hunks and jump there
diff --git a/git-gutter.el b/git-gutter.el
index 15dc837..29c0425 100644
--- a/git-gutter.el
+++ b/git-gutter.el
@@ -1057,6 +1057,72 @@ start revision."
(message "Added %d lines, Deleted %d lines" added deleted))
(cons added deleted))))
+(defvar git-gutter:list-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map (kbd "q") #'quit-window)
+ (define-key map (kbd "RET") #'git-gutter:list-goto-line)
+ (define-key map (kbd "n") #'git-gutter:list-next-line)
+ (define-key map (kbd "p") #'git-gutter:list-previous-line)
+ map))
+
+(defvar git-gutter:list-buffer nil)
+(defun git-gutter:list-goto-line ()
+ (interactive)
+ (let ((linestr (car (split-string (buffer-substring-no-properties
+ (line-beginning-position) (line-end-position)) ":"))))
+ (select-window (get-buffer-window git-gutter:list-buffer))
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (forward-line (1- (string-to-number linestr))))))
+
+(defun git-gutter:list-next-line (arg)
+ (interactive "p")
+ (forward-line arg)
+ (when (eobp)
+ (goto-char (point-min)))
+ (save-selected-window
+ (git-gutter:list-goto-line)))
+
+(defun git-gutter:list-previous-line (arg)
+ (interactive "p")
+ (forward-line (- arg))
+ (when (bobp)
+ (goto-char (point-max))
+ (forward-line -1))
+ (save-selected-window
+ (git-gutter:list-goto-line)))
+
+(define-derived-mode git-gutter:list-mode nil ""
+ ""
+ (setq buffer-read-only t)
+ (use-local-map git-gutter:list-mode-map))
+
+(defun git-gutter:list ()
+ (interactive)
+ (let ((diffinfos git-gutter:diffinfos)
+ (buf (current-buffer)))
+ (with-current-buffer (get-buffer-create "*git-gutter-list*")
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (cl-loop for diffinfo in diffinfos
+ for start-line = (git-gutter-hunk-start-line diffinfo)
+ for first-line = (with-temp-buffer
+ (insert (git-gutter-hunk-content diffinfo))
+ (goto-char (point-min))
+ (forward-line +1)
+ (buffer-substring-no-properties
+ (1+ (point)) (line-end-position)))
+ do
+ (insert (format "%s: %s\n"
+ (propertize (number-to-string start-line)
+ 'face '((:foreground "cyan")))
+ first-line)))
+ (git-gutter:list-mode)
+ (set (make-local-variable 'git-gutter:list-buffer) buf)
+ (goto-char (point-min))
+ (pop-to-buffer (current-buffer))))))
+
(provide 'git-gutter)
;;; git-gutter.el ends here
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment