spacemacs/contrib/tools/git/packages.el
Tu Do 9f715a5cf7 Enable fci-mode in git-commit-mode
Having fci-mode to visually indicate the limit of commit message region
is nice. With it, we know exactly our text does not cross the limit (i.e
72 columns). Sometimes, text can cross the boundary if we add something
but use C-n or j to move to next line.
2015-05-10 01:35:24 -04:00

388 lines
13 KiB
EmacsLisp

;;; packages.el --- Git Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2014 Sylvain Benner
;; Copyright (c) 2014-2015 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(setq git-packages
'(
gitattributes-mode
gitconfig-mode
gitignore-mode
git-commit-mode
git-messenger
git-rebase-mode
git-timemachine
gist
github-browse-file
git-link
;; not up to date
;; helm-gist
magit
magit-gh-pulls
magit-gitflow
magit-svn
smeargle
))
(if git-gutter-use-fringe
(push 'git-gutter-fringe git-packages)
(push 'git-gutter git-packages))
(defun git/init-gist ()
(use-package gist
:if git-enable-github-support
:defer t
:init
(progn
(evilify gist-list-menu-mode gist-list-menu-mode-map
"f" 'gist-fetch-current
"K" 'gist-kill-current
"o" 'gist-browse-current-url)
(evil-leader/set-key
"ggb" 'gist-buffer
"ggB" 'gist-buffer-private
"ggl" 'gist-list
"ggr" 'gist-region
"ggR" 'gist-region-private))))
(defun git/init-git-commit-mode ()
(use-package git-commit-mode
:defer t
:config
(evil-leader/set-key-for-mode 'git-commit-mode
"mcc" 'git-commit-commit
"mk" 'git-commit-abort)))
(defun init-git-gutter ()
"Common initialization of git-gutter."
(git-gutter-mode)
(setq git-gutter:modified-sign " ")
(setq git-gutter:added-sign "+")
(setq git-gutter:deleted-sign "-")
(spacemacs|hide-lighter git-gutter-mode)
(if (and (not git-gutter-use-fringe)
(or 'linum-mode global-linum-mode))
(git-gutter:linum-setup))
(eval-after-load (or 'git-gutter 'git-gutter-fringe)
(progn
(evil-leader/set-key
"ghs" 'git-gutter:stage-hunk
"ghr" 'git-gutter:revert-hunk
"ghN" 'git-gutter:previous-hunk
"ghn" 'git-gutter:next-hunk
"ghp" 'git-gutter:popup-hunk))))
(defun git/init-git-gutter ()
(use-package git-gutter
:commands git-gutter-mode
:init
(progn
(init-git-gutter)
(add-to-hooks 'git-gutter-mode '(markdown-mode-hook
org-mode-hook
prog-mode-hook)))))
(defun git/init-git-gutter-fringe ()
(use-package git-gutter-fringe
:commands git-gutter-mode
:init
(progn
(defun git/load-git-gutter ()
"Lazy load git gutter and choose between fringe and no fringe."
(when (display-graphic-p) (require 'git-gutter-fringe))
(init-git-gutter))
(setq git-gutter-fr:side 'right-fringe)
(add-to-hooks 'git/load-git-gutter '(markdown-mode-hook
org-mode-hook
prog-mode-hook)))
:config
(progn
(setq git-gutter:hide-gutter t)
;; Don't need log/message.
(setq git-gutter:verbosity 0)
;; (setq git-gutter:update-hooks '(after-save-hook after-revert-hook))
;; custom graphics that works nice with half-width fringes
(fringe-helper-define 'git-gutter-fr:added nil
"..X...."
"..X...."
"XXXXX.."
"..X...."
"..X...."
)
(fringe-helper-define 'git-gutter-fr:deleted nil
"......."
"......."
"XXXXX.."
"......."
"......."
)
(fringe-helper-define 'git-gutter-fr:modified nil
"..X...."
".XXX..."
"XXXXX.."
".XXX..."
"..X...."
))))
(defun git/init-git-messenger ()
(use-package git-messenger
:defer t
:init
(evil-leader/set-key
"gm" 'git-messenger:popup-message)))
(defun git/init-git-rebase-mode ()
(use-package git-rebase-mode
:defer t
:config
(progn
(evilify git-rebase-mode git-rebase-mode-map
"J" 'git-rebase-move-line-down
"K" 'git-rebase-move-line-up
"u" 'git-rebase-undo
"y" 'git-rebase-insert)
(evil-leader/set-key-for-mode 'git-rebase-mode
"mcc" 'git-rebase-server-edit
"mk" 'git-rebase-abort))))
(defun git/init-git-timemachine ()
(use-package git-timemachine
:defer t
:commands spacemacs/time-machine-micro-state
:init
(evil-leader/set-key
"gt" 'spacemacs/time-machine-micro-state)
:config
(progn
(defun spacemacs//time-machine-ms-on-enter ()
"Initiate git-timemachine properly with goden-ratio support."
(let ((golden-ratio (when (boundp 'golden-ratio-mode)
golden-ratio-mode)))
(when (bound-and-true-p golden-ratio-mode) (golden-ratio-mode -1))
(git-timemachine)
(when golden-ratio (golden-ratio-mode))))
(spacemacs|define-micro-state time-machine
:doc "[p] [N] previous [n] next [c] current [Y] copy hash [q] quit"
:on-enter (spacemacs//time-machine-ms-on-enter)
:on-exit (git-timemachine-quit)
:persistent t
:bindings
("c" git-timemachine-show-current-revision)
("p" git-timemachine-show-previous-revision)
("n" git-timemachine-show-next-revision)
("N" git-timemachine-show-previous-revision)
("Y" git-timemachine-kill-revision)
("q" nil :exit t)))))
(defun git/init-gitattributes-mode ()
(use-package gitattributes-mode
:defer t))
(defun git/init-gitconfig-mode ()
(use-package gitconfig-mode
:defer t))
(defun git/init-gitignore-mode ()
(use-package gitignore-mode
:defer t))
;; this mode is not up to date
;; any contributor to make it up to date is welcome:
;; https://github.com/emacs-helm/helm-gist
;;
;; (defun git/init-helm-gist ()
;; (use-package helm-gist
;; :commands egist-mode
;; :init
;; (progn
;; (defun spacemacs/helm-gist-list ()
;; "List the gists using helm, ensure thath elgist-mode is enabled."
;; (interactive)
;; (egist-mode)
;; (helm-for-gist))
;; (evil-leader/set-key "ggh" 'spacemacs/helm-gist-list))
;; ))
(defun git/init-magit ()
(use-package magit
:defer t
:init
(progn
(setq magit-last-seen-setup-instructions "1.4.0"
magit-completing-read-function 'magit-ido-completing-read)
(add-hook 'git-commit-mode-hook 'fci-mode)
;; must enable auto-fill-mode again because somehow fci-mode disable it
(add-hook 'git-commit-mode-hook 'auto-fill-mode)
;; On Windows, we must use Git GUI to enter username and password
;; See: https://github.com/magit/magit/wiki/FAQ#windows-cannot-push-via-https
(when (eq window-system 'w32)
(setenv "GIT_ASKPASS" "git-gui--askpass"))
(evil-leader/set-key
"gb" 'magit-blame-mode
"gl" 'magit-log
"gs" 'magit-status
"gC" 'magit-commit)
(evilify magit-commit-mode magit-commit-mode-map
(kbd "C-j") 'magit-goto-next-section
(kbd "C-k") 'magit-goto-previous-section
(kbd "C-n") 'magit-goto-next-section
(kbd "C-p") 'magit-goto-previous-section
(kbd "C-v") 'magit-revert-item)
(evilify magit-log-mode magit-log-mode-map
(kbd "C-j") 'magit-goto-next-section
(kbd "C-k") 'magit-goto-previous-section
(kbd "C-n") 'magit-goto-next-section
(kbd "C-p") 'magit-goto-previous-section
(kbd "C-v") 'magit-revert-item)
(evilify magit-process-mode magit-process-mode-map
(kbd "C-j") 'magit-goto-next-section
(kbd "C-k") 'magit-goto-previous-section
(kbd "C-n") 'magit-goto-next-section
(kbd "C-p") 'magit-goto-previous-section
(kbd "C-v") 'magit-revert-item)
(evilify magit-branch-manager-mode magit-branch-manager-mode-map
"K" 'magit-discard-item
"L" 'magit-key-mode-popup-logging
(kbd "C-j") 'magit-goto-next-section
(kbd "C-k") 'magit-goto-previous-section
(kbd "C-n") 'magit-goto-next-section
(kbd "C-p") 'magit-goto-previous-section
(kbd "C-v") 'magit-revert-item)
(evilify magit-status-mode magit-status-mode-map
"K" 'magit-discard-item
"L" 'magit-key-mode-popup-logging
"H" 'magit-key-mode-popup-diff-options
(kbd "C-j") 'magit-goto-next-section
(kbd "C-k") 'magit-goto-previous-section
(kbd "C-n") 'magit-goto-next-section
(kbd "C-p") 'magit-goto-previous-section
(kbd "C-v") 'magit-revert-item))
:config
(progn
(spacemacs|hide-lighter magit-auto-revert-mode)
;; full screen magit-status
(when git-magit-status-fullscreen
(defadvice magit-status (around magit-fullscreen activate)
(window-configuration-to-register :magit-fullscreen)
ad-do-it
(delete-other-windows))
(defun magit-quit-session ()
"Restores the previous window configuration and kills the magit buffer"
(interactive)
(kill-buffer)
(jump-to-register :magit-fullscreen))
(define-key magit-status-mode-map (kbd "q") 'magit-quit-session))
(defun magit-toggle-whitespace ()
(interactive)
(if (member "-w" magit-diff-options)
(magit-dont-ignore-whitespace)
(magit-ignore-whitespace)))
(defun magit-ignore-whitespace ()
(interactive)
(add-to-list 'magit-diff-options "-w")
(magit-refresh))
(defun magit-dont-ignore-whitespace ()
(interactive)
(setq magit-diff-options (remove "-w" magit-diff-options))
(magit-refresh))
(define-key magit-status-mode-map (kbd "W") 'magit-toggle-whitespace))))
(defun git/init-magit-gh-pulls ()
(use-package magit-gh-pulls
:if git-enable-github-support
:defer t
:init
(progn
(defun spacemacs/load-gh-pulls-mode ()
"Start `magit-gh-pulls-mode' only after a manual request."
(interactive)
(magit-gh-pulls-mode)
(magit-gh-pulls-reload))
(defun spacemacs/fetch-gh-pulls-mode ()
"Start `magit-gh-pulls-mode' only after a manual request."
(interactive)
(magit-gh-pulls-mode)
(magit-gh-pulls-fetch-commits))
(eval-after-load 'magit
'(progn
(define-key magit-mode-map "#gg" 'spacemacs/load-gh-pulls-mode)
(define-key magit-mode-map "#gf" 'spacemacs/fetch-gh-pulls-mode))))
:config
(spacemacs|diminish magit-gh-pulls-mode "Github-PR")))
(defun git/init-github-browse-file ()
(use-package github-browse-file
:if git-enable-github-support
:defer t
:init
(evil-leader/set-key
"gfb" 'github-browse-file)))
(defun git/init-git-link ()
(use-package git-link
:if git-enable-github-support
:defer t
:init
(progn
(defun spacemacs/git-link-copy-url-only ()
"Only copy the generated link to the kill ring."
(interactive)
(let (git-link-open-in-browser)
(call-interactively 'git-link)))
(defun spacemacs/git-link-commit-copy-url-only ()
"Only copy the generated link to the kill ring."
(interactive)
(let (git-link-open-in-browser)
(call-interactively 'git-link-commit)))
(evil-leader/set-key
"gfl" 'git-link
"gfL" 'spacemacs/git-link-copy-url-only
"gfc" 'git-link-commit
"gfC" 'spacemacs/git-link-commit-copy-url-only)
;; default is to open the generated link
(setq git-link-open-in-browser t))))
(defun git/init-magit-gitflow ()
(use-package magit-gitflow
:commands turn-on-magit-gitflow
:init (add-hook 'magit-mode-hook 'turn-on-magit-gitflow)
:config (spacemacs|diminish magit-gitflow-mode "Flow")))
(defun git/init-magit-svn ()
(use-package magit-svn
:if git-enable-magit-svn-plugin
:commands turn-on-magit-svn
:init (add-hook 'magit-mode-hook 'turn-on-magit-svn)
:config
(progn
(evil-define-key 'emacs magit-status-mode-map
"N" 'magit-key-mode-popup-svn))))
(defun git/init-smeargle ()
(use-package smeargle
:defer t
:init
(evil-leader/set-key
"ghc" 'smeargle-clear
"ghh" 'smeargle-commits
"ght" 'smeargle)))