From 886ac4be3f0cc1cef26a1c6e44a081c8e2ca1065 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Sun, 24 Jan 2016 23:39:26 -0800 Subject: [PATCH 1/2] Make git-gutter+-next-hunk and git-gutter+-previous-hunk be repeatable by final keystroke. --- git-gutter+.el | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/git-gutter+.el b/git-gutter+.el index 561627c..36b3ec2 100644 --- a/git-gutter+.el +++ b/git-gutter+.el @@ -33,6 +33,7 @@ (require 'tramp) (require 'log-edit) (require 'git-commit) +(require 'repeat) (defgroup git-gutter+ nil "Manage Git hunks straight from the buffer" @@ -566,12 +567,27 @@ Returns t on zero exit code, nil otherwise." (let ((next (if is-reverse (1+ index) (1- index)))) (mod (+ arg next) len)) (if is-reverse (1- (length diffinfos)) 0))) - (diffinfo (nth real-index diffinfos))) + (diffinfo (nth real-index diffinfos)) + (repeat-char + (if (eq repeat-on-final-keystroke t) + last-command-event + (car (memq last-command-event + (listify-key-sequence + repeat-on-final-keystroke)))))) (goto-char (point-min)) (forward-line (1- (plist-get diffinfo :start-line))) (when (buffer-live-p (get-buffer git-gutter+-popup-buffer)) (save-window-excursion - (git-gutter+-show-hunk diffinfo))))))) + (git-gutter+-show-hunk diffinfo))) + (when repeat-char + (let ((map (make-sparse-keymap))) + (define-key map (vector repeat-char) + `(lambda () + (interactive) + (git-gutter+-next-hunk ,arg))) + (cond ((fboundp 'set-transient-map) (set-transient-map map)) + ((fboundp 'set-temporary-overlay-map) (set-temporary-overlay-map map)) + (t)))))))) (defun git-gutter+-previous-hunk (arg) "Move to previous diff hunk" From 6b714afffd61f1ca3748f581afa9b8770c13f4cc Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Wed, 17 Dec 2025 12:26:32 -0800 Subject: [PATCH 2/2] gooder --- git-gutter+.el | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/git-gutter+.el b/git-gutter+.el index 36b3ec2..fab0577 100644 --- a/git-gutter+.el +++ b/git-gutter+.el @@ -1139,13 +1139,14 @@ set remove it." (concat "\\`\\(?:" git-gutter+-commit-header-regex "\\)?")) ;; Modify git-commit-summary-regexp to ignore the commit header -(defadvice git-commit-summary-regexp - (after ignore-git-gutter+-commit-header activate compile) - (if (eq major-mode 'git-gutter+-commit-mode) - (setq ad-return-value - (concat git-gutter+-skip-commit-header-regex - (substring ; Remove leading "\\`" - ad-return-value 2))))) +(defun git-gutter+-commit-summary-regexp-ignore-header (orig-fun &rest args) + "Ignore the commit header in git-gutter+-commit-mode." + (let ((result (apply orig-fun args))) + (if (eq major-mode 'git-gutter+-commit-mode) + (concat git-gutter+-skip-commit-header-regex + (substring result 2)) ; Remove leading "\\`" + result))) +(advice-add 'git-commit-summary-regexp :around #'git-gutter+-commit-summary-regexp-ignore-header) (defun git-gutter+-commit-font-lock-keywords () "Like `git-commit-mode-font-lock-keywords' but with commit header highlighting" @@ -1164,20 +1165,19 @@ set remove it." (funcall git-gutter+-orig-vc-find-file-hook) (if git-gutter+-mode (git-gutter+-refresh)))) -(defadvice magit-update-vc-modeline (around refresh-git-gutter+ compile activate) - ;; `magit-update-vc-modeline' calls `vc-find-file-hook' (a function!) on each - ;; buffer in the repo. Temporarily rebind it to `vc-find-file-hook-with-refresh', - ;; which calls git-gutter+-refresh after updating the VC mode line. - - ;; Silence the byte-compiler. The top-level defvar for `git-gutter+-orig-vc-find-file-hook' - ;; isn't sufficient for this compiled defadvice. +(defun git-gutter+-magit-update-vc-modeline-refresh (orig-fun &rest args) + "Refresh git-gutter+ when magit updates VC modeline. +`magit-update-vc-modeline' calls `vc-find-file-hook' (a function!) on each +buffer in the repo. Temporarily rebind it to `vc-find-file-hook-with-refresh', +which calls git-gutter+-refresh after updating the VC mode line." (defvar git-gutter+-orig-vc-find-file-hook) ;; Using `flet' would have been much simpler, but it's deprecated since 24.3. (setq git-gutter+-orig-vc-find-file-hook (symbol-function 'vc-find-file-hook)) (fset 'vc-find-file-hook git-gutter+-vc-find-file-hook-with-refresh) (unwind-protect - ad-do-it + (apply orig-fun args) (fset 'vc-find-file-hook git-gutter+-orig-vc-find-file-hook))) +(advice-add 'magit-update-vc-modeline :around #'git-gutter+-magit-update-vc-modeline-refresh) ;; 2. Refresh git-gutter+ when a buffer is staged or unstaged (defvar git-gutter+-last-magit-head nil)