changeset 471:84fe072e8694

Added nvim config
author unexist
date Sat, 30 Dec 2017 15:07:41 +0100
parents d770846d5fec
children 3651be13c91d
files .config/nvim/after/plugin/signature_gitgutter.vim .config/nvim/after/plugin/snipMate.vim .config/nvim/after/syntax/c.vim .config/nvim/after/syntax/c/marker.vim .config/nvim/after/syntax/c/rainbow.vim .config/nvim/after/syntax/h.vim .config/nvim/after/syntax/h/marker.vim .config/nvim/after/syntax/h/rainbow.vim .config/nvim/after/syntax/marker.vim .config/nvim/after/syntax/rainbow.vim .config/nvim/after/syntax/rb.vim .config/nvim/after/syntax/rb/marker.vim .config/nvim/after/syntax/rb/rainbow.vim .config/nvim/after/syntax/tex.vim .config/nvim/after/syntax/tex/marker.vim .config/nvim/after/syntax/tex/rainbow.vim .config/nvim/autoload/Align.vim .config/nvim/autoload/AlignMaps.vim .config/nvim/autoload/Rainbow.vim .config/nvim/autoload/snipMate.vim .config/nvim/autoload/tagbar.vim .config/nvim/colors/OceanicNext.vim .config/nvim/colors/badwolf.vim .config/nvim/colors/digerati.vim .config/nvim/colors/gruvbox.vim .config/nvim/colors/hornet.vim .config/nvim/colors/ir_black.vim .config/nvim/colors/merged.vim .config/nvim/colors/mustang.vim .config/nvim/colors/onedark.vim .config/nvim/colors/xoria256.vim .config/nvim/doc/NERD_commenter.txt .config/nvim/doc/Rainbow.txt .config/nvim/doc/jshint.txt .config/nvim/doc/signature.txt .config/nvim/doc/surround.txt .config/nvim/doc/tagbar.txt .config/nvim/ginit.vim .config/nvim/init.vim .config/nvim/plugin/AlignMapsPlugin.vim .config/nvim/plugin/AlignPlugin.vim .config/nvim/plugin/NERD_commenter.vim .config/nvim/plugin/NERD_tree.vim .config/nvim/plugin/RainbowPlugin.vim .config/nvim/plugin/jshint.vim .config/nvim/plugin/neovim-fuzzy.vim .config/nvim/plugin/pastie.vim .config/nvim/plugin/qbuf.vim .config/nvim/plugin/refactor.vim .config/nvim/plugin/sessions.vim .config/nvim/plugin/signature.vim .config/nvim/plugin/signature/mark.vim .config/nvim/plugin/signature/marker.vim .config/nvim/plugin/signature/sign.vim .config/nvim/plugin/signature/utils.vim .config/nvim/plugin/snipMate.vim .config/nvim/plugin/surround.vim .config/nvim/plugin/tagbar.vim .config/nvim/sessions/subtle.mru .config/nvim/sessions/subtle.vim .config/nvim/snippets/_.snippets .config/nvim/snippets/autoit.snippets .config/nvim/snippets/c.snippets .config/nvim/snippets/cpp.snippets .config/nvim/snippets/html.snippets .config/nvim/snippets/java.snippets .config/nvim/snippets/javascript.snippets .config/nvim/snippets/objc.snippets .config/nvim/snippets/perl.snippets .config/nvim/snippets/python.snippets .config/nvim/snippets/ruby.snippets .config/nvim/snippets/sh.snippets .config/nvim/snippets/snippet.snippets .config/nvim/snippets/tcl.snippets .config/nvim/snippets/tex.snippets .config/nvim/snippets/vim.snippets .config/nvim/syntax/go.vim .config/nvim/syntax/tagbar.vim
diffstat 78 files changed, 24680 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/plugin/signature_gitgutter.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,34 @@
+" vim: fdm=marker:et:ts=4:sw=2:sts=2
+
+" Maintainer:  Kartik Shenoy
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+" Exit if the signs feature is not available or if the app has already been loaded (or "compatible" mode set)
+if (  !has('signs')
+ \ || &cp
+ \ )
+  finish
+endif
+
+"" Exit if vim-signature is not loaded
+if !exists('g:loaded_Signature')
+  finish
+endif
+
+if exists('g:loaded_gitgutter')
+  if g:SignatureMarkTextHLDynamic
+    let g:SignatureMarkTextHL = 'signature#sign#GetGitGutterHLGroup(a:lnum)'
+  endif
+  if g:SignatureMarkerTextHLDynamic
+    let g:SignatureMarkerTextHL = 'signature#sign#GetGitGutterHLGroup(a:lnum)'
+  endif
+endif
+
+if exists('g:loaded_signify')
+  if g:SignatureMarkTextHLDynamic
+    let g:SignatureMarkTextHL = 'signature#sign#GetSignifyHLGroup(a:lnum)'
+  endif
+  if g:SignatureMarkerTextHLDynamic
+    let g:SignatureMarkerTextHL = 'signature#sign#GetSignifyHLGroup(a:lnum)'
+  endif
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/plugin/snipMate.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,24 @@
+" These are the mappings for snipMate.vim. Putting it here ensures that it
+" will be mapped after other plugins such as supertab.vim.
+if exists('s:did_snips_mappings') || &cp || version < 700
+	finish
+endif
+let s:did_snips_mappings = 1
+
+ino <silent> <tab> <c-r>=TriggerSnippet()<cr>
+snor <silent> <tab> <esc>i<right><c-r>=TriggerSnippet()<cr>
+ino <silent> <c-r><tab> <c-r>=ShowAvailableSnips()<cr>
+snor <bs> b<bs>
+snor ' b<bs>'
+snor <right> <esc>a
+snor <left> <esc>bi
+
+" By default load snippets in snippets_dir
+if empty(snippets_dir)
+	finish
+endif
+
+call GetSnippets(snippets_dir, '_') " Get global snippets 
+
+au FileType * if &ft != 'help' | call GetSnippets(snippets_dir, &ft) | endif
+" vim:noet:sw=4:ts=4:ft=vim
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/c.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+aftersyntax.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/c/marker.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../marker.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/c/rainbow.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../rainbow.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/h.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+aftersyntax.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/h/marker.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../marker.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/h/rainbow.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../rainbow.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/marker.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,11 @@
+" Syntax
+highlight MarkerTab         guibg=green  guifg=black ctermbg=green  ctermfg=black
+highlight MarkerWhitespace  guibg=yellow guifg=black ctermbg=yellow ctermfg=black
+highlight MarkerOverlength  guibg=red    guifg=black ctermbg=red    ctermfg=black
+
+syntax match MarkerTab /\t/
+syntax match MarkerWhitespace /\s\+$/
+syntax match MarkerWhitespace /\s\+$\| \+\ze\t/
+syntax match MarkerWhitespace /[^\t]\zs\t\+/
+syntax match MarkerOverlength /\%81v.\*/
+syntax match MarkerConstant /[A-Z0-9_]\{3,}/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/rainbow.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,181 @@
+" rainbow.vvim : provides "rainbow-colored" curly braces and parentheses
+"               C/C++ language version
+"   Author: 	Charles E. Campbell, Jr.
+"   Date:		Nov 01, 2009
+"   Associated Files:  plugin/RainbowPlugin.vim autoload/Rainbow.vim doc/Rainbow.txt
+" ---------------------------------------------------------------------
+" non-compatible only: {{{1
+if &cp
+ finish
+endif
+let keepcpo= &cpo
+let s:work = ''
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Default Settings: {{{1
+if !exists("g:hlrainbow")
+ let g:hlrainbow= '{}()'
+endif
+"call Decho("g:hlrainbow<".g:hlrainbow.">")
+
+syn clear cParen cCppParen cBracket cCppBracket cBlock cParenError
+
+" Clusters {{{1
+syn cluster cParenGroup		contains=cBlock,cCharacter,cComment,cCommentError,cCommentL,cConditional,cConstant,cDefine,cInclude,cLabel,cMulti,cNumbers,cOperator,cPreProc,cRepeat,cSpaceError,cSpecialCharacter,cSpecialError,cStatement,cStorageClass,cString,cStructure,cType
+syn cluster cCppParenGroup	contains=cBlock,cCharacter,cComment,cCommentError,cCommentL,cConditional,cConstant,cCppBracket,cCppString,cDefine,cInclude,cLabel,cMulti,cNumbers,cOperator,cPreProc,cRepeat,cSpaceError,cSpecialCharacter,cSpecialError,cStatement,cStorageClass,cStructure,cType
+syn cluster cCurlyGroup		contains=cConditional,cConstant,cLabel,cOperator,cRepeat,cStatement,cStorageClass,cStructure,cType,cBitField,cCharacter,cCommentError,cInclude,cNumbers,cPreCondit,cSpaceError,cSpecialCharacter,cSpecialError,cUserCont,cBlock,cComment,cCommentL,cCppOut,cCppString,cDefine,cMulti,cPreCondit,cPreProc,cString,cFoldSpec
+if &ft == "cpp"
+ syn cluster cCurlyGroup add=cppStatement,cppAccess,cppType,cppExceptions,cppOperator,cppCast,cppStorageClass,cppStructure,cppNumber,cppBoolean,cppMinMax
+endif
+
+" Error Syntax {{{1
+syn clear cErrInBracket
+syn match	cErrInBracket	display contained "[{}]\|<%\|%>"
+syn match	cParenError		display ')'
+syn match	cBracketError	display ']'
+if &ft == "cpp"
+ syn cluster cCppBracketGroup	add=cParenError,cErrInBracket,cCurly,cCppParen,cCppBracket
+ syn cluster cCppParenGroup		add=cBracketError,cErrInBracket,cCurly,cCppParen,cCppBracket
+ syn cluster cBracketGroup		add=cParenError,cErrInBracket,cCurly,cCppParen,cCppBracket
+ syn cluster cParenGroup		add=cBracketError,cErrInBracket,cCurly,cCppParen,cCppBracket
+ syn cluster cCurlyGroup		add=cParenError,cBracketError,cCurly,cCppParen,cCppBracket
+else
+ syn cluster cBracketGroup		add=cParenError,cErrInBracket,cCurly,cParen,cBracket
+ syn cluster cParenGroup		add=cBracketError,cErrInBracket,cCurly,cParen,cBracket
+ syn cluster cCurlyGroup		add=cParenError,cBracketError,cCurly,cParen,cBracket
+endif
+
+" ---------------------------------------------------------------------
+" supports {} highlighting, too many } error detection, and {{{1
+" function folding (when fdm=syntax)
+if g:hlrainbow =~ '[{}]'
+
+" call Decho("enabling {} rainbow")
+ syn match  cCurlyError	display '}'
+ syn region cCurly  fold matchgroup=hlLevel0 start='{' end='}' 			 contains=@cCurlyGroup,cCurly1
+ syn region cCurly1		 matchgroup=hlLevel1 start='{' end='}' contained contains=@cCurlyGroup,cCurly2
+ syn region cCurly2		 matchgroup=hlLevel2 start='{' end='}' contained contains=@cCurlyGroup,cCurly3
+ syn region cCurly3		 matchgroup=hlLevel3 start='{' end='}' contained contains=@cCurlyGroup,cCurly4
+ syn region cCurly4		 matchgroup=hlLevel4 start='{' end='}' contained contains=@cCurlyGroup,cCurly5
+ syn region cCurly5		 matchgroup=hlLevel5 start='{' end='}' contained contains=@cCurlyGroup,cCurly6
+ syn region cCurly6		 matchgroup=hlLevel6 start='{' end='}' contained contains=@cCurlyGroup,cCurly7
+ syn region cCurly7		 matchgroup=hlLevel7 start='{' end='}' contained contains=@cCurlyGroup,cCurly8
+ syn region cCurly8		 matchgroup=hlLevel8 start='{' end='}' contained contains=@cCurlyGroup,cCurly9
+ syn region cCurly9		 matchgroup=hlLevel9 start='{' end='}' contained contains=@cCurlyGroup,cCurly
+else
+ syn region cCurly	fold start='{' end='}'	contains=@cCurlyGroup
+endif
+
+" ---------------------------------------------------------------------
+" supports () highlighting and error detection {{{1
+if g:hlrainbow =~ '[()]'
+
+ if &ft == "cpp"
+"  call Decho("enabling () rainbow for C++")
+  syn region	cCppParen	transparent matchgroup=hlLevel0	start='(' end=')' 			contains=@cCppParenGroup,cCppParen1 
+  syn region	cCppParen1	transparent matchgroup=hlLevel1	start='(' end=')' contained contains=@cCppParenGroup,cCppParen2 
+  syn region	cCppParen2	transparent matchgroup=hlLevel2	start='(' end=')' contained contains=@cCppParenGroup,cCppParen3 
+  syn region	cCppParen3	transparent matchgroup=hlLevel3	start='(' end=')' contained contains=@cCppParenGroup,cCppParen4 
+  syn region	cCppParen4	transparent matchgroup=hlLevel4	start='(' end=')' contained contains=@cCppParenGroup,cCppParen5 
+  syn region	cCppParen5	transparent matchgroup=hlLevel5	start='(' end=')' contained contains=@cCppParenGroup,cCppParen6 
+  syn region	cCppParen6	transparent matchgroup=hlLevel6	start='(' end=')' contained contains=@cCppParenGroup,cCppParen7 
+  syn region	cCppParen7	transparent matchgroup=hlLevel7	start='(' end=')' contained contains=@cCppParenGroup,cCppParen8 
+  syn region	cCppParen8	transparent matchgroup=hlLevel8	start='(' end=')' contained contains=@cCppParenGroup,cCppParen9 
+  syn region	cCppParen9	transparent matchgroup=hlLevel9	start='(' end=')' contained contains=@cCppParenGroup,cCppParen
+ else
+"  call Decho("enabling () rainbow for C")
+  syn region	cParen		transparent matchgroup=hlLevel0	start='(' end=')' 			contains=@cParenGroup,cParen1
+  syn region	cParen1		transparent matchgroup=hlLevel1	start='(' end=')' contained contains=@cParenGroup,cParen2
+  syn region	cParen2		transparent matchgroup=hlLevel2	start='(' end=')' contained contains=@cParenGroup,cParen3
+  syn region	cParen3		transparent matchgroup=hlLevel3	start='(' end=')' contained contains=@cParenGroup,cParen4
+  syn region	cParen4		transparent matchgroup=hlLevel4	start='(' end=')' contained contains=@cParenGroup,cParen5
+  syn region	cParen5		transparent matchgroup=hlLevel5	start='(' end=')' contained contains=@cParenGroup,cParen6
+  syn region	cParen6		transparent matchgroup=hlLevel6	start='(' end=')' contained contains=@cParenGroup,cParen7
+  syn region	cParen7		transparent matchgroup=hlLevel7	start='(' end=')' contained contains=@cParenGroup,cParen8
+  syn region	cParen8		transparent matchgroup=hlLevel8	start='(' end=')' contained contains=@cParenGroup,cParen9
+  syn region	cParen9		transparent matchgroup=hlLevel9	start='(' end=')' contained contains=@cParenGroup,cParen
+ endif
+else
+ if &ft == "cpp"
+  syn region	cCppParen	start='(' end=')' contains=@cParenGroup
+ else
+  syn region	cParen		start='(' end=')' contains=@cParenGroup
+ endif
+endif
+
+" ---------------------------------------------------------------------
+" supports [] highlighting and error detection {{{1
+if g:hlrainbow =~ '[[\]]'
+ syn clear   cBracket cCppBracket
+ syn cluster cBracketGroup		contains=cBlock,cBracket,cCharacter,cComment,cCommentError,cCommentL,cConditional,cConstant,cDefine,cInclude,cLabel,cMulti,cNumbers,cOperator,cPreProc,cRepeat,cSpaceError,cSpecialCharacter,cSpecialError,cStatement,cStorageClass,cString,cStructure,cType
+
+ if &ft == "cpp"
+"  call Decho("enabling [] rainbow for C++")
+  syn cluster cCppBracketGroup	contains=cBlock,cCharacter,cComment,cCommentError,cCommentL,cConditional,cConstant,cCppBracket,cCppParen,cCppString,cDefine,cInclude,cLabel,cMulti,cNumbers,cOperator,cPreProc,cRepeat,cSpaceError,cSpecialCharacter,cSpecialError,cStatement,cStorageClass,cStructure,cType
+  syn region cCppBracket  fold	matchgroup=hlLevel0 start='\[' end=']' 			 contains=@cCppBracketGroup,cCppBracket1
+  syn region cCppBracket1		matchgroup=hlLevel1 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket2
+  syn region cCppBracket2		matchgroup=hlLevel2 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket3
+  syn region cCppBracket3		matchgroup=hlLevel3 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket4
+  syn region cCppBracket4		matchgroup=hlLevel4 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket5
+  syn region cCppBracket5		matchgroup=hlLevel5 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket6
+  syn region cCppBracket6		matchgroup=hlLevel6 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket7
+  syn region cCppBracket7		matchgroup=hlLevel7 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket8
+  syn region cCppBracket8		matchgroup=hlLevel8 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket9
+  syn region cCppBracket9		matchgroup=hlLevel9 start='\[' end=']' contained contains=@cCppBracketGroup,cCppBracket
+ else
+"  call Decho("enabling [] rainbow for C")
+  syn region cBracket  fold	matchgroup=hlLevel0 start='\[' end=']' 			 contains=@cBracketGroup,cBracket1
+  syn region cBracket1		matchgroup=hlLevel1 start='\[' end=']' contained contains=@cBracketGroup,cBracket2
+  syn region cBracket2		matchgroup=hlLevel2 start='\[' end=']' contained contains=@cBracketGroup,cBracket3
+  syn region cBracket3		matchgroup=hlLevel3 start='\[' end=']' contained contains=@cBracketGroup,cBracket4
+  syn region cBracket4		matchgroup=hlLevel4 start='\[' end=']' contained contains=@cBracketGroup,cBracket5
+  syn region cBracket5		matchgroup=hlLevel5 start='\[' end=']' contained contains=@cBracketGroup,cBracket6
+  syn region cBracket6		matchgroup=hlLevel6 start='\[' end=']' contained contains=@cBracketGroup,cBracket7
+  syn region cBracket7		matchgroup=hlLevel7 start='\[' end=']' contained contains=@cBracketGroup,cBracket8
+  syn region cBracket8		matchgroup=hlLevel8 start='\[' end=']' contained contains=@cBracketGroup,cBracket9
+  syn region cBracket9		matchgroup=hlLevel9 start='\[' end=']' contained contains=@cBracketGroup,cBracket
+ endif
+else
+ if &ft == "cpp"
+  syn region	cCppBracket	start='\[' end=']' contains=@cCppBracketGroup
+ else
+  syn region	cBracket	start='\[' end=']' contains=@cBracketGroup
+ endif
+endif
+
+" don't use {{{# patterns in curly brace matching
+syn match cFoldSpec	'{{{\d\+'
+syn match cFoldSpec	'}}}\d\+'
+
+" highlighting: {{{1
+hi link cCurlyError		cError
+hi link cBracketError	cError
+"if &bg == "dark"
+" hi default   hlLevel0 ctermfg=red         guifg=red1
+" hi default   hlLevel1 ctermfg=yellow      guifg=orange1      
+" hi default   hlLevel2 ctermfg=green       guifg=yellow1      
+" hi default   hlLevel3 ctermfg=cyan        guifg=gold
+" hi default   hlLevel4 ctermfg=magenta     guifg=hotpink
+" hi default   hlLevel5 ctermfg=red         guifg=PeachPuff1
+" hi default   hlLevel6 ctermfg=yellow      guifg=cyan1        
+" hi default   hlLevel7 ctermfg=green       guifg=slateblue1   
+" hi default   hlLevel8 ctermfg=cyan        guifg=magenta1     
+" hi default   hlLevel9 ctermfg=magenta     guifg=purple1
+"else
+" hi default   hlLevel0 ctermfg=red         guifg=red3
+" hi default   hlLevel1 ctermfg=darkyellow  guifg=orangered3
+" hi default   hlLevel2 ctermfg=darkgreen   guifg=orange2
+" hi default   hlLevel3 ctermfg=blue        guifg=yellow3
+" hi default   hlLevel4 ctermfg=darkmagenta guifg=olivedrab4
+" hi default   hlLevel5 ctermfg=red         guifg=green4
+" hi default   hlLevel6 ctermfg=darkyellow  guifg=paleturquoise3
+" hi default   hlLevel7 ctermfg=darkgreen   guifg=deepskyblue4
+" hi default   hlLevel8 ctermfg=blue        guifg=darkslateblue
+" hi default   hlLevel9 ctermfg=darkmagenta guifg=darkviolet
+"endif
+
+" ---------------------------------------------------------------------
+"  Modelines: {{{1
+let &cpo= keepcpo
+" vim: fdm=marker ft=vim ts=4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/rb.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+aftersyntax.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/rb/marker.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../marker.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/rb/rainbow.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../rainbow.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/tex.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+aftersyntax.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/tex/marker.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../marker.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/after/syntax/tex/rainbow.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1 @@
+../rainbow.vim
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/autoload/Align.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1029 @@
+" Align: tool to align multiple fields based on one or more separators
+"   Author:		Charles E. Campbell, Jr.
+"   Date:		Mar 03, 2009
+"   Version:	35
+" GetLatestVimScripts: 294 1 :AutoInstall: Align.vim
+" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim
+" Copyright:    Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1
+"               Permission is hereby granted to use and distribute this code,
+"               with or without modifications, provided that this copyright
+"               notice is copied with it. Like anything else that's free,
+"               Align.vim is provided *as is* and comes with no warranty
+"               of any kind, either expressed or implied. By using this
+"               plugin, you agree that in no event will the copyright
+"               holder be liable for any damages resulting from the use
+"               of this software.
+"
+" Romans 1:16,17a : For I am not ashamed of the gospel of Christ, for it is {{{1
+" the power of God for salvation for everyone who believes; for the Jew first,
+" and also for the Greek.  For in it is revealed God's righteousness from
+" faith to faith.
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if exists("g:loaded_Align") || &cp
+ finish
+endif
+let g:loaded_Align = "v35"
+if v:version < 700
+ echohl WarningMsg
+ echo "***warning*** this version of Align needs vim 7.0"
+ echohl Normal
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+"DechoTabOn
+
+" ---------------------------------------------------------------------
+" Debugging Support: {{{1
+"if !exists("g:loaded_Decho") | runtime plugin/Decho.vim | endif
+
+" ---------------------------------------------------------------------
+" Options: {{{1
+if !exists("g:Align_xstrlen")
+ if &enc == "latin1" || $LANG == "en_US.UTF-8" || !has("multi_byte")
+  let g:Align_xstrlen= 0
+ else
+  let g:Align_xstrlen= 1
+ endif
+endif
+
+" ---------------------------------------------------------------------
+" Align#AlignCtrl: enter alignment patterns here {{{1
+"
+"   Styles   =  all alignment-break patterns are equivalent
+"            C  cycle through alignment-break pattern(s)
+"            l  left-justified alignment
+"            r  right-justified alignment
+"            c  center alignment
+"            -  skip separator, treat as part of field
+"            :  treat rest of line as field
+"            +  repeat previous [lrc] style
+"            <  left justify separators
+"            >  right justify separators
+"            |  center separators
+"
+"   Builds   =  s:AlignPat  s:AlignCtrl  s:AlignPatQty
+"            C  s:AlignPat  s:AlignCtrl  s:AlignPatQty
+"            p  s:AlignPrePad
+"            P  s:AlignPostPad
+"            w  s:AlignLeadKeep
+"            W  s:AlignLeadKeep
+"            I  s:AlignLeadKeep
+"            l  s:AlignStyle
+"            r  s:AlignStyle
+"            -  s:AlignStyle
+"            +  s:AlignStyle
+"            :  s:AlignStyle
+"            c  s:AlignStyle
+"            g  s:AlignGPat
+"            v  s:AlignVPat
+"            <  s:AlignSep
+"            >  s:AlignSep
+"            |  s:AlignSep
+fun! Align#AlignCtrl(...)
+
+"  call Dfunc("AlignCtrl(...) a:0=".a:0)
+
+  " save options that will be changed
+  let keep_search = @/
+  let keep_ic     = &ic
+
+  " turn ignorecase off
+  set noic
+
+  " clear visual mode so that old visual-mode selections don't
+  " get applied to new invocations of Align().
+  if v:version < 602
+   if !exists("s:Align_gavemsg")
+	let s:Align_gavemsg= 1
+    echomsg "Align needs at least Vim version 6.2 to clear visual-mode selection"
+   endif
+  elseif exists("s:dovisclear")
+"   call Decho("clearing visual mode a:0=".a:0." a:1<".a:1.">")
+   let clearvmode= visualmode(1)
+  endif
+
+  " set up a list akin to an argument list
+  if a:0 > 0
+   let A= s:QArgSplitter(a:1)
+  else
+   let A=[0]
+  endif
+
+  if A[0] > 0
+   let style = A[1]
+
+   " Check for bad separator patterns (zero-length matches)
+   " (but zero-length patterns for g/v is ok)
+   if style !~# '[gv]'
+    let ipat= 2
+    while ipat <= A[0]
+     if "" =~ A[ipat]
+      echoerr "AlignCtrl: separator<".A[ipat]."> matches zero-length string"
+	  let &ic= keep_ic
+"      call Dret("AlignCtrl")
+      return
+     endif
+     let ipat= ipat + 1
+    endwhile
+   endif
+  endif
+
+"  call Decho("AlignCtrl() A[0]=".A[0])
+  if !exists("s:AlignStyle")
+   let s:AlignStyle= "l"
+  endif
+  if !exists("s:AlignPrePad")
+   let s:AlignPrePad= 0
+  endif
+  if !exists("s:AlignPostPad")
+   let s:AlignPostPad= 0
+  endif
+  if !exists("s:AlignLeadKeep")
+   let s:AlignLeadKeep= 'w'
+  endif
+
+  if A[0] == 0
+   " ----------------------
+   " List current selection
+   " ----------------------
+   if !exists("s:AlignPatQty")
+	let s:AlignPatQty= 0
+   endif
+   echo "AlignCtrl<".s:AlignCtrl."> qty=".s:AlignPatQty." AlignStyle<".s:AlignStyle."> Padding<".s:AlignPrePad."|".s:AlignPostPad."> LeadingWS=".s:AlignLeadKeep." AlignSep=".s:AlignSep
+"   call Decho("AlignCtrl<".s:AlignCtrl."> qty=".s:AlignPatQty." AlignStyle<".s:AlignStyle."> Padding<".s:AlignPrePad."|".s:AlignPostPad."> LeadingWS=".s:AlignLeadKeep." AlignSep=".s:AlignSep)
+   if      exists("s:AlignGPat") && !exists("s:AlignVPat")
+	echo "AlignGPat<".s:AlignGPat.">"
+   elseif !exists("s:AlignGPat") &&  exists("s:AlignVPat")
+	echo "AlignVPat<".s:AlignVPat.">"
+   elseif exists("s:AlignGPat") &&  exists("s:AlignVPat")
+	echo "AlignGPat<".s:AlignGPat."> AlignVPat<".s:AlignVPat.">"
+   endif
+   let ipat= 1
+   while ipat <= s:AlignPatQty
+	echo "Pat".ipat."<".s:AlignPat_{ipat}.">"
+"	call Decho("Pat".ipat."<".s:AlignPat_{ipat}.">")
+	let ipat= ipat + 1
+   endwhile
+
+  else
+   " ----------------------------------
+   " Process alignment control settings
+   " ----------------------------------
+"   call Decho("process the alignctrl settings")
+"   call Decho("style<".style.">")
+
+   if style ==? "default"
+     " Default:  preserve initial leading whitespace, left-justified,
+     "           alignment on '=', one space padding on both sides
+	 if exists("s:AlignCtrlStackQty")
+	  " clear AlignCtrl stack
+      while s:AlignCtrlStackQty > 0
+	   call Align#AlignPop()
+	  endwhile
+	  unlet s:AlignCtrlStackQty
+	 endif
+	 " Set AlignCtrl to its default value
+     call Align#AlignCtrl("Ilp1P1=<",'=')
+	 call Align#AlignCtrl("g")
+	 call Align#AlignCtrl("v")
+	 let s:dovisclear = 1
+	 let &ic          = keep_ic
+	 let @/           = keep_search
+"     call Dret("AlignCtrl")
+	 return
+   endif
+
+   if style =~# 'm'
+	" map support: Do an AlignPush now and the next call to Align()
+	"              will do an AlignPop at exit
+"	call Decho("style case m: do AlignPush")
+	call Align#AlignPush()
+	let s:DoAlignPop= 1
+   endif
+
+   " = : record a list of alignment patterns that are equivalent
+   if style =~# "="
+"	call Decho("style case =: record list of equiv alignment patterns")
+    let s:AlignCtrl  = '='
+	if A[0] >= 2
+     let s:AlignPatQty= 1
+     let s:AlignPat_1 = A[2]
+     let ipat         = 3
+     while ipat <= A[0]
+      let s:AlignPat_1 = s:AlignPat_1.'\|'.A[ipat]
+      let ipat         = ipat + 1
+     endwhile
+     let s:AlignPat_1= '\('.s:AlignPat_1.'\)'
+"     call Decho("AlignCtrl<".s:AlignCtrl."> AlignPat<".s:AlignPat_1.">")
+	endif
+
+    "c : cycle through alignment pattern(s)
+   elseif style =~# 'C'
+"	call Decho("style case C: cycle through alignment pattern(s)")
+    let s:AlignCtrl  = 'C'
+	if A[0] >= 2
+     let s:AlignPatQty= A[0] - 1
+     let ipat         = 1
+     while ipat < A[0]
+      let s:AlignPat_{ipat}= A[ipat+1]
+"     call Decho("AlignCtrl<".s:AlignCtrl."> AlignQty=".s:AlignPatQty." AlignPat_".ipat."<".s:AlignPat_{ipat}.">")
+      let ipat= ipat + 1
+     endwhile
+	endif
+   endif
+
+   if style =~# 'p'
+    let s:AlignPrePad= substitute(style,'^.*p\(\d\+\).*$','\1','')
+"	call Decho("style case p".s:AlignPrePad.": pre-separator padding")
+    if s:AlignPrePad == ""
+     echoerr "AlignCtrl: 'p' needs to be followed by a numeric argument'
+     let @/ = keep_search
+	 let &ic= keep_ic
+"     call Dret("AlignCtrl")
+     return
+	endif
+   endif
+
+   if style =~# 'P'
+    let s:AlignPostPad= substitute(style,'^.*P\(\d\+\).*$','\1','')
+"	call Decho("style case P".s:AlignPostPad.": post-separator padding")
+    if s:AlignPostPad == ""
+     echoerr "AlignCtrl: 'P' needs to be followed by a numeric argument'
+     let @/ = keep_search
+	 let &ic= keep_ic
+"     call Dret("AlignCtrl")
+     return
+	endif
+   endif
+
+   if     style =~# 'w'
+"	call Decho("style case w: ignore leading whitespace")
+	let s:AlignLeadKeep= 'w'
+   elseif style =~# 'W'
+"	call Decho("style case w: keep leading whitespace")
+	let s:AlignLeadKeep= 'W'
+   elseif style =~# 'I'
+"	call Decho("style case w: retain initial leading whitespace")
+	let s:AlignLeadKeep= 'I'
+   endif
+
+   if style =~# 'g'
+	" first list item is a "g" selector pattern
+"	call Decho("style case g: global selector pattern")
+	if A[0] < 2
+	 if exists("s:AlignGPat")
+	  unlet s:AlignGPat
+"	  call Decho("unlet s:AlignGPat")
+	 endif
+	else
+	 let s:AlignGPat= A[2]
+"	 call Decho("s:AlignGPat<".s:AlignGPat.">")
+	endif
+   elseif style =~# 'v'
+	" first list item is a "v" selector pattern
+"	call Decho("style case v: global selector anti-pattern")
+	if A[0] < 2
+	 if exists("s:AlignVPat")
+	  unlet s:AlignVPat
+"	  call Decho("unlet s:AlignVPat")
+	 endif
+	else
+	 let s:AlignVPat= A[2]
+"	 call Decho("s:AlignVPat<".s:AlignVPat.">")
+	endif
+   endif
+
+    "[-lrc+:] : set up s:AlignStyle
+   if style =~# '[-lrc+:]'
+"	call Decho("style case [-lrc+:]: field justification")
+    let s:AlignStyle= substitute(style,'[^-lrc:+]','','g')
+"    call Decho("AlignStyle<".s:AlignStyle.">")
+   endif
+
+   "[<>|] : set up s:AlignSep
+   if style =~# '[<>|]'
+"	call Decho("style case [-lrc+:]: separator justification")
+	let s:AlignSep= substitute(style,'[^<>|]','','g')
+"	call Decho("AlignSep ".s:AlignSep)
+   endif
+  endif
+
+  " sanity
+  if !exists("s:AlignCtrl")
+   let s:AlignCtrl= '='
+  endif
+
+  " restore search and options
+  let @/ = keep_search
+  let &ic= keep_ic
+
+"  call Dret("AlignCtrl ".s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle)
+  return s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle
+endfun
+
+" ---------------------------------------------------------------------
+" s:MakeSpace: returns a string with spacecnt blanks {{{1
+fun! s:MakeSpace(spacecnt)
+"  call Dfunc("MakeSpace(spacecnt=".a:spacecnt.")")
+  let str      = ""
+  let spacecnt = a:spacecnt
+  while spacecnt > 0
+   let str      = str . " "
+   let spacecnt = spacecnt - 1
+  endwhile
+"  call Dret("MakeSpace <".str.">")
+  return str
+endfun
+
+" ---------------------------------------------------------------------
+" Align#Align: align selected text based on alignment pattern(s) {{{1
+fun! Align#Align(hasctrl,...) range
+"  call Dfunc("Align#Align(hasctrl=".a:hasctrl.",...) a:0=".a:0)
+
+  " sanity checks
+  if string(a:hasctrl) != "0" && string(a:hasctrl) != "1"
+   echohl Error|echo 'usage: Align#Align(hasctrl<'.a:hasctrl.'> (should be 0 or 1),"separator(s)"  (you have '.a:0.') )'|echohl None
+"   call Dret("Align#Align")
+   return
+  endif
+  if exists("s:AlignStyle") && s:AlignStyle == ":"
+   echohl Error |echo '(Align#Align) your AlignStyle is ":", which implies "do-no-alignment"!'|echohl None
+"   call Dret("Align#Align")
+   return
+  endif
+
+  " set up a list akin to an argument list
+  if a:0 > 0
+   let A= s:QArgSplitter(a:1)
+  else
+   let A=[0]
+  endif
+
+  " if :Align! was used, then the first argument is (should be!) an AlignCtrl string
+  " Note that any alignment control set this way will be temporary.
+  let hasctrl= a:hasctrl
+"  call Decho("hasctrl=".hasctrl)
+  if a:hasctrl && A[0] >= 1
+"   call Decho("Align! : using A[1]<".A[1]."> for AlignCtrl")
+   if A[1] =~ '[gv]'
+   	let hasctrl= hasctrl + 1
+	call Align#AlignCtrl('m')
+    call Align#AlignCtrl(A[1],A[2])
+"    call Decho("Align! : also using A[2]<".A[2]."> for AlignCtrl")
+   elseif A[1] !~ 'm'
+    call Align#AlignCtrl(A[1]."m")
+   else
+    call Align#AlignCtrl(A[1])
+   endif
+  endif
+
+  " Check for bad separator patterns (zero-length matches)
+  let ipat= 1 + hasctrl
+  while ipat <= A[0]
+   if "" =~ A[ipat]
+	echoerr "Align: separator<".A[ipat]."> matches zero-length string"
+"    call Dret("Align#Align")
+	return
+   endif
+   let ipat= ipat + 1
+  endwhile
+
+  " record current search pattern for subsequent restoration
+  let keep_search= @/
+  let keep_ic    = &ic
+  let keep_report= &report
+  set noic report=10000
+
+  if A[0] > hasctrl
+  " Align will accept a list of separator regexps
+"   call Decho("A[0]=".A[0].": accepting list of separator regexp")
+
+   if s:AlignCtrl =~# "="
+   	"= : consider all separators to be equivalent
+"    call Decho("AlignCtrl: record list of equivalent alignment patterns")
+    let s:AlignCtrl  = '='
+    let s:AlignPat_1 = A[1 + hasctrl]
+    let s:AlignPatQty= 1
+    let ipat         = 2 + hasctrl
+    while ipat <= A[0]
+     let s:AlignPat_1 = s:AlignPat_1.'\|'.A[ipat]
+     let ipat         = ipat + 1
+    endwhile
+    let s:AlignPat_1= '\('.s:AlignPat_1.'\)'
+"    call Decho("AlignCtrl<".s:AlignCtrl."> AlignPat<".s:AlignPat_1.">")
+
+   elseif s:AlignCtrl =~# 'C'
+    "c : cycle through alignment pattern(s)
+"    call Decho("AlignCtrl: cycle through alignment pattern(s)")
+    let s:AlignCtrl  = 'C'
+    let s:AlignPatQty= A[0] - hasctrl
+    let ipat         = 1
+    while ipat <= s:AlignPatQty
+     let s:AlignPat_{ipat}= A[(ipat + hasctrl)]
+"     call Decho("AlignCtrl<".s:AlignCtrl."> AlignQty=".s:AlignPatQty." AlignPat_".ipat."<".s:AlignPat_{ipat}.">")
+     let ipat= ipat + 1
+    endwhile
+   endif
+  endif
+
+  " Initialize so that begline<endline and begcol<endcol.
+  " Ragged right: check if the column associated with '< or '>
+  "               is greater than the line's string length -> ragged right.
+  " Have to be careful about visualmode() -- it returns the last visual
+  " mode used whether or not it was used currently.
+  let begcol   = virtcol("'<")-1
+  let endcol   = virtcol("'>")-1
+  if begcol > endcol
+   let begcol  = virtcol("'>")-1
+   let endcol  = virtcol("'<")-1
+  endif
+"  call Decho("begcol=".begcol." endcol=".endcol)
+  let begline  = a:firstline
+  let endline  = a:lastline
+  if begline > endline
+   let begline = a:lastline
+   let endline = a:firstline
+  endif
+"  call Decho("begline=".begline." endline=".endline)
+  let fieldcnt = 0
+  if (begline == line("'>") && endline == line("'<")) || (begline == line("'<") && endline == line("'>"))
+   let vmode= visualmode()
+"   call Decho("vmode=".vmode)
+   if vmode == "\<c-v>"
+	if exists("g:Align_xstrlen") && g:Align_xstrlen
+     let ragged   = ( col("'>") > s:Strlen(getline("'>")) || col("'<") > s:Strlen(getline("'<")) )
+	else
+     let ragged   = ( col("'>") > strlen(getline("'>")) || col("'<") > strlen(getline("'<")) )
+	endif
+   else
+	let ragged= 1
+   endif
+  else
+   let ragged= 1
+  endif
+  if ragged
+   let begcol= 0
+  endif
+"  call Decho("lines[".begline.",".endline."] col[".begcol.",".endcol."] ragged=".ragged." AlignCtrl<".s:AlignCtrl.">")
+
+  " Keep user options
+  let etkeep   = &l:et
+  let pastekeep= &l:paste
+  setlocal et paste
+
+  " convert selected range of lines to use spaces instead of tabs
+  " but if first line's initial white spaces are to be retained
+  " then use 'em
+  if begcol <= 0 && s:AlignLeadKeep == 'I'
+   " retain first leading whitespace for all subsequent lines
+   let bgntxt= substitute(getline(begline),'^\(\s*\).\{-}$','\1','')
+"   call Decho("retaining 1st leading whitespace: bgntxt<".bgntxt.">")
+   set noet
+  endif
+  exe begline.",".endline."ret"
+
+  " Execute two passes
+  " First  pass: collect alignment data (max field sizes)
+  " Second pass: perform alignment
+  let pass= 1
+  while pass <= 2
+"   call Decho(" ")
+"   call Decho("---- Pass ".pass.": ----")
+
+   let line= begline
+   while line <= endline
+    " Process each line
+    let txt = getline(line)
+"    call Decho(" ")
+"    call Decho("Pass".pass.": Line ".line." <".txt.">")
+
+    " AlignGPat support: allows a selector pattern (akin to g/selector/cmd )
+    if exists("s:AlignGPat")
+"	 call Decho("Pass".pass.": AlignGPat<".s:AlignGPat.">")
+	 if match(txt,s:AlignGPat) == -1
+"	  call Decho("Pass".pass.": skipping")
+	  let line= line + 1
+	  continue
+	 endif
+    endif
+
+    " AlignVPat support: allows a selector pattern (akin to v/selector/cmd )
+    if exists("s:AlignVPat")
+"	 call Decho("Pass".pass.": AlignVPat<".s:AlignVPat.">")
+	 if match(txt,s:AlignVPat) != -1
+"	  call Decho("Pass".pass.": skipping")
+	  let line= line + 1
+	  continue
+	 endif
+    endif
+
+	" Always skip blank lines
+	if match(txt,'^\s*$') != -1
+"	  call Decho("Pass".pass.": skipping")
+	 let line= line + 1
+	 continue
+	endif
+
+    " Extract visual-block selected text (init bgntxt, endtxt)
+	if exists("g:Align_xstrlen") && g:Align_xstrlen
+     let txtlen= s:Strlen(txt)
+	else
+     let txtlen= strlen(txt)
+	endif
+    if begcol > 0
+	 " Record text to left of selected area
+     let bgntxt= strpart(txt,0,begcol)
+"	  call Decho("Pass".pass.": record text to left: bgntxt<".bgntxt.">")
+    elseif s:AlignLeadKeep == 'W'
+	 let bgntxt= substitute(txt,'^\(\s*\).\{-}$','\1','')
+"	  call Decho("Pass".pass.": retaining all leading ws: bgntxt<".bgntxt.">")
+    elseif s:AlignLeadKeep == 'w' || !exists("bgntxt")
+	 " No beginning text
+	 let bgntxt= ""
+"	  call Decho("Pass".pass.": no beginning text")
+    endif
+    if ragged
+	 let endtxt= ""
+    else
+     " Elide any text lying outside selected columnar region
+     let endtxt= strpart(txt,endcol+1,txtlen-endcol)
+     let txt   = strpart(txt,begcol,endcol-begcol+1)
+    endif
+"    call Decho(" ")
+"    call Decho("Pass".pass.": bgntxt<".bgntxt.">")
+"    call Decho("Pass".pass.":    txt<". txt  .">")
+"    call Decho("Pass".pass.": endtxt<".endtxt.">")
+	if !exists("s:AlignPat_{1}")
+	 echohl Error|echo "no separators specified!"|echohl None
+"     call Dret("Align#Align")
+	 return
+	endif
+
+    " Initialize for both passes
+    let seppat      = s:AlignPat_{1}
+    let ifield      = 1
+    let ipat        = 1
+    let bgnfield    = 0
+    let endfield    = 0
+    let alignstyle  = s:AlignStyle
+    let doend       = 1
+	let newtxt      = ""
+    let alignprepad = s:AlignPrePad
+    let alignpostpad= s:AlignPostPad
+	let alignsep    = s:AlignSep
+	let alignophold = " "
+	let alignop     = "l"
+"	call Decho("Pass".pass.": initial alignstyle<".alignstyle."> seppat<".seppat.">")
+
+    " Process each field on the line
+    while doend > 0
+
+	  " C-style: cycle through pattern(s)
+     if s:AlignCtrl == 'C' && doend == 1
+	  let seppat   = s:AlignPat_{ipat}
+"	  call Decho("Pass".pass.": processing field: AlignCtrl=".s:AlignCtrl." ipat=".ipat." seppat<".seppat.">")
+	  let ipat     = ipat + 1
+	  if ipat > s:AlignPatQty
+	   let ipat = 1
+	  endif
+     endif
+
+	 " cyclic alignment/justification operator handling
+	 let alignophold  = alignop
+	 let alignop      = strpart(alignstyle,0,1)
+	 if alignop == '+' || doend == 2
+	  let alignop= alignophold
+	 else
+	  let alignstyle   = strpart(alignstyle,1).strpart(alignstyle,0,1)
+	  let alignopnxt   = strpart(alignstyle,0,1)
+	  if alignop == ':'
+	   let seppat  = '$'
+	   let doend   = 2
+"	   call Decho("Pass".pass.": alignop<:> case: setting seppat<$> doend==2")
+	  endif
+	 endif
+
+	 " cylic separator alignment specification handling
+	 let alignsepop= strpart(alignsep,0,1)
+	 let alignsep  = strpart(alignsep,1).alignsepop
+
+	 " mark end-of-field and the subsequent end-of-separator.
+	 " Extend field if alignop is '-'
+     let endfield = match(txt,seppat,bgnfield)
+	 let sepfield = matchend(txt,seppat,bgnfield)
+     let skipfield= sepfield
+"	 call Decho("Pass".pass.": endfield=match(txt<".txt.">,seppat<".seppat.">,bgnfield=".bgnfield.")=".endfield)
+	 while alignop == '-' && endfield != -1
+	  let endfield  = match(txt,seppat,skipfield)
+	  let sepfield  = matchend(txt,seppat,skipfield)
+	  let skipfield = sepfield
+	  let alignop   = strpart(alignstyle,0,1)
+	  let alignstyle= strpart(alignstyle,1).strpart(alignstyle,0,1)
+"	  call Decho("Pass".pass.": extend field: endfield<".strpart(txt,bgnfield,endfield-bgnfield)."> alignop<".alignop."> alignstyle<".alignstyle.">")
+	 endwhile
+	 let seplen= sepfield - endfield
+"	 call Decho("Pass".pass.": seplen=[sepfield=".sepfield."] - [endfield=".endfield."]=".seplen)
+
+	 if endfield != -1
+	  if pass == 1
+	   " ---------------------------------------------------------------------
+	   " Pass 1: Update FieldSize to max
+"	   call Decho("Pass".pass.": before lead/trail remove: field<".strpart(txt,bgnfield,endfield-bgnfield).">")
+	   let field      = substitute(strpart(txt,bgnfield,endfield-bgnfield),'^\s*\(.\{-}\)\s*$','\1','')
+       if s:AlignLeadKeep == 'W'
+	    let field = bgntxt.field
+	    let bgntxt= ""
+	   endif
+	   if exists("g:Align_xstrlen") && g:Align_xstrlen
+	    let fieldlen   = s:Strlen(field)
+	   else
+	    let fieldlen   = strlen(field)
+	   endif
+	   let sFieldSize = "FieldSize_".ifield
+	   if !exists(sFieldSize)
+	    let FieldSize_{ifield}= fieldlen
+"	    call Decho("Pass".pass.":  set FieldSize_{".ifield."}=".FieldSize_{ifield}." <".field.">")
+	   elseif fieldlen > FieldSize_{ifield}
+	    let FieldSize_{ifield}= fieldlen
+"	    call Decho("Pass".pass.": oset FieldSize_{".ifield."}=".FieldSize_{ifield}." <".field.">")
+	   endif
+	   let sSepSize= "SepSize_".ifield
+	   if !exists(sSepSize)
+		let SepSize_{ifield}= seplen
+"	    call Decho(" set SepSize_{".ifield."}=".SepSize_{ifield}." <".field.">")
+	   elseif seplen > SepSize_{ifield}
+		let SepSize_{ifield}= seplen
+"	    call Decho("Pass".pass.": oset SepSize_{".ifield."}=".SepSize_{ifield}." <".field.">")
+	   endif
+
+	  else
+	   " ---------------------------------------------------------------------
+	   " Pass 2: Perform Alignment
+	   let prepad       = strpart(alignprepad,0,1)
+	   let postpad      = strpart(alignpostpad,0,1)
+	   let alignprepad  = strpart(alignprepad,1).strpart(alignprepad,0,1)
+	   let alignpostpad = strpart(alignpostpad,1).strpart(alignpostpad,0,1)
+	   let field        = substitute(strpart(txt,bgnfield,endfield-bgnfield),'^\s*\(.\{-}\)\s*$','\1','')
+       if s:AlignLeadKeep == 'W'
+	    let field = bgntxt.field
+	    let bgntxt= ""
+	   endif
+	   if doend == 2
+		let prepad = 0
+		let postpad= 0
+	   endif
+	   if exists("g:Align_xstrlen") && g:Align_xstrlen
+	    let fieldlen   = s:Strlen(field)
+	   else
+	    let fieldlen   = strlen(field)
+	   endif
+	   let sep        = s:MakeSpace(prepad).strpart(txt,endfield,sepfield-endfield).s:MakeSpace(postpad)
+	   if seplen < SepSize_{ifield}
+		if alignsepop == "<"
+		 " left-justify separators
+		 let sep       = sep.s:MakeSpace(SepSize_{ifield}-seplen)
+		elseif alignsepop == ">"
+		 " right-justify separators
+		 let sep       = s:MakeSpace(SepSize_{ifield}-seplen).sep
+		else
+		 " center-justify separators
+		 let sepleft   = (SepSize_{ifield} - seplen)/2
+		 let sepright  = SepSize_{ifield} - seplen - sepleft
+		 let sep       = s:MakeSpace(sepleft).sep.s:MakeSpace(sepright)
+		endif
+	   endif
+	   let spaces     = FieldSize_{ifield} - fieldlen
+"	   call Decho("Pass".pass.": Field #".ifield."<".field."> spaces=".spaces." be[".bgnfield.",".endfield."] pad=".prepad.','.postpad." FS_".ifield."<".FieldSize_{ifield}."> sep<".sep."> ragged=".ragged." doend=".doend." alignop<".alignop.">")
+
+	    " Perform alignment according to alignment style justification
+	   if spaces > 0
+	    if     alignop == 'c'
+		 " center the field
+	     let spaceleft = spaces/2
+	     let spaceright= FieldSize_{ifield} - spaceleft - fieldlen
+	     let newtxt    = newtxt.s:MakeSpace(spaceleft).field.s:MakeSpace(spaceright).sep
+	    elseif alignop == 'r'
+		 " right justify the field
+	     let newtxt= newtxt.s:MakeSpace(spaces).field.sep
+	    elseif ragged && doend == 2
+		 " left justify rightmost field (no trailing blanks needed)
+	     let newtxt= newtxt.field
+		else
+		 " left justfiy the field
+	     let newtxt= newtxt.field.s:MakeSpace(spaces).sep
+	    endif
+	   elseif ragged && doend == 2
+		" field at maximum field size and no trailing blanks needed
+	    let newtxt= newtxt.field
+	   else
+		" field is at maximum field size already
+	    let newtxt= newtxt.field.sep
+	   endif
+"	   call Decho("Pass".pass.": newtxt<".newtxt.">")
+	  endif	" pass 1/2
+
+	  " bgnfield indexes to end of separator at right of current field
+	  " Update field counter
+	  let bgnfield= sepfield
+      let ifield  = ifield + 1
+	  if doend == 2
+	   let doend= 0
+	  endif
+	   " handle end-of-text as end-of-field
+	 elseif doend == 1
+	  let seppat  = '$'
+	  let doend   = 2
+	 else
+	  let doend   = 0
+	 endif		" endfield != -1
+    endwhile	" doend loop (as well as regularly separated fields)
+
+	if pass == 2
+	 " Write altered line to buffer
+"     call Decho("Pass".pass.": bgntxt<".bgntxt."> line=".line)
+"     call Decho("Pass".pass.": newtxt<".newtxt.">")
+"     call Decho("Pass".pass.": endtxt<".endtxt.">")
+	 call setline(line,bgntxt.newtxt.endtxt)
+	endif
+
+    let line = line + 1
+   endwhile	" line loop
+
+   let pass= pass + 1
+  endwhile	" pass loop
+"  call Decho("end of two pass loop")
+
+  " Restore user options
+  let &l:et    = etkeep
+  let &l:paste = pastekeep
+
+  if exists("s:DoAlignPop")
+   " AlignCtrl Map support
+   call Align#AlignPop()
+   unlet s:DoAlignPop
+  endif
+
+  " restore current search pattern
+  let @/      = keep_search
+  let &ic     = keep_ic
+  let &report = keep_report
+
+"  call Dret("Align#Align")
+  return
+endfun
+
+" ---------------------------------------------------------------------
+" Align#AlignPush: this command/function pushes an alignment control string onto a stack {{{1
+fun! Align#AlignPush()
+"  call Dfunc("AlignPush()")
+
+  " initialize the stack
+  if !exists("s:AlignCtrlStackQty")
+   let s:AlignCtrlStackQty= 1
+  else
+   let s:AlignCtrlStackQty= s:AlignCtrlStackQty + 1
+  endif
+
+  " construct an AlignCtrlStack entry
+  if !exists("s:AlignSep")
+   let s:AlignSep= ''
+  endif
+  let s:AlignCtrlStack_{s:AlignCtrlStackQty}= s:AlignCtrl.'p'.s:AlignPrePad.'P'.s:AlignPostPad.s:AlignLeadKeep.s:AlignStyle.s:AlignSep
+"  call Decho("AlignPush: AlignCtrlStack_".s:AlignCtrlStackQty."<".s:AlignCtrlStack_{s:AlignCtrlStackQty}.">")
+
+  " push [GV] patterns onto their own stack
+  if exists("s:AlignGPat")
+   let s:AlignGPat_{s:AlignCtrlStackQty}= s:AlignGPat
+  else
+   let s:AlignGPat_{s:AlignCtrlStackQty}=  ""
+  endif
+  if exists("s:AlignVPat")
+   let s:AlignVPat_{s:AlignCtrlStackQty}= s:AlignVPat
+  else
+   let s:AlignVPat_{s:AlignCtrlStackQty}=  ""
+  endif
+
+"  call Dret("AlignPush")
+endfun
+
+" ---------------------------------------------------------------------
+" Align#AlignPop: this command/function pops an alignment pattern from a stack {{{1
+"           and into the AlignCtrl variables.
+fun! Align#AlignPop()
+"  call Dfunc("Align#AlignPop()")
+
+  " sanity checks
+  if !exists("s:AlignCtrlStackQty")
+   echoerr "AlignPush needs to be used prior to AlignPop"
+"   call Dret("Align#AlignPop <> : AlignPush needs to have been called first")
+   return ""
+  endif
+  if s:AlignCtrlStackQty <= 0
+   unlet s:AlignCtrlStackQty
+   echoerr "AlignPush needs to be used prior to AlignPop"
+"   call Dret("Align#AlignPop <> : AlignPop needs to have been called first")
+   return ""
+  endif
+
+  " pop top of AlignCtrlStack and pass value to AlignCtrl
+  let retval=s:AlignCtrlStack_{s:AlignCtrlStackQty}
+  unlet s:AlignCtrlStack_{s:AlignCtrlStackQty}
+  call Align#AlignCtrl(retval)
+
+  " pop G pattern stack
+  if s:AlignGPat_{s:AlignCtrlStackQty} != ""
+   call Align#AlignCtrl('g',s:AlignGPat_{s:AlignCtrlStackQty})
+  else
+   call Align#AlignCtrl('g')
+  endif
+  unlet s:AlignGPat_{s:AlignCtrlStackQty}
+
+  " pop V pattern stack
+  if s:AlignVPat_{s:AlignCtrlStackQty} != ""
+   call Align#AlignCtrl('v',s:AlignVPat_{s:AlignCtrlStackQty})
+  else
+   call Align#AlignCtrl('v')
+  endif
+
+  unlet s:AlignVPat_{s:AlignCtrlStackQty}
+  let s:AlignCtrlStackQty= s:AlignCtrlStackQty - 1
+
+"  call Dret("Align#AlignPop <".retval."> : AlignCtrlStackQty=".s:AlignCtrlStackQty)
+  return retval
+endfun
+
+" ---------------------------------------------------------------------
+" Align#AlignReplaceQuotedSpaces: {{{1
+fun! Align#AlignReplaceQuotedSpaces() 
+"  call Dfunc("AlignReplaceQuotedSpaces()")
+
+  let l:line          = getline(line("."))
+  if exists("g:Align_xstrlen") && g:Align_xstrlen
+   let l:linelen      = s:Strlen(l:line)
+  else
+   let l:linelen      = strlen(l:line)
+  endif
+  let l:startingPos   = 0
+  let l:startQuotePos = 0
+  let l:endQuotePos   = 0
+  let l:spacePos      = 0
+  let l:quoteRe       = '\\\@<!"'
+
+"  "call Decho("in replace spaces.  line=" . line('.'))
+  while (1)
+    let l:startQuotePos = match(l:line, l:quoteRe, l:startingPos)
+    if (l:startQuotePos < 0) 
+"      "call Decho("No more quotes to the end of line")
+      break
+    endif
+    let l:endQuotePos = match(l:line, l:quoteRe, l:startQuotePos + 1)
+    if (l:endQuotePos < 0)
+"      "call Decho("Mismatched quotes")
+      break
+    endif
+    let l:spaceReplaceRe = '^.\{' . (l:startQuotePos + 1) . '}.\{-}\zs\s\ze.*.\{' . (linelen - l:endQuotePos) . '}$'
+"    "call Decho('spaceReplaceRe="' . l:spaceReplaceRe . '"')
+    let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '')
+    while (l:newStr != l:line)
+"      "call Decho('newstr="' . l:newStr . '"')
+      let l:line = l:newStr
+      let l:newStr = substitute(l:line, l:spaceReplaceRe, '%', '')
+    endwhile
+    let l:startingPos = l:endQuotePos + 1
+  endwhile
+  call setline(line('.'), l:line)
+
+"  call Dret("AlignReplaceQuotedSpaces")
+endfun
+
+" ---------------------------------------------------------------------
+" s:QArgSplitter: to avoid \ processing by <f-args>, <q-args> is needed. {{{1
+" However, <q-args> doesn't split at all, so this function returns a list
+" of arguments which has been:
+"   * split at whitespace
+"   * unless inside "..."s.  One may escape characters with a backslash inside double quotes.
+" along with a leading length-of-list.
+"
+"   Examples:   %Align "\""   will align on "s
+"               %Align " "    will align on spaces
+"
+" The resulting list:  qarglist[0] corresponds to a:0
+"                      qarglist[i] corresponds to a:{i}
+fun! s:QArgSplitter(qarg)
+"  call Dfunc("s:QArgSplitter(qarg<".a:qarg.">)")
+
+  if a:qarg =~ '".*"'
+   " handle "..." args, which may include whitespace
+   let qarglist = []
+   let args     = a:qarg
+"   call Decho("handle quoted arguments: args<".args.">")
+   while args != ""
+	let iarg   = 0
+	let arglen = strlen(args)
+"	call Decho("args[".iarg."]<".args[iarg]."> arglen=".arglen)
+	" find index to first not-escaped '"'
+	while args[iarg] != '"' && iarg < arglen
+	 if args[iarg] == '\'
+	  let args= strpart(args,1)
+	 endif
+	 let iarg= iarg + 1
+	endwhile
+"	call Decho("args<".args."> iarg=".iarg." arglen=".arglen)
+
+	if iarg > 0
+	 " handle left of quote or remaining section
+"	 call Decho("handle left of quote or remaining section")
+	 if args[iarg] == '"'
+	  let qarglist= qarglist + split(strpart(args,0,iarg-1))
+	 else
+	  let qarglist= qarglist + split(strpart(args,0,iarg))
+	 endif
+	 let args    = strpart(args,iarg)
+	 let arglen  = strlen(args)
+
+	elseif iarg < arglen && args[0] == '"'
+	 " handle "quoted" section
+"	 call Decho("handle quoted section")
+	 let iarg= 1
+	 while args[iarg] != '"' && iarg < arglen
+	  if args[iarg] == '\'
+	   let args= strpart(args,1)
+	  endif
+	  let iarg= iarg + 1
+	 endwhile
+"	 call Decho("args<".args."> iarg=".iarg." arglen=".arglen)
+	 if args[iarg] == '"'
+	  call add(qarglist,strpart(args,1,iarg-1))
+	  let args= strpart(args,iarg+1)
+	 else
+	  let qarglist = qarglist + split(args)
+	  let args     = ""
+	 endif
+	endif
+"	call Decho("qarglist".string(qarglist)." iarg=".iarg." args<".args.">")
+   endwhile
+
+  else
+   " split at all whitespace
+   let qarglist= split(a:qarg)
+  endif
+
+  let qarglistlen= len(qarglist)
+  let qarglist   = insert(qarglist,qarglistlen)
+"  call Dret("s:QArgSplitter ".string(qarglist))
+  return qarglist
+endfun
+
+" ---------------------------------------------------------------------
+" s:Strlen: this function returns the length of a string, even if its {{{1
+"           using two-byte etc characters.
+"           Currently, its only used if g:Align_xstrlen is set to a
+"           nonzero value.  Solution from Nicolai Weibull, vim docs
+"           (:help strlen()), Tony Mechelynck, and my own invention.
+fun! s:Strlen(x)
+"  call Dfunc("s:Strlen(x<".a:x.">")
+  if g:Align_xstrlen == 1
+   " number of codepoints (Latin a + combining circumflex is two codepoints)
+   " (comment from TM, solution from NW)
+   let ret= strlen(substitute(a:x,'.','c','g'))
+
+  elseif g:Align_xstrlen == 2
+   " number of spacing codepoints (Latin a + combining circumflex is one spacing 
+   " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
+   " (comment from TM, solution from TM)
+   let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) 
+
+  elseif g:Align_xstrlen == 3
+   " virtual length (counting, for instance, tabs as anything between 1 and 
+   " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately 
+   " preceded by lam, one otherwise, etc.)
+   " (comment from TM, solution from me)
+   let modkeep= &l:mod
+   exe "norm! o\<esc>"
+   call setline(line("."),a:x)
+   let ret= virtcol("$") - 1
+   d
+   let &l:mod= modkeep
+
+  else
+   " at least give a decent default
+   ret= strlen(a:x)
+  endif
+"  call Dret("s:Strlen ".ret)
+  return ret
+endfun
+
+" ---------------------------------------------------------------------
+" Set up default values: {{{1
+"call Decho("-- Begin AlignCtrl Initialization --")
+call Align#AlignCtrl("default")
+"call Decho("-- End AlignCtrl Initialization --")
+
+" ---------------------------------------------------------------------
+"  Restore: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/autoload/AlignMaps.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,330 @@
+" AlignMaps.vim : support functions for AlignMaps
+"   Author: Charles E. Campbell, Jr.
+"   Date:   Mar 03, 2009
+" Version:           41
+" ---------------------------------------------------------------------
+"  Load Once: {{{1
+if &cp || exists("g:loaded_AlignMaps")
+ finish
+endif
+let g:loaded_AlignMaps= "v41"
+let s:keepcpo         = &cpo
+set cpo&vim
+
+" =====================================================================
+" Functions: {{{1
+
+" ---------------------------------------------------------------------
+" AlignMaps#WrapperStart: {{{2
+fun! AlignMaps#WrapperStart(vis) range
+"  call Dfunc("AlignMaps#WrapperStart(vis=".a:vis.")")
+
+  if a:vis
+   norm! '<ma'>
+  endif
+
+  if line("'y") == 0 || line("'z") == 0 || !exists("s:alignmaps_wrapcnt") || s:alignmaps_wrapcnt <= 0
+"   call Decho("wrapper initialization")
+   let s:alignmaps_wrapcnt    = 1
+   let s:alignmaps_keepgd     = &gdefault
+   let s:alignmaps_keepsearch = @/
+   let s:alignmaps_keepch     = &ch
+   let s:alignmaps_keepmy     = SaveMark("'y")
+   let s:alignmaps_keepmz     = SaveMark("'z")
+   let s:alignmaps_posn       = SaveWinPosn(0)
+   " set up fencepost blank lines
+   put =''
+   norm! mz'a
+   put! =''
+   ky
+   let s:alignmaps_zline      = line("'z")
+   exe "'y,'zs/@/\177/ge"
+  else
+"   call Decho("embedded wrapper")
+   let s:alignmaps_wrapcnt    = s:alignmaps_wrapcnt + 1
+   norm! 'yjma'zk
+  endif
+
+  " change some settings to align-standard values
+  set nogd
+  set ch=2
+  AlignPush
+  norm! 'zk
+"  call Dret("AlignMaps#WrapperStart : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
+endfun
+
+" ---------------------------------------------------------------------
+" AlignMaps#WrapperEnd:	{{{2
+fun! AlignMaps#WrapperEnd() range
+"  call Dfunc("AlignMaps#WrapperEnd() alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
+
+  " remove trailing white space introduced by whatever in the modification zone
+  'y,'zs/ \+$//e
+
+  " restore AlignCtrl settings
+  AlignPop
+
+  let s:alignmaps_wrapcnt= s:alignmaps_wrapcnt - 1
+  if s:alignmaps_wrapcnt <= 0
+   " initial wrapper ending
+   exe "'y,'zs/\177/@/ge"
+
+   " if the 'z line hasn't moved, then go ahead and restore window position
+   let zstationary= s:alignmaps_zline == line("'z")
+
+   " remove fencepost blank lines.
+   " restore 'a
+   norm! 'yjmakdd'zdd
+
+   " restore original 'y, 'z, and window positioning
+   call RestoreMark(s:alignmaps_keepmy)
+   call RestoreMark(s:alignmaps_keepmz)
+   if zstationary > 0
+    call RestoreWinPosn(s:alignmaps_posn)
+"    call Decho("restored window positioning")
+   endif
+
+   " restoration of options
+   let &gd= s:alignmaps_keepgd
+   let &ch= s:alignmaps_keepch
+   let @/ = s:alignmaps_keepsearch
+
+   " remove script variables
+   unlet s:alignmaps_keepch
+   unlet s:alignmaps_keepsearch
+   unlet s:alignmaps_keepmy
+   unlet s:alignmaps_keepmz
+   unlet s:alignmaps_keepgd
+   unlet s:alignmaps_posn
+  endif
+
+"  call Dret("AlignMaps#WrapperEnd : alignmaps_wrapcnt=".s:alignmaps_wrapcnt." my=".line("'y")." mz=".line("'z"))
+endfun
+
+" ---------------------------------------------------------------------
+" AlignMaps#StdAlign: some semi-standard align calls {{{2
+fun! AlignMaps#StdAlign(mode) range
+"  call Dfunc("AlignMaps#StdAlign(mode=".a:mode.")")
+  if     a:mode == 1
+   " align on @
+"   call Decho("align on @")
+   AlignCtrl mIp1P1=l @
+   'a,.Align
+  elseif a:mode == 2
+   " align on @, retaining all initial white space on each line
+"   call Decho("align on @, retaining all initial white space on each line")
+   AlignCtrl mWp1P1=l @
+   'a,.Align
+  elseif a:mode == 3
+   " like mode 2, but ignore /* */-style comments
+"   call Decho("like mode 2, but ignore /* */-style comments")
+   AlignCtrl v ^\s*/[/*]
+   AlignCtrl mWp1P1=l @
+   'a,.Align
+  else
+   echoerr "(AlignMaps) AlignMaps#StdAlign doesn't support mode#".a:mode
+  endif
+"  call Dret("AlignMaps#StdAlign")
+endfun
+
+" ---------------------------------------------------------------------
+" AlignMaps#CharJoiner: joins lines which end in the given character (spaces {{{2
+"             at end are ignored)
+fun! AlignMaps#CharJoiner(chr)
+"  call Dfunc("AlignMaps#CharJoiner(chr=".a:chr.")")
+  let aline = line("'a")
+  let rep   = line(".") - aline
+  while rep > 0
+  	norm! 'a
+  	while match(getline(aline),a:chr . "\s*$") != -1 && rep >= 0
+  	  " while = at end-of-line, delete it and join with next
+  	  norm! 'a$
+  	  j!
+  	  let rep = rep - 1
+  	endwhile
+  	" update rep(eat) count
+  	let rep = rep - 1
+  	if rep <= 0
+  	  " terminate loop if at end-of-block
+  	  break
+  	endif
+  	" prepare for next line
+  	norm! jma
+  	let aline = line("'a")
+  endwhile
+"  call Dret("AlignMaps#CharJoiner")
+endfun
+
+" ---------------------------------------------------------------------
+" AlignMaps#Equals: supports \t= and \T= {{{2
+fun! AlignMaps#Equals() range
+"  call Dfunc("AlignMaps#Equals()")
+  'a,'zs/\s\+\([*/+\-%|&\~^]\==\)/ \1/e
+  'a,'zs@ \+\([*/+\-%|&\~^]\)=@\1=@ge
+  'a,'zs/==/\="\<Char-0x0f>\<Char-0x0f>"/ge
+  'a,'zs/\([!<>:]\)=/\=submatch(1)."\<Char-0x0f>"/ge
+  norm g'zk
+  AlignCtrl mIp1P1=l =
+  AlignCtrl g =
+  'a,'z-1Align
+  'a,'z-1s@\([*/+\-%|&\~^!=]\)\( \+\)=@\2\1=@ge
+  'a,'z-1s/\( \+\);/;\1/ge
+  if &ft == "c" || &ft == "cpp"
+"   call Decho("exception for ".&ft)
+   'a,'z-1v/^\s*\/[*/]/s/\/[*/]/@&@/e
+   'a,'z-1v/^\s*\/[*/]/s/\*\//@&/e
+   if exists("g:mapleader")
+    exe "norm 'zk"
+    call AlignMaps#StdAlign(1)
+   else
+    exe "norm 'zk"
+    call AlignMaps#StdAlign(1)
+   endif
+   'y,'zs/^\(\s*\) @/\1/e
+  endif
+  'a,'z-1s/\%x0f/=/ge
+  'y,'zs/ @//eg
+"  call Dret("AlignMaps#Equals")
+endfun
+
+" ---------------------------------------------------------------------
+" AlignMaps#Afnc: useful for splitting one-line function beginnings {{{2
+"            into one line per argument format
+fun! AlignMaps#Afnc()
+"  call Dfunc("AlignMaps#Afnc()")
+
+  " keep display quiet
+  let chkeep = &ch
+  let gdkeep = &gd
+  let vekeep = &ve
+  set ch=2 nogd ve=
+
+  " will use marks y,z ; save current values
+  let mykeep = SaveMark("'y")
+  let mzkeep = SaveMark("'z")
+
+  " Find beginning of function -- be careful to skip over comments
+  let cmmntid  = synIDtrans(hlID("Comment"))
+  let stringid = synIDtrans(hlID("String"))
+  exe "norm! ]]"
+  while search(")","bW") != 0
+"   call Decho("line=".line(".")." col=".col("."))
+   let parenid= synIDtrans(synID(line("."),col("."),1))
+   if parenid != cmmntid && parenid != stringid
+   	break
+   endif
+  endwhile
+  norm! %my
+  s/(\s*\(\S\)/(\r  \1/e
+  exe "norm! `y%"
+  s/)\s*\(\/[*/]\)/)\r\1/e
+  exe "norm! `y%mz"
+  'y,'zs/\s\+$//e
+  'y,'zs/^\s\+//e
+  'y+1,'zs/^/  /
+
+  " insert newline after every comma only one parenthesis deep
+  sil! exe "norm! `y\<right>h"
+  let parens   = 1
+  let cmmnt    = 0
+  let cmmntline= -1
+  while parens >= 1
+"   call Decho("parens=".parens." @a=".@a)
+   exe 'norm! ma "ay`a '
+   if @a == "("
+    let parens= parens + 1
+   elseif @a == ")"
+    let parens= parens - 1
+
+   " comment bypass:  /* ... */  or //...
+   elseif cmmnt == 0 && @a == '/'
+    let cmmnt= 1
+   elseif cmmnt == 1
+	if @a == '/'
+	 let cmmnt    = 2   " //...
+	 let cmmntline= line(".")
+	elseif @a == '*'
+	 let cmmnt= 3   " /*...
+	else
+	 let cmmnt= 0
+	endif
+   elseif cmmnt == 2 && line(".") != cmmntline
+	let cmmnt    = 0
+	let cmmntline= -1
+   elseif cmmnt == 3 && @a == '*'
+	let cmmnt= 4
+   elseif cmmnt == 4
+	if @a == '/'
+	 let cmmnt= 0   " ...*/
+	elseif @a != '*'
+	 let cmmnt= 3
+	endif
+
+   elseif @a == "," && parens == 1 && cmmnt == 0
+	exe "norm! i\<CR>\<Esc>"
+   endif
+  endwhile
+  norm! `y%mz%
+  sil! 'y,'zg/^\s*$/d
+
+  " perform substitutes to mark fields for Align
+  sil! 'y+1,'zv/^\//s/^\s\+\(\S\)/  \1/e
+  sil! 'y+1,'zv/^\//s/\(\S\)\s\+/\1 /eg
+  sil! 'y+1,'zv/^\//s/\* \+/*/ge
+  sil! 'y+1,'zv/^\//s/\w\zs\s*\*/ */ge
+  "                                                 func
+  "                    ws  <- declaration   ->    <-ptr  ->   <-var->    <-[array][]    ->   <-glop->      <-end->
+  sil! 'y+1,'zv/^\//s/^\s*\(\(\K\k*\s*\)\+\)\s\+\([(*]*\)\s*\(\K\k*\)\s*\(\(\[.\{-}]\)*\)\s*\(.\{-}\)\=\s*\([,)]\)\s*$/  \1@#\3@\4\5@\7\8/e
+  sil! 'y+1,'z+1g/^\s*\/[*/]/norm! kJ
+  sil! 'y+1,'z+1s%/[*/]%@&@%ge
+  sil! 'y+1,'z+1s%*/%@&%ge
+  AlignCtrl mIp0P0=l @
+  sil! 'y+1,'zAlign
+  sil! 'y,'zs%@\(/[*/]\)@%\t\1 %e
+  sil! 'y,'zs%@\*/% */%e
+  sil! 'y,'zs/@\([,)]\)/\1/
+  sil! 'y,'zs/@/ /
+  AlignCtrl mIlrp0P0= # @
+  sil! 'y+1,'zAlign
+  sil! 'y+1,'zs/#/ /
+  sil! 'y+1,'zs/@//
+  sil! 'y+1,'zs/\(\s\+\)\([,)]\)/\2\1/e
+
+  " Restore
+  call RestoreMark(mykeep)
+  call RestoreMark(mzkeep)
+  let &ch= chkeep
+  let &gd= gdkeep
+  let &ve= vekeep
+
+"  call Dret("AlignMaps#Afnc")
+endfun
+
+" ---------------------------------------------------------------------
+"  AlignMaps#FixMultiDec: converts a   type arg,arg,arg;   line to multiple lines {{{2
+fun! AlignMaps#FixMultiDec()
+"  call Dfunc("AlignMaps#FixMultiDec()")
+
+  " save register x
+  let xkeep   = @x
+  let curline = getline(".")
+"  call Decho("curline<".curline.">")
+
+  " Get the type.  I'm assuming one type per line (ie.  int x; double y;   on one line will not be handled properly)
+  let @x=substitute(curline,'^\(\s*[a-zA-Z_ \t][a-zA-Z0-9_ \t]*\)\s\+[(*]*\h.*$','\1','')
+"  call Decho("@x<".@x.">")
+
+  " transform line
+  exe 's/,/;\r'.@x.' /ge'
+
+  "restore register x
+  let @x= xkeep
+
+"  call Dret("AlignMaps#FixMultiDec : my=".line("'y")." mz=".line("'z"))
+endfun
+
+" ---------------------------------------------------------------------
+"  Restore: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/autoload/Rainbow.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,59 @@
+" Rainbow.vim
+"   Author: Charles E. Campbell, Jr.
+"   Date:   Nov 18, 2009
+"   Version: 2n	ASTRO-ONLY
+" ---------------------------------------------------------------------
+"  Load Once: {{{1
+if &cp || !exists("g:loaded_Rainbow")
+ finish
+endif
+let g:loaded_Rainbow = "v2n"
+let s:keepcpo        = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Rainbow#Rainbow: enable/disable rainbow highlighting for C/C++ {{{2
+fun! Rainbow#Rainbow(enable,hlrainbow)
+  if !exists("s:rainbowlevel")
+   let s:rainbowlevel= 1
+  else
+   let s:rainbowlevel= s:rainbowlevel + 1
+  endif
+
+"  call Dfunc("Rainbow#Rainbow(enable=".a:enable." hlrainbow<".a:hlrainbow.">) rainbowlevel=".s:rainbowlevel)
+
+  if s:rainbowlevel > 1
+   let s:rainbowlevel= s:rainbowlevel - 1
+"   call Dret("Rainbow#Rainbow : preventing Rainbow nesting")
+   return
+  endif
+
+  " set filetype to clear out rainbow highlighting; remove any commands in the AuRainbowColor autocmd group
+  augroup AugroupRainbow
+   au!
+  augroup END
+  silent! augroup! AugroupRainbow
+  exe "set ft=".&ft
+
+  " set global g:hlrainbow to the new user's selection (if any)
+  if a:hlrainbow != ""
+   let g:hlrainbow= a:hlrainbow
+  endif
+
+  if a:enable
+"  call Decho("sourcing rainbow.vvim")
+   augroup AugroupRainbow
+	au BufNewFile,BufReadPost *.c,*.cpp,*.cxx,*.c++,*.C,*.h,*.hpp,*.hxx,*.h++,*.H	Rainbow
+	augroup END
+   exe "so ".fnameescape(substitute(&rtp,',.*$','',''))."/after/syntax/c/rainbow.vvim"
+  endif
+
+  let s:rainbowlevel= s:rainbowlevel - 1
+"  call Dret("Rainbow#Rainbow")
+endfun
+
+" ---------------------------------------------------------------------
+"  Restore: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/autoload/snipMate.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,392 @@
+fun! Filename(...)
+	let filename = expand('%:t:r')
+	if filename == '' | return a:0 == 2 ? a:2 : '' | endif
+	return !a:0 || a:1 == '' ? filename : substitute(a:1, '$1', filename, 'g')
+endf
+
+fun s:RemoveSnippet()
+	unl g:snipPos s:curPos s:snipLen s:endSnip s:endSnipLine s:prevLen
+endf
+
+fun snipMate#expandSnip(snip, col)
+	let lnum = line('.') | let col = a:col
+
+	let snippet = s:ProcessSnippet(a:snip)
+	if snippet == '' | return '' | endif
+
+	let snipLines = split(substitute(snippet, '$\d\+\|${\d\+.\{-}}', '', 'g'), "\n", 1)
+
+	let line = getline(lnum)
+	let afterCursor = strpart(line, col - 1)
+	if afterCursor != "\t" && afterCursor != ' '
+		let line = strpart(line, 0, col - 1)
+		let snipLines[-1] .= afterCursor
+	else
+		let afterCursor = ''
+		" For some reason the cursor needs to move one right after this
+		if line != '' && col == 1 && &ve != 'all' && &ve != 'onemore'
+			let col += 1
+		endif
+	endif
+
+	call setline(lnum, line.snipLines[0])
+
+	" Autoindent snippet according to previous indentation
+	let indent = matchend(line, '^.\{-}\ze\(\S\|$\)') + 1
+	call append(lnum, map(snipLines[1:], "'".strpart(line, 0, indent - 1)."'.v:val"))
+	if &fen | sil! exe lnum.','.(lnum + len(snipLines) - 1).'foldopen' | endif
+
+	let [g:snipPos, s:snipLen] = s:BuildTabStops(snippet, lnum, col - indent, indent)
+
+	if s:snipLen
+		let s:curPos      = 0
+		let s:endSnip     = g:snipPos[s:curPos][1]
+		let s:endSnipLine = g:snipPos[s:curPos][0]
+
+		call cursor(g:snipPos[s:curPos][0], g:snipPos[s:curPos][1])
+		let s:prevLen = [line('$'), col('$')]
+		if g:snipPos[s:curPos][2] != -1 | return s:SelectWord() | endif
+	else
+		unl g:snipPos s:snipLen
+		" Place cursor at end of snippet if no tab stop is given
+		let newlines = len(snipLines) - 1
+		call cursor(lnum + newlines, indent + len(snipLines[-1]) - len(afterCursor)
+					\ + (newlines ? 0: col - 1))
+	endif
+	return ''
+endf
+
+fun s:ProcessSnippet(snip)
+	let snippet = a:snip
+	" Evaluate eval (`...`) expressions.
+	" Using a loop here instead of a regex fixes a bug with nested "\=".
+	if stridx(snippet, '`') != -1
+		while match(snippet, '`.\{-}`') != -1
+			let snippet = substitute(snippet, '`.\{-}`',
+						\ substitute(eval(matchstr(snippet, '`\zs.\{-}\ze`')),
+						\ "\n\\%$", '', ''), '')
+		endw
+		let snippet = substitute(snippet, "\r", "\n", 'g')
+	endif
+
+	" Place all text after a colon in a tab stop after the tab stop
+	" (e.g. "${#:foo}" becomes "${:foo}foo").
+	" This helps tell the position of the tab stops later.
+	let snippet = substitute(snippet, '${\d\+:\(.\{-}\)}', '&\1', 'g')
+
+	" Update the a:snip so that all the $# become the text after
+	" the colon in their associated ${#}.
+	" (e.g. "${1:foo}" turns all "$1"'s into "foo")
+	let i = 1
+	while stridx(snippet, '${'.i) != -1
+		let s = matchstr(snippet, '${'.i.':\zs.\{-}\ze}')
+		if s != ''
+			let snippet = substitute(snippet, '$'.i, s.'&', 'g')
+		endif
+		let i += 1
+	endw
+
+	if &et " Expand tabs to spaces if 'expandtab' is set.
+		return substitute(snippet, '\t', repeat(' ', &sts ? &sts : &sw), 'g')
+	endif
+	return snippet
+endf
+
+fun s:Count(haystack, needle)
+	let counter = 0
+	let index = stridx(a:haystack, a:needle)
+	while index != -1
+		let index = stridx(a:haystack, a:needle, index+1)
+		let counter += 1
+	endw
+	return counter
+endf
+
+" This function builds a list of a list of each tab stop in the
+" snippet containing:
+" 1.) The tab stop's line number.
+" 2.) The tab stop's column number
+"     (by getting the length of the string between the last "\n" and the
+"     tab stop).
+" 3.) The length of the text after the colon for the current tab stop
+"     (e.g. "${1:foo}" would return 3). If there is no text, -1 is returned.
+" 4.) If the "${#:}" construct is given, another list containing all
+"     the matches of "$#", to be replaced with the placeholder. This list is
+"     composed the same way as the parent; the first item is the line number,
+"     and the second is the column.
+fun s:BuildTabStops(snip, lnum, col, indent)
+	let snipPos = []
+	let i = 1
+	let withoutVars = substitute(a:snip, '$\d\+', '', 'g')
+	while stridx(a:snip, '${'.i) != -1
+		let beforeTabStop = matchstr(withoutVars, '^.*\ze${'.i.'\D')
+		let withoutOthers = substitute(withoutVars, '${\('.i.'\D\)\@!\d\+.\{-}}', '', 'g')
+
+		let j = i - 1
+		call add(snipPos, [0, 0, -1])
+		let snipPos[j][0] = a:lnum + s:Count(beforeTabStop, "\n")
+		let snipPos[j][1] = a:indent + len(matchstr(withoutOthers, '.*\(\n\|^\)\zs.*\ze${'.i.'\D'))
+		if snipPos[j][0] == a:lnum | let snipPos[j][1] += a:col | endif
+
+		" Get all $# matches in another list, if ${#:name} is given
+		if stridx(withoutVars, '${'.i.':') != -1
+			let snipPos[j][2] = len(matchstr(withoutVars, '${'.i.':\zs.\{-}\ze}'))
+			let dots = repeat('.', snipPos[j][2])
+			call add(snipPos[j], [])
+			let withoutOthers = substitute(a:snip, '${\d\+.\{-}}\|$'.i.'\@!\d\+', '', 'g')
+			while match(withoutOthers, '$'.i.'\D') != -1
+				let beforeMark = matchstr(withoutOthers, '^.\{-}\ze'.dots.'$'.i.'\D')
+				call add(snipPos[j][3], [0, 0])
+				let snipPos[j][3][-1][0] = a:lnum + s:Count(beforeMark, "\n")
+				let snipPos[j][3][-1][1] = a:indent + (snipPos[j][3][-1][0] > a:lnum
+				                           \ ? len(matchstr(beforeMark, '.*\n\zs.*'))
+				                           \ : a:col + len(beforeMark))
+				let withoutOthers = substitute(withoutOthers, '$'.i.'\ze\D', '', '')
+			endw
+		endif
+		let i += 1
+	endw
+	return [snipPos, i - 1]
+endf
+
+fun snipMate#jumpTabStop()
+	if exists('s:update')
+		call s:UpdatePlaceholderTabStops()
+	else
+		call s:UpdateTabStops()
+	endif
+
+	let s:curPos += 1
+	if s:curPos == s:snipLen
+		let sMode = s:endSnip == g:snipPos[s:curPos-1][1]+g:snipPos[s:curPos-1][2]
+		call s:RemoveSnippet()
+		return sMode ? "\<tab>" : TriggerSnippet()
+	endif
+
+	call cursor(g:snipPos[s:curPos][0], g:snipPos[s:curPos][1])
+
+	let s:endSnipLine = g:snipPos[s:curPos][0]
+	let s:endSnip     = g:snipPos[s:curPos][1]
+	let s:prevLen     = [line('$'), col('$')]
+
+	return g:snipPos[s:curPos][2] == -1 ? '' : s:SelectWord()
+endf
+
+fun s:UpdatePlaceholderTabStops()
+	let changeLen = s:origWordLen - g:snipPos[s:curPos][2]
+	unl s:startSnip s:origWordLen s:update
+	if !exists('s:origPos') | return | endif
+	" Update tab stops in snippet if text has been added via "$#"
+	" (e.g., in "${1:foo}bar$1${2}").
+	if changeLen != 0
+		let curLine = line('.')
+
+		for pos in g:snipPos[s:curPos + 1:]
+			let changed = pos[0] == curLine && pos[1] > s:origSnipPos
+			let changedVars = 0
+			let endPlaceholder = pos[2] - 1 + pos[1]
+			" Subtract changeLen from each tab stop that was after any of
+			" the current tab stop's placeholders.
+			for [lnum, col] in s:origPos
+				if lnum > pos[0] | break | endif
+				if pos[0] == lnum
+					if pos[1] > col || (pos[2] == -1 && pos[1] == col)
+						let changed += 1
+					elseif col < endPlaceholder
+						let changedVars += 1
+					endif
+				endif
+			endfor
+			let pos[1] -= changeLen * changed
+			let pos[2] -= changeLen * changedVars " Parse variables within placeholders
+                                                  " e.g., "${1:foo} ${2:$1bar}"
+
+			if pos[2] == -1 | continue | endif
+			" Do the same to any placeholders in the other tab stops.
+			for nPos in pos[3]
+				let changed = nPos[0] == curLine && nPos[1] > s:origSnipPos
+				for [lnum, col] in s:origPos
+					if lnum > nPos[0] | break | endif
+					if nPos[0] == lnum && nPos[1] > col
+						let changed += 1
+					endif
+				endfor
+				let nPos[1] -= changeLen * changed
+			endfor
+		endfor
+	endif
+	unl s:endSnip s:origPos s:origSnipPos
+endf
+
+fun s:UpdateTabStops()
+	let changeLine = s:endSnipLine - g:snipPos[s:curPos][0]
+	let changeCol  = s:endSnip - g:snipPos[s:curPos][1]
+	if exists('s:origWordLen')
+		let changeCol -= s:origWordLen
+		unl s:origWordLen
+	endif
+	let lnum = g:snipPos[s:curPos][0]
+	let col  = g:snipPos[s:curPos][1]
+	" Update the line number of all proceeding tab stops if <cr> has
+	" been inserted.
+	if changeLine != 0
+		let changeLine -= 1
+		for pos in g:snipPos[s:curPos + 1:]
+			if pos[0] >= lnum
+				if pos[0] == lnum | let pos[1] += changeCol | endif
+				let pos[0] += changeLine
+			endif
+			if pos[2] == -1 | continue | endif
+			for nPos in pos[3]
+				if nPos[0] >= lnum
+					if nPos[0] == lnum | let nPos[1] += changeCol | endif
+					let nPos[0] += changeLine
+				endif
+			endfor
+		endfor
+	elseif changeCol != 0
+		" Update the column of all proceeding tab stops if text has
+		" been inserted/deleted in the current line.
+		for pos in g:snipPos[s:curPos + 1:]
+			if pos[1] >= col && pos[0] == lnum
+				let pos[1] += changeCol
+			endif
+			if pos[2] == -1 | continue | endif
+			for nPos in pos[3]
+				if nPos[0] > lnum | break | endif
+				if nPos[0] == lnum && nPos[1] >= col
+					let nPos[1] += changeCol
+				endif
+			endfor
+		endfor
+	endif
+endf
+
+fun s:SelectWord()
+	let s:origWordLen = g:snipPos[s:curPos][2]
+	let s:oldWord     = strpart(getline('.'), g:snipPos[s:curPos][1] - 1,
+								\ s:origWordLen)
+	let s:prevLen[1] -= s:origWordLen
+	if !empty(g:snipPos[s:curPos][3])
+		let s:update    = 1
+		let s:endSnip   = -1
+		let s:startSnip = g:snipPos[s:curPos][1] - 1
+	endif
+	if !s:origWordLen | return '' | endif
+	let l = col('.') != 1 ? 'l' : ''
+	if &sel == 'exclusive'
+		return "\<esc>".l.'v'.s:origWordLen."l\<c-g>"
+	endif
+	return s:origWordLen == 1 ? "\<esc>".l.'gh'
+							\ : "\<esc>".l.'v'.(s:origWordLen - 1)."l\<c-g>"
+endf
+
+" This updates the snippet as you type when text needs to be inserted
+" into multiple places (e.g. in "${1:default text}foo$1bar$1",
+" "default text" would be highlighted, and if the user types something,
+" UpdateChangedSnip() would be called so that the text after "foo" & "bar"
+" are updated accordingly)
+"
+" It also automatically quits the snippet if the cursor is moved out of it
+" while in insert mode.
+au CursorMovedI * call s:UpdateChangedSnip(0)
+au InsertEnter * call s:UpdateChangedSnip(1)
+fun s:UpdateChangedSnip(entering)
+	if exists('s:update') " If modifying a placeholder
+		if !exists('s:origPos') && s:curPos + 1 < s:snipLen
+			" Save the old snippet & word length before it's updated
+			" s:startSnip must be saved too, in case text is added
+			" before the snippet (e.g. in "foo$1${2}bar${1:foo}").
+			let s:origSnipPos = s:startSnip
+			let s:origPos     = deepcopy(g:snipPos[s:curPos][3])
+		endif
+		let col = col('.') - 1
+
+		if s:endSnip != -1
+			let changeLen = col('$') - s:prevLen[1]
+			let s:endSnip += changeLen
+		else " When being updated the first time, after leaving select mode
+			if a:entering | return | endif
+			let s:endSnip = col - 1
+		endif
+
+		" If the cursor moves outside the snippet, quit it
+		if line('.') != g:snipPos[s:curPos][0] || col < s:startSnip ||
+					\ col - 1 > s:endSnip
+			unl! s:startSnip s:origWordLen s:origPos s:update
+			return s:RemoveSnippet()
+		endif
+
+		call s:UpdateVars()
+		let s:prevLen[1] = col('$')
+	elseif exists('g:snipPos')
+		let col        = col('.')
+		let lnum       = line('.')
+		let changeLine = line('$') - s:prevLen[0]
+
+		if lnum == s:endSnipLine
+			let s:endSnip += col('$') - s:prevLen[1]
+			let s:prevLen = [line('$'), col('$')]
+		endif
+		if changeLine != 0
+			let s:endSnipLine += changeLine
+			let s:endSnip = col
+		endif
+
+		" Delete snippet if cursor moves out of it in insert mode
+		if (lnum == s:endSnipLine && (col > s:endSnip || col < g:snipPos[s:curPos][1]))
+			\ || lnum > s:endSnipLine || lnum < g:snipPos[s:curPos][0]
+			call s:RemoveSnippet()
+		endif
+	endif
+endf
+
+" This updates the variables in a snippet when a placeholder has been edited.
+" (e.g., each "$1" in "${1:foo} $1bar $1bar")
+fun s:UpdateVars()
+	let newWordLen = s:endSnip - s:startSnip + 1
+	let newWord    = strpart(getline('.'), s:startSnip, newWordLen)
+	if newWord == s:oldWord || empty(g:snipPos[s:curPos][3])
+		return
+	endif
+
+	let changeLen      = g:snipPos[s:curPos][2] - newWordLen
+	let curLine        = line('.')
+	let startCol       = col('.')
+	let oldStartSnip   = s:startSnip
+	let updateTabStops = changeLen != 0
+	let i              = 0
+
+	for [lnum, col] in g:snipPos[s:curPos][3]
+		if updateTabStops
+			let start = s:startSnip
+			if lnum == curLine && col <= start
+				let s:startSnip -= changeLen
+				let s:endSnip -= changeLen
+			endif
+			for nPos in g:snipPos[s:curPos][3][(i):]
+				" This list is in ascending order, so quit if we've gone too far.
+				if nPos[0] > lnum | break | endif
+				if nPos[0] == lnum && nPos[1] > col
+					let nPos[1] -= changeLen
+				endif
+			endfor
+			if lnum == curLine && col > start
+				let col -= changeLen
+				let g:snipPos[s:curPos][3][i][1] = col
+			endif
+			let i += 1
+		endif
+
+		" "Very nomagic" is used here to allow special characters.
+		call setline(lnum, substitute(getline(lnum), '\%'.col.'c\V'.
+						\ escape(s:oldWord, '\'), escape(newWord, '\&'), ''))
+	endfor
+	if oldStartSnip != s:startSnip
+		call cursor(0, startCol + s:startSnip - oldStartSnip)
+	endif
+
+	let s:oldWord = newWord
+	let g:snipPos[s:curPos][2] = newWordLen
+endf
+" vim:noet:sw=4:ts=4:ft=vim
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/autoload/tagbar.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,3143 @@
+" ============================================================================
+" File:        tagbar.vim
+" Description: List the current file's tags in a sidebar, ordered by class etc
+" Author:      Jan Larres <jan@majutsushi.net>
+" Licence:     Vim licence
+" Website:     http://majutsushi.github.com/tagbar/
+" Version:     2.2
+" Note:        This plugin was heavily inspired by the 'Taglist' plugin by
+"              Yegappan Lakshmanan and uses a small amount of code from it.
+"
+" Original taglist copyright notice:
+"              Permission is hereby granted to use and distribute this code,
+"              with or without modifications, provided that this copyright
+"              notice is copied with it. Like anything else that's free,
+"              taglist.vim is provided *as is* and comes with no warranty of
+"              any kind, either expressed or implied. In no event will the
+"              copyright holder be liable for any damamges resulting from the
+"              use of this software.
+" ============================================================================
+
+scriptencoding utf-8
+
+" Initialization {{{1
+
+" Basic init {{{2
+
+if !exists('g:tagbar_ctags_bin')
+    if executable('ctags-exuberant')
+        let g:tagbar_ctags_bin = 'ctags-exuberant'
+    elseif executable('exuberant-ctags')
+        let g:tagbar_ctags_bin = 'exuberant-ctags'
+    elseif executable('exctags')
+        let g:tagbar_ctags_bin = 'exctags'
+    elseif has('macunix') && executable('/usr/local/bin/ctags')
+        " Homebrew default location
+        let g:tagbar_ctags_bin = '/usr/local/bin/ctags'
+    elseif has('macunix') && executable('/opt/local/bin/ctags')
+        " Macports default location
+        let g:tagbar_ctags_bin = '/opt/local/bin/ctags'
+    elseif executable('ctags')
+        let g:tagbar_ctags_bin = 'ctags'
+    elseif executable('ctags.exe')
+        let g:tagbar_ctags_bin = 'ctags.exe'
+    elseif executable('tags')
+        let g:tagbar_ctags_bin = 'tags'
+    else
+        echomsg 'Tagbar: Exuberant ctags not found, skipping plugin'
+        finish
+    endif
+else
+    " reset 'wildignore' temporarily in case *.exe is included in it
+    let wildignore_save = &wildignore
+    set wildignore&
+
+    let g:tagbar_ctags_bin = expand(g:tagbar_ctags_bin)
+
+    let &wildignore = wildignore_save
+
+    if !executable(g:tagbar_ctags_bin)
+        echomsg 'Tagbar: Exuberant ctags not found in specified place,'
+              \ 'skipping plugin'
+        finish
+    endif
+endif
+
+redir => s:ftype_out
+silent filetype
+redir END
+if s:ftype_out !~# 'detection:ON'
+    echomsg 'Tagbar: Filetype detection is turned off, skipping plugin'
+    unlet s:ftype_out
+    finish
+endif
+unlet s:ftype_out
+
+if has('multi_byte') && has('unix') && &encoding == 'utf-8' &&
+ \ (empty(&termencoding) || &termencoding == 'utf-8')
+    let s:icon_closed = '▶'
+    let s:icon_open   = '▼'
+elseif has('multi_byte') && (has('win32') || has('win64')) && g:tagbar_usearrows
+    let s:icon_closed = '▷'
+    let s:icon_open   = '◢'
+else
+    let s:icon_closed = '+'
+    let s:icon_open   = '-'
+endif
+
+let s:type_init_done    = 0
+let s:autocommands_done = 0
+let s:checked_ctags     = 0
+let s:window_expanded   = 0
+
+let s:access_symbols = {
+    \ 'public'    : '+',
+    \ 'protected' : '#',
+    \ 'private'   : '-'
+\ }
+
+let g:loaded_tagbar = 1
+
+let s:last_highlight_tline = 0
+
+" s:InitTypes() {{{2
+function! s:InitTypes()
+    let s:known_types = {}
+
+    " Ant {{{3
+    let type_ant = {}
+    let type_ant.ctagstype = 'ant'
+    let type_ant.kinds     = [
+        \ {'short' : 'p', 'long' : 'projects', 'fold' : 0},
+        \ {'short' : 't', 'long' : 'targets',  'fold' : 0}
+    \ ]
+    let s:known_types.ant = type_ant
+    " Asm {{{3
+    let type_asm = {}
+    let type_asm.ctagstype = 'asm'
+    let type_asm.kinds     = [
+        \ {'short' : 'm', 'long' : 'macros',  'fold' : 0},
+        \ {'short' : 't', 'long' : 'types',   'fold' : 0},
+        \ {'short' : 'd', 'long' : 'defines', 'fold' : 0},
+        \ {'short' : 'l', 'long' : 'labels',  'fold' : 0}
+    \ ]
+    let s:known_types.asm = type_asm
+    " ASP {{{3
+    let type_aspvbs = {}
+    let type_aspvbs.ctagstype = 'asp'
+    let type_aspvbs.kinds     = [
+        \ {'short' : 'd', 'long' : 'constants',   'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',     'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',   'fold' : 0},
+        \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',   'fold' : 0}
+    \ ]
+    let s:known_types.aspvbs = type_aspvbs
+    " Awk {{{3
+    let type_awk = {}
+    let type_awk.ctagstype = 'awk'
+    let type_awk.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
+    \ ]
+    let s:known_types.awk = type_awk
+    " Basic {{{3
+    let type_basic = {}
+    let type_basic.ctagstype = 'basic'
+    let type_basic.kinds     = [
+        \ {'short' : 'c', 'long' : 'constants',    'fold' : 0},
+        \ {'short' : 'g', 'long' : 'enumerations', 'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',    'fold' : 0},
+        \ {'short' : 'l', 'long' : 'labels',       'fold' : 0},
+        \ {'short' : 't', 'long' : 'types',        'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',    'fold' : 0}
+    \ ]
+    let s:known_types.basic = type_basic
+    " BETA {{{3
+    let type_beta = {}
+    let type_beta.ctagstype = 'beta'
+    let type_beta.kinds     = [
+        \ {'short' : 'f', 'long' : 'fragments', 'fold' : 0},
+        \ {'short' : 's', 'long' : 'slots',     'fold' : 0},
+        \ {'short' : 'v', 'long' : 'patterns',  'fold' : 0}
+    \ ]
+    let s:known_types.beta = type_beta
+    " C {{{3
+    let type_c = {}
+    let type_c.ctagstype = 'c'
+    let type_c.kinds     = [
+        \ {'short' : 'd', 'long' : 'macros',      'fold' : 1},
+        \ {'short' : 'p', 'long' : 'prototypes',  'fold' : 1},
+        \ {'short' : 'g', 'long' : 'enums',       'fold' : 0},
+        \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
+        \ {'short' : 't', 'long' : 'typedefs',    'fold' : 0},
+        \ {'short' : 's', 'long' : 'structs',     'fold' : 0},
+        \ {'short' : 'u', 'long' : 'unions',      'fold' : 0},
+        \ {'short' : 'm', 'long' : 'members',     'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',   'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',   'fold' : 0}
+    \ ]
+    let type_c.sro        = '::'
+    let type_c.kind2scope = {
+        \ 'g' : 'enum',
+        \ 's' : 'struct',
+        \ 'u' : 'union'
+    \ }
+    let type_c.scope2kind = {
+        \ 'enum'   : 'g',
+        \ 'struct' : 's',
+        \ 'union'  : 'u'
+    \ }
+    let s:known_types.c = type_c
+    " C++ {{{3
+    let type_cpp = {}
+    let type_cpp.ctagstype = 'c++'
+    let type_cpp.kinds     = [
+        \ {'short' : 'd', 'long' : 'macros',      'fold' : 1},
+        \ {'short' : 'p', 'long' : 'prototypes',  'fold' : 1},
+        \ {'short' : 'g', 'long' : 'enums',       'fold' : 0},
+        \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
+        \ {'short' : 't', 'long' : 'typedefs',    'fold' : 0},
+        \ {'short' : 'n', 'long' : 'namespaces',  'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',     'fold' : 0},
+        \ {'short' : 's', 'long' : 'structs',     'fold' : 0},
+        \ {'short' : 'u', 'long' : 'unions',      'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',   'fold' : 0},
+        \ {'short' : 'm', 'long' : 'members',     'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',   'fold' : 0}
+    \ ]
+    let type_cpp.sro        = '::'
+    let type_cpp.kind2scope = {
+        \ 'g' : 'enum',
+        \ 'n' : 'namespace',
+        \ 'c' : 'class',
+        \ 's' : 'struct',
+        \ 'u' : 'union'
+    \ }
+    let type_cpp.scope2kind = {
+        \ 'enum'      : 'g',
+        \ 'namespace' : 'n',
+        \ 'class'     : 'c',
+        \ 'struct'    : 's',
+        \ 'union'     : 'u'
+    \ }
+    let s:known_types.cpp = type_cpp
+    " C# {{{3
+    let type_cs = {}
+    let type_cs.ctagstype = 'c#'
+    let type_cs.kinds     = [
+        \ {'short' : 'd', 'long' : 'macros',      'fold' : 1},
+        \ {'short' : 'f', 'long' : 'fields',      'fold' : 0},
+        \ {'short' : 'g', 'long' : 'enums',       'fold' : 0},
+        \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
+        \ {'short' : 't', 'long' : 'typedefs',    'fold' : 0},
+        \ {'short' : 'n', 'long' : 'namespaces',  'fold' : 0},
+        \ {'short' : 'i', 'long' : 'interfaces',  'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',     'fold' : 0},
+        \ {'short' : 's', 'long' : 'structs',     'fold' : 0},
+        \ {'short' : 'E', 'long' : 'events',      'fold' : 0},
+        \ {'short' : 'm', 'long' : 'methods',     'fold' : 0},
+        \ {'short' : 'p', 'long' : 'properties',  'fold' : 0}
+    \ ]
+    let type_cs.sro        = '.'
+    let type_cs.kind2scope = {
+        \ 'n' : 'namespace',
+        \ 'i' : 'interface',
+        \ 'c' : 'class',
+        \ 's' : 'struct',
+        \ 'g' : 'enum'
+    \ }
+    let type_cs.scope2kind = {
+        \ 'namespace' : 'n',
+        \ 'interface' : 'i',
+        \ 'class'     : 'c',
+        \ 'struct'    : 's',
+        \ 'enum'      : 'g'
+    \ }
+    let s:known_types.cs = type_cs
+    " COBOL {{{3
+    let type_cobol = {}
+    let type_cobol.ctagstype = 'cobol'
+    let type_cobol.kinds     = [
+        \ {'short' : 'd', 'long' : 'data items',        'fold' : 0},
+        \ {'short' : 'f', 'long' : 'file descriptions', 'fold' : 0},
+        \ {'short' : 'g', 'long' : 'group items',       'fold' : 0},
+        \ {'short' : 'p', 'long' : 'paragraphs',        'fold' : 0},
+        \ {'short' : 'P', 'long' : 'program ids',       'fold' : 0},
+        \ {'short' : 's', 'long' : 'sections',          'fold' : 0}
+    \ ]
+    let s:known_types.cobol = type_cobol
+    " DOS Batch {{{3
+    let type_dosbatch = {}
+    let type_dosbatch.ctagstype = 'dosbatch'
+    let type_dosbatch.kinds     = [
+        \ {'short' : 'l', 'long' : 'labels',    'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
+    \ ]
+    let s:known_types.dosbatch = type_dosbatch
+    " Eiffel {{{3
+    let type_eiffel = {}
+    let type_eiffel.ctagstype = 'eiffel'
+    let type_eiffel.kinds     = [
+        \ {'short' : 'c', 'long' : 'classes',  'fold' : 0},
+        \ {'short' : 'f', 'long' : 'features', 'fold' : 0}
+    \ ]
+    let type_eiffel.sro        = '.' " Not sure, is nesting even possible?
+    let type_eiffel.kind2scope = {
+        \ 'c' : 'class',
+        \ 'f' : 'feature'
+    \ }
+    let type_eiffel.scope2kind = {
+        \ 'class'   : 'c',
+        \ 'feature' : 'f'
+    \ }
+    let s:known_types.eiffel = type_eiffel
+    " Erlang {{{3
+    let type_erlang = {}
+    let type_erlang.ctagstype = 'erlang'
+    let type_erlang.kinds     = [
+        \ {'short' : 'm', 'long' : 'modules',            'fold' : 0},
+        \ {'short' : 'd', 'long' : 'macro definitions',  'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',          'fold' : 0},
+        \ {'short' : 'r', 'long' : 'record definitions', 'fold' : 0}
+    \ ]
+    let type_erlang.sro        = '.' " Not sure, is nesting even possible?
+    let type_erlang.kind2scope = {
+        \ 'm' : 'module'
+    \ }
+    let type_erlang.scope2kind = {
+        \ 'module' : 'm'
+    \ }
+    let s:known_types.erlang = type_erlang
+    " Flex {{{3
+    " Vim doesn't support Flex out of the box, this is based on rough
+    " guesses and probably requires
+    " http://www.vim.org/scripts/script.php?script_id=2909
+    " Improvements welcome!
+    let type_mxml = {}
+    let type_mxml.ctagstype = 'flex'
+    let type_mxml.kinds     = [
+        \ {'short' : 'v', 'long' : 'global variables', 'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',          'fold' : 0},
+        \ {'short' : 'm', 'long' : 'methods',          'fold' : 0},
+        \ {'short' : 'p', 'long' : 'properties',       'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',        'fold' : 0},
+        \ {'short' : 'x', 'long' : 'mxtags',           'fold' : 0}
+    \ ]
+    let type_mxml.sro        = '.'
+    let type_mxml.kind2scope = {
+        \ 'c' : 'class'
+    \ }
+    let type_mxml.scope2kind = {
+        \ 'class' : 'c'
+    \ }
+    let s:known_types.mxml = type_mxml
+    " Fortran {{{3
+    let type_fortran = {}
+    let type_fortran.ctagstype = 'fortran'
+    let type_fortran.kinds     = [
+        \ {'short' : 'm', 'long' : 'modules',                      'fold' : 0},
+        \ {'short' : 'p', 'long' : 'programs',                     'fold' : 0},
+        \ {'short' : 'k', 'long' : 'components',                   'fold' : 0},
+        \ {'short' : 't', 'long' : 'derived types and structures', 'fold' : 0},
+        \ {'short' : 'c', 'long' : 'common blocks',                'fold' : 0},
+        \ {'short' : 'b', 'long' : 'block data',                   'fold' : 0},
+        \ {'short' : 'e', 'long' : 'entry points',                 'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',                    'fold' : 0},
+        \ {'short' : 's', 'long' : 'subroutines',                  'fold' : 0},
+        \ {'short' : 'l', 'long' : 'labels',                       'fold' : 0},
+        \ {'short' : 'n', 'long' : 'namelists',                    'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',                    'fold' : 0}
+    \ ]
+    let type_fortran.sro        = '.' " Not sure, is nesting even possible?
+    let type_fortran.kind2scope = {
+        \ 'm' : 'module',
+        \ 'p' : 'program',
+        \ 'f' : 'function',
+        \ 's' : 'subroutine'
+    \ }
+    let type_fortran.scope2kind = {
+        \ 'module'     : 'm',
+        \ 'program'    : 'p',
+        \ 'function'   : 'f',
+        \ 'subroutine' : 's'
+    \ }
+    let s:known_types.fortran = type_fortran
+    " HTML {{{3
+    let type_html = {}
+    let type_html.ctagstype = 'html'
+    let type_html.kinds     = [
+        \ {'short' : 'f', 'long' : 'JavaScript funtions', 'fold' : 0},
+        \ {'short' : 'a', 'long' : 'named anchors',       'fold' : 0}
+    \ ]
+    let s:known_types.html = type_html
+    " Java {{{3
+    let type_java = {}
+    let type_java.ctagstype = 'java'
+    let type_java.kinds     = [
+        \ {'short' : 'p', 'long' : 'packages',       'fold' : 1},
+        \ {'short' : 'f', 'long' : 'fields',         'fold' : 0},
+        \ {'short' : 'g', 'long' : 'enum types',     'fold' : 0},
+        \ {'short' : 'e', 'long' : 'enum constants', 'fold' : 0},
+        \ {'short' : 'i', 'long' : 'interfaces',     'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',        'fold' : 0},
+        \ {'short' : 'm', 'long' : 'methods',        'fold' : 0}
+    \ ]
+    let type_java.sro        = '.'
+    let type_java.kind2scope = {
+        \ 'g' : 'enum',
+        \ 'i' : 'interface',
+        \ 'c' : 'class'
+    \ }
+    let type_java.scope2kind = {
+        \ 'enum'      : 'g',
+        \ 'interface' : 'i',
+        \ 'class'     : 'c'
+    \ }
+    let s:known_types.java = type_java
+    " JavaScript {{{3
+    " JavaScript is weird -- it does have scopes, but ctags doesn't seem to
+    " properly generate the information for them, instead it simply uses the
+    " complete name. So ctags has to be fixed before I can do anything here.
+    " Alternatively jsctags/doctorjs will be used if available.
+    let type_javascript = {}
+    let type_javascript.ctagstype = 'javascript'
+    if executable('jsctags')
+        let type_javascript.kinds = [
+            \ {'short' : 'v', 'long' : 'variables', 'fold' : 0},
+            \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
+        \ ]
+        let type_javascript.sro        = '.'
+        let type_javascript.kind2scope = {
+            \ 'v' : 'namespace',
+            \ 'f' : 'namespace'
+        \ }
+        let type_javascript.scope2kind = {
+            \ 'namespace' : 'v'
+        \ }
+        let type_javascript.ctagsbin   = 'jsctags'
+        let type_javascript.ctagsargs  = '-f -'
+    else
+        let type_javascript.kinds = [
+            \ {'short' : 'v', 'long' : 'global variables', 'fold' : 0},
+            \ {'short' : 'c', 'long' : 'classes',          'fold' : 0},
+            \ {'short' : 'p', 'long' : 'properties',       'fold' : 0},
+            \ {'short' : 'm', 'long' : 'methods',          'fold' : 0},
+            \ {'short' : 'f', 'long' : 'functions',        'fold' : 0}
+        \ ]
+    endif
+    let s:known_types.javascript = type_javascript
+    " Lisp {{{3
+    let type_lisp = {}
+    let type_lisp.ctagstype = 'lisp'
+    let type_lisp.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
+    \ ]
+    let s:known_types.lisp = type_lisp
+    " Lua {{{3
+    let type_lua = {}
+    let type_lua.ctagstype = 'lua'
+    let type_lua.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
+    \ ]
+    let s:known_types.lua = type_lua
+    " Make {{{3
+    let type_make = {}
+    let type_make.ctagstype = 'make'
+    let type_make.kinds     = [
+        \ {'short' : 'm', 'long' : 'macros', 'fold' : 0}
+    \ ]
+    let s:known_types.make = type_make
+    " Matlab {{{3
+    let type_matlab = {}
+    let type_matlab.ctagstype = 'matlab'
+    let type_matlab.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
+    \ ]
+    let s:known_types.matlab = type_matlab
+    " Ocaml {{{3
+    let type_ocaml = {}
+    let type_ocaml.ctagstype = 'ocaml'
+    let type_ocaml.kinds     = [
+        \ {'short' : 'M', 'long' : 'modules or functors', 'fold' : 0},
+        \ {'short' : 'v', 'long' : 'global variables',    'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',             'fold' : 0},
+        \ {'short' : 'C', 'long' : 'constructors',        'fold' : 0},
+        \ {'short' : 'm', 'long' : 'methods',             'fold' : 0},
+        \ {'short' : 'e', 'long' : 'exceptions',          'fold' : 0},
+        \ {'short' : 't', 'long' : 'type names',          'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',           'fold' : 0},
+        \ {'short' : 'r', 'long' : 'structure fields',    'fold' : 0}
+    \ ]
+    let type_ocaml.sro        = '.' " Not sure, is nesting even possible?
+    let type_ocaml.kind2scope = {
+        \ 'M' : 'Module',
+        \ 'c' : 'class',
+        \ 't' : 'type'
+    \ }
+    let type_ocaml.scope2kind = {
+        \ 'Module' : 'M',
+        \ 'class'  : 'c',
+        \ 'type'   : 't'
+    \ }
+    let s:known_types.ocaml = type_ocaml
+    " Pascal {{{3
+    let type_pascal = {}
+    let type_pascal.ctagstype = 'pascal'
+    let type_pascal.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions',  'fold' : 0},
+        \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0}
+    \ ]
+    let s:known_types.pascal = type_pascal
+    " Perl {{{3
+    let type_perl = {}
+    let type_perl.ctagstype = 'perl'
+    let type_perl.kinds     = [
+        \ {'short' : 'p', 'long' : 'packages',    'fold' : 1},
+        \ {'short' : 'c', 'long' : 'constants',   'fold' : 0},
+        \ {'short' : 'f', 'long' : 'formats',     'fold' : 0},
+        \ {'short' : 'l', 'long' : 'labels',      'fold' : 0},
+        \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0}
+    \ ]
+    let s:known_types.perl = type_perl
+    " PHP {{{3
+    let type_php = {}
+    let type_php.ctagstype = 'php'
+    let type_php.kinds     = [
+        \ {'short' : 'i', 'long' : 'interfaces',           'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',              'fold' : 0},
+        \ {'short' : 'd', 'long' : 'constant definitions', 'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',            'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',            'fold' : 0},
+        \ {'short' : 'j', 'long' : 'javascript functions', 'fold' : 0}
+    \ ]
+    let s:known_types.php = type_php
+    " Python {{{3
+    let type_python = {}
+    let type_python.ctagstype = 'python'
+    let type_python.kinds     = [
+        \ {'short' : 'i', 'long' : 'imports',   'fold' : 1},
+        \ {'short' : 'c', 'long' : 'classes',   'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
+        \ {'short' : 'm', 'long' : 'members',   'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables', 'fold' : 0}
+    \ ]
+    let type_python.sro        = '.'
+    let type_python.kind2scope = {
+        \ 'c' : 'class',
+        \ 'f' : 'function',
+        \ 'm' : 'function'
+    \ }
+    let type_python.scope2kind = {
+        \ 'class'    : 'c',
+        \ 'function' : 'f'
+    \ }
+    let s:known_types.python = type_python
+    " REXX {{{3
+    let type_rexx = {}
+    let type_rexx.ctagstype = 'rexx'
+    let type_rexx.kinds     = [
+        \ {'short' : 's', 'long' : 'subroutines', 'fold' : 0}
+    \ ]
+    let s:known_types.rexx = type_rexx
+    " Ruby {{{3
+    let type_ruby = {}
+    let type_ruby.ctagstype = 'ruby'
+    let type_ruby.kinds     = [
+        \ {'short' : 'm', 'long' : 'modules',           'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',           'fold' : 0},
+        \ {'short' : 'f', 'long' : 'methods',           'fold' : 0},
+        \ {'short' : 'F', 'long' : 'singleton methods', 'fold' : 0}
+    \ ]
+    let type_ruby.sro        = '.'
+    let type_ruby.kind2scope = {
+        \ 'c' : 'class',
+        \ 'm' : 'class'
+    \ }
+    let type_ruby.scope2kind = {
+        \ 'class' : 'c'
+    \ }
+    let s:known_types.ruby = type_ruby
+    " Scheme {{{3
+    let type_scheme = {}
+    let type_scheme.ctagstype = 'scheme'
+    let type_scheme.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0},
+        \ {'short' : 's', 'long' : 'sets',      'fold' : 0}
+    \ ]
+    let s:known_types.scheme = type_scheme
+    " Shell script {{{3
+    let type_sh = {}
+    let type_sh.ctagstype = 'sh'
+    let type_sh.kinds     = [
+        \ {'short' : 'f', 'long' : 'functions', 'fold' : 0}
+    \ ]
+    let s:known_types.sh = type_sh
+    let s:known_types.csh = type_sh
+    let s:known_types.zsh = type_sh
+    " SLang {{{3
+    let type_slang = {}
+    let type_slang.ctagstype = 'slang'
+    let type_slang.kinds     = [
+        \ {'short' : 'n', 'long' : 'namespaces', 'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',  'fold' : 0}
+    \ ]
+    let s:known_types.slang = type_slang
+    " SML {{{3
+    let type_sml = {}
+    let type_sml.ctagstype = 'sml'
+    let type_sml.kinds     = [
+        \ {'short' : 'e', 'long' : 'exception declarations', 'fold' : 0},
+        \ {'short' : 'f', 'long' : 'function definitions',   'fold' : 0},
+        \ {'short' : 'c', 'long' : 'functor definitions',    'fold' : 0},
+        \ {'short' : 's', 'long' : 'signature declarations', 'fold' : 0},
+        \ {'short' : 'r', 'long' : 'structure declarations', 'fold' : 0},
+        \ {'short' : 't', 'long' : 'type definitions',       'fold' : 0},
+        \ {'short' : 'v', 'long' : 'value bindings',         'fold' : 0}
+    \ ]
+    let s:known_types.sml = type_sml
+    " SQL {{{3
+    " The SQL ctags parser seems to be buggy for me, so this just uses the
+    " normal kinds even though scopes should be available. Improvements
+    " welcome!
+    let type_sql = {}
+    let type_sql.ctagstype = 'sql'
+    let type_sql.kinds     = [
+        \ {'short' : 'P', 'long' : 'packages',               'fold' : 1},
+        \ {'short' : 'c', 'long' : 'cursors',                'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',              'fold' : 0},
+        \ {'short' : 'F', 'long' : 'record fields',          'fold' : 0},
+        \ {'short' : 'L', 'long' : 'block label',            'fold' : 0},
+        \ {'short' : 'p', 'long' : 'procedures',             'fold' : 0},
+        \ {'short' : 's', 'long' : 'subtypes',               'fold' : 0},
+        \ {'short' : 't', 'long' : 'tables',                 'fold' : 0},
+        \ {'short' : 'T', 'long' : 'triggers',               'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',              'fold' : 0},
+        \ {'short' : 'i', 'long' : 'indexes',                'fold' : 0},
+        \ {'short' : 'e', 'long' : 'events',                 'fold' : 0},
+        \ {'short' : 'U', 'long' : 'publications',           'fold' : 0},
+        \ {'short' : 'R', 'long' : 'services',               'fold' : 0},
+        \ {'short' : 'D', 'long' : 'domains',                'fold' : 0},
+        \ {'short' : 'V', 'long' : 'views',                  'fold' : 0},
+        \ {'short' : 'n', 'long' : 'synonyms',               'fold' : 0},
+        \ {'short' : 'x', 'long' : 'MobiLink Table Scripts', 'fold' : 0},
+        \ {'short' : 'y', 'long' : 'MobiLink Conn Scripts',  'fold' : 0}
+    \ ]
+    let s:known_types.sql = type_sql
+    " Tcl {{{3
+    let type_tcl = {}
+    let type_tcl.ctagstype = 'tcl'
+    let type_tcl.kinds     = [
+        \ {'short' : 'c', 'long' : 'classes',    'fold' : 0},
+        \ {'short' : 'm', 'long' : 'methods',    'fold' : 0},
+        \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0}
+    \ ]
+    let s:known_types.tcl = type_tcl
+    " LaTeX {{{3
+    let type_tex = {}
+    let type_tex.ctagstype = 'tex'
+    let type_tex.kinds     = [
+        \ {'short' : 'p', 'long' : 'parts',          'fold' : 0},
+        \ {'short' : 'c', 'long' : 'chapters',       'fold' : 0},
+        \ {'short' : 's', 'long' : 'sections',       'fold' : 0},
+        \ {'short' : 'u', 'long' : 'subsections',    'fold' : 0},
+        \ {'short' : 'b', 'long' : 'subsubsections', 'fold' : 0},
+        \ {'short' : 'P', 'long' : 'paragraphs',     'fold' : 0},
+        \ {'short' : 'G', 'long' : 'subparagraphs',  'fold' : 0}
+    \ ]
+    let s:known_types.tex = type_tex
+    " Vera {{{3
+    " Why are variables 'virtual'?
+    let type_vera = {}
+    let type_vera.ctagstype = 'vera'
+    let type_vera.kinds     = [
+        \ {'short' : 'd', 'long' : 'macros',      'fold' : 1},
+        \ {'short' : 'g', 'long' : 'enums',       'fold' : 0},
+        \ {'short' : 'T', 'long' : 'typedefs',    'fold' : 0},
+        \ {'short' : 'c', 'long' : 'classes',     'fold' : 0},
+        \ {'short' : 'e', 'long' : 'enumerators', 'fold' : 0},
+        \ {'short' : 'm', 'long' : 'members',     'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',   'fold' : 0},
+        \ {'short' : 't', 'long' : 'tasks',       'fold' : 0},
+        \ {'short' : 'v', 'long' : 'variables',   'fold' : 0},
+        \ {'short' : 'p', 'long' : 'programs',    'fold' : 0}
+    \ ]
+    let type_vera.sro        = '.' " Nesting doesn't seem to be possible
+    let type_vera.kind2scope = {
+        \ 'g' : 'enum',
+        \ 'c' : 'class',
+        \ 'v' : 'virtual'
+    \ }
+    let type_vera.scope2kind = {
+        \ 'enum'      : 'g',
+        \ 'class'     : 'c',
+        \ 'virtual'   : 'v'
+    \ }
+    let s:known_types.vera = type_vera
+    " Verilog {{{3
+    let type_verilog = {}
+    let type_verilog.ctagstype = 'verilog'
+    let type_verilog.kinds     = [
+        \ {'short' : 'c', 'long' : 'constants',           'fold' : 0},
+        \ {'short' : 'e', 'long' : 'events',              'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',           'fold' : 0},
+        \ {'short' : 'm', 'long' : 'modules',             'fold' : 0},
+        \ {'short' : 'n', 'long' : 'net data types',      'fold' : 0},
+        \ {'short' : 'p', 'long' : 'ports',               'fold' : 0},
+        \ {'short' : 'r', 'long' : 'register data types', 'fold' : 0},
+        \ {'short' : 't', 'long' : 'tasks',               'fold' : 0}
+    \ ]
+    let s:known_types.verilog = type_verilog
+    " VHDL {{{3
+    " The VHDL ctags parser unfortunately doesn't generate proper scopes
+    let type_vhdl = {}
+    let type_vhdl.ctagstype = 'vhdl'
+    let type_vhdl.kinds     = [
+        \ {'short' : 'P', 'long' : 'packages',   'fold' : 1},
+        \ {'short' : 'c', 'long' : 'constants',  'fold' : 0},
+        \ {'short' : 't', 'long' : 'types',      'fold' : 0},
+        \ {'short' : 'T', 'long' : 'subtypes',   'fold' : 0},
+        \ {'short' : 'r', 'long' : 'records',    'fold' : 0},
+        \ {'short' : 'e', 'long' : 'entities',   'fold' : 0},
+        \ {'short' : 'f', 'long' : 'functions',  'fold' : 0},
+        \ {'short' : 'p', 'long' : 'procedures', 'fold' : 0}
+    \ ]
+    let s:known_types.vhdl = type_vhdl
+    " Vim {{{3
+    let type_vim = {}
+    let type_vim.ctagstype = 'vim'
+    let type_vim.kinds     = [
+        \ {'short' : 'v', 'long' : 'variables',          'fold' : 1},
+        \ {'short' : 'f', 'long' : 'functions',          'fold' : 0},
+        \ {'short' : 'a', 'long' : 'autocommand groups', 'fold' : 1},
+        \ {'short' : 'c', 'long' : 'commands',           'fold' : 0},
+        \ {'short' : 'm', 'long' : 'maps',               'fold' : 1}
+    \ ]
+    let s:known_types.vim = type_vim
+    " YACC {{{3
+    let type_yacc = {}
+    let type_yacc.ctagstype = 'yacc'
+    let type_yacc.kinds     = [
+        \ {'short' : 'l', 'long' : 'labels', 'fold' : 0}
+    \ ]
+    let s:known_types.yacc = type_yacc
+    " }}}3
+
+    let user_defs = s:GetUserTypeDefs()
+    for [key, value] in items(user_defs)
+        if !has_key(s:known_types, key) ||
+         \ (has_key(value, 'replace') && value.replace)
+            let s:known_types[key] = value
+        else
+            call extend(s:known_types[key], value)
+        endif
+    endfor
+
+    " Create a dictionary of the kind order for fast
+    " access in sorting functions
+    for type in values(s:known_types)
+        let i = 0
+        let type.kinddict = {}
+        for kind in type.kinds
+            let type.kinddict[kind.short] = i
+            let i += 1
+        endfor
+    endfor
+
+    let s:type_init_done = 1
+endfunction
+
+" s:GetUserTypeDefs() {{{2
+function! s:GetUserTypeDefs()
+    redir => defs
+    silent execute 'let g:'
+    redir END
+
+    let deflist = split(defs, '\n')
+    call map(deflist, 'substitute(v:val, ''^\S\+\zs.*'', "", "")')
+    call filter(deflist, 'v:val =~ "^tagbar_type_"')
+
+    let defdict = {}
+    for defstr in deflist
+        let type = substitute(defstr, '^tagbar_type_', '', '')
+        execute 'let defdict["' . type . '"] = g:' . defstr
+    endfor
+
+    " If the user only specified one of kind2scope and scope2kind use it to
+    " generate the other one
+    " Also, transform the 'kind' definitions into dictionary format
+    for def in values(defdict)
+        let kinds = def.kinds
+        let def.kinds = []
+        for kind in kinds
+            let kindlist = split(kind, ':')
+            let kinddict = {'short' : kindlist[0], 'long' : kindlist[1]}
+            if len(kindlist) == 3
+                let kinddict.fold = kindlist[2]
+            else
+                let kinddict.fold = 0
+            endif
+            call add(def.kinds, kinddict)
+        endfor
+
+        if has_key(def, 'kind2scope') && !has_key(def, 'scope2kind')
+            let def.scope2kind = {}
+            for [key, value] in items(def.kind2scope)
+                let def.scope2kind[value] = key
+            endfor
+        elseif has_key(def, 'scope2kind') && !has_key(def, 'kind2scope')
+            let def.kind2scope = {}
+            for [key, value] in items(def.scope2kind)
+                let def.kind2scope[value] = key
+            endfor
+        endif
+    endfor
+
+    return defdict
+endfunction
+
+" s:RestoreSession() {{{2
+" Properly restore Tagbar after a session got loaded
+function! s:RestoreSession()
+    let tagbarwinnr = bufwinnr('__Tagbar__')
+    if tagbarwinnr == -1
+        " Tagbar wasn't open in the saved session, nothing to do
+        return
+    else
+        let in_tagbar = 1
+        if winnr() != tagbarwinnr
+            execute tagbarwinnr . 'wincmd w'
+            let in_tagbar = 0
+        endif
+    endif
+
+    if !s:type_init_done
+        call s:InitTypes()
+    endif
+
+    if !s:checked_ctags
+        if !s:CheckForExCtags()
+            return
+        endif
+    endif
+
+    call s:InitWindow(g:tagbar_autoclose)
+
+    " Leave the Tagbar window and come back so the update event gets triggered
+    wincmd p
+    execute tagbarwinnr . 'wincmd w'
+
+    if !in_tagbar
+        wincmd p
+    endif
+endfunction
+
+" s:MapKeys() {{{2
+function! s:MapKeys()
+    nnoremap <script> <silent> <buffer> <2-LeftMouse>
+                                              \ :call <SID>JumpToTag(0)<CR>
+    nnoremap <script> <silent> <buffer> <LeftRelease>
+                                 \ <LeftRelease>:call <SID>CheckMouseClick()<CR>
+
+    inoremap <script> <silent> <buffer> <2-LeftMouse>
+                                              \ <C-o>:call <SID>JumpToTag(0)<CR>
+    inoremap <script> <silent> <buffer> <LeftRelease>
+                            \ <LeftRelease><C-o>:call <SID>CheckMouseClick()<CR>
+
+    nnoremap <script> <silent> <buffer> <CR>    :call <SID>JumpToTag(0)<CR>
+    nnoremap <script> <silent> <buffer> p       :call <SID>JumpToTag(1)<CR>
+    nnoremap <script> <silent> <buffer> <Space> :call <SID>ShowPrototype()<CR>
+
+    nnoremap <script> <silent> <buffer> +        :call <SID>OpenFold()<CR>
+    nnoremap <script> <silent> <buffer> <kPlus>  :call <SID>OpenFold()<CR>
+    nnoremap <script> <silent> <buffer> zo       :call <SID>OpenFold()<CR>
+    nnoremap <script> <silent> <buffer> -        :call <SID>CloseFold()<CR>
+    nnoremap <script> <silent> <buffer> <kMinus> :call <SID>CloseFold()<CR>
+    nnoremap <script> <silent> <buffer> zc       :call <SID>CloseFold()<CR>
+    nnoremap <script> <silent> <buffer> o        :call <SID>ToggleFold()<CR>
+    nnoremap <script> <silent> <buffer> za       :call <SID>ToggleFold()<CR>
+
+    nnoremap <script> <silent> <buffer> *    :call <SID>SetFoldLevel(99)<CR>
+    nnoremap <script> <silent> <buffer> <kMultiply>
+                                           \ :call <SID>SetFoldLevel(99)<CR>
+    nnoremap <script> <silent> <buffer> zR   :call <SID>SetFoldLevel(99)<CR>
+    nnoremap <script> <silent> <buffer> =    :call <SID>SetFoldLevel(0)<CR>
+    nnoremap <script> <silent> <buffer> zM   :call <SID>SetFoldLevel(0)<CR>
+
+    nnoremap <script> <silent> <buffer> <C-N>
+                                        \ :call <SID>GotoNextToplevelTag(1)<CR>
+    nnoremap <script> <silent> <buffer> <C-P>
+                                        \ :call <SID>GotoNextToplevelTag(-1)<CR>
+
+    nnoremap <script> <silent> <buffer> s    :call <SID>ToggleSort()<CR>
+    nnoremap <script> <silent> <buffer> x    :call <SID>ZoomWindow()<CR>
+    nnoremap <script> <silent> <buffer> q    :call <SID>CloseWindow()<CR>
+    nnoremap <script> <silent> <buffer> <F1> :call <SID>ToggleHelp()<CR>
+endfunction
+
+" s:CreateAutocommands() {{{2
+function! s:CreateAutocommands()
+    augroup TagbarAutoCmds
+        autocmd!
+        autocmd BufEnter   __Tagbar__ nested call s:QuitIfOnlyWindow()
+        autocmd BufUnload  __Tagbar__ call s:CleanUp()
+        autocmd CursorHold __Tagbar__ call s:ShowPrototype()
+
+        autocmd BufWritePost *
+            \ if line('$') < g:tagbar_updateonsave_maxlines |
+                \ call s:AutoUpdate(fnamemodify(expand('<afile>'), ':p')) |
+            \ endif
+        autocmd BufEnter,CursorHold,FileType * call
+                    \ s:AutoUpdate(fnamemodify(expand('<afile>'), ':p'))
+        autocmd BufDelete * call
+                    \ s:CleanupFileinfo(fnamemodify(expand('<afile>'), ':p'))
+    augroup END
+
+    let s:autocommands_done = 1
+endfunction
+
+" s:CheckForExCtags() {{{2
+" Test whether the ctags binary is actually Exuberant Ctags and not GNU ctags
+" (or something else)
+function! s:CheckForExCtags()
+    let ctags_cmd = s:EscapeCtagsCmd(g:tagbar_ctags_bin, '--version')
+    if ctags_cmd == ''
+        return
+    endif
+
+    let ctags_output = s:ExecuteCtags(ctags_cmd)
+
+    if v:shell_error || ctags_output !~# 'Exuberant Ctags'
+        echoerr 'Tagbar: Ctags doesn''t seem to be Exuberant Ctags!'
+        echomsg 'GNU ctags will NOT WORK.'
+              \ 'Please download Exuberant Ctags from ctags.sourceforge.net'
+              \ 'and install it in a directory in your $PATH'
+              \ 'or set g:tagbar_ctags_bin.'
+        echomsg 'Executed command: "' . ctags_cmd . '"'
+        if !empty(ctags_output)
+            echomsg 'Command output:'
+            for line in split(ctags_output, '\n')
+                echomsg line
+            endfor
+        endif
+        return 0
+    elseif !s:CheckExCtagsVersion(ctags_output)
+        echoerr 'Tagbar: Exuberant Ctags is too old!'
+        echomsg 'You need at least version 5.5 for Tagbar to work.'
+              \ 'Please download a newer version from ctags.sourceforge.net.'
+        echomsg 'Executed command: "' . ctags_cmd . '"'
+        if !empty(ctags_output)
+            echomsg 'Command output:'
+            for line in split(ctags_output, '\n')
+                echomsg line
+            endfor
+        endif
+        return 0
+    else
+        let s:checked_ctags = 1
+        return 1
+    endif
+endfunction
+
+" s:CheckExCtagsVersion() {{{2
+function! s:CheckExCtagsVersion(output)
+    if a:output =~ 'Exuberant Ctags Development'
+        return 1
+    endif
+
+    let matchlist = matchlist(a:output, '\vExuberant Ctags (\d+)\.(\d+)')
+    let major     = matchlist[1]
+    let minor     = matchlist[2]
+
+    return major >= 6 || (major == 5 && minor >= 5)
+endfunction
+
+" Prototypes {{{1
+" Normal tag {{{2
+let s:NormalTag = {}
+
+" s:NormalTag._init() {{{3
+function! s:NormalTag._init(name) dict
+    let self.name        = a:name
+    let self.fields      = {}
+    let self.fields.line = 0
+    let self.path        = ''
+    let self.fullpath    = a:name
+    let self.depth       = 0
+    let self.parent      = {}
+    let self.tline       = -1
+    let self.fileinfo    = {}
+endfunction
+
+" s:NormalTag.New() {{{3
+function! s:NormalTag.New(name) dict
+    let newobj = copy(self)
+
+    call newobj._init(a:name)
+
+    return newobj
+endfunction
+
+" s:NormalTag.isNormalTag() {{{3
+function! s:NormalTag.isNormalTag() dict
+    return 1
+endfunction
+
+" s:NormalTag.isPseudoTag() {{{3
+function! s:NormalTag.isPseudoTag() dict
+    return 0
+endfunction
+
+" s:NormalTag.isKindheader() {{{3
+function! s:NormalTag.isKindheader() dict
+    return 0
+endfunction
+
+" s:NormalTag.getPrototype() {{{3
+function! s:NormalTag.getPrototype() dict
+    return self.prototype
+endfunction
+
+" s:NormalTag._getPrefix() {{{3
+function! s:NormalTag._getPrefix() dict
+    let fileinfo = self.fileinfo
+
+    if has_key(self, 'children') && !empty(self.children)
+        if fileinfo.tagfolds[self.fields.kind][self.fullpath]
+            let prefix = s:icon_closed
+        else
+            let prefix = s:icon_open
+        endif
+    else
+        let prefix = ' '
+    endif
+    if has_key(self.fields, 'access')
+        let prefix .= get(s:access_symbols, self.fields.access, ' ')
+    else
+        let prefix .= ' '
+    endif
+
+    return prefix
+endfunction
+
+" s:NormalTag.initFoldState() {{{3
+function! s:NormalTag.initFoldState() dict
+    let fileinfo = self.fileinfo
+
+    if s:known_files.has(fileinfo.fpath) &&
+     \ has_key(fileinfo._tagfolds_old[self.fields.kind], self.fullpath)
+        " The file has been updated and the tag was there before, so copy its
+        " old fold state
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
+                    \ fileinfo._tagfolds_old[self.fields.kind][self.fullpath]
+    elseif self.depth >= fileinfo.foldlevel
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
+    else
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
+                    \ fileinfo.kindfolds[self.fields.kind]
+    endif
+endfunction
+
+" s:NormalTag.getClosedParentTline() {{{3
+function! s:NormalTag.getClosedParentTline() dict
+    let tagline = self.tline
+    let fileinfo = self.fileinfo
+
+    let parent = self.parent
+    while !empty(parent)
+        if parent.isFolded()
+            let tagline = parent.tline
+            break
+        endif
+        let parent = parent.parent
+    endwhile
+
+    return tagline
+endfunction
+
+" s:NormalTag.isFoldable() {{{3
+function! s:NormalTag.isFoldable() dict
+    return has_key(self, 'children') && !empty(self.children)
+endfunction
+
+" s:NormalTag.isFolded() {{{3
+function! s:NormalTag.isFolded() dict
+    return self.fileinfo.tagfolds[self.fields.kind][self.fullpath]
+endfunction
+
+" s:NormalTag.openFold() {{{3
+function! s:NormalTag.openFold() dict
+    if self.isFoldable()
+        let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = 0
+    endif
+endfunction
+
+" s:NormalTag.closeFold() {{{3
+function! s:NormalTag.closeFold() dict
+    let newline = line('.')
+
+    if !empty(self.parent) && self.parent.isKindheader()
+        " Tag is child of generic 'kind'
+        call self.parent.closeFold()
+        let newline = self.parent.tline
+    elseif self.isFoldable() && !self.isFolded()
+        " Tag is parent of a scope and is not folded
+        let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
+        let newline = self.tline
+    elseif !empty(self.parent)
+        " Tag is normal child, so close parent
+        let parent = self.parent
+        let self.fileinfo.tagfolds[parent.fields.kind][parent.fullpath] = 1
+        let newline = parent.tline
+    endif
+
+    return newline
+endfunction
+
+" s:NormalTag.setFolded() {{{3
+function! s:NormalTag.setFolded(folded) dict
+    let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = a:folded
+endfunction
+
+" s:NormalTag.openParents() {{{3
+function! s:NormalTag.openParents() dict
+    let parent = self.parent
+
+    while !empty(parent)
+        call parent.openFold()
+        let parent = parent.parent
+    endwhile
+endfunction
+
+" s:NormalTag.str() {{{3
+function! s:NormalTag.str() dict
+    let fileinfo = self.fileinfo
+    let typeinfo = s:known_types[fileinfo.ftype]
+
+    let suffix = get(self.fields, 'signature', '')
+    if has_key(self.fields, 'type')
+        let suffix .= ' : ' . self.fields.type
+    elseif has_key(typeinfo, 'kind2scope') &&
+         \ has_key(typeinfo.kind2scope, self.fields.kind)
+        let suffix .= ' : ' . typeinfo.kind2scope[self.fields.kind]
+    endif
+
+    return self._getPrefix() . self.name . suffix . "\n"
+endfunction
+
+" Pseudo tag {{{2
+let s:PseudoTag = {}
+
+" s:PseudoTag._init() {{{3
+function! s:PseudoTag._init(name) dict
+    let self.name        = a:name
+    let self.fields      = {}
+    let self.fields.line = 0
+    let self.path        = ''
+    let self.fullpath    = a:name
+    let self.depth       = 0
+    let self.parent      = {}
+    let self.tline       = -1
+    let self.fileinfo    = {}
+endfunction
+
+" s:PseudoTag.New() {{{3
+function! s:PseudoTag.New(name) dict
+    let newobj = copy(self)
+
+    call newobj._init(a:name)
+
+    return newobj
+endfunction
+
+" s:PseudoTag.isNormalTag() {{{3
+function! s:PseudoTag.isNormalTag() dict
+    return 0
+endfunction
+
+" s:PseudoTag.isPseudoTag() {{{3
+function! s:PseudoTag.isPseudoTag() dict
+    return 1
+endfunction
+
+" s:PseudoTag.isKindheader() {{{3
+function! s:PseudoTag.isKindheader() dict
+    return 0
+endfunction
+
+" s:PseudoTag.getPrototype() {{{3
+function! s:PseudoTag.getPrototype() dict
+    return ''
+endfunction
+
+" s:PseudoTag._getPrefix() {{{3
+function! s:PseudoTag._getPrefix() dict
+    let fileinfo = self.fileinfo
+
+    if has_key(self, 'children') && !empty(self.children)
+        if fileinfo.tagfolds[self.fields.kind][self.fullpath]
+            let prefix = s:icon_closed
+        else
+            let prefix = s:icon_open
+        endif
+    else
+        let prefix = ' '
+    endif
+    if has_key(self.fields, 'access')
+        let prefix .= get(s:access_symbols, self.fields.access, ' ')
+    else
+        let prefix .= ' '
+    endif
+
+    return prefix
+endfunction
+
+" s:PseudoTag.initFoldState() {{{3
+function! s:PseudoTag.initFoldState() dict
+    let fileinfo = self.fileinfo
+
+    if s:known_files.has(fileinfo.fpath) &&
+     \ has_key(fileinfo._tagfolds_old[self.fields.kind], self.fullpath)
+        " The file has been updated and the tag was there before, so copy its
+        " old fold state
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
+                    \ fileinfo._tagfolds_old[self.fields.kind][self.fullpath]
+    elseif self.depth >= fileinfo.foldlevel
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
+    else
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
+                    \ fileinfo.kindfolds[self.fields.kind]
+    endif
+endfunction
+
+" s:PseudoTag.getClosedParentTline() {{{3
+function! s:PseudoTag.getClosedParentTline() dict
+    let tagline = self.tline
+    let fileinfo = self.fileinfo
+
+    let parent = self.parent
+    while !empty(parent)
+        if parent.isFolded()
+            let tagline = parent.tline
+            break
+        endif
+        let parent = parent.parent
+    endwhile
+
+    return tagline
+endfunction
+
+" s:PseudoTag.isFoldable() {{{3
+function! s:PseudoTag.isFoldable() dict
+    return has_key(self, 'children') && !empty(self.children)
+endfunction
+
+" s:PseudoTag.isFolded() {{{3
+function! s:PseudoTag.isFolded() dict
+    return self.fileinfo.tagfolds[self.fields.kind][self.fullpath]
+endfunction
+
+" s:PseudoTag.openFold() {{{3
+function! s:PseudoTag.openFold() dict
+    if self.isFoldable()
+        let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = 0
+    endif
+endfunction
+
+" s:PseudoTag.closeFold() {{{3
+function! s:PseudoTag.closeFold() dict
+    let newline = line('.')
+
+    if !empty(self.parent) && self.parent.isKindheader()
+        " Tag is child of generic 'kind'
+        call self.parent.closeFold()
+        let newline = self.parent.tline
+    elseif self.isFoldable() && !self.isFolded()
+        " Tag is parent of a scope and is not folded
+        let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
+        let newline = self.tline
+    elseif !empty(self.parent)
+        " Tag is normal child, so close parent
+        let parent = self.parent
+        let self.fileinfo.tagfolds[parent.fields.kind][parent.fullpath] = 1
+        let newline = parent.tline
+    endif
+
+    return newline
+endfunction
+
+" s:PseudoTag.setFolded() {{{3
+function! s:PseudoTag.setFolded(folded) dict
+    let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = a:folded
+endfunction
+
+" s:PseudoTag.openParents() {{{3
+function! s:PseudoTag.openParents() dict
+    let parent = self.parent
+
+    while !empty(parent)
+        call parent.openFold()
+        let parent = parent.parent
+    endwhile
+endfunction
+
+" s:PseudoTag.str() {{{3
+function! s:PseudoTag.str() dict
+    let fileinfo = self.fileinfo
+    let typeinfo = s:known_types[fileinfo.ftype]
+
+    let suffix = get(self.fields, 'signature', '')
+    if has_key(typeinfo.kind2scope, self.fields.kind)
+        let suffix .= ' : ' . typeinfo.kind2scope[self.fields.kind]
+    endif
+
+    return self._getPrefix() . self.name . '*' . suffix
+endfunction
+
+" Kind header {{{2
+let s:KindheaderTag = {}
+
+" s:KindheaderTag._init() {{{3
+function! s:KindheaderTag._init(name) dict
+    let self.name        = a:name
+    let self.fields      = {}
+    let self.fields.line = 0
+    let self.path        = ''
+    let self.fullpath    = a:name
+    let self.depth       = 0
+    let self.parent      = {}
+    let self.tline       = -1
+    let self.fileinfo    = {}
+endfunction
+
+" s:KindheaderTag.New() {{{3
+function! s:KindheaderTag.New(name) dict
+    let newobj = copy(self)
+
+    call newobj._init(a:name)
+
+    return newobj
+endfunction
+
+" s:KindheaderTag.isNormalTag() {{{3
+function! s:KindheaderTag.isNormalTag() dict
+    return 0
+endfunction
+
+" s:KindheaderTag.isPseudoTag() {{{3
+function! s:KindheaderTag.isPseudoTag() dict
+    return 0
+endfunction
+
+" s:KindheaderTag.isKindheader() {{{3
+function! s:KindheaderTag.isKindheader() dict
+    return 1
+endfunction
+
+" s:KindheaderTag.getPrototype() {{{3
+function! s:KindheaderTag.getPrototype() dict
+    return self.name . ': ' .
+         \ self.numtags . ' ' . (self.numtags > 1 ? 'tags' : 'tag')
+endfunction
+
+" s:KindheaderTag._getPrefix() {{{3
+function! s:KindheaderTag._getPrefix() dict
+    let fileinfo = self.fileinfo
+
+    if has_key(self, 'children') && !empty(self.children)
+        if fileinfo.tagfolds[self.fields.kind][self.fullpath]
+            let prefix = s:icon_closed
+        else
+            let prefix = s:icon_open
+        endif
+    else
+        let prefix = ' '
+    endif
+    if has_key(self.fields, 'access')
+        let prefix .= get(s:access_symbols, self.fields.access, ' ')
+    else
+        let prefix .= ' '
+    endif
+
+    return prefix
+endfunction
+
+" s:KindheaderTag.initFoldState() {{{3
+function! s:KindheaderTag.initFoldState() dict
+    let fileinfo = self.fileinfo
+
+    if s:known_files.has(fileinfo.fpath) &&
+     \ has_key(fileinfo._tagfolds_old[self.fields.kind], self.fullpath)
+        " The file has been updated and the tag was there before, so copy its
+        " old fold state
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
+                    \ fileinfo._tagfolds_old[self.fields.kind][self.fullpath]
+    elseif self.depth >= fileinfo.foldlevel
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] = 1
+    else
+        let fileinfo.tagfolds[self.fields.kind][self.fullpath] =
+                    \ fileinfo.kindfolds[self.fields.kind]
+    endif
+endfunction
+
+" s:KindheaderTag.getClosedParentTline() {{{3
+function! s:KindheaderTag.getClosedParentTline() dict
+    let tagline = self.tline
+    let fileinfo = self.fileinfo
+
+    let parent = self.parent
+    while !empty(parent)
+        if parent.isFolded()
+            let tagline = parent.tline
+            break
+        endif
+        let parent = parent.parent
+    endwhile
+
+    return tagline
+endfunction
+
+" s:KindheaderTag.isFoldable() {{{3
+function! s:KindheaderTag.isFoldable() dict
+    return 1
+endfunction
+
+" s:KindheaderTag.isFolded() {{{3
+function! s:KindheaderTag.isFolded() dict
+    return self.fileinfo.kindfolds[self.short]
+endfunction
+
+" s:KindheaderTag.openFold() {{{3
+function! s:KindheaderTag.openFold() dict
+    let self.fileinfo.kindfolds[self.short] = 0
+endfunction
+
+" s:KindheaderTag.closeFold() {{{3
+function! s:KindheaderTag.closeFold() dict
+    let self.fileinfo.kindfolds[self.short] = 1
+    return line('.')
+endfunction
+
+" s:KindheaderTag.setFolded() {{{3
+function! s:KindheaderTag.setFolded(folded) dict
+    let self.fileinfo.tagfolds[self.fields.kind][self.fullpath] = a:folded
+endfunction
+
+" s:KindheaderTag.openParents() {{{3
+function! s:KindheaderTag.openParents() dict
+    let parent = self.parent
+
+    while !empty(parent)
+        call parent.openFold()
+        let parent = parent.parent
+    endwhile
+endfunction
+
+" s:KindheaderTag.toggleFold() {{{3
+function! s:KindheaderTag.toggleFold() dict
+    let fileinfo = s:known_files.getCurrent()
+
+    let fileinfo.kindfolds[self.short] = !fileinfo.kindfolds[self.short]
+endfunction
+
+" File info {{{2
+let s:FileInfo = {}
+
+" s:FileInfo.New() {{{3
+function! s:FileInfo.New(fname, ftype) dict
+    let newobj = copy(self)
+
+    " The complete file path
+    let newobj.fpath = a:fname
+
+    " File modification time
+    let newobj.mtime = getftime(a:fname)
+
+    " The vim file type
+    let newobj.ftype = a:ftype
+
+    " List of the tags that are present in the file, sorted according to the
+    " value of 'g:tagbar_sort'
+    let newobj.tags = []
+
+    " Dictionary of the tags, indexed by line number in the file
+    let newobj.fline = {}
+
+    " Dictionary of the tags, indexed by line number in the tagbar
+    let newobj.tline = {}
+
+    " Dictionary of the folding state of 'kind's, indexed by short name
+    let newobj.kindfolds = {}
+    let typeinfo = s:known_types[a:ftype]
+    " copy the default fold state from the type info
+    for kind in typeinfo.kinds
+        let newobj.kindfolds[kind.short] =
+                    \ g:tagbar_foldlevel == 0 ? 1 : kind.fold
+    endfor
+
+    " Dictionary of dictionaries of the folding state of individual tags,
+    " indexed by kind and full path
+    let newobj.tagfolds = {}
+    for kind in typeinfo.kinds
+        let newobj.tagfolds[kind.short] = {}
+    endfor
+
+    " The current foldlevel of the file
+    let newobj.foldlevel = g:tagbar_foldlevel
+
+    return newobj
+endfunction
+
+" s:FileInfo.reset() {{{3
+" Reset stuff that gets regenerated while processing a file and save the old
+" tag folds
+function! s:FileInfo.reset() dict
+    let self.mtime = getftime(self.fpath)
+    let self.tags  = []
+    let self.fline = {}
+    let self.tline = {}
+
+    let self._tagfolds_old = self.tagfolds
+    let self.tagfolds = {}
+
+    let typeinfo = s:known_types[self.ftype]
+    for kind in typeinfo.kinds
+        let self.tagfolds[kind.short] = {}
+    endfor
+endfunction
+
+" s:FileInfo.clearOldFolds() {{{3
+function! s:FileInfo.clearOldFolds() dict
+    if exists('self._tagfolds_old')
+        unlet self._tagfolds_old
+    endif
+endfunction
+
+" s:FileInfo.sortTags() {{{3
+function! s:FileInfo.sortTags() dict
+    if has_key(s:compare_typeinfo, 'sort')
+        if s:compare_typeinfo.sort
+            call s:SortTags(self.tags, 's:CompareByKind')
+        else
+            call s:SortTags(self.tags, 's:CompareByLine')
+        endif
+    elseif g:tagbar_sort
+        call s:SortTags(self.tags, 's:CompareByKind')
+    else
+        call s:SortTags(self.tags, 's:CompareByLine')
+    endif
+endfunction
+
+" s:FileInfo.openKindFold() {{{3
+function! s:FileInfo.openKindFold(kind) dict
+    let self.kindfolds[a:kind.short] = 0
+endfunction
+
+" s:FileInfo.closeKindFold() {{{3
+function! s:FileInfo.closeKindFold(kind) dict
+    let self.kindfolds[a:kind.short] = 1
+endfunction
+
+" Known files {{{2
+let s:known_files = {
+    \ '_current' : {},
+    \ '_files'   : {}
+\ }
+
+" s:known_files.getCurrent() {{{3
+function! s:known_files.getCurrent() dict
+    return self._current
+endfunction
+
+" s:known_files.setCurrent() {{{3
+function! s:known_files.setCurrent(fileinfo) dict
+    let self._current = a:fileinfo
+endfunction
+
+" s:known_files.get() {{{3
+function! s:known_files.get(fname) dict
+    return get(self._files, a:fname, {})
+endfunction
+
+" s:known_files.put() {{{3
+" Optional second argument is the filename
+function! s:known_files.put(fileinfo, ...) dict
+    if a:0 == 1
+        let self._files[a:1] = a:fileinfo
+    else
+        let fname = a:fileinfo.fpath
+        let self._files[fname] = a:fileinfo
+    endif
+endfunction
+
+" s:known_files.has() {{{3
+function! s:known_files.has(fname) dict
+    return has_key(self._files, a:fname)
+endfunction
+
+" s:known_files.rm() {{{3
+function! s:known_files.rm(fname) dict
+    if s:known_files.has(a:fname)
+        call remove(self._files, a:fname)
+    endif
+endfunction
+
+" Window management {{{1
+" s:ToggleWindow() {{{2
+function! s:ToggleWindow()
+    let tagbarwinnr = bufwinnr("__Tagbar__")
+    if tagbarwinnr != -1
+        call s:CloseWindow()
+        return
+    endif
+
+    call s:OpenWindow(0)
+endfunction
+
+" s:OpenWindow() {{{2
+function! s:OpenWindow(flags)
+    let autofocus = a:flags =~# 'f'
+    let jump      = a:flags =~# 'j'
+    let autoclose = a:flags =~# 'c'
+
+    " If the tagbar window is already open check jump flag
+    " Also set the autoclose flag if requested
+    let tagbarwinnr = bufwinnr('__Tagbar__')
+    if tagbarwinnr != -1
+        if winnr() != tagbarwinnr && jump
+            execute tagbarwinnr . 'wincmd w'
+            if autoclose
+                let w:autoclose = autoclose
+            endif
+        endif
+        return
+    endif
+
+    if !s:type_init_done
+        call s:InitTypes()
+    endif
+
+    if !s:checked_ctags
+        if !s:CheckForExCtags()
+            return
+        endif
+    endif
+
+    " Expand the Vim window to accomodate for the Tagbar window if requested
+    if g:tagbar_expand && !s:window_expanded && has('gui_running')
+        let &columns += g:tagbar_width + 1
+        let s:window_expanded = 1
+    endif
+
+    let eventignore_save = &eventignore
+    set eventignore=all
+
+    let openpos = g:tagbar_left ? 'topleft vertical ' : 'botright vertical '
+    exe 'silent keepalt ' . openpos . g:tagbar_width . 'split ' . '__Tagbar__'
+
+    let &eventignore = eventignore_save
+
+    call s:InitWindow(autoclose)
+
+    wincmd p
+
+    " Jump back to the tagbar window if autoclose or autofocus is set. Can't
+    " just stay in it since it wouldn't trigger the update event
+    if g:tagbar_autoclose || autofocus || g:tagbar_autofocus
+        let tagbarwinnr = bufwinnr('__Tagbar__')
+        execute tagbarwinnr . 'wincmd w'
+    endif
+endfunction
+
+" s:InitWindow() {{{2
+function! s:InitWindow(autoclose)
+    setlocal noreadonly " in case the "view" mode is used
+    setlocal buftype=nofile
+    setlocal bufhidden=hide
+    setlocal noswapfile
+    setlocal nobuflisted
+    setlocal nomodifiable
+    setlocal filetype=tagbar
+    setlocal nolist
+    setlocal nonumber
+    setlocal nowrap
+    setlocal winfixwidth
+    setlocal textwidth=0
+    setlocal nocursorline
+    setlocal nocursorcolumn
+
+    if exists('+relativenumber')
+        setlocal norelativenumber
+    endif
+
+    setlocal nofoldenable
+    setlocal foldcolumn=0
+    " Reset fold settings in case a plugin set them globally to something
+    " expensive. Apparently 'foldexpr' gets executed even if 'foldenable' is
+    " off, and then for every appended line (like with :put).
+    setlocal foldmethod&
+    setlocal foldexpr&
+
+    setlocal statusline=Tagbar
+
+    " Script-local variable needed since compare functions can't
+    " take extra arguments
+    let s:compare_typeinfo = {}
+
+    let s:is_maximized = 0
+    let s:short_help   = 1
+
+    let w:autoclose = a:autoclose
+
+    if has('balloon_eval')
+        setlocal balloonexpr=TagbarBalloonExpr()
+        set ballooneval
+    endif
+
+    let cpoptions_save = &cpoptions
+    set cpoptions&vim
+
+    if !hasmapto('JumpToTag', 'n')
+        call s:MapKeys()
+    endif
+
+    if !s:autocommands_done
+        call s:CreateAutocommands()
+    endif
+
+    let &cpoptions = cpoptions_save
+endfunction
+
+" s:CloseWindow() {{{2
+function! s:CloseWindow()
+    let tagbarwinnr = bufwinnr('__Tagbar__')
+    if tagbarwinnr == -1
+        return
+    endif
+
+    let tagbarbufnr = winbufnr(tagbarwinnr)
+
+    if winnr() == tagbarwinnr
+        if winbufnr(2) != -1
+            " Other windows are open, only close the tagbar one
+            close
+            wincmd p
+        endif
+    else
+        " Go to the tagbar window, close it and then come back to the
+        " original window
+        let curbufnr = bufnr('%')
+        execute tagbarwinnr . 'wincmd w'
+        close
+        " Need to jump back to the original window only if we are not
+        " already in that window
+        let winnum = bufwinnr(curbufnr)
+        if winnr() != winnum
+            exe winnum . 'wincmd w'
+        endif
+    endif
+
+    " If the Vim window has been expanded, and Tagbar is not open in any other
+    " tabpages, shrink the window again
+    if s:window_expanded
+        let tablist = []
+        for i in range(tabpagenr('$'))
+            call extend(tablist, tabpagebuflist(i + 1))
+        endfor
+
+        if index(tablist, tagbarbufnr) == -1
+            let &columns -= g:tagbar_width + 1
+            let s:window_expanded = 0
+        endif
+    endif
+endfunction
+
+" s:ZoomWindow() {{{2
+function! s:ZoomWindow()
+    if s:is_maximized
+        execute 'vert resize ' . g:tagbar_width
+        let s:is_maximized = 0
+    else
+        vert resize
+        let s:is_maximized = 1
+    endif
+endfunction
+
+" Tag processing {{{1
+" s:ProcessFile() {{{2
+" Execute ctags and put the information into a 'FileInfo' object
+function! s:ProcessFile(fname, ftype)
+    if !s:IsValidFile(a:fname, a:ftype)
+        return
+    endif
+
+    let ctags_output = s:ExecuteCtagsOnFile(a:fname, a:ftype)
+
+    if ctags_output == -1
+        " put an empty entry into known_files so the error message is only
+        " shown once
+        call s:known_files.put({}, a:fname)
+        return
+    elseif ctags_output == ''
+        return
+    endif
+
+    " If the file has only been updated preserve the fold states, otherwise
+    " create a new entry
+    if s:known_files.has(a:fname)
+        let fileinfo = s:known_files.get(a:fname)
+        call fileinfo.reset()
+    else
+        let fileinfo = s:FileInfo.New(a:fname, a:ftype)
+    endif
+
+    let typeinfo = s:known_types[a:ftype]
+
+    " Parse the ctags output lines
+    let rawtaglist = split(ctags_output, '\n\+')
+    for line in rawtaglist
+        let parts = split(line, ';"')
+        if len(parts) == 2 " Is a valid tag line
+            let taginfo = s:ParseTagline(parts[0], parts[1], typeinfo, fileinfo)
+            let fileinfo.fline[taginfo.fields.line] = taginfo
+            call add(fileinfo.tags, taginfo)
+        endif
+    endfor
+
+    " Process scoped tags
+    let processedtags = []
+    if has_key(typeinfo, 'kind2scope')
+        let scopedtags = []
+        let is_scoped = 'has_key(typeinfo.kind2scope, v:val.fields.kind) ||
+                       \ has_key(v:val, "scope")'
+        let scopedtags += filter(copy(fileinfo.tags), is_scoped)
+        call filter(fileinfo.tags, '!(' . is_scoped . ')')
+
+        call s:AddScopedTags(scopedtags, processedtags, {}, 0,
+                           \ typeinfo, fileinfo)
+
+        if !empty(scopedtags)
+            echoerr 'Tagbar: ''scopedtags'' not empty after processing,'
+                  \ 'this should never happen!'
+                  \ 'Please contact the script maintainer with an example.'
+        endif
+    endif
+
+    " Create a placeholder tag for the 'kind' header for folding purposes
+    for kind in typeinfo.kinds
+        let curtags = filter(copy(fileinfo.tags),
+                           \ 'v:val.fields.kind ==# kind.short')
+
+        if empty(curtags)
+            continue
+        endif
+
+        let kindtag          = s:KindheaderTag.New(kind.long)
+        let kindtag.short    = kind.short
+        let kindtag.numtags  = len(curtags)
+        let kindtag.fileinfo = fileinfo
+
+        for tag in curtags
+            let tag.parent = kindtag
+        endfor
+    endfor
+
+    if !empty(processedtags)
+        call extend(fileinfo.tags, processedtags)
+    endif
+
+    " Clear old folding information from previous file version
+    call fileinfo.clearOldFolds()
+
+    " Sort the tags
+    let s:compare_typeinfo = typeinfo
+    call fileinfo.sortTags()
+
+    call s:known_files.put(fileinfo)
+endfunction
+
+" s:ExecuteCtagsOnFile() {{{2
+function! s:ExecuteCtagsOnFile(fname, ftype)
+    let typeinfo = s:known_types[a:ftype]
+
+    if has_key(typeinfo, 'ctagsargs')
+        let ctags_args = ' ' . typeinfo.ctagsargs . ' '
+    else
+        let ctags_args  = ' -f - '
+        let ctags_args .= ' --format=2 '
+        let ctags_args .= ' --excmd=pattern '
+        let ctags_args .= ' --fields=nksSa '
+        let ctags_args .= ' --extra= '
+        let ctags_args .= ' --sort=yes '
+
+        " Include extra type definitions
+        if has_key(typeinfo, 'deffile')
+            let ctags_args .= ' --options=' . typeinfo.deffile . ' '
+        endif
+
+        let ctags_type = typeinfo.ctagstype
+
+        let ctags_kinds = ''
+        for kind in typeinfo.kinds
+            let ctags_kinds .= kind.short
+        endfor
+
+        let ctags_args .= ' --language-force=' . ctags_type .
+                        \ ' --' . ctags_type . '-kinds=' . ctags_kinds . ' '
+    endif
+
+    if has_key(typeinfo, 'ctagsbin')
+        " reset 'wildignore' temporarily in case *.exe is included in it
+        let wildignore_save = &wildignore
+        set wildignore&
+        let ctags_bin = expand(typeinfo.ctagsbin)
+        let &wildignore = wildignore_save
+    else
+        let ctags_bin = g:tagbar_ctags_bin
+    endif
+
+    let ctags_cmd = s:EscapeCtagsCmd(ctags_bin, ctags_args, a:fname)
+    if ctags_cmd == ''
+        return ''
+    endif
+
+    let ctags_output = s:ExecuteCtags(ctags_cmd)
+
+    if v:shell_error || ctags_output =~ 'Warning: cannot open source file'
+        echoerr 'Tagbar: Could not execute ctags for ' . a:fname . '!'
+        echomsg 'Executed command: "' . ctags_cmd . '"'
+        if !empty(ctags_output)
+            echomsg 'Command output:'
+            for line in split(ctags_output, '\n')
+                echomsg line
+            endfor
+        endif
+        return -1
+    endif
+
+    return ctags_output
+endfunction
+
+" s:ParseTagline() {{{2
+" Structure of a tag line:
+" tagname<TAB>filename<TAB>expattern;"fields
+" fields: <TAB>name:value
+" fields that are always present: kind, line
+function! s:ParseTagline(part1, part2, typeinfo, fileinfo)
+    let basic_info  = split(a:part1, '\t')
+
+    let taginfo      = s:NormalTag.New(basic_info[0])
+    let taginfo.file = basic_info[1]
+
+    " the pattern can contain tabs and thus may have been split up, so join
+    " the rest of the items together again
+    let pattern = join(basic_info[2:], "\t")
+    let start   = 2 " skip the slash and the ^
+    let end     = strlen(pattern) - 1
+    if pattern[end - 1] ==# '$'
+        let end -= 1
+        let dollar = '\$'
+    else
+        let dollar = ''
+    endif
+    let pattern           = strpart(pattern, start, end - start)
+    let taginfo.pattern   = '\V\^\C' . pattern . dollar
+    let prototype         = substitute(pattern,   '^[[:space:]]\+', '', '')
+    let prototype         = substitute(prototype, '[[:space:]]\+$', '', '')
+    let taginfo.prototype = prototype
+
+    let fields = split(a:part2, '\t')
+    let taginfo.fields.kind = remove(fields, 0)
+    for field in fields
+        " can't use split() since the value can contain ':'
+        let delimit             = stridx(field, ':')
+        let key                 = strpart(field, 0, delimit)
+        let val                 = strpart(field, delimit + 1)
+        let taginfo.fields[key] = val
+    endfor
+    " Needed for jsctags
+    if has_key(taginfo.fields, 'lineno')
+        let taginfo.fields.line = taginfo.fields.lineno
+    endif
+
+    " Make some information easier accessible
+    if has_key(a:typeinfo, 'scope2kind')
+        for scope in keys(a:typeinfo.scope2kind)
+            if has_key(taginfo.fields, scope)
+                let taginfo.scope = scope
+                let taginfo.path  = taginfo.fields[scope]
+
+                let taginfo.fullpath = taginfo.path . a:typeinfo.sro .
+                                     \ taginfo.name
+                break
+            endif
+        endfor
+        let taginfo.depth = len(split(taginfo.path, '\V' . a:typeinfo.sro))
+    endif
+
+    let taginfo.fileinfo = a:fileinfo
+
+    " Needed for folding
+    try
+        call taginfo.initFoldState()
+    catch /^Vim(\a\+):E716:/ " 'Key not present in Dictionary'
+        " The tag has a 'kind' that doesn't exist in the type definition
+        echoerr 'Your ctags and Tagbar configurations are out of sync!'
+              \ 'Please read '':help tagbar-extend''.'
+    endtry
+
+    return taginfo
+endfunction
+
+" s:AddScopedTags() {{{2
+" Recursively process tags. Unfortunately there is a problem: not all tags in
+" a hierarchy are actually there. For example, in C++ a class can be defined
+" in a header file and implemented in a .cpp file (so the class itself doesn't
+" appear in the .cpp file and thus doesn't generate a tag). Another example
+" are anonymous structures like namespaces, structs, enums, and unions, that
+" also don't get a tag themselves. These tags are thus called 'pseudo-tags' in
+" Tagbar. Properly parsing them is quite tricky, so try not to think about it
+" too much.
+function! s:AddScopedTags(tags, processedtags, parent, depth,
+                        \ typeinfo, fileinfo)
+    if !empty(a:parent)
+        let curpath = a:parent.fullpath
+        let pscope  = a:typeinfo.kind2scope[a:parent.fields.kind]
+    else
+        let curpath = ''
+        let pscope  = ''
+    endif
+
+    let is_cur_tag = 'v:val.depth == a:depth'
+
+    if !empty(curpath)
+        " Check whether the tag is either a direct child at the current depth
+        " or at least a proper grandchild with pseudo-tags in between. If it
+        " is a direct child also check for matching scope.
+        let is_cur_tag .= ' &&
+        \ (v:val.path ==# curpath ||
+         \ match(v:val.path, ''\V\^\C'' . curpath . a:typeinfo.sro) == 0) &&
+        \ (v:val.path ==# curpath ? (v:val.scope ==# pscope) : 1)'
+    endif
+
+    let curtags = filter(copy(a:tags), is_cur_tag)
+
+    if !empty(curtags)
+        call filter(a:tags, '!(' . is_cur_tag . ')')
+
+        let realtags   = []
+        let pseudotags = []
+
+        while !empty(curtags)
+            let tag = remove(curtags, 0)
+
+            if tag.path != curpath
+                " tag is child of a pseudo-tag, so create a new pseudo-tag and
+                " add all its children to it
+                let pseudotag = s:ProcessPseudoTag(curtags, tag, a:parent,
+                                                 \ a:typeinfo, a:fileinfo)
+
+                call add(pseudotags, pseudotag)
+            else
+                call add(realtags, tag)
+            endif
+        endwhile
+
+        " Recursively add the children of the tags on the current level
+        for tag in realtags
+            let tag.parent = a:parent
+
+            if !has_key(a:typeinfo.kind2scope, tag.fields.kind)
+                continue
+            endif
+
+            if !has_key(tag, 'children')
+                let tag.children = []
+            endif
+
+            call s:AddScopedTags(a:tags, tag.children, tag, a:depth + 1,
+                               \ a:typeinfo, a:fileinfo)
+        endfor
+        call extend(a:processedtags, realtags)
+
+        " Recursively add the children of the tags that are children of the
+        " pseudo-tags on the current level
+        for tag in pseudotags
+            call s:ProcessPseudoChildren(a:tags, tag, a:depth, a:typeinfo,
+                                       \ a:fileinfo)
+        endfor
+        call extend(a:processedtags, pseudotags)
+    endif
+
+    " Now we have to check if there are any pseudo-tags at the current level
+    " so we have to check for real tags at a lower level, i.e. grandchildren
+    let is_grandchild = 'v:val.depth > a:depth'
+
+    if !empty(curpath)
+        let is_grandchild .=
+        \ ' && match(v:val.path, ''\V\^\C'' . curpath . a:typeinfo.sro) == 0'
+    endif
+
+    let grandchildren = filter(copy(a:tags), is_grandchild)
+
+    if !empty(grandchildren)
+        call s:AddScopedTags(a:tags, a:processedtags, a:parent, a:depth + 1,
+                           \ a:typeinfo, a:fileinfo)
+    endif
+endfunction
+
+" s:ProcessPseudoTag() {{{2
+function! s:ProcessPseudoTag(curtags, tag, parent, typeinfo, fileinfo)
+    let curpath = !empty(a:parent) ? a:parent.fullpath : ''
+
+    let pseudoname = substitute(a:tag.path, curpath, '', '')
+    let pseudoname = substitute(pseudoname, '\V\^' . a:typeinfo.sro, '', '')
+    let pseudotag  = s:CreatePseudoTag(pseudoname, a:parent, a:tag.scope,
+                                     \ a:typeinfo, a:fileinfo)
+    let pseudotag.children = [a:tag]
+
+    " get all the other (direct) children of the current pseudo-tag
+    let ispseudochild = 'v:val.path ==# a:tag.path && v:val.scope ==# a:tag.scope'
+    let pseudochildren = filter(copy(a:curtags), ispseudochild)
+    if !empty(pseudochildren)
+        call filter(a:curtags, '!(' . ispseudochild . ')')
+        call extend(pseudotag.children, pseudochildren)
+    endif
+
+    return pseudotag
+endfunction
+
+" s:ProcessPseudoChildren() {{{2
+function! s:ProcessPseudoChildren(tags, tag, depth, typeinfo, fileinfo)
+    for childtag in a:tag.children
+        let childtag.parent = a:tag
+
+        if !has_key(a:typeinfo.kind2scope, childtag.fields.kind)
+            continue
+        endif
+
+        if !has_key(childtag, 'children')
+            let childtag.children = []
+        endif
+
+        call s:AddScopedTags(a:tags, childtag.children, childtag, a:depth + 1,
+                           \ a:typeinfo, a:fileinfo)
+    endfor
+
+    let is_grandchild = 'v:val.depth > a:depth &&
+                       \ match(v:val.path, ''^\C'' . a:tag.fullpath) == 0'
+    let grandchildren = filter(copy(a:tags), is_grandchild)
+    if !empty(grandchildren)
+        call s:AddScopedTags(a:tags, a:tag.children, a:tag, a:depth + 1,
+                           \ a:typeinfo, a:fileinfo)
+    endif
+endfunction
+
+" s:CreatePseudoTag() {{{2
+function! s:CreatePseudoTag(name, parent, scope, typeinfo, fileinfo)
+    if !empty(a:parent)
+        let curpath = a:parent.fullpath
+        let pscope  = a:typeinfo.kind2scope[a:parent.fields.kind]
+    else
+        let curpath = ''
+        let pscope  = ''
+    endif
+
+    let pseudotag             = s:PseudoTag.New(a:name)
+    let pseudotag.fields.kind = a:typeinfo.scope2kind[a:scope]
+
+    let parentscope = substitute(curpath, a:name . '$', '', '')
+    let parentscope = substitute(parentscope,
+                               \ '\V\^' . a:typeinfo.sro . '\$', '', '')
+
+    if pscope != ''
+        let pseudotag.fields[pscope] = parentscope
+        let pseudotag.scope    = pscope
+        let pseudotag.path     = parentscope
+        let pseudotag.fullpath =
+                    \ pseudotag.path . a:typeinfo.sro . pseudotag.name
+    endif
+    let pseudotag.depth = len(split(pseudotag.path, '\V' . a:typeinfo.sro))
+
+    let pseudotag.parent = a:parent
+
+    let pseudotag.fileinfo = a:fileinfo
+
+    call pseudotag.initFoldState()
+
+    return pseudotag
+endfunction
+
+" Sorting {{{1
+" s:SortTags() {{{2
+function! s:SortTags(tags, comparemethod)
+    call sort(a:tags, a:comparemethod)
+
+    for tag in a:tags
+        if has_key(tag, 'children')
+            call s:SortTags(tag.children, a:comparemethod)
+        endif
+    endfor
+endfunction
+
+" s:CompareByKind() {{{2
+function! s:CompareByKind(tag1, tag2)
+    let typeinfo = s:compare_typeinfo
+
+    if typeinfo.kinddict[a:tag1.fields.kind] <#
+     \ typeinfo.kinddict[a:tag2.fields.kind]
+        return -1
+    elseif typeinfo.kinddict[a:tag1.fields.kind] >#
+         \ typeinfo.kinddict[a:tag2.fields.kind]
+        return 1
+    else
+        " Ignore '~' prefix for C++ destructors to sort them directly under
+        " the constructors
+        if a:tag1.name[0] ==# '~'
+            let name1 = a:tag1.name[1:]
+        else
+            let name1 = a:tag1.name
+        endif
+        if a:tag2.name[0] ==# '~'
+            let name2 = a:tag2.name[1:]
+        else
+            let name2 = a:tag2.name
+        endif
+
+        if name1 <=# name2
+            return -1
+        else
+            return 1
+        endif
+    endif
+endfunction
+
+" s:CompareByLine() {{{2
+function! s:CompareByLine(tag1, tag2)
+    return a:tag1.fields.line - a:tag2.fields.line
+endfunction
+
+" s:ToggleSort() {{{2
+function! s:ToggleSort()
+    let fileinfo = s:known_files.getCurrent()
+    if empty(fileinfo)
+        return
+    endif
+
+    let curline = line('.')
+
+    match none
+
+    let s:compare_typeinfo = s:known_types[fileinfo.ftype]
+
+    if has_key(s:compare_typeinfo, 'sort')
+        let s:compare_typeinfo.sort = !s:compare_typeinfo.sort
+    else
+        let g:tagbar_sort = !g:tagbar_sort
+    endif
+
+    call fileinfo.sortTags()
+
+    call s:RenderContent()
+
+    execute curline
+endfunction
+
+" Display {{{1
+" s:RenderContent() {{{2
+function! s:RenderContent(...)
+    if a:0 == 1
+        let fileinfo = a:1
+    else
+        let fileinfo = s:known_files.getCurrent()
+    endif
+
+    if empty(fileinfo)
+        return
+    endif
+
+    let tagbarwinnr = bufwinnr('__Tagbar__')
+
+    if &filetype == 'tagbar'
+        let in_tagbar = 1
+    else
+        let in_tagbar = 0
+        let prevwinnr = winnr()
+        execute tagbarwinnr . 'wincmd w'
+    endif
+
+    if !empty(s:known_files.getCurrent()) &&
+     \ fileinfo.fpath ==# s:known_files.getCurrent().fpath
+        " We're redisplaying the same file, so save the view
+        let saveline = line('.')
+        let savecol  = col('.')
+        let topline  = line('w0')
+    endif
+
+    let lazyredraw_save = &lazyredraw
+    set lazyredraw
+    let eventignore_save = &eventignore
+    set eventignore=all
+
+    setlocal modifiable
+
+    silent %delete _
+
+    call s:PrintHelp()
+
+    let typeinfo = s:known_types[fileinfo.ftype]
+
+    " Print tags
+    call s:PrintKinds(typeinfo, fileinfo)
+
+    " Delete empty lines at the end of the buffer
+    for linenr in range(line('$'), 1, -1)
+        if getline(linenr) =~ '^$'
+            execute 'silent ' . linenr . 'delete _'
+        else
+            break
+        endif
+    endfor
+
+    setlocal nomodifiable
+
+    if !empty(s:known_files.getCurrent()) &&
+     \ fileinfo.fpath ==# s:known_files.getCurrent().fpath
+        let scrolloff_save = &scrolloff
+        set scrolloff=0
+
+        call cursor(topline, 1)
+        normal! zt
+        call cursor(saveline, savecol)
+
+        let &scrolloff = scrolloff_save
+    else
+        " Make sure as much of the Tagbar content as possible is shown in the
+        " window by jumping to the top after drawing
+        execute 1
+        call winline()
+
+        " Invalidate highlight cache from old file
+        let s:last_highlight_tline = 0
+    endif
+
+    let &lazyredraw  = lazyredraw_save
+    let &eventignore = eventignore_save
+
+    if !in_tagbar
+        execute prevwinnr . 'wincmd w'
+    endif
+endfunction
+
+" s:PrintKinds() {{{2
+function! s:PrintKinds(typeinfo, fileinfo)
+    let first_tag = 1
+
+    for kind in a:typeinfo.kinds
+        let curtags = filter(copy(a:fileinfo.tags),
+                           \ 'v:val.fields.kind ==# kind.short')
+
+        if empty(curtags)
+            continue
+        endif
+
+        if has_key(a:typeinfo, 'kind2scope') &&
+         \ has_key(a:typeinfo.kind2scope, kind.short)
+            " Scoped tags
+            for tag in curtags
+                if g:tagbar_compact && first_tag && s:short_help
+                    silent 0put =tag.str()
+                else
+                    silent  put =tag.str()
+                endif
+
+                " Save the current tagbar line in the tag for easy
+                " highlighting access
+                let curline                   = line('.')
+                let tag.tline                 = curline
+                let a:fileinfo.tline[curline] = tag
+
+                " Print children
+                if tag.isFoldable() && !tag.isFolded()
+                    for ckind in a:typeinfo.kinds
+                        let childtags = filter(copy(tag.children),
+                                          \ 'v:val.fields.kind ==# ckind.short')
+                        if len(childtags) > 0
+                            " Print 'kind' header of following children
+                            if !has_key(a:typeinfo.kind2scope, ckind.short)
+                                silent put ='    [' . ckind.long . ']'
+                                let a:fileinfo.tline[line('.')] = tag
+                            endif
+                            for childtag in childtags
+                                call s:PrintTag(childtag, 1,
+                                              \ a:fileinfo, a:typeinfo)
+                            endfor
+                        endif
+                    endfor
+                endif
+
+                if !g:tagbar_compact
+                    silent put _
+                endif
+
+                let first_tag = 0
+            endfor
+        else
+            " Non-scoped tags
+            let kindtag = curtags[0].parent
+
+            if kindtag.isFolded()
+                let foldmarker = s:icon_closed
+            else
+                let foldmarker = s:icon_open
+            endif
+
+            if g:tagbar_compact && first_tag && s:short_help
+                silent 0put =foldmarker . ' ' . kind.long
+            else
+                silent  put =foldmarker . ' ' . kind.long
+            endif
+
+            let curline                   = line('.')
+            let kindtag.tline             = curline
+            let a:fileinfo.tline[curline] = kindtag
+
+            if !kindtag.isFolded()
+                for tag in curtags
+                    let str = tag.str()
+                    silent put ='  ' . str
+
+                    " Save the current tagbar line in the tag for easy
+                    " highlighting access
+                    let curline                   = line('.')
+                    let tag.tline                 = curline
+                    let a:fileinfo.tline[curline] = tag
+                    let tag.depth                 = 1
+                endfor
+            endif
+
+            if !g:tagbar_compact
+                silent put _
+            endif
+
+            let first_tag = 0
+        endif
+    endfor
+endfunction
+
+" s:PrintTag() {{{2
+function! s:PrintTag(tag, depth, fileinfo, typeinfo)
+    " Print tag indented according to depth
+    silent put =repeat(' ', a:depth * 2) . a:tag.str()
+
+    " Save the current tagbar line in the tag for easy
+    " highlighting access
+    let curline                   = line('.')
+    let a:tag.tline               = curline
+    let a:fileinfo.tline[curline] = a:tag
+
+    " Recursively print children
+    if a:tag.isFoldable() && !a:tag.isFolded()
+        for ckind in a:typeinfo.kinds
+            let childtags = filter(copy(a:tag.children),
+                                 \ 'v:val.fields.kind ==# ckind.short')
+            if len(childtags) > 0
+                " Print 'kind' header of following children
+                if !has_key(a:typeinfo.kind2scope, ckind.short)
+                    silent put ='    ' . repeat(' ', a:depth * 2) .
+                              \ '[' . ckind.long . ']'
+                    let a:fileinfo.tline[line('.')] = a:tag
+                endif
+                for childtag in childtags
+                    call s:PrintTag(childtag, a:depth + 1,
+                                  \ a:fileinfo, a:typeinfo)
+                endfor
+            endif
+        endfor
+    endif
+endfunction
+
+" s:PrintHelp() {{{2
+function! s:PrintHelp()
+    if !g:tagbar_compact && s:short_help
+        silent 0put ='\" Press <F1> for help'
+        silent  put _
+    elseif !s:short_help
+        silent 0put ='\" Tagbar keybindings'
+        silent  put ='\"'
+        silent  put ='\" --------- General ---------'
+        silent  put ='\" <Enter>   : Jump to tag definition'
+        silent  put ='\" <Space>   : Display tag prototype'
+        silent  put ='\"'
+        silent  put ='\" ---------- Folds ----------'
+        silent  put ='\" +, zo     : Open fold'
+        silent  put ='\" -, zc     : Close fold'
+        silent  put ='\" o, za     : Toggle fold'
+        silent  put ='\" *, zR     : Open all folds'
+        silent  put ='\" =, zM     : Close all folds'
+        silent  put ='\"'
+        silent  put ='\" ---------- Misc -----------'
+        silent  put ='\" s          : Toggle sort'
+        silent  put ='\" x          : Zoom window in/out'
+        silent  put ='\" q          : Close window'
+        silent  put ='\" <F1>       : Remove help'
+        silent  put _
+    endif
+endfunction
+
+" s:RenderKeepView() {{{2
+" The gist of this function was taken from NERDTree by Martin Grenfell.
+function! s:RenderKeepView(...)
+    if a:0 == 1
+        let line = a:1
+    else
+        let line = line('.')
+    endif
+
+    let curcol  = col('.')
+    let topline = line('w0')
+
+    call s:RenderContent()
+
+    let scrolloff_save = &scrolloff
+    set scrolloff=0
+
+    call cursor(topline, 1)
+    normal! zt
+    call cursor(line, curcol)
+
+    let &scrolloff = scrolloff_save
+
+    redraw
+endfunction
+
+" User actions {{{1
+" s:HighlightTag() {{{2
+function! s:HighlightTag()
+    let tagline = 0
+
+    let tag = s:GetNearbyTag()
+    if !empty(tag)
+        let tagline = tag.tline
+    endif
+
+    " Don't highlight the tag again if it's the same one as last time.
+    " This prevents the Tagbar window from jumping back after scrolling with
+    " the mouse.
+    if tagline == s:last_highlight_tline
+        return
+    else
+        let s:last_highlight_tline = tagline
+    endif
+
+    let eventignore_save = &eventignore
+    set eventignore=all
+
+    let tagbarwinnr = bufwinnr('__Tagbar__')
+    let prevwinnr   = winnr()
+    execute tagbarwinnr . 'wincmd w'
+
+    match none
+
+    " No tag above cursor position so don't do anything
+    if tagline == 0
+        execute prevwinnr . 'wincmd w'
+        let &eventignore = eventignore_save
+        redraw
+        return
+    endif
+
+    if g:tagbar_autoshowtag
+        call s:OpenParents(tag)
+    endif
+
+    " Check whether the tag is inside a closed fold and highlight the parent
+    " instead in that case
+    let tagline = tag.getClosedParentTline()
+
+    " Go to the line containing the tag
+    execute tagline
+
+    " Make sure the tag is visible in the window
+    call winline()
+
+    let foldpat = '[' . s:icon_open . s:icon_closed . ' ]'
+    let pattern = '/^\%' . tagline . 'l\s*' . foldpat . '[-+# ]\zs[^( ]\+\ze/'
+    execute 'match TagbarHighlight ' . pattern
+
+    execute prevwinnr . 'wincmd w'
+
+    let &eventignore = eventignore_save
+
+    redraw
+endfunction
+
+" s:JumpToTag() {{{2
+function! s:JumpToTag(stay_in_tagbar)
+    let taginfo = s:GetTagInfo(line('.'), 1)
+
+    let autoclose = w:autoclose
+
+    if empty(taginfo) || has_key(taginfo, 'numtags')
+        return
+    endif
+
+    let tagbarwinnr = winnr()
+
+    let eventignore_save = &eventignore
+    set eventignore=all
+
+    " This elaborate construct will try to switch to the correct
+    " buffer/window; if the buffer isn't currently shown in a window it will
+    " open it in the first window with a non-special buffer in it
+    wincmd p
+    let filebufnr = bufnr(taginfo.fileinfo.fpath)
+    if bufnr('%') != filebufnr
+        let filewinnr = bufwinnr(filebufnr)
+        if filewinnr != -1
+            execute filewinnr . 'wincmd w'
+        else
+            for i in range(1, winnr('$'))
+                execute i . 'wincmd w'
+                if &buftype == ''
+                    execute 'buffer ' . filebufnr
+                    break
+                endif
+            endfor
+        endif
+        " To make ctrl-w_p work we switch between the Tagbar window and the
+        " correct window once
+        execute tagbarwinnr . 'wincmd w'
+        wincmd p
+    endif
+
+    " Mark current position so it can be jumped back to
+    mark '
+
+    " Jump to the line where the tag is defined. Don't use the search pattern
+    " since it doesn't take the scope into account and thus can fail if tags
+    " with the same name are defined in different scopes (e.g. classes)
+    execute taginfo.fields.line
+
+    " If the file has been changed but not saved, the tag may not be on the
+    " saved line anymore, so search for it in the vicinity of the saved line
+    if match(getline('.'), taginfo.pattern) == -1
+        let interval = 1
+        let forward  = 1
+        while search(taginfo.pattern, 'W' . forward ? '' : 'b') == 0
+            if !forward
+                if interval > line('$')
+                    break
+                else
+                    let interval = interval * 2
+                endif
+            endif
+            let forward = !forward
+        endwhile
+    endif
+
+    " If the tag is on a different line after unsaved changes update the tag
+    " and file infos/objects
+    let curline = line('.')
+    if taginfo.fields.line != curline
+        let taginfo.fields.line = curline
+        let taginfo.fileinfo.fline[curline] = taginfo
+    endif
+
+    " Center the tag in the window
+    normal! z.
+
+    if foldclosed('.') != -1
+        .foldopen!
+    endif
+
+    redraw
+
+    let &eventignore = eventignore_save
+
+    if a:stay_in_tagbar
+        call s:HighlightTag()
+        execute tagbarwinnr . 'wincmd w'
+    elseif g:tagbar_autoclose || autoclose
+        call s:CloseWindow()
+    else
+        call s:HighlightTag()
+    endif
+endfunction
+
+" s:ShowPrototype() {{{2
+function! s:ShowPrototype()
+    let taginfo = s:GetTagInfo(line('.'), 1)
+
+    if empty(taginfo)
+        return
+    endif
+
+    echo taginfo.getPrototype()
+endfunction
+
+" s:ToggleHelp() {{{2
+function! s:ToggleHelp()
+    let s:short_help = !s:short_help
+
+    " Prevent highlighting from being off after adding/removing the help text
+    match none
+
+    call s:RenderContent()
+
+    execute 1
+    redraw
+endfunction
+
+" s:GotoNextToplevelTag() {{{2
+function! s:GotoNextToplevelTag(direction)
+    let curlinenr = line('.')
+    let newlinenr = line('.')
+
+    if a:direction == 1
+        let range = range(line('.') + 1, line('$'))
+    else
+        let range = range(line('.') - 1, 1, -1)
+    endif
+
+    for tmplinenr in range
+        let taginfo = s:GetTagInfo(tmplinenr, 0)
+
+        if empty(taginfo)
+            continue
+        elseif empty(taginfo.parent)
+            let newlinenr = tmplinenr
+            break
+        endif
+    endfor
+
+    if curlinenr != newlinenr
+        execute newlinenr
+        call winline()
+    endif
+
+    redraw
+endfunction
+
+" Folding {{{1
+" s:OpenFold() {{{2
+function! s:OpenFold()
+    let fileinfo = s:known_files.getCurrent()
+    if empty(fileinfo)
+        return
+    endif
+
+    let curline = line('.')
+
+    let tag = s:GetTagInfo(curline, 0)
+    if empty(tag)
+        return
+    endif
+
+    call tag.openFold()
+
+    call s:RenderKeepView()
+endfunction
+
+" s:CloseFold() {{{2
+function! s:CloseFold()
+    let fileinfo = s:known_files.getCurrent()
+    if empty(fileinfo)
+        return
+    endif
+
+    match none
+
+    let curline = line('.')
+
+    let curtag = s:GetTagInfo(curline, 0)
+    if empty(curtag)
+        return
+    endif
+
+    let newline = curtag.closeFold()
+
+    call s:RenderKeepView(newline)
+endfunction
+
+" s:ToggleFold() {{{2
+function! s:ToggleFold()
+    let fileinfo = s:known_files.getCurrent()
+    if empty(fileinfo)
+        return
+    endif
+
+    match none
+
+    let curtag = s:GetTagInfo(line('.'), 0)
+    if empty(curtag)
+        return
+    endif
+
+    let newline = line('.')
+
+    if curtag.isKindheader()
+        call curtag.toggleFold()
+    elseif curtag.isFoldable()
+        if curtag.isFolded()
+            call curtag.openFold()
+        else
+            let newline = curtag.closeFold()
+        endif
+    else
+        let newline = curtag.closeFold()
+    endif
+
+    call s:RenderKeepView(newline)
+endfunction
+
+" s:SetFoldLevel() {{{2
+function! s:SetFoldLevel(level)
+    if a:level < 0
+        echoerr 'Foldlevel can''t be negative'
+        return
+    endif
+
+    let fileinfo = s:known_files.getCurrent()
+    if empty(fileinfo)
+        return
+    endif
+
+    call s:SetFoldLevelRecursive(fileinfo, fileinfo.tags, a:level)
+
+    let typeinfo = s:known_types[fileinfo.ftype]
+
+    " Apply foldlevel to 'kind's
+    if a:level == 0
+        for kind in typeinfo.kinds
+            call fileinfo.closeKindFold(kind)
+        endfor
+    else
+        for kind in typeinfo.kinds
+            call fileinfo.openKindFold(kind)
+        endfor
+    endif
+
+    let fileinfo.foldlevel = a:level
+
+    call s:RenderContent()
+endfunction
+
+" s:SetFoldLevelRecursive() {{{2
+" Apply foldlevel to normal tags
+function! s:SetFoldLevelRecursive(fileinfo, tags, level)
+    for tag in a:tags
+        if tag.depth >= a:level
+            call tag.setFolded(1)
+        else
+            call tag.setFolded(0)
+        endif
+
+        if has_key(tag, 'children')
+            call s:SetFoldLevelRecursive(a:fileinfo, tag.children, a:level)
+        endif
+    endfor
+endfunction
+
+" s:OpenParents() {{{2
+function! s:OpenParents(...)
+    let tagline = 0
+
+    if a:0 == 1
+        let tag = a:1
+    else
+        let tag = s:GetNearbyTag()
+    endif
+
+    call tag.openParents()
+
+    call s:RenderKeepView()
+endfunction
+
+" Helper functions {{{1
+" s:CleanUp() {{{2
+function! s:CleanUp()
+    silent autocmd! TagbarAutoCmds
+
+    unlet s:is_maximized
+    unlet s:compare_typeinfo
+    unlet s:short_help
+endfunction
+
+" s:CleanupFileinfo() {{{2
+function! s:CleanupFileinfo(fname)
+    call s:known_files.rm(a:fname)
+endfunction
+
+" s:QuitIfOnlyWindow() {{{2
+function! s:QuitIfOnlyWindow()
+    " Before quitting Vim, delete the tagbar buffer so that
+    " the '0 mark is correctly set to the previous buffer.
+    if winbufnr(2) == -1
+        " Check if there is more than one tab page
+        if tabpagenr('$') == 1
+            bdelete
+            quit
+        else
+            close
+        endif
+    endif
+endfunction
+
+" s:AutoUpdate() {{{2
+function! s:AutoUpdate(fname)
+    " Don't do anything if tagbar is not open or if we're in the tagbar window
+    let tagbarwinnr = bufwinnr('__Tagbar__')
+    if tagbarwinnr == -1 || &filetype == 'tagbar'
+        return
+    endif
+
+    " Only consider the main filetype in cases like 'python.django'
+    let ftype = get(split(&filetype, '\.'), 0, '')
+
+    " Don't do anything if the file isn't supported
+    if !s:IsValidFile(a:fname, ftype)
+        return
+    endif
+
+    " Process the file if it's unknown or the information is outdated
+    " Also test for entries that exist but are empty, which will be the case
+    " if there was an error during the ctags execution
+    if s:known_files.has(a:fname) && !empty(s:known_files.get(a:fname))
+        if s:known_files.get(a:fname).mtime != getftime(a:fname)
+            call s:ProcessFile(a:fname, ftype)
+        endif
+    elseif !s:known_files.has(a:fname)
+        call s:ProcessFile(a:fname, ftype)
+    endif
+
+    let fileinfo = s:known_files.get(a:fname)
+
+    " If we don't have an entry for the file by now something must have gone
+    " wrong, so don't change the tagbar content
+    if empty(fileinfo)
+        return
+    endif
+
+    " Display the tagbar content
+    call s:RenderContent(fileinfo)
+
+    " Call setCurrent after rendering so RenderContent can check whether the
+    " same file is redisplayed
+    if !empty(fileinfo)
+        call s:known_files.setCurrent(fileinfo)
+    endif
+
+    call s:HighlightTag()
+endfunction
+
+" s:IsValidFile() {{{2
+function! s:IsValidFile(fname, ftype)
+    if a:fname == '' || a:ftype == ''
+        return 0
+    endif
+
+    if !filereadable(a:fname)
+        return 0
+    endif
+
+    if !has_key(s:known_types, a:ftype)
+        return 0
+    endif
+
+    return 1
+endfunction
+
+" s:EscapeCtagsCmd() {{{2
+" Assemble the ctags command line in a way that all problematic characters are
+" properly escaped and converted to the system's encoding
+" Optional third parameter is a file name to run ctags on
+function! s:EscapeCtagsCmd(ctags_bin, args, ...)
+    if exists('+shellslash')
+        let shellslash_save = &shellslash
+        set noshellslash
+    endif
+
+    if a:0 == 1
+        let fname = shellescape(a:1)
+    else
+        let fname = ''
+    endif
+
+    let ctags_cmd = shellescape(a:ctags_bin) . ' ' . a:args . ' ' . fname
+
+    if exists('+shellslash')
+        let &shellslash = shellslash_save
+    endif
+
+    " Needed for cases where 'encoding' is different from the system's
+    " encoding
+    if g:tagbar_systemenc != &encoding
+        let ctags_cmd = iconv(ctags_cmd, &encoding, g:tagbar_systemenc)
+    elseif $LANG != ''
+        let ctags_cmd = iconv(ctags_cmd, &encoding, $LANG)
+    endif
+
+    if ctags_cmd == ''
+        echoerr 'Tagbar: Encoding conversion failed!'
+              \ 'Please make sure your system is set up correctly'
+              \ 'and that Vim is compiled with the "iconv" feature.'
+    endif
+
+    return ctags_cmd
+endfunction
+
+" s:ExecuteCtags() {{{2
+" Execute ctags with necessary shell settings
+" Partially based on the discussion at
+" http://vim.1045645.n5.nabble.com/bad-default-shellxquote-in-Widows-td1208284.html
+function! s:ExecuteCtags(ctags_cmd)
+    if exists('+shellslash')
+        let shellslash_save = &shellslash
+        set noshellslash
+    endif
+
+    if &shell =~ 'cmd\.exe'
+        let shellxquote_save = &shellxquote
+        set shellxquote=\"
+        let shellcmdflag_save = &shellcmdflag
+        set shellcmdflag=/s\ /c
+    endif
+
+    let ctags_output = system(a:ctags_cmd)
+
+    if &shell =~ 'cmd\.exe'
+        let &shellxquote  = shellxquote_save
+        let &shellcmdflag = shellcmdflag_save
+    endif
+
+    if exists('+shellslash')
+        let &shellslash = shellslash_save
+    endif
+
+    return ctags_output
+endfunction
+
+" s:GetTagInfo() {{{2
+" Return the info dictionary of the tag on the specified line. If the line
+" does not contain a valid tag (for example because it is empty or only
+" contains a pseudo-tag) return an empty dictionary.
+function! s:GetTagInfo(linenr, ignorepseudo)
+    let fileinfo = s:known_files.getCurrent()
+
+    if empty(fileinfo)
+        return {}
+    endif
+
+    " Don't do anything in empty and comment lines
+    let curline = getline(a:linenr)
+    if curline =~ '^\s*$' || curline[0] == '"'
+        return {}
+    endif
+
+    " Check if there is a tag on the current line
+    if !has_key(fileinfo.tline, a:linenr)
+        return {}
+    endif
+
+    let taginfo = fileinfo.tline[a:linenr]
+
+    " Check if the current tag is not a pseudo-tag
+    if a:ignorepseudo && taginfo.isPseudoTag()
+        return {}
+    endif
+
+    return taginfo
+endfunction
+
+" s:GetNearbyTag() {{{2
+" Get the tag info for a file near the cursor in the current file
+function! s:GetNearbyTag()
+    let fileinfo = s:known_files.getCurrent()
+
+    let curline = line('.')
+    let tag = {}
+
+    " If a tag appears in a file more than once (for example namespaces in
+    " C++) only one of them has a 'tline' entry and can thus be highlighted.
+    " The only way to solve this would be to go over the whole tag list again,
+    " making everything slower. Since this should be a rare occurence and
+    " highlighting isn't /that/ important ignore it for now.
+    for line in range(curline, 1, -1)
+        if has_key(fileinfo.fline, line)
+            let tag = fileinfo.fline[line]
+            break
+        endif
+    endfor
+
+    return tag
+endfunction
+
+" s:CheckMouseClick() {{{2
+function! s:CheckMouseClick()
+    let line   = getline('.')
+    let curcol = col('.')
+
+    if (match(line, s:icon_open . '[-+ ]') + 1) == curcol
+        call s:CloseFold()
+    elseif (match(line, s:icon_closed . '[-+ ]') + 1) == curcol
+        call s:OpenFold()
+    elseif g:tagbar_singleclick
+        call s:JumpToTag(0)
+    endif
+endfunction
+
+" TagbarBalloonExpr() {{{2
+function! TagbarBalloonExpr()
+    let taginfo = s:GetTagInfo(v:beval_lnum, 1)
+
+    if empty(taginfo)
+        return
+    endif
+
+    return taginfo.getPrototype()
+endfunction
+
+" TagbarGenerateStatusline() {{{2
+function! TagbarGenerateStatusline()
+    if g:tagbar_sort
+        let text = '[Name]'
+    else
+        let text = '[Order]'
+    endif
+
+    if !empty(s:known_files.getCurrent())
+        let filename = fnamemodify(s:known_files.getCurrent().fpath, ':t')
+        let text .= ' ' . filename
+    endif
+
+    return text
+endfunction
+
+" Autoload functions {{{1
+function! tagbar#ToggleWindow()
+    call s:ToggleWindow()
+endfunction
+
+function! tagbar#OpenWindow(...)
+    let flags = a:0 > 0 ? a:1 : ''
+    call s:OpenWindow(flags)
+endfunction
+
+function! tagbar#CloseWindow()
+    call s:CloseWindow()
+endfunction
+
+function! tagbar#SetFoldLevel(...)
+    call s:SetFoldLevel(a:1)
+endfunction
+
+function! tagbar#OpenParents()
+    call s:OpenParents()
+endfunction
+
+function! tagbar#RestoreSession()
+    call s:RestoreSession()
+endfunction
+
+" Modeline {{{1
+" vim: ts=8 sw=4 sts=4 et foldenable foldmethod=marker foldcolumn=1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/OceanicNext.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,268 @@
+" ===============================================================
+" OceanicNext
+" Author: Mike Hartington
+" ===============================================================
+
+" {{{ Setup
+  set background=dark
+  hi clear
+  if exists("syntax_on")
+    syntax reset
+  endif
+  let g:colors_name="OceanicNext"
+" }}}
+" {{{ Italics
+  let g:oceanic_next_terminal_italic = get(g:, 'oceanic_next_terminal_italic', 0)
+  let s:italic = ""
+  if g:oceanic_next_terminal_italic == 1
+    let s:italic = "italic"
+  endif
+"}}}
+" {{{ Bold
+  let g:oceanic_next_terminal_bold = get(g:, 'oceanic_next_terminal_bold', 0)
+  let s:bold = ""
+  if g:oceanic_next_terminal_bold == 1
+   let s:bold = "bold"
+  endif
+"}}}
+" {{{ Colors
+  let s:base00=['#1b2b34', '235']
+  let s:base01=['#343d46', '237']
+  let s:base02=['#4f5b66', '240']
+  let s:base03=['#65737e', '243']
+  let s:base04=['#a7adba', '145']
+  let s:base05=['#c0c5ce', '251']
+  let s:base06=['#cdd3de', '252']
+  let s:base07=['#d8dee9', '253']
+  let s:base08=['#ec5f67', '203']
+  let s:base09=['#f99157', '209']
+  let s:base0A=['#fac863', '221']
+  let s:base0B=['#99c794', '114']
+  let s:base0C=['#62b3b2', '73']
+  let s:base0D=['#6699cc', '68']
+  let s:base0E=['#c594c5', '176']
+  let s:base0F=['#ab7967', '137']
+  let s:base10=['#ffffff', '15']
+  let s:none=['NONE', 'NONE']
+" }}}
+" {{{ Highlight function
+function! <sid>hi(group, fg, bg, attr, attrsp)
+  " fg, bg, attr, attrsp
+  if !empty(a:fg)
+    exec "hi " . a:group . " guifg=" .  a:fg[0]
+    exec "hi " . a:group . " ctermfg=" . a:fg[1]
+  endif
+  if !empty(a:bg)
+    exec "hi " . a:group . " guibg=" .  a:bg[0]
+    exec "hi " . a:group . " ctermbg=" . a:bg[1]
+  endif
+  if a:attr != ""
+    exec "hi " . a:group . " gui=" .   a:attr
+    exec "hi " . a:group . " cterm=" . a:attr
+  endif
+  if !empty(a:attrsp)
+    exec "hi " . a:group . " guisp=" . a:attrsp[0]
+  endif
+endfunction
+" }}}
+" {{{ call <sid>:hi(group, fg, bg, gui, guisp)
+call <sid>hi('Bold',                       '',       '',       'bold',      '')
+call <sid>hi('Debug',                      s:base08, '',       '',          '')
+call <sid>hi('Directory',                  s:base0D, '',       '',          '')
+call <sid>hi('ErrorMsg',                   s:base08, s:base00, '',          '')
+call <sid>hi('Exception',                  s:base08, '',       '',          '')
+call <sid>hi('FoldColumn',                 s:base0D, s:base00, '',          '')
+call <sid>hi('Folded',                     s:base03, s:base01, s:italic,    '')
+call <sid>hi('IncSearch',                  s:base01, s:base09, '',          '')
+call <sid>hi('Italic',                     '',       '',       s:italic,    '')
+
+call <sid>hi('Macro',                      s:base08, '',       '',          '')
+call <sid>hi('MatchParen',                 s:base05, s:base03, '',          '')
+call <sid>hi('ModeMsg',                    s:base0B, '',       '',          '')
+call <sid>hi('MoreMsg',                    s:base0B, '',       '',          '')
+call <sid>hi('Question',                   s:base0D, '',       '',          '')
+call <sid>hi('Search',                     s:base03, s:base0A, '',          '')
+call <sid>hi('SpecialKey',                 s:base03, '',       '',          '')
+call <sid>hi('TooLong',                    s:base08, '',       '',          '')
+call <sid>hi('Underlined',                 s:base08, '',       '',          '')
+call <sid>hi('Visual',                     '',       s:base02, '',          '')
+call <sid>hi('VisualNOS',                  s:base08, '',       '',          '')
+call <sid>hi('WarningMsg',                 s:base08, '',       '',          '')
+call <sid>hi('WildMenu',                   s:base10, s:base0D, '',          '')
+call <sid>hi('Title',                      s:base0D, '',       '',          '')
+call <sid>hi('Conceal',                    s:base0D, s:base00, '',          '')
+call <sid>hi('Cursor',                     s:base00, s:base05, '',          '')
+call <sid>hi('NonText',                    s:base03, '',       '',          '')
+call <sid>hi('Normal',                     s:base05, s:base00, '',          '')
+call <sid>hi('LineNr',                     s:base03, s:base00, '',          '')
+call <sid>hi('SignColumn',                 s:base00, s:base00, '',          '')
+call <sid>hi('StatusLine',                 s:base01, s:base03, '',          '')
+call <sid>hi('StatusLineNC',               s:base03, s:base01, '',          '')
+call <sid>hi('VertSplit',                  s:base00, s:base02, '',          '')
+call <sid>hi('ColorColumn',                '',       s:base01, '',          '')
+call <sid>hi('CursorColumn',               '',       s:base01, '',          '')
+call <sid>hi('CursorLine',                 '',       s:base01, '',          '')
+call <sid>hi('CursorLineNR',               s:base00, s:base00, '',          '')
+call <sid>hi('CursorLineNr',               s:base03, s:base01, '',          '')
+call <sid>hi('PMenu',                      s:base04, s:base01, '',          '')
+call <sid>hi('PMenuSel',                   s:base10, s:base0D, '',          '')
+call <sid>hi('PmenuSbar',                  '',       s:base02, '',          '')
+call <sid>hi('PmenuThumb',                 '',       s:base07, '',          '')
+call <sid>hi('TabLine',                    s:base03, s:base01, '',          '')
+call <sid>hi('TabLineFill',                s:base03, s:base01, '',          '')
+call <sid>hi('TabLineSel',                 s:base0B, s:base01, '',          '')
+call <sid>hi('helpExample',                s:base0A, '',       '',          '')
+call <sid>hi('helpCommand',                s:base0A, '',       '',          '')
+
+" Standard syntax highlighting
+call <sid>hi('Boolean',                    s:base09, '',       '',          '')
+call <sid>hi('Character',                  s:base08, '',       '',          '')
+call <sid>hi('Comment',                    s:base03, '',       s:italic,    '')
+call <sid>hi('Conditional',                s:base0E, '',       '',          '')
+call <sid>hi('Constant',                   s:base09, '',       '',          '')
+call <sid>hi('Define',                     s:base0E, '',       '',          '')
+call <sid>hi('Delimiter',                  s:base0F, '',       '',          '')
+call <sid>hi('Float',                      s:base09, '',       '',          '')
+call <sid>hi('Function',                   s:base0D, '',       '',          '')
+call <sid>hi('Identifier',                 s:base08, '',       '',          '')
+call <sid>hi('Include',                    s:base0D, '',       '',          '')
+call <sid>hi('Keyword',                    s:base0E, '',       '',          '')
+call <sid>hi('Label',                      s:base0A, '',       '',          '')
+call <sid>hi('Number',                     s:base09, '',       '',          '')
+call <sid>hi('Operator',                   s:base05, '',       '',          '')
+call <sid>hi('PreProc',                    s:base0A, '',       '',          '')
+call <sid>hi('Repeat',                     s:base0A, '',       '',          '')
+call <sid>hi('Special',                    s:base0C, '',       '',          '')
+call <sid>hi('SpecialChar',                s:base0F, '',       '',          '')
+call <sid>hi('Statement',                  s:base08, '',       '',          '')
+call <sid>hi('StorageClass',               s:base0A, '',       '',          '')
+call <sid>hi('String',                     s:base0B, '',       '',          '')
+call <sid>hi('Structure',                  s:base0E, '',       '',          '')
+call <sid>hi('Tag',                        s:base0A, '',       '',          '')
+call <sid>hi('Todo',                       s:base0A, s:base01, '',          '')
+call <sid>hi('Type',                       s:base0A, '',       '',          '')
+call <sid>hi('Typedef',                    s:base0A, '',       '',          '')
+
+call <sid>hi('SpellBad',                   '',       s:base00, 'undercurl', '')
+call <sid>hi('SpellLocal',                 '',       s:base00, 'undercurl', '')
+call <sid>hi('SpellCap',                   '',       s:base00, 'undercurl', '')
+call <sid>hi('SpellRare',                  '',       s:base00, 'undercurl', '')
+
+call <sid>hi('csClass',                    s:base0A, '',       '',          '')
+call <sid>hi('csAttribute',                s:base0A, '',       '',          '')
+call <sid>hi('csModifier',                 s:base0E, '',       '',          '')
+call <sid>hi('csType',                     s:base08, '',       '',          '')
+call <sid>hi('csUnspecifiedStatement',     s:base0D, '',       '',          '')
+call <sid>hi('csContextualStatement',      s:base0E, '',       '',          '')
+call <sid>hi('csNewDecleration',           s:base08, '',       '',          '')
+call <sid>hi('cOperator',                  s:base0C, '',       '',          '')
+call <sid>hi('cPreCondit',                 s:base0E, '',       '',          '')
+
+call <sid>hi('cssColor',                   s:base0C, '',       '',          '')
+call <sid>hi('cssBraces',                  s:base05, '',       '',          '')
+call <sid>hi('cssClassName',               s:base0E, '',       '',          '')
+
+
+call <sid>hi('DiffAdd',                    s:base0B, s:base01, '',          '')
+call <sid>hi('DiffChange',                 s:base03, s:base01, '',          '')
+call <sid>hi('DiffDelete',                 s:base08, s:base01, '',          '')
+call <sid>hi('DiffText',                   s:base0D, s:base01, '',          '')
+call <sid>hi('DiffAdded',                  s:base10, s:base0B, '',          '')
+call <sid>hi('DiffFile',                   s:base08, s:base00, '',          '')
+call <sid>hi('DiffNewFile',                s:base0B, s:base00, '',          '')
+call <sid>hi('DiffLine',                   s:base0D, s:base00, '',          '')
+call <sid>hi('DiffRemoved',                s:base10, s:base08, '',          '')
+
+call <sid>hi('gitCommitOverflow',          s:base08, '',       '',          '')
+call <sid>hi('gitCommitSummary',           s:base0B, '',       '',          '')
+
+call <sid>hi('htmlBold',                   s:base0A, '',       '',          '')
+call <sid>hi('htmlItalic',                 s:base0E, '',       '',          '')
+call <sid>hi('htmlTag',                    s:base0C, '',       '',          '')
+call <sid>hi('htmlEndTag',                 s:base0C, '',       '',          '')
+call <sid>hi('htmlArg',                    s:base0A, '',       '',          '')
+call <sid>hi('htmlTagName',                s:base07, '',       '',          '')
+
+call <sid>hi('javaScript',                 s:base05, '',       '',          '')
+call <sid>hi('javaScriptNumber',           s:base09, '',       '',          '')
+call <sid>hi('javaScriptBraces',           s:base05, '',       '',          '')
+
+call <sid>hi('markdownCode',               s:base0B, '',       '',          '')
+call <sid>hi('markdownCodeBlock',          s:base0B, '',       '',          '')
+call <sid>hi('markdownHeadingDelimiter',   s:base0D, '',       '',          '')
+call <sid>hi('markdownItalic',             s:base0E, '',       s:italic,    '')
+call <sid>hi('markdownBold',               s:base0A, '',       s:bold,      '')
+call <sid>hi('markdownCodeDelimiter',      s:base0F, '',       s:italic,    '')
+call <sid>hi('markdownError',              s:base05, s:base00, '',          '')
+
+call <sid>hi('NeomakeErrorSign',           s:base08, s:base01, '',          '')
+call <sid>hi('NeomakeWarningSign',         s:base0A, s:base01, '',          '')
+call <sid>hi('NeomakeInfoSign',            s:base10, s:base01, '',          '')
+call <sid>hi('NeomakeError',               s:base08, '',       'undercurl', s:base08)
+call <sid>hi('NeomakeWarning',             s:base08, '',       'undercurl', s:base08)
+
+call <sid>hi('ALEErrorSign',               s:base08, s:base00, s:bold,      '')
+call <sid>hi('ALEWarningSign',             s:base0A, s:base00, s:bold,      '')
+call <sid>hi('ALEInfoSign',                s:base10, s:base00, s:bold,      '')
+
+call <sid>hi('NERDTreeExecFile',           s:base05, '',       '',          '')
+call <sid>hi('NERDTreeDirSlash',           s:base0D, '',       '',          '')
+call <sid>hi('NERDTreeOpenable',           s:base0D, '',       '',          '')
+
+
+
+call <sid>hi('phpComparison',              s:base05, '',       '',          '')
+call <sid>hi('phpParent',                  s:base05, '',       '',          '')
+call <sid>hi('phpMemberSelector',          s:base05, '',       '',          '')
+
+call <sid>hi('pythonRepeat',               s:base0E, '',       '',          '')
+call <sid>hi('pythonOperator',             s:base0E, '',       '',          '')
+
+call <sid>hi('rubyConstant',               s:base0A, '',       '',          '')
+call <sid>hi('rubySymbol',                 s:base0B, '',       '',          '')
+call <sid>hi('rubyAttribute',              s:base0D, '',       '',          '')
+call <sid>hi('rubyInterpolation',          s:base0B, '',       '',          '')
+call <sid>hi('rubyInterpolationDelimiter', s:base0F, '',       '',          '')
+call <sid>hi('rubyStringDelimiter',        s:base0B, '',       '',          '')
+call <sid>hi('rubyRegexp',                 s:base0C, '',       '',          '')
+
+call <sid>hi('sassidChar',                 s:base08, '',       '',          '')
+call <sid>hi('sassClassChar',              s:base09, '',       '',          '')
+call <sid>hi('sassInclude',                s:base0E, '',       '',          '')
+call <sid>hi('sassMixing',                 s:base0E, '',       '',          '')
+call <sid>hi('sassMixinName',              s:base0D, '',       '',          '')
+
+call <sid>hi('vimfilerLeaf',               s:base05, '',       '',          '')
+call <sid>hi('vimfilerNormalFile',         s:base05, s:base00, '',          '')
+call <sid>hi('vimfilerOpenedFile',         s:base0D, '',       '',          '')
+call <sid>hi('vimfilerClosedFile',         s:base0D, '',       '',          '')
+
+call <sid>hi('GitGutterAdd',               s:base0B, s:base00, s:bold,      '')
+call <sid>hi('GitGutterChange',            s:base0D, s:base00, s:bold,      '')
+call <sid>hi('GitGutterDelete',            s:base08, s:base00, s:bold,      '')
+call <sid>hi('GitGutterChangeDelete',      s:base0E, s:base00, s:bold,      '')
+
+
+call <sid>hi('xmlTag',                     s:base0C, '',       '',          '')
+call <sid>hi('xmlTagName',                 s:base05, '',       '',          '')
+call <sid>hi('xmlEndTag',                  s:base0C, '',       '',          '')
+" }}}
+
+let g:terminal_color_0=s:base00[0]
+let g:terminal_color_1=s:base08[0]
+let g:terminal_color_2=s:base0B[0]
+let g:terminal_color_3=s:base0A[0]
+let g:terminal_color_4=s:base0D[0]
+let g:terminal_color_5=s:base0E[0]
+let g:terminal_color_6=s:base0C[0]
+let g:terminal_color_7=s:base05[0]
+let g:terminal_color_8=s:base03[0]
+let g:terminal_color_9=s:base09[0]
+let g:terminal_color_10=s:base01[0]
+let g:terminal_color_11=s:base02[0]
+let g:terminal_color_12=s:base04[0]
+let g:terminal_color_13=s:base06[0]
+let g:terminal_color_14=s:base0F[0]
+let g:terminal_color_15=s:base07[0]
+let g:terminal_color_background=s:base00[0]
+let g:terminal_color_foreground=s:base10[0]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/badwolf.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,670 @@
+"      _               _                 _  __
+"     | |__   __ _  __| | __      _____ | |/ _|
+"     | '_ \ / _` |/ _` | \ \ /\ / / _ \| | |_
+"     | |_) | (_| | (_| |  \ V  V / (_) | |  _|
+"     |_.__/ \__,_|\__,_|   \_/\_/ \___/|_|_|
+"
+"      I am the Bad Wolf. I create myself.
+"       I take the words. I scatter them in time and space.
+"        A message to lead myself here.
+"
+" A Vim colorscheme pieced together by Steve Losh.
+" Available at http://stevelosh.com/projects/badwolf/
+"
+" Why? {{{
+"
+" After using Molokai for quite a long time, I started longing for
+" a replacement.
+"
+" I love Molokai's high contrast and gooey, saturated tones, but it can be
+" a little inconsistent at times.
+"
+" Also it's winter here in Rochester, so I wanted a color scheme that's a bit
+" warmer.  A little less blue and a bit more red.
+"
+" And so Bad Wolf was born.  I'm no designer, but designers have been scattering
+" beautiful colors through time and space long before I came along.  I took
+" advantage of that and reused some of my favorites to lead me to this scheme.
+"
+" }}}
+
+" Supporting code -------------------------------------------------------------
+" Preamble {{{
+
+if !has("gui_running") && &t_Co != 88 && &t_Co != 256
+    finish
+endif
+
+set background=dark
+
+if exists("syntax_on")
+    syntax reset
+endif
+
+let g:colors_name = "badwolf"
+
+if !exists("g:badwolf_html_link_underline") " {{{
+    let g:badwolf_html_link_underline = 1
+endif " }}}
+
+if !exists("g:badwolf_css_props_highlight") " {{{
+    let g:badwolf_css_props_highlight = 0
+endif " }}}
+
+" }}}
+" Palette {{{
+
+let s:bwc = {}
+
+" The most basic of all our colors is a slightly tweaked version of the Molokai
+" Normal text.
+let s:bwc.plain = ['f8f6f2', 15]
+
+" Pure and simple.
+let s:bwc.snow = ['ffffff', 15]
+let s:bwc.coal = ['000000', 16]
+
+" All of the Gravel colors are based on a brown from Clouds Midnight.
+let s:bwc.brightgravel   = ['d9cec3', 252]
+let s:bwc.lightgravel    = ['998f84', 245]
+let s:bwc.gravel         = ['857f78', 243]
+let s:bwc.mediumgravel   = ['666462', 241]
+let s:bwc.deepgravel     = ['45413b', 238]
+let s:bwc.deepergravel   = ['35322d', 236]
+let s:bwc.darkgravel     = ['242321', 235]
+let s:bwc.blackgravel    = ['1c1b1a', 233]
+let s:bwc.blackestgravel = ['141413', 232]
+
+" A color sampled from a highlight in a photo of a glass of Dale's Pale Ale on
+" my desk.
+let s:bwc.dalespale = ['fade3e', 221]
+
+" A beautiful tan from Tomorrow Night.
+let s:bwc.dirtyblonde = ['f4cf86', 222]
+
+" Delicious, chewy red from Made of Code for the poppiest highlights.
+let s:bwc.taffy = ['ff2c4b', 196]
+
+" Another chewy accent, but use sparingly!
+let s:bwc.saltwatertaffy = ['8cffba', 121]
+
+" The star of the show comes straight from Made of Code.
+"
+" You should almost never use this.  It should be used for things that denote
+" 'where the user is', which basically consists of:
+"
+" * The cursor
+" * A REPL prompt
+let s:bwc.tardis = ['0a9dff', 39]
+
+" This one's from Mustang, not Florida!
+let s:bwc.orange = ['ffa724', 214]
+
+" A limier green from Getafe.
+let s:bwc.lime = ['aeee00', 154]
+
+" Rose's dress in The Idiot's Lantern.
+let s:bwc.dress = ['ff9eb8', 211]
+
+" Another play on the brown from Clouds Midnight.  I love that color.
+let s:bwc.toffee = ['b88853', 137]
+
+" Also based on that Clouds Midnight brown.
+let s:bwc.coffee    = ['c7915b', 173]
+let s:bwc.darkroast = ['88633f', 95]
+
+" }}}
+" Highlighting Function {{{
+function! s:HL(group, fg, ...)
+    " Arguments: group, guifg, guibg, gui, guisp
+
+    let histring = 'hi ' . a:group . ' '
+
+    if strlen(a:fg)
+        if a:fg == 'fg'
+            let histring .= 'guifg=fg ctermfg=fg '
+        else
+            let c = get(s:bwc, a:fg)
+            let histring .= 'guifg=#' . c[0] . ' ctermfg=' . c[1] . ' '
+        endif
+    endif
+
+    if a:0 >= 1 && strlen(a:1)
+        if a:1 == 'bg'
+            let histring .= 'guibg=bg ctermbg=bg '
+        else
+            let c = get(s:bwc, a:1)
+            let histring .= 'guibg=#' . c[0] . ' ctermbg=' . c[1] . ' '
+        endif
+    endif
+
+    if a:0 >= 2 && strlen(a:2)
+        let histring .= 'gui=' . a:2 . ' cterm=' . a:2 . ' '
+    endif
+
+    if a:0 >= 3 && strlen(a:3)
+        let c = get(s:bwc, a:3)
+        let histring .= 'guisp=#' . c[0] . ' '
+    endif
+
+    " echom histring
+
+    execute histring
+endfunction
+" }}}
+" Configuration Options {{{
+
+if exists('g:badwolf_darkgutter') && g:badwolf_darkgutter
+    let s:gutter = 'blackestgravel'
+else
+    let s:gutter = 'blackgravel'
+endif
+
+if exists('g:badwolf_tabline')
+    if g:badwolf_tabline == 0
+        let s:tabline = 'blackestgravel'
+    elseif  g:badwolf_tabline == 1
+        let s:tabline = 'blackgravel'
+    elseif  g:badwolf_tabline == 2
+        let s:tabline = 'darkgravel'
+    elseif  g:badwolf_tabline == 3
+        let s:tabline = 'deepgravel'
+    else
+        let s:tabline = 'blackestgravel'
+    endif
+else
+    let s:tabline = 'blackgravel'
+endif
+
+" }}}
+
+" Actual colorscheme ----------------------------------------------------------
+" Vanilla Vim {{{
+
+" General/UI {{{
+
+call s:HL('Normal', 'plain', 'blackgravel')
+
+call s:HL('Folded', 'mediumgravel', 'bg', 'none')
+
+call s:HL('VertSplit', 'lightgravel', 'bg', 'none')
+
+call s:HL('CursorLine',   '', 'darkgravel', 'none')
+call s:HL('CursorColumn', '', 'darkgravel')
+call s:HL('ColorColumn',  '', 'darkgravel')
+
+call s:HL('TabLine', 'plain', s:tabline, 'none')
+call s:HL('TabLineFill', 'plain', s:tabline, 'none')
+call s:HL('TabLineSel', 'coal', 'tardis', 'none')
+
+call s:HL('MatchParen', 'dalespale', 'darkgravel', 'bold')
+
+call s:HL('NonText',    'deepgravel', 'bg')
+call s:HL('SpecialKey', 'deepgravel', 'bg')
+
+call s:HL('Visual',    '',  'deepgravel')
+call s:HL('VisualNOS', '',  'deepgravel')
+
+call s:HL('Search',    'coal', 'dalespale', 'bold')
+call s:HL('IncSearch', 'coal', 'tardis',    'bold')
+
+call s:HL('Underlined', 'fg', '', 'underline')
+
+call s:HL('StatusLine',   'coal', 'tardis',     'bold')
+call s:HL('StatusLineNC', 'snow', 'deepgravel', 'bold')
+
+call s:HL('Directory', 'dirtyblonde', '', 'bold')
+
+call s:HL('Title', 'lime')
+
+call s:HL('ErrorMsg',   'taffy',       'bg', 'bold')
+call s:HL('MoreMsg',    'dalespale',   '',   'bold')
+call s:HL('ModeMsg',    'dirtyblonde', '',   'bold')
+call s:HL('Question',   'dirtyblonde', '',   'bold')
+call s:HL('WarningMsg', 'dress',       '',   'bold')
+
+" This is a ctags tag, not an HTML one.  'Something you can use c-] on'.
+call s:HL('Tag', '', '', 'bold')
+
+" hi IndentGuides                  guibg=#373737
+" hi WildMenu        guifg=#66D9EF guibg=#000000
+
+" }}}
+" Gutter {{{
+
+call s:HL('LineNr',     'mediumgravel', s:gutter)
+call s:HL('SignColumn', '',             s:gutter)
+call s:HL('FoldColumn', 'mediumgravel', s:gutter)
+
+" }}}
+" Cursor {{{
+
+call s:HL('Cursor',  'coal', 'tardis', 'bold')
+call s:HL('vCursor', 'coal', 'tardis', 'bold')
+call s:HL('iCursor', 'coal', 'tardis', 'none')
+
+" }}}
+" Syntax highlighting {{{
+
+" Start with a simple base.
+call s:HL('Special', 'plain')
+
+" Comments are slightly brighter than folds, to make 'headers' easier to see.
+call s:HL('Comment',        'gravel')
+call s:HL('Todo',           'snow', 'bg', 'bold')
+call s:HL('SpecialComment', 'snow', 'bg', 'bold')
+
+" Strings are a nice, pale straw color.  Nothing too fancy.
+call s:HL('String', 'dirtyblonde')
+
+" Control flow stuff is taffy.
+call s:HL('Statement',   'taffy', '', 'bold')
+call s:HL('Keyword',     'taffy', '', 'bold')
+call s:HL('Conditional', 'taffy', '', 'bold')
+call s:HL('Operator',    'taffy', '', 'none')
+call s:HL('Label',       'taffy', '', 'none')
+call s:HL('Repeat',      'taffy', '', 'none')
+
+" Functions and variable declarations are orange, because plain looks weird.
+call s:HL('Identifier', 'orange', '', 'none')
+call s:HL('Function',   'orange', '', 'none')
+
+" Preprocessor stuff is lime, to make it pop.
+"
+" This includes imports in any given language, because they should usually be
+" grouped together at the beginning of a file.  If they're in the middle of some
+" other code they should stand out, because something tricky is
+" probably going on.
+call s:HL('PreProc',   'lime', '', 'none')
+call s:HL('Macro',     'lime', '', 'none')
+call s:HL('Define',    'lime', '', 'none')
+call s:HL('PreCondit', 'lime', '', 'bold')
+
+" Constants of all kinds are colored together.
+" I'm not really happy with the color yet...
+call s:HL('Constant',  'toffee', '', 'bold')
+call s:HL('Character', 'toffee', '', 'bold')
+call s:HL('Boolean',   'toffee', '', 'bold')
+
+call s:HL('Number', 'toffee', '', 'bold')
+call s:HL('Float',  'toffee', '', 'bold')
+
+" Not sure what 'special character in a constant' means, but let's make it pop.
+call s:HL('SpecialChar', 'dress', '', 'bold')
+
+call s:HL('Type', 'dress', '', 'none')
+call s:HL('StorageClass', 'taffy', '', 'none')
+call s:HL('Structure', 'taffy', '', 'none')
+call s:HL('Typedef', 'taffy', '', 'bold')
+
+" Make try/catch blocks stand out.
+call s:HL('Exception', 'lime', '', 'bold')
+
+" Misc
+call s:HL('Error',  'snow',   'taffy', 'bold')
+call s:HL('Debug',  'snow',   '',      'bold')
+call s:HL('Ignore', 'gravel', '',      '')
+
+" }}}
+" Completion Menu {{{
+
+call s:HL('Pmenu', 'plain', 'deepergravel')
+call s:HL('PmenuSel', 'coal', 'tardis', 'bold')
+call s:HL('PmenuSbar', '', 'deepergravel')
+call s:HL('PmenuThumb', 'brightgravel')
+
+" }}}
+" Diffs {{{
+
+call s:HL('DiffDelete', 'coal', 'coal')
+call s:HL('DiffAdd',    '',     'deepergravel')
+call s:HL('DiffChange', '',     'darkgravel')
+call s:HL('DiffText',   'snow', 'deepergravel', 'bold')
+
+" }}}
+" Spelling {{{
+
+if has("spell")
+    call s:HL('SpellCap', 'dalespale', 'bg', 'undercurl,bold', 'dalespale')
+    call s:HL('SpellBad', '', 'bg', 'undercurl', 'dalespale')
+    call s:HL('SpellLocal', '', '', 'undercurl', 'dalespale')
+    call s:HL('SpellRare', '', '', 'undercurl', 'dalespale')
+endif
+
+" }}}
+
+" }}}
+" Plugins {{{
+
+" CtrlP {{{
+
+    " the message when no match is found
+    call s:HL('CtrlPNoEntries', 'snow', 'taffy', 'bold')
+
+    " the matched pattern
+    call s:HL('CtrlPMatch', 'orange', 'bg', 'none')
+
+    " the line prefix '>' in the match window
+    call s:HL('CtrlPLinePre', 'deepgravel', 'bg', 'none')
+
+    " the prompt’s base
+    call s:HL('CtrlPPrtBase', 'deepgravel', 'bg', 'none')
+
+    " the prompt’s text
+    call s:HL('CtrlPPrtText', 'plain', 'bg', 'none')
+
+    " the prompt’s cursor when moving over the text
+    call s:HL('CtrlPPrtCursor', 'coal', 'tardis', 'bold')
+
+    " 'prt' or 'win', also for 'regex'
+    call s:HL('CtrlPMode1', 'coal', 'tardis', 'bold')
+
+    " 'file' or 'path', also for the local working dir
+    call s:HL('CtrlPMode2', 'coal', 'tardis', 'bold')
+
+    " the scanning status
+    call s:HL('CtrlPStats', 'coal', 'tardis', 'bold')
+
+    " TODO: CtrlP extensions.
+    " CtrlPTabExtra  : the part of each line that’s not matched against (Comment)
+    " CtrlPqfLineCol : the line and column numbers in quickfix mode (|s:HL-Search|)
+    " CtrlPUndoT     : the elapsed time in undo mode (|s:HL-Directory|)
+    " CtrlPUndoBr    : the square brackets [] in undo mode (Comment)
+    " CtrlPUndoNr    : the undo number inside [] in undo mode (String)
+
+" }}}
+" EasyMotion {{{
+
+call s:HL('EasyMotionTarget', 'tardis',     'bg', 'bold')
+call s:HL('EasyMotionShade',  'deepgravel', 'bg')
+
+" }}}
+" Interesting Words {{{
+
+" These are only used if you're me or have copied the <leader>hNUM mappings
+" from my Vimrc.
+call s:HL('InterestingWord1', 'coal', 'orange')
+call s:HL('InterestingWord2', 'coal', 'lime')
+call s:HL('InterestingWord3', 'coal', 'saltwatertaffy')
+call s:HL('InterestingWord4', 'coal', 'toffee')
+call s:HL('InterestingWord5', 'coal', 'dress')
+call s:HL('InterestingWord6', 'coal', 'taffy')
+
+
+" }}}
+" Makegreen {{{
+
+" hi GreenBar term=reverse ctermfg=white ctermbg=green guifg=coal guibg=#9edf1c
+" hi RedBar   term=reverse ctermfg=white ctermbg=red guifg=white guibg=#C50048
+
+" }}}
+" Rainbow Parentheses {{{
+
+call s:HL('level16c', 'mediumgravel',   '', 'bold')
+call s:HL('level15c', 'dalespale',      '', '')
+call s:HL('level14c', 'dress',          '', '')
+call s:HL('level13c', 'orange',         '', '')
+call s:HL('level12c', 'tardis',         '', '')
+call s:HL('level11c', 'lime',           '', '')
+call s:HL('level10c', 'toffee',         '', '')
+call s:HL('level9c',  'saltwatertaffy', '', '')
+call s:HL('level8c',  'coffee',         '', '')
+call s:HL('level7c',  'dalespale',      '', '')
+call s:HL('level6c',  'dress',          '', '')
+call s:HL('level5c',  'orange',         '', '')
+call s:HL('level4c',  'tardis',         '', '')
+call s:HL('level3c',  'lime',           '', '')
+call s:HL('level2c',  'toffee',         '', '')
+call s:HL('level1c',  'saltwatertaffy', '', '')
+
+" }}}
+" ShowMarks {{{
+
+call s:HL('ShowMarksHLl', 'tardis', 'blackgravel')
+call s:HL('ShowMarksHLu', 'tardis', 'blackgravel')
+call s:HL('ShowMarksHLo', 'tardis', 'blackgravel')
+call s:HL('ShowMarksHLm', 'tardis', 'blackgravel')
+
+" }}}
+
+" }}}
+" Filetype-specific {{{
+
+" Clojure {{{
+
+call s:HL('clojureSpecial',  'taffy', '', '')
+call s:HL('clojureDefn',     'taffy', '', '')
+call s:HL('clojureDefMacro', 'taffy', '', '')
+call s:HL('clojureDefine',   'taffy', '', '')
+call s:HL('clojureMacro',    'taffy', '', '')
+call s:HL('clojureCond',     'taffy', '', '')
+
+call s:HL('clojureKeyword', 'orange', '', 'none')
+
+call s:HL('clojureFunc',   'dress', '', 'none')
+call s:HL('clojureRepeat', 'dress', '', 'none')
+
+call s:HL('clojureParen0', 'lightgravel', '', 'none')
+
+call s:HL('clojureAnonArg', 'snow', '', 'bold')
+
+" }}}
+" Common Lisp {{{
+
+call s:HL('lispFunc',           'lime', '', 'none')
+call s:HL('lispVar',            'orange', '', 'bold')
+call s:HL('lispEscapeSpecial',  'orange', '', 'none')
+
+" }}}
+" CSS {{{
+
+if g:badwolf_css_props_highlight
+    call s:HL('cssColorProp', 'taffy', '', 'none')
+    call s:HL('cssBoxProp', 'taffy', '', 'none')
+    call s:HL('cssTextProp', 'taffy', '', 'none')
+    call s:HL('cssRenderProp', 'taffy', '', 'none')
+    call s:HL('cssGeneratedContentProp', 'taffy', '', 'none')
+else
+    call s:HL('cssColorProp', 'fg', '', 'none')
+    call s:HL('cssBoxProp', 'fg', '', 'none')
+    call s:HL('cssTextProp', 'fg', '', 'none')
+    call s:HL('cssRenderProp', 'fg', '', 'none')
+    call s:HL('cssGeneratedContentProp', 'fg', '', 'none')
+end
+
+call s:HL('cssValueLength', 'toffee', '', 'bold')
+call s:HL('cssColor', 'toffee', '', 'bold')
+call s:HL('cssBraces', 'lightgravel', '', 'none')
+call s:HL('cssIdentifier', 'orange', '', 'bold')
+call s:HL('cssClassName', 'orange', '', 'none')
+
+" }}}
+" Diff {{{
+
+call s:HL('gitDiff', 'lightgravel', '',)
+
+call s:HL('diffRemoved', 'dress', '',)
+call s:HL('diffAdded', 'lime', '',)
+call s:HL('diffFile', 'coal', 'taffy', 'bold')
+call s:HL('diffNewFile', 'coal', 'taffy', 'bold')
+
+call s:HL('diffLine', 'coal', 'orange', 'bold')
+call s:HL('diffSubname', 'orange', '', 'none')
+
+" }}}
+" Django Templates {{{
+
+call s:HL('djangoArgument', 'dirtyblonde', '',)
+call s:HL('djangoTagBlock', 'orange', '')
+call s:HL('djangoVarBlock', 'orange', '')
+" hi djangoStatement guifg=#ff3853 gui=bold
+" hi djangoVarBlock guifg=#f4cf86
+
+" }}}
+" HTML {{{
+
+" Punctuation
+call s:HL('htmlTag',    'darkroast', 'bg', 'none')
+call s:HL('htmlEndTag', 'darkroast', 'bg', 'none')
+
+" Tag names
+call s:HL('htmlTagName',        'coffee', '', 'bold')
+call s:HL('htmlSpecialTagName', 'coffee', '', 'bold')
+call s:HL('htmlSpecialChar',    'lime',   '', 'none')
+
+" Attributes
+call s:HL('htmlArg', 'coffee', '', 'none')
+
+" Stuff inside an <a> tag
+
+if g:badwolf_html_link_underline
+    call s:HL('htmlLink', 'lightgravel', '', 'underline')
+else
+    call s:HL('htmlLink', 'lightgravel', '', 'none')
+endif
+
+" }}}
+" Java {{{
+
+call s:HL('javaClassDecl', 'taffy', '', 'bold')
+call s:HL('javaScopeDecl', 'taffy', '', 'bold')
+call s:HL('javaCommentTitle', 'gravel', '')
+call s:HL('javaDocTags', 'snow', '', 'none')
+call s:HL('javaDocParam', 'dalespale', '', '')
+
+" }}}
+" LaTeX {{{
+
+call s:HL('texStatement', 'tardis', '', 'none')
+call s:HL('texMathZoneX', 'orange', '', 'none')
+call s:HL('texMathZoneA', 'orange', '', 'none')
+call s:HL('texMathZoneB', 'orange', '', 'none')
+call s:HL('texMathZoneC', 'orange', '', 'none')
+call s:HL('texMathZoneD', 'orange', '', 'none')
+call s:HL('texMathZoneE', 'orange', '', 'none')
+call s:HL('texMathZoneV', 'orange', '', 'none')
+call s:HL('texMathZoneX', 'orange', '', 'none')
+call s:HL('texMath', 'orange', '', 'none')
+call s:HL('texMathMatcher', 'orange', '', 'none')
+call s:HL('texRefLabel', 'dirtyblonde', '', 'none')
+call s:HL('texRefZone', 'lime', '', 'none')
+call s:HL('texComment', 'darkroast', '', 'none')
+call s:HL('texDelimiter', 'orange', '', 'none')
+call s:HL('texZone', 'brightgravel', '', 'none')
+
+augroup badwolf_tex
+    au!
+
+    au BufRead,BufNewFile *.tex syn region texMathZoneV start="\\(" end="\\)\|%stopzone\>" keepend contains=@texMathZoneGroup
+    au BufRead,BufNewFile *.tex syn region texMathZoneX start="\$" skip="\\\\\|\\\$" end="\$\|%stopzone\>" keepend contains=@texMathZoneGroup
+augroup END
+
+" }}}
+" LessCSS {{{
+
+call s:HL('lessVariable', 'lime', '', 'none')
+
+" }}}
+" Lispyscript {{{
+
+call s:HL('lispyscriptDefMacro', 'lime', '', '')
+call s:HL('lispyscriptRepeat', 'dress', '', 'none')
+
+" }}}
+" REPLs {{{
+" This isn't a specific plugin, but just useful highlight classes for anything
+" that might want to use them.
+
+call s:HL('replPrompt', 'tardis', '', 'bold')
+
+" }}}
+" Mail {{{
+
+call s:HL('mailSubject', 'orange', '', 'bold')
+call s:HL('mailHeader', 'lightgravel', '', '')
+call s:HL('mailHeaderKey', 'lightgravel', '', '')
+call s:HL('mailHeaderEmail', 'snow', '', '')
+call s:HL('mailURL', 'toffee', '', 'underline')
+call s:HL('mailSignature', 'gravel', '', 'none')
+
+call s:HL('mailQuoted1', 'gravel', '', 'none')
+call s:HL('mailQuoted2', 'dress', '', 'none')
+call s:HL('mailQuoted3', 'dirtyblonde', '', 'none')
+call s:HL('mailQuoted4', 'orange', '', 'none')
+call s:HL('mailQuoted5', 'lime', '', 'none')
+
+" }}}
+" Markdown {{{
+
+call s:HL('markdownHeadingRule', 'lightgravel', '', 'bold')
+call s:HL('markdownHeadingDelimiter', 'lightgravel', '', 'bold')
+call s:HL('markdownOrderedListMarker', 'lightgravel', '', 'bold')
+call s:HL('markdownListMarker', 'lightgravel', '', 'bold')
+call s:HL('markdownItalic', 'snow', '', 'bold')
+call s:HL('markdownBold', 'snow', '', 'bold')
+call s:HL('markdownH1', 'orange', '', 'bold')
+call s:HL('markdownH2', 'lime', '', 'bold')
+call s:HL('markdownH3', 'lime', '', 'none')
+call s:HL('markdownH4', 'lime', '', 'none')
+call s:HL('markdownH5', 'lime', '', 'none')
+call s:HL('markdownH6', 'lime', '', 'none')
+call s:HL('markdownLinkText', 'toffee', '', 'underline')
+call s:HL('markdownIdDeclaration', 'toffee')
+call s:HL('markdownAutomaticLink', 'toffee', '', 'bold')
+call s:HL('markdownUrl', 'toffee', '', 'bold')
+call s:HL('markdownUrldelimiter', 'lightgravel', '', 'bold')
+call s:HL('markdownLinkDelimiter', 'lightgravel', '', 'bold')
+call s:HL('markdownLinkTextDelimiter', 'lightgravel', '', 'bold')
+call s:HL('markdownCodeDelimiter', 'dirtyblonde', '', 'bold')
+call s:HL('markdownCode', 'dirtyblonde', '', 'none')
+call s:HL('markdownCodeBlock', 'dirtyblonde', '', 'none')
+
+" }}}
+" MySQL {{{
+
+call s:HL('mysqlSpecial', 'dress', '', 'bold')
+
+" }}}
+" Python {{{
+
+hi def link pythonOperator Operator
+call s:HL('pythonBuiltin',     'dress')
+call s:HL('pythonBuiltinObj',  'dress')
+call s:HL('pythonBuiltinFunc', 'dress')
+call s:HL('pythonEscape',      'dress')
+call s:HL('pythonException',   'lime', '', 'bold')
+call s:HL('pythonExceptions',  'lime', '', 'none')
+call s:HL('pythonPrecondit',   'lime', '', 'none')
+call s:HL('pythonDecorator',   'taffy', '', 'none')
+call s:HL('pythonRun',         'gravel', '', 'bold')
+call s:HL('pythonCoding',      'gravel', '', 'bold')
+
+" }}}
+" SLIMV {{{
+
+" Rainbow parentheses
+call s:HL('hlLevel0', 'gravel')
+call s:HL('hlLevel1', 'orange')
+call s:HL('hlLevel2', 'saltwatertaffy')
+call s:HL('hlLevel3', 'dress')
+call s:HL('hlLevel4', 'coffee')
+call s:HL('hlLevel5', 'dirtyblonde')
+call s:HL('hlLevel6', 'orange')
+call s:HL('hlLevel7', 'saltwatertaffy')
+call s:HL('hlLevel8', 'dress')
+call s:HL('hlLevel9', 'coffee')
+
+" }}}
+" Vim {{{
+
+call s:HL('VimCommentTitle', 'lightgravel', '', 'bold')
+
+call s:HL('VimMapMod',    'dress', '', 'none')
+call s:HL('VimMapModKey', 'dress', '', 'none')
+call s:HL('VimNotation', 'dress', '', 'none')
+call s:HL('VimBracket', 'dress', '', 'none')
+
+" }}}
+
+" }}}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/digerati.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,73 @@
+" Maintainer:	Henrique C. Alves (hcarvalhoalves@gmail.com)
+" Version:      1.0
+" Last Change:  October 05 2008
+
+set background=dark
+
+hi clear
+
+if exists("syntax_on")
+    syntax reset
+endif
+
+let colors_name = "digerati"
+
+" Vim >= 7.0 specific colors
+if version >= 700
+  hi CursorLine   guibg=#4f4f4f
+  hi CursorColumn guibg=#2d2d2d
+  hi MatchParen   guifg=#ffffff guibg=#4f4f4f gui=bold
+  hi Pmenu 		    guifg=#404040 guibg=#dcdcdc
+  hi PmenuSel 	  guifg=#ffffff guibg=#93b5bf
+endif
+
+" General colors
+hi Cursor 		   guifg=NONE    guibg=#909090 gui=none
+hi Normal 		   guifg=#f0f0f0 guibg=#202020 gui=none
+hi NonText 		   guifg=#a0a0a0 guibg=#202020 gui=none
+hi LineNr        guifg=#404040 guibg=#202020 gui=none ctermfg=244 ctermbg=232
+hi StatusLine    guifg=#d3d3d5 guibg=#303030 gui=none ctermfg=253 ctermbg=238
+hi StatusLineNC  guifg=#939395 guibg=#303030 gui=none ctermfg=246 ctermbg=238
+hi VertSplit     guifg=#444444 guibg=#303030 gui=none ctermfg=238 ctermbg=238  
+hi Folded 		   guibg=#384048 guifg=#a0a8b0 gui=none
+hi Title		     guifg=#ffffff guibg=NONE	   gui=bold
+hi Visual		     guifg=#ffffff guibg=#b8b89f gui=none
+hi SpecialKey	   guifg=#808080 guibg=#343434 gui=none
+
+" Syntax highlighting
+hi Comment 		   guifg=#808080 gui=none
+hi Todo 		     guifg=#8f8f8f gui=none
+hi Boolean       guifg=#cdff00 gui=none
+hi String 		   guifg=#cdff00 gui=none
+hi Identifier 	 guifg=#cdff00 gui=none
+hi Function 	   guifg=#ffffff gui=bold
+hi Type 		     guifg=#77b4c7 gui=none
+hi Statement 	   guifg=#77b4c7 gui=none
+hi Keyword		   guifg=#ff3b77 gui=none
+hi Constant 	   guifg=#ff3b77 gui=none
+hi Number		     guifg=#ff3b77 gui=none
+hi Special		   guifg=#ff3b77 gui=none
+hi PreProc 		   guifg=#b8b89f gui=none
+hi Search        guifg=#000000 guibg=#cdff00 gui=none
+hi Todo          guifg=NONE    guibg=#ff3b77 gui=none
+hi Macro         guifg=#FE8777
+hi Operator      guifg=#518691
+
+" Rainbow C/Cpp
+hi cBracket      guifg=#E99DE9
+hi hlLevel1      guifg=#f0f0f0
+hi hlLevel2      guifg=#ebf1d2
+hi hlLevel3      guifg=#e7f3b4
+hi hlLevel4      guifg=#e2f596
+hi hlLevel5      guifg=#def778
+hi hlLevel6      guifg=#daf95a
+hi hlLevel7      guifg=#d5fb3c
+hi hlLevel8      guifg=#d1fd1e
+hi hlLevel9      guifg=#cdff00
+
+" Custom
+hi MarkerConstant guifg=#808080
+
+" Code-specific colors
+hi htmlEndTag    guifg=#ffffff gui=none 
+hi htmlLink      guifg=#ff3b77 gui=underline
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/gruvbox.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,1393 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Vim
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 12 Aug 2017
+" -----------------------------------------------------------------------------
+
+" Supporting code -------------------------------------------------------------
+" Initialisation: {{{
+
+if version > 580
+  hi clear
+  if exists("syntax_on")
+    syntax reset
+  endif
+endif
+
+let g:colors_name='gruvbox'
+
+if !(has('termguicolors') && &termguicolors) && !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
+
+" }}}
+" Setup Terminal Colors For Neovim: {{{
+
+if has('nvim')
+  let g:terminal_color_0 = s:bg0[0]
+  let g:terminal_color_8 = s:gray[0]
+
+  let g:terminal_color_1 = s:gb.neutral_red[0]
+  let g:terminal_color_9 = s:red[0]
+
+  let g:terminal_color_2 = s:gb.neutral_green[0]
+  let g:terminal_color_10 = s:green[0]
+
+  let g:terminal_color_3 = s:gb.neutral_yellow[0]
+  let g:terminal_color_11 = s:yellow[0]
+
+  let g:terminal_color_4 = s:gb.neutral_blue[0]
+  let g:terminal_color_12 = s:blue[0]
+
+  let g:terminal_color_5 = s:gb.neutral_purple[0]
+  let g:terminal_color_13 = s:purple[0]
+
+  let g:terminal_color_6 = s:gb.neutral_aqua[0]
+  let g:terminal_color_14 = s:aqua[0]
+
+  let g:terminal_color_7 = s:fg4[0]
+  let g:terminal_color_15 = s:fg1[0]
+endif
+
+" }}}
+" 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:bg0
+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:bg1, s:invert_tabline)
+  " Active tab page label
+  call s:HL('TabLineSel', s:green, s:bg1, 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:bg2, s:fg1, s:inverse)
+call s:HL('StatusLineNC', s:bg1, s:fg4, s:inverse)
+
+" The column separating vertically split windows
+call s:HL('VertSplit', s:bg3, 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:orange, s:bg1, s:italicize_strings)
+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:fg1, s:bg1, 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: {{{
+
+autocmd ColorScheme gruvbox hi! link Sneak Search
+autocmd ColorScheme gruvbox hi! link SneakLabel 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 GruvboxFg1
+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)
+
+" }}}
+" Asynchronous Lint Engine: {{{
+
+call s:HL('ALEError', s:none, s:none, s:undercurl, s:red)
+call s:HL('ALEWarning', s:none, s:none, s:undercurl, s:yellow)
+call s:HL('ALEInfo', s:none, s:none, s:undercurl, s:blue)
+
+hi! link ALEErrorSign GruvboxRedSign
+hi! link ALEWarningSign GruvboxYellowSign
+hi! link ALEInfoSign GruvboxBlueSign
+
+" }}}
+" Dirvish: {{{
+
+hi! link DirvishPathTail GruvboxAqua
+hi! link DirvishArg GruvboxYellow
+
+" }}}
+" Netrw: {{{
+
+hi! link netrwDir GruvboxAqua
+hi! link netrwClassify GruvboxAqua
+hi! link netrwLink GruvboxGray
+hi! link netrwSymLink GruvboxFg1
+hi! link netrwExe GruvboxYellow
+hi! link netrwComment GruvboxGray
+hi! link netrwList GruvboxBlue
+hi! link netrwHelpCmd GruvboxAqua
+hi! link netrwCmdSep GruvboxFg3
+hi! link netrwVersion GruvboxGreen
+
+" }}}
+" NERDTree: {{{
+
+hi! link NERDTreeDir GruvboxAqua
+hi! link NERDTreeDirSlash GruvboxAqua
+
+hi! link NERDTreeOpenable GruvboxOrange
+hi! link NERDTreeClosable GruvboxOrange
+
+hi! link NERDTreeFile GruvboxFg1
+hi! link NERDTreeExecFile GruvboxYellow
+
+hi! link NERDTreeUp GruvboxGray
+hi! link NERDTreeCWD GruvboxGreen
+hi! link NERDTreeHelp GruvboxFg1
+
+hi! link NERDTreeToggleOn GruvboxGreen
+hi! link NERDTreeToggleOff GruvboxRed
+
+" }}}
+" Vim Multiple Cursors: {{{
+
+call s:HL('multiple_cursors_cursor', s:none, s:none, s:inverse)
+call s:HL('multiple_cursors_visual', s:none, s:bg2)
+
+" }}}
+
+" 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 pythonException GruvboxRed
+hi! link pythonExceptions GruvboxPurple
+hi! link pythonBoolean GruvboxPurple
+hi! link pythonDot GruvboxFg3
+hi! link pythonConditional GruvboxRed
+hi! link pythonRepeat GruvboxRed
+hi! link pythonDottedName GruvboxGreenBold
+
+" }}}
+" 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 javascriptBOMWindowProp GruvboxFg1
+hi! link javascriptArrayMethod GruvboxFg1
+hi! link javascriptArrayStaticMethod GruvboxFg1
+hi! link javascriptCacheMethod GruvboxFg1
+hi! link javascriptDateMethod GruvboxFg1
+hi! link javascriptMathStaticMethod GruvboxFg1
+
+" hi! link javascriptProp GruvboxFg1
+hi! link javascriptURLUtilsProp GruvboxFg1
+hi! link javascriptBOMNavigatorProp GruvboxFg1
+hi! link javascriptDOMDocMethod GruvboxFg1
+hi! link javascriptDOMDocProp GruvboxFg1
+hi! link javascriptBOMLocationMethod GruvboxFg1
+hi! link javascriptBOMWindowMethod GruvboxFg1
+hi! link javascriptStringMethod 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 GruvboxYellow
+
+hi! link javascriptDocParamName GruvboxFg4
+hi! link javascriptDocTags GruvboxFg4
+hi! link javascriptDocNotation GruvboxFg4
+hi! link javascriptDocParamType GruvboxFg4
+hi! link javascriptDocNamedParamType GruvboxFg4
+
+hi! link javascriptBrackets GruvboxFg1
+hi! link javascriptDOMElemAttrs GruvboxFg1
+hi! link javascriptDOMEventMethod GruvboxFg1
+hi! link javascriptDOMNodeMethod GruvboxFg1
+hi! link javascriptDOMStorageMethod GruvboxFg1
+hi! link javascriptHeadersMethod GruvboxFg1
+
+hi! link javascriptAsyncFuncKeyword GruvboxRed
+hi! link javascriptAwaitFuncKeyword GruvboxRed
+
+" }}}
+" PanglossJS: {{{
+
+hi! link jsClassKeyword GruvboxAqua
+hi! link jsExtendsKeyword GruvboxAqua
+hi! link jsExportDefault GruvboxAqua
+hi! link jsTemplateBraces GruvboxAqua
+hi! link jsGlobalNodeObjects GruvboxFg1
+hi! link jsGlobalObjects GruvboxFg1
+hi! link jsFunction GruvboxAqua
+hi! link jsFuncParens GruvboxFg3
+hi! link jsParens GruvboxFg3
+hi! link jsNull GruvboxPurple
+hi! link jsUndefined GruvboxPurple
+hi! link jsClassDefinition GruvboxYellow
+
+" }}}
+" TypeScript: {{{
+
+hi! link typeScriptReserved GruvboxAqua
+hi! link typeScriptLabel GruvboxAqua
+hi! link typeScriptFuncKeyword 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
+hi! link typeScriptGlobalObjects GruvboxFg1
+hi! link typeScriptParens GruvboxFg3
+hi! link typeScriptOpSymbols GruvboxFg3
+hi! link typeScriptHtmlElemProperties GruvboxFg1
+hi! link typeScriptNull GruvboxPurple
+hi! link typeScriptInterpolationDelimiter GruvboxAqua
+
+" }}}
+" PureScript: {{{
+
+hi! link purescriptModuleKeyword GruvboxAqua
+hi! link purescriptModuleName GruvboxFg1
+hi! link purescriptWhere GruvboxAqua
+hi! link purescriptDelimiter GruvboxFg4
+hi! link purescriptType GruvboxFg1
+hi! link purescriptImportKeyword GruvboxAqua
+hi! link purescriptHidingKeyword GruvboxAqua
+hi! link purescriptAsKeyword GruvboxAqua
+hi! link purescriptStructure GruvboxAqua
+hi! link purescriptOperator GruvboxBlue
+
+hi! link purescriptTypeVar GruvboxFg1
+hi! link purescriptConstructor GruvboxFg1
+hi! link purescriptFunction GruvboxFg1
+hi! link purescriptConditional GruvboxOrange
+hi! link purescriptBacktick GruvboxOrange
+
+" }}}
+" 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:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/hornet.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,62 @@
+" Maintainer:	Taurus Olson
+" Mail:         taurusolson@gmail.com
+" Version:      1.0.2
+" Last Change:	October 17, 2009 
+" Credits:      This is a modification of busybee.vim color scheme
+
+set background=dark
+
+hi clear
+
+if exists("syntax_on")
+  syntax reset
+endif
+
+let colors_name = "hornet"
+
+" Vim >= 7.0 specific colors
+if version >= 700
+  hi CursorLine    guibg=#303030 ctermbg=234
+  hi CursorColumn  guibg=#202020 ctermbg=234
+  hi MatchParen    guifg=#d0ffc0 guibg=#202020 gui=bold ctermfg=157 ctermbg=237 cterm=bold
+  hi Pmenu 		   guifg=#ffffff guibg=#202020 ctermfg=255 ctermbg=238
+  hi PmenuSel 	   guifg=#000000 guibg=#b1d631 ctermfg=0 ctermbg=148
+endif
+
+" General colors
+hi Cursor 		   guifg=NONE    guibg=#626262 gui=none ctermbg=241
+hi Normal 		   guifg=#e2e2e5 guibg=#202020 gui=none ctermfg=253 ctermbg=234
+hi NonText 		   guifg=#808080 guibg=#202020 gui=none ctermfg=244 ctermbg=235
+hi LineNr 		   guifg=#303030 guibg=#202020 gui=none ctermfg=244 ctermbg=232
+hi StatusLine 	           guifg=#d3d3d5 guibg=#303030 gui=none ctermfg=253 ctermbg=238
+hi StatusLineNC            guifg=#939395 guibg=#303030 gui=none ctermfg=246 ctermbg=238
+hi VertSplit 	           guifg=#444444 guibg=#303030 gui=none ctermfg=238 ctermbg=238
+hi Folded 		   guibg=#384048 guifg=#a0a8b0 gui=none ctermbg=4 ctermfg=248
+hi Title		   guifg=#f6f3e8 guibg=NONE	gui=bold ctermfg=254 cterm=bold
+hi Visual		   guifg=#faf4c6 guibg=#3c414c gui=none ctermfg=254 ctermbg=4
+hi SpecialKey	           guifg=#808080 guibg=#343434 gui=none ctermfg=244 ctermbg=236
+hi Directory 		   guifg=#fecf35 gui=none ctermfg=148 
+
+" Syntax highlighting
+hi Comment 		   guifg=#757575 gui=none ctermfg=244
+hi Todo 		   guifg=#fec135 gui=none ctermfg=245
+hi Boolean         guifg=#b1d631 gui=none ctermfg=148
+hi String 		   guifg=#fecf35 gui=none ctermfg=148 
+hi Identifier 	   guifg=#b1d631 gui=none ctermfg=148
+hi Function 	   guifg=#fdb32a gui=none ctermfg=255
+hi Type 		   guifg=#7e8aa2 gui=none ctermfg=103
+hi Statement 	   guifg=#7e8aa2 gui=none ctermfg=103
+hi Keyword		   guifg=#ff9800 gui=none ctermfg=208
+hi Constant 	   guifg=#c03000 gui=none  ctermfg=208
+hi Number		   guifg=#ff9800 gui=none ctermfg=208
+hi Special		   guifg=#4bb5c1 gui=none ctermfg=208
+hi PreProc 		   guifg=#96ca2d gui=none ctermfg=230
+hi Todo            guifg=#fec135 guibg=#202020 gui=none
+hi Search          guifg=#000000 guibg=#aeee00 gui=none
+
+" Code-specific colors
+hi pythonImport    guifg=#7fc6bc gui=none ctermfg=255
+hi pythonException guifg=#f00000 gui=none ctermfg=200
+hi pythonOperator  guifg=#7e8aa2 gui=none ctermfg=103
+hi pythonBuiltinFunction guifg=#009000 gui=none ctermfg=200
+hi pythonExClass   guifg=#009000 gui=none ctermfg=200
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/ir_black.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,212 @@
+" ir_black color scheme
+" More at: http://blog.infinitered.com/entries/show/8
+
+
+" ********************************************************************************
+" Standard colors used in all ir_black themes:
+" Note, x:x:x are RGB values
+"
+"  normal: #f6f3e8
+" 
+"  string: #A8FF60  168:255:96                   
+"    string inner (punc, code, etc): #00A0A0  0:160:160
+"  number: #FF73FD  255:115:253                 
+"  comments: #7C7C7C  124:124:124
+"  keywords: #96CBFE  150:203:254             
+"  operators: white
+"  class: #FFFFB6  255:255:182
+"  method declaration name: #FFD2A7  255:210:167
+"  regular expression: #E9C062  233:192:98
+"    regexp alternate: #FF8000  255:128:0
+"    regexp alternate 2: #B18A3D  177:138:61
+"  variable: #C6C5FE  198:197:254
+"  
+" Misc colors:
+"  red color (used for whatever): #FF6C60   255:108:96 
+"     light red: #FFB6B0   255:182:176
+"
+"  brown: #E18964  good for special
+"
+"  lightpurpleish: #FFCCFF
+" 
+" Interface colors:
+"  background color: black
+"  cursor (where underscore is used): #FFA560  255:165:96
+"  cursor (where block is used): white
+"  visual selection: #1D1E2C  
+"  current line: #151515  21:21:21
+"  search selection: #07281C  7:40:28
+"  line number: #3D3D3D  61:61:61
+
+
+" ********************************************************************************
+" The following are the preferred 16 colors for your terminal
+"           Colors      Bright Colors
+" Black     #4E4E4E     #7C7C7C
+" Red       #FF6C60     #FFB6B0
+" Green     #A8FF60     #CEFFAB
+" Yellow    #FFFFB6     #FFFFCB
+" Blue      #96CBFE     #FFFFCB
+" Magenta   #FF73FD     #FF9CFE
+" Cyan      #C6C5FE     #DFDFFE
+" White     #EEEEEE     #FFFFFF
+
+
+" ********************************************************************************
+set background=dark
+hi clear
+
+if exists("syntax_on")
+  syntax reset
+endif
+
+let colors_name = "ir_black"
+
+
+"hi Example         guifg=NONE        guibg=NONE        gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+
+" General colors
+hi Normal           guifg=#f6f3e8     guibg=black       gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+hi NonText          guifg=#070707     guibg=black       gui=NONE      ctermfg=black       ctermbg=NONE        cterm=NONE
+
+hi Cursor           guifg=black       guibg=white       gui=NONE      ctermfg=black       ctermbg=white       cterm=reverse
+hi LineNr           guifg=#3D3D3D     guibg=black       gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+
+hi VertSplit        guifg=#202020     guibg=#202020     gui=NONE      ctermfg=darkgray    ctermbg=darkgray    cterm=NONE
+hi StatusLine       guifg=#CCCCCC     guibg=#202020     gui=italic    ctermfg=white       ctermbg=darkgray    cterm=NONE
+hi StatusLineNC     guifg=black       guibg=#202020     gui=NONE      ctermfg=blue        ctermbg=darkgray    cterm=NONE  
+
+hi Folded           guifg=#a0a8b0     guibg=#384048     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+hi Title            guifg=#f6f3e8     guibg=NONE        gui=bold      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+hi Visual           guifg=NONE        guibg=#262D51     gui=NONE      ctermfg=NONE        ctermbg=darkgray    cterm=NONE
+
+hi SpecialKey       guifg=#808080     guibg=#343434     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+
+hi WildMenu         guifg=green       guibg=yellow      gui=NONE      ctermfg=black       ctermbg=yellow      cterm=NONE
+hi PmenuSbar        guifg=black       guibg=white       gui=NONE      ctermfg=black       ctermbg=white       cterm=NONE
+"hi Ignore           guifg=gray        guibg=black       gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+
+hi Error            guifg=NONE        guibg=NONE        gui=undercurl ctermfg=white       ctermbg=red         cterm=NONE     guisp=#FF6C60 " undercurl color
+hi ErrorMsg         guifg=white       guibg=#FF6C60     gui=BOLD      ctermfg=white       ctermbg=red         cterm=NONE
+hi WarningMsg       guifg=white       guibg=#FF6C60     gui=BOLD      ctermfg=white       ctermbg=red         cterm=NONE
+
+" Message displayed in lower left, such as --INSERT--
+hi ModeMsg          guifg=black       guibg=#C6C5FE     gui=BOLD      ctermfg=black       ctermbg=cyan        cterm=BOLD
+
+if version >= 700 " Vim 7.x specific colors
+  hi CursorLine     guifg=NONE        guibg=#121212     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=BOLD
+  hi CursorColumn   guifg=NONE        guibg=#121212     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=BOLD
+  hi MatchParen     guifg=#f6f3e8     guibg=#857b6f     gui=BOLD      ctermfg=white       ctermbg=darkgray    cterm=NONE
+  hi Pmenu          guifg=#f6f3e8     guibg=#444444     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+  hi PmenuSel       guifg=#000000     guibg=#cae682     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+  hi Search         guifg=NONE        guibg=NONE        gui=underline ctermfg=NONE        ctermbg=NONE        cterm=underline
+endif
+
+" Syntax highlighting
+hi Comment          guifg=#7C7C7C     guibg=NONE        gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+hi String           guifg=#A8FF60     guibg=NONE        gui=NONE      ctermfg=green       ctermbg=NONE        cterm=NONE
+hi Number           guifg=#FF73FD     guibg=NONE        gui=NONE      ctermfg=magenta     ctermbg=NONE        cterm=NONE
+
+hi Keyword          guifg=#96CBFE     guibg=NONE        gui=NONE      ctermfg=blue        ctermbg=NONE        cterm=NONE
+hi PreProc          guifg=#96CBFE     guibg=NONE        gui=NONE      ctermfg=blue        ctermbg=NONE        cterm=NONE
+hi Conditional      guifg=#6699CC     guibg=NONE        gui=NONE      ctermfg=blue        ctermbg=NONE        cterm=NONE  " if else end
+
+hi Todo             guifg=#8f8f8f     guibg=NONE        gui=NONE      ctermfg=red         ctermbg=NONE        cterm=NONE
+hi Constant         guifg=#99CC99     guibg=NONE        gui=NONE      ctermfg=cyan        ctermbg=NONE        cterm=NONE
+
+hi Identifier       guifg=#C6C5FE     guibg=NONE        gui=NONE      ctermfg=cyan        ctermbg=NONE        cterm=NONE
+hi Function         guifg=#FFD2A7     guibg=NONE        gui=NONE      ctermfg=brown       ctermbg=NONE        cterm=NONE
+hi Type             guifg=#FFFFB6     guibg=NONE        gui=NONE      ctermfg=yellow      ctermbg=NONE        cterm=NONE
+hi Statement        guifg=#6699CC     guibg=NONE        gui=NONE      ctermfg=lightblue   ctermbg=NONE        cterm=NONE
+
+hi Special          guifg=#E18964     guibg=NONE        gui=NONE      ctermfg=white       ctermbg=NONE        cterm=NONE
+hi Delimiter        guifg=#00A0A0     guibg=NONE        gui=NONE      ctermfg=cyan        ctermbg=NONE        cterm=NONE
+hi Operator         guifg=white       guibg=NONE        gui=NONE      ctermfg=white       ctermbg=NONE        cterm=NONE
+
+hi link Character       Constant
+hi link Boolean         Constant
+hi link Float           Number
+hi link Repeat          Statement
+hi link Label           Statement
+hi link Exception       Statement
+hi link Include         PreProc
+hi link Define          PreProc
+hi link Macro           PreProc
+hi link PreCondit       PreProc
+hi link StorageClass    Type
+hi link Structure       Type
+hi link Typedef         Type
+hi link Tag             Special
+hi link SpecialChar     Special
+hi link SpecialComment  Special
+hi link Debug           Special
+
+
+" Special for Ruby
+hi rubyRegexp                  guifg=#B18A3D      guibg=NONE      gui=NONE      ctermfg=brown          ctermbg=NONE      cterm=NONE
+hi rubyRegexpDelimiter         guifg=#FF8000      guibg=NONE      gui=NONE      ctermfg=brown          ctermbg=NONE      cterm=NONE
+hi rubyEscape                  guifg=white        guibg=NONE      gui=NONE      ctermfg=cyan           ctermbg=NONE      cterm=NONE
+hi rubyInterpolationDelimiter  guifg=#00A0A0      guibg=NONE      gui=NONE      ctermfg=blue           ctermbg=NONE      cterm=NONE
+hi rubyControl                 guifg=#6699CC      guibg=NONE      gui=NONE      ctermfg=blue           ctermbg=NONE      cterm=NONE  "and break, etc
+"hi rubyGlobalVariable          guifg=#FFCCFF      guibg=NONE      gui=NONE      ctermfg=lightblue      ctermbg=NONE      cterm=NONE  "yield
+hi rubyStringDelimiter         guifg=#336633      guibg=NONE      gui=NONE      ctermfg=lightgreen     ctermbg=NONE      cterm=NONE
+"rubyInclude
+"rubySharpBang
+"rubyAccess
+"rubyPredefinedVariable
+"rubyBoolean
+"rubyClassVariable
+"rubyBeginEnd
+"rubyRepeatModifier
+"hi link rubyArrayDelimiter    Special  " [ , , ]
+"rubyCurlyBlock  { , , }
+
+hi link rubyClass             Keyword 
+hi link rubyModule            Keyword 
+hi link rubyKeyword           Keyword 
+hi link rubyOperator          Operator
+hi link rubyIdentifier        Identifier
+hi link rubyInstanceVariable  Identifier
+hi link rubyGlobalVariable    Identifier
+hi link rubyClassVariable     Identifier
+hi link rubyConstant          Type  
+
+
+" Special for Java
+" hi link javaClassDecl    Type
+hi link javaScopeDecl         Identifier 
+hi link javaCommentTitle      javaDocSeeTag 
+hi link javaDocTags           javaDocSeeTag 
+hi link javaDocParam          javaDocSeeTag 
+hi link javaDocSeeTagParam    javaDocSeeTag 
+
+hi javaDocSeeTag              guifg=#CCCCCC     guibg=NONE        gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+hi javaDocSeeTag              guifg=#CCCCCC     guibg=NONE        gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+"hi javaClassDecl              guifg=#CCFFCC     guibg=NONE        gui=NONE      ctermfg=white       ctermbg=NONE        cterm=NONE
+
+
+" Special for XML
+hi link xmlTag          Keyword 
+hi link xmlTagName      Conditional 
+hi link xmlEndTag       Identifier 
+
+
+" Special for HTML
+hi link htmlTag         Keyword 
+hi link htmlTagName     Conditional 
+hi link htmlEndTag      Identifier 
+
+
+" Special for Javascript
+hi link javaScriptNumber      Number 
+
+
+" Special for Python
+"hi  link pythonEscape         Keyword      
+
+
+" Special for CSharp
+hi  link csXmlTag             Keyword      
+
+
+" Special for PHP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/merged.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,212 @@
+" ir_black color scheme
+" More at: http://blog.infinitered.com/entries/show/8
+
+
+" ********************************************************************************
+" Standard colors used in all ir_black themes:
+" Note, x:x:x are RGB values
+"
+"  normal: #f6f3e8
+" 
+"  string: #A8FF60  168:255:96                   
+"    string inner (punc, code, etc): #00A0A0  0:160:160
+"  number: #FF73FD  255:115:253                 
+"  comments: #7C7C7C  124:124:124
+"  keywords: #96CBFE  150:203:254             
+"  operators: white
+"  class: #FFFFB6  255:255:182
+"  method declaration name: #FFD2A7  255:210:167
+"  regular expression: #E9C062  233:192:98
+"    regexp alternate: #FF8000  255:128:0
+"    regexp alternate 2: #B18A3D  177:138:61
+"  variable: #C6C5FE  198:197:254
+"  
+" Misc colors:
+"  red color (used for whatever): #FF6C60   255:108:96 
+"     light red: #FFB6B0   255:182:176
+"
+"  brown: #E18964  good for special
+"
+"  lightpurpleish: #FFCCFF
+" 
+" Interface colors:
+"  background color: black
+"  cursor (where underscore is used): #FFA560  255:165:96
+"  cursor (where block is used): white
+"  visual selection: #1D1E2C  
+"  current line: #151515  21:21:21
+"  search selection: #07281C  7:40:28
+"  line number: #3D3D3D  61:61:61
+
+
+" ********************************************************************************
+" The following are the preferred 16 colors for your terminal
+"           Colors      Bright Colors
+" Black     #4E4E4E     #7C7C7C
+" Red       #FF6C60     #FFB6B0
+" Green     #A8FF60     #CEFFAB
+" Yellow    #FFFFB6     #FFFFCB
+" Blue      #96CBFE     #FFFFCB
+" Magenta   #FF73FD     #FF9CFE
+" Cyan      #C6C5FE     #DFDFFE
+" White     #EEEEEE     #FFFFFF
+
+
+" ********************************************************************************
+set background=dark
+hi clear
+
+if exists("syntax_on")
+  syntax reset
+endif
+
+let colors_name = "merged"
+
+
+"hi Example         guifg=NONE        guibg=NONE        gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+
+" General colors
+hi Normal           guifg=#f6f3e8     guibg=#202020     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+hi NonText          guifg=#070707     guibg=#202020     gui=NONE      ctermfg=black       ctermbg=NONE        cterm=NONE
+
+hi Cursor           guifg=black       guibg=white       gui=NONE      ctermfg=black       ctermbg=white       cterm=reverse
+hi LineNr           guifg=#808080     guibg=black       gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+
+hi VertSplit        guifg=#202020     guibg=#202020     gui=NONE      ctermfg=darkgray    ctermbg=darkgray    cterm=NONE
+hi StatusLine       guifg=#f6f3e8     guibg=#384048     gui=italic    ctermfg=white       ctermbg=darkgray    cterm=NONE
+hi StatusLineNC     guifg=#808080     guibg=#384048     gui=NONE      ctermfg=blue        ctermbg=darkgray    cterm=NONE  
+
+hi Folded           guifg=#a0a8b0     guibg=#384048     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+hi Title            guifg=#f6f3e8     guibg=NONE        gui=bold      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+hi Visual           guifg=NONE        guibg=#262D51     gui=NONE      ctermfg=NONE        ctermbg=darkgray    cterm=NONE
+
+hi SpecialKey       guifg=#808080     guibg=#343434     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+
+hi WildMenu         guifg=green       guibg=#FFFFB6     gui=NONE      ctermfg=black       ctermbg=yellow      cterm=NONE
+hi PmenuSbar        guifg=black       guibg=white       gui=NONE      ctermfg=black       ctermbg=white       cterm=NONE
+"hi Ignore           guifg=gray        guibg=black       gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+
+hi Error            guifg=white       guibg=#FFFFFF     gui=BOLD      ctermfg=white       ctermbg=red         cterm=NONE
+hi ErrorMsg         guifg=white       guibg=#FF6C60     gui=BOLD      ctermfg=white       ctermbg=red         cterm=NONE
+hi WarningMsg       guifg=white       guibg=#FF6C60     gui=BOLD      ctermfg=white       ctermbg=red         cterm=NONE
+
+" Message displayed in lower left, such as --INSERT--
+hi ModeMsg          guifg=#FF73FD     guibg=NONE       gui=NONE      ctermfg=black       ctermbg=cyan        cterm=BOLD
+
+if version >= 700 " Vim 7.x specific colors
+  hi CursorLine     guifg=NONE        guibg=#121212     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=BOLD
+  hi CursorColumn   guifg=NONE        guibg=#121212     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=BOLD
+  hi MatchParen     guifg=#f6f3e8     guibg=#857b6f     gui=BOLD      ctermfg=white       ctermbg=darkgray    cterm=NONE
+  hi Pmenu          guifg=#f6f3e8     guibg=#444444     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+  hi PmenuSel       guifg=#000000     guibg=#cae682     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=NONE
+  hi Search         guifg=black       guibg=#FFFFB6     gui=NONE      ctermfg=NONE        ctermbg=NONE        cterm=underline
+endif
+
+" Syntax highlighting
+hi Comment          guifg=#7C7C7C     guibg=NONE        gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+hi String           guifg=#A8FF60     guibg=NONE        gui=NONE      ctermfg=green       ctermbg=NONE        cterm=NONE
+hi Number           guifg=#FF73FD     guibg=NONE        gui=NONE      ctermfg=magenta     ctermbg=NONE        cterm=NONE
+
+hi Keyword          guifg=#96CBFE     guibg=NONE        gui=NONE      ctermfg=blue        ctermbg=NONE        cterm=NONE
+hi PreProc          guifg=#96CBFE     guibg=NONE        gui=NONE      ctermfg=blue        ctermbg=NONE        cterm=NONE
+hi Conditional      guifg=#6699CC     guibg=NONE        gui=NONE      ctermfg=blue        ctermbg=NONE        cterm=NONE  " if else end
+
+hi Todo             guifg=#8f8f8f     guibg=NONE        gui=NONE      ctermfg=red         ctermbg=NONE        cterm=NONE
+hi Constant         guifg=#99CC99     guibg=NONE        gui=NONE      ctermfg=cyan        ctermbg=NONE        cterm=NONE
+
+hi Identifier       guifg=#C6C5FE     guibg=NONE        gui=NONE      ctermfg=cyan        ctermbg=NONE        cterm=NONE
+hi Function         guifg=#FFD2A7     guibg=NONE        gui=NONE      ctermfg=brown       ctermbg=NONE        cterm=NONE
+hi Type             guifg=#FFFFB6     guibg=NONE        gui=NONE      ctermfg=yellow      ctermbg=NONE        cterm=NONE
+hi Statement        guifg=#6699CC     guibg=NONE        gui=NONE      ctermfg=lightblue   ctermbg=NONE        cterm=NONE
+
+hi Special          guifg=#E18964     guibg=NONE        gui=NONE      ctermfg=white       ctermbg=NONE        cterm=NONE
+hi Delimiter        guifg=#00A0A0     guibg=NONE        gui=NONE      ctermfg=cyan        ctermbg=NONE        cterm=NONE
+hi Operator         guifg=white       guibg=NONE        gui=NONE      ctermfg=white       ctermbg=NONE        cterm=NONE
+
+hi link Character       Constant
+hi link Boolean         Constant
+hi link Float           Number
+hi link Repeat          Statement
+hi link Label           Statement
+hi link Exception       Statement
+hi link Include         PreProc
+hi link Define          PreProc
+hi link Macro           PreProc
+hi link PreCondit       PreProc
+hi link StorageClass    Type
+hi link Structure       Type
+hi link Typedef         Type
+hi link Tag             Special
+hi link SpecialChar     Special
+hi link SpecialComment  Special
+hi link Debug           Special
+
+
+" Special for Ruby
+hi rubyRegexp                  guifg=#B18A3D      guibg=NONE      gui=NONE      ctermfg=brown          ctermbg=NONE      cterm=NONE
+hi rubyRegexpDelimiter         guifg=#FF8000      guibg=NONE      gui=NONE      ctermfg=brown          ctermbg=NONE      cterm=NONE
+hi rubyEscape                  guifg=white        guibg=NONE      gui=NONE      ctermfg=cyan           ctermbg=NONE      cterm=NONE
+hi rubyInterpolationDelimiter  guifg=#00A0A0      guibg=NONE      gui=NONE      ctermfg=blue           ctermbg=NONE      cterm=NONE
+hi rubyControl                 guifg=#6699CC      guibg=NONE      gui=NONE      ctermfg=blue           ctermbg=NONE      cterm=NONE  "and break, etc
+"hi rubyGlobalVariable          guifg=#FFCCFF      guibg=NONE      gui=NONE      ctermfg=lightblue      ctermbg=NONE      cterm=NONE  "yield
+hi rubyStringDelimiter         guifg=#336633      guibg=NONE      gui=NONE      ctermfg=lightgreen     ctermbg=NONE      cterm=NONE
+"rubyInclude
+"rubySharpBang
+"rubyAccess
+"rubyPredefinedVariable
+"rubyBoolean
+"rubyClassVariable
+"rubyBeginEnd
+"rubyRepeatModifier
+"hi link rubyArrayDelimiter    Special  " [ , , ]
+"rubyCurlyBlock  { , , }
+
+hi link rubyClass             Keyword 
+hi link rubyModule            Keyword 
+hi link rubyKeyword           Keyword 
+hi link rubyOperator          Operator
+hi link rubyIdentifier        Identifier
+hi link rubyInstanceVariable  Identifier
+hi link rubyGlobalVariable    Identifier
+hi link rubyClassVariable     Identifier
+hi link rubyConstant          Type  
+
+
+" Special for Java
+" hi link javaClassDecl    Type
+hi link javaScopeDecl         Identifier 
+hi link javaCommentTitle      javaDocSeeTag 
+hi link javaDocTags           javaDocSeeTag 
+hi link javaDocParam          javaDocSeeTag 
+hi link javaDocSeeTagParam    javaDocSeeTag 
+
+hi javaDocSeeTag              guifg=#CCCCCC     guibg=NONE        gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+hi javaDocSeeTag              guifg=#CCCCCC     guibg=NONE        gui=NONE      ctermfg=darkgray    ctermbg=NONE        cterm=NONE
+"hi javaClassDecl              guifg=#CCFFCC     guibg=NONE        gui=NONE      ctermfg=white       ctermbg=NONE        cterm=NONE
+
+
+" Special for XML
+hi link xmlTag          Keyword 
+hi link xmlTagName      Conditional 
+hi link xmlEndTag       Identifier 
+
+
+" Special for HTML
+hi link htmlTag         Keyword 
+hi link htmlTagName     Conditional 
+hi link htmlEndTag      Identifier 
+
+
+" Special for Javascript
+hi link javaScriptNumber      Number 
+
+
+" Special for Python
+"hi  link pythonEscape         Keyword      
+
+
+" Special for CSharp
+hi  link csXmlTag             Keyword      
+
+
+" Special for PHP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/mustang.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,55 @@
+" Maintainer:	Henrique C. Alves (hcarvalhoalves@gmail.com)
+" Version:      1.0
+" Last Change:	September 25 2008
+
+set background=dark
+
+hi clear
+
+if exists("syntax_on")
+  syntax reset
+endif
+
+let colors_name = "mustang"
+
+" Vim >= 7.0 specific colors
+if version >= 700
+  hi CursorLine guibg=#2d2d2d ctermbg=236
+  hi CursorColumn guibg=#2d2d2d ctermbg=236
+  hi MatchParen guifg=#d0ffc0 guibg=#2f2f2f gui=bold ctermfg=157 ctermbg=237 cterm=bold
+  hi Pmenu 		guifg=#ffffff guibg=#444444 ctermfg=255 ctermbg=238
+  hi PmenuSel 	guifg=#000000 guibg=#b1d631 ctermfg=0 ctermbg=148
+endif
+
+" General colors
+hi Cursor 		guifg=NONE    guibg=#626262 gui=none ctermbg=241
+hi Normal 		guifg=#e2e2e5 guibg=#202020 gui=none ctermfg=253 ctermbg=234
+hi NonText 		guifg=#808080 guibg=#303030 gui=none ctermfg=244 ctermbg=235
+hi LineNr 		guifg=#808080 guibg=#000000 gui=none ctermfg=244 ctermbg=232
+hi StatusLine 	guifg=#d3d3d5 guibg=#444444 gui=italic ctermfg=253 ctermbg=238 cterm=italic
+hi StatusLineNC guifg=#939395 guibg=#444444 gui=none ctermfg=246 ctermbg=238
+hi VertSplit 	guifg=#444444 guibg=#444444 gui=none ctermfg=238 ctermbg=238
+hi Folded 		guibg=#384048 guifg=#a0a8b0 gui=none ctermbg=4 ctermfg=248
+hi Title		guifg=#f6f3e8 guibg=NONE	gui=bold ctermfg=254 cterm=bold
+hi Visual		guifg=#faf4c6 guibg=#3c414c gui=none ctermfg=254 ctermbg=4
+hi SpecialKey	guifg=#808080 guibg=#343434 gui=none ctermfg=244 ctermbg=236
+
+" Syntax highlighting
+hi Comment 		guifg=#808080 gui=italic ctermfg=244
+hi Todo 		guifg=#8f8f8f gui=italic ctermfg=245
+hi Boolean      guifg=#b1d631 gui=none ctermfg=148
+hi String 		guifg=#b1d631 gui=italic ctermfg=148
+hi Identifier 	guifg=#b1d631 gui=none ctermfg=148
+hi Function 	guifg=#ffffff gui=bold ctermfg=255
+hi Type 		guifg=#7e8aa2 gui=none ctermfg=103
+hi Statement 	guifg=#7e8aa2 gui=none ctermfg=103
+hi Keyword		guifg=#ff9800 gui=none ctermfg=208
+hi Constant 	guifg=#ff9800 gui=none  ctermfg=208
+hi Number		guifg=#ff9800 gui=none ctermfg=208
+hi Special		guifg=#ff9800 gui=none ctermfg=208
+hi PreProc 		guifg=#faf4c6 gui=none ctermfg=230
+hi Todo         guifg=#000000 guibg=#e6ea50 gui=italic
+
+" Code-specific colors
+hi pythonOperator guifg=#7e8aa2 gui=none ctermfg=103
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/onedark.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,555 @@
+" vim:fdm=marker
+" Vim Color File
+" Name:       onedark.vim
+" Maintainer: https://github.com/joshdick/onedark.vim/
+" License:    The MIT License (MIT)
+" Based On:   https://github.com/MaxSt/FlatColor/
+
+" A companion [vim-airline](https://github.com/bling/vim-airline) theme is available at: https://github.com/joshdick/airline-onedark.vim
+
+" Color Reference {{{
+
+" The following colors were measured inside Atom using its built-in inspector.
+
+" +---------------------------------------------+
+" |  Color Name  |         RGB        |   Hex   |
+" |--------------+--------------------+---------|
+" | Black        | rgb(40, 44, 52)    | #282c34 |
+" |--------------+--------------------+---------|
+" | White        | rgb(171, 178, 191) | #abb2bf |
+" |--------------+--------------------+---------|
+" | Light Red    | rgb(224, 108, 117) | #e06c75 |
+" |--------------+--------------------+---------|
+" | Dark Red     | rgb(190, 80, 70)   | #be5046 |
+" |--------------+--------------------+---------|
+" | Green        | rgb(152, 195, 121) | #98c379 |
+" |--------------+--------------------+---------|
+" | Light Yellow | rgb(229, 192, 123) | #e5c07b |
+" |--------------+--------------------+---------|
+" | Dark Yellow  | rgb(209, 154, 102) | #d19a66 |
+" |--------------+--------------------+---------|
+" | Blue         | rgb(97, 175, 239)  | #61afef |
+" |--------------+--------------------+---------|
+" | Magenta      | rgb(198, 120, 221) | #c678dd |
+" |--------------+--------------------+---------|
+" | Cyan         | rgb(86, 182, 194)  | #56b6c2 |
+" |--------------+--------------------+---------|
+" | Gutter Grey  | rgb(76, 82, 99)    | #4b5263 |
+" |--------------+--------------------+---------|
+" | Comment Grey | rgb(92, 99, 112)   | #5c6370 |
+" +---------------------------------------------+
+
+" }}}
+
+" Initialization {{{
+
+highlight clear
+
+if exists("syntax_on")
+  syntax reset
+endif
+
+set t_Co=256
+
+let g:colors_name="onedark"
+
+" Set to "256" for 256-color terminals, or
+" set to "16" to use your terminal emulator's native colors
+" (a 16-color palette for this color scheme is available; see
+" < https://github.com/joshdick/onedark.vim/blob/master/README.md >
+" for more information.)
+if !exists("g:onedark_termcolors")
+  let g:onedark_termcolors = 256
+endif
+
+" Not all terminals support italics properly. If yours does, opt-in.
+if !exists("g:onedark_terminal_italics")
+  let g:onedark_terminal_italics = 0
+endif
+
+" This function is based on one from FlatColor: https://github.com/MaxSt/FlatColor/
+" Which in turn was based on one found in hemisu: https://github.com/noahfrederick/vim-hemisu/
+let s:group_colors = {} " Cache of default highlight group settings, for later reference via `onedark#extend_highlight`
+function! s:h(group, style, ...)
+  if (a:0 > 0) " Will be true if we got here from onedark#extend_highlight
+    let a:highlight = s:group_colors[a:group]
+    for style_type in ["fg", "bg", "sp"]
+      if (has_key(a:style, style_type))
+        let l:default_style = (has_key(a:highlight, style_type) ? a:highlight[style_type] : { "cterm16": "NONE", "cterm": "NONE", "gui": "NONE" })
+        let a:highlight[style_type] = extend(l:default_style, a:style[style_type])
+      endif
+    endfor
+    if (has_key(a:style, "gui"))
+      let a:highlight.gui = a:style.gui
+    endif
+  else
+    let a:highlight = a:style
+    let s:group_colors[a:group] = a:highlight " Cache default highlight group settings
+  endif
+
+  if g:onedark_terminal_italics == 0
+    if has_key(a:highlight, "cterm") && a:highlight["cterm"] == "italic"
+      unlet a:highlight.cterm
+    endif
+    if has_key(a:highlight, "gui") && a:highlight["gui"] == "italic"
+      unlet a:highlight.gui
+    endif
+  endif
+
+  if g:onedark_termcolors == 16
+    let l:ctermfg = (has_key(a:highlight, "fg") ? a:highlight.fg.cterm16 : "NONE")
+    let l:ctermbg = (has_key(a:highlight, "bg") ? a:highlight.bg.cterm16 : "NONE")
+  else
+    let l:ctermfg = (has_key(a:highlight, "fg") ? a:highlight.fg.cterm : "NONE")
+    let l:ctermbg = (has_key(a:highlight, "bg") ? a:highlight.bg.cterm : "NONE")
+  endif
+
+  execute "highlight" a:group
+    \ "guifg="   (has_key(a:highlight, "fg")    ? a:highlight.fg.gui   : "NONE")
+    \ "guibg="   (has_key(a:highlight, "bg")    ? a:highlight.bg.gui   : "NONE")
+    \ "guisp="   (has_key(a:highlight, "sp")    ? a:highlight.sp.gui   : "NONE")
+    \ "gui="     (has_key(a:highlight, "gui")   ? a:highlight.gui      : "NONE")
+    \ "ctermfg=" . l:ctermfg
+    \ "ctermbg=" . l:ctermbg
+    \ "cterm="   (has_key(a:highlight, "cterm") ? a:highlight.cterm    : "NONE")
+endfunction
+
+" public {{{
+
+function! onedark#set_highlight(group, style)
+  call s:h(a:group, a:style)
+endfunction
+
+function! onedark#extend_highlight(group, style)
+  call s:h(a:group, a:style, 1)
+endfunction
+
+" }}}
+
+" }}}
+
+" Color Variables {{{
+
+let s:colors = onedark#GetColors()
+
+let s:red = s:colors.red
+let s:dark_red = s:colors.dark_red
+let s:green = s:colors.green
+let s:yellow = s:colors.yellow
+let s:dark_yellow = s:colors.dark_yellow
+let s:blue = s:colors.blue
+let s:purple = s:colors.purple
+let s:cyan = s:colors.cyan
+let s:white = s:colors.white
+let s:black = s:colors.black
+let s:visual_black = s:colors.visual_black " Black out selected text in 16-color visual mode
+let s:comment_grey = s:colors.comment_grey
+let s:gutter_fg_grey = s:colors.gutter_fg_grey
+let s:cursor_grey = s:colors.cursor_grey
+let s:visual_grey = s:colors.visual_grey
+let s:menu_grey = s:colors.menu_grey
+let s:special_grey = s:colors.special_grey
+let s:vertsplit = s:colors.vertsplit
+
+" }}}
+
+" Syntax Groups (descriptions and ordering from `:h w18`) {{{
+
+call s:h("Comment", { "fg": s:comment_grey, "gui": "italic", "cterm": "italic" }) " any comment
+call s:h("Constant", { "fg": s:cyan }) " any constant
+call s:h("String", { "fg": s:green }) " a string constant: "this is a string"
+call s:h("Character", { "fg": s:green }) " a character constant: 'c', '\n'
+call s:h("Number", { "fg": s:dark_yellow }) " a number constant: 234, 0xff
+call s:h("Boolean", { "fg": s:dark_yellow }) " a boolean constant: TRUE, false
+call s:h("Float", { "fg": s:dark_yellow }) " a floating point constant: 2.3e10
+call s:h("Identifier", { "fg": s:red }) " any variable name
+call s:h("Function", { "fg": s:blue }) " function name (also: methods for classes)
+call s:h("Statement", { "fg": s:purple }) " any statement
+call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc.
+call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc.
+call s:h("Label", { "fg": s:purple }) " case, default, etc.
+call s:h("Operator", { "fg": s:purple }) " sizeof", "+", "*", etc.
+call s:h("Keyword", { "fg": s:red }) " any other keyword
+call s:h("Exception", { "fg": s:purple }) " try, catch, throw
+call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor
+call s:h("Include", { "fg": s:blue }) " preprocessor #include
+call s:h("Define", { "fg": s:purple }) " preprocessor #define
+call s:h("Macro", { "fg": s:purple }) " same as Define
+call s:h("PreCondit", { "fg": s:yellow }) " preprocessor #if, #else, #endif, etc.
+call s:h("Type", { "fg": s:yellow }) " int, long, char, etc.
+call s:h("StorageClass", { "fg": s:yellow }) " static, register, volatile, etc.
+call s:h("Structure", { "fg": s:yellow }) " struct, union, enum, etc.
+call s:h("Typedef", { "fg": s:yellow }) " A typedef
+call s:h("Special", { "fg": s:blue }) " any special symbol
+call s:h("SpecialChar", {}) " special character in a constant
+call s:h("Tag", {}) " you can use CTRL-] on this
+call s:h("Delimiter", {}) " character that needs attention
+call s:h("SpecialComment", { "fg": s:comment_grey }) " special things inside a comment
+call s:h("Debug", {}) " debugging statements
+call s:h("Underlined", { "gui": "underline", "cterm": "underline" }) " text that stands out, HTML links
+call s:h("Ignore", {}) " left blank, hidden
+call s:h("Error", { "fg": s:red }) " any erroneous construct
+call s:h("Todo", { "fg": s:purple }) " anything that needs extra attention; mostly the keywords TODO FIXME and XXX
+
+" }}}
+
+" Highlighting Groups (descriptions and ordering from `:h highlight-groups`) {{{
+call s:h("ColorColumn", { "bg": s:cursor_grey }) " used for the columns set with 'colorcolumn'
+call s:h("Conceal", {}) " placeholder characters substituted for concealed text (see 'conceallevel')
+call s:h("Cursor", { "fg": s:black, "bg": s:blue }) " the character under the cursor
+call s:h("CursorIM", {}) " like Cursor, but used when in IME mode
+call s:h("CursorColumn", { "bg": s:cursor_grey }) " the screen column that the cursor is in when 'cursorcolumn' is set
+if &diff
+  " Don't change the background color in diff mode
+  call s:h("CursorLine", { "gui": "underline" }) " the screen line that the cursor is in when 'cursorline' is set
+else
+  call s:h("CursorLine", { "bg": s:cursor_grey }) " the screen line that the cursor is in when 'cursorline' is set
+endif
+call s:h("Directory", { "fg": s:blue }) " directory names (and other special names in listings)
+call s:h("DiffAdd", { "bg": s:green, "fg": s:black }) " diff mode: Added line
+call s:h("DiffChange", { "bg": s:yellow, "fg": s:black }) " diff mode: Changed line
+call s:h("DiffDelete", { "bg": s:red, "fg": s:black }) " diff mode: Deleted line
+call s:h("DiffText", { "bg": s:black, "fg": s:yellow }) " diff mode: Changed text within a changed line
+call s:h("ErrorMsg", { "fg": s:red }) " error messages on the command line
+call s:h("VertSplit", { "fg": s:vertsplit }) " the column separating vertically split windows
+call s:h("Folded", { "fg": s:comment_grey }) " line used for closed folds
+call s:h("FoldColumn", {}) " 'foldcolumn'
+call s:h("SignColumn", {}) " column where signs are displayed
+call s:h("IncSearch", { "fg": s:yellow, "bg": s:comment_grey }) " 'incsearch' highlighting; also used for the text replaced with ":s///c"
+call s:h("LineNr", { "fg": s:gutter_fg_grey }) " Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set.
+call s:h("CursorLineNr", {}) " Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line.
+call s:h("MatchParen", { "fg": s:blue, "gui": "underline" }) " The character under the cursor or just before it, if it is a paired bracket, and its match.
+call s:h("ModeMsg", {}) " 'showmode' message (e.g., "-- INSERT --")
+call s:h("MoreMsg", {}) " more-prompt
+call s:h("NonText", { "fg": s:special_grey }) " '~' and '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line).
+call s:h("Normal", { "fg": s:white, "bg": s:black }) " normal text
+call s:h("Pmenu", { "bg": s:menu_grey }) " Popup menu: normal item.
+call s:h("PmenuSel", { "fg": s:black, "bg": s:blue }) " Popup menu: selected item.
+call s:h("PmenuSbar", { "bg": s:special_grey }) " Popup menu: scrollbar.
+call s:h("PmenuThumb", { "bg": s:white }) " Popup menu: Thumb of the scrollbar.
+call s:h("Question", { "fg": s:purple }) " hit-enter prompt and yes/no questions
+call s:h("Search", { "fg": s:black, "bg": s:yellow }) " Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out.
+call s:h("QuickFixLine", { "fg": s:black, "bg": s:yellow }) " Current quickfix item in the quickfix window.
+call s:h("SpecialKey", { "fg": s:special_grey }) " Meta and special keys listed with ":map", also for text used to show unprintable characters in the text, 'listchars'. Generally: text that is displayed differently from what it really is.
+call s:h("SpellBad", { "fg": s:red, "gui": "underline", "cterm": "underline" }) " Word that is not recognized by the spellchecker. This will be combined with the highlighting used otherwise.
+call s:h("SpellCap", { "fg": s:dark_yellow }) " Word that should start with a capital. This will be combined with the highlighting used otherwise.
+call s:h("SpellLocal", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is used in another region. This will be combined with the highlighting used otherwise.
+call s:h("SpellRare", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is hardly ever used. spell This will be combined with the highlighting used otherwise.
+call s:h("StatusLine", { "fg": s:white, "bg": s:cursor_grey }) " status line of current window
+call s:h("StatusLineNC", { "fg": s:comment_grey }) " status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window.
+call s:h("TabLine", { "fg": s:comment_grey }) " tab pages line, not active tab page label
+call s:h("TabLineFill", {}) " tab pages line, where there are no labels
+call s:h("TabLineSel", { "fg": s:white }) " tab pages line, active tab page label
+call s:h("Title", { "fg": s:green }) " titles for output from ":set all", ":autocmd" etc.
+call s:h("Visual", { "fg": s:visual_black, "bg": s:visual_grey }) " Visual mode selection
+call s:h("VisualNOS", { "bg": s:visual_grey }) " Visual mode selection when vim is "Not Owning the Selection". Only X11 Gui's gui-x11 and xterm-clipboard supports this.
+call s:h("WarningMsg", { "fg": s:yellow }) " warning messages
+call s:h("WildMenu", { "fg": s:black, "bg": s:blue }) " current match in 'wildmenu' completion
+
+" }}}
+
+" Language-Specific Highlighting {{{
+
+" CSS
+call s:h("cssAttrComma", { "fg": s:purple })
+call s:h("cssAttributeSelector", { "fg": s:green })
+call s:h("cssBraces", { "fg": s:white })
+call s:h("cssClassName", { "fg": s:dark_yellow })
+call s:h("cssClassNameDot", { "fg": s:dark_yellow })
+call s:h("cssDefinition", { "fg": s:purple })
+call s:h("cssFontAttr", { "fg": s:dark_yellow })
+call s:h("cssFontDescriptor", { "fg": s:purple })
+call s:h("cssFunctionName", { "fg": s:blue })
+call s:h("cssIdentifier", { "fg": s:blue })
+call s:h("cssImportant", { "fg": s:purple })
+call s:h("cssInclude", { "fg": s:white })
+call s:h("cssIncludeKeyword", { "fg": s:purple })
+call s:h("cssMediaType", { "fg": s:dark_yellow })
+call s:h("cssProp", { "fg": s:white })
+call s:h("cssPseudoClassId", { "fg": s:dark_yellow })
+call s:h("cssSelectorOp", { "fg": s:purple })
+call s:h("cssSelectorOp2", { "fg": s:purple })
+call s:h("cssTagName", { "fg": s:red })
+
+" Go
+call s:h("goDeclaration", { "fg": s:purple })
+
+" HTML
+call s:h("htmlTitle", { "fg": s:white })
+call s:h("htmlArg", { "fg": s:dark_yellow })
+call s:h("htmlEndTag", { "fg": s:white })
+call s:h("htmlH1", { "fg": s:white })
+call s:h("htmlLink", { "fg": s:purple })
+call s:h("htmlSpecialChar", { "fg": s:dark_yellow })
+call s:h("htmlSpecialTagName", { "fg": s:red })
+call s:h("htmlTag", { "fg": s:white })
+call s:h("htmlTagName", { "fg": s:red })
+
+" JavaScript
+call s:h("javaScriptBraces", { "fg": s:white })
+call s:h("javaScriptFunction", { "fg": s:purple })
+call s:h("javaScriptIdentifier", { "fg": s:purple })
+call s:h("javaScriptNull", { "fg": s:dark_yellow })
+call s:h("javaScriptNumber", { "fg": s:dark_yellow })
+call s:h("javaScriptRequire", { "fg": s:cyan })
+call s:h("javaScriptReserved", { "fg": s:purple })
+" https://github.com/pangloss/vim-javascript
+call s:h("jsArrowFunction", { "fg": s:purple })
+call s:h("jsClassKeyword", { "fg": s:purple })
+call s:h("jsClassMethodType", { "fg": s:purple })
+call s:h("jsDocParam", { "fg": s:blue })
+call s:h("jsDocTags", { "fg": s:purple })
+call s:h("jsExport", { "fg": s:purple })
+call s:h("jsExportDefault", { "fg": s:purple })
+call s:h("jsExtendsKeyword", { "fg": s:purple })
+call s:h("jsFrom", { "fg": s:purple })
+call s:h("jsFuncCall", { "fg": s:blue })
+call s:h("jsFunction", { "fg": s:purple })
+call s:h("jsGenerator", { "fg": s:yellow })
+call s:h("jsGlobalObjects", { "fg": s:yellow })
+call s:h("jsImport", { "fg": s:purple })
+call s:h("jsModuleAs", { "fg": s:purple })
+call s:h("jsModuleWords", { "fg": s:purple })
+call s:h("jsModules", { "fg": s:purple })
+call s:h("jsNull", { "fg": s:dark_yellow })
+call s:h("jsOperator", { "fg": s:purple })
+call s:h("jsStorageClass", { "fg": s:purple })
+call s:h("jsSuper", { "fg": s:red })
+call s:h("jsTemplateBraces", { "fg": s:dark_red })
+call s:h("jsTemplateVar", { "fg": s:green })
+call s:h("jsThis", { "fg": s:red })
+call s:h("jsUndefined", { "fg": s:dark_yellow })
+" https://github.com/othree/yajs.vim
+call s:h("javascriptArrowFunc", { "fg": s:purple })
+call s:h("javascriptClassExtends", { "fg": s:purple })
+call s:h("javascriptClassKeyword", { "fg": s:purple })
+call s:h("javascriptDocNotation", { "fg": s:purple })
+call s:h("javascriptDocParamName", { "fg": s:blue })
+call s:h("javascriptDocTags", { "fg": s:purple })
+call s:h("javascriptEndColons", { "fg": s:white })
+call s:h("javascriptExport", { "fg": s:purple })
+call s:h("javascriptFuncArg", { "fg": s:white })
+call s:h("javascriptFuncKeyword", { "fg": s:purple })
+call s:h("javascriptIdentifier", { "fg": s:red })
+call s:h("javascriptImport", { "fg": s:purple })
+call s:h("javascriptMethodName", { "fg": s:white })
+call s:h("javascriptObjectLabel", { "fg": s:white })
+call s:h("javascriptOpSymbol", { "fg": s:cyan })
+call s:h("javascriptOpSymbols", { "fg": s:cyan })
+call s:h("javascriptPropertyName", { "fg": s:green })
+call s:h("javascriptTemplateSB", { "fg": s:dark_red })
+call s:h("javascriptVariable", { "fg": s:purple })
+
+" JSON
+call s:h("jsonCommentError", { "fg": s:white })
+call s:h("jsonKeyword", { "fg": s:red })
+call s:h("jsonBoolean", { "fg": s:dark_yellow })
+call s:h("jsonNumber", { "fg": s:dark_yellow })
+call s:h("jsonQuote", { "fg": s:white })
+call s:h("jsonMissingCommaError", { "fg": s:red, "gui": "reverse" })
+call s:h("jsonNoQuotesError", { "fg": s:red, "gui": "reverse" })
+call s:h("jsonNumError", { "fg": s:red, "gui": "reverse" })
+call s:h("jsonString", { "fg": s:green })
+call s:h("jsonStringSQError", { "fg": s:red, "gui": "reverse" })
+call s:h("jsonSemicolonError", { "fg": s:red, "gui": "reverse" })
+
+" LESS
+call s:h("lessVariable", { "fg": s:purple })
+call s:h("lessAmpersandChar", { "fg": s:white })
+call s:h("lessClass", { "fg": s:dark_yellow })
+
+" Markdown
+call s:h("markdownCode", { "fg": s:green })
+call s:h("markdownCodeBlock", { "fg": s:green })
+call s:h("markdownCodeDelimiter", { "fg": s:green })
+call s:h("markdownHeadingDelimiter", { "fg": s:red })
+call s:h("markdownRule", { "fg": s:comment_grey })
+call s:h("markdownHeadingRule", { "fg": s:comment_grey })
+call s:h("markdownH1", { "fg": s:red })
+call s:h("markdownH2", { "fg": s:red })
+call s:h("markdownH3", { "fg": s:red })
+call s:h("markdownH4", { "fg": s:red })
+call s:h("markdownH5", { "fg": s:red })
+call s:h("markdownH6", { "fg": s:red })
+call s:h("markdownIdDelimiter", { "fg": s:purple })
+call s:h("markdownId", { "fg": s:purple })
+call s:h("markdownBlockquote", { "fg": s:comment_grey })
+call s:h("markdownItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" })
+call s:h("markdownBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" })
+call s:h("markdownListMarker", { "fg": s:red })
+call s:h("markdownOrderedListMarker", { "fg": s:red })
+call s:h("markdownIdDeclaration", { "fg": s:blue })
+call s:h("markdownLinkText", { "fg": s:blue })
+call s:h("markdownLinkDelimiter", { "fg": s:white })
+call s:h("markdownUrl", { "fg": s:purple })
+
+" Perl
+call s:h("perlFiledescRead", { "fg": s:green })
+call s:h("perlFunction", { "fg": s:purple })
+call s:h("perlMatchStartEnd",{ "fg": s:blue })
+call s:h("perlMethod", { "fg": s:purple })
+call s:h("perlPOD", { "fg": s:comment_grey })
+call s:h("perlSharpBang", { "fg": s:comment_grey })
+call s:h("perlSpecialString",{ "fg": s:cyan })
+call s:h("perlStatementFiledesc", { "fg": s:red })
+call s:h("perlStatementFlow",{ "fg": s:red })
+call s:h("perlStatementInclude", { "fg": s:purple })
+call s:h("perlStatementScalar",{ "fg": s:purple })
+call s:h("perlStatementStorage", { "fg": s:purple })
+call s:h("perlSubName",{ "fg": s:yellow })
+call s:h("perlVarPlain",{ "fg": s:blue })
+
+" PHP
+call s:h("phpVarSelector", { "fg": s:red })
+call s:h("phpOperator", { "fg": s:white })
+call s:h("phpParent", { "fg": s:white })
+call s:h("phpMemberSelector", { "fg": s:white })
+call s:h("phpType", { "fg": s:purple })
+call s:h("phpKeyword", { "fg": s:purple })
+call s:h("phpClass", { "fg": s:yellow })
+call s:h("phpUseClass", { "fg": s:white })
+call s:h("phpUseAlias", { "fg": s:white })
+call s:h("phpInclude", { "fg": s:purple })
+call s:h("phpClassExtends", { "fg": s:green })
+call s:h("phpDocTags", { "fg": s:white })
+call s:h("phpFunction", { "fg": s:blue })
+call s:h("phpFunctions", { "fg": s:cyan })
+call s:h("phpMethodsVar", { "fg": s:dark_yellow })
+call s:h("phpMagicConstants", { "fg": s:dark_yellow })
+call s:h("phpSuperglobals", { "fg": s:red })
+call s:h("phpConstants", { "fg": s:dark_yellow })
+
+" Ruby
+call s:h("rubyBlockParameter", { "fg": s:red})
+call s:h("rubyBlockParameterList", { "fg": s:red })
+call s:h("rubyClass", { "fg": s:purple})
+call s:h("rubyConstant", { "fg": s:yellow})
+call s:h("rubyControl", { "fg": s:purple })
+call s:h("rubyEscape", { "fg": s:red})
+call s:h("rubyFunction", { "fg": s:blue})
+call s:h("rubyGlobalVariable", { "fg": s:red})
+call s:h("rubyInclude", { "fg": s:blue})
+call s:h("rubyIncluderubyGlobalVariable", { "fg": s:red})
+call s:h("rubyInstanceVariable", { "fg": s:red})
+call s:h("rubyInterpolation", { "fg": s:cyan })
+call s:h("rubyInterpolationDelimiter", { "fg": s:red })
+call s:h("rubyInterpolationDelimiter", { "fg": s:red})
+call s:h("rubyRegexp", { "fg": s:cyan})
+call s:h("rubyRegexpDelimiter", { "fg": s:cyan})
+call s:h("rubyStringDelimiter", { "fg": s:green})
+call s:h("rubySymbol", { "fg": s:cyan})
+
+" Sass
+" https://github.com/tpope/vim-haml
+call s:h("sassAmpersand", { "fg": s:red })
+call s:h("sassClass", { "fg": s:dark_yellow })
+call s:h("sassControl", { "fg": s:purple })
+call s:h("sassExtend", { "fg": s:purple })
+call s:h("sassFor", { "fg": s:white })
+call s:h("sassFunction", { "fg": s:cyan })
+call s:h("sassId", { "fg": s:blue })
+call s:h("sassInclude", { "fg": s:purple })
+call s:h("sassMedia", { "fg": s:purple })
+call s:h("sassMediaOperators", { "fg": s:white })
+call s:h("sassMixin", { "fg": s:purple })
+call s:h("sassMixinName", { "fg": s:blue })
+call s:h("sassMixing", { "fg": s:purple })
+call s:h("sassVariable", { "fg": s:purple })
+" https://github.com/cakebaker/scss-syntax.vim
+call s:h("scssExtend", { "fg": s:purple })
+call s:h("scssImport", { "fg": s:purple })
+call s:h("scssInclude", { "fg": s:purple })
+call s:h("scssMixin", { "fg": s:purple })
+call s:h("scssSelectorName", { "fg": s:dark_yellow })
+call s:h("scssVariable", { "fg": s:purple })
+
+" TypeScript
+call s:h("typescriptReserved", { "fg": s:purple })
+call s:h("typescriptEndColons", { "fg": s:white })
+call s:h("typescriptBraces", { "fg": s:white })
+
+" XML
+call s:h("xmlAttrib", { "fg": s:dark_yellow })
+call s:h("xmlEndTag", { "fg": s:red })
+call s:h("xmlTag", { "fg": s:red })
+call s:h("xmlTagName", { "fg": s:red })
+
+" }}}
+
+" Plugin Highlighting {{{
+
+" airblade/vim-gitgutter
+hi link GitGutterAdd    SignifySignAdd
+hi link GitGutterChange SignifySignChange
+hi link GitGutterDelete SignifySignDelete
+
+" mhinz/vim-signify
+call s:h("SignifySignAdd", { "fg": s:green })
+call s:h("SignifySignChange", { "fg": s:yellow })
+call s:h("SignifySignDelete", { "fg": s:red })
+
+" neomake/neomake
+call s:h("NeomakeWarningSign", { "fg": s:yellow })
+call s:h("NeomakeErrorSign", { "fg": s:red })
+call s:h("NeomakeInfoSign", { "fg": s:blue })
+
+" tpope/vim-fugitive
+call s:h("diffAdded", { "fg": s:green })
+call s:h("diffRemoved", { "fg": s:red })
+
+" }}}
+
+" Git Highlighting {{{
+
+call s:h("gitcommitComment", { "fg": s:comment_grey })
+call s:h("gitcommitUnmerged", { "fg": s:green })
+call s:h("gitcommitOnBranch", {})
+call s:h("gitcommitBranch", { "fg": s:purple })
+call s:h("gitcommitDiscardedType", { "fg": s:red })
+call s:h("gitcommitSelectedType", { "fg": s:green })
+call s:h("gitcommitHeader", {})
+call s:h("gitcommitUntrackedFile", { "fg": s:cyan })
+call s:h("gitcommitDiscardedFile", { "fg": s:red })
+call s:h("gitcommitSelectedFile", { "fg": s:green })
+call s:h("gitcommitUnmergedFile", { "fg": s:yellow })
+call s:h("gitcommitFile", {})
+call s:h("gitcommitSummary", { "fg": s:white })
+call s:h("gitcommitOverflow", { "fg": s:red })
+hi link gitcommitNoBranch gitcommitBranch
+hi link gitcommitUntracked gitcommitComment
+hi link gitcommitDiscarded gitcommitComment
+hi link gitcommitSelected gitcommitComment
+hi link gitcommitDiscardedArrow gitcommitDiscardedFile
+hi link gitcommitSelectedArrow gitcommitSelectedFile
+hi link gitcommitUnmergedArrow gitcommitUnmergedFile
+
+" }}}
+
+" Neovim terminal colors {{{
+
+if has("nvim")
+  let g:terminal_color_0 =  s:black.gui
+  let g:terminal_color_1 =  s:red.gui
+  let g:terminal_color_2 =  s:green.gui
+  let g:terminal_color_3 =  s:yellow.gui
+  let g:terminal_color_4 =  s:blue.gui
+  let g:terminal_color_5 =  s:purple.gui
+  let g:terminal_color_6 =  s:cyan.gui
+  let g:terminal_color_7 =  s:white.gui
+  let g:terminal_color_8 =  s:visual_grey.gui
+  let g:terminal_color_9 =  s:dark_red.gui
+  let g:terminal_color_10 = s:green.gui " No dark version
+  let g:terminal_color_11 = s:dark_yellow.gui
+  let g:terminal_color_12 = s:blue.gui " No dark version
+  let g:terminal_color_13 = s:purple.gui " No dark version
+  let g:terminal_color_14 = s:cyan.gui " No dark version
+  let g:terminal_color_15 = s:comment_grey.gui
+  let g:terminal_color_background = g:terminal_color_0
+  let g:terminal_color_foreground = g:terminal_color_7
+endif
+
+" }}}
+
+" Must appear at the end of the file to work around this oddity:
+" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ
+set background=dark
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/colors/xoria256.vim	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,114 @@
+" Vim color file
+"
+" Name:       xoria256.vim
+" Version:    1.4
+" Maintainer:	Dmitriy Y. Zotikov (xio) <xio@ungrund.org>
+"
+" Should work in recent 256 color terminals.  88-color terms like urxvt are
+" NOT supported.
+"
+" Don't forget to install 'ncurses-term' and set TERM to xterm-256color or
+" similar value.
+"
+" Color numbers (0-255) see:
+" http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html
+
+" Initialization {{{
+if &t_Co != 256 && ! has("gui_running")
+  echomsg ""
+  echomsg "err: please use GUI or a 256-color terminal (so that t_Co=256 could be set)"
+  echomsg ""
+  finish
+endif
+
+set background=dark
+
+hi clear
+
+if exists("syntax_on")
+  syntax reset
+endif
+
+let colors_name = "xoria256"
+"}}}
+" Colours {{{1 
+"" General {{{2
+"hi Normal       ctermfg=252 guifg=#d0d0d0 ctermbg=234 guibg=#1c1c1c cterm=none gui=none
+hi Normal       ctermfg=252 guifg=#d0d0d0 ctermbg=234 guibg=#1a1a1a cterm=none gui=none
+hi Cursor                                 ctermbg=214 guibg=#ffaf00
+hi CursorColumn                           ctermbg=234 guibg=#1a1a1a
+hi CursorLine                             ctermbg=234 guibg=#1a1a1a cterm=bold gui=bold
+hi CursorLineNr ctermfg=252 guifg=#d0d0d0 ctermbg=234 guibg=#1a1a1a
+hi Error        ctermfg=15  guifg=#ffffff ctermbg=1   guibg=#800000
+hi ErrorMsg     ctermfg=15  guifg=#ffffff ctermbg=1   guibg=#800000
+hi FoldColumn   ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#101010
+"hi Folded       ctermfg=255 guifg=#eeeeee ctermbg=60  guibg=#5f5f87
+hi Folded       ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#101010
+hi IncSearch    ctermfg=0   guifg=#000000 ctermbg=223 guibg=#ffdfaf cterm=none gui=none
+hi LineNr       ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#101010
+hi MatchParen   ctermfg=188 guifg=#dfdfdf ctermbg=68  guibg=#5f87df cterm=bold gui=bold
+"hi NonText      ctermfg=247 guifg=#9e9e9e ctermbg=233 guibg=#101010 cterm=bold gui=bold
+hi NonText      ctermfg=247 guifg=#9e9e9e ctermbg=234 guibg=#1a1a1a cterm=bold gui=bold
+hi Pmenu        ctermfg=0   guifg=#000000 ctermbg=246 guibg=#949494
+hi PmenuSbar                              ctermbg=243 guibg=#767676
+hi PmenuSel     ctermfg=0   guifg=#000000 ctermbg=243 guibg=#767676
+hi PmenuThumb                             ctermbg=252 guibg=#d0d0d0
+hi Search       ctermfg=0   guifg=#000000 ctermbg=149 guibg=#afdf5f
+hi SignColumn   ctermfg=248 guifg=#a8a8a8
+hi SpecialKey   ctermfg=77  guifg=#5fdf5f
+hi SpellBad     ctermfg=160 guifg=fg      ctermbg=bg                cterm=underline               guisp=#df0000
+hi SpellCap     ctermfg=189 guifg=#d0d0ff ctermbg=bg  guibg=bg      cterm=underline gui=underline 
+hi SpellRare    ctermfg=168 guifg=#d75f87 ctermbg=bg  guibg=bg      cterm=underline gui=underline 
+hi StatusLine                             ctermbg=239 guibg=#595959 cterm=bold gui=bold
+hi StatusLineNC                           ctermbg=237 guibg=#404040 cterm=none gui=none
+hi TabLine      ctermfg=fg  guifg=fg      ctermbg=242 guibg=#666666 cterm=none gui=none
+hi TabLineFill  ctermfg=fg  guifg=fg      ctermbg=239 guibg=#4e4e4e cterm=none gui=none
+hi Title        ctermfg=225 guifg=#ffdfff
+hi Todo         ctermfg=0   guifg=#000000 ctermbg=184 guibg=#dfdf00
+hi Underlined   ctermfg=39  guifg=#00afff                           cterm=underline gui=underline
+hi VertSplit    ctermfg=239 guifg=#4e4e4e ctermbg=239 guibg=#4e4e4e cterm=none gui=none
+" hi VIsualNOS    ctermfg=24  guifg=#005f87 ctermbg=153 guibg=#afdfff cterm=none gui=none
+" hi Visual       ctermfg=24  guifg=#005f87 ctermbg=153 guibg=#afdfff
+hi Visual       ctermfg=255 guifg=#eeeeee ctermbg=96  guibg=#5f875f
+hi VisualNOS    ctermfg=255 guifg=#eeeeee ctermbg=60  guibg=#5f5f87
+hi WildMenu     ctermfg=0   guifg=#000000 ctermbg=150 guibg=#afdf87 cterm=bold gui=bold
+
+"" Syntax highlighting {{{2
+hi Comment      ctermfg=244 guifg=#808080
+hi Constant     ctermfg=229 guifg=#ffffaf
+hi Identifier   ctermfg=182 guifg=#dfafdf                           cterm=none
+hi Ignore       ctermfg=238 guifg=#444444
+hi Number       ctermfg=180 guifg=#dfaf87
+hi PreProc      ctermfg=150 guifg=#afdf87
+hi Special      ctermfg=174 guifg=#df8787
+hi Statement    ctermfg=110 guifg=#87afdf                           cterm=none gui=none
+hi Type         ctermfg=146 guifg=#afafdf                           cterm=none gui=none
+
+"" Special {{{2
+""" .diff {{{3
+hi diffAdded    ctermfg=150 guifg=#afdf87
+hi diffRemoved  ctermfg=174 guifg=#df8787
+""" vimdiff {{{3
+hi diffAdd      ctermfg=bg  guifg=bg      ctermbg=151 guibg=#afdfaf
+"hi diffDelete   ctermfg=bg  guifg=bg      ctermbg=186 guibg=#dfdf87 cterm=none gui=none
+hi diffDelete   ctermfg=bg  guifg=bg      ctermbg=246 guibg=#949494 cterm=none gui=none
+hi diffChange   ctermfg=bg  guifg=bg      ctermbg=181 guibg=#dfafaf
+hi diffText     ctermfg=bg  guifg=bg      ctermbg=174 guibg=#df8787 cterm=none gui=none
+
+" Rainbow C/Cpp< {{{3
+hi cBracket      guifg=#E99DE9
+hi hlLevel1      guifg=#f0f0f0
+hi hlLevel2      guifg=#ebf1d2
+hi hlLevel3      guifg=#e7f3b4
+hi hlLevel4      guifg=#e2f596
+hi hlLevel5      guifg=#def778
+hi hlLevel6      guifg=#daf95a
+hi hlLevel7      guifg=#d5fb3c
+hi hlLevel8      guifg=#d1fd1e
+hi hlLevel9      guifg=#cdff00
+" }}}
+" Custom {{{3
+hi MarkerConstant guifg=#808080
+" }}}
+
+" vim: set expandtab tabstop=2 shiftwidth=2 smarttab softtabstop=2:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.config/nvim/doc/NERD_commenter.txt	Sat Dec 30 15:07:41 2017 +0100
@@ -0,0 +1,991 @@
+*NERD_commenter.txt*         Plugin for commenting code
+
+
+                        NERD COMMENTER REFERENCE MANUAL~
+
+
+
+
+
+==============================================================================
+CONTENTS                                               *NERDCommenterContents*
+
+    1.Intro...................................|NERDCommenter|
+    2.Functionality provided..................|NERDComFunctionality|
+        2.1 Functionality Summary.............|NERDComFunctionalitySummary|
+        2.2 Functionality Details.............|NERDComFunctionalityDetails|
+            2.2.1 Comment map.................|NERDComComment|
+            2.2.2 Nested comment map..........|NERDComNestedComment|
+            2.2.3 Toggle comment map..........|NERDComToggleComment|
+            2.2.4 Minimal comment map.........|NERDComMinimalComment|
+            2.2.5 Invert comment map..........|NERDComInvertComment|
+            2.2.6 Sexy comment map............|NERDComSexyComment|
+            2.2.7 Yank comment map............|NERDComYankComment|
+            2.2.8 Comment to EOL map..........|NERDComEOLComment|
+            2.2.9 Append com to line map......|NERDComAppendComment|
+            2.2.10 Insert comment map.........|NERDComInsertComment|
+            2.2.11 Use alternate delims map...|NERDComAltDelim|
+            2.2.12 Comment aligned maps.......|NERDComAlignedComment|
+            2.2.13 Uncomment line map.........|NERDComUncommentLine|
+        2.3 Supported filetypes...............|NERDComFiletypes|
+        2.4 Sexy Comments.....................|NERDComSexyComments|
+        2.5 The NERDComment function..........|NERDComNERDComment|
+    3.Options.................................|NERDComOptions|
+        3.1 Options summary...................|NERDComOptionsSummary|
+        3.2 Options details...................|NERDComOptionsDetails|
+        3.3 Default delimiter Options.........|NERDComDefaultDelims|
+    4. Customising key mappings...............|NERDComMappings|
+    5. Issues with the script.................|NERDComIssues|
+        5.1 Delimiter detection heuristics....|NERDComHeuristics|
+        5.2 Nesting issues....................|NERDComNesting|
+    6.About..     ............................|NERDComAbout|
+    7.Changelog...............................|NERDComChangelog|
+    8.Credits.................................|NERDComCredits|
+    9.License.................................|NERDComLicense|
+
+==============================================================================
+1. Intro                                                       *NERDCommenter*
+
+The NERD commenter provides many different commenting operations and styles
+which are invoked via key mappings and a menu. These operations are available
+for most filetypes.
+
+There are also options that allow to tweak the commenting engine to your
+taste.
+
+==============================================================================
+2. Functionality provided                               *NERDComFunctionality*
+
+------------------------------------------------------------------------------
+2.1 Functionality summary                        *NERDComFunctionalitySummary*
+
+The following key mappings are provided by default (there is also a menu
+with items corresponding to all the mappings below):
+
+[count],cc |NERDComComment|
+Comment out the current line or text selected in visual mode.
+
+
+[count],cn |NERDComNestedComment|
+Same as ,cc but forces nesting.
+
+
+[count],c<space> |NERDComToggleComment|
+Toggles the comment state of the selected line(s). If the topmost selected
+line is commented, all selected lines are uncommented and vice versa.
+
+
+[count],cm |NERDComMinimalComment|
+Comments the given lines using only one set of multipart delimiters.
+
+
+[count],ci |NERDComInvertComment|
+Toggles the comment state of the selected line(s) individually.
+
+
+[count],cs |NERDComSexyComment|
+Comments out the selected lines ``sexily''
+
+
+[count],cy |NERDComYankComment|
+Same as ,cc except that the commented line(s) are yanked first.
+
+
+,c$ |NERDComEOLComment|
+Comments the current line from the cursor to the end of line.
+
+
+,cA |NERDComAppendComment|
+Adds comment delimiters to the end of line and goes into insert mode between
+them.
+
+
+|NERDComInsertComment|
+Adds comment delimiters at the current cursor position and inserts between.
+Disabled by default.
+
+
+,ca |NERDComAltDelim|
+Switches to the alternative set of delimiters.
+
+
+[count],cl
+[count],cb    |NERDComAlignedComment|
+Same as |NERDComComment| except that the delimiters are aligned down the
+left side (,cl) or both sides (,cb).
+
+
+[count],cu |NERDComUncommentLine|
+Uncomments the selected line(s).
+
+------------------------------------------------------------------------------
+2.2 Functionality details                        *NERDComFunctionalityDetails*
+
+------------------------------------------------------------------------------
+2.2.1 Comment map                                             *NERDComComment*
+
+Default mapping: [count],cc
+Mapped to: <plug>NERDCommenterComment
+Applicable modes: normal visual visual-line visual-block.
+
+
+Comments out the current line. If multiple lines are selected in visual-line
+mode, they are all commented out.  If some text is selected in visual or
+visual-block mode then the script will try to comment out the exact text that
+is selected using multi-part delimiters if they are available.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+------------------------------------------------------------------------------
+2.2.2 Nested comment map                                *NERDComNestedComment*
+
+Default mapping: [count],cn
+Mapped to: <plug>NERDCommenterNest
+Applicable modes: normal visual visual-line visual-block.
+
+Performs nested commenting.  Works the same as ,cc except that if a line is
+already commented then it will be commented again.
+
+If |'NERDUsePlaceHolders'| is set then the previous comment delimiters will
+be replaced by place-holder delimiters if needed.  Otherwise the nested
+comment will only be added if the current commenting delimiters have no right
+delimiter (to avoid syntax errors)
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+Related options:
+|'NERDDefaultNesting'|
+
+------------------------------------------------------------------------------
+2.2.3 Toggle comment map                                *NERDComToggleComment*
+
+Default mapping: [count],c<space>
+Mapped to: <plug>NERDCommenterToggle
+Applicable modes: normal visual-line.
+
+Toggles commenting of the lines selected. The behaviour of this mapping
+depends on whether the first line selected is commented or not.  If so, all
+selected lines are uncommented and vice versa.
+
+With this mapping, a line is only considered to be commented if it starts with
+a left delimiter.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+------------------------------------------------------------------------------
+2.2.4 Minimal comment map                              *NERDComMinimalComment*
+
+Default mapping: [count],cm
+Mapped to: <plug>NERDCommenterMinimal
+Applicable modes: normal visual-line.
+
+Comments the selected lines using one set of multipart delimiters if possible.
+
+For example: if you are programming in c and you select 5 lines and press ,cm
+then a '/*' will be placed at the start of the top line and a '*/' will be
+placed at the end of the last line.
+
+Sets of multipart comment delimiters that are between the top and bottom
+selected lines are replaced with place holders (see |'NERDLPlace'|) if
+|'NERDUsePlaceHolders'| is set for the current filetype. If it is not, then
+the comment will be aborted if place holders are required to prevent illegal
+syntax.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+------------------------------------------------------------------------------
+2.2.5 Invert comment map                                *NERDComInvertComment*
+
+Default mapping: ,ci
+Mapped to: <plug>NERDCommenterInvert
+Applicable modes: normal visual-line.
+
+Inverts the commented state of each selected line. If the a selected line is
+commented then it is uncommented and vice versa. Each line is examined and
+commented/uncommented individually.
+
+With this mapping, a line is only considered to be commented if it starts with
+a left delimiter.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+------------------------------------------------------------------------------
+2.2.6 Sexy comment map                                    *NERDComSexyComment*
+
+Default mapping: [count],cs
+Mapped to: <plug>NERDCommenterSexy
+Applicable modes: normal, visual-line.
+
+Comments the selected line(s) ``sexily''... see |NERDComSexyComments| for
+a description of what sexy comments are. Can only be done on filetypes for
+which there is at least one set of multipart comment delimiters specified.
+
+Sexy comments cannot be nested and lines inside a sexy comment cannot be
+commented again.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+Related options:
+|'NERDCompactSexyComs'|
+
+------------------------------------------------------------------------------
+2.2.7 Yank comment map                                    *NERDComYankComment*
+
+Default mapping: [count],cy
+Mapped to: <plug>NERDCommenterYank
+Applicable modes: normal visual visual-line visual-block.
+
+Same as ,cc except that it yanks the line(s) that are commented first.
+
+------------------------------------------------------------------------------
+2.2.8 Comment to EOL map                                   *NERDComEOLComment*
+
+Default mapping: ,c$
+Mapped to: <plug>NERDCommenterToEOL
+Applicable modes: normal.
+
+Comments the current line from the current cursor position up to the end of
+the line.
+
+------------------------------------------------------------------------------
+2.2.9 Append com to line map                            *NERDComAppendComment*
+
+Default mapping: ,cA
+Mapped to: <plug>NERDCommenterAppend
+Applicable modes: normal.
+
+Appends comment delimiters to the end of the current line and goes
+to insert mode between the new delimiters.
+
+------------------------------------------------------------------------------
+2.2.10 Insert comment map                               *NERDComInsertComment*
+
+Default mapping: disabled by default.
+Map it to: <plug>NERDCommenterInInsert
+Applicable modes: insert.
+
+Adds comment delimiters at the current cursor position and inserts
+between them.
+
+NOTE: prior to version 2.1.17 this was mapped to ctrl-c. To restore this
+mapping add >
+    let NERDComInsertMap='<c-c>'
+<
+to your vimrc.
+
+------------------------------------------------------------------------------
+2.2.11 Use alternate delims map                              *NERDComAltDelim*
+
+Default mapping: ,ca
+Mapped to: <plug>NERDCommenterAltDelims
+Applicable modes: normal.
+
+Changes to the alternative commenting style if one is available. For example,
+if the user is editing a c++ file using // comments and they hit ,ca
+then they will be switched over to /**/ comments.
+
+See also |NERDComDefaultDelims|
+
+------------------------------------------------------------------------------
+2.2.12 Comment aligned maps                            *NERDComAlignedComment*
+
+Default mappings: [count],cl   [count],cb
+Mapped to: <plug>NERDCommenterAlignLeft
+           <plug>NERDCommenterAlignBoth
+Applicable modes: normal visual-line.
+
+Same as ,cc except that the comment delimiters are aligned on the left side or
+both sides respectively. These comments are always nested if the line(s) are
+already commented.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+------------------------------------------------------------------------------
+2.2.13 Uncomment line map                               *NERDComUncommentLine*
+
+Default mapping: [count],cu
+Mapped to: <plug>NERDCommenterUncomment
+Applicable modes: normal visual visual-line visual-block.
+
+Uncomments the current line. If multiple lines are selected in
+visual mode then they are all uncommented.
+
+When uncommenting, if the line contains multiple sets of delimiters then the
+``outtermost'' pair of delimiters will be removed.
+
+The script uses a set of heurisics to distinguish ``real'' delimiters from
+``fake'' ones when uncommenting. See |NERDComIssues| for details.
+
+If a [count] is given in normal mode, the mapping works as though that many
+lines were selected in visual-line mode.
+
+Related  options:
+|'NERDRemoveAltComs'|
+|'NERDRemoveExtraSpaces'|
+
+------------------------------------------------------------------------------
+2.3 Supported filetypes                                     *NERDComFiletypes*
+
+Filetypes that can be commented by this plugin:
+abaqus abc acedb ada ahdl amiga aml ampl ant apache apachestyle asm68k asm asn
+aspvbs atlas autohotkey autoit automake ave awk basic b bc bdf bib bindzone
+bst btm caos catalog c cfg cg ch changelog cl clean clipper cmake conf config
+context cpp crontab cs csc csp css cterm cupl csv cvs dcl debchangelog
+debcontrol debsources def diff django docbk dns dosbatch dosini dot dracula
+dsl dtd dtml dylan ecd eiffel elf elmfilt erlang eruby eterm expect exports
+fetchmail fgl focexec form fortran foxpro fstab fvwm fx gdb gdmo geek
+gentoo-package-keywords' gentoo-package-mask' gentoo-package-use' gnuplot
+gtkrc haskell hb h help hercules hog html htmldjango htmlos ia64 icon idlang
+idl indent inform inittab ishd iss ist jam java javascript jess jgraph
+jproperties jproperties jsp kconfig kix kscript lace lex lftp lifelines lilo
+lisp lite lotos lout lprolog lscript lss lua lynx m4 mail make maple masm
+master matlab mel mf mib mma model moduala.  modula2 modula3 monk mush muttrc
+named nasm nastran natural ncf netdict netrw nqc nroff nsis objc ocaml occam
+omlet omnimark openroad opl ora otl ox pascal passwd pcap pccts perl pfmain
+php phtml pic pike pilrc pine plaintex plm plsql po postscr pov povini ppd
+ppwiz procmail progress prolog psf ptcap python python qf radiance ratpoison r
+rc readline rebol registry remind rexx robots rpl rtf ruby sa samba sas sass
+sather scheme scilab screen scsh sdl sed selectbuf sgml sgmldecl sgmllnx sh
+sicad simula sinda skill slang sl slrnrc sm smarty smil smith sml snnsnet
+snnspat snnsres snobol4 spec specman spice sql sqlforms sqlj sqr squid st stp
+strace svn systemverilog tads taglist tags tak tasm tcl terminfo tex text
+plaintex texinfo texmf tf tidy tli trasys tsalt tsscl tssgm uc uil vb verilog
+verilog_systemverilog vgrindefs vhdl vim viminfo virata vo_base vrml vsejcl
+webmacro wget winbatch wml wvdial xdefaults xf86conf xhtml xkb xmath xml
+xmodmap xpm2 xpm xslt yacc yaml z8a
+
+If a language is not in the list of hardcoded supported filetypes then the
+&commentstring vim option is used.
+
+------------------------------------------------------------------------------
+2.4 Sexy Comments                                        *NERDComSexyComments*
+These are comments that use one set of multipart comment delimiters as well as
+one other marker symbol. For example: >
+    /*
+     * This is a c style sexy comment
+     * So there!
+     */
+
+    /* This is a c style sexy comment
+     * So there!
+     * But this one is ``compact'' style */
+<
+Here the multipart delimiters are /* and */ and the marker is *.
+
+------------------------------------------------------------------------------
+2.5 The NERDComment function                             *NERDComNERDComment*
+
+All of the NERD commenter mappings and menu items invoke a single function
+which delegates the commenting work to other functions. This function is
+public and has the prototype: >
+    function! NERDComment(isVisual, type)
+<
+The arguments to this function are simple:
+    - isVisual: if you wish to do any kind of visual comment then set this to
+      1 and the function will use the '< and '> marks to find the comment
+      boundries. If set to 0 then the function will operate on the current
+      line.
+    - type: is used to specify what type of commenting operation is to be
+      performed, and it can be one of the following: "sexy", "invert",
+      "minimal", "toggle", "alignLeft", "alignBoth", "norm", "nested",
+      "toEOL", "append", "insert", "uncomment", "yank"
+
+For example, if you typed >
+    :call NERDComment(1, 'sexy')
+<
+then the script would do a sexy comment on the last visual selection.
+
+
+==============================================================================
+3. Options                                                    *NERDComOptions*
+
+------------------------------------------------------------------------------
+3.1 Options summary                                    *NERDComOptionsSummary*
+
+|'loaded_nerd_comments'|              Turns off the script.
+|'NERDAllowAnyVisualDelims'|          Allows multipart alternative delims to
+                                      be used when commenting in
+                                      visual/visual-block mode.
+|'NERDBlockComIgnoreEmpty'|           Forces right delims to be placed when
+                                      doing visual-block comments.
+|'NERDCommentWholeLinesInVMode'|      Changes behaviour of visual comments.
+|'NERDCreateDefaultMappings'|         Turn the default mappings on/off.
+|'NERDDefaultNesting'|                Tells the script to use nested comments
+                                      by default.
+|'NERDMenuMode'|                      Specifies how the NERD commenter menu
+                                      will appear (if at all).
+|'NERDLPlace'|                        Specifies what to use as the left
+                                      delimiter placeholder when nesting
+                                      comments.
+|'NERDUsePlaceHolders'|               Specifies which filetypes may use
+                                      placeholders when nesting comments.
+|'NERDRemoveAltComs'|                 Tells the script whether to remove
+                                      alternative comment delimiters when
+                                      uncommenting.
+|'NERDRemoveExtraSpaces'|             Tells the script to always remove the
+                                      extra spaces when uncommenting
+                                      (regardless of whether NERDSpaceDelims
+                                      is set)
+|'NERDRPlace'|                        Specifies what to use as the right
+                                      delimiter placeholder when nesting
+                                      comments.
+|'NERDSpaceDelims'|                   Specifies whether to add extra spaces
+                                      around delimiters when commenting, and
+                                      whether to remove them when
+                                      uncommenting.
+|'NERDCompactSexyComs'|               Specifies whether to use the compact
+                                      style sexy comments.
+
+------------------------------------------------------------------------------
+3.3 Options details                                    *NERDComOptionsDetails*
+
+To enable any of the below options you should put the given line in your
+~/.vimrc
+
+                                                       *'loaded_nerd_comments'*
+If this script is driving you insane you can turn it off by setting this
+option >
+    let loaded_nerd_comments=1
+<
+------------------------------------------------------------------------------
+                                                    *'NERDAllowAnyVisualDelims'*
+Values: 0 or 1.
+Default: 1.
+
+If set to 1 then, when doing a visual or visual-block comment (but not a
+visual-line comment), the script will choose the right delimiters to use for
+the comment. This means either using the current delimiters if they are
+multipart or using the alternative delimiters if THEY are multipart.  For
+example if we are editing the following java code: >
+    float foo = 1221;
+    float bar = 324;
+    System.out.println(foo * bar);
+<
+If we are using // comments and select the "foo" and "bar" in visual-block
+mode, as shown left below (where '|'s are used to represent the visual-block
+boundary), and comment it then the script will use the alternative delims as
+shown on the right: >
+
+    float |foo| = 1221;                   float /*foo*/ = 1221;
+    float |bar| = 324;                    float /*bar*/ = 324;
+    System.out.println(foo * bar);        System.out.println(foo * bar);
+<
+------------------------------------------------------------------------------
+                                                     *'NERDBlockComIgnoreEmpty'*
+Values: 0 or 1.
+Default: 1.
+
+This option  affects visual-block mode commenting. If this option is turned
+on, lines that begin outside the right boundary of the selection block will be
+ignored.
+
+For example, if you are commenting this chunk of c code in visual-block mode
+(where the '|'s are used to represent the visual-block boundary) >
+    #include <sys/types.h>
+    #include <unistd.h>
+    #include <stdio.h>
+   |int| main(){
+   |   | printf("SUCK THIS\n");
+   |   | while(1){
+   |   |     fork();
+   |   | }
+   |}  |
+<
+If NERDBlockComIgnoreEmpty=0 then this code will become: >
+    #include <sys/types.h>
+    #include <unistd.h>
+    #include <stdio.h>
+    /*int*/ main(){
+    /*   */ printf("SUCK THIS\n");
+    /*   */ while(1){
+    /*   */     fork();
+    /*   */ }
+    /*}  */
+<
+Otherwise, the code block would become: >
+    #include <sys/types.h>
+    #include <unistd.h>
+    #include <stdio.h>
+    /*int*/ main(){
+    printf("SUCK THIS\n");
+    while(1){
+        fork();
+    }
+    /*}  */
+<
+------------------------------------------------------------------------------
+                                                *'NERDCommentWholeLinesInVMode'*
+Values: 0, 1 or 2.
+Default: 0.
+
+By default the script tries to comment out exactly what is selected in visual
+mode (v). For example if you select and comment the following c code (using |
+to represent the visual boundary): >
+    in|t foo = 3;
+    int bar =| 9;
+    int baz = foo + bar;
+<
+This will result in: >
+    in/*t foo = 3;*/
+    /*int bar =*/ 9;
+    int baz = foo + bar;
+<
+But some people prefer it if the whole lines are commented like: >
+    /*int foo = 3;*/
+    /*int bar = 9;*/
+    int baz = foo + bar;
+<
+If you prefer the second option then stick this line in your vimrc: >
+    let NERDCommentWholeLinesInVMode=1
+<
+
+If the filetype you are editing only has no multipart delimiters (for example
+a shell script) and you hadnt set this option then the above would become >
+    in#t foo = 3;
+    #int bar = 9;
+<
+(where # is the comment delimiter) as this is the closest the script can
+come to commenting out exactly what was selected. If you prefer for whole
+lines to be commented out when there is no multipart delimiters but the EXACT
+text that was selected to be commented out if there IS multipart delimiters
+then stick the following line in your vimrc: >
+    let NERDCommentWholeLinesInVMode=2
+<
+
+Note that this option does not affect the behaviour of commenting in
+|visual-block| mode.
+
+------------------------------------------------------------------------------
+                                                *'NERDCreateDefaultMappings'*
+Values: 0 or 1.
+Default: 1.
+
+If set to 0, none of the default mappings will be created.
+
+See also |NERDComMappings|.
+
+------------------------------------------------------------------------------
+                                                           *'NERDRemoveAltComs'*
+Values: 0 or 1.
+Default: 1.
+
+When uncommenting a line (for a filetype with an alternative commenting style)
+this option tells the script whether to look for, and remove, comment
+delimiters of the alternative style.
+
+For example, if you are editing a c++ file using // style comments and you go
+,cu on this line: >
+    /* This is a c++ comment baby! */
+<
+It will not be uncommented if the NERDRemoveAltComs is set to 0.
+
+------------------------------------------------------------------------------
+                                                       *'NERDRemoveExtraSpaces'*
+Values: 0 or 1.
+Default: 1.
+
+By default, the NERD commenter will remove spaces around comment delimiters if
+either:
+1. |'NERDSpaceDelims'| is set to 1.
+2. NERDRemoveExtraSpaces is set to 1.
+
+This means that if we have the following lines in a c code file: >
+    /* int foo = 5; */
+    /* int bar = 10; */
+    int baz = foo + bar
+<
+If either of the above conditions hold then if these lines are uncommented
+they will become: >
+    int foo = 5;
+    int bar = 10;
+    int baz = foo + bar
+<
+Otherwise they would become: >
+     int foo = 5;
+     int bar = 10;
+    int baz = foo + bar
+<
+If you want the spaces to be removed only if |'NERDSpaceDelims'| is set then
+set NERDRemoveExtraSpaces to 0.
+
+------------------------------------------------------------------------------
+                                                                  *'NERDLPlace'*
+                                                                  *'NERDRPlace'*
+Values: arbitrary string.
+Default:
+    NERDLPlace: "[>"
+    NERDRPlace: "<]"
+
+These options are used to control the strings used as place-holder delimiters.
+Place holder delimiters are used when performing nested commenting when the
+filetype supports commenting styles with both left and right delimiters.
+To set these options use lines like: >
+    let NERDLPlace="FOO"
+    let NERDRPlace="BAR"
+<
+Following the above example, if we have line of c code: >
+    /* int horse */
+<
+and we comment it with ,cn it will be changed to: >
+    /*FOO int horse BAR*/
+<
+When we uncomment this line it will go back to what it was.
+
+------------------------------------------------------------------------------
+                                                                *'NERDMenuMode'*
+Values: 0, 1, 2, 3.
+Default: 3
+
+This option can take 4 values:
+    "0": Turns the menu off.
+    "1": Turns the 'comment' menu on with no menu shortcut.
+    "2": Turns the 'comment 'menu on with <alt>-c as the shortcut.
+    "3": Turns the 'Plugin -> comment' menu on with <alt>-c as the shortcut.
+
+------------------------------------------------------------------------------
+                                                         *'NERDUsePlaceHolders'*
+Values: 0 or 1.
+Default 1.
+
+This option is used to specify whether place-holder delimiters should be used
+when creating a nested comment.
+
+------------------------------------------------------------------------------
+                                                             *'NERDSpaceDelims'*
+Values: 0 or 1.
+Default 0.
+
+Some people prefer a space after the left delimiter and before the right
+delimiter like this: >
+    /* int foo=2; */
+<
+as opposed to this: >
+    /*int foo=2;*/
+<
+If you want spaces to be added then set NERDSpaceDelims to 1 in your vimrc.
+
+See also |'NERDRemoveExtraSpaces'|.
+
+------------------------------------------------------------------------------
+                                                         *'NERDCompactSexyComs'*
+Values: 0 or 1.
+Default 0.
+
+Some people may want their sexy comments to be like this: >
+    /* Hi There!
+     * This is a sexy comment
+     * in c */
+<
+As opposed to like this: >
+    /*
+     * Hi There!
+     * This is a sexy comment
+     * in c
+     */
+<
+If this option is set to 1 then the top style will be used.
+
+------------------------------------------------------------------------------
+                                                          *'NERDDefaultNesting'*
+Values: 0 or 1.
+Default 1.
+
+When this option is set to 1, comments are nested automatically. That is, if
+you hit ,cc on a line that is already commented it will be commented again