This layers adds general configuration for Emacs VC. It should work with all VC backends such as Git, Mercurial, Bazaar, SVN, etc…
- highlights uncommitted changes in the fringe or margin with diff-hl, git-gutter, or git-gutter+
- adds vcs transient-state
SPC g.
to allow quick navigation and modification of buffer hunks.
To use this configuration layer, add it to your ~/.spacemacs
. You will need to
add version-control
to the existing dotspacemacs-configuration-layers
list in this
file.
You can choose the package to facilitate the diff transient-state and show margins
by setting version-control-diff-tool
'(version-control :variables
version-control-diff-tool 'diff-hl)
You can choose the side on which the diff appears (by default it’s the right side)
'(version-control :variables
version-control-diff-side 'left)
To automatically enable diff margins in all buffers, set
version-control-global-margin
'(version-control :variables
version-control-global-margin t)
This layer contains generalized mappings for three diff margin packages: diff-hl, git-gutter, and git-gutter+.
There are some differences between packages that might have some people prefer one over the other:
Feature | diff-hl | git-gutter | git-gutter+ |
---|---|---|---|
Show in fringe | X | X | X |
Extended VCS support (e.g. hg, svn) | X | X | |
Stage hunks from buffer | X | X | |
Dired support | X |
VC commands:
Key binding | Description |
---|---|
SPC g . | version control transient-state |
SPC g r | smerge mode transient-state |
SPC g h o | browser at remote |
SPC g v = | open a hunk under the point in the diff buffer |
SPC g v D | compare the entire working tree with head |
SPC g v e | show diff against current head using ediff |
SPC g v g | visually annotate the current file |
SPC g v d | open the VC Directory buffer |
SPC g v + | update the working copy |
SPC g v i | register (add) into a version control system |
SPC g v u | revert working copy to their repository contents |
SPC g v l | list the change log |
SPC g v L | list the change log for the current VC controlled tree |
SPC g v v | do the next logical VC operation (vc-next-action ) |
SPC g v I | ignore file (vc-ignore ) |
SPC g v r | resolve conflicts in file |
You can hit SPC pv
from the current project to open the VC Directory buffer,
or use SPC g v d
for specifying a root directory.
Then you may mark (m
key) files you are interested in, to form a fileset.
Most commands described above are applicable to filesets too.
To some of them are given shortcuts:
Key | Description |
---|---|
= | compare selected files with head |
c | open a commit message buffer |
l | list changes |
a | annotate selected files |
i | add into a version control system |
r | refresh directory view |
E | ignore file under cursor |
Navigation and interaction commands in the VC Directory buffer:
Key bindings | Description |
---|---|
j or M-n | next file |
k or M-p | previous file |
gj or TAB | next directory |
gk or S-TAB | previous directory |
m | mark a file |
u | unmark a file |
In a commit message buffer press C-c C-c
to commit the changes with the entered message.
Pressing C-c C-k
will discard the commit message and close this buffer.
Key bindings | Description |
---|---|
SPC m a | apply a hunk |
SPC m d | kill the hunk at point |
SPC m D | kill the current file’s hunk |
SPC m e | call ediff-patch-file on current buffer |
SPC m f c | convert unified diffs to context diffs |
SPC m f r | reverse the direction of the diffs |
SPC m f u | convert context diffs to unified diffs |
SPC m g | jump to the corresponding source line |
SPC m j | next hunk |
SPC m J | next file |
SPC m k | previous hunk |
SPC m K | previous file |
SPC m q | close the diff window |
SPC m r | revert a hunk |
SPC m s | split the current hunk at point into two hunks |
SPC m u | undo |
A transient buffer is also defined, start it with SPC m .
or , .
Key bindings | Description |
---|---|
j | next hunk |
J | next file |
k | previous hunk |
K | previous file |
Key bindings | Description |
---|---|
C-j or M-n | next message |
C-k or M-p | previous message |
gj or J or TAB | next file |
gk or K or S-TAB | previous file |
f or ENTER | visit the version at point |
d | display a diff between the revision at point and the next earlier revision |
o | use for jumping to links |
H | toggle hiding of the full message |
Key bindings | Description |
---|---|
J | visit the annotation of the revision after this one |
K | visit the annotation of the revision previous to this one |
L | Visit the log of the revision at line |
H | toggle whether or not the annotation is visible |
a | visit the annotation of the revision identified in the current line |
p | visit the annotation of the revision before the revision at line |
d | display the diff between the current line’s revision and the previous revision |
f | show in a buffer the file revision indicated by the current line |
Use SPC g .
to enter a transient state for quickly navigating between hunks in a buffer. During that state, the following bindings are active:
Key binding | Description |
---|---|
h | Show diff of hunk |
n | Next hunk |
N or p | Previous hunk |
r | Revert hunk |
s | Stage hunk |
t | Toggle margin indicators |
w | Stage file |
u | Unstage file |
d | Repo diff popup |
D | Show diffs of unstaged hunks |
c | Commit with popup |
C | Commit |
P | Push repo with popup |
f | Fetch for repo with popup |
F | Pull repo with popup |
l | Show repo log |
z | Recenter buffer in window |
Key binding | Description |
---|---|
SPC g r n | Next hunk |
SPC g r N | Previous hunk |
SPC g r p | Previous hunk |
SPC g r j | Go to next line |
SPC g r k | Go to previous line |
SPC g r b | Smerge keep base |
SPC g r m | Smerge keep mine |
SPC g r a | Smerge keep all |
SPC g r o | Smerge keep other |
SPC g r c | Smerge keep current |
SPC g r C | Smerge combine with next |
SPC g r u | Undo |
SPC g r r | Smerge refine |
SPC g r q | Quit transient state |
Key binding | Description |
---|---|
SPC T d | toggle diff margins |
SPC T C-d | toggle diff margins globally |