diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index 782694ac2..bf90e3f22 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -25,30 +25,31 @@ flycheck indicators moved to the right fringe.") (add-hook! 'find-file-hook (defun +vc-gutter-init-maybe-h () "Enable `git-gutter-mode' in the current buffer. - If the buffer doesn't represent an existing file, `git-gutter-mode's activation is deferred until the file is saved. Respects `git-gutter:disabled-modes'." (let ((file-name (buffer-file-name (buffer-base-buffer)))) - (when (or +vc-gutter-in-remote-files - (not (file-remote-p (or file-name default-directory)))) - (if (null file-name) - (add-hook 'after-save-hook #'+vc-gutter-init-maybe-h nil 'local) - (when (and (vc-backend file-name) - (progn - (require 'git-gutter) - (not (memq major-mode git-gutter:disabled-modes)))) - (if (and (display-graphic-p) - (require 'git-gutter-fringe nil t)) - (setq-local git-gutter:init-function #'git-gutter-fr:init - git-gutter:view-diff-function #'git-gutter-fr:view-diff-infos - git-gutter:clear-function #'git-gutter-fr:clear - git-gutter:window-width -1) - (setq-local git-gutter:init-function 'nil - git-gutter:view-diff-function #'git-gutter:view-diff-infos - git-gutter:clear-function #'git-gutter:clear-diff-infos - git-gutter:window-width 1)) - (git-gutter-mode +1) - (remove-hook 'after-save-hook #'+vc-gutter-init-maybe-h 'local))))))) + (cond + ((and (file-remote-p (or file-name default-directory)) + (not +vc-gutter-in-remote-files))) + ;; If not a valid file, wait until it is written/saved to activate + ;; git-gutter. + ((not (and file-name (vc-backend file-name))) + (add-hook 'after-save-hook #'+vc-gutter-init-maybe-h nil 'local)) + ;; Allow git-gutter or git-gutter-fringe to activate based on the type + ;; of frame we're in. This allows git-gutter to work for silly geese + ;; who open both tty and gui frames from the daemon. + ((if (and (display-graphic-p) + (require 'git-gutter-fringe nil t)) + (setq-local git-gutter:init-function #'git-gutter-fr:init + git-gutter:view-diff-function #'git-gutter-fr:view-diff-infos + git-gutter:clear-function #'git-gutter-fr:clear + git-gutter:window-width -1) + (setq-local git-gutter:init-function 'nil + git-gutter:view-diff-function #'git-gutter:view-diff-infos + git-gutter:clear-function #'git-gutter:clear-diff-infos + git-gutter:window-width 1)) + (git-gutter-mode +1) + (remove-hook 'after-save-hook #'+vc-gutter-init-maybe-h 'local)))))) ;; Disable in Org mode, as per syl20bnr/spacemacs#10555 and ;; syohex/emacs-git-gutter#24. Apparently, the mode-enabling function for @@ -72,11 +73,12 @@ is deferred until the file is saved. Respects `git-gutter:disabled-modes'." (defun +vc-gutter-update-h (&rest _) "Refresh git-gutter on ESC. Return nil to prevent shadowing other `doom-escape-hook' hooks." - (when (and git-gutter-mode - (not (memq this-command '(git-gutter:stage-hunk - git-gutter:revert-hunk))) - (not inhibit-redisplay)) - (ignore (git-gutter))))) + (unless (or (memq this-command '(git-gutter:stage-hunk + git-gutter:revert-hunk)) + inhibit-redisplay) + (ignore (if git-gutter-mode + (git-gutter) + (+vc-gutter-init-maybe-h)))))) ;; update git-gutter when using magit commands (advice-add #'magit-stage-file :after #'+vc-gutter-update-h) (advice-add #'magit-unstage-file :after #'+vc-gutter-update-h)