From 1d40602c3e6bea6bfa1aaa3c04ece85c2c41b7f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 May 2019 02:14:14 -0400 Subject: [PATCH] ui/vc-gutter: defer git-gutter until file exists If the current buffer doesn't represent a real file, defer enabling git-gutter-mode until the file is saved. --- modules/ui/vc-gutter/config.el | 39 +++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index daed7ec42..7bbfa70c7 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -23,23 +23,28 @@ to the right fringe.") :commands (git-gutter:revert-hunk git-gutter:stage-hunk) :init (defun +version-control|git-gutter-maybe () - "Enable `git-gutter-mode' in non-remote buffers." - (when (and buffer-file-name - (or +vc-gutter-in-remote-files - (not (file-remote-p buffer-file-name))) - (vc-backend buffer-file-name)) - (if (display-graphic-p) - (progn - (require 'git-gutter-fringe) - (setq-local git-gutter:init-function #'git-gutter-fr:init) - (setq-local git-gutter:view-diff-function #'git-gutter-fr:view-diff-infos) - (setq-local git-gutter:clear-function #'git-gutter-fr:clear) - (setq-local git-gutter:window-width -1)) - (setq-local git-gutter:init-function 'nil) - (setq-local git-gutter:view-diff-function #'git-gutter:view-diff-infos) - (setq-local git-gutter:clear-function #'git-gutter:clear-diff-infos) - (setq-local git-gutter:window-width 1)) - (git-gutter-mode +1))) + "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." + (when (or +vc-gutter-in-remote-files + (not (file-remote-p (or buffer-file-name default-directory)))) + (if (not buffer-file-name) + (add-hook 'after-save-hook #'+version-control|git-gutter-maybe nil t) + (when (vc-backend buffer-file-name) + (if (display-graphic-p) + (progn + (require 'git-gutter-fringe) + (setq-local git-gutter:init-function #'git-gutter-fr:init) + (setq-local git-gutter:view-diff-function #'git-gutter-fr:view-diff-infos) + (setq-local git-gutter:clear-function #'git-gutter-fr:clear) + (setq-local git-gutter:window-width -1)) + (setq-local git-gutter:init-function 'nil) + (setq-local git-gutter:view-diff-function #'git-gutter:view-diff-infos) + (setq-local git-gutter:clear-function #'git-gutter:clear-diff-infos) + (setq-local git-gutter:window-width 1)) + (git-gutter-mode +1) + (remove-hook 'after-save-hook #'+version-control|git-gutter-maybe t))))) (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) ;; standardize default fringe width