View, stage and revert Git changes straight from the buffer.
(This package is inspired by the GitGutter plugin for Sublime Text. It contains patches that haven't yet been added to Git-Gutter.)
Jump to Changelog.
Use the predefined use-package setup or follow these steps:
- 
Install with package.el
Add MELPA as a package source. Run
M-x package-install git-gutter+ - 
Add the following to your .emacs file
(global-git-gutter+-mode)If you want to disable git-gutter+ for some modes, set the variable
git-gutter+-disabled-modes.As an alternative to
global-git-gutter+-modeyou can enable git-gutter+ only for specific modes, like this:(add-hook 'ruby-mode-hook 'git-gutter+-mode) (add-hook 'python-mode-hook 'git-gutter+-mode) - 
Add keybindings
(global-set-key (kbd "C-x g") 'git-gutter+-mode) ; Turn on/off in the current buffer (global-set-key (kbd "C-x G") 'global-git-gutter+-mode) ; Turn on/off globally (eval-after-load 'git-gutter+ '(progn ;;; Jump between hunks (define-key git-gutter+-mode-map (kbd "C-x n") 'git-gutter+-next-hunk) (define-key git-gutter+-mode-map (kbd "C-x p") 'git-gutter+-previous-hunk) ;;; Act on hunks (define-key git-gutter+-mode-map (kbd "C-x v =") 'git-gutter+-show-hunk) (define-key git-gutter+-mode-map (kbd "C-x r") 'git-gutter+-revert-hunks) ;; Stage hunk at point. ;; If region is active, stage all hunk lines within the region. (define-key git-gutter+-mode-map (kbd "C-x t") 'git-gutter+-stage-hunks) (define-key git-gutter+-mode-map (kbd "C-x c") 'git-gutter+-commit) (define-key git-gutter+-mode-map (kbd "C-x C") 'git-gutter+-stage-and-commit) (define-key git-gutter+-mode-map (kbd "C-x C-y") 'git-gutter+-stage-and-commit-whole-buffer) (define-key git-gutter+-mode-map (kbd "C-x U") 'git-gutter+-unstage-whole-buffer))) 
(git-gutter-fringe+ with minimal skin)
git-gutter-fringe+.el uses the fringe to display diff markers, instead of the buffer margin.
These are the differences to the default margin display mode in git-gutter+:
| git-gutter+.el | git-gutter-fringe+.el | |
|---|---|---|
| Works in tty frame | + | - | 
| Works with linum-mode | - | + | 
| Gutter on the right side | - | + | 
Enable git-gutter-fringe+ like this:
M-x package-install git-gutter-fringe+
(require 'git-gutter-fringe+)
;; Optional: Activate minimal skin
(git-gutter-fr+-minimal)
To interactively disable/enable the fringe display mode, run
M-x git-gutter+-toggle-fringe.
Enable/disable git-gutter+ in the current buffer.
Globally enable/disable git-gutter+ for all file buffers.
Jump to the next hunk.
Jump to the previous hunk.
Show detailed diff for the hunk at point.
The hunk info is updated when you call
git-gutter+-next-hunk and git-gutter+-previous-hunk.
An alternative to git-gutter+-show-hunk.
Shows the diff by expanding it at point, without opening a new buffer.
Revert hunk at point. If region is active, revert all hunks within the region.
Stage hunk at point. If region is active, stage all hunk lines within the region.
Commit staged changes. If nothing is staged, ask to stage the current buffer.
Calls git-gutter+-stage-hunks followed by git-gutter+-commit.
Stages and commits the whole buffer.
Unstages all changes in the current buffer.
Use this to undo any effects caused by git-gutter+-stage-hunks.
The commit message buffer is based on
git-commit.
Besides the default git-commit-mode bindings, the following bindings
are provided:
- 
C-c C-atoggles the option to amend the previous commit. - 
C-c C-etoggles the option to allow an empty commit that includes no changes. - 
C-c C-utoggles the option to edit the commit author. - 
C-c C-dtoggles the option to edit the commit date. - 
M-p/M-ninsert previous/next history commit message. 
git-commit-ack is re-bound to C-c C-b.
- 2 enhancements:
- Added 
git-gutter+-show-hunk-inline-at-point - The Readme now contains a 
use-packagequick-start setup 
 - Added 
 - 2 fixes:
- Fixed 
git-gutter+-unstage-whole-bufferto only unstage changes from the current buffer - Various code cleanups
 
 - Fixed 
 
- 3 fixes:
- Fixed staging and committing with Tramp
 - Fixed errors with symlinked files
 - Support the latest version of `git-commit'
 
 
- 2 enhancements:
- New interactive functions 
git-gutter+-stage-and-commit-whole-bufferandgit-gutter+-unstage-whole-buffer - Refresh gutter when a buffer is staged or unstaged in Magit
 
 - New interactive functions 
 - 4 fixes:
M-pis now guaranteed to insert the message of the previous commit- Fixed compatibility with current versions of 
git-commit-mode git-gutter+-diff-argsis now properly handled as a list of strings- Fixed extraneous window splits that occured when displaying staged changes before committing
 
 
- New commit interface based on git-commit-mode. See section 'Committing' to learn more.
 - Added 
git-gutter+-mode-map. Consider migrating some of your global git-gutter+ bindings to the local keymap. See section 'Add keybindings' for an example. - Properly support narrowed buffers
 - Revert hunks within region (or hunk at point) with 
git-gutter+-revert-hunksPlease update your key binding. (The old name 'git-gutter+-revert-hunk' is still accessible by an alias.) - Renamed 
git-gutter+-popup-hunktogit-gutter+-show-hunkPlease update your key binding. (The old name is still accessible by an alias.) - Added customizable variable 'git-gutter+-git-executable'
 - Package git-gutter-fringe+:
Added 
git-gutter+-toggle-fringeto enable/disable the fringe display mode. 
0.02 (Changes since Git-Gutter 0.42)
- Improved performance
 - Staging and committing hunks
 - A bug-free 
git-gutter-fringe.eland other fixes - The following interactive commands have been removed.
They are superseded by 
git-gutter+-mode.- git-gutter
 - git-gutter-toggle
 - git-gutter-clear
 
 - Removed mode-on/off-hook variables
 - Renamed 
git-gutter-diff-optiontogit-gutter-diff-options 
- Emacs 23 or higher
 - Git 1.7.0 or higher
 
Git-Gutter supports TRAMP for remote file support.
(use-package git-gutter+
  :ensure t
  :init (global-git-gutter+-mode)
  :config (progn
            (define-key git-gutter+-mode-map (kbd "C-x n") 'git-gutter+-next-hunk)
            (define-key git-gutter+-mode-map (kbd "C-x p") 'git-gutter+-previous-hunk)
            (define-key git-gutter+-mode-map (kbd "C-x v =") 'git-gutter+-show-hunk)
            (define-key git-gutter+-mode-map (kbd "C-x r") 'git-gutter+-revert-hunks)
            (define-key git-gutter+-mode-map (kbd "C-x t") 'git-gutter+-stage-hunks)
            (define-key git-gutter+-mode-map (kbd "C-x c") 'git-gutter+-commit)
            (define-key git-gutter+-mode-map (kbd "C-x C") 'git-gutter+-stage-and-commit)
            (define-key git-gutter+-mode-map (kbd "C-x C-y") 'git-gutter+-stage-and-commit-whole-buffer)
            (define-key git-gutter+-mode-map (kbd "C-x U") 'git-gutter+-unstage-whole-buffer))
  :diminish (git-gutter+-mode . "gg"))
You can change the signs and those faces.
(setq git-gutter+-modified-sign "  ") ;; two space
(setq git-gutter+-added-sign "++")    ;; multiple character is OK
(setq git-gutter+-deleted-sign "--")
(set-face-background 'git-gutter+-modified "purple") ;; background color
(set-face-foreground 'git-gutter+-added "green")
(set-face-foreground 'git-gutter+-deleted "red")You can change minor-mode name in mode-line to set git-gutter+-lighter.
Default is " GitGutter"
;; first character should be a space
(setq git-gutter+-lighter " GG")Emacs has char-width function which returns character width.
git-gutter+.el uses it for calculating character length of the signs.
But char-width does not work for some full-width characters.
So you should explicitly specify window width, if you use full-width
character.
(setq git-gutter+-window-width 2)
(setq git-gutter+-modified-sign "☁")
(setq git-gutter+-added-sign "☀")
(setq git-gutter+-deleted-sign "☂")If you use global-git-gutter+-mode, you may want some modes to disable
git-gutter+-mode. You can make it by setting git-gutter+-disabled-modes
to non-nil.
;; inactivate git-gutter+-mode in asm-mode and image-mode
(setq git-gutter+-disabled-modes '(asm-mode image-mode))Default is nil.
git-gutter+.el can view unchanged information by setting git-gutter+-unchanged-sign.
Like following.
(setq git-gutter+-unchanged-sign " ")
(set-face-background 'git-gutter+-unchanged "yellow")Default value of git-gutter+-unchanged-sign is nil.
git-gutter+.el can display an additional separator character at the right of the changed
signs. This is mostly useful when running emacs in a console.
(setq git-gutter+-separator-sign "|")
(set-face-foreground 'git-gutter+-separator "yellow")Default value of git-gutter+-separator-sign is nil.
Hide gutter when there are no changes if git-gutter+-hide-gutter is non-nil.
(Default is nil)
(setq git-gutter+-hide-gutter t)You can force extra arguments to be passed to git diff by setting
git-gutter+-diff-options.
;; Ignore all spaces
(setq git-gutter+-diff-options '("-w"))GitGutter is Sublime Text plugin.
diff-hl has more features than git-gutter+.el.
Vim version of GitGutter





