diff --git a/sources_non_forked/gruvbox b/sources_non_forked/gruvbox
deleted file mode 160000
index 705e68d9..00000000
--- a/sources_non_forked/gruvbox
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 705e68d90d6596c621093a28bf480a572a41ad02
diff --git a/sources_non_forked/gruvbox/CHANGELOG.md b/sources_non_forked/gruvbox/CHANGELOG.md
new file mode 100644
index 00000000..90fd3a29
--- /dev/null
+++ b/sources_non_forked/gruvbox/CHANGELOG.md
@@ -0,0 +1,117 @@
+# Change Log
+
+## [Unreleased](https://github.com/morhetz/gruvbox/tree/HEAD)
+
+[Full Changelog](https://github.com/morhetz/gruvbox/compare/v1.3.5...HEAD)
+
+**Fixed bugs:**
+
+- Lighter background on terminal [\#8](https://github.com/morhetz/gruvbox/issues/8)
+
+**Closed issues:**
+
+- Installation issue. [\#54](https://github.com/morhetz/gruvbox/issues/54)
+
+- Italic font in terminal\(urxvt\) [\#49](https://github.com/morhetz/gruvbox/issues/49)
+
+- Unable to log in when sourcing the palette shellscript [\#48](https://github.com/morhetz/gruvbox/issues/48)
+
+- How can i modify multiple comment scheme [\#46](https://github.com/morhetz/gruvbox/issues/46)
+
+- Remove comment highlight in iterm [\#44](https://github.com/morhetz/gruvbox/issues/44)
+
+- Comments looking strange withing tmux [\#43](https://github.com/morhetz/gruvbox/issues/43)
+
+- comments are reverse-video in xterm [\#41](https://github.com/morhetz/gruvbox/issues/41)
+
+- What font are you using in the screenshots? [\#39](https://github.com/morhetz/gruvbox/issues/39)
+
+- vim-signature crashes when I use gruvbox [\#38](https://github.com/morhetz/gruvbox/issues/38)
+
+- Color of statusbar in inactive windows [\#37](https://github.com/morhetz/gruvbox/issues/37)
+
+- Go method and struct highlighting missing [\#36](https://github.com/morhetz/gruvbox/issues/36)
+
+- gruvbox\_256palette.sh doesn't work for Konsole [\#35](https://github.com/morhetz/gruvbox/issues/35)
+
+- Contrast in jekyll markdown files [\#33](https://github.com/morhetz/gruvbox/issues/33)
+
+- Pentadactyl Gruvbox Theme [\#32](https://github.com/morhetz/gruvbox/issues/32)
+
+- make vertsplit better [\#31](https://github.com/morhetz/gruvbox/issues/31)
+
+- Console support. [\#30](https://github.com/morhetz/gruvbox/issues/30)
+
+- How can I change the background color? [\#29](https://github.com/morhetz/gruvbox/issues/29)
+
+- Some words are not bold [\#28](https://github.com/morhetz/gruvbox/issues/28)
+
+- Terminal theme on base gruvbox [\#25](https://github.com/morhetz/gruvbox/issues/25)
+
+- Markdown has inverted colors when using \* [\#24](https://github.com/morhetz/gruvbox/issues/24)
+
+- how install it on mac osx [\#23](https://github.com/morhetz/gruvbox/issues/23)
+
+- Comments color for Terminal Vim [\#22](https://github.com/morhetz/gruvbox/issues/22)
+
+- Move palette files to gruvbox-generalized [\#20](https://github.com/morhetz/gruvbox/issues/20)
+
+- Maybe add Gruvbox Airline theme? [\#19](https://github.com/morhetz/gruvbox/issues/19)
+
+- For Sublime text [\#18](https://github.com/morhetz/gruvbox/issues/18)
+
+**Merged pull requests:**
+
+- Fix the 256 palette script failed login issue [\#53](https://github.com/morhetz/gruvbox/pull/53) ([jonasmalacofilho](https://github.com/jonasmalacofilho))
+
+- add minimal coloring for gitcommit highlighting [\#52](https://github.com/morhetz/gruvbox/pull/52) ([daniely](https://github.com/daniely))
+
+- For terminals, turn off italics by default. [\#47](https://github.com/morhetz/gruvbox/pull/47) ([ryanmjacobs](https://github.com/ryanmjacobs))
+
+- Change color of vertical/horizontal seperators between split windows [\#45](https://github.com/morhetz/gruvbox/pull/45) ([deshtop](https://github.com/deshtop))
+
+- Improve gruvbox with C code [\#34](https://github.com/morhetz/gruvbox/pull/34) ([gladiac](https://github.com/gladiac))
+
+- Fix for linux console [\#27](https://github.com/morhetz/gruvbox/pull/27) ([vyp](https://github.com/vyp))
+
+- Colors for plugin vimshell.vim [\#21](https://github.com/morhetz/gruvbox/pull/21) ([joelmo](https://github.com/joelmo))
+
+## [v1.3.5](https://github.com/morhetz/gruvbox/tree/v1.3.5) (2014-03-19)
+
+[Full Changelog](https://github.com/morhetz/gruvbox/compare/v0.0.8...v1.3.5)
+
+**Implemented enhancements:**
+
+- Better selection colors [\#15](https://github.com/morhetz/gruvbox/issues/15)
+
+- When hlsearch is on, the cursor inverts the search color and not visible [\#2](https://github.com/morhetz/gruvbox/issues/2)
+
+**Fixed bugs:**
+
+- Problem with changing between dark and light on 256 color terminal [\#7](https://github.com/morhetz/gruvbox/issues/7)
+
+- IndentGuides coloring doesn't show up [\#1](https://github.com/morhetz/gruvbox/issues/1)
+
+**Closed issues:**
+
+- Requesting rxvt-unicode theme [\#17](https://github.com/morhetz/gruvbox/issues/17)
+
+- gruvbox\_256palette.sh gets reset \(gnome-terminal on Ubuntu\) [\#13](https://github.com/morhetz/gruvbox/issues/13)
+
+- Powerline colors [\#12](https://github.com/morhetz/gruvbox/issues/12)
+
+- Info necessary for making a port of this colorscheme [\#10](https://github.com/morhetz/gruvbox/issues/10)
+
+**Merged pull requests:**
+
+- Fix GNU screen detection for \*-bce [\#16](https://github.com/morhetz/gruvbox/pull/16) ([blueyed](https://github.com/blueyed))
+
+- Added iTerm2 dark theme [\#11](https://github.com/morhetz/gruvbox/pull/11) ([Greduan](https://github.com/Greduan))
+
+- Fix typo in Readme [\#5](https://github.com/morhetz/gruvbox/pull/5) ([ViViDboarder](https://github.com/ViViDboarder))
+
+## [v0.0.8](https://github.com/morhetz/gruvbox/tree/v0.0.8) (2012-12-08)
+
+
+
+\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
\ No newline at end of file
diff --git a/sources_non_forked/gruvbox/README.md b/sources_non_forked/gruvbox/README.md
new file mode 100644
index 00000000..917abdb9
--- /dev/null
+++ b/sources_non_forked/gruvbox/README.md
@@ -0,0 +1,110 @@
+<p align="center"><img src="http://imgh.us/gruvbox_logo.svg"></p>
+
+gruvbox is heavily inspired by [badwolf][], [jellybeans][] and [solarized][].
+
+Designed as a bright theme with pastel 'retro groove' colors and light/dark mode switching in the way of [solarized][]. The main focus when developing gruvbox is to keep colors easily distinguishable, contrast enough and still pleasant for the eyes.
+
+   [badwolf]: https://github.com/sjl/badwolf
+   [jellybeans]: https://github.com/nanotech/jellybeans.vim
+   [solarized]: http://ethanschoonover.com/solarized
+
+Attention
+---------
+
+1. [Read this first](https://github.com/morhetz/gruvbox/wiki/Terminal-specific)
+2. Typeface from gallery is [Fantasque Sans Mono](https://github.com/belluzj/fantasque-sans)
+3. Typeface from screenshots below is [Fira Mono](http://www.carrois.com/fira-4-1/)
+
+Screenshots
+-----------
+
+Refer [Gallery][] for more syntax-specific screenshots.
+
+   [Gallery]: https://github.com/morhetz/gruvbox/wiki/Gallery
+
+### Dark mode
+
+![Screenshot Dark](http://i.imgur.com/GkIl8Fn.png)
+
+### Light mode
+
+![Screenshot Light](http://i.imgur.com/X75niEa.png)
+
+### Airline theme
+
+![Screenshot Airline](http://i.imgur.com/wRQceUR.png)
+
+Palette
+-------
+
+### Dark mode
+
+![Palette Dark](http://i.imgur.com/wa666xg.png)
+
+### Light mode
+
+![Palette Light](http://i.imgur.com/49qKyYW.png)
+
+Contrast options
+----------------
+
+Refer [wiki section][] for contrast configuration and other options.
+
+   [wiki section]: https://github.com/morhetz/gruvbox/wiki/Configuration#ggruvbox_contrast_dark
+
+![Contrast Options](http://i.imgur.com/5MSbe6T.png)
+
+Documentation
+-------------
+
+Please check [wiki][] for installation details, terminal-specific setup, troubleshooting, configuration options and others.
+
+   [wiki]: https://github.com/morhetz/gruvbox/wiki
+
+Features
+--------
+
+* Lots of style-customization options (contrast, color invertion, italics usage etc.)
+* Extended filetype highlighting: Html, Xml, Vim (and ES6 with [yajs.vim](https://github.com/othree/yajs.vim)), Clojure, C, Python, JavaScript, CoffeeScript, Ruby, Objective-C, Go, Lua, MoonScript, Java, Markdown, Haskell
+* Supported plugins: [EasyMotion][], [vim-sneak][], [Indent Guides][], [indentLine][], [Rainbow Parentheses][], [Airline][], [Lightline][], [GitGutter][], [Signify][], [ShowMarks][], [Signature][], [Syntastic][], [CtrlP][], [Startify][]
+
+   [EasyMotion]: https://github.com/Lokaltog/vim-easymotion
+   [vim-sneak]: https://github.com/justinmk/vim-sneak
+   [Indent Guides]: https://github.com/nathanaelkane/vim-indent-guides
+   [indentLine]: https://github.com/Yggdroot/indentLine
+   [Rainbow Parentheses]: https://github.com/kien/rainbow_parentheses.vim
+   [Airline]: https://github.com/bling/vim-airline
+   [Lightline]: https://github.com/itchyny/lightline.vim
+   [GitGutter]: https://github.com/airblade/vim-gitgutter
+   [Signify]: https://github.com/mhinz/vim-signify
+   [ShowMarks]: http://www.vim.org/scripts/script.php?script_id=152
+   [Signature]: https://github.com/kshenoy/vim-signature
+   [Syntastic]: https://github.com/scrooloose/syntastic
+   [CtrlP]: https://github.com/kien/ctrlp.vim
+   [Startify]: https://github.com/mhinz/vim-startify
+
+Contributions
+-------------
+
+See [gruvbox-contrib][] repo for contributions, ports and extras.
+
+[gruvbox-contrib]: https://github.com/morhetz/gruvbox-contrib
+
+ToDo
+----
+
+* Filetype syntax highlighting (R, TeX, Swift, Erlang, Purescript and I'm still dissatisfied with CSS)
+* Plugin support (MiniBufExplorer, Tagbar, Netrw, VimPLug)
+
+Self-Promotion
+--------------
+
+If you like gruvbox follow the repository on
+[GitHub](https://github.com/morhetz/gruvbox) and vote for it on
+[vim.org](http://www.vim.org/scripts/script.php?script_id=4349).
+
+License
+-------
+[MIT/X11][]
+
+   [MIT/X11]: https://en.wikipedia.org/wiki/MIT_License
diff --git a/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim b/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim
new file mode 100644
index 00000000..84793190
--- /dev/null
+++ b/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim
@@ -0,0 +1,79 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Airline
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 22 Aug 2014
+" -----------------------------------------------------------------------------
+
+let g:airline#themes#gruvbox#palette = {}
+
+function! airline#themes#gruvbox#refresh()
+
+  let M0 = airline#themes#get_highlight('Identifier')
+  let accents_group = airline#themes#get_highlight('Special')
+  let modified_group = [M0[0], '', M0[2], '', '']
+  let warning_group = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg'])
+  let error_group = airline#themes#get_highlight2(['Normal', 'bg'], ['WarningMsg', 'fg'])
+
+  let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['StatusLineNC', 'bg'])
+  let s:N2 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['StatusLineNC', 'fg'])
+  let s:N3 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['CursorLine', 'bg'])
+  let g:airline#themes#gruvbox#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3)
+  let g:airline#themes#gruvbox#palette.normal_modified = { 'airline_c': modified_group }
+  let g:airline#themes#gruvbox#palette.normal.airline_warning = warning_group
+  let g:airline#themes#gruvbox#palette.normal_modified.airline_warning = warning_group
+  let g:airline#themes#gruvbox#palette.normal.airline_error = error_group
+  let g:airline#themes#gruvbox#palette.normal_modified.airline_error = error_group
+
+  let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Identifier', 'fg'])
+  let s:I2 = s:N2
+  let s:I3 = airline#themes#get_highlight2(['Normal', 'fg'], ['StatusLineNC', 'fg'])
+  let g:airline#themes#gruvbox#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3)
+  let g:airline#themes#gruvbox#palette.insert_modified = g:airline#themes#gruvbox#palette.normal_modified
+  let g:airline#themes#gruvbox#palette.insert.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning
+  let g:airline#themes#gruvbox#palette.insert_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning
+  let g:airline#themes#gruvbox#palette.insert.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error
+  let g:airline#themes#gruvbox#palette.insert_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error
+
+  let s:R1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Structure', 'fg'])
+  let s:R2 = s:I2
+  let s:R3 = s:I3
+  let g:airline#themes#gruvbox#palette.replace = airline#themes#generate_color_map(s:R1, s:R2, s:R3)
+  let g:airline#themes#gruvbox#palette.replace_modified = g:airline#themes#gruvbox#palette.normal_modified
+  let g:airline#themes#gruvbox#palette.replace.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning
+  let g:airline#themes#gruvbox#palette.replace_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning
+  let g:airline#themes#gruvbox#palette.replace.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error
+  let g:airline#themes#gruvbox#palette.replace_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error
+
+  let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['ModeMsg', 'fg'])
+  let s:V2 = s:N2
+  let s:V3 = airline#themes#get_highlight2(['Normal', 'bg'], ['TabLine', 'fg'])
+  let g:airline#themes#gruvbox#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3)
+  let g:airline#themes#gruvbox#palette.visual_modified = { 'airline_c': [ s:V3[0], '', s:V3[2], '', '' ] }
+  let g:airline#themes#gruvbox#palette.visual.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning
+  let g:airline#themes#gruvbox#palette.visual_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning
+  let g:airline#themes#gruvbox#palette.visual.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error
+  let g:airline#themes#gruvbox#palette.visual_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error
+
+  let s:IA = airline#themes#get_highlight2(['TabLine', 'fg'], ['CursorLine', 'bg'])
+  let g:airline#themes#gruvbox#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA)
+  let g:airline#themes#gruvbox#palette.inactive_modified = { 'airline_c': modified_group }
+
+  let g:airline#themes#gruvbox#palette.accents = { 'red': accents_group }
+
+  let s:TF = airline#themes#get_highlight2(['Normal', 'bg'], ['Normal', 'bg'])
+  let g:airline#themes#gruvbox#palette.tabline = {
+    \ 'airline_tab':  s:N2,
+    \ 'airline_tabsel':  s:N1,
+    \ 'airline_tabtype':  s:V1,
+    \ 'airline_tabfill':  s:TF,
+    \ 'airline_tabhid':  s:IA,
+    \ 'airline_tabmod':  s:I1
+    \ }
+
+endfunction
+
+call airline#themes#gruvbox#refresh()
+
+" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker:
diff --git a/sources_non_forked/gruvbox/autoload/gruvbox.vim b/sources_non_forked/gruvbox/autoload/gruvbox.vim
new file mode 100644
index 00000000..44bec6e1
--- /dev/null
+++ b/sources_non_forked/gruvbox/autoload/gruvbox.vim
@@ -0,0 +1,41 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Vim
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 09 Apr 2014
+" -----------------------------------------------------------------------------
+
+function! gruvbox#invert_signs_toggle()
+  if g:gruvbox_invert_signs == 0
+    let g:gruvbox_invert_signs=1
+  else
+    let g:gruvbox_invert_signs=0
+  endif
+
+  colorscheme gruvbox
+endfunction
+
+" Search Highlighting {{{
+
+function! gruvbox#hls_show()
+  set hlsearch
+  call GruvboxHlsShowCursor()
+endfunction
+
+function! gruvbox#hls_hide()
+  set nohlsearch
+  call GruvboxHlsHideCursor()
+endfunction
+
+function! gruvbox#hls_toggle()
+  if &hlsearch
+    call gruvbox#hls_hide()
+  else
+    call gruvbox#hls_show()
+  endif
+endfunction
+
+" }}}
+
+" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker:
diff --git a/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim
new file mode 100644
index 00000000..78babce5
--- /dev/null
+++ b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim
@@ -0,0 +1,53 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Gruvbox colorscheme for Lightline (itchyny/lightline.vim)
+" Author: gmoe <me@griffinmoe.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 31 Oct 2015
+" -----------------------------------------------------------------------------
+
+function! s:getGruvColor(group)
+  let guiColor = synIDattr(hlID(a:group), "fg", "gui") 
+  let termColor = synIDattr(hlID(a:group), "fg", "cterm") 
+  return [ guiColor, termColor ]
+endfunction
+
+if exists('g:lightline')
+
+  let s:bg0  = s:getGruvColor('GruvboxBg0')
+  let s:bg1  = s:getGruvColor('GruvboxBg1')
+  let s:bg2  = s:getGruvColor('GruvboxBg2')
+  let s:bg4  = s:getGruvColor('GruvboxBg4')
+  let s:fg1  = s:getGruvColor('GruvboxFg1')
+  let s:fg4  = s:getGruvColor('GruvboxFg4')
+
+  let s:yellow = s:getGruvColor('GruvboxYellow')
+  let s:blue   = s:getGruvColor('GruvboxBlue')
+  let s:aqua   = s:getGruvColor('GruvboxAqua')
+  let s:orange = s:getGruvColor('GruvboxOrange')
+
+  let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}}
+  let s:p.normal.left = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ]
+  let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ]
+  let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ]
+  let s:p.inactive.right = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ]
+  let s:p.inactive.left =  [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ]
+  let s:p.inactive.middle = [ [ s:bg4, s:bg1 ] ]
+  let s:p.insert.left = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ]
+  let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ]
+  let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ]
+  let s:p.replace.left = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ]
+  let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ]
+  let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ]
+  let s:p.visual.left = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ]
+  let s:p.visual.right = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ]
+  let s:p.visual.middle = [ [ s:fg4, s:bg1 ] ]
+  let s:p.tabline.left = [ [ s:fg4, s:bg2 ] ]
+  let s:p.tabline.tabsel = [ [ s:bg0, s:fg4 ] ]
+  let s:p.tabline.middle = [ [ s:bg0, s:bg0 ] ]
+  let s:p.tabline.right = [ [ s:bg0, s:orange ] ]
+  let s:p.normal.error = [ [ s:bg0, s:orange ] ]
+  let s:p.normal.warning = [ [ s:bg2, s:yellow ] ]
+
+  let g:lightline#colorscheme#gruvbox#palette = lightline#colorscheme#flatten(s:p)
+endif
diff --git a/sources_non_forked/gruvbox/colors/gruvbox.vim b/sources_non_forked/gruvbox/colors/gruvbox.vim
new file mode 100644
index 00000000..ebc9efff
--- /dev/null
+++ b/sources_non_forked/gruvbox/colors/gruvbox.vim
@@ -0,0 +1,1239 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Vim
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 04 Sep 2015
+" -----------------------------------------------------------------------------
+
+" Supporting code -------------------------------------------------------------
+" Initialisation: {{{
+
+if version > 580
+  hi clear
+  if exists("syntax_on")
+    syntax reset
+  endif
+endif
+
+let g:colors_name='gruvbox'
+
+if !has('gui_running') && &t_Co != 256
+  finish
+endif
+
+" }}}
+" Global Settings: {{{
+
+if !exists('g:gruvbox_bold')
+  let g:gruvbox_bold=1
+endif
+if !exists('g:gruvbox_italic')
+  if has('gui_running') || $TERM_ITALICS == 'true'
+    let g:gruvbox_italic=1
+  else
+    let g:gruvbox_italic=0
+  endif
+endif
+if !exists('g:gruvbox_undercurl')
+  let g:gruvbox_undercurl=1
+endif
+if !exists('g:gruvbox_underline')
+  let g:gruvbox_underline=1
+endif
+if !exists('g:gruvbox_inverse')
+  let g:gruvbox_inverse=1
+endif
+
+if !exists('g:gruvbox_guisp_fallback') || index(['fg', 'bg'], g:gruvbox_guisp_fallback) == -1
+  let g:gruvbox_guisp_fallback='NONE'
+endif
+
+if !exists('g:gruvbox_improved_strings')
+  let g:gruvbox_improved_strings=0
+endif
+
+if !exists('g:gruvbox_improved_warnings')
+  let g:gruvbox_improved_warnings=0
+endif
+
+if !exists('g:gruvbox_termcolors')
+  let g:gruvbox_termcolors=256
+endif
+
+if !exists('g:gruvbox_invert_indent_guides')
+  let g:gruvbox_invert_indent_guides=0
+endif
+
+if exists('g:gruvbox_contrast')
+  echo 'g:gruvbox_contrast is deprecated; use g:gruvbox_contrast_light and g:gruvbox_contrast_dark instead'
+endif
+
+if !exists('g:gruvbox_contrast_dark')
+  let g:gruvbox_contrast_dark='medium'
+endif
+
+if !exists('g:gruvbox_contrast_light')
+  let g:gruvbox_contrast_light='medium'
+endif
+
+let s:is_dark=(&background == 'dark')
+
+" }}}
+" Palette: {{{
+
+" setup palette dictionary
+let s:gb = {}
+
+" fill it with absolute colors
+let s:gb.dark0_hard  = ['#1d2021', 234]     " 29-32-33
+let s:gb.dark0       = ['#282828', 235]     " 40-40-40
+let s:gb.dark0_soft  = ['#32302f', 236]     " 50-48-47
+let s:gb.dark1       = ['#3c3836', 237]     " 60-56-54
+let s:gb.dark2       = ['#504945', 239]     " 80-73-69
+let s:gb.dark3       = ['#665c54', 241]     " 102-92-84
+let s:gb.dark4       = ['#7c6f64', 243]     " 124-111-100
+let s:gb.dark4_256   = ['#7c6f64', 243]     " 124-111-100
+
+let s:gb.gray_245    = ['#928374', 245]     " 146-131-116
+let s:gb.gray_244    = ['#928374', 244]     " 146-131-116
+
+let s:gb.light0_hard = ['#f9f5d7', 230]     " 249-245-215
+let s:gb.light0      = ['#fbf1c7', 229]     " 253-244-193
+let s:gb.light0_soft = ['#f2e5bc', 228]     " 242-229-188
+let s:gb.light1      = ['#ebdbb2', 223]     " 235-219-178
+let s:gb.light2      = ['#d5c4a1', 250]     " 213-196-161
+let s:gb.light3      = ['#bdae93', 248]     " 189-174-147
+let s:gb.light4      = ['#a89984', 246]     " 168-153-132
+let s:gb.light4_256  = ['#a89984', 246]     " 168-153-132
+
+let s:gb.bright_red     = ['#fb4934', 167]     " 251-73-52
+let s:gb.bright_green   = ['#b8bb26', 142]     " 184-187-38
+let s:gb.bright_yellow  = ['#fabd2f', 214]     " 250-189-47
+let s:gb.bright_blue    = ['#83a598', 109]     " 131-165-152
+let s:gb.bright_purple  = ['#d3869b', 175]     " 211-134-155
+let s:gb.bright_aqua    = ['#8ec07c', 108]     " 142-192-124
+let s:gb.bright_orange  = ['#fe8019', 208]     " 254-128-25
+
+let s:gb.neutral_red    = ['#cc241d', 124]     " 204-36-29
+let s:gb.neutral_green  = ['#98971a', 106]     " 152-151-26
+let s:gb.neutral_yellow = ['#d79921', 172]     " 215-153-33
+let s:gb.neutral_blue   = ['#458588', 66]      " 69-133-136
+let s:gb.neutral_purple = ['#b16286', 132]     " 177-98-134
+let s:gb.neutral_aqua   = ['#689d6a', 72]      " 104-157-106
+let s:gb.neutral_orange = ['#d65d0e', 166]     " 214-93-14
+
+let s:gb.faded_red      = ['#9d0006', 88]      " 157-0-6
+let s:gb.faded_green    = ['#79740e', 100]     " 121-116-14
+let s:gb.faded_yellow   = ['#b57614', 136]     " 181-118-20
+let s:gb.faded_blue     = ['#076678', 24]      " 7-102-120
+let s:gb.faded_purple   = ['#8f3f71', 96]      " 143-63-113
+let s:gb.faded_aqua     = ['#427b58', 66]      " 66-123-88
+let s:gb.faded_orange   = ['#af3a03', 130]     " 175-58-3
+
+" }}}
+" Setup Emphasis: {{{
+
+let s:bold = 'bold,'
+if g:gruvbox_bold == 0
+  let s:bold = ''
+endif
+
+let s:italic = 'italic,'
+if g:gruvbox_italic == 0
+  let s:italic = ''
+endif
+
+let s:underline = 'underline,'
+if g:gruvbox_underline == 0
+  let s:underline = ''
+endif
+
+let s:undercurl = 'undercurl,'
+if g:gruvbox_undercurl == 0
+  let s:undercurl = ''
+endif
+
+let s:inverse = 'inverse,'
+if g:gruvbox_inverse == 0
+  let s:inverse = ''
+endif
+
+" }}}
+" Setup Colors: {{{
+
+let s:vim_bg = ['bg', 'bg']
+let s:vim_fg = ['fg', 'fg']
+let s:none = ['NONE', 'NONE']
+
+" determine relative colors
+if s:is_dark
+  let s:bg0  = s:gb.dark0
+  if g:gruvbox_contrast_dark == 'soft'
+    let s:bg0  = s:gb.dark0_soft
+  elseif g:gruvbox_contrast_dark == 'hard'
+    let s:bg0  = s:gb.dark0_hard
+  endif
+
+  let s:bg1  = s:gb.dark1
+  let s:bg2  = s:gb.dark2
+  let s:bg3  = s:gb.dark3
+  let s:bg4  = s:gb.dark4
+
+  let s:gray = s:gb.gray_245
+
+  let s:fg0 = s:gb.light0
+  let s:fg1 = s:gb.light1
+  let s:fg2 = s:gb.light2
+  let s:fg3 = s:gb.light3
+  let s:fg4 = s:gb.light4
+
+  let s:fg4_256 = s:gb.light4_256
+
+  let s:red    = s:gb.bright_red
+  let s:green  = s:gb.bright_green
+  let s:yellow = s:gb.bright_yellow
+  let s:blue   = s:gb.bright_blue
+  let s:purple = s:gb.bright_purple
+  let s:aqua   = s:gb.bright_aqua
+  let s:orange = s:gb.bright_orange
+else
+  let s:bg0  = s:gb.light0
+  if g:gruvbox_contrast_light == 'soft'
+    let s:bg0  = s:gb.light0_soft
+  elseif g:gruvbox_contrast_light == 'hard'
+    let s:bg0  = s:gb.light0_hard
+  endif
+
+  let s:bg1  = s:gb.light1
+  let s:bg2  = s:gb.light2
+  let s:bg3  = s:gb.light3
+  let s:bg4  = s:gb.light4
+
+  let s:gray = s:gb.gray_244
+
+  let s:fg0 = s:gb.dark0
+  let s:fg1 = s:gb.dark1
+  let s:fg2 = s:gb.dark2
+  let s:fg3 = s:gb.dark3
+  let s:fg4 = s:gb.dark4
+
+  let s:fg4_256 = s:gb.dark4_256
+
+  let s:red    = s:gb.faded_red
+  let s:green  = s:gb.faded_green
+  let s:yellow = s:gb.faded_yellow
+  let s:blue   = s:gb.faded_blue
+  let s:purple = s:gb.faded_purple
+  let s:aqua   = s:gb.faded_aqua
+  let s:orange = s:gb.faded_orange
+endif
+
+" reset to 16 colors fallback
+if g:gruvbox_termcolors == 16
+  let s:bg0[1]    = 0
+  let s:fg4[1]    = 7
+  let s:gray[1]   = 8
+  let s:red[1]    = 9
+  let s:green[1]  = 10
+  let s:yellow[1] = 11
+  let s:blue[1]   = 12
+  let s:purple[1] = 13
+  let s:aqua[1]   = 14
+  let s:fg1[1]    = 15
+endif
+
+" save current relative colors back to palette dictionary
+let s:gb.bg0 = s:bg0
+let s:gb.bg1 = s:bg1
+let s:gb.bg2 = s:bg2
+let s:gb.bg3 = s:bg3
+let s:gb.bg4 = s:bg4
+
+let s:gb.gray = s:gray
+
+let s:gb.fg0 = s:fg0
+let s:gb.fg1 = s:fg1
+let s:gb.fg2 = s:fg2
+let s:gb.fg3 = s:fg3
+let s:gb.fg4 = s:fg4
+
+let s:gb.fg4_256 = s:fg4_256
+
+let s:gb.red    = s:red
+let s:gb.green  = s:green
+let s:gb.yellow = s:yellow
+let s:gb.blue   = s:blue
+let s:gb.purple = s:purple
+let s:gb.aqua   = s:aqua
+let s:gb.orange = s:orange
+
+" }}}
+
+" Overload Setting: {{{
+
+let s:hls_cursor = s:orange
+if exists('g:gruvbox_hls_cursor')
+  let s:hls_cursor = get(s:gb, g:gruvbox_hls_cursor)
+endif
+
+let s:number_column = s:none
+if exists('g:gruvbox_number_column')
+  let s:number_column = get(s:gb, g:gruvbox_number_column)
+endif
+
+let s:sign_column = s:bg1
+
+if exists('g:gitgutter_override_sign_column_highlight') &&
+      \ g:gitgutter_override_sign_column_highlight == 1
+  let s:sign_column = s:number_column
+else
+  let g:gitgutter_override_sign_column_highlight = 0
+
+  if exists('g:gruvbox_sign_column')
+    let s:sign_column = get(s:gb, g:gruvbox_sign_column)
+  endif
+endif
+
+let s:color_column = s:bg1
+if exists('g:gruvbox_color_column')
+  let s:color_column = get(s:gb, g:gruvbox_color_column)
+endif
+
+let s:vert_split = s:bg2
+if exists('g:gruvbox_vert_split')
+  let s:vert_split = get(s:gb, g:gruvbox_vert_split)
+endif
+
+let s:invert_signs = ''
+if exists('g:gruvbox_invert_signs')
+  if g:gruvbox_invert_signs == 1
+    let s:invert_signs = s:inverse
+  endif
+endif
+
+let s:invert_selection = s:inverse
+if exists('g:gruvbox_invert_selection')
+  if g:gruvbox_invert_selection == 0
+    let s:invert_selection = ''
+  endif
+endif
+
+let s:invert_tabline = ''
+if exists('g:gruvbox_invert_tabline')
+  if g:gruvbox_invert_tabline == 1
+    let s:invert_tabline = s:inverse
+  endif
+endif
+
+let s:italicize_comments = s:italic
+if exists('g:gruvbox_italicize_comments')
+  if g:gruvbox_italicize_comments == 0
+    let s:italicize_comments = ''
+  endif
+endif
+
+let s:italicize_strings = ''
+if exists('g:gruvbox_italicize_strings')
+  if g:gruvbox_italicize_strings == 1
+    let s:italicize_strings = s:italic
+  endif
+endif
+
+" }}}
+" Highlighting Function: {{{
+
+function! s:HL(group, fg, ...)
+  " Arguments: group, guifg, guibg, gui, guisp
+
+  " foreground
+  let fg = a:fg
+
+  " background
+  if a:0 >= 1
+    let bg = a:1
+  else
+    let bg = s:none
+  endif
+
+  " emphasis
+  if a:0 >= 2 && strlen(a:2)
+    let emstr = a:2
+  else
+    let emstr = 'NONE,'
+  endif
+
+  " special fallback
+  if a:0 >= 3
+    if g:gruvbox_guisp_fallback != 'NONE'
+      let fg = a:3
+    endif
+
+    " bg fallback mode should invert higlighting
+    if g:gruvbox_guisp_fallback == 'bg'
+      let emstr .= 'inverse,'
+    endif
+  endif
+
+  let histring = [ 'hi', a:group,
+        \ 'guifg=' . fg[0], 'ctermfg=' . fg[1],
+        \ 'guibg=' . bg[0], 'ctermbg=' . bg[1],
+        \ 'gui=' . emstr[:-2], 'cterm=' . emstr[:-2]
+        \ ]
+
+  " special
+  if a:0 >= 3
+    call add(histring, 'guisp=' . a:3[0])
+  endif
+
+  execute join(histring, ' ')
+endfunction
+
+" }}}
+" Gruvbox Hi Groups: {{{
+
+" memoize common hi groups
+call s:HL('GruvboxFg0', s:fg0)
+call s:HL('GruvboxFg1', s:fg1)
+call s:HL('GruvboxFg2', s:fg2)
+call s:HL('GruvboxFg3', s:fg3)
+call s:HL('GruvboxFg4', s:fg4)
+call s:HL('GruvboxGray', s:gray)
+call s:HL('GruvboxBg0', s:bg0)
+call s:HL('GruvboxBg1', s:bg1)
+call s:HL('GruvboxBg2', s:bg2)
+call s:HL('GruvboxBg3', s:bg3)
+call s:HL('GruvboxBg4', s:bg4)
+
+call s:HL('GruvboxRed', s:red)
+call s:HL('GruvboxRedBold', s:red, s:none, s:bold)
+call s:HL('GruvboxGreen', s:green)
+call s:HL('GruvboxGreenBold', s:green, s:none, s:bold)
+call s:HL('GruvboxYellow', s:yellow)
+call s:HL('GruvboxYellowBold', s:yellow, s:none, s:bold)
+call s:HL('GruvboxBlue', s:blue)
+call s:HL('GruvboxBlueBold', s:blue, s:none, s:bold)
+call s:HL('GruvboxPurple', s:purple)
+call s:HL('GruvboxPurpleBold', s:purple, s:none, s:bold)
+call s:HL('GruvboxAqua', s:aqua)
+call s:HL('GruvboxAquaBold', s:aqua, s:none, s:bold)
+call s:HL('GruvboxOrange', s:orange)
+call s:HL('GruvboxOrangeBold', s:orange, s:none, s:bold)
+
+call s:HL('GruvboxRedSign', s:red, s:sign_column, s:invert_signs)
+call s:HL('GruvboxGreenSign', s:green, s:sign_column, s:invert_signs)
+call s:HL('GruvboxYellowSign', s:yellow, s:sign_column, s:invert_signs)
+call s:HL('GruvboxBlueSign', s:blue, s:sign_column, s:invert_signs)
+call s:HL('GruvboxPurpleSign', s:purple, s:sign_column, s:invert_signs)
+call s:HL('GruvboxAquaSign', s:aqua, s:sign_column, s:invert_signs)
+
+" }}}
+
+" Vanilla colorscheme ---------------------------------------------------------
+" General UI: {{{
+
+" Normal text
+call s:HL('Normal', s:fg1, s:bg0)
+
+" Correct background (see issue #7):
+" --- Problem with changing between dark and light on 256 color terminal
+" --- https://github.com/morhetz/gruvbox/issues/7
+if s:is_dark
+  set background=dark
+else
+  set background=light
+endif
+
+if version >= 700
+  " Screen line that the cursor is
+  call s:HL('CursorLine',   s:none, s:bg1)
+  " Screen column that the cursor is
+  hi! link CursorColumn CursorLine
+
+  " Tab pages line filler
+  call s:HL('TabLineFill', s:bg4, s:vim_bg, s:invert_tabline)
+  " Active tab page label
+  call s:HL('TabLineSel', s:vim_bg, s:bg4, s:bold . s:invert_tabline)
+  " Not active tab page label
+  hi! link TabLine TabLineFill
+
+  " Match paired bracket under the cursor
+  call s:HL('MatchParen', s:none, s:bg3, s:bold)
+endif
+
+if version >= 703
+  " Highlighted screen columns
+  call s:HL('ColorColumn',  s:none, s:color_column)
+
+  " Concealed element: \lambda → λ
+  call s:HL('Conceal', s:blue, s:none)
+
+  " Line number of CursorLine
+  call s:HL('CursorLineNr', s:yellow, s:bg1)
+endif
+
+hi! link NonText GruvboxBg2
+hi! link SpecialKey GruvboxBg2
+
+call s:HL('Visual',    s:none,  s:bg3, s:invert_selection)
+hi! link VisualNOS Visual
+
+call s:HL('Search',    s:yellow, s:bg0, s:inverse)
+call s:HL('IncSearch', s:hls_cursor, s:bg0, s:inverse)
+
+call s:HL('Underlined', s:blue, s:none, s:underline)
+
+call s:HL('StatusLine',   s:bg4, s:bg0, s:bold . s:inverse)
+call s:HL('StatusLineNC', s:bg2, s:fg4, s:bold . s:inverse)
+
+" The column separating vertically split windows
+call s:HL('VertSplit', s:fg4, s:vert_split)
+
+" Current match in wildmenu completion
+call s:HL('WildMenu', s:blue, s:bg2, s:bold)
+
+" Directory names, special names in listing
+hi! link Directory GruvboxGreenBold
+
+" Titles for output from :set all, :autocmd, etc.
+hi! link Title GruvboxGreenBold
+
+" Error messages on the command line
+call s:HL('ErrorMsg',   s:bg0, s:red, s:bold)
+" More prompt: -- More --
+hi! link MoreMsg GruvboxYellowBold
+" Current mode message: -- INSERT --
+hi! link ModeMsg GruvboxYellowBold
+" 'Press enter' prompt and yes/no questions
+hi! link Question GruvboxOrangeBold
+" Warning messages
+hi! link WarningMsg GruvboxRedBold
+
+" }}}
+" Gutter: {{{
+
+" Line number for :number and :# commands
+call s:HL('LineNr', s:bg4, s:number_column)
+
+" Column where signs are displayed
+call s:HL('SignColumn', s:none, s:sign_column)
+
+" Line used for closed folds
+call s:HL('Folded', s:gray, s:bg1, s:italic)
+" Column where folds are displayed
+call s:HL('FoldColumn', s:gray, s:bg1)
+
+" }}}
+" Cursor: {{{
+
+" Character under cursor
+call s:HL('Cursor', s:none, s:none, s:inverse)
+" Visual mode cursor, selection
+hi! link vCursor Cursor
+" Input moder cursor
+hi! link iCursor Cursor
+" Language mapping cursor
+hi! link lCursor Cursor
+
+" }}}
+" Syntax Highlighting: {{{
+
+if g:gruvbox_improved_strings == 0
+  hi! link Special GruvboxOrange
+else
+  call s:HL('Special', s:bg1, s:orange, s:italic)
+endif
+
+call s:HL('Comment', s:gray, s:none, s:italicize_comments)
+call s:HL('Todo', s:vim_fg, s:vim_bg, s:bold . s:italic)
+call s:HL('Error', s:red, s:vim_bg, s:bold . s:inverse)
+
+" Generic statement
+hi! link Statement GruvboxRed
+" if, then, else, endif, swicth, etc.
+hi! link Conditional GruvboxRed
+" for, do, while, etc.
+hi! link Repeat GruvboxRed
+" case, default, etc.
+hi! link Label GruvboxRed
+" try, catch, throw
+hi! link Exception GruvboxRed
+" sizeof, "+", "*", etc.
+hi! link Operator Normal
+" Any other keyword
+hi! link Keyword GruvboxRed
+
+" Variable name
+hi! link Identifier GruvboxBlue
+" Function name
+hi! link Function GruvboxGreenBold
+
+" Generic preprocessor
+hi! link PreProc GruvboxAqua
+" Preprocessor #include
+hi! link Include GruvboxAqua
+" Preprocessor #define
+hi! link Define GruvboxAqua
+" Same as Define
+hi! link Macro GruvboxAqua
+" Preprocessor #if, #else, #endif, etc.
+hi! link PreCondit GruvboxAqua
+
+" Generic constant
+hi! link Constant GruvboxPurple
+" Character constant: 'c', '/n'
+hi! link Character GruvboxPurple
+" String constant: "this is a string"
+if g:gruvbox_improved_strings == 0
+  call s:HL('String',  s:green, s:none, s:italicize_strings)
+else
+  call s:HL('String',  s:bg1, s:fg1, s:italicize_strings)
+endif
+" Boolean constant: TRUE, false
+hi! link Boolean GruvboxPurple
+" Number constant: 234, 0xff
+hi! link Number GruvboxPurple
+" Floating point constant: 2.3e10
+hi! link Float GruvboxPurple
+
+" Generic type
+hi! link Type GruvboxYellow
+" static, register, volatile, etc
+hi! link StorageClass GruvboxOrange
+" struct, union, enum, etc.
+hi! link Structure GruvboxAqua
+" typedef
+hi! link Typedef GruvboxYellow
+
+" }}}
+" Completion Menu: {{{
+
+if version >= 700
+  " Popup menu: normal item
+  call s:HL('Pmenu', s:fg1, s:bg2)
+  " Popup menu: selected item
+  call s:HL('PmenuSel', s:bg2, s:blue, s:bold)
+  " Popup menu: scrollbar
+  call s:HL('PmenuSbar', s:none, s:bg2)
+  " Popup menu: scrollbar thumb
+  call s:HL('PmenuThumb', s:none, s:bg4)
+endif
+
+" }}}
+" Diffs: {{{
+
+call s:HL('DiffDelete', s:red, s:bg0, s:inverse)
+call s:HL('DiffAdd',    s:green, s:bg0, s:inverse)
+"call s:HL('DiffChange', s:bg0, s:blue)
+"call s:HL('DiffText',   s:bg0, s:yellow)
+
+" Alternative setting
+call s:HL('DiffChange', s:aqua, s:bg0, s:inverse)
+call s:HL('DiffText',   s:yellow, s:bg0, s:inverse)
+
+" }}}
+" Spelling: {{{
+
+if has("spell")
+  " Not capitalised word, or compile warnings
+  if g:gruvbox_improved_warnings == 0
+    call s:HL('SpellCap',   s:none, s:none, s:undercurl, s:red)
+  else
+    call s:HL('SpellCap',   s:green, s:none, s:bold . s:italic)
+  endif
+  " Not recognized word
+  call s:HL('SpellBad',   s:none, s:none, s:undercurl, s:blue)
+  " Wrong spelling for selected region
+  call s:HL('SpellLocal', s:none, s:none, s:undercurl, s:aqua)
+  " Rare word
+  call s:HL('SpellRare',  s:none, s:none, s:undercurl, s:purple)
+endif
+
+" }}}
+
+" Plugin specific -------------------------------------------------------------
+" EasyMotion: {{{
+
+hi! link EasyMotionTarget Search
+hi! link EasyMotionShade Comment
+
+" }}}
+" Sneak: {{{
+
+hi! link SneakPluginTarget Search
+hi! link SneakStreakTarget Search
+call s:HL('SneakStreakMask', s:yellow, s:yellow)
+hi! link SneakStreakStatusLine Search
+
+" }}}
+" Indent Guides: {{{
+
+if !exists('g:indent_guides_auto_colors')
+  let g:indent_guides_auto_colors = 0
+endif
+
+if g:indent_guides_auto_colors == 0
+  if g:gruvbox_invert_indent_guides == 0
+    call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2)
+    call s:HL('IndentGuidesEven', s:vim_bg, s:bg1)
+  else
+    call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2, s:inverse)
+    call s:HL('IndentGuidesEven', s:vim_bg, s:bg3, s:inverse)
+  endif
+endif
+
+" }}}
+" IndentLine: {{{
+
+if !exists('g:indentLine_color_term')
+  let g:indentLine_color_term = s:bg2[1]
+endif
+if !exists('g:indentLine_color_gui')
+  let g:indentLine_color_gui = s:bg2[0]
+endif
+
+" }}}
+" Rainbow Parentheses: {{{
+
+if !exists('g:rbpt_colorpairs')
+  let g:rbpt_colorpairs =
+    \ [
+      \ ['blue', '#458588'], ['magenta', '#b16286'],
+      \ ['red',  '#cc241d'], ['166',     '#d65d0e']
+    \ ]
+endif
+
+let g:rainbow_guifgs = [ '#d65d0e', '#cc241d', '#b16286', '#458588' ]
+let g:rainbow_ctermfgs = [ '166', 'red', 'magenta', 'blue' ]
+
+if !exists('g:rainbow_conf')
+   let g:rainbow_conf = {}
+endif
+if !has_key(g:rainbow_conf, 'guifgs')
+   let g:rainbow_conf['guifgs'] = g:rainbow_guifgs
+endif
+if !has_key(g:rainbow_conf, 'ctermfgs')
+   let g:rainbow_conf['ctermfgs'] = g:rainbow_ctermfgs
+endif
+
+let g:niji_dark_colours = g:rbpt_colorpairs
+let g:niji_light_colours = g:rbpt_colorpairs
+
+"}}}
+" GitGutter: {{{
+
+hi! link GitGutterAdd GruvboxGreenSign
+hi! link GitGutterChange GruvboxAquaSign
+hi! link GitGutterDelete GruvboxRedSign
+hi! link GitGutterChangeDelete GruvboxAquaSign
+
+" }}}
+" GitCommit: "{{{
+
+hi! link gitcommitSelectedFile GruvboxGreen
+hi! link gitcommitDiscardedFile GruvboxRed
+
+" }}}
+" Signify: {{{
+
+hi! link SignifySignAdd GruvboxGreenSign
+hi! link SignifySignChange GruvboxAquaSign
+hi! link SignifySignDelete GruvboxRedSign
+
+" }}}
+" Syntastic: {{{
+
+call s:HL('SyntasticError', s:none, s:none, s:undercurl, s:red)
+call s:HL('SyntasticWarning', s:none, s:none, s:undercurl, s:yellow)
+
+hi! link SyntasticErrorSign GruvboxRedSign
+hi! link SyntasticWarningSign GruvboxYellowSign
+
+" }}}
+" Signature: {{{
+hi! link SignatureMarkText   GruvboxBlueSign
+hi! link SignatureMarkerText GruvboxPurpleSign
+
+" }}}
+" ShowMarks: {{{
+
+hi! link ShowMarksHLl GruvboxBlueSign
+hi! link ShowMarksHLu GruvboxBlueSign
+hi! link ShowMarksHLo GruvboxBlueSign
+hi! link ShowMarksHLm GruvboxBlueSign
+
+" }}}
+" CtrlP: {{{
+
+hi! link CtrlPMatch GruvboxYellow
+hi! link CtrlPNoEntries GruvboxRed
+hi! link CtrlPPrtBase GruvboxBg2
+hi! link CtrlPPrtCursor GruvboxBlue
+hi! link CtrlPLinePre GruvboxBg2
+
+call s:HL('CtrlPMode1', s:blue, s:bg2, s:bold)
+call s:HL('CtrlPMode2', s:bg0, s:blue, s:bold)
+call s:HL('CtrlPStats', s:fg4, s:bg2, s:bold)
+
+" }}}
+" Startify: {{{
+
+hi! link StartifyBracket GruvboxFg3
+hi! link StartifyFile GruvboxFg0
+hi! link StartifyNumber GruvboxBlue
+hi! link StartifyPath GruvboxGray
+hi! link StartifySlash GruvboxGray
+hi! link StartifySection GruvboxYellow
+hi! link StartifySpecial GruvboxBg2
+hi! link StartifyHeader GruvboxOrange
+hi! link StartifyFooter GruvboxBg2
+
+" }}}
+" Vimshell: {{{
+
+let g:vimshell_escape_colors = [
+  \ s:bg4[0], s:red[0], s:green[0], s:yellow[0],
+  \ s:blue[0], s:purple[0], s:aqua[0], s:fg4[0],
+  \ s:bg0[0], s:red[0], s:green[0], s:orange[0],
+  \ s:blue[0], s:purple[0], s:aqua[0], s:fg0[0]
+  \ ]
+
+" }}}
+" BufTabLine: {{{
+
+call s:HL('BufTabLineCurrent', s:bg0, s:fg4)
+call s:HL('BufTabLineActive', s:fg4, s:bg2)
+call s:HL('BufTabLineHidden', s:bg4, s:bg1)
+call s:HL('BufTabLineFill', s:bg0, s:bg0)
+
+" }}}
+
+" Filetype specific -----------------------------------------------------------
+" Diff: {{{
+
+hi! link diffAdded GruvboxGreen
+hi! link diffRemoved GruvboxRed
+hi! link diffChanged GruvboxAqua
+
+hi! link diffFile GruvboxOrange
+hi! link diffNewFile GruvboxYellow
+
+hi! link diffLine GruvboxBlue
+
+" }}}
+" Html: {{{
+
+hi! link htmlTag GruvboxBlue
+hi! link htmlEndTag GruvboxBlue
+
+hi! link htmlTagName GruvboxAquaBold
+hi! link htmlArg GruvboxAqua
+
+hi! link htmlScriptTag GruvboxPurple
+hi! link htmlTagN GruvboxFg1
+hi! link htmlSpecialTagName GruvboxAquaBold
+
+call s:HL('htmlLink', s:fg4, s:none, s:underline)
+
+hi! link htmlSpecialChar GruvboxOrange
+
+call s:HL('htmlBold', s:vim_fg, s:vim_bg, s:bold)
+call s:HL('htmlBoldUnderline', s:vim_fg, s:vim_bg, s:bold . s:underline)
+call s:HL('htmlBoldItalic', s:vim_fg, s:vim_bg, s:bold . s:italic)
+call s:HL('htmlBoldUnderlineItalic', s:vim_fg, s:vim_bg, s:bold . s:underline . s:italic)
+
+call s:HL('htmlUnderline', s:vim_fg, s:vim_bg, s:underline)
+call s:HL('htmlUnderlineItalic', s:vim_fg, s:vim_bg, s:underline . s:italic)
+call s:HL('htmlItalic', s:vim_fg, s:vim_bg, s:italic)
+
+" }}}
+" Xml: {{{
+
+hi! link xmlTag GruvboxBlue
+hi! link xmlEndTag GruvboxBlue
+hi! link xmlTagName GruvboxBlue
+hi! link xmlEqual GruvboxBlue
+hi! link docbkKeyword GruvboxAquaBold
+
+hi! link xmlDocTypeDecl GruvboxGray
+hi! link xmlDocTypeKeyword GruvboxPurple
+hi! link xmlCdataStart GruvboxGray
+hi! link xmlCdataCdata GruvboxPurple
+hi! link dtdFunction GruvboxGray
+hi! link dtdTagName GruvboxPurple
+
+hi! link xmlAttrib GruvboxAqua
+hi! link xmlProcessingDelim GruvboxGray
+hi! link dtdParamEntityPunct GruvboxGray
+hi! link dtdParamEntityDPunct GruvboxGray
+hi! link xmlAttribPunct GruvboxGray
+
+hi! link xmlEntity GruvboxOrange
+hi! link xmlEntityPunct GruvboxOrange
+" }}}
+" Vim: {{{
+
+call s:HL('vimCommentTitle', s:fg4_256, s:none, s:bold . s:italicize_comments)
+
+hi! link vimNotation GruvboxOrange
+hi! link vimBracket GruvboxOrange
+hi! link vimMapModKey GruvboxOrange
+hi! link vimFuncSID GruvboxFg3
+hi! link vimSetSep GruvboxFg3
+hi! link vimSep GruvboxFg3
+hi! link vimContinue GruvboxFg3
+
+" }}}
+" Clojure: {{{
+
+hi! link clojureKeyword GruvboxBlue
+hi! link clojureCond GruvboxOrange
+hi! link clojureSpecial GruvboxOrange
+hi! link clojureDefine GruvboxOrange
+
+hi! link clojureFunc GruvboxYellow
+hi! link clojureRepeat GruvboxYellow
+hi! link clojureCharacter GruvboxAqua
+hi! link clojureStringEscape GruvboxAqua
+hi! link clojureException GruvboxRed
+
+hi! link clojureRegexp GruvboxAqua
+hi! link clojureRegexpEscape GruvboxAqua
+call s:HL('clojureRegexpCharClass', s:fg3, s:none, s:bold)
+hi! link clojureRegexpMod clojureRegexpCharClass
+hi! link clojureRegexpQuantifier clojureRegexpCharClass
+
+hi! link clojureParen GruvboxFg3
+hi! link clojureAnonArg GruvboxYellow
+hi! link clojureVariable GruvboxBlue
+hi! link clojureMacro GruvboxOrange
+
+hi! link clojureMeta GruvboxYellow
+hi! link clojureDeref GruvboxYellow
+hi! link clojureQuote GruvboxYellow
+hi! link clojureUnquote GruvboxYellow
+
+" }}}
+" C: {{{
+
+hi! link cOperator GruvboxPurple
+hi! link cStructure GruvboxOrange
+
+" }}}
+" Python: {{{
+
+hi! link pythonBuiltin GruvboxOrange
+hi! link pythonBuiltinObj GruvboxOrange
+hi! link pythonBuiltinFunc GruvboxOrange
+hi! link pythonFunction GruvboxAqua
+hi! link pythonDecorator GruvboxRed
+hi! link pythonInclude GruvboxBlue
+hi! link pythonImport GruvboxBlue
+hi! link pythonRun GruvboxBlue
+hi! link pythonCoding GruvboxBlue
+hi! link pythonOperator GruvboxRed
+hi! link pythonExceptions GruvboxPurple
+hi! link pythonBoolean GruvboxPurple
+hi! link pythonDot GruvboxFg3
+
+" }}}
+" CSS: {{{
+
+hi! link cssBraces GruvboxBlue
+hi! link cssFunctionName GruvboxYellow
+hi! link cssIdentifier GruvboxOrange
+hi! link cssClassName GruvboxGreen
+hi! link cssColor GruvboxBlue
+hi! link cssSelectorOp GruvboxBlue
+hi! link cssSelectorOp2 GruvboxBlue
+hi! link cssImportant GruvboxGreen
+hi! link cssVendor GruvboxFg1
+
+hi! link cssTextProp GruvboxAqua
+hi! link cssAnimationProp GruvboxAqua
+hi! link cssUIProp GruvboxYellow
+hi! link cssTransformProp GruvboxAqua
+hi! link cssTransitionProp GruvboxAqua
+hi! link cssPrintProp GruvboxAqua
+hi! link cssPositioningProp GruvboxYellow
+hi! link cssBoxProp GruvboxAqua
+hi! link cssFontDescriptorProp GruvboxAqua
+hi! link cssFlexibleBoxProp GruvboxAqua
+hi! link cssBorderOutlineProp GruvboxAqua
+hi! link cssBackgroundProp GruvboxAqua
+hi! link cssMarginProp GruvboxAqua
+hi! link cssListProp GruvboxAqua
+hi! link cssTableProp GruvboxAqua
+hi! link cssFontProp GruvboxAqua
+hi! link cssPaddingProp GruvboxAqua
+hi! link cssDimensionProp GruvboxAqua
+hi! link cssRenderProp GruvboxAqua
+hi! link cssColorProp GruvboxAqua
+hi! link cssGeneratedContentProp GruvboxAqua
+
+" }}}
+" JavaScript: {{{
+
+hi! link javaScriptBraces GruvboxFg1
+hi! link javaScriptFunction GruvboxAqua
+hi! link javaScriptIdentifier GruvboxRed
+hi! link javaScriptMember GruvboxBlue
+hi! link javaScriptNumber GruvboxPurple
+hi! link javaScriptNull GruvboxPurple
+hi! link javaScriptParens GruvboxFg3
+
+" }}}
+" YAJS: {{{
+
+hi! link javascriptImport GruvboxAqua
+hi! link javascriptExport GruvboxAqua
+hi! link javascriptClassKeyword GruvboxAqua
+hi! link javascriptClassExtends GruvboxAqua
+hi! link javascriptDefault GruvboxAqua
+
+hi! link javascriptClassName GruvboxYellow
+hi! link javascriptClassSuperName GruvboxYellow
+hi! link javascriptGlobal GruvboxYellow
+
+hi! link javascriptEndColons GruvboxFg1
+hi! link javascriptFuncArg GruvboxFg1
+hi! link javascriptGlobalMethod GruvboxFg1
+hi! link javascriptNodeGlobal GruvboxFg1
+
+" hi! link javascriptVariable GruvboxOrange
+hi! link javascriptVariable GruvboxRed
+" hi! link javascriptIdentifier GruvboxOrange
+" hi! link javascriptClassSuper GruvboxOrange
+hi! link javascriptIdentifier GruvboxOrange
+hi! link javascriptClassSuper GruvboxOrange
+
+" hi! link javascriptFuncKeyword GruvboxOrange
+" hi! link javascriptAsyncFunc GruvboxOrange
+hi! link javascriptFuncKeyword GruvboxAqua
+hi! link javascriptAsyncFunc GruvboxAqua
+hi! link javascriptClassStatic GruvboxOrange
+
+hi! link javascriptOperator GruvboxRed
+hi! link javascriptForOperator GruvboxRed
+hi! link javascriptYield GruvboxRed
+hi! link javascriptExceptions GruvboxRed
+hi! link javascriptMessage GruvboxRed
+
+hi! link javascriptTemplateSB GruvboxAqua
+hi! link javascriptTemplateSubstitution GruvboxFg1
+
+" hi! link javascriptLabel GruvboxBlue
+" hi! link javascriptObjectLabel GruvboxBlue
+" hi! link javascriptPropertyName GruvboxBlue
+hi! link javascriptLabel GruvboxFg1
+hi! link javascriptObjectLabel GruvboxFg1
+hi! link javascriptPropertyName GruvboxFg1
+
+hi! link javascriptLogicSymbols GruvboxFg1
+hi! link javascriptArrowFunc GruvboxFg1
+
+hi! link javascriptDocParamName GruvboxFg4
+hi! link javascriptDocTags GruvboxFg4
+hi! link javascriptDocNotation GruvboxFg4
+hi! link javascriptDocParamType GruvboxFg4
+hi! link javascriptDocNamedParamType GruvboxFg4
+
+" }}}
+" TypeScript: {{{
+
+hi! link typeScriptReserved GruvboxAqua
+hi! link typeScriptLabel GruvboxAqua
+hi! link typeScriptIdentifier GruvboxOrange
+hi! link typeScriptBraces GruvboxFg1
+hi! link typeScriptEndColons GruvboxFg1
+hi! link typeScriptDOMObjects GruvboxFg1
+hi! link typeScriptAjaxMethods GruvboxFg1
+hi! link typeScriptLogicSymbols GruvboxFg1
+hi! link typeScriptDocSeeTag Comment
+hi! link typeScriptDocParam Comment
+hi! link typeScriptDocTags vimCommentTitle
+
+" }}}
+" CoffeeScript: {{{
+
+hi! link coffeeExtendedOp GruvboxFg3
+hi! link coffeeSpecialOp GruvboxFg3
+hi! link coffeeCurly GruvboxOrange
+hi! link coffeeParen GruvboxFg3
+hi! link coffeeBracket GruvboxOrange
+
+" }}}
+" Ruby: {{{
+
+hi! link rubyStringDelimiter GruvboxGreen
+hi! link rubyInterpolationDelimiter GruvboxAqua
+
+" }}}
+" ObjectiveC: {{{
+
+hi! link objcTypeModifier GruvboxRed
+hi! link objcDirective GruvboxBlue
+
+" }}}
+" Go: {{{
+
+hi! link goDirective GruvboxAqua
+hi! link goConstants GruvboxPurple
+hi! link goDeclaration GruvboxRed
+hi! link goDeclType GruvboxBlue
+hi! link goBuiltins GruvboxOrange
+
+" }}}
+" Lua: {{{
+
+hi! link luaIn GruvboxRed
+hi! link luaFunction GruvboxAqua
+hi! link luaTable GruvboxOrange
+
+" }}}
+" MoonScript: {{{
+
+hi! link moonSpecialOp GruvboxFg3
+hi! link moonExtendedOp GruvboxFg3
+hi! link moonFunction GruvboxFg3
+hi! link moonObject GruvboxYellow
+
+" }}}
+" Java: {{{
+
+hi! link javaAnnotation GruvboxBlue
+hi! link javaDocTags GruvboxAqua
+hi! link javaCommentTitle vimCommentTitle
+hi! link javaParen GruvboxFg3
+hi! link javaParen1 GruvboxFg3
+hi! link javaParen2 GruvboxFg3
+hi! link javaParen3 GruvboxFg3
+hi! link javaParen4 GruvboxFg3
+hi! link javaParen5 GruvboxFg3
+hi! link javaOperator GruvboxOrange
+
+hi! link javaVarArg GruvboxGreen
+
+" }}}
+" Elixir: {{{
+
+hi! link elixirDocString Comment
+
+hi! link elixirStringDelimiter GruvboxGreen
+hi! link elixirInterpolationDelimiter GruvboxAqua
+
+hi! link elixirModuleDeclaration GruvboxYellow
+
+" }}}
+" Scala: {{{
+
+" NB: scala vim syntax file is kinda horrible
+hi! link scalaNameDefinition GruvboxFg1
+hi! link scalaCaseFollowing GruvboxFg1
+hi! link scalaCapitalWord GruvboxFg1
+hi! link scalaTypeExtension GruvboxFg1
+
+hi! link scalaKeyword GruvboxRed
+hi! link scalaKeywordModifier GruvboxRed
+
+hi! link scalaSpecial GruvboxAqua
+hi! link scalaOperator GruvboxFg1
+
+hi! link scalaTypeDeclaration GruvboxYellow
+hi! link scalaTypeTypePostDeclaration GruvboxYellow
+
+hi! link scalaInstanceDeclaration GruvboxFg1
+hi! link scalaInterpolation GruvboxAqua
+
+" }}}
+" Markdown: {{{
+
+call s:HL('markdownItalic', s:fg3, s:none, s:italic)
+
+hi! link markdownH1 GruvboxGreenBold
+hi! link markdownH2 GruvboxGreenBold
+hi! link markdownH3 GruvboxYellowBold
+hi! link markdownH4 GruvboxYellowBold
+hi! link markdownH5 GruvboxYellow
+hi! link markdownH6 GruvboxYellow
+
+hi! link markdownCode GruvboxAqua
+hi! link markdownCodeBlock GruvboxAqua
+hi! link markdownCodeDelimiter GruvboxAqua
+
+hi! link markdownBlockquote GruvboxGray
+hi! link markdownListMarker GruvboxGray
+hi! link markdownOrderedListMarker GruvboxGray
+hi! link markdownRule GruvboxGray
+hi! link markdownHeadingRule GruvboxGray
+
+hi! link markdownUrlDelimiter GruvboxFg3
+hi! link markdownLinkDelimiter GruvboxFg3
+hi! link markdownLinkTextDelimiter GruvboxFg3
+
+hi! link markdownHeadingDelimiter GruvboxOrange
+hi! link markdownUrl GruvboxPurple
+hi! link markdownUrlTitleDelimiter GruvboxGreen
+
+call s:HL('markdownLinkText', s:gray, s:none, s:underline)
+hi! link markdownIdDeclaration markdownLinkText
+
+" }}}
+" Haskell: {{{
+
+" hi! link haskellType GruvboxYellow
+" hi! link haskellOperators GruvboxOrange
+" hi! link haskellConditional GruvboxAqua
+" hi! link haskellLet GruvboxOrange
+"
+hi! link haskellType GruvboxFg1
+hi! link haskellIdentifier GruvboxFg1
+hi! link haskellSeparator GruvboxFg1
+hi! link haskellDelimiter GruvboxFg4
+hi! link haskellOperators GruvboxBlue
+"
+hi! link haskellBacktick GruvboxOrange
+hi! link haskellStatement GruvboxOrange
+hi! link haskellConditional GruvboxOrange
+
+hi! link haskellLet GruvboxAqua
+hi! link haskellDefault GruvboxAqua
+hi! link haskellWhere GruvboxAqua
+hi! link haskellBottom GruvboxAqua
+hi! link haskellBlockKeywords GruvboxAqua
+hi! link haskellImportKeywords GruvboxAqua
+hi! link haskellDeclKeyword GruvboxAqua
+hi! link haskellDeriving GruvboxAqua
+hi! link haskellAssocType GruvboxAqua
+
+hi! link haskellNumber GruvboxPurple
+hi! link haskellPragma GruvboxPurple
+
+hi! link haskellString GruvboxGreen
+hi! link haskellChar GruvboxGreen
+
+" }}}
+" Json: {{{
+
+hi! link jsonKeyword GruvboxGreen
+hi! link jsonQuote GruvboxGreen
+hi! link jsonBraces GruvboxFg1
+hi! link jsonString GruvboxFg1
+
+" }}}
+
+
+" Functions -------------------------------------------------------------------
+" Search Highlighting Cursor {{{
+
+function! GruvboxHlsShowCursor()
+  call s:HL('Cursor', s:bg0, s:hls_cursor)
+endfunction
+
+function! GruvboxHlsHideCursor()
+  call s:HL('Cursor', s:none, s:none, s:inverse)
+endfunction
+
+" }}}
+
+" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker:
diff --git a/sources_non_forked/gruvbox/gruvbox_256palette.sh b/sources_non_forked/gruvbox/gruvbox_256palette.sh
new file mode 100644
index 00000000..c7fd190e
--- /dev/null
+++ b/sources_non_forked/gruvbox/gruvbox_256palette.sh
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+if [ "${TERM%%-*}" = "screen" ]; then
+  if [ -n "$TMUX" ]; then
+    printf "\033Ptmux;\033\033]4;236;rgb:32/30/2f\007\033\\"
+    printf "\033Ptmux;\033\033]4;234;rgb:1d/20/21\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;235;rgb:28/28/28\007\033\\"
+    printf "\033Ptmux;\033\033]4;237;rgb:3c/38/36\007\033\\"
+    printf "\033Ptmux;\033\033]4;239;rgb:50/49/45\007\033\\"
+    printf "\033Ptmux;\033\033]4;241;rgb:66/5c/54\007\033\\"
+    printf "\033Ptmux;\033\033]4;243;rgb:7c/6f/64\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;244;rgb:92/83/74\007\033\\"
+    printf "\033Ptmux;\033\033]4;245;rgb:92/83/74\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;228;rgb:f2/e5/bc\007\033\\"
+    printf "\033Ptmux;\033\033]4;230;rgb:f9/f5/d7\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;229;rgb:fb/f1/c7\007\033\\"
+    printf "\033Ptmux;\033\033]4;223;rgb:eb/db/b2\007\033\\"
+    printf "\033Ptmux;\033\033]4;250;rgb:d5/c4/a1\007\033\\"
+    printf "\033Ptmux;\033\033]4;248;rgb:bd/ae/93\007\033\\"
+    printf "\033Ptmux;\033\033]4;246;rgb:a8/99/84\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;167;rgb:fb/49/34\007\033\\"
+    printf "\033Ptmux;\033\033]4;142;rgb:b8/bb/26\007\033\\"
+    printf "\033Ptmux;\033\033]4;214;rgb:fa/bd/2f\007\033\\"
+    printf "\033Ptmux;\033\033]4;109;rgb:83/a5/98\007\033\\"
+    printf "\033Ptmux;\033\033]4;175;rgb:d3/86/9b\007\033\\"
+    printf "\033Ptmux;\033\033]4;108;rgb:8e/c0/7c\007\033\\"
+    printf "\033Ptmux;\033\033]4;208;rgb:fe/80/19\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;88;rgb:9d/00/06\007\033\\"
+    printf "\033Ptmux;\033\033]4;100;rgb:79/74/0e\007\033\\"
+    printf "\033Ptmux;\033\033]4;136;rgb:b5/76/14\007\033\\"
+    printf "\033Ptmux;\033\033]4;24;rgb:07/66/78\007\033\\"
+    printf "\033Ptmux;\033\033]4;96;rgb:8f/3f/71\007\033\\"
+    printf "\033Ptmux;\033\033]4;66;rgb:42/7b/58\007\033\\"
+    printf "\033Ptmux;\033\033]4;130;rgb:af/3a/03\007\033\\"
+  else
+    printf "\033P\033]4;236;rgb:32/30/2f\007\033\\"
+    printf "\033P\033]4;234;rgb:1d/20/21\007\033\\"
+
+    printf "\033P\033]4;235;rgb:28/28/28\007\033\\"
+    printf "\033P\033]4;237;rgb:3c/38/36\007\033\\"
+    printf "\033P\033]4;239;rgb:50/49/45\007\033\\"
+    printf "\033P\033]4;241;rgb:66/5c/54\007\033\\"
+    printf "\033P\033]4;243;rgb:7c/6f/64\007\033\\"
+
+    printf "\033P\033]4;244;rgb:92/83/74\007\033\\"
+    printf "\033P\033]4;245;rgb:92/83/74\007\033\\"
+
+    printf "\033P\033]4;228;rgb:f2/e5/bc\007\033\\"
+    printf "\033P\033]4;230;rgb:f9/f5/d7\007\033\\"
+
+    printf "\033P\033]4;229;rgb:fb/f1/c7\007\033\\"
+    printf "\033P\033]4;223;rgb:eb/db/b2\007\033\\"
+    printf "\033P\033]4;250;rgb:d5/c4/a1\007\033\\"
+    printf "\033P\033]4;248;rgb:bd/ae/93\007\033\\"
+    printf "\033P\033]4;246;rgb:a8/99/84\007\033\\"
+
+    printf "\033P\033]4;167;rgb:fb/49/34\007\033\\"
+    printf "\033P\033]4;142;rgb:b8/bb/26\007\033\\"
+    printf "\033P\033]4;214;rgb:fa/bd/2f\007\033\\"
+    printf "\033P\033]4;109;rgb:83/a5/98\007\033\\"
+    printf "\033P\033]4;175;rgb:d3/86/9b\007\033\\"
+    printf "\033P\033]4;108;rgb:8e/c0/7c\007\033\\"
+    printf "\033P\033]4;208;rgb:fe/80/19\007\033\\"
+
+    printf "\033P\033]4;88;rgb:9d/00/06\007\033\\"
+    printf "\033P\033]4;100;rgb:79/74/0e\007\033\\"
+    printf "\033P\033]4;136;rgb:b5/76/14\007\033\\"
+    printf "\033P\033]4;24;rgb:07/66/78\007\033\\"
+    printf "\033P\033]4;96;rgb:8f/3f/71\007\033\\"
+    printf "\033P\033]4;66;rgb:42/7b/58\007\033\\"
+    printf "\033P\033]4;130;rgb:af/3a/03\007\033\\"
+  fi
+
+elif [ "$TERM" != "linux" ] && [ "$TERM" != "vt100" ] && [ "$TERM" != "vt220" ]; then
+
+  printf "\033]4;236;rgb:32/30/2f\033\\"
+  printf "\033]4;234;rgb:1d/20/21\033\\"
+
+  printf "\033]4;235;rgb:28/28/28\033\\"
+  printf "\033]4;237;rgb:3c/38/36\033\\"
+  printf "\033]4;239;rgb:50/49/45\033\\"
+  printf "\033]4;241;rgb:66/5c/54\033\\"
+  printf "\033]4;243;rgb:7c/6f/64\033\\"
+
+  printf "\033]4;244;rgb:92/83/74\033\\"
+  printf "\033]4;245;rgb:92/83/74\033\\"
+
+  printf "\033]4;228;rgb:f2/e5/bc\033\\"
+  printf "\033]4;230;rgb:f9/f5/d7\033\\"
+
+  printf "\033]4;229;rgb:fb/f1/c7\033\\"
+  printf "\033]4;223;rgb:eb/db/b2\033\\"
+  printf "\033]4;250;rgb:d5/c4/a1\033\\"
+  printf "\033]4;248;rgb:bd/ae/93\033\\"
+  printf "\033]4;246;rgb:a8/99/84\033\\"
+
+  printf "\033]4;167;rgb:fb/49/34\033\\"
+  printf "\033]4;142;rgb:b8/bb/26\033\\"
+  printf "\033]4;214;rgb:fa/bd/2f\033\\"
+  printf "\033]4;109;rgb:83/a5/98\033\\"
+  printf "\033]4;175;rgb:d3/86/9b\033\\"
+  printf "\033]4;108;rgb:8e/c0/7c\033\\"
+  printf "\033]4;208;rgb:fe/80/19\033\\"
+
+  printf "\033]4;88;rgb:9d/00/06\033\\"
+  printf "\033]4;100;rgb:79/74/0e\033\\"
+  printf "\033]4;136;rgb:b5/76/14\033\\"
+  printf "\033]4;24;rgb:07/66/78\033\\"
+  printf "\033]4;96;rgb:8f/3f/71\033\\"
+  printf "\033]4;66;rgb:42/7b/58\033\\"
+  printf "\033]4;130;rgb:af/3a/03\033\\"
+fi
diff --git a/sources_non_forked/gruvbox/gruvbox_256palette_osx.sh b/sources_non_forked/gruvbox/gruvbox_256palette_osx.sh
new file mode 100644
index 00000000..ad5111a1
--- /dev/null
+++ b/sources_non_forked/gruvbox/gruvbox_256palette_osx.sh
@@ -0,0 +1,116 @@
+#!/bin/sh
+
+if [ "${TERM%%-*}" = "screen" ]; then
+  if [ -n "$TMUX" ]; then
+    printf "\033Ptmux;\033\033]4;236;rgb:26/24/23\007\033\\"
+    printf "\033Ptmux;\033\033]4;234;rgb:16/18/19\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;235;rgb:1e/1e/1e\007\033\\"
+    printf "\033Ptmux;\033\033]4;237;rgb:2e/2a/29\007\033\\"
+    printf "\033Ptmux;\033\033]4;239;rgb:3f/39/35\007\033\\"
+    printf "\033Ptmux;\033\033]4;241;rgb:53/4a/42\007\033\\"
+    printf "\033Ptmux;\033\033]4;243;rgb:68/5c/51\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;244;rgb:7f/70/61\007\033\\"
+    printf "\033Ptmux;\033\033]4;245;rgb:7f/70/61\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;228;rgb:ef/df/ae\007\033\\"
+    printf "\033Ptmux;\033\033]4;230;rgb:f8/f4/cd\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;229;rgb:fa/ee/bb\007\033\\"
+    printf "\033Ptmux;\033\033]4;223;rgb:e6/d4/a3\007\033\\"
+    printf "\033Ptmux;\033\033]4;250;rgb:cb/b8/90\007\033\\"
+    printf "\033Ptmux;\033\033]4;248;rgb:af/9f/81\007\033\\"
+    printf "\033Ptmux;\033\033]4;246;rgb:97/87/71\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;167;rgb:f7/30/28\007\033\\"
+    printf "\033Ptmux;\033\033]4;142;rgb:aa/b0/1e\007\033\\"
+    printf "\033Ptmux;\033\033]4;214;rgb:f7/b1/25\007\033\\"
+    printf "\033Ptmux;\033\033]4;109;rgb:71/95/86\007\033\\"
+    printf "\033Ptmux;\033\033]4;175;rgb:c7/70/89\007\033\\"
+    printf "\033Ptmux;\033\033]4;108;rgb:7d/b6/69\007\033\\"
+    printf "\033Ptmux;\033\033]4;208;rgb:fb/6a/16\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;88;rgb:89/00/09\007\033\\"
+    printf "\033Ptmux;\033\033]4;100;rgb:66/62/0d\007\033\\"
+    printf "\033Ptmux;\033\033]4;136;rgb:a5/63/11\007\033\\"
+    printf "\033Ptmux;\033\033]4;24;rgb:0e/53/65\007\033\\"
+    printf "\033Ptmux;\033\033]4;96;rgb:7b/2b/5e\007\033\\"
+    printf "\033Ptmux;\033\033]4;66;rgb:35/6a/46\007\033\\"
+    printf "\033Ptmux;\033\033]4;130;rgb:9d/28/07\007\033\\"
+  else
+    printf "\033P\033]4;236;rgb:26/24/23\007\033\\"
+    printf "\033P\033]4;234;rgb:16/18/19\007\033\\"
+
+    printf "\033P\033]4;235;rgb:1e/1e/1e\007\033\\"
+    printf "\033P\033]4;237;rgb:2e/2a/29\007\033\\"
+    printf "\033P\033]4;239;rgb:3f/39/35\007\033\\"
+    printf "\033P\033]4;241;rgb:53/4a/42\007\033\\"
+    printf "\033P\033]4;243;rgb:68/5c/51\007\033\\"
+
+    printf "\033P\033]4;244;rgb:7f/70/61\007\033\\"
+    printf "\033P\033]4;245;rgb:7f/70/61\007\033\\"
+
+    printf "\033P\033]4;228;rgb:ef/df/ae\007\033\\"
+    printf "\033P\033]4;230;rgb:f8/f4/cd\007\033\\"
+
+    printf "\033P\033]4;229;rgb:fa/ee/bb\007\033\\"
+    printf "\033P\033]4;223;rgb:e6/d4/a3\007\033\\"
+    printf "\033P\033]4;250;rgb:cb/b8/90\007\033\\"
+    printf "\033P\033]4;248;rgb:af/9f/81\007\033\\"
+    printf "\033P\033]4;246;rgb:97/87/71\007\033\\"
+
+    printf "\033P\033]4;167;rgb:f7/30/28\007\033\\"
+    printf "\033P\033]4;142;rgb:aa/b0/1e\007\033\\"
+    printf "\033P\033]4;214;rgb:f7/b1/25\007\033\\"
+    printf "\033P\033]4;109;rgb:71/95/86\007\033\\"
+    printf "\033P\033]4;175;rgb:c7/70/89\007\033\\"
+    printf "\033P\033]4;108;rgb:7d/b6/69\007\033\\"
+    printf "\033P\033]4;208;rgb:fb/6a/16\007\033\\"
+
+    printf "\033P\033]4;88;rgb:89/00/09\007\033\\"
+    printf "\033P\033]4;100;rgb:66/62/0d\007\033\\"
+    printf "\033P\033]4;136;rgb:a5/63/11\007\033\\"
+    printf "\033P\033]4;24;rgb:0e/53/65\007\033\\"
+    printf "\033P\033]4;96;rgb:7b/2b/5e\007\033\\"
+    printf "\033P\033]4;66;rgb:35/6a/46\007\033\\"
+    printf "\033P\033]4;130;rgb:9d/28/07\007\033\\"
+  fi
+else
+  printf "\033]4;236;rgb:26/24/23\033\\"
+  printf "\033]4;234;rgb:16/18/19\033\\"
+
+  printf "\033]4;235;rgb:1e/1e/1e\033\\"
+  printf "\033]4;237;rgb:2e/2a/29\033\\"
+  printf "\033]4;239;rgb:3f/39/35\033\\"
+  printf "\033]4;241;rgb:53/4a/42\033\\"
+  printf "\033]4;243;rgb:68/5c/51\033\\"
+
+  printf "\033]4;244;rgb:7f/70/61\033\\"
+  printf "\033]4;245;rgb:7f/70/61\033\\"
+
+  printf "\033]4;228;rgb:ef/df/ae\033\\"
+  printf "\033]4;230;rgb:f8/f4/cd\033\\"
+
+  printf "\033]4;229;rgb:fa/ee/bb\033\\"
+  printf "\033]4;223;rgb:e6/d4/a3\033\\"
+  printf "\033]4;250;rgb:cb/b8/90\033\\"
+  printf "\033]4;248;rgb:af/9f/81\033\\"
+  printf "\033]4;246;rgb:97/87/71\033\\"
+
+  printf "\033]4;167;rgb:f7/30/28\033\\"
+  printf "\033]4;142;rgb:aa/b0/1e\033\\"
+  printf "\033]4;214;rgb:f7/b1/25\033\\"
+  printf "\033]4;109;rgb:71/95/86\033\\"
+  printf "\033]4;175;rgb:c7/70/89\033\\"
+  printf "\033]4;108;rgb:7d/b6/69\033\\"
+  printf "\033]4;208;rgb:fb/6a/16\033\\"
+
+  printf "\033]4;88;rgb:89/00/09\033\\"
+  printf "\033]4;100;rgb:66/62/0d\033\\"
+  printf "\033]4;136;rgb:a5/63/11\033\\"
+  printf "\033]4;24;rgb:0e/53/65\033\\"
+  printf "\033]4;96;rgb:7b/2b/5e\033\\"
+  printf "\033]4;66;rgb:35/6a/46\033\\"
+  printf "\033]4;130;rgb:9d/28/07\033\\"
+fi
diff --git a/sources_non_forked/vim-colorschemes b/sources_non_forked/vim-colorschemes
deleted file mode 160000
index 28a989b2..00000000
--- a/sources_non_forked/vim-colorschemes
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 28a989b28457e38df620e4c7ab23e224aff70efe
diff --git a/sources_non_forked/vim-gitgutter b/sources_non_forked/vim-gitgutter
deleted file mode 160000
index 339f8ba0..00000000
--- a/sources_non_forked/vim-gitgutter
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 339f8ba079ed7d465ca442c9032b36bc56c21f61
diff --git a/sources_non_forked/vim-gitgutter/.gitignore b/sources_non_forked/vim-gitgutter/.gitignore
new file mode 100644
index 00000000..82fb2537
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/.gitignore
@@ -0,0 +1,5 @@
+/doc/tags
+/misc
+/test/*.actual
+*.log
+
diff --git a/sources_non_forked/vim-gitgutter/README.mkd b/sources_non_forked/vim-gitgutter/README.mkd
new file mode 100644
index 00000000..19ed3876
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/README.mkd
@@ -0,0 +1,499 @@
+## vim-gitgutter
+
+A Vim plugin which shows a git diff in the 'gutter' (sign column).  It shows whether each line has been added, modified, and where lines have been removed.  You can also stage and undo individual hunks.
+
+Features:
+
+* Shows signs for added, modified, and removed lines.
+* Runs the diffs asynchronously in terminal Vim/MacVim (7.4.1826+), gVim (7.4.1850+), MacVim GUI (7.4.1832+), and NeoVim.
+* Ensures signs are always as up to date as possible (but without running more than necessary).
+* Quick jumping between blocks of changed lines ("hunks").
+* Stage/undo/preview individual hunks.
+* Provides a hunk text object.
+* Diffs against index (default) or any commit.
+* Handles line endings correctly, even with repos that do CRLF conversion.
+* Optional line highlighting.
+* Fully customisable (signs, sign column, line highlights, mappings, extra git-diff arguments, etc).
+* Can be toggled on/off.
+* Preserves signs from other plugins.
+* Easy to integrate diff stats into status line; built-in integration with [vim-airline](https://github.com/bling/vim-airline/).
+* Works with fish shell (in addition to the usual shells).
+
+Constraints:
+
+* Supports git only.
+
+If you work with other version control systems, I recommend [vim-signify](https://github.com/mhinz/vim-signify).
+
+
+### Screenshot
+
+![screenshot](https://raw.github.com/airblade/vim-gitgutter/master/screenshot.png)
+
+In the screenshot above you can see:
+
+* Line 15 has been modified.
+* Lines 21-24 are new.
+* A line or lines were removed between lines 25 and 26.
+
+
+### Installation
+
+Before installation, please check your Vim supports signs by running `:echo has('signs')`.  `1` means you're all set; `0` means you need to install a Vim with signs support.  If you're compiling Vim yourself you need the 'big' or 'huge' feature set.  [MacVim][] supports signs.
+
+You install vim-gitgutter like any other vim plugin.
+
+##### Pathogen
+
+```
+cd ~/.vim/bundle
+git clone git://github.com/airblade/vim-gitgutter.git
+```
+
+##### Voom
+
+Edit your plugin manifest (`voom edit`) and add:
+
+```
+airblade/vim-gitgutter
+```
+
+##### VimPlug
+
+Place this in your .vimrc:
+
+```viml
+Plug 'airblade/vim-gitgutter'
+```
+
+Then run the following in Vim:
+
+```
+:source %
+:PlugInstall
+```
+
+##### NeoBundle
+
+Place this in your .vimrc:
+
+```viml
+NeoBundle 'airblade/vim-gitgutter'
+```
+
+Then run the following in Vim:
+
+```
+:source %
+:NeoBundleInstall
+```
+
+##### No plugin manager
+
+Copy vim-gitgutter's subdirectories into your vim configuration directory:
+
+```
+cd /tmp && git clone git://github.com/airblade/vim-gitgutter.git
+cp -r vim-gitgutter/* ~/.vim/
+```
+
+See `:help add-global-plugin`.
+
+
+If you are on Windows you may find the command prompt pops up briefly every time vim-gitgutter runs.  You can avoid this by installing both [vim-misc](https://github.com/xolox/vim-misc) and [vim-shell](https://github.com/xolox/vim-shell).  If you have those two plugins but don't want vim-gitgutter to use them, you can opt out with `let g:gitgutter_avoid_cmd_prompt_on_windows = 0` in your `~/.vimrc`.
+
+
+### Getting started
+
+When you make a change to a file tracked by git, the diff markers should appear automatically.  The delay is governed by vim's `updatetime` option; the default value is 4 seconds but I suggest reducing it to around 250ms (add `set updatetime=250` to your vimrc).
+
+You can jump between hunks with `[c` and `]c`.  You can preview, stage, and undo hunks with `<leader>hp`, `<leader>hs`, and `<leader>hu` respectively.
+
+You cannot currently unstage a staged hunk.
+
+
+#### Activation
+
+You can explicitly turn vim-gitgutter off and on (defaults to on):
+
+* turn off with `:GitGutterDisable`
+* turn on with `:GitGutterEnable`
+* toggle with `:GitGutterToggle`.
+
+You can turn the signs on and off (defaults to on):
+
+* turn on with `:GitGutterSignsEnable`
+* turn off with `:GitGutterSignsDisable`
+* toggle with `:GitGutterSignsToggle`.
+
+And you can turn line highlighting on and off (defaults to off):
+
+* turn on with `:GitGutterLineHighlightsEnable`
+* turn off with `:GitGutterLineHighlightsDisable`
+* toggle with `:GitGutterLineHighlightsToggle`.
+
+Note that if you have line highlighting on and signs off, you will have an empty sign column – more accurately, a sign column with invisible signs.  This is because line highlighting requires signs and Vim always shows the sign column even if the signs are invisible.
+
+If you switch off both line highlighting and signs, you won't see the sign column.  That is unless you have set `let g:gitgutter_sign_column_always = 1` so it's always there.
+
+To keep your Vim snappy, vim-gitgutter will suppress itself when a file has more than 500 changes.  As soon as the number of changes falls below the limit vim-gitgutter will show the signs again.  You can configure the threshold with:
+
+```viml
+let g:gitgutter_max_signs = 500  " default value
+```
+
+#### Hunks
+
+You can jump between hunks:
+
+* jump to next hunk (change): `]c`
+* jump to previous hunk (change): `[c`.
+
+Both of those take a preceding count.
+
+To set your own mappings for these, for example `]h` and `[h`:
+
+```viml
+nmap ]h <Plug>GitGutterNextHunk
+nmap [h <Plug>GitGutterPrevHunk
+```
+
+You can stage or undo an individual hunk when your cursor is in it:
+
+* stage the hunk with `<Leader>hs` or
+* undo it with `<Leader>hu`.
+
+See the FAQ if you want to unstage staged changes.
+
+The `.` command will work with both these if you install [repeat.vim](https://github.com/tpope/vim-repeat).
+
+To set your own mappings for these, for example if you prefer the mnemonics hunk-add and hunk-revert:
+
+```viml
+nmap <Leader>ha <Plug>GitGutterStageHunk
+nmap <Leader>hr <Plug>GitGutterUndoHunk
+```
+
+And you can preview a hunk's changes with `<Leader>hp`.  You can of course change this mapping, e.g:
+
+```viml
+nmap <Leader>hv <Plug>GitGutterPreviewHunk
+```
+
+A hunk text object is provided which works in visual and operator-pending modes.
+
+- `ic` operates on all lines in the current hunk.
+- `ac` operates on all lines in the current hunk and any trailing empty lines.
+
+To re-map these, for example to `ih` and `ah`:
+
+```viml
+omap ih <Plug>GitGutterTextObjectInnerPending
+omap ah <Plug>GitGutterTextObjectOuterPending
+xmap ih <Plug>GitGutterTextObjectInnerVisual
+xmap ah <Plug>GitGutterTextObjectOuterVisual
+```
+
+If you don't want vim-gitgutter to set up any mappings at all, use this:
+
+```viml
+let g:gitgutter_map_keys = 0
+```
+
+Finally, you can force vim-gitgutter to update its signs across all visible buffers with `:GitGutterAll`.
+
+See the customisation section below for how to change the defaults.
+
+
+### When are the signs updated?
+
+By default the signs are updated as follows:
+
+| Event                     | Reason for update                    | Configuration          |
+|---------------------------|--------------------------------------|------------------------|
+| Stop typing               | So the signs are real time           | `g:gitgutter_realtime` |
+| Switch buffer             | To notice change to git index        | `g:gitgutter_eager`    |
+| Switch tab                | To notice change to git index        | `g:gitgutter_eager`    |
+| Focus the GUI             | To notice change to git index        | `g:gitgutter_eager` (not gVim on Windows) |
+| Read a file into a buffer | To display initial signs             | [always]               |
+| Save a buffer             | So non-realtime signs are up to date | [always]               |
+| Change a file outside Vim | To notice `git stash`                | [always]               |
+
+The length of time Vim waits after you stop typing before it triggers the plugin is governed by the setting `updatetime`.  This defaults to `4000` milliseconds which is rather too long.  I recommend around `250` milliseconds but it depends on your system and your preferences.  Note that in terminal Vim pre-7.4.427 an `updatetime` of less than approximately `1000` milliseconds can lead to random highlighting glitches; the lower the `updatetime`, the more glitches.
+
+If you experience a lag, you can trade speed for accuracy:
+
+```viml
+let g:gitgutter_realtime = 0
+let g:gitgutter_eager = 0
+```
+
+Note the realtime updating requires Vim 7.3.105 or higher.
+
+
+### Customisation
+
+You can customise:
+
+* The sign column's colours
+* Whether or not the sign column is shown when there aren't any signs (defaults to no)
+* The signs' colours and symbols
+* Line highlights
+* The base of the diff
+* Extra arguments for `git diff`
+* Key mappings
+* Whether or not vim-gitgutter is on initially (defaults to on)
+* Whether or not signs are shown (defaults to yes)
+* Whether or not line highlighting is on initially (defaults to off)
+* Whether or not vim-gitgutter runs in "realtime" (defaults to yes)
+* Whether or not vim-gitgutter runs eagerly (defaults to yes)
+* Whether or not vim-gitgutter runs asynchronously (defaults to yes)
+
+Please note that vim-gitgutter won't override any colours or highlights you've set in your colorscheme.
+
+
+#### Sign column
+
+By default vim-gitgutter will make the sign column look like the line number column.
+
+To customise your sign column's background color, first tell vim-gitgutter to leave it alone:
+
+```viml
+let g:gitgutter_override_sign_column_highlight = 0
+```
+
+And then either update your colorscheme's `SignColumn` highlight group or set it in your vimrc:
+
+```viml
+highlight SignColumn ctermbg=whatever    " terminal Vim
+highlight SignColumn guibg=whatever      " gVim/MacVim
+```
+
+By default the sign column will appear when there are signs to show and disappear when there aren't.  If you would always like the sign column to be there, add `let g:gitgutter_sign_column_always = 1` to your `~/.vimrc`.
+
+
+#### Signs' colours and symbols
+
+To customise the colours, set up the following highlight groups in your colorscheme or `~/.vimrc`:
+
+```viml
+GitGutterAdd          " an added line
+GitGutterChange       " a changed line
+GitGutterDelete       " at least one removed line
+GitGutterChangeDelete " a changed line followed by at least one removed line
+```
+
+You can either set these with `highlight GitGutterAdd {key}={arg}...` or link them to existing highlight groups with, say, `highlight link GitGutterAdd DiffAdd`.
+
+To customise the symbols, add the following to your `~/.vimrc`:
+
+```viml
+let g:gitgutter_sign_added = 'xx'
+let g:gitgutter_sign_modified = 'yy'
+let g:gitgutter_sign_removed = 'zz'
+let g:gitgutter_sign_removed_first_line = '^^'
+let g:gitgutter_sign_modified_removed = 'ww'
+```
+
+
+#### Line highlights
+
+Similarly to the signs' colours, set up the following highlight groups in your colorscheme or `~/.vimrc`:
+
+```viml
+GitGutterAddLine          " default: links to DiffAdd
+GitGutterChangeLine       " default: links to DiffChange
+GitGutterDeleteLine       " default: links to DiffDelete
+GitGutterChangeDeleteLine " default: links to GitGutterChangeLineDefault, i.e. DiffChange
+```
+
+
+#### The base of the diff
+
+By default buffers are diffed against the index.  However you can diff against any commit by setting:
+
+```viml
+let g:gitgutter_diff_base = '<commit SHA>'
+```
+
+
+#### Extra arguments for `git diff`
+
+If you want to pass extra arguments to `git diff`, for example to ignore whitespace, do so like this:
+
+```viml
+let g:gitgutter_diff_args = '-w'
+```
+
+#### Key mappings
+
+To disable all key mappings:
+
+```viml
+let g:gitgutter_map_keys = 0
+```
+
+See above for configuring maps for hunk-jumping and staging/undoing.
+
+
+#### Use a custom `grep` command
+
+If you use an alternative to grep, or your grep does not support the `color` flag, you can tell vim-gitgutter to use it here. It only needs to support extended POSIX regex.
+
+```viml
+" Default:
+let g:gitgutter_grep_command = 'grep --color=never -e'
+```
+
+#### To turn off vim-gitgutter by default
+
+Add `let g:gitgutter_enabled = 0` to your `~/.vimrc`.
+
+
+#### To turn off signs by default
+
+Add `let g:gitgutter_signs = 0` to your `~/.vimrc`.
+
+
+#### To turn on line highlighting by default
+
+Add `let g:gitgutter_highlight_lines = 1` to your `~/.vimrc`.
+
+
+#### To turn off asynchronous updates
+
+By default diffs are run asynchronously.  To run diffs synchronously instead:
+
+```viml
+let g:gitgutter_async = 0
+```
+
+
+### Extensions
+
+#### Operate on every line in a hunk
+
+You can map an operator to do whatever you want to every line in a hunk.
+
+Let's say, for example, you want to remove trailing whitespace.
+
+```viml
+function! CleanUp(...)
+  if a:0  " opfunc
+    let [first, last] = [line("'["), line("']")]
+  else
+    let [first, last] = [line("'<"), line("'>")]
+  endif
+  for lnum in range(first, last)
+    let line = getline(lnum)
+
+    " clean up the text, e.g.:
+    let line = substitute(line, '\s\+$', '', '')
+
+    call setline(lnum, line)
+  endfor
+endfunction
+
+nmap <silent> <Leader>x :set opfunc=CleanUp<CR>g@
+```
+
+Then place your cursor in a hunk and type `\xic` (assuming a leader of `\`).
+
+Alternatively you could place your cursor in a hunk, type `vic` to select it, then `:call CleanUp()`.
+
+
+#### Operate on every changed line in a file
+
+You can write a command to do whatever you want to every changed line in a file.
+
+```viml
+function! GlobalChangedLines(ex_cmd)
+  for hunk in GitGutterGetHunks()
+    for lnum in range(hunk[2], hunk[2]+hunk[3]-1)
+      let cursor = getcurpos()
+      silent! execute lnum.a:ex_cmd
+      call setpos('.', cursor)
+    endfor
+  endfor
+endfunction
+
+command -nargs=1 Glines call GlobalChangedLines(<q-args>)
+```
+
+Let's say, for example, you want to remove trailing whitespace from all changed lines:
+
+```viml
+:Glines s/\s\+$//
+```
+
+
+### FAQ
+
+> Why can't I unstage staged changes?
+
+Unstaging staged hunks is feasible but not quite as easy as it sounds.  There are three relevant versions of a file at any one time:
+
+1. The version at HEAD in the repo.
+2. The version staged in the index.
+3. The version in the working tree, in your vim buffer.
+
+`git-diff` without arguments shows you how 3 and 2 differ; this is what vim-gitgutter shows too.
+
+`git-diff --staged` shows you how 2 and 1 differ.
+
+Let's say you are looking at a file in vim which has some unstaged changes.  Now you stage a hunk, either via vim-gitgutter or another means.  The hunk is no longer marked in vim-gitgutter because it is the same in 3 and 2.
+
+Now you want to unstage that hunk.  To see it, you need the difference between 2 and 1.  For vim-gitgutter to show those differences, it would need to show you 2 instead of 3 in your vim buffer.  But 2 is virtual so vim-gitgutter would need to handle it without touching 3.
+
+I intend to implement this but I can't commit to any deadline.
+
+> Why are the colours in the sign column weird?
+
+Your colorscheme is configuring the `SignColumn` highlight group weirdly.  Please see the section above on customising the sign column.
+
+> There's a noticeable lag when vim-gitter runs; how can I avoid it?
+
+By default vim-gitgutter runs often so the signs are as accurate as possible.  The delay is governed by `updatetime`; see [above](#when-are-the-signs-updated) for more information.
+
+If you don't want realtime updates and would like to trade a little accuracy for speed, add this to your `~/.vimrc`:
+
+```viml
+let g:gitgutter_realtime = 0
+let g:gitgutter_eager = 0
+```
+
+> What happens if I also use another plugin which uses signs (e.g. Syntastic)?
+
+Vim only allows one sign per line.  Before adding a sign to a line, vim-gitgutter checks whether a sign has already been added by somebody else.  If so it doesn't do anything.  In other words vim-gitgutter won't overwrite another plugin's signs.  It also won't remove another plugin's signs.
+
+> Why aren't any signs showing at all?
+
+Here are some things you can check:
+
+* `:echo system("git --version")` succeeds.
+* Your git config is compatible with the version of git returned by the command above.
+* Your Vim supports signs (`:echo has('signs')` should give `1`).
+* Your file is being tracked by git and has unstaged changes.
+* If your grep does not support the `color` flag, add `let g:gitgutter_grep_command = 'grep -e'` to your `~/.vimrc`.
+
+
+### Shameless Plug
+
+If this plugin has helped you, or you'd like to learn more about Vim, why not check out this screencast I wrote for PeepCode:
+
+* [Smash Into Vim][siv]
+
+This was one of PeepCode's all-time top three bestsellers and is now available at Pluralsight.
+
+You can read reviews on my [website][airblade].
+
+
+### Intellectual Property
+
+Copyright Andrew Stewart, AirBlade Software Ltd.  Released under the MIT licence.
+
+
+  [pathogen]: https://github.com/tpope/vim-pathogen
+  [siv]: http://pluralsight.com/training/Courses/TableOfContents/smash-into-vim
+  [airblade]: http://airbladesoftware.com/peepcode-vim
+  [macvim]: http://code.google.com/p/macvim/
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim
new file mode 100644
index 00000000..e5431597
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim
@@ -0,0 +1,253 @@
+let s:nomodeline = (v:version > 703 || (v:version == 703 && has('patch442'))) ? '<nomodeline>' : ''
+
+" Primary functions {{{
+
+function! gitgutter#all() abort
+  for buffer_id in gitgutter#utility#dedup(tabpagebuflist())
+    let file = expand('#' . buffer_id . ':p')
+    if !empty(file)
+      call gitgutter#process_buffer(buffer_id, 0)
+    endif
+  endfor
+endfunction
+
+" bufnr: (integer) the buffer to process.
+" realtime: (boolean) when truthy, do a realtime diff; otherwise do a disk-based diff.
+function! gitgutter#process_buffer(bufnr, realtime) abort
+  call gitgutter#utility#use_known_shell()
+
+  call gitgutter#utility#set_buffer(a:bufnr)
+  if gitgutter#utility#is_active()
+    if g:gitgutter_sign_column_always
+      call gitgutter#sign#add_dummy_sign()
+    endif
+    try
+      if !a:realtime || gitgutter#utility#has_fresh_changes()
+        let diff = gitgutter#diff#run_diff(a:realtime || gitgutter#utility#has_unsaved_changes(), 0)
+        if diff != 'async'
+          call gitgutter#handle_diff(diff)
+        endif
+      endif
+    catch /diff failed/
+      call gitgutter#debug#log('diff failed')
+      call gitgutter#hunk#reset()
+    endtry
+    execute "silent doautocmd" s:nomodeline "User GitGutter"
+  else
+    call gitgutter#hunk#reset()
+  endif
+
+  call gitgutter#utility#restore_shell()
+endfunction
+
+
+function! gitgutter#handle_diff(diff) abort
+  call gitgutter#debug#log(a:diff)
+
+  call setbufvar(gitgutter#utility#bufnr(), 'gitgutter_tracked', 1)
+
+  call gitgutter#hunk#set_hunks(gitgutter#diff#parse_diff(a:diff))
+  let modified_lines = gitgutter#diff#process_hunks(gitgutter#hunk#hunks())
+
+  if len(modified_lines) > g:gitgutter_max_signs
+    call gitgutter#utility#warn_once('exceeded maximum number of signs (configured by g:gitgutter_max_signs).', 'max_signs')
+    call gitgutter#sign#clear_signs()
+    return
+  endif
+
+  if g:gitgutter_signs || g:gitgutter_highlight_lines
+    call gitgutter#sign#update_signs(modified_lines)
+  endif
+
+  call gitgutter#utility#save_last_seen_change()
+endfunction
+
+function! gitgutter#disable() abort
+  " get list of all buffers (across all tabs)
+  let buflist = []
+  for i in range(tabpagenr('$'))
+    call extend(buflist, tabpagebuflist(i + 1))
+  endfor
+
+  for buffer_id in gitgutter#utility#dedup(buflist)
+    let file = expand('#' . buffer_id . ':p')
+    if !empty(file)
+      call gitgutter#utility#set_buffer(buffer_id)
+      call gitgutter#sign#clear_signs()
+      call gitgutter#sign#remove_dummy_sign(1)
+      call gitgutter#hunk#reset()
+    endif
+  endfor
+
+  let g:gitgutter_enabled = 0
+endfunction
+
+function! gitgutter#enable() abort
+  let g:gitgutter_enabled = 1
+  call gitgutter#all()
+endfunction
+
+function! gitgutter#toggle() abort
+  if g:gitgutter_enabled
+    call gitgutter#disable()
+  else
+    call gitgutter#enable()
+  endif
+endfunction
+
+" }}}
+
+" Line highlights {{{
+
+function! gitgutter#line_highlights_disable() abort
+  let g:gitgutter_highlight_lines = 0
+  call gitgutter#highlight#define_sign_line_highlights()
+
+  if !g:gitgutter_signs
+    call gitgutter#sign#clear_signs()
+    call gitgutter#sign#remove_dummy_sign(0)
+  endif
+
+  redraw!
+endfunction
+
+function! gitgutter#line_highlights_enable() abort
+  let old_highlight_lines = g:gitgutter_highlight_lines
+
+  let g:gitgutter_highlight_lines = 1
+  call gitgutter#highlight#define_sign_line_highlights()
+
+  if !old_highlight_lines && !g:gitgutter_signs
+    call gitgutter#all()
+  endif
+
+  redraw!
+endfunction
+
+function! gitgutter#line_highlights_toggle() abort
+  if g:gitgutter_highlight_lines
+    call gitgutter#line_highlights_disable()
+  else
+    call gitgutter#line_highlights_enable()
+  endif
+endfunction
+
+" }}}
+
+" Signs {{{
+
+function! gitgutter#signs_enable() abort
+  let old_signs = g:gitgutter_signs
+
+  let g:gitgutter_signs = 1
+  call gitgutter#highlight#define_sign_text_highlights()
+
+  if !old_signs && !g:gitgutter_highlight_lines
+    call gitgutter#all()
+  endif
+endfunction
+
+function! gitgutter#signs_disable() abort
+  let g:gitgutter_signs = 0
+  call gitgutter#highlight#define_sign_text_highlights()
+
+  if !g:gitgutter_highlight_lines
+    call gitgutter#sign#clear_signs()
+    call gitgutter#sign#remove_dummy_sign(0)
+  endif
+endfunction
+
+function! gitgutter#signs_toggle() abort
+  if g:gitgutter_signs
+    call gitgutter#signs_disable()
+  else
+    call gitgutter#signs_enable()
+  endif
+endfunction
+
+" }}}
+
+" Hunks {{{
+
+function! gitgutter#stage_hunk() abort
+  call gitgutter#utility#use_known_shell()
+  if gitgutter#utility#is_active()
+    " Ensure the working copy of the file is up to date.
+    " It doesn't make sense to stage a hunk otherwise.
+    noautocmd silent write
+    let diff = gitgutter#diff#run_diff(0, 1)
+    call gitgutter#handle_diff(diff)
+
+    if empty(gitgutter#hunk#current_hunk())
+      call gitgutter#utility#warn('cursor is not in a hunk')
+    else
+      let diff_for_hunk = gitgutter#diff#generate_diff_for_hunk(diff, 'stage')
+      call gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' apply --cached --unidiff-zero - '), diff_for_hunk)
+
+      " refresh gitgutter's view of buffer
+      silent execute "GitGutter"
+    endif
+
+    silent! call repeat#set("\<Plug>GitGutterStageHunk", -1)<CR>
+  endif
+  call gitgutter#utility#restore_shell()
+endfunction
+
+function! gitgutter#undo_hunk() abort
+  call gitgutter#utility#use_known_shell()
+  if gitgutter#utility#is_active()
+    " Ensure the working copy of the file is up to date.
+    " It doesn't make sense to stage a hunk otherwise.
+    noautocmd silent write
+    let diff = gitgutter#diff#run_diff(0, 1)
+    call gitgutter#handle_diff(diff)
+
+    if empty(gitgutter#hunk#current_hunk())
+      call gitgutter#utility#warn('cursor is not in a hunk')
+    else
+      let diff_for_hunk = gitgutter#diff#generate_diff_for_hunk(diff, 'undo')
+      call gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' apply --reverse --unidiff-zero - '), diff_for_hunk)
+
+      " reload file preserving screen line position
+      let wl = winline()
+      silent edit
+      let offset = wl - winline()
+      execute "normal! ".offset."\<C-Y>"
+    endif
+
+    silent! call repeat#set("\<Plug>GitGutterUndoHunk", -1)<CR>
+  endif
+  call gitgutter#utility#restore_shell()
+endfunction
+
+function! gitgutter#preview_hunk() abort
+  call gitgutter#utility#use_known_shell()
+  if gitgutter#utility#is_active()
+    " Ensure the working copy of the file is up to date.
+    " It doesn't make sense to stage a hunk otherwise.
+    noautocmd silent write
+    let diff = gitgutter#diff#run_diff(0, 1)
+    call gitgutter#handle_diff(diff)
+
+    if empty(gitgutter#hunk#current_hunk())
+      call gitgutter#utility#warn('cursor is not in a hunk')
+    else
+      let diff_for_hunk = gitgutter#diff#generate_diff_for_hunk(diff, 'preview')
+
+      silent! wincmd P
+      if !&previewwindow
+        noautocmd execute 'bo' &previewheight 'new'
+        set previewwindow
+      endif
+
+      setlocal noro modifiable filetype=diff buftype=nofile bufhidden=delete noswapfile
+      execute "%delete_"
+      call append(0, split(diff_for_hunk, "\n"))
+
+      noautocmd wincmd p
+    endif
+  endif
+  call gitgutter#utility#restore_shell()
+endfunction
+
+" }}}
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim
new file mode 100644
index 00000000..0ce70b82
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/async.vim
@@ -0,0 +1,211 @@
+let s:jobs = {}
+
+" Nvim has always supported async commands.
+"
+" Vim introduced async in 7.4.1826.
+"
+" gVim didn't support aync until 7.4.1850 (though I haven't been able to
+" verify this myself).
+"
+" MacVim-GUI didn't support async until 7.4.1832 (actually commit
+" 88f4fe0 but 7.4.1832 was the first subsequent patch release).
+let s:available = has('nvim') || (
+      \ has('job') && (
+		  \ (has('patch-7-4-1826') && !has('gui_running')) ||
+		  \ (has('patch-7-4-1850') &&  has('gui_running')) ||
+		  \ (has('patch-7-4-1832') &&  has('gui_macvim'))
+		  \ )
+      \ )
+
+function! gitgutter#async#available()
+  return s:available
+endfunction
+
+function! gitgutter#async#execute(cmd) abort
+  let bufnr = gitgutter#utility#bufnr()
+
+  if has('nvim')
+    if has('unix')
+      let command = ["sh", "-c", a:cmd]
+    elseif has('win32')
+      let command = ["cmd.exe", "/c", a:cmd]
+    else
+      throw 'unknown os'
+    endif
+    " Make the job use a shell while avoiding (un)quoting problems.
+    let job_id = jobstart(command, {
+          \ 'buffer':    bufnr,
+          \ 'on_stdout': function('gitgutter#async#handle_diff_job_nvim'),
+          \ 'on_stderr': function('gitgutter#async#handle_diff_job_nvim'),
+          \ 'on_exit':   function('gitgutter#async#handle_diff_job_nvim')
+          \ })
+    call gitgutter#debug#log('[nvim job: '.job_id.', buffer: '.bufnr.'] '.a:cmd)
+    if job_id < 1
+      throw 'diff failed'
+    endif
+
+    " Note that when `cmd` doesn't produce any output, i.e. the diff is empty,
+    " the `stdout` event is not fired on the job handler.  Therefore we keep
+    " track of the jobs ourselves so we can spot empty diffs.
+    call s:job_started(job_id)
+
+  else
+    " Make the job use a shell.
+    "
+    " Pass a handler for stdout but not for stderr so that errors are
+    " ignored (and thus signs are not updated; this assumes that an error
+    " only occurs when a file is not tracked by git).
+
+    if has('unix')
+      let command = ["sh", "-c", a:cmd]
+    elseif has('win32')
+      " Help docs recommend {command} be a string on Windows.  But I think
+      " they also say that will run the command directly, which I believe would
+      " mean the redirection and pipe stuff wouldn't work.
+      " let command = "cmd.exe /c ".a:cmd
+      let command = ["cmd.exe", "/c", a:cmd]
+    else
+      throw 'unknown os'
+    endif
+
+    let job = job_start(command, {
+          \ 'out_cb':   'gitgutter#async#handle_diff_job_vim',
+          \ 'close_cb': 'gitgutter#async#handle_diff_job_vim_close'
+          \ })
+    call gitgutter#debug#log('[vim job: '.string(job_info(job)).', buffer: '.bufnr.'] '.a:cmd)
+
+    call s:job_started(s:channel_id(job_getchannel(job)), bufnr)
+  endif
+endfunction
+
+
+function! gitgutter#async#handle_diff_job_nvim(job_id, data, event) abort
+  call gitgutter#debug#log('job_id: '.a:job_id.', event: '.a:event.', buffer: '.self.buffer)
+
+  let job_bufnr = self.buffer
+  if bufexists(job_bufnr)
+    let current_buffer = gitgutter#utility#bufnr()
+    call gitgutter#utility#set_buffer(job_bufnr)
+
+    if a:event == 'stdout'
+      " a:data is a list
+      call s:job_finished(a:job_id)
+      if gitgutter#utility#is_active()
+        call gitgutter#handle_diff(gitgutter#utility#stringify(a:data))
+      endif
+
+    elseif a:event == 'exit'
+      " If the exit event is triggered without a preceding stdout event,
+      " the diff was empty.
+      if s:is_job_started(a:job_id)
+        if gitgutter#utility#is_active()
+          call gitgutter#handle_diff("")
+        endif
+        call s:job_finished(a:job_id)
+      endif
+
+    else  " a:event is stderr
+      call gitgutter#hunk#reset()
+      call s:job_finished(a:job_id)
+
+    endif
+
+    call gitgutter#utility#set_buffer(current_buffer)
+  else
+    call s:job_finished(a:job_id)
+  endif
+endfunction
+
+
+" Channel is in NL mode.
+function! gitgutter#async#handle_diff_job_vim(channel, line) abort
+  call gitgutter#debug#log('channel: '.a:channel.', line: '.a:line)
+
+  call s:accumulate_job_output(s:channel_id(a:channel), a:line)
+endfunction
+
+function! gitgutter#async#handle_diff_job_vim_close(channel) abort
+  call gitgutter#debug#log('channel: '.a:channel)
+
+  let channel_id = s:channel_id(a:channel)
+  let job_bufnr = s:job_buffer(channel_id)
+
+  if bufexists(job_bufnr)
+    let current_buffer = gitgutter#utility#bufnr()
+    call gitgutter#utility#set_buffer(job_bufnr)
+
+    if gitgutter#utility#is_active()
+      call gitgutter#handle_diff(s:job_output(channel_id))
+    endif
+
+    call gitgutter#utility#set_buffer(current_buffer)
+  endif
+  call s:job_finished(channel_id)
+endfunction
+
+
+function! s:channel_id(channel) abort
+  return ch_info(a:channel)['id']
+endfunction
+
+
+"
+" Keep track of jobs.
+"
+" nvim: receives all the job's output at once so we don't need to accumulate
+" it ourselves.  We can pass the buffer number into the job so we don't need
+" to track that either.
+"
+"   s:jobs {} -> key: job's id, value: anything truthy
+"
+" vim: receives the job's output line by line so we need to accumulate it.
+" We also need to keep track of the buffer the job is running for.
+" Vim job's don't have an id.  Instead we could use the external process's id
+" or the channel's id (there seems to be 1 channel per job).  Arbitrarily
+" choose the channel's id.
+"
+"   s:jobs {} -> key: channel's id, value: {} key: output, value: [] job's output
+"                                             key: buffer: value: buffer number
+
+
+" nvim:
+"        id: job's id
+"
+" vim:
+"        id: channel's id
+"        arg: buffer number
+function! s:job_started(id, ...) abort
+  if a:0  " vim
+    let s:jobs[a:id] = {'output': [], 'buffer': a:1}
+  else    " nvim
+    let s:jobs[a:id] = 1
+  endif
+endfunction
+
+function! s:is_job_started(id) abort
+  return has_key(s:jobs, a:id)
+endfunction
+
+function! s:accumulate_job_output(id, line) abort
+  call add(s:jobs[a:id].output, a:line)
+endfunction
+
+" Returns a string
+function! s:job_output(id) abort
+  if has_key(s:jobs, a:id)
+    return gitgutter#utility#stringify(s:jobs[a:id].output)
+  else
+    return ""
+  endif
+endfunction
+
+function! s:job_buffer(id) abort
+  return s:jobs[a:id].buffer
+endfunction
+
+function! s:job_finished(id) abort
+  if has_key(s:jobs, a:id)
+    unlet s:jobs[a:id]
+  endif
+endfunction
+
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim
new file mode 100644
index 00000000..594f044b
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/debug.vim
@@ -0,0 +1,119 @@
+let s:plugin_dir  = expand('<sfile>:p:h:h:h').'/'
+let s:log_file    = s:plugin_dir.'gitgutter.log'
+let s:channel_log = s:plugin_dir.'channel.log'
+let s:new_log_session = 1
+
+
+function! gitgutter#debug#debug()
+  " Open a scratch buffer
+  vsplit __GitGutter_Debug__
+  normal! ggdG
+  setlocal buftype=nofile
+  setlocal bufhidden=delete
+  setlocal noswapfile
+
+  call gitgutter#debug#vim_version()
+  call gitgutter#debug#separator()
+
+  call gitgutter#debug#git_version()
+  call gitgutter#debug#separator()
+
+  call gitgutter#debug#grep_version()
+  call gitgutter#debug#separator()
+
+  call gitgutter#debug#option('updatetime')
+  call gitgutter#debug#option('shell')
+  call gitgutter#debug#option('shellcmdflag')
+  call gitgutter#debug#option('shellpipe')
+  call gitgutter#debug#option('shellquote')
+  call gitgutter#debug#option('shellredir')
+  call gitgutter#debug#option('shellslash')
+  call gitgutter#debug#option('shelltemp')
+  call gitgutter#debug#option('shelltype')
+  call gitgutter#debug#option('shellxescape')
+  call gitgutter#debug#option('shellxquote')
+endfunction
+
+
+function! gitgutter#debug#separator()
+  call gitgutter#debug#output('')
+endfunction
+
+function! gitgutter#debug#vim_version()
+  redir => version_info
+    silent execute 'version'
+  redir END
+  call gitgutter#debug#output(split(version_info, '\n')[0:2])
+endfunction
+
+function! gitgutter#debug#git_version()
+  let v = system(g:gitgutter_git_executable.' --version')
+  call gitgutter#debug#output( substitute(v, '\n$', '', '') )
+endfunction
+
+function! gitgutter#debug#grep_version()
+  let v = system('grep --version')
+  call gitgutter#debug#output( substitute(v, '\n$', '', '') )
+
+  let v = system('grep --help')
+  call gitgutter#debug#output( substitute(v, '\%x00', '', 'g') )
+endfunction
+
+function! gitgutter#debug#option(name)
+  if exists('+' . a:name)
+    let v = eval('&' . a:name)
+    call gitgutter#debug#output(a:name . '=' . v)
+    " redir => output
+    "   silent execute "verbose set " . a:name . "?"
+    " redir END
+    " call gitgutter#debug#output(a:name . '=' . output)
+  else
+    call gitgutter#debug#output(a:name . ' [n/a]')
+  end
+endfunction
+
+function! gitgutter#debug#output(text)
+  call append(line('$'), a:text)
+endfunction
+
+" assumes optional args are calling function's optional args
+function! gitgutter#debug#log(message, ...) abort
+  if g:gitgutter_log
+    if s:new_log_session && gitgutter#async#available()
+      if exists('*ch_logfile')
+        call ch_logfile(s:channel_log, 'w')
+      endif
+    endif
+
+    execute 'redir >> '.s:log_file
+      if s:new_log_session
+        let s:start = reltime()
+        silent echo "\n==== start log session ===="
+      endif
+
+      let elapsed = reltimestr(reltime(s:start)).' '
+      silent echo ''
+      " callers excluding this function
+      silent echo elapsed.expand('<sfile>')[:-22].':'
+      silent echo elapsed.s:format_for_log(a:message)
+      if a:0 && !empty(a:1)
+        for msg in a:000
+          silent echo elapsed.s:format_for_log(msg)
+        endfor
+      endif
+    redir END
+
+    let s:new_log_session = 0
+  endif
+endfunction
+
+function! s:format_for_log(data) abort
+  if type(a:data) == 1
+    return join(split(a:data,'\n'),"\n")
+  elseif type(a:data) == 3
+    return '['.join(a:data,"\n").']'
+  else
+    return a:data
+  endif
+endfunction
+
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim
new file mode 100644
index 00000000..170193bf
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim
@@ -0,0 +1,342 @@
+if exists('g:gitgutter_grep_command')
+  let s:grep_available = 1
+  let s:grep_command = g:gitgutter_grep_command
+else
+  let s:grep_available = executable('grep')
+  if s:grep_available
+    let s:grep_command = 'grep --color=never -e'
+  endif
+endif
+let s:hunk_re = '^@@ -\(\d\+\),\?\(\d*\) +\(\d\+\),\?\(\d*\) @@'
+
+let s:c_flag = gitgutter#utility#git_supports_command_line_config_override()
+
+let s:temp_index = tempname()
+let s:temp_buffer = tempname()
+
+" Returns a diff of the buffer.
+"
+" The way to get the diff depends on whether the buffer is saved or unsaved.
+"
+" * Saved: the buffer contents is the same as the file on disk in the working
+"   tree so we simply do:
+"
+"       git diff myfile
+"
+" * Unsaved: the buffer contents is not the same as the file on disk so we
+"   need to pass two instances of the file to git-diff:
+"
+"       git diff myfileA myfileB
+"
+"   The first instance is the file in the index which we obtain with:
+"
+"       git show :myfile > myfileA
+"
+"   The second instance is the buffer contents.  Ideally we would pass this to
+"   git-diff on stdin via the second argument to vim's system() function.
+"   Unfortunately git-diff does not do CRLF conversion for input received on
+"   stdin, and git-show never performs CRLF conversion, so repos with CRLF
+"   conversion report that every line is modified due to mismatching EOLs.
+"
+"   Instead, we write the buffer contents to a temporary file - myfileB in this
+"   example.  Note the file extension must be preserved for the CRLF
+"   conversion to work.
+"
+" Before diffing a buffer for the first time, we check whether git knows about
+" the file:
+"
+"     git ls-files --error-unmatch myfile
+"
+" After running the diff we pass it through grep where available to reduce
+" subsequent processing by the plugin.  If grep is not available the plugin
+" does the filtering instead.
+function! gitgutter#diff#run_diff(realtime, preserve_full_diff) abort
+  " Wrap compound commands in parentheses to make Windows happy.
+  " bash doesn't mind the parentheses.
+  let cmd = '('
+
+  let bufnr = gitgutter#utility#bufnr()
+  let tracked = getbufvar(bufnr, 'gitgutter_tracked')  " i.e. tracked by git
+  if !tracked
+    " Don't bother trying to realtime-diff an untracked file.
+    " NOTE: perhaps we should pull this guard up to the caller?
+    if a:realtime
+      throw 'diff failed'
+    else
+      let cmd .= g:gitgutter_git_executable.' ls-files --error-unmatch '.gitgutter#utility#shellescape(gitgutter#utility#filename()).' && ('
+    endif
+  endif
+
+  if a:realtime
+    let blob_name = g:gitgutter_diff_base.':'.gitgutter#utility#shellescape(gitgutter#utility#file_relative_to_repo_root())
+    let blob_file = s:temp_index
+    let buff_file = s:temp_buffer
+    let extension = gitgutter#utility#extension()
+    if !empty(extension)
+      let blob_file .= '.'.extension
+      let buff_file .= '.'.extension
+    endif
+    let cmd .= g:gitgutter_git_executable.' show '.blob_name.' > '.blob_file.' && '
+
+    " Writing the whole buffer resets the '[ and '] marks and also the
+    " 'modified' flag (if &cpoptions includes '+').  These are unwanted
+    " side-effects so we save and restore the values ourselves.
+    let modified      = getbufvar(bufnr, "&mod")
+    let op_mark_start = getpos("'[")
+    let op_mark_end   = getpos("']")
+
+    execute 'keepalt noautocmd silent write!' buff_file
+
+    call setbufvar(bufnr, "&mod", modified)
+    call setpos("'[", op_mark_start)
+    call setpos("']", op_mark_end)
+  endif
+
+  let cmd .= g:gitgutter_git_executable
+  if s:c_flag
+    let cmd .= ' -c "diff.autorefreshindex=0"'
+  endif
+  let cmd .= ' diff --no-ext-diff --no-color -U0 '.g:gitgutter_diff_args.' '
+
+  if a:realtime
+    let cmd .= ' -- '.blob_file.' '.buff_file
+  else
+    let cmd .= g:gitgutter_diff_base.' -- '.gitgutter#utility#shellescape(gitgutter#utility#filename())
+  endif
+
+  if !a:preserve_full_diff && s:grep_available
+    let cmd .= ' | '.s:grep_command.' '.gitgutter#utility#shellescape('^@@ ')
+  endif
+
+  if (!a:preserve_full_diff && s:grep_available) || a:realtime
+    " grep exits with 1 when no matches are found; diff exits with 1 when
+    " differences are found.  However we want to treat non-matches and
+    " differences as non-erroneous behaviour; so we OR the command with one
+    " which always exits with success (0).
+    let cmd .= ' || exit 0'
+  endif
+
+  let cmd .= ')'
+
+  if !tracked
+    let cmd .= ')'
+  endif
+
+  let cmd = gitgutter#utility#command_in_directory_of_file(cmd)
+
+  if g:gitgutter_async && gitgutter#async#available() && !a:preserve_full_diff
+    call gitgutter#async#execute(cmd)
+    return 'async'
+
+  else
+    let diff = gitgutter#utility#system(cmd)
+
+    if gitgutter#utility#shell_error()
+      " A shell error indicates the file is not tracked by git (unless something bizarre is going on).
+      throw 'diff failed'
+    endif
+
+    return diff
+  endif
+endfunction
+
+function! gitgutter#diff#parse_diff(diff) abort
+  let hunks = []
+  for line in split(a:diff, '\n')
+    let hunk_info = gitgutter#diff#parse_hunk(line)
+    if len(hunk_info) == 4
+      call add(hunks, hunk_info)
+    endif
+  endfor
+  return hunks
+endfunction
+
+function! gitgutter#diff#parse_hunk(line) abort
+  let matches = matchlist(a:line, s:hunk_re)
+  if len(matches) > 0
+    let from_line  = str2nr(matches[1])
+    let from_count = (matches[2] == '') ? 1 : str2nr(matches[2])
+    let to_line    = str2nr(matches[3])
+    let to_count   = (matches[4] == '') ? 1 : str2nr(matches[4])
+    return [from_line, from_count, to_line, to_count]
+  else
+    return []
+  end
+endfunction
+
+function! gitgutter#diff#process_hunks(hunks) abort
+  call gitgutter#hunk#reset()
+  let modified_lines = []
+  for hunk in a:hunks
+    call extend(modified_lines, gitgutter#diff#process_hunk(hunk))
+  endfor
+  return modified_lines
+endfunction
+
+" Returns [ [<line_number (number)>, <name (string)>], ...]
+function! gitgutter#diff#process_hunk(hunk) abort
+  let modifications = []
+  let from_line  = a:hunk[0]
+  let from_count = a:hunk[1]
+  let to_line    = a:hunk[2]
+  let to_count   = a:hunk[3]
+
+  if gitgutter#diff#is_added(from_count, to_count)
+    call gitgutter#diff#process_added(modifications, from_count, to_count, to_line)
+    call gitgutter#hunk#increment_lines_added(to_count)
+
+  elseif gitgutter#diff#is_removed(from_count, to_count)
+    call gitgutter#diff#process_removed(modifications, from_count, to_count, to_line)
+    call gitgutter#hunk#increment_lines_removed(from_count)
+
+  elseif gitgutter#diff#is_modified(from_count, to_count)
+    call gitgutter#diff#process_modified(modifications, from_count, to_count, to_line)
+    call gitgutter#hunk#increment_lines_modified(to_count)
+
+  elseif gitgutter#diff#is_modified_and_added(from_count, to_count)
+    call gitgutter#diff#process_modified_and_added(modifications, from_count, to_count, to_line)
+    call gitgutter#hunk#increment_lines_added(to_count - from_count)
+    call gitgutter#hunk#increment_lines_modified(from_count)
+
+  elseif gitgutter#diff#is_modified_and_removed(from_count, to_count)
+    call gitgutter#diff#process_modified_and_removed(modifications, from_count, to_count, to_line)
+    call gitgutter#hunk#increment_lines_modified(to_count)
+    call gitgutter#hunk#increment_lines_removed(from_count - to_count)
+
+  endif
+  return modifications
+endfunction
+
+function! gitgutter#diff#is_added(from_count, to_count) abort
+  return a:from_count == 0 && a:to_count > 0
+endfunction
+
+function! gitgutter#diff#is_removed(from_count, to_count) abort
+  return a:from_count > 0 && a:to_count == 0
+endfunction
+
+function! gitgutter#diff#is_modified(from_count, to_count) abort
+  return a:from_count > 0 && a:to_count > 0 && a:from_count == a:to_count
+endfunction
+
+function! gitgutter#diff#is_modified_and_added(from_count, to_count) abort
+  return a:from_count > 0 && a:to_count > 0 && a:from_count < a:to_count
+endfunction
+
+function! gitgutter#diff#is_modified_and_removed(from_count, to_count) abort
+  return a:from_count > 0 && a:to_count > 0 && a:from_count > a:to_count
+endfunction
+
+function! gitgutter#diff#process_added(modifications, from_count, to_count, to_line) abort
+  let offset = 0
+  while offset < a:to_count
+    let line_number = a:to_line + offset
+    call add(a:modifications, [line_number, 'added'])
+    let offset += 1
+  endwhile
+endfunction
+
+function! gitgutter#diff#process_removed(modifications, from_count, to_count, to_line) abort
+  if a:to_line == 0
+    call add(a:modifications, [1, 'removed_first_line'])
+  else
+    call add(a:modifications, [a:to_line, 'removed'])
+  endif
+endfunction
+
+function! gitgutter#diff#process_modified(modifications, from_count, to_count, to_line) abort
+  let offset = 0
+  while offset < a:to_count
+    let line_number = a:to_line + offset
+    call add(a:modifications, [line_number, 'modified'])
+    let offset += 1
+  endwhile
+endfunction
+
+function! gitgutter#diff#process_modified_and_added(modifications, from_count, to_count, to_line) abort
+  let offset = 0
+  while offset < a:from_count
+    let line_number = a:to_line + offset
+    call add(a:modifications, [line_number, 'modified'])
+    let offset += 1
+  endwhile
+  while offset < a:to_count
+    let line_number = a:to_line + offset
+    call add(a:modifications, [line_number, 'added'])
+    let offset += 1
+  endwhile
+endfunction
+
+function! gitgutter#diff#process_modified_and_removed(modifications, from_count, to_count, to_line) abort
+  let offset = 0
+  while offset < a:to_count
+    let line_number = a:to_line + offset
+    call add(a:modifications, [line_number, 'modified'])
+    let offset += 1
+  endwhile
+  let a:modifications[-1] = [a:to_line + offset - 1, 'modified_removed']
+endfunction
+
+" Generates a zero-context diff for the current hunk.
+"
+" diff - the full diff for the buffer
+" type - stage | undo | preview
+function! gitgutter#diff#generate_diff_for_hunk(diff, type) abort
+  let diff_for_hunk = gitgutter#diff#discard_hunks(a:diff, a:type == 'stage' || a:type == 'undo')
+
+  if a:type == 'stage' || a:type == 'undo'
+    let diff_for_hunk = gitgutter#diff#adjust_hunk_summary(diff_for_hunk, a:type == 'stage')
+  endif
+
+  return diff_for_hunk
+endfunction
+
+" Returns the diff with all hunks discarded except the current.
+"
+" diff        - the diff to process
+" keep_header - truthy to keep the diff header and hunk summary, falsy to discard it
+function! gitgutter#diff#discard_hunks(diff, keep_header) abort
+  let modified_diff = []
+  let keep_line = a:keep_header
+  for line in split(a:diff, '\n')
+    let hunk_info = gitgutter#diff#parse_hunk(line)
+    if len(hunk_info) == 4  " start of new hunk
+      let keep_line = gitgutter#hunk#cursor_in_hunk(hunk_info)
+    endif
+    if keep_line
+      call add(modified_diff, line)
+    endif
+  endfor
+
+  if a:keep_header
+    return gitgutter#utility#stringify(modified_diff)
+  else
+    " Discard hunk summary too.
+    return gitgutter#utility#stringify(modified_diff[1:])
+  endif
+endfunction
+
+" Adjust hunk summary (from's / to's line number) to ignore changes above/before this one.
+"
+" diff_for_hunk - a diff containing only the hunk of interest
+" staging       - truthy if the hunk is to be staged, falsy if it is to be undone
+"
+" TODO: push this down to #discard_hunks?
+function! gitgutter#diff#adjust_hunk_summary(diff_for_hunk, staging) abort
+  let line_adjustment = gitgutter#hunk#line_adjustment_for_current_hunk()
+  let adj_diff = []
+  for line in split(a:diff_for_hunk, '\n')
+    if match(line, s:hunk_re) != -1
+      if a:staging
+        " increment 'to' line number
+        let line = substitute(line, '+\@<=\(\d\+\)', '\=submatch(1)+line_adjustment', '')
+      else
+        " decrement 'from' line number
+        let line = substitute(line, '-\@<=\(\d\+\)', '\=submatch(1)-line_adjustment', '')
+      endif
+    endif
+    call add(adj_diff, line)
+  endfor
+  return gitgutter#utility#stringify(adj_diff)
+endfunction
+
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim
new file mode 100644
index 00000000..e3b774bc
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/highlight.vim
@@ -0,0 +1,115 @@
+function! gitgutter#highlight#define_sign_column_highlight() abort
+  if g:gitgutter_override_sign_column_highlight
+    highlight! link SignColumn LineNr
+  else
+    highlight default link SignColumn LineNr
+  endif
+endfunction
+
+function! gitgutter#highlight#define_highlights() abort
+  let [guibg, ctermbg] = gitgutter#highlight#get_background_colors('SignColumn')
+
+  " Highlights used by the signs.
+
+  execute "highlight GitGutterAddDefault    guifg=#009900 guibg=" . guibg . " ctermfg=2 ctermbg=" . ctermbg
+  execute "highlight GitGutterChangeDefault guifg=#bbbb00 guibg=" . guibg . " ctermfg=3 ctermbg=" . ctermbg
+  execute "highlight GitGutterDeleteDefault guifg=#ff2222 guibg=" . guibg . " ctermfg=1 ctermbg=" . ctermbg
+  highlight default link GitGutterChangeDeleteDefault GitGutterChangeDefault
+
+  execute "highlight GitGutterAddInvisible    guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
+  execute "highlight GitGutterChangeInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
+  execute "highlight GitGutterDeleteInvisible guifg=bg guibg=" . guibg . " ctermfg=" . ctermbg . " ctermbg=" . ctermbg
+  highlight default link GitGutterChangeDeleteInvisible GitGutterChangeInvisble
+
+  highlight default link GitGutterAdd          GitGutterAddDefault
+  highlight default link GitGutterChange       GitGutterChangeDefault
+  highlight default link GitGutterDelete       GitGutterDeleteDefault
+  highlight default link GitGutterChangeDelete GitGutterChangeDeleteDefault
+
+  " Highlights used for the whole line.
+
+  highlight default link GitGutterAddLine          DiffAdd
+  highlight default link GitGutterChangeLine       DiffChange
+  highlight default link GitGutterDeleteLine       DiffDelete
+  highlight default link GitGutterChangeDeleteLine GitGutterChangeLine
+endfunction
+
+function! gitgutter#highlight#define_signs() abort
+  sign define GitGutterLineAdded
+  sign define GitGutterLineModified
+  sign define GitGutterLineRemoved
+  sign define GitGutterLineRemovedFirstLine
+  sign define GitGutterLineModifiedRemoved
+  sign define GitGutterDummy
+
+  call gitgutter#highlight#define_sign_text()
+  call gitgutter#highlight#define_sign_text_highlights()
+  call gitgutter#highlight#define_sign_line_highlights()
+endfunction
+
+function! gitgutter#highlight#define_sign_text() abort
+  execute "sign define GitGutterLineAdded            text=" . g:gitgutter_sign_added
+  execute "sign define GitGutterLineModified         text=" . g:gitgutter_sign_modified
+  execute "sign define GitGutterLineRemoved          text=" . g:gitgutter_sign_removed
+  execute "sign define GitGutterLineRemovedFirstLine text=" . g:gitgutter_sign_removed_first_line
+  execute "sign define GitGutterLineModifiedRemoved  text=" . g:gitgutter_sign_modified_removed
+endfunction
+
+function! gitgutter#highlight#define_sign_text_highlights() abort
+  " Once a sign's text attribute has been defined, it cannot be undefined or
+  " set to an empty value.  So to make signs' text disappear (when toggling
+  " off or disabling) we make them invisible by setting their foreground colours
+  " to the background's.
+  if g:gitgutter_signs
+    sign define GitGutterLineAdded            texthl=GitGutterAdd
+    sign define GitGutterLineModified         texthl=GitGutterChange
+    sign define GitGutterLineRemoved          texthl=GitGutterDelete
+    sign define GitGutterLineRemovedFirstLine texthl=GitGutterDelete
+    sign define GitGutterLineModifiedRemoved  texthl=GitGutterChangeDelete
+  else
+    sign define GitGutterLineAdded            texthl=GitGutterAddInvisible
+    sign define GitGutterLineModified         texthl=GitGutterChangeInvisible
+    sign define GitGutterLineRemoved          texthl=GitGutterDeleteInvisible
+    sign define GitGutterLineRemovedFirstLine texthl=GitGutterDeleteInvisible
+    sign define GitGutterLineModifiedRemoved  texthl=GitGutterChangeDeleteInvisible
+  endif
+endfunction
+
+function! gitgutter#highlight#define_sign_line_highlights() abort
+  if g:gitgutter_highlight_lines
+    sign define GitGutterLineAdded            linehl=GitGutterAddLine
+    sign define GitGutterLineModified         linehl=GitGutterChangeLine
+    sign define GitGutterLineRemoved          linehl=GitGutterDeleteLine
+    sign define GitGutterLineRemovedFirstLine linehl=GitGutterDeleteLine
+    sign define GitGutterLineModifiedRemoved  linehl=GitGutterChangeDeleteLine
+  else
+    sign define GitGutterLineAdded            linehl=
+    sign define GitGutterLineModified         linehl=
+    sign define GitGutterLineRemoved          linehl=
+    sign define GitGutterLineRemovedFirstLine linehl=
+    sign define GitGutterLineModifiedRemoved  linehl=
+  endif
+endfunction
+
+function! gitgutter#highlight#get_background_colors(group) abort
+  redir => highlight
+  silent execute 'silent highlight ' . a:group
+  redir END
+
+  let link_matches = matchlist(highlight, 'links to \(\S\+\)')
+  if len(link_matches) > 0 " follow the link
+    return gitgutter#highlight#get_background_colors(link_matches[1])
+  endif
+
+  let ctermbg = gitgutter#highlight#match_highlight(highlight, 'ctermbg=\([0-9A-Za-z]\+\)')
+  let guibg   = gitgutter#highlight#match_highlight(highlight, 'guibg=\([#0-9A-Za-z]\+\)')
+  return [guibg, ctermbg]
+endfunction
+
+function! gitgutter#highlight#match_highlight(highlight, pattern) abort
+  let matches = matchlist(a:highlight, a:pattern)
+  if len(matches) == 0
+    return 'NONE'
+  endif
+  return matches[1]
+endfunction
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim
new file mode 100644
index 00000000..0fd02468
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim
@@ -0,0 +1,137 @@
+let s:hunks = []
+
+function! gitgutter#hunk#set_hunks(hunks) abort
+  let s:hunks = a:hunks
+endfunction
+
+function! gitgutter#hunk#hunks() abort
+  return s:hunks
+endfunction
+
+function! gitgutter#hunk#summary(bufnr) abort
+  return get(getbufvar(a:bufnr,''), 'gitgutter_summary', [0,0,0])
+endfunction
+
+function! gitgutter#hunk#reset() abort
+  call setbufvar(gitgutter#utility#bufnr(), 'gitgutter_summary', [0,0,0])
+endfunction
+
+function! gitgutter#hunk#increment_lines_added(count) abort
+  let bufnr = gitgutter#utility#bufnr()
+  let summary = gitgutter#hunk#summary(bufnr)
+  let summary[0] += a:count
+  call setbufvar(bufnr, 'gitgutter_summary', summary)
+endfunction
+
+function! gitgutter#hunk#increment_lines_modified(count) abort
+  let bufnr = gitgutter#utility#bufnr()
+  let summary = gitgutter#hunk#summary(bufnr)
+  let summary[1] += a:count
+  call setbufvar(bufnr, 'gitgutter_summary', summary)
+endfunction
+
+function! gitgutter#hunk#increment_lines_removed(count) abort
+  let bufnr = gitgutter#utility#bufnr()
+  let summary = gitgutter#hunk#summary(bufnr)
+  let summary[2] += a:count
+  call setbufvar(bufnr, 'gitgutter_summary', summary)
+endfunction
+
+function! gitgutter#hunk#next_hunk(count) abort
+  if gitgutter#utility#is_active()
+    let current_line = line('.')
+    let hunk_count = 0
+    for hunk in s:hunks
+      if hunk[2] > current_line
+        let hunk_count += 1
+        if hunk_count == a:count
+          execute 'normal!' hunk[2] . 'G'
+          return
+        endif
+      endif
+    endfor
+    call gitgutter#utility#warn('No more hunks')
+  endif
+endfunction
+
+function! gitgutter#hunk#prev_hunk(count) abort
+  if gitgutter#utility#is_active()
+    let current_line = line('.')
+    let hunk_count = 0
+    for hunk in reverse(copy(s:hunks))
+      if hunk[2] < current_line
+        let hunk_count += 1
+        if hunk_count == a:count
+          let target = hunk[2] == 0 ? 1 : hunk[2]
+          execute 'normal!' target . 'G'
+          return
+        endif
+      endif
+    endfor
+    call gitgutter#utility#warn('No previous hunks')
+  endif
+endfunction
+
+" Returns the hunk the cursor is currently in or an empty list if the cursor
+" isn't in a hunk.
+function! gitgutter#hunk#current_hunk() abort
+  let current_hunk = []
+
+  for hunk in s:hunks
+    if gitgutter#hunk#cursor_in_hunk(hunk)
+      let current_hunk = hunk
+      break
+    endif
+  endfor
+
+  return current_hunk
+endfunction
+
+function! gitgutter#hunk#cursor_in_hunk(hunk) abort
+  let current_line = line('.')
+
+  if current_line == 1 && a:hunk[2] == 0
+    return 1
+  endif
+
+  if current_line >= a:hunk[2] && current_line < a:hunk[2] + (a:hunk[3] == 0 ? 1 : a:hunk[3])
+    return 1
+  endif
+
+  return 0
+endfunction
+
+" Returns the number of lines the current hunk is offset from where it would
+" be if any changes above it in the file didn't exist.
+function! gitgutter#hunk#line_adjustment_for_current_hunk() abort
+  let adj = 0
+  for hunk in s:hunks
+    if gitgutter#hunk#cursor_in_hunk(hunk)
+      break
+    else
+      let adj += hunk[1] - hunk[3]
+    endif
+  endfor
+  return adj
+endfunction
+
+function! gitgutter#hunk#text_object(inner) abort
+  let hunk = gitgutter#hunk#current_hunk()
+
+  if empty(hunk)
+    return
+  endif
+
+  let [first_line, last_line] = [hunk[2], hunk[2] + hunk[3] - 1]
+
+  if ! a:inner
+    let lnum = last_line
+    let eof = line('$')
+    while lnum < eof && empty(getline(lnum + 1))
+      let lnum +=1
+    endwhile
+    let last_line = lnum
+  endif
+
+  execute 'normal! 'first_line.'GV'.last_line.'G'
+endfunction
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim
new file mode 100644
index 00000000..7e1218d4
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/sign.vim
@@ -0,0 +1,179 @@
+" Vim doesn't namespace sign ids so every plugin shares the same
+" namespace.  Sign ids are simply integers so to avoid clashes with other
+" signs we guess at a clear run.
+"
+" Note also we currently never reset s:next_sign_id.
+let s:first_sign_id = 3000
+let s:next_sign_id  = s:first_sign_id
+let s:dummy_sign_id = s:first_sign_id - 1
+" Remove-all-signs optimisation requires Vim 7.3.596+.
+let s:supports_star = v:version > 703 || (v:version == 703 && has("patch596"))
+
+
+" Removes gitgutter's signs (excluding dummy sign) from the buffer being processed.
+function! gitgutter#sign#clear_signs() abort
+  let bufnr = gitgutter#utility#bufnr()
+  call gitgutter#sign#find_current_signs()
+
+  let sign_ids = map(values(getbufvar(bufnr, 'gitgutter_gitgutter_signs')), 'v:val.id')
+  call gitgutter#sign#remove_signs(sign_ids, 1)
+  call setbufvar(bufnr, 'gitgutter_gitgutter_signs', {})
+endfunction
+
+
+" Updates gitgutter's signs in the buffer being processed.
+"
+" modified_lines: list of [<line_number (number)>, <name (string)>]
+" where name = 'added|removed|modified|modified_removed'
+function! gitgutter#sign#update_signs(modified_lines) abort
+  call gitgutter#sign#find_current_signs()
+
+  let new_gitgutter_signs_line_numbers = map(copy(a:modified_lines), 'v:val[0]')
+  let obsolete_signs = gitgutter#sign#obsolete_gitgutter_signs_to_remove(new_gitgutter_signs_line_numbers)
+
+  let flicker_possible = s:remove_all_old_signs && !empty(a:modified_lines)
+  if flicker_possible
+    call gitgutter#sign#add_dummy_sign()
+  endif
+
+  call gitgutter#sign#remove_signs(obsolete_signs, s:remove_all_old_signs)
+  call gitgutter#sign#upsert_new_gitgutter_signs(a:modified_lines)
+
+  if flicker_possible
+    call gitgutter#sign#remove_dummy_sign(0)
+  endif
+endfunction
+
+
+function! gitgutter#sign#add_dummy_sign() abort
+  let bufnr = gitgutter#utility#bufnr()
+  if !getbufvar(bufnr, 'gitgutter_dummy_sign')
+    execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy buffer=" . bufnr
+    call setbufvar(bufnr, 'gitgutter_dummy_sign', 1)
+  endif
+endfunction
+
+function! gitgutter#sign#remove_dummy_sign(force) abort
+  let bufnr = gitgutter#utility#bufnr()
+  if getbufvar(bufnr, 'gitgutter_dummy_sign') && (a:force || !g:gitgutter_sign_column_always)
+    execute "sign unplace" s:dummy_sign_id "buffer=" . bufnr
+    call setbufvar(bufnr, 'gitgutter_dummy_sign', 0)
+  endif
+endfunction
+
+
+"
+" Internal functions
+"
+
+
+function! gitgutter#sign#find_current_signs() abort
+  let bufnr = gitgutter#utility#bufnr()
+  let gitgutter_signs = {}  " <line_number (string)>: {'id': <id (number)>, 'name': <name (string)>}
+  let other_signs = []      " [<line_number (number),...]
+  let dummy_sign_placed = 0
+
+  redir => signs
+    silent execute "sign place buffer=" . bufnr
+  redir END
+
+  for sign_line in filter(split(signs, '\n')[2:], 'v:val =~# "="')
+    " Typical sign line:  line=88 id=1234 name=GitGutterLineAdded
+    " We assume splitting is faster than a regexp.
+    let components  = split(sign_line)
+    let name        = split(components[2], '=')[1]
+    if name =~# 'GitGutterDummy'
+      let dummy_sign_placed = 1
+    else
+      let line_number = str2nr(split(components[0], '=')[1])
+      if name =~# 'GitGutter'
+        let id = str2nr(split(components[1], '=')[1])
+        " Remove orphaned signs (signs placed on lines which have been deleted).
+        " (When a line is deleted its sign lingers.  Subsequent lines' signs'
+        " line numbers are decremented appropriately.)
+        if has_key(gitgutter_signs, line_number)
+          execute "sign unplace" gitgutter_signs[line_number].id
+        endif
+        let gitgutter_signs[line_number] = {'id': id, 'name': name}
+      else
+        call add(other_signs, line_number)
+      endif
+    end
+  endfor
+
+  call setbufvar(bufnr, 'gitgutter_dummy_sign', dummy_sign_placed)
+  call setbufvar(bufnr, 'gitgutter_gitgutter_signs', gitgutter_signs)
+  call setbufvar(bufnr, 'gitgutter_other_signs', other_signs)
+endfunction
+
+
+" Returns a list of [<id (number)>, ...]
+" Sets `s:remove_all_old_signs` as a side-effect.
+function! gitgutter#sign#obsolete_gitgutter_signs_to_remove(new_gitgutter_signs_line_numbers) abort
+  let bufnr = gitgutter#utility#bufnr()
+  let signs_to_remove = []  " list of [<id (number)>, ...]
+  let remove_all_signs = 1
+  let old_gitgutter_signs = getbufvar(bufnr, 'gitgutter_gitgutter_signs')
+  for line_number in keys(old_gitgutter_signs)
+    if index(a:new_gitgutter_signs_line_numbers, str2nr(line_number)) == -1
+      call add(signs_to_remove, old_gitgutter_signs[line_number].id)
+    else
+      let remove_all_signs = 0
+    endif
+  endfor
+  let s:remove_all_old_signs = remove_all_signs
+  return signs_to_remove
+endfunction
+
+
+function! gitgutter#sign#remove_signs(sign_ids, all_signs) abort
+  let bufnr = gitgutter#utility#bufnr()
+  if a:all_signs && s:supports_star && empty(getbufvar(bufnr, 'gitgutter_other_signs'))
+    let dummy_sign_present = getbufvar(bufnr, 'gitgutter_dummy_sign')
+    execute "sign unplace * buffer=" . bufnr
+    if dummy_sign_present
+      execute "sign place" s:dummy_sign_id "line=" . 9999 "name=GitGutterDummy buffer=" . bufnr
+    endif
+  else
+    for id in a:sign_ids
+      execute "sign unplace" id
+    endfor
+  endif
+endfunction
+
+
+function! gitgutter#sign#upsert_new_gitgutter_signs(modified_lines) abort
+  let bufnr = gitgutter#utility#bufnr()
+  let other_signs         = getbufvar(bufnr, 'gitgutter_other_signs')
+  let old_gitgutter_signs = getbufvar(bufnr, 'gitgutter_gitgutter_signs')
+
+  for line in a:modified_lines
+    let line_number = line[0]  " <number>
+    if index(other_signs, line_number) == -1  " don't clobber others' signs
+      let name = gitgutter#utility#highlight_name_for_change(line[1])
+      if !has_key(old_gitgutter_signs, line_number)  " insert
+        let id = gitgutter#sign#next_sign_id()
+        execute "sign place" id "line=" . line_number "name=" . name "buffer=" . bufnr
+      else  " update if sign has changed
+        let old_sign = old_gitgutter_signs[line_number]
+        if old_sign.name !=# name
+          execute "sign place" old_sign.id "name=" . name "buffer=" . bufnr
+        end
+      endif
+    endif
+  endfor
+  " At this point b:gitgutter_gitgutter_signs is out of date.
+endfunction
+
+
+function! gitgutter#sign#next_sign_id() abort
+  let next_id = s:next_sign_id
+  let s:next_sign_id += 1
+  return next_id
+endfunction
+
+
+" Only for testing.
+function! gitgutter#sign#reset()
+  let s:next_sign_id  = s:first_sign_id
+endfunction
diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim
new file mode 100644
index 00000000..77ad2dc2
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim
@@ -0,0 +1,212 @@
+let s:file = ''
+let s:using_xolox_shell = -1
+let s:exit_code = 0
+
+function! gitgutter#utility#warn(message) abort
+  echohl WarningMsg
+  echo 'vim-gitgutter: ' . a:message
+  echohl None
+  let v:warningmsg = a:message
+endfunction
+
+function! gitgutter#utility#warn_once(message, key) abort
+  if empty(getbufvar(s:bufnr, a:key))
+    call setbufvar(s:bufnr, a:key, '1')
+    echohl WarningMsg
+    redraw | echo 'vim-gitgutter: ' . a:message
+    echohl None
+    let v:warningmsg = a:message
+  endif
+endfunction
+
+" Returns truthy when the buffer's file should be processed; and falsey when it shouldn't.
+" This function does not and should not make any system calls.
+function! gitgutter#utility#is_active() abort
+  return g:gitgutter_enabled &&
+        \ !pumvisible() &&
+        \ gitgutter#utility#is_file_buffer() &&
+        \ gitgutter#utility#exists_file() &&
+        \ gitgutter#utility#not_git_dir()
+endfunction
+
+function! gitgutter#utility#not_git_dir() abort
+  return gitgutter#utility#full_path_to_directory_of_file() !~ '[/\\]\.git\($\|[/\\]\)'
+endfunction
+
+function! gitgutter#utility#is_file_buffer() abort
+  return empty(getbufvar(s:bufnr, '&buftype'))
+endfunction
+
+" A replacement for the built-in `shellescape(arg)`.
+"
+" Recent versions of Vim handle shell escaping pretty well.  However older
+" versions aren't as good.  This attempts to do the right thing.
+"
+" See:
+" https://github.com/tpope/vim-fugitive/blob/8f0b8edfbd246c0026b7a2388e1d883d579ac7f6/plugin/fugitive.vim#L29-L37
+function! gitgutter#utility#shellescape(arg) abort
+  if a:arg =~ '^[A-Za-z0-9_/.-]\+$'
+    return a:arg
+  elseif &shell =~# 'cmd' || gitgutter#utility#using_xolox_shell()
+    return '"' . substitute(substitute(a:arg, '"', '""', 'g'), '%', '"%"', 'g') . '"'
+  else
+    return shellescape(a:arg)
+  endif
+endfunction
+
+function! gitgutter#utility#set_buffer(bufnr) abort
+  let s:bufnr = a:bufnr
+  let s:file = resolve(bufname(a:bufnr))
+endfunction
+
+function! gitgutter#utility#bufnr()
+  return s:bufnr
+endfunction
+
+function! gitgutter#utility#file()
+  return s:file
+endfunction
+
+function! gitgutter#utility#filename() abort
+  return fnamemodify(s:file, ':t')
+endfunction
+
+function! gitgutter#utility#extension() abort
+  return fnamemodify(s:file, ':e')
+endfunction
+
+function! gitgutter#utility#full_path_to_directory_of_file() abort
+  return fnamemodify(s:file, ':p:h')
+endfunction
+
+function! gitgutter#utility#directory_of_file() abort
+  return fnamemodify(s:file, ':h')
+endfunction
+
+function! gitgutter#utility#exists_file() abort
+  return filereadable(s:file)
+endfunction
+
+function! gitgutter#utility#has_unsaved_changes() abort
+  return getbufvar(s:bufnr, "&mod")
+endfunction
+
+function! gitgutter#utility#has_fresh_changes() abort
+  return getbufvar(s:bufnr, 'changedtick') != getbufvar(s:bufnr, 'gitgutter_last_tick')
+endfunction
+
+function! gitgutter#utility#save_last_seen_change() abort
+  call setbufvar(s:bufnr, 'gitgutter_last_tick', getbufvar(s:bufnr, 'changedtick'))
+endfunction
+
+function! gitgutter#utility#shell_error() abort
+  return gitgutter#utility#using_xolox_shell() ? s:exit_code : v:shell_error
+endfunction
+
+function! gitgutter#utility#using_xolox_shell() abort
+  if s:using_xolox_shell == -1
+    if !g:gitgutter_avoid_cmd_prompt_on_windows
+      let s:using_xolox_shell = 0
+    " Although xolox/vim-shell works on both windows and unix we only want to use
+    " it on windows.
+    elseif has('win32') || has('win64') || has('win32unix')
+      let s:using_xolox_shell = exists('g:xolox#misc#version') && exists('g:xolox#shell#version')
+    else
+      let s:using_xolox_shell = 0
+    endif
+  endif
+  return s:using_xolox_shell
+endfunction
+
+function! gitgutter#utility#system(cmd, ...) abort
+  call gitgutter#debug#log(a:cmd, a:000)
+
+  if gitgutter#utility#using_xolox_shell()
+    let options = {'command': a:cmd, 'check': 0}
+    if a:0 > 0
+      let options['stdin'] = a:1
+    endif
+    let ret = xolox#misc#os#exec(options)
+    let output = join(ret.stdout, "\n")
+    let s:exit_code = ret.exit_code
+  else
+    silent let output = (a:0 == 0) ? system(a:cmd) : system(a:cmd, a:1)
+  endif
+  return output
+endfunction
+
+function! gitgutter#utility#file_relative_to_repo_root() abort
+  let file_path_relative_to_repo_root = getbufvar(s:bufnr, 'gitgutter_repo_relative_path')
+  if empty(file_path_relative_to_repo_root)
+    let dir_path_relative_to_repo_root = gitgutter#utility#system(gitgutter#utility#command_in_directory_of_file(g:gitgutter_git_executable.' rev-parse --show-prefix'))
+    let dir_path_relative_to_repo_root = gitgutter#utility#strip_trailing_new_line(dir_path_relative_to_repo_root)
+    let file_path_relative_to_repo_root = dir_path_relative_to_repo_root . gitgutter#utility#filename()
+    call setbufvar(s:bufnr, 'gitgutter_repo_relative_path', file_path_relative_to_repo_root)
+  endif
+  return file_path_relative_to_repo_root
+endfunction
+
+function! gitgutter#utility#command_in_directory_of_file(cmd) abort
+  return 'cd '.gitgutter#utility#shellescape(gitgutter#utility#directory_of_file()).' && '.a:cmd
+endfunction
+
+function! gitgutter#utility#highlight_name_for_change(text) abort
+  if a:text ==# 'added'
+    return 'GitGutterLineAdded'
+  elseif a:text ==# 'removed'
+    return 'GitGutterLineRemoved'
+  elseif a:text ==# 'removed_first_line'
+    return 'GitGutterLineRemovedFirstLine'
+  elseif a:text ==# 'modified'
+    return 'GitGutterLineModified'
+  elseif a:text ==# 'modified_removed'
+    return 'GitGutterLineModifiedRemoved'
+  endif
+endfunction
+
+" Dedups list in-place.
+" Assumes list has no empty entries.
+function! gitgutter#utility#dedup(list)
+  return filter(sort(a:list), 'index(a:list, v:val, v:key + 1) == -1')
+endfunction
+
+function! gitgutter#utility#strip_trailing_new_line(line) abort
+  return substitute(a:line, '\n$', '', '')
+endfunction
+
+function! gitgutter#utility#git_version() abort
+  return matchstr(system(g:gitgutter_git_executable.' --version'), '[0-9.]\+')
+endfunction
+
+" True for git v1.7.2+.
+function! gitgutter#utility#git_supports_command_line_config_override() abort
+  let [major, minor, patch; _] = split(gitgutter#utility#git_version(), '\.')
+  return major > 1 || (major == 1 && minor > 7) || (minor == 7 && patch > 1)
+endfunction
+
+function! gitgutter#utility#stringify(list) abort
+  return join(a:list, "\n")."\n"
+endfunction
+
+function! gitgutter#utility#use_known_shell() abort
+  if has('unix')
+    if &shell !=# 'sh'
+      let s:shell = &shell
+      let s:shellcmdflag = &shellcmdflag
+      let s:shellredir = &shellredir
+      let &shell = 'sh'
+      set shellcmdflag=-c
+      set shellredir=>%s\ 2>&1
+    endif
+  endif
+endfunction
+
+function! gitgutter#utility#restore_shell() abort
+  if has('unix')
+    if exists('s:shell')
+      let &shell = s:shell
+      let &shellcmdflag = s:shellcmdflag
+      let &shellredir = s:shellredir
+    endif
+  endif
+endfunction
diff --git a/sources_non_forked/vim-gitgutter/doc/gitgutter.txt b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt
new file mode 100644
index 00000000..d4bb7747
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/doc/gitgutter.txt
@@ -0,0 +1,340 @@
+*gitgutter.txt*              A Vim plugin which shows a git diff in the gutter.
+
+
+                           Vim Git Gutter
+
+
+Author:            Andy Stewart <http://airbladesoftware.com/>
+Plugin Homepage:   <https://github.com/airblade/vim-gitgutter>
+
+===============================================================================
+CONTENTS                                                    *GitGutterContents*
+
+  1.  Introduction ................. |GitGutterIntroduction|
+  2.  Installation ................. |GitGutterInstallation|
+  3.  Usage ........................ |GitGutterUsage|
+  4.  Commands ..................... |GitGutterCommands|
+  5.  Autocommand .................. |GitGutterAutocmd|
+  6.  CUSTOMISATION................. |GitGutterCustomisation|
+  7.  FAQ .......................... |GitGutterFAQ|
+
+===============================================================================
+1. INTRODUCTION                                         *GitGutterIntroduction*
+                                                                    *GitGutter*
+
+Vim Git Gutter is a Vim plugin which shows a git diff in the 'gutter' (sign
+column). It shows whether each line has been added, modified, and where lines
+have been removed.
+
+This is a port of the Git Gutter plugin for Sublime Text 2.
+
+===============================================================================
+2. INSTALLATION                                         *GitGutterInstallation*
+
+* Pathogen:
+>
+  cd ~/.vim/bundle
+  git clone git://github.com/airblade/vim-gitgutter.git
+<
+* Voom:
+
+Edit your plugin manifest (`voom edit`) and add:
+>
+  airblade/vim-gitgutter
+<
+* VimPlug:
+
+Place this in your .vimrc:
+>
+    Plug 'airblade/vim-gitgutter'
+<
+Then run the following in Vim:
+>
+  :source %
+  :PlugInstall
+<
+* NeoBundle:
+
+Place this in your .vimrc:
+>
+  NeoBundle 'airblade/vim-gitgutter'
+<
+Then run the following in Vim:
+>
+  :source %
+  :NeoBundleInstall
+<
+* No plugin manager:
+
+Copy vim-gitgutter's subdirectories into your vim configuration directory:
+>
+  cd tmp && git clone git://github.com/airblade/vim-gitgutter.git
+  cp vim-gitgutter/* ~/.vim/
+<
+See |add-global-plugin|.
+
+===============================================================================
+3. USAGE                                                       *GitGutterUsage*
+
+You don't have to do anything: it just works.
+
+===============================================================================
+4. COMMANDS                                                 *GitGutterCommands*
+
+Commands for turning Git Gutter on and off:
+
+  :GitGutterDisable                                         *:GitGutterDisable*
+      Explicitly turn Git Gutter off.
+
+  :GitGutterEnable                                           *:GitGutterEnable*
+      Explicitly turn Git Gutter on.
+
+  :GitGutterToggle                                           *:GitGutterToggle*
+      Explicitly turn Git Gutter on if it was off and vice versa.
+
+  :GitGutter                                                       *:GitGutter*
+      Update signs for the current buffer.
+
+  :GitGutterAll                                                 *:GitGutterAll*
+      Update signs across all buffers.
+
+Commands for turning signs on and off (defaults to on):
+
+  :GitGutterSignsEnable                                 *:GitGutterSignsEnable*
+      Explicitly turn line signs on.
+
+  :GitGutterSignsDisable                               *:GitGutterSignsDisable*
+      Explicitly turn line signs off.
+
+  :GitGutterSignsToggle                                 *:GitGutterSignsToggle*
+      Explicitly turn line signs on if it was off and vice versa.
+
+Commands for turning line highlighting on and off (defaults to off):
+
+  :GitGutterLineHighlightsEnable               *:GitGutterLineHighlightsEnable*
+      Explicitly turn line highlighting on.
+
+  :GitGutterLineHighlightsDisable             *:GitGutterLineHighlightsDisable*
+      Explicitly turn line highlighting off.
+
+  :GitGutterLineHighlightsToggle               *:GitGutterLineHighlightsToggle*
+      Explicitly turn line highlighting on if it was off and vice versa.
+
+Commands for jumping between marked hunks:
+
+  :GitGutterNextHunk                                       *:GitGutterNextHunk*
+      Jump to the next marked hunk.  Takes a count.
+
+  :GitGutterPrevHunk                                       *:GitGutterPrevHunk*
+      Jump to the previous marked hunk.  Takes a count.
+
+Commands for staging or undoing individual hunks:
+
+  :GitGutterStageHunk                                     *:GitGutterStageHunk*
+      Stage the hunk the cursor is in.
+
+  :GitGutterUndoHunk                                       *:GitGutterUndoHunk*
+      Undo the hunk the cursor is in.
+
+  :GitGutterPreviewHunk                                 *:GitGutterPreviewHunk*
+      Preview the hunk the cursor is in.
+
+===============================================================================
+5. AUTOCOMMAND                                               *GitGutterAutocmd*
+
+After updating a buffer's signs vim-gitgutter fires a |User| |autocmd| with the
+event GitGutter.  You can listen for this event, for example:
+>
+  autocmd User GitGutter call updateMyStatusLine()
+<
+
+===============================================================================
+6. CUSTOMISATION                                       *GitGutterCustomisation*
+
+You can customise:
+
+- The sign column's colours
+- The signs' colours and symbols
+- Line highlights
+- The base of the diff
+- Extra arguments for git-diff
+- Key mappings
+- The grep executable used
+- Whether or not vim-gitgutter is on initially (defaults to on)
+- Whether or not signs are shown (defaults to yes)
+- Whether or not line highlighting is on initially (defaults to off)
+- Whether or not vim-gitgutter runs in realtime (defaults to yes)
+- Whether or not vim-gitgutter runs eagerly (defaults to yes)
+- Whether or not vim-gitgutter runs asynchronously (defaults to yes)
+
+Please note that vim-gitgutter won't override any colours or highlights you've
+set in your colorscheme.
+
+SIGN COLUMN
+
+By default vim-gitgutter will make the sign column look like the line number
+column (i.e. the |hl-LineNr| highlight group).
+
+To customise your sign column's background color, first tell vim-gitgutter to
+leave it alone:
+>
+  let g:gitgutter_override_sign_column_highlight = 0
+<
+
+And then either update your colorscheme's |hlSignColumn| highlight group or set
+it in your |vimrc|:
+
+  Desired appearance                  Command ~
+  Same as line number column          highlight clear SignColumn
+  User-defined (terminal Vim)         highlight SignColumn ctermbg={whatever}
+  User-defined (graphical Vim)        highlight SignColumn guibg={whatever}
+
+SIGNS' COLOURS AND SYMBOLS
+
+To customise the colours, set up the following highlight groups in your
+colorscheme or |vimrc|:
+
+>
+  GitGutterAdd          " an added line
+  GitGutterChange       " a changed line
+  GitGutterDelete       " at least one removed line
+  GitGutterChangeDelete " a changed line followed by at least one removed line
+<
+
+You can either set these with `highlight GitGutterAdd {key}={arg}...` or link
+them to existing highlight groups with, say:
+>
+  highlight link GitGutterAdd DiffAdd
+<
+
+To customise the symbols, add the following to your |vimrc|:
+>
+  let g:gitgutter_sign_added = 'xx'
+  let g:gitgutter_sign_modified = 'yy'
+  let g:gitgutter_sign_removed = 'zz'
+  let g:gitgutter_sign_modified_removed = 'ww'
+<
+
+LINE HIGHLIGHTS
+
+Similarly to the signs' colours, set up the following highlight groups in your
+colorscheme or |vimrc|:
+>
+  GitGutterAddLine          " default: links to DiffAdd
+  GitGutterChangeLine       " default: links to DiffChange
+  GitGutterDeleteLine       " default: links to DiffDelete
+  GitGutterChangeDeleteLine " default: links to GitGutterChangeLineDefault
+<
+
+THE BASE OF THE DIFF
+
+By default buffers are diffed against the index.  To diff against a commit
+instead:
+>
+  let g:gitgutter_diff_base = '<commit SHA>'
+<
+
+EXTRA ARGUMENTS FOR GIT-DIFF
+
+To pass extra arguments to git-diff, add this to your |vimrc|:
+>
+  let g:gitgutter_diff_args = '-w'
+<
+
+KEY MAPPINGS
+
+To disable all key maps:
+>
+  let g:gitgutter_map_keys = 0
+<
+
+To change the hunk-jumping maps (defaults shown):
+>
+  nmap [c <Plug>GitGutterPrevHunk
+  nmap ]c <Plug>GitGutterNextHunk
+<
+
+To change the hunk-staging/undoing/previewing maps (defaults shown):
+>
+  nmap <Leader>hs <Plug>GitGutterStageHunk
+  nmap <Leader>hu <Plug>GitGutterUndoHunk
+  nmap <Leader>hp <Plug>GitGutterPreviewHunk
+<
+
+To change the hunk text object maps (defaults shown):
+>
+  omap ic <Plug>GitGutterTextObjectInnerPending
+  omap ac <Plug>GitGutterTextObjectOuterPending
+  xmap ic <Plug>GitGutterTextObjectInnerVisual
+  xmap ac <Plug>GitGutterTextObjectOuterVisual
+<
+
+TO USE A CUSTOM GREP COMMAND
+
+To use a custom invocation for grep, use this:
+>
+  let g:gitgutter_grep_command = 'grep --color=never -e'
+<
+
+TO TURN OFF VIM-GITGUTTER BY DEFAULT
+
+Add to your |vimrc|
+>
+  let g:gitgutter_enabled = 0
+<
+
+TO TURN OFF SIGNS BY DEFAULT
+
+Add to your |vimrc|
+>
+  let g:gitgutter_signs = 0
+<
+
+Note that the sign column will still be present if you have line highlighting
+switched on.
+
+TO TURN ON LINE HIGHLIGHTING BY DEFAULT
+
+Add to your |vimrc|
+>
+  let g:gitgutter_highlight_lines = 1
+<
+
+TO STOP VIM-GITGUTTER RUNNING IN REALTIME
+
+Add to your |vimrc|
+>
+  let g:gitgutter_realtime = 0
+<
+
+TO STOP VIM-GITGUTTER RUNNING EAGERLY
+
+Add to your |vimrc|
+>
+  let g:gitgutter_eager = 0
+<
+
+TO TURN OFF ASYNCHRONOUS UPDATES
+
+By default diffs are run asynchronously.  To run diffs synchronously
+instead:
+
+Add to your |vimrc|
+>
+let g:gitgutter_async = 0
+<
+
+===============================================================================
+7. FAQ                                                           *GitGutterFAQ*
+
+a. Why are the colours in the sign column weird?
+
+  Your colorscheme is configuring the |hl-SignColumn| highlight group weirdly.
+  Please see |GitGutterCustomisation| on customising the sign column.
+
+b. What happens if I also use another plugin which uses signs (e.g. Syntastic)?
+
+  Vim only allows one sign per line. Before adding a sign to a line,
+  vim-gitgutter checks whether a sign has already been added by somebody else.
+  If so it doesn't do anything. In other words vim-gitgutter won't overwrite
+  another plugin's signs. It also won't remove another plugin's signs.
diff --git a/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim
new file mode 100644
index 00000000..eeaffb15
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim
@@ -0,0 +1,241 @@
+scriptencoding utf-8
+
+if exists('g:loaded_gitgutter') || !has('signs') || &cp
+  finish
+endif
+let g:loaded_gitgutter = 1
+
+" Initialisation {{{
+
+" Realtime sign updates require Vim 7.3.105+.
+if v:version < 703 || (v:version == 703 && !has("patch105"))
+  let g:gitgutter_realtime = 0
+endif
+
+" Eager updates require gettabvar()/settabvar().
+if !exists("*gettabvar")
+  let g:gitgutter_eager = 0
+endif
+
+function! s:set(var, default) abort
+  if !exists(a:var)
+    if type(a:default)
+      execute 'let' a:var '=' string(a:default)
+    else
+      execute 'let' a:var '=' a:default
+    endif
+  endif
+endfunction
+
+call s:set('g:gitgutter_enabled',                     1)
+call s:set('g:gitgutter_max_signs',                 500)
+call s:set('g:gitgutter_signs',                       1)
+call s:set('g:gitgutter_highlight_lines',             0)
+call s:set('g:gitgutter_sign_column_always',          0)
+call s:set('g:gitgutter_override_sign_column_highlight', 1)
+call s:set('g:gitgutter_realtime',                    1)
+call s:set('g:gitgutter_eager',                       1)
+call s:set('g:gitgutter_sign_added',                '+')
+call s:set('g:gitgutter_sign_modified',             '~')
+call s:set('g:gitgutter_sign_removed',              '_')
+try
+  call s:set('g:gitgutter_sign_removed_first_line', '‾')
+catch /E239/
+  let g:gitgutter_sign_removed_first_line = '_^'
+endtry
+
+call s:set('g:gitgutter_sign_modified_removed',    '~_')
+call s:set('g:gitgutter_diff_args',                  '')
+call s:set('g:gitgutter_diff_base',                  '')
+call s:set('g:gitgutter_map_keys',                    1)
+call s:set('g:gitgutter_avoid_cmd_prompt_on_windows', 1)
+call s:set('g:gitgutter_async',                       1)
+call s:set('g:gitgutter_log',                         0)
+call s:set('g:gitgutter_git_executable',          'git')
+
+if !executable(g:gitgutter_git_executable)
+  call gitgutter#utility#warn('cannot find git. Please set g:gitgutter_git_executable.')
+endif
+
+call gitgutter#highlight#define_sign_column_highlight()
+call gitgutter#highlight#define_highlights()
+call gitgutter#highlight#define_signs()
+
+" }}}
+
+" Primary functions {{{
+
+command -bar GitGutterAll call gitgutter#all()
+command -bar GitGutter    call gitgutter#process_buffer(bufnr(''), 0)
+
+command -bar GitGutterDisable call gitgutter#disable()
+command -bar GitGutterEnable  call gitgutter#enable()
+command -bar GitGutterToggle  call gitgutter#toggle()
+
+" }}}
+
+" Line highlights {{{
+
+command -bar GitGutterLineHighlightsDisable call gitgutter#line_highlights_disable()
+command -bar GitGutterLineHighlightsEnable  call gitgutter#line_highlights_enable()
+command -bar GitGutterLineHighlightsToggle  call gitgutter#line_highlights_toggle()
+
+" }}}
+
+" Signs {{{
+
+command -bar GitGutterSignsEnable  call gitgutter#signs_enable()
+command -bar GitGutterSignsDisable call gitgutter#signs_disable()
+command -bar GitGutterSignsToggle  call gitgutter#signs_toggle()
+
+" }}}
+
+" Hunks {{{
+
+command -bar -count=1 GitGutterNextHunk call gitgutter#hunk#next_hunk(<count>)
+command -bar -count=1 GitGutterPrevHunk call gitgutter#hunk#prev_hunk(<count>)
+
+command -bar GitGutterStageHunk   call gitgutter#stage_hunk()
+command -bar GitGutterUndoHunk    call gitgutter#undo_hunk()
+command -bar GitGutterRevertHunk  echomsg 'GitGutterRevertHunk is deprecated. Use GitGutterUndoHunk'<Bar>call gitgutter#undo_hunk()
+command -bar GitGutterPreviewHunk call gitgutter#preview_hunk()
+
+" Hunk text object
+onoremap <silent> <Plug>GitGutterTextObjectInnerPending :<C-U>call gitgutter#hunk#text_object(1)<CR>
+onoremap <silent> <Plug>GitGutterTextObjectOuterPending :<C-U>call gitgutter#hunk#text_object(0)<CR>
+xnoremap <silent> <Plug>GitGutterTextObjectInnerVisual  :<C-U>call gitgutter#hunk#text_object(1)<CR>
+xnoremap <silent> <Plug>GitGutterTextObjectOuterVisual  :<C-U>call gitgutter#hunk#text_object(0)<CR>
+
+
+" Returns the git-diff hunks for the file or an empty list if there
+" aren't any hunks.
+"
+" The return value is a list of lists.  There is one inner list per hunk.
+"
+"   [
+"     [from_line, from_count, to_line, to_count],
+"     [from_line, from_count, to_line, to_count],
+"     ...
+"   ]
+"
+" where:
+"
+" `from`  - refers to the staged file
+" `to`    - refers to the working tree's file
+" `line`  - refers to the line number where the change starts
+" `count` - refers to the number of lines the change covers
+function! GitGutterGetHunks()
+  return gitgutter#utility#is_active() ? gitgutter#hunk#hunks() : []
+endfunction
+
+" Returns an array that contains a summary of the hunk status for the current
+" window.  The format is [ added, modified, removed ], where each value
+" represents the number of lines added/modified/removed respectively.
+function! GitGutterGetHunkSummary()
+  return gitgutter#hunk#summary(winbufnr(0))
+endfunction
+
+" }}}
+
+command -bar GitGutterDebug call gitgutter#debug#debug()
+
+" Maps {{{
+
+nnoremap <silent> <expr> <Plug>GitGutterNextHunk &diff ? ']c' : ":\<C-U>execute v:count1 . 'GitGutterNextHunk'\<CR>"
+nnoremap <silent> <expr> <Plug>GitGutterPrevHunk &diff ? '[c' : ":\<C-U>execute v:count1 . 'GitGutterPrevHunk'\<CR>"
+
+if g:gitgutter_map_keys
+  if !hasmapto('<Plug>GitGutterPrevHunk') && maparg('[c', 'n') ==# ''
+    nmap [c <Plug>GitGutterPrevHunk
+  endif
+  if !hasmapto('<Plug>GitGutterNextHunk') && maparg(']c', 'n') ==# ''
+    nmap ]c <Plug>GitGutterNextHunk
+  endif
+endif
+
+
+nnoremap <silent> <Plug>GitGutterStageHunk   :GitGutterStageHunk<CR>
+nnoremap <silent> <Plug>GitGutterUndoHunk    :GitGutterUndoHunk<CR>
+nnoremap <silent> <Plug>GitGutterPreviewHunk :GitGutterPreviewHunk<CR>
+
+if g:gitgutter_map_keys
+  if !hasmapto('<Plug>GitGutterStageHunk') && maparg('<Leader>hs', 'n') ==# ''
+    nmap <Leader>hs <Plug>GitGutterStageHunk
+  endif
+  if !hasmapto('<Plug>GitGutterUndoHunk') && maparg('<Leader>hu', 'n') ==# ''
+    nmap <Leader>hu <Plug>GitGutterUndoHunk
+    nmap <Leader>hr <Plug>GitGutterUndoHunk:echomsg '<Leader>hr is deprecated. Use <Leader>hu'<CR>
+  endif
+  if !hasmapto('<Plug>GitGutterPreviewHunk') && maparg('<Leader>hp', 'n') ==# ''
+    nmap <Leader>hp <Plug>GitGutterPreviewHunk
+  endif
+
+  if !hasmapto('<Plug>GitGutterTextObjectInnerPending') && maparg('ic', 'o') ==# ''
+    omap ic <Plug>GitGutterTextObjectInnerPending
+  endif
+  if !hasmapto('<Plug>GitGutterTextObjectOuterPending') && maparg('ac', 'o') ==# ''
+    omap ac <Plug>GitGutterTextObjectOuterPending
+  endif
+  if !hasmapto('<Plug>GitGutterTextObjectInnerVisual') && maparg('ic', 'x') ==# ''
+    xmap ic <Plug>GitGutterTextObjectInnerVisual
+  endif
+  if !hasmapto('<Plug>GitGutterTextObjectOuterVisual') && maparg('ac', 'x') ==# ''
+    xmap ac <Plug>GitGutterTextObjectOuterVisual
+  endif
+endif
+
+" }}}
+
+" Autocommands {{{
+
+augroup gitgutter
+  autocmd!
+
+  if g:gitgutter_realtime
+    autocmd CursorHold,CursorHoldI * call gitgutter#process_buffer(bufnr(''), 1)
+  endif
+
+  if g:gitgutter_eager
+    autocmd BufWritePost,FileChangedShellPost * call gitgutter#process_buffer(bufnr(''), 0)
+
+    " When you enter a new tab, BufEnter is only fired if the buffer you enter
+    " is not the one you came from.
+    "
+    " For example:
+    "
+    "   `:tab split` fires TabEnter but not BufEnter.
+    "   `:tab new`   fires TabEnter and BufEnter.
+    "
+    " As and when both TabEnter and BufEnter are fired, we do not want to
+    " process the entered buffer twice.  We avoid this by setting and clearing
+    " a flag.
+
+    autocmd BufEnter *
+          \  if gettabvar(tabpagenr(), 'gitgutter_didtabenter') |
+          \   call settabvar(tabpagenr(), 'gitgutter_didtabenter', 0) |
+          \ else |
+          \   call gitgutter#process_buffer(bufnr(''), 0) |
+          \ endif
+
+    autocmd TabEnter *
+          \ call settabvar(tabpagenr(), 'gitgutter_didtabenter', 1) |
+          \ call gitgutter#all()
+
+    if !has('gui_win32')
+      autocmd FocusGained * call gitgutter#all()
+    endif
+
+  else
+    autocmd BufRead,BufWritePost,FileChangedShellPost * call gitgutter#process_buffer(bufnr(''), 0)
+  endif
+
+  autocmd ColorScheme * call gitgutter#highlight#define_sign_column_highlight() | call gitgutter#highlight#define_highlights()
+
+  " Disable during :vimgrep
+  autocmd QuickFixCmdPre  *vimgrep* let g:gitgutter_enabled = 0
+  autocmd QuickFixCmdPost *vimgrep* let g:gitgutter_enabled = 1
+augroup END
+
+" }}}
+
+" vim:set et sw=2 fdm=marker:
diff --git a/sources_non_forked/vim-gitgutter/screenshot.png b/sources_non_forked/vim-gitgutter/screenshot.png
new file mode 100644
index 00000000..6b50f839
Binary files /dev/null and b/sources_non_forked/vim-gitgutter/screenshot.png differ
diff --git a/sources_non_forked/vim-gitgutter/test/fixture.txt b/sources_non_forked/vim-gitgutter/test/fixture.txt
new file mode 100644
index 00000000..f5c6affe
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/test/fixture.txt
@@ -0,0 +1,11 @@
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+
diff --git a/sources_non_forked/vim-gitgutter/test/runner.vim b/sources_non_forked/vim-gitgutter/test/runner.vim
new file mode 100644
index 00000000..630693c4
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/test/runner.vim
@@ -0,0 +1,162 @@
+"
+" Adapted from https://github.com/vim/vim/blob/master/src/testdir/runtest.vim
+"
+" When debugging tests it can help to write debug output:
+"    call Log('oh noes')
+"
+
+function RunTest(test)
+  if exists("*SetUp")
+    call SetUp()
+  endif
+
+  try
+    execute 'call '.a:test
+  catch
+    call Exception()
+    let s:errored = 1
+  endtry
+
+  if exists("*TearDown")
+    call TearDown()
+  endif
+endfunction
+
+function Log(msg)
+  if type(a:msg) == type('')
+    call add(s:messages, a:msg)
+  elseif type(a:msg) == type([])
+    call extend(s:messages, a:msg)
+  else
+    call add(v:errors, 'Exception: unsupported type: '.type(a:msg))
+  endif
+endfunction
+
+function Exception()
+  call add(v:errors, v:throwpoint.'..'.'Exception: '.v:exception)
+endfunction
+
+" Shuffles list in place.
+function Shuffle(list)
+  " Fisher-Yates-Durstenfeld-Knuth
+  let n = len(a:list)
+  if n < 2
+    return a:list
+  endif
+  for i in range(0, n-2)
+    let j = Random(0, n-i-1)
+    let e = a:list[i]
+    let a:list[i] = a:list[i+j]
+    let a:list[i+j] = e
+  endfor
+  return a:list
+endfunction
+
+" Returns a pseudorandom integer i such that 0 <= i <= max
+function Random(min, max)
+  if has('unix')
+    let i = system('echo $RANDOM')  " 0 <= i <= 32767
+  else
+    let i = system('echo %RANDOM%')  " 0 <= i <= 32767
+  endif
+  return i * (a:max - a:min + 1) / 32768 + a:min
+endfunction
+
+function FriendlyName(test_name)
+  return substitute(a:test_name[5:-3], '_', ' ', 'g')
+endfunction
+
+function Align(left, right)
+  if type(a:right) == type([])
+    let result = []
+    for s in a:right
+      if empty(result)
+        call add(result, printf('%-'.s:indent.'S', a:left).s)
+      else
+        call add(result, printf('%-'.s:indent.'S',     '').s)
+      endif
+    endfor
+    return result
+  endif
+
+  return printf('%-'.s:indent.'S', a:left).a:right
+endfunction
+
+let g:testname = expand('%')
+let s:errored = 0
+let s:done = 0
+let s:fail = 0
+let s:errors = 0
+let s:messages = []
+let s:indent = ''
+
+call Log(g:testname.':')
+
+" Source the test script.
+try
+  source %
+catch
+  let s:errors += 1
+  call Exception()
+endtry
+
+" Locate the test functions.
+set nomore
+redir @q
+silent function /^Test_
+redir END
+let s:tests = split(substitute(@q, 'function \(\k*()\)', '\1', 'g'))
+
+" If there is another argument, filter test-functions' names against it.
+if argc() > 1
+  let s:tests = filter(s:tests, 'v:val =~ argv(1)')
+endif
+
+let s:indent = max(map(copy(s:tests), {_, val -> len(FriendlyName(val))}))
+
+" Run the tests in random order.
+for test in Shuffle(s:tests)
+  call RunTest(test)
+  let s:done += 1
+
+  let friendly_name = FriendlyName(test)
+  if len(v:errors) == 0
+    call Log(Align(friendly_name, ' - ok'))
+  else
+    if s:errored
+      let s:errors += 1
+      let s:errored = 0
+    else
+      let s:fail += 1
+    endif
+    call Log(Align(friendly_name, ' - not ok'))
+
+    let i = 0
+    for error in v:errors
+      if i != 0
+        call Log(Align('','   ! ----'))
+      endif
+      for trace in reverse(split(error, '\.\.'))
+        call Log(Align('', '   ! '.trace))
+      endfor
+      let i += 1
+    endfor
+
+    let v:errors = []
+  endif
+endfor
+
+let summary = [
+      \ s:done.(  s:done   == 1 ? ' test'    : ' tests'),
+      \ s:errors.(s:errors == 1 ? ' error'   : ' errors'),
+      \ s:fail.(  s:fail   == 1 ? ' failure' : ' failures'),
+      \ ]
+call Log('')
+call Log(join(summary, ', '))
+
+split messages.log
+call append(line('$'), s:messages)
+write
+
+qall!
+
diff --git a/sources_non_forked/vim-gitgutter/test/test b/sources_non_forked/vim-gitgutter/test/test
new file mode 100644
index 00000000..6247a058
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/test/test
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+VIM="/Applications/MacVim.app/Contents/MacOS/Vim -v"
+
+$VIM -u NONE -U NONE -N                      \
+  --cmd 'set rtp+=../'                       \
+  --cmd 'let g:gitgutter_async=0'            \
+  --cmd 'source ../plugin/gitgutter.vim'     \
+  -S runner.vim                              \
+  test_*.vim                                 \
+  $*
+
+cat messages.log
+
+grep -q "0 errors, 0 failures" messages.log
+status=$?
+rm messages.log
+exit $status
+
diff --git a/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim b/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim
new file mode 100644
index 00000000..1a65ed8a
--- /dev/null
+++ b/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim
@@ -0,0 +1,400 @@
+let s:current_dir = expand('%:p:h')
+let s:test_repo   = s:current_dir.'/test-repo'
+let s:bufnr       = bufnr('')
+
+"
+" Helpers
+"
+
+function s:signs(filename)
+  redir => signs
+    silent execute 'sign place'
+  redir END
+
+  let signs = split(signs, '\n')
+
+  " filter out signs for this test file
+  " assumes a:filename's signs are last set listed
+  let i = index(signs, 'Signs for '.a:filename.':')
+  let signs = (i > -1 ? signs[i+1:] : [])
+
+  call map(signs, {_, v -> substitute(v, '    ', '', '')})
+
+  return signs
+endfunction
+
+function s:git_diff()
+  return split(system('git diff -U0 fixture.txt'), '\n')
+endfunction
+
+function s:git_diff_staged()
+  return split(system('git diff -U0 --staged fixture.txt'), '\n')
+endfunction
+
+
+"
+" SetUp / TearDown
+"
+
+function SetUp()
+  call system("git init ".s:test_repo.
+        \ " && cd ".s:test_repo.
+        \ " && cp ../fixture.txt .".
+        \ " && git add . && git commit -m 'initial'")
+  execute ':cd' s:test_repo
+  edit! fixture.txt
+  call gitgutter#sign#reset()
+endfunction
+
+function TearDown()
+  " delete all buffers except this one
+  " TODO: move to runner.vim, accounting for multiple test files
+  if s:bufnr > 1
+    silent! execute '1,'.s:bufnr-1.'bdelete!'
+  endif
+  silent! execute s:bufnr+1.',$bdelete!'
+
+  execute ':cd' s:current_dir
+  call system("rm -rf ".s:test_repo)
+endfunction
+
+"
+" The tests
+"
+
+function Test_add_lines()
+  normal ggo*
+  write
+
+  let expected = ["line=2  id=3000  name=GitGutterLineAdded"]
+  call assert_equal(expected, s:signs('fixture.txt'))
+endfunction
+
+
+function Test_add_lines_fish()
+  let _shell = &shell
+  set shell=/usr/local/bin/fish
+
+  normal ggo*
+  write
+
+  let expected = ["line=2  id=3000  name=GitGutterLineAdded"]
+  call assert_equal(expected, s:signs('fixture.txt'))
+
+  let &shell = _shell
+endfunction
+
+
+function Test_modify_lines()
+  normal ggi*
+  write
+
+  let expected = ["line=1  id=3000  name=GitGutterLineModified"]
+  call assert_equal(expected, s:signs('fixture.txt'))
+endfunction
+
+
+function Test_remove_lines()
+  execute '5d'
+  write
+
+  let expected = ["line=4  id=3000  name=GitGutterLineRemoved"]
+  call assert_equal(expected, s:signs('fixture.txt'))
+endfunction
+
+
+function Test_remove_first_lines()
+  execute '1d'
+  write
+
+  let expected = ["line=1  id=3000  name=GitGutterLineRemovedFirstLine"]
+  call assert_equal(expected, s:signs('fixture.txt'))
+endfunction
+
+
+function Test_edit_file_with_same_name_as_a_branch()
+  normal 5Gi*
+  call system('git checkout -b fixture.txt')
+  write
+
+  let expected = ["line=5  id=3000  name=GitGutterLineModified"]
+  call assert_equal(expected, s:signs('fixture.txt'))
+endfunction
+
+
+function Test_file_added_to_git()
+  let tmpfile = 'fileAddedToGit.tmp'
+  call system('touch '.tmpfile.' && git add '.tmpfile)
+  execute 'edit '.tmpfile
+  normal ihello
+  write
+
+  let expected = ["line=1  id=3000  name=GitGutterLineAdded"]
+  call assert_equal(expected, s:signs('fileAddedToGit.tmp'))
+endfunction
+
+
+function Test_filename_with_equals()
+  call system('touch =fixture=.txt && git add =fixture=.txt')
+  edit =fixture=.txt
+  normal ggo*
+  write
+
+  let expected = [
+        \ 'line=1  id=3000  name=GitGutterLineAdded',
+        \ 'line=2  id=3001  name=GitGutterLineAdded'
+        \ ]
+  call assert_equal(expected, s:signs('=fixture=.txt'))
+endfunction
+
+
+function Test_filename_with_square_brackets()
+  call system('touch fix[tu]re.txt && git add fix[tu]re.txt')
+  edit fix[tu]re.txt
+  normal ggo*
+  write
+
+  let expected = [
+        \ 'line=1  id=3000  name=GitGutterLineAdded',
+        \ 'line=2  id=3001  name=GitGutterLineAdded'
+        \ ]
+  call assert_equal(expected, s:signs('fix[tu]re.txt'))
+endfunction
+
+
+" FIXME: this test fails when it is the first (or only) test to be run
+function Test_follow_symlink()
+  let tmp = 'symlink'
+  call system('ln -nfs fixture.txt '.tmp)
+  execute 'edit '.tmp
+  6d
+  write
+
+  let expected = ['line=5  id=3000  name=GitGutterLineRemoved']
+  call assert_equal(expected, s:signs('symlink'))
+endfunction
+
+
+function Test_keep_alt()
+  enew
+  execute "normal! \<C-^>"
+
+  call assert_equal('fixture.txt', bufname(''))
+  call assert_equal('',            bufname('#'))
+
+  normal ggx
+  doautocmd CursorHold
+
+  call assert_equal('', bufname('#'))
+endfunction
+
+
+function Test_keep_modified()
+  normal 5Go*
+  call assert_equal(1, getbufvar('', '&modified'))
+
+  doautocmd CursorHold
+
+  call assert_equal(1, getbufvar('', '&modified'))
+endfunction
+
+
+function Test_keep_op_marks()
+  normal 5Go*
+  call assert_equal([0,6,1,0], getpos("'["))
+  call assert_equal([0,6,2,0], getpos("']"))
+
+  doautocmd CursorHold
+
+  call assert_equal([0,6,1,0], getpos("'["))
+  call assert_equal([0,6,2,0], getpos("']"))
+endfunction
+
+
+function Test_no_modifications()
+  call assert_equal([], s:signs('fixture.txt'))
+endfunction
+
+
+function Test_orphaned_signs()
+  execute "normal 5GoX\<CR>Y"
+  write
+  6d
+  write
+
+  let expected = ['line=6  id=3001  name=GitGutterLineAdded']
+  call assert_equal(expected, s:signs('fixture.txt'))
+endfunction
+
+
+function Test_sign_column_always()
+  let g:gitgutter_sign_column_always=1
+  write
+
+  let expected = ['line=9999  id=2999  name=GitGutterDummy']
+  call assert_equal(expected, s:signs('fixture.txt'))
+
+  let g:gitgutter_sign_column_always=0
+endfunction
+
+
+function Test_untracked_file_outside_repo()
+  let tmp = tempname()
+  call system('touch '.tmp)
+  execute 'edit '.tmp
+
+  call assert_equal([], s:signs(tmp))
+endfunction
+
+
+function Test_untracked_file_within_repo()
+  let tmp = 'untrackedFileWithinRepo.tmp'
+  call system('touch '.tmp)
+  execute 'edit '.tmp
+  normal ggo*
+  doautocmd CursorHold
+
+  call assert_equal([], s:signs(tmp))
+
+  call system('rm '.tmp)
+endfunction
+
+
+function Test_untracked_file_square_brackets_within_repo()
+  let tmp = '[un]trackedFileWithinRepo.tmp'
+  call system('touch '.tmp)
+  execute 'edit '.tmp
+  normal ggo*
+  doautocmd CursorHold
+
+  call assert_equal([], s:signs(tmp))
+
+  call system('rm '.tmp)
+endfunction
+
+
+function Test_hunk_outside_noop()
+  normal 5G
+  GitGutterStageHunk
+
+  call assert_equal([], s:signs('fixture.txt'))
+  call assert_equal([], s:git_diff())
+  call assert_equal([], s:git_diff_staged())
+
+  GitGutterUndoHunk
+
+  call assert_equal([], s:signs('fixture.txt'))
+  call assert_equal([], s:git_diff())
+  call assert_equal([], s:git_diff_staged())
+endfunction
+
+
+function Test_hunk_stage()
+  let _shell = &shell
+  set shell=foo
+
+  normal 5Gi*
+  GitGutterStageHunk
+
+  call assert_equal('foo', &shell)
+  let &shell = _shell
+
+  call assert_equal([], s:signs('fixture.txt'))
+
+  call assert_equal([], s:git_diff())
+
+  let expected = [
+        \ 'diff --git a/fixture.txt b/fixture.txt',
+        \ 'index f5c6aff..ae8e546 100644',
+        \ '--- a/fixture.txt',
+        \ '+++ b/fixture.txt',
+        \ '@@ -5 +5 @@ d',
+        \ '-e',
+        \ '+*e'
+        \ ]
+  call assert_equal(expected, s:git_diff_staged())
+endfunction
+
+
+function Test_hunk_stage_nearby_hunk()
+  execute "normal! 2Gox\<CR>y\<CR>z"
+  normal 2jdd
+  normal k
+  GitGutterStageHunk
+
+  let expected = [
+        \ 'line=3  id=3000  name=GitGutterLineAdded',
+        \ 'line=4  id=3001  name=GitGutterLineAdded',
+        \ 'line=5  id=3002  name=GitGutterLineAdded'
+        \ ]
+  call assert_equal(expected, s:signs('fixture.txt'))
+
+  let expected = [
+        \ 'diff --git a/fixture.txt b/fixture.txt',
+        \ 'index 53b13df..8fdfda7 100644',
+        \ '--- a/fixture.txt',
+        \ '+++ b/fixture.txt',
+        \ '@@ -2,0 +3,3 @@ b',
+        \ '+x',
+        \ '+y',
+        \ '+z',
+        \ ]
+  call assert_equal(expected, s:git_diff())
+
+  let expected = [
+        \ 'diff --git a/fixture.txt b/fixture.txt',
+        \ 'index f5c6aff..53b13df 100644',
+        \ '--- a/fixture.txt',
+        \ '+++ b/fixture.txt',
+        \ '@@ -4 +3,0 @@ c',
+        \ '-d',
+        \ ]
+  call assert_equal(expected, s:git_diff_staged())
+endfunction
+
+
+function Test_hunk_undo()
+  let _shell = &shell
+  set shell=foo
+
+  normal 5Gi*
+  GitGutterUndoHunk
+  write  " write file so we can verify git diff (--staged)
+
+  call assert_equal('foo', &shell)
+  let &shell = _shell
+
+  call assert_equal([], s:signs('fixture.txt'))
+  call assert_equal([], s:git_diff())
+  call assert_equal([], s:git_diff_staged())
+endfunction
+
+
+function Test_undo_nearby_hunk()
+  execute "normal! 2Gox\<CR>y\<CR>z"
+  normal 2jdd
+  normal k
+  GitGutterUndoHunk
+  write  " write file so we can verify git diff (--staged)
+
+  let expected = [
+        \ 'line=3  id=3000  name=GitGutterLineAdded',
+        \ 'line=4  id=3001  name=GitGutterLineAdded',
+        \ 'line=5  id=3002  name=GitGutterLineAdded'
+        \ ]
+  call assert_equal(expected, s:signs('fixture.txt'))
+
+  let expected = [
+        \ 'diff --git a/fixture.txt b/fixture.txt',
+        \ 'index f5c6aff..3fbde56 100644',
+        \ '--- a/fixture.txt',
+        \ '+++ b/fixture.txt',
+        \ '@@ -2,0 +3,3 @@ b',
+        \ '+x',
+        \ '+y',
+        \ '+z',
+        \ ]
+  call assert_equal(expected, s:git_diff())
+
+  call assert_equal([], s:git_diff_staged())
+endfunction