feature/version-control => ui/vc-gutter, emacs/vc
Reorganize vcs functionality. Moves the custom fringe bitmaps into :ui vc-gutter.
This commit is contained in:
parent
e05d7cfee0
commit
60779c9aed
11 changed files with 237 additions and 152 deletions
161
modules/ui/vc-gutter/config.el
Normal file
161
modules/ui/vc-gutter/config.el
Normal file
|
@ -0,0 +1,161 @@
|
|||
;;; ui/vc-gutter/config.el -*- lexical-binding: t; -*-
|
||||
|
||||
(defvar +vc-gutter-in-margin nil
|
||||
"If non-nil, use the margin for diffs instead of the fringe.")
|
||||
|
||||
(defvar +vc-gutter-in-remote-files nil
|
||||
"If non-nil, enable the vc gutter in remote files (e.g. open through TRAMP).")
|
||||
|
||||
(defvar +vc-gutter-diff-unsaved-buffer nil
|
||||
"If non-nil, `diff-hl-flydiff-mode' will be activated. This allows on-the-fly
|
||||
diffing, even for unsaved buffers.")
|
||||
|
||||
(defvar +vc-gutter-default-style t
|
||||
"If non-nil, enable the default look of the vc gutter. This means subtle thin
|
||||
bitmaps on the left, an arrow bitmap for flycheck, and flycheck indicators moved
|
||||
to the right fringe.")
|
||||
|
||||
|
||||
;;
|
||||
;; Plugins
|
||||
;;
|
||||
|
||||
(def-package! git-gutter-fringe
|
||||
:defer t
|
||||
:init
|
||||
(defun +version-control|git-gutter-maybe ()
|
||||
"Enable `git-gutter-mode' in non-remote buffers."
|
||||
(when (and buffer-file-name
|
||||
(vc-backend buffer-file-name)
|
||||
(or +vc-gutter-in-remote-files
|
||||
(not (file-remote-p buffer-file-name))))
|
||||
(require 'git-gutter-fringe)
|
||||
(git-gutter-mode +1)))
|
||||
(add-hook! (text-mode prog-mode conf-mode after-save)
|
||||
#'+version-control|git-gutter-maybe)
|
||||
;; standardize default fringe width
|
||||
(if (fboundp 'fringe-mode) (fringe-mode '4))
|
||||
:config
|
||||
(set-popup-rule! "^\\*git-gutter" :select nil)
|
||||
|
||||
;; Update git-gutter on focus (in case I was using git externally)
|
||||
(add-hook 'focus-in-hook #'git-gutter:update-all-windows)
|
||||
|
||||
(defun +version-control|update-git-gutter (&rest _)
|
||||
"Refresh git-gutter on ESC. Return nil to prevent shadowing other
|
||||
`doom-escape-hook' hooks."
|
||||
(when git-gutter-mode
|
||||
(ignore (git-gutter))))
|
||||
(add-hook 'doom-escape-hook #'+version-control|update-git-gutter t)
|
||||
|
||||
;; update git-gutter when using these commands
|
||||
(add-hook 'magit-post-refresh-hook #'+version-control|update-git-gutter)
|
||||
|
||||
(defhydra +version-control@git-gutter
|
||||
(:body-pre (git-gutter-mode 1) :hint nil)
|
||||
"
|
||||
╭─────────────────┐
|
||||
Movement Hunk Actions Misc. │ gg: +%-4s(car (git-gutter:statistic))/ -%-3s(cdr (git-gutter:statistic)) │
|
||||
╭──────────────────────────────────┴─────────────────╯
|
||||
^_g_^ [_s_] stage [_R_] set start Rev
|
||||
^_k_^ [_r_] revert
|
||||
^↑ ^ [_m_] mark
|
||||
^↓ ^ [_p_] popup ╭──────────────────────
|
||||
^_j_^ │[_q_] quit
|
||||
^_G_^ │[_Q_] Quit and disable"
|
||||
("j" (progn (git-gutter:next-hunk 1) (recenter)))
|
||||
("k" (progn (git-gutter:previous-hunk 1) (recenter)))
|
||||
("g" (progn (goto-char (point-min)) (git-gutter:next-hunk 1)))
|
||||
("G" (progn (goto-char (point-min)) (git-gutter:previous-hunk 1)))
|
||||
("s" git-gutter:stage-hunk)
|
||||
("r" git-gutter:revert-hunk)
|
||||
("m" git-gutter:mark-hunk)
|
||||
("p" git-gutter:popup-hunk)
|
||||
("R" git-gutter:set-start-revision)
|
||||
("q" nil :color blue)
|
||||
("Q" (git-gutter-mode -1) :color blue))
|
||||
|
||||
;; subtle diff indicators in the fringe
|
||||
(when +vc-gutter-default-style
|
||||
;; places the git gutter outside the margins.
|
||||
(setq-default fringes-outside-margins t)
|
||||
;; thin fringe bitmaps
|
||||
(define-fringe-bitmap 'git-gutter-fr:added [224]
|
||||
nil nil '(center repeated))
|
||||
(define-fringe-bitmap 'git-gutter-fr:modified [224]
|
||||
nil nil '(center repeated))
|
||||
(define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240]
|
||||
nil nil 'bottom)
|
||||
;; let diff have left fringe, flycheck can have right fringe
|
||||
(after! flycheck
|
||||
(setq flycheck-indication-mode 'right-fringe)
|
||||
;; A non-descript, left-pointing arrow
|
||||
(define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow
|
||||
[16 48 112 240 112 48 16] nil nil 'center))))
|
||||
|
||||
|
||||
;; (def-package! diff-hl
|
||||
;; :defer t
|
||||
;; :init
|
||||
;; (defun +vc-gutter|init ()
|
||||
;; "Start `diff-hl-mode' if in a file-visiting and tracked buffer."
|
||||
;; (when (and buffer-file-name
|
||||
;; (vc-state buffer-file-name)
|
||||
;; (or +vc-gutter-in-remote-files
|
||||
;; (not (file-remote-p buffer-file-name))))
|
||||
;; (diff-hl-mode +1)))
|
||||
;; (add-hook! (text-mode prog-mode conf-mode after-save)
|
||||
;; #'+vc-gutter|init)
|
||||
;; ;; standardize fringe size
|
||||
;; (if (fboundp 'fringe-mode) (fringe-mode '4))
|
||||
;; :config
|
||||
;; (setq vc-git-diff-switches '("--histogram"))
|
||||
;; ;; Update diffs when it makes sense too, without being too slow
|
||||
;; (if (not +vc-gutter-diff-unsaved-buffer)
|
||||
;; (add-hook! '(doom-escape-hook focus-in-hook) #'diff-hl-update)
|
||||
;; (diff-hl-flydiff-mode +1)
|
||||
;; (add-hook! '(doom-escape-hook focus-in-hook) #'diff-hl-flydiff-update)
|
||||
;; (when (featurep! :feature evil)
|
||||
;; (when diff-hl-flydiff-timer
|
||||
;; (cancel-timer diff-hl-flydiff-timer))
|
||||
;; (add-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update)))
|
||||
;; ;; Don't delete the current hunk's indicators while we're editing
|
||||
;; (advice-remove #'diff-hl-overlay-modified #'ignore)
|
||||
;; ;; Update diff-hl when magit refreshes
|
||||
;; (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh)
|
||||
;; ;; update git-gutter when using these commands
|
||||
;; (advice-add #'magit-stage :after #'+version-control|update-git-gutter)
|
||||
;; (advice-add #'magit-unstage :after #'+version-control|update-git-gutter)
|
||||
;; (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter)
|
||||
;; (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter)
|
||||
;; ;; Draw me like one of your French editors
|
||||
;; (setq-default fringes-outside-margins t)
|
||||
;; (cond ((or +vc-gutter-in-margin (not (display-graphic-p)))
|
||||
;; (diff-hl-margin-mode)
|
||||
;; (setq diff-hl-margin-symbols-alist
|
||||
;; '((insert . "❙") (delete . "^") (change . "❙")
|
||||
;; (unknown . "❙") (ignored . "❙"))))
|
||||
;; (t
|
||||
;; ;; Because diff-hl is in the left fringe
|
||||
;; (setq flycheck-indication-mode 'right-fringe)
|
||||
;; (defun +vc-gutter|setup-fringe-bitmaps ()
|
||||
;; "Define thin fringe bitmaps for maximum sexiness."
|
||||
;; (define-fringe-bitmap 'diff-hl-bmp-top [224] nil nil '(center repeated))
|
||||
;; (define-fringe-bitmap 'diff-hl-bmp-middle [224] nil nil '(center repeated))
|
||||
;; (define-fringe-bitmap 'diff-hl-bmp-bottom [224] nil nil '(center repeated))
|
||||
;; (define-fringe-bitmap 'diff-hl-bmp-insert [224] nil nil '(center repeated))
|
||||
;; (define-fringe-bitmap 'diff-hl-bmp-single [224] nil nil '(center repeated))
|
||||
;; (define-fringe-bitmap 'diff-hl-bmp-delete [240 224 192 128] nil nil 'top))
|
||||
;; (defun +vc-gutter-type-at-pos (type _pos)
|
||||
;; "Return the bitmap for `diff-hl' to use for change at point."
|
||||
;; (pcase type
|
||||
;; (`unknown 'question-mark)
|
||||
;; (`delete 'diff-hl-bmp-delete)
|
||||
;; (`change 'diff-hl-bmp-middle)
|
||||
;; (`ignored 'diff-hl-bmp-i)
|
||||
;; (x (intern (format "diff-hl-bmp-%s" x)))))
|
||||
;; ;; Tweak the fringe bitmaps so we get long, elegant bars
|
||||
;; (setq diff-hl-fringe-bmp-function #'+vc-gutter-type-at-pos
|
||||
;; diff-hl-draw-borders nil)
|
||||
;; (add-hook 'diff-hl-mode-hook #'+vc-gutter|setup-fringe-bitmaps))))
|
||||
|
5
modules/ui/vc-gutter/packages.el
Normal file
5
modules/ui/vc-gutter/packages.el
Normal file
|
@ -0,0 +1,5 @@
|
|||
;; -*- no-byte-compile: t; -*-
|
||||
;;; ui/vc-gutter/packages.el
|
||||
|
||||
(package! git-gutter-fringe)
|
||||
;; (package! diff-hl)
|
Loading…
Add table
Add a link
Reference in a new issue