diff --git a/.gitignore b/.gitignore index 0d443fe..9cfa397 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ fish_variables NVIMS/ plugged/ dotfiles/.config/tmux/serious -library/ tags node_modules dotfiles/.config/tmux/resurrect/ diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/c.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/c.vim new file mode 100644 index 0000000..6e99ae0 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/c.vim @@ -0,0 +1,284 @@ +" Vim syntax file +" Language: C Additions +" Maintainer: Mikhail Wolfson +" URL: http://web.mit.edu/wolfsonm +" Last Change: 2010 Dec. 3 +" Version: 0.4 +" +" Changelog: +" 0.4 - updates and fixes to cDelimiter to fix break with foldmethod=syntax, +" entirely suggested and solved by Ivan Freitas +" +" 0.3 - updates and fixes to cUserFunctionPointer, thanks to +" Alexei +" 0.2 - change [] to operator +" 0.1 - initial upload, modification from vimscript#1201, Extended c.vim + + +" Common ANSI-standard functions +syn keyword cAnsiFunction MULU_ DIVU_ MODU_ MUL_ DIV_ MOD_ +syn keyword cAnsiFunction main typeof +syn keyword cAnsiFunction open close read write lseek dup dup2 +syn keyword cAnsiFunction fcntl ioctl +syn keyword cAnsiFunction wctrans towctrans towupper +syn keyword cAnsiFunction towlower wctype iswctype +syn keyword cAnsiFunction iswxdigit iswupper iswspace +syn keyword cAnsiFunction iswpunct iswprint iswlower +syn keyword cAnsiFunction iswgraph iswdigit iswcntrl +syn keyword cAnsiFunction iswalpha iswalnum wcsrtombs +syn keyword cAnsiFunction mbsrtowcs wcrtomb mbrtowc +syn keyword cAnsiFunction mbrlen mbsinit wctob +syn keyword cAnsiFunction btowc wcsfxtime wcsftime +syn keyword cAnsiFunction wmemset wmemmove wmemcpy +syn keyword cAnsiFunction wmemcmp wmemchr wcstok +syn keyword cAnsiFunction wcsstr wcsspn wcsrchr +syn keyword cAnsiFunction wcspbrk wcslen wcscspn +syn keyword cAnsiFunction wcschr wcsxfrm wcsncmp +syn keyword cAnsiFunction wcscoll wcscmp wcsncat +syn keyword cAnsiFunction wcscat wcsncpy wcscpy +syn keyword cAnsiFunction wcstoull wcstoul wcstoll +syn keyword cAnsiFunction wcstol wcstold wcstof +syn keyword cAnsiFunction wcstod ungetwc putwchar +syn keyword cAnsiFunction putwc getwchar getwc +syn keyword cAnsiFunction fwide fputws fputwc +syn keyword cAnsiFunction fgetws fgetwc wscanf +syn keyword cAnsiFunction wprintf vwscanf vwprintf +syn keyword cAnsiFunction vswscanf vswprintf vfwscanf +syn keyword cAnsiFunction vfwprintf swscanf swprintf +syn keyword cAnsiFunction fwscanf fwprintf zonetime +syn keyword cAnsiFunction strfxtime strftime localtime +syn keyword cAnsiFunction gmtime ctime asctime +syn keyword cAnsiFunction time mkxtime mktime +syn keyword cAnsiFunction difftime clock strlen +syn keyword cAnsiFunction strerror memset strtok +syn keyword cAnsiFunction strstr strspn strrchr +syn keyword cAnsiFunction strpbrk strcspn strchr +syn keyword cAnsiFunction memchr strxfrm strncmp +syn keyword cAnsiFunction strcoll strcmp memcmp +syn keyword cAnsiFunction strncat strcat strncpy +syn keyword cAnsiFunction strcpy memmove memcpy +syn keyword cAnsiFunction wcstombs mbstowcs wctomb +syn keyword cAnsiFunction mbtowc mblen lldiv +syn keyword cAnsiFunction ldiv div llabs +syn keyword cAnsiFunction labs abs qsort +syn keyword cAnsiFunction bsearch system getenv +syn keyword cAnsiFunction exit atexit abort +syn keyword cAnsiFunction realloc malloc free +syn keyword cAnsiFunction calloc srand rand +syn keyword cAnsiFunction strtoull strtoul strtoll +syn keyword cAnsiFunction strtol strtold strtof +syn keyword cAnsiFunction strtod atoll atol +syn keyword cAnsiFunction atoi atof perror +syn keyword cAnsiFunction ferror feof clearerr +syn keyword cAnsiFunction rewind ftell fsetpos +syn keyword cAnsiFunction fseek fgetpos fwrite +syn keyword cAnsiFunction fread ungetc puts +syn keyword cAnsiFunction putchar putc gets +syn keyword cAnsiFunction getchar getc fputs +syn keyword cAnsiFunction fputc fgets fgetc +syn keyword cAnsiFunction vsscanf vsprintf vsnprintf +syn keyword cAnsiFunction vscanf vprintf vfscanf +syn keyword cAnsiFunction vfprintf sscanf sprintf +syn keyword cAnsiFunction snprintf scanf printf +syn keyword cAnsiFunction fscanf fprintf setvbuf +syn keyword cAnsiFunction setbuf freopen fopen +syn keyword cAnsiFunction fflush fclose tmpnam +syn keyword cAnsiFunction tmpfile rename remove +syn keyword cAnsiFunction offsetof va_start va_end +syn keyword cAnsiFunction va_copy va_arg raise signal +syn keyword cAnsiFunction longjmp setjmp isunordered +syn keyword cAnsiFunction islessgreater islessequal isless +syn keyword cAnsiFunction isgreaterequal isgreater fmal +syn keyword cAnsiFunction fmaf fma fminl +syn keyword cAnsiFunction fminf fmin fmaxl +syn keyword cAnsiFunction fmaxf fmax fdiml +syn keyword cAnsiFunction fdimf fdim nextafterxl +syn keyword cAnsiFunction nextafterxf nextafterx nextafterl +syn keyword cAnsiFunction nextafterf nextafter nanl +syn keyword cAnsiFunction nanf nan copysignl +syn keyword cAnsiFunction copysignf copysign remquol +syn keyword cAnsiFunction remquof remquo remainderl +syn keyword cAnsiFunction remainderf remainder fmodl +syn keyword cAnsiFunction fmodf fmod truncl +syn keyword cAnsiFunction truncf trunc llroundl +syn keyword cAnsiFunction llroundf llround lroundl +syn keyword cAnsiFunction lroundf lround roundl +syn keyword cAnsiFunction roundf round llrintl +syn keyword cAnsiFunction llrintf llrint lrintl +syn keyword cAnsiFunction lrintf lrint rintl +syn keyword cAnsiFunction rintf rint nearbyintl +syn keyword cAnsiFunction nearbyintf nearbyint floorl +syn keyword cAnsiFunction floorf floor ceill +syn keyword cAnsiFunction ceilf ceil tgammal +syn keyword cAnsiFunction tgammaf tgamma lgammal +syn keyword cAnsiFunction lgammaf lgamma erfcl +syn keyword cAnsiFunction erfcf erfc erfl +syn keyword cAnsiFunction erff erf sqrtl +syn keyword cAnsiFunction sqrtf sqrt powl +syn keyword cAnsiFunction powf pow hypotl +syn keyword cAnsiFunction hypotf hypot fabsl +syn keyword cAnsiFunction fabsf fabs cbrtl +syn keyword cAnsiFunction cbrtf cbrt scalblnl +syn keyword cAnsiFunction scalblnf scalbln scalbnl +syn keyword cAnsiFunction scalbnf scalbn modfl +syn keyword cAnsiFunction modff modf logbl +syn keyword cAnsiFunction logbf logb log2l +syn keyword cAnsiFunction log2f log2 log1pl +syn keyword cAnsiFunction log1pf log1p log10l +syn keyword cAnsiFunction log10f log10 logl +syn keyword cAnsiFunction logf log ldexpl +syn keyword cAnsiFunction ldexpf ldexp ilogbl +syn keyword cAnsiFunction ilogbf ilogb frexpl +syn keyword cAnsiFunction frexpf frexp expm1l +syn keyword cAnsiFunction expm1f expm1 exp2l +syn keyword cAnsiFunction exp2f exp2 expl +syn keyword cAnsiFunction expf exp tanhl +syn keyword cAnsiFunction tanhf tanh sinhl +syn keyword cAnsiFunction sinhf sinh coshl +syn keyword cAnsiFunction coshf cosh atanhl +syn keyword cAnsiFunction atanhf atanh asinhl +syn keyword cAnsiFunction asinhf asinh acoshl +syn keyword cAnsiFunction acoshf acosh tanl +syn keyword cAnsiFunction tanf tan sinl +syn keyword cAnsiFunction sinf sin cosl +syn keyword cAnsiFunction cosf cos atan2l +syn keyword cAnsiFunction atan2f atan2 atanl +syn keyword cAnsiFunction atanf atan asinl +syn keyword cAnsiFunction asinf asin acosl +syn keyword cAnsiFunction acosf acos signbit +syn keyword cAnsiFunction isnormal isnan isinf +syn keyword cAnsiFunction isfinite fpclassify localeconv +syn keyword cAnsiFunction setlocale wcstoumax wcstoimax +syn keyword cAnsiFunction strtoumax strtoimax feupdateenv +syn keyword cAnsiFunction fesetenv feholdexcept fegetenv +syn keyword cAnsiFunction fesetround fegetround fetestexcept +syn keyword cAnsiFunction fesetexceptflag feraiseexcept fegetexceptflag +syn keyword cAnsiFunction feclearexcept toupper tolower +syn keyword cAnsiFunction isxdigit isupper isspace +syn keyword cAnsiFunction ispunct isprint islower +syn keyword cAnsiFunction isgraph isdigit iscntrl +syn keyword cAnsiFunction isalpha isalnum creall +syn keyword cAnsiFunction crealf creal cprojl +syn keyword cAnsiFunction cprojf cproj conjl +syn keyword cAnsiFunction conjf conj cimagl +syn keyword cAnsiFunction cimagf cimag cargl +syn keyword cAnsiFunction cargf carg csqrtl +syn keyword cAnsiFunction csqrtf csqrt cpowl +syn keyword cAnsiFunction cpowf cpow cabsl +syn keyword cAnsiFunction cabsf cabs clogl +syn keyword cAnsiFunction clogf clog cexpl +syn keyword cAnsiFunction cexpf cexp ctanhl +syn keyword cAnsiFunction ctanhf ctanh csinhl +syn keyword cAnsiFunction csinhf csinh ccoshl +syn keyword cAnsiFunction ccoshf ccosh catanhl +syn keyword cAnsiFunction catanhf catanh casinhl +syn keyword cAnsiFunction casinhf casinh cacoshl +syn keyword cAnsiFunction cacoshf cacosh ctanl +syn keyword cAnsiFunction ctanf ctan csinl +syn keyword cAnsiFunction csinf csin ccosl +syn keyword cAnsiFunction ccosf ccos catanl +syn keyword cAnsiFunction catanf catan casinl +syn keyword cAnsiFunction casinf casin cacosl +syn keyword cAnsiFunction cacosf cacos assert +syn keyword cAnsiFunction UINTMAX_C INTMAX_C UINT64_C +syn keyword cAnsiFunction UINT32_C UINT16_C UINT8_C +syn keyword cAnsiFunction INT64_C INT32_C INT16_C INT8_C + +" Common ANSI-standard Names +syn keyword cAnsiName PRId8 PRIi16 PRIo32 PRIu64 +syn keyword cAnsiName PRId16 PRIi32 PRIo64 PRIuLEAST8 +syn keyword cAnsiName PRId32 PRIi64 PRIoLEAST8 PRIuLEAST16 +syn keyword cAnsiName PRId64 PRIiLEAST8 PRIoLEAST16 PRIuLEAST32 +syn keyword cAnsiName PRIdLEAST8 PRIiLEAST16 PRIoLEAST32 PRIuLEAST64 +syn keyword cAnsiName PRIdLEAST16 PRIiLEAST32 PRIoLEAST64 PRIuFAST8 +syn keyword cAnsiName PRIdLEAST32 PRIiLEAST64 PRIoFAST8 PRIuFAST16 +syn keyword cAnsiName PRIdLEAST64 PRIiFAST8 PRIoFAST16 PRIuFAST32 +syn keyword cAnsiName PRIdFAST8 PRIiFAST16 PRIoFAST32 PRIuFAST64 +syn keyword cAnsiName PRIdFAST16 PRIiFAST32 PRIoFAST64 PRIuMAX +syn keyword cAnsiName PRIdFAST32 PRIiFAST64 PRIoMAX PRIuPTR +syn keyword cAnsiName PRIdFAST64 PRIiMAX PRIoPTR PRIx8 +syn keyword cAnsiName PRIdMAX PRIiPTR PRIu8 PRIx16 +syn keyword cAnsiName PRIdPTR PRIo8 PRIu16 PRIx32 +syn keyword cAnsiName PRIi8 PRIo16 PRIu32 PRIx64 + +syn keyword cAnsiName PRIxLEAST8 SCNd8 SCNiFAST32 SCNuLEAST32 +syn keyword cAnsiName PRIxLEAST16 SCNd16 SCNiFAST64 SCNuLEAST64 +syn keyword cAnsiName PRIxLEAST32 SCNd32 SCNiMAX SCNuFAST8 +syn keyword cAnsiName PRIxLEAST64 SCNd64 SCNiPTR SCNuFAST16 +syn keyword cAnsiName PRIxFAST8 SCNdLEAST8 SCNo8 SCNuFAST32 +syn keyword cAnsiName PRIxFAST16 SCNdLEAST16 SCNo16 SCNuFAST64 +syn keyword cAnsiName PRIxFAST32 SCNdLEAST32 SCNo32 SCNuMAX +syn keyword cAnsiName PRIxFAST64 SCNdLEAST64 SCNo64 SCNuPTR +syn keyword cAnsiName PRIxMAX SCNdFAST8 SCNoLEAST8 SCNx8 +syn keyword cAnsiName PRIxPTR SCNdFAST16 SCNoLEAST16 SCNx16 +syn keyword cAnsiName PRIX8 SCNdFAST32 SCNoLEAST32 SCNx32 +syn keyword cAnsiName PRIX16 SCNdFAST64 SCNoLEAST64 SCNx64 +syn keyword cAnsiName PRIX32 SCNdMAX SCNoFAST8 SCNxLEAST8 +syn keyword cAnsiName PRIX64 SCNdPTR SCNoFAST16 SCNxLEAST16 +syn keyword cAnsiName PRIXLEAST8 SCNi8 SCNoFAST32 SCNxLEAST32 +syn keyword cAnsiName PRIXLEAST16 SCNi16 SCNoFAST64 SCNxLEAST64 +syn keyword cAnsiName PRIXLEAST32 SCNi32 SCNoMAX SCNxFAST8 +syn keyword cAnsiName PRIXLEAST64 SCNi64 SCNoPTR SCNxFAST16 +syn keyword cAnsiName PRIXFAST8 SCNiLEAST8 SCNu8 SCNxFAST32 +syn keyword cAnsiName PRIXFAST16 SCNiLEAST16 SCNu16 SCNxFAST64 +syn keyword cAnsiName PRIXFAST32 SCNiLEAST32 SCNu32 SCNxMAX +syn keyword cAnsiName PRIXFAST64 SCNiLEAST64 SCNu64 SCNxPTR +syn keyword cAnsiName PRIXMAX SCNiFAST8 SCNuLEAST8 +syn keyword cAnsiName PRIXPTR SCNiFAST16 SCNuLEAST16 + +syn keyword cAnsiName errno environ + +syn keyword cAnsiName STDC CX_LIMITED_RANGE +syn keyword cAnsiName STDC FENV_ACCESS +syn keyword cAnsiName STDC FP_CONTRACT + +syn keyword cAnsiName AF_INET SOCK_STREAM INADDR_ANY AF_INET +syn keyword cAnsiName SOL_SOCKET SO_REUSEPORT SO_REUSEADDR +syn keyword cAnsiName SO_RCVTIMEO IPPROTO_TCP TCP_NODELAY +syn keyword cAnsiName SOCK_DGRAM POLLIN + +syn keyword cAnsiName and bitor not_eq xor +syn keyword cAnsiName and_eq compl or xor_eq +syn keyword cAnsiName bitand not or_eq + +hi def link cAnsiFunction cFunction +hi def link cAnsiName cIdentifier + +" Operators +syn match cOperator "\(<<\|>>\|[-+*/%&^|<>!=]\)=" +syn match cOperator "<<\|>>\|&&\|||\|++\|--\|->" +syn match cOperator "[.!~*&%<>^|=,+-]" +syn match cOperator "/[^/*=]"me=e-1 +syn match cOperator "/$" +syn match cOperator "&&\|||" +syn match cOperator "[][]" + +" Preprocs +syn keyword cDefined defined contained containedin=cDefine +hi def link cDefined cDefine + +" Functions +syn match cUserFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1 contains=cType,cDelimiter,cDefine +syn match cUserFunctionPointer "(\s*\*\s*\h\w*\s*)\(\s\|\n\)*(" contains=cDelimiter,cOperator + +hi def link cUserFunction cFunction +hi def link cUserFunctionPointer cFunction + +" Delimiters +syn match cDelimiter "[();\\]" +" foldmethod=syntax fix, courtesy of Ivan Freitas +syn match cBraces display "[{}]" + + +" Booleans +syn keyword cBoolean true false TRUE FALSE + + +" Links +hi def link cFunction Function +hi def link cIdentifier Identifier +hi def link cDelimiter Delimiter +" foldmethod=syntax fix, courtesy of Ivan Freitas +hi def link cBraces Delimiter +hi def link cBoolean Boolean + diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/cpp.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/cpp.vim new file mode 100644 index 0000000..07d6ed4 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/cpp.vim @@ -0,0 +1,2092 @@ +" Vim syntax file +" Language: C++ Additions +" Maintainer: Jon Haggblad +" URL: http://www.haeggblad.com +" Last Change: 1 Feb 2018 +" Version: 0.6 +" Changelog: +" 0.1 - initial version. +" 0.2 - C++14 +" 0.3 - Incorporate lastest changes from Mizuchi/STL-Syntax +" 0.4 - Add template function highlight +" 0.5 - Redo template function highlight to be more robust. Add options. +" 0.6 - more C++14, C++17, library concepts +" +" Additional Vim syntax highlighting for C++ (including C++11/14/17) +" +" This file contains additional syntax highlighting that I use for C++11/14 +" development in Vim. Compared to the standard syntax highlighting for C++ it +" adds highlighting of (user defined) functions and the containers and types +" in the standard library / boost. +" +" Based on: +" http://stackoverflow.com/q/736701 +" http://www.vim.org/scripts/script.php?script_id=4293 +" http://www.vim.org/scripts/script.php?script_id=2224 +" http://www.vim.org/scripts/script.php?script_id=1640 +" http://www.vim.org/scripts/script.php?script_id=3064 + + +" ----------------------------------------------------------------------------- +" Highlight Class and Function names. +" +" Based on the discussion in: http://stackoverflow.com/q/736701 +" ----------------------------------------------------------------------------- + +" Functions +if !exists('g:cpp_no_function_highlight') + syn match cCustomParen transparent "(" contains=cParen contains=cCppParen + syn match cCustomFunc "\w\+\s*(\@=" + hi def link cCustomFunc Function +endif + +" Class and namespace scope +if exists('g:cpp_class_scope_highlight') && g:cpp_class_scope_highlight + syn match cCustomScope "::" + syn match cCustomClass "\w\+\s*::" + \ contains=cCustomScope + hi def link cCustomClass Function +endif + +" Clear cppStructure and replace "class" and/or "template" with matches +" based on user configuration +let s:needs_cppstructure_match = 0 +if exists('g:cpp_class_decl_highlight') && g:cpp_class_decl_highlight + let s:needs_cppstructure_match += 1 +endif +if exists('g:cpp_experimental_template_highlight') && g:cpp_experimental_template_highlight + let s:needs_cppstructure_match += 2 +endif + +syn clear cppStructure +if s:needs_cppstructure_match == 0 + syn keyword cppStructure typename namespace template class +elseif s:needs_cppstructure_match == 1 + syn keyword cppStructure typename namespace template +elseif s:needs_cppstructure_match == 2 + syn keyword cppStructure typename namespace class +elseif s:needs_cppstructure_match == 3 + syn keyword cppStructure typename namespace +endif +unlet s:needs_cppstructure_match + + +" Class name declaration +if exists('g:cpp_class_decl_highlight') && g:cpp_class_decl_highlight + syn match cCustomClassKey "\" + hi def link cCustomClassKey cppStructure + + " Clear cppAccess entirely and redefine as matches + syn clear cppAccess + syn match cCustomAccessKey "\" + syn match cCustomAccessKey "\" + syn match cCustomAccessKey "\" + hi def link cCustomAccessKey cppAccess + + " Match the parts of a class declaration + syn match cCustomClassName "\" + \ contains=cCustomClassKey + syn match cCustomClassName "\" + \ contains=cCustomAccessKey + syn match cCustomClassName "\" + \ contains=cCustomAccessKey + syn match cCustomClassName "\" + \ contains=cCustomAccessKey + hi def link cCustomClassName Function +endif +" Template functions. +" Naive implementation that sorta works in most cases. Should correctly +" highlight everything in test/color2.cpp +if exists('g:cpp_experimental_simple_template_highlight') && g:cpp_experimental_simple_template_highlight + syn region cCustomAngleBrackets matchgroup=AngleBracketContents start="\v%(" contains=cCustomAngleBrackets + syn match cCustomTemplateFunc "\w\+\s*<.*>(\@=" contains=cCustomBrack,cCustomAngleBrackets + hi def link cCustomTemplateFunc Function + +" Template functions (alternative faster parsing). +" More sophisticated implementation that should be faster but doesn't always +" correctly highlight inside template arguments. Should correctly +" highlight everything in test/color.cpp +elseif exists('g:cpp_experimental_template_highlight') && g:cpp_experimental_template_highlight + + syn match cCustomAngleBracketStart "<\_[^;()]\{-}>" contained + \ contains=cCustomAngleBracketStart,cCustomAngleBracketEnd + hi def link cCustomAngleBracketStart cCustomAngleBracketContent + + syn match cCustomAngleBracketEnd ">\_[^<>;()]\{-}>" contained + \ contains=cCustomAngleBracketEnd + hi def link cCustomAngleBracketEnd cCustomAngleBracketContent + + syn match cCustomTemplateFunc "\<\l\w*\s*<\_[^;()]\{-}>(\@="hs=s,he=e-1 + \ contains=cCustomAngleBracketStart + hi def link cCustomTemplateFunc cCustomFunc + + syn match cCustomTemplateClass "\<\w\+\s*<\_[^;()]\{-}>" + \ contains=cCustomAngleBracketStart,cCustomTemplateFunc + hi def link cCustomTemplateClass cCustomClass + + syn match cCustomTemplate "\" + hi def link cCustomTemplate cppStructure + syn match cTemplateDeclare "\" + \ contains=cppStructure,cCustomTemplate,cCustomClassKey,cCustomAngleBracketStart + + " Remove 'operator' from cppOperator and use a custom match + syn clear cppOperator + syn keyword cppOperator typeid + syn keyword cppOperator and bitor or xor compl bitand and_eq or_eq xor_eq not not_eq + + syn match cCustomOperator "\" + hi def link cCustomOperator cppStructure + syn match cTemplateOperatorDeclare "\[<>]=\?" + \ contains=cppOperator,cCustomOperator,cCustomAngleBracketStart +endif + +" Alternative syntax that is used in: +" http://www.vim.org/scripts/script.php?script_id=3064 +"syn match cUserFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1 contains=cType,cDelimiter,cDefine +"hi def link cCustomFunc Function + +" Cluster for all the stdlib functions defined below +syn cluster cppSTLgroup contains=cppSTLfunction,cppSTLfunctional,cppSTLconstant,cppSTLnamespace,cppSTLtype,cppSTLexception,cppSTLiterator,cppSTLiterator_tag,cppSTLenum,cppSTLios,cppSTLcast + + +" ----------------------------------------------------------------------------- +" Standard library types and functions. +" +" Mainly based on the excellent STL Syntax vim script by +" Mizuchi +" http://www.vim.org/scripts/script.php?script_id=4293 +" which in turn is based on the scripts +" http://www.vim.org/scripts/script.php?script_id=2224 +" http://www.vim.org/scripts/script.php?script_id=1640 +" ----------------------------------------------------------------------------- + +syntax keyword cppSTLconstant badbit +syntax keyword cppSTLconstant cerr +syntax keyword cppSTLconstant cin +syntax keyword cppSTLconstant clog +syntax keyword cppSTLconstant cout +syntax keyword cppSTLconstant digits +syntax keyword cppSTLconstant digits10 +syntax keyword cppSTLconstant eofbit +syntax keyword cppSTLconstant failbit +syntax keyword cppSTLconstant goodbit +syntax keyword cppSTLconstant has_denorm +syntax keyword cppSTLconstant has_denorm_loss +syntax keyword cppSTLconstant has_infinity +syntax keyword cppSTLconstant has_quiet_NaN +syntax keyword cppSTLconstant has_signaling_NaN +syntax keyword cppSTLconstant is_bounded +syntax keyword cppSTLconstant is_exact +syntax keyword cppSTLconstant is_iec559 +syntax keyword cppSTLconstant is_integer +syntax keyword cppSTLconstant is_modulo +syntax keyword cppSTLconstant is_signed +syntax keyword cppSTLconstant is_specialized +syntax keyword cppSTLconstant max_digits10 +syntax keyword cppSTLconstant max_exponent +syntax keyword cppSTLconstant max_exponent10 +syntax keyword cppSTLconstant min_exponent +syntax keyword cppSTLconstant min_exponent10 +syntax keyword cppSTLconstant nothrow +syntax keyword cppSTLconstant npos +syntax keyword cppSTLconstant radix +syntax keyword cppSTLconstant round_style +syntax keyword cppSTLconstant tinyness_before +syntax keyword cppSTLconstant traps +syntax keyword cppSTLconstant wcerr +syntax keyword cppSTLconstant wcin +syntax keyword cppSTLconstant wclog +syntax keyword cppSTLconstant wcout +syntax keyword cppSTLexception bad_alloc +syntax keyword cppSTLexception bad_array_new_length +syntax keyword cppSTLexception bad_exception +syntax keyword cppSTLexception bad_typeid bad_cast +syntax keyword cppSTLexception domain_error +syntax keyword cppSTLexception exception +syntax keyword cppSTLexception invalid_argument +syntax keyword cppSTLexception length_error +syntax keyword cppSTLexception logic_error +syntax keyword cppSTLexception out_of_range +syntax keyword cppSTLexception overflow_error +syntax keyword cppSTLexception range_error +syntax keyword cppSTLexception runtime_error +syntax keyword cppSTLexception underflow_error +syntax keyword cppSTLfunction abort +syntax keyword cppSTLfunction abs +syntax keyword cppSTLfunction accumulate +syntax keyword cppSTLfunction acos +syntax keyword cppSTLfunction adjacent_difference +syntax keyword cppSTLfunction adjacent_find +syntax keyword cppSTLfunction adjacent_find_if +syntax keyword cppSTLfunction advance +syntax keyword cppSTLfunctional binary_function +syntax keyword cppSTLfunctional binary_negate +syntax keyword cppSTLfunctional bit_and +syntax keyword cppSTLfunctional bit_not +syntax keyword cppSTLfunctional bit_or +syntax keyword cppSTLfunctional bit_xor +syntax keyword cppSTLfunctional divides +syntax keyword cppSTLfunctional equal_to +syntax keyword cppSTLfunctional greater +syntax keyword cppSTLfunctional greater_equal +syntax keyword cppSTLfunctional less +syntax keyword cppSTLfunctional less_equal +syntax keyword cppSTLfunctional logical_and +syntax keyword cppSTLfunctional logical_not +syntax keyword cppSTLfunctional logical_or +syntax keyword cppSTLfunctional minus +syntax keyword cppSTLfunctional modulus +syntax keyword cppSTLfunctional multiplies +syntax keyword cppSTLfunctional negate +syntax keyword cppSTLfunctional not_equal_to +syntax keyword cppSTLfunctional plus +syntax keyword cppSTLfunctional unary_function +syntax keyword cppSTLfunctional unary_negate +"syntax keyword cppSTLfunction any +syntax keyword cppSTLfunction append +syntax keyword cppSTLfunction arg +syntax keyword cppSTLfunction asctime +syntax keyword cppSTLfunction asin +syntax keyword cppSTLfunction assert +syntax keyword cppSTLfunction assign +syntax keyword cppSTLfunction at +syntax keyword cppSTLfunction atan +syntax keyword cppSTLfunction atan2 +syntax keyword cppSTLfunction atexit +syntax keyword cppSTLfunction atof +syntax keyword cppSTLfunction atoi +syntax keyword cppSTLfunction atol +syntax keyword cppSTLfunction atoll +syntax keyword cppSTLfunction back +syntax keyword cppSTLfunction back_inserter +syntax keyword cppSTLfunction bad +syntax keyword cppSTLfunction beg +"syntax keyword cppSTLfunction begin +syntax keyword cppSTLfunction binary_compose +syntax keyword cppSTLfunction binary_negate +syntax keyword cppSTLfunction binary_search +syntax keyword cppSTLfunction bind1st +syntax keyword cppSTLfunction bind2nd +syntax keyword cppSTLfunction binder1st +syntax keyword cppSTLfunction binder2nd +syntax keyword cppSTLfunction bsearch +syntax keyword cppSTLfunction calloc +syntax keyword cppSTLfunction capacity +syntax keyword cppSTLfunction ceil +syntax keyword cppSTLfunction clear +syntax keyword cppSTLfunction clearerr +syntax keyword cppSTLfunction clock +syntax keyword cppSTLfunction close +syntax keyword cppSTLfunction compare +syntax keyword cppSTLfunction conj +syntax keyword cppSTLfunction construct +syntax keyword cppSTLfunction copy +syntax keyword cppSTLfunction copy_backward +syntax keyword cppSTLfunction cos +syntax keyword cppSTLfunction cosh +syntax keyword cppSTLfunction count +syntax keyword cppSTLfunction count_if +syntax keyword cppSTLfunction c_str +syntax keyword cppSTLfunction ctime +"syntax keyword cppSTLfunction data +syntax keyword cppSTLfunction denorm_min +syntax keyword cppSTLfunction destroy +syntax keyword cppSTLfunction difftime +syntax keyword cppSTLfunction distance +syntax keyword cppSTLfunction div +syntax keyword cppSTLfunction empty +"syntax keyword cppSTLfunction end +syntax keyword cppSTLfunction eof +syntax keyword cppSTLfunction epsilon +syntax keyword cppSTLfunction equal +syntax keyword cppSTLfunction equal_range +syntax keyword cppSTLfunction erase +syntax keyword cppSTLfunction exit +syntax keyword cppSTLfunction exp +syntax keyword cppSTLfunction fabs +syntax keyword cppSTLfunction fail +syntax keyword cppSTLfunction failure +syntax keyword cppSTLfunction fclose +syntax keyword cppSTLfunction feof +syntax keyword cppSTLfunction ferror +syntax keyword cppSTLfunction fflush +syntax keyword cppSTLfunction fgetc +syntax keyword cppSTLfunction fgetpos +syntax keyword cppSTLfunction fgets +syntax keyword cppSTLfunction fill +syntax keyword cppSTLfunction fill_n +syntax keyword cppSTLfunction find +syntax keyword cppSTLfunction find_end +syntax keyword cppSTLfunction find_first_not_of +syntax keyword cppSTLfunction find_first_of +syntax keyword cppSTLfunction find_if +syntax keyword cppSTLfunction find_last_not_of +syntax keyword cppSTLfunction find_last_of +syntax keyword cppSTLfunction first +syntax keyword cppSTLfunction flags +syntax keyword cppSTLfunction flip +syntax keyword cppSTLfunction floor +syntax keyword cppSTLfunction flush +syntax keyword cppSTLfunction fmod +syntax keyword cppSTLfunction fopen +syntax keyword cppSTLfunction for_each +syntax keyword cppSTLfunction fprintf +syntax keyword cppSTLfunction fputc +syntax keyword cppSTLfunction fputs +syntax keyword cppSTLfunction fread +syntax keyword cppSTLfunction free +syntax keyword cppSTLfunction freopen +syntax keyword cppSTLfunction frexp +syntax keyword cppSTLfunction front +syntax keyword cppSTLfunction fscanf +syntax keyword cppSTLfunction fseek +syntax keyword cppSTLfunction fsetpos +syntax keyword cppSTLfunction ftell +syntax keyword cppSTLfunction fwide +syntax keyword cppSTLfunction fwprintf +syntax keyword cppSTLfunction fwrite +syntax keyword cppSTLfunction fwscanf +syntax keyword cppSTLfunction gcount +syntax keyword cppSTLfunction generate +syntax keyword cppSTLfunction generate_n +syntax keyword cppSTLfunction get +syntax keyword cppSTLfunction get_allocator +syntax keyword cppSTLfunction getc +syntax keyword cppSTLfunction getchar +syntax keyword cppSTLfunction getenv +syntax keyword cppSTLfunction getline +syntax keyword cppSTLfunction gets +syntax keyword cppSTLfunction get_temporary_buffer +syntax keyword cppSTLfunction gmtime +syntax keyword cppSTLfunction good +syntax keyword cppSTLfunction ignore +syntax keyword cppSTLfunction imag +syntax keyword cppSTLfunction in +syntax keyword cppSTLfunction includes +syntax keyword cppSTLfunction infinity +syntax keyword cppSTLfunction inner_product +syntax keyword cppSTLfunction inplace_merge +syntax keyword cppSTLfunction insert +syntax keyword cppSTLfunction inserter +syntax keyword cppSTLfunction ios +syntax keyword cppSTLfunction ios_base +syntax keyword cppSTLfunction iostate +syntax keyword cppSTLfunction iota +syntax keyword cppSTLfunction isalnum +syntax keyword cppSTLfunction isalpha +syntax keyword cppSTLfunction iscntrl +syntax keyword cppSTLfunction isdigit +syntax keyword cppSTLfunction isgraph +syntax keyword cppSTLfunction is_heap +syntax keyword cppSTLfunction islower +syntax keyword cppSTLfunction is_open +syntax keyword cppSTLfunction isprint +syntax keyword cppSTLfunction ispunct +syntax keyword cppSTLfunction isspace +syntax keyword cppSTLfunction isupper +syntax keyword cppSTLfunction isxdigit +syntax keyword cppSTLfunction iterator_category +syntax keyword cppSTLfunction iter_swap +syntax keyword cppSTLfunction jmp_buf +syntax keyword cppSTLfunction key_comp +syntax keyword cppSTLfunction labs +syntax keyword cppSTLfunction ldexp +syntax keyword cppSTLfunction ldiv +syntax keyword cppSTLfunction length +syntax keyword cppSTLfunction lexicographical_compare +syntax keyword cppSTLfunction lexicographical_compare_3way +syntax keyword cppSTLfunction llabs +syntax keyword cppSTLfunction lldiv +syntax keyword cppSTLfunction localtime +syntax keyword cppSTLfunction log +syntax keyword cppSTLfunction log10 +syntax keyword cppSTLfunction longjmp +syntax keyword cppSTLfunction lower_bound +syntax keyword cppSTLfunction make_heap +syntax keyword cppSTLfunction make_pair +syntax keyword cppSTLfunction malloc +syntax keyword cppSTLfunction max +syntax keyword cppSTLfunction max_element +syntax keyword cppSTLfunction max_size +syntax keyword cppSTLfunction memchr +syntax keyword cppSTLfunction memcpy +syntax keyword cppSTLfunction mem_fun +syntax keyword cppSTLfunction mem_fun_ref +syntax keyword cppSTLfunction memmove +syntax keyword cppSTLfunction memset +syntax keyword cppSTLfunction merge +syntax keyword cppSTLfunction min +syntax keyword cppSTLfunction min_element +syntax keyword cppSTLfunction mismatch +syntax keyword cppSTLfunction mktime +syntax keyword cppSTLfunction modf +syntax keyword cppSTLfunction next_permutation +syntax keyword cppSTLfunction none +syntax keyword cppSTLfunction norm +syntax keyword cppSTLfunction not1 +syntax keyword cppSTLfunction not2 +syntax keyword cppSTLfunction nth_element +syntax keyword cppSTLtype numeric_limits +syntax keyword cppSTLfunction open +syntax keyword cppSTLfunction partial_sort +syntax keyword cppSTLfunction partial_sort_copy +syntax keyword cppSTLfunction partial_sum +syntax keyword cppSTLfunction partition +syntax keyword cppSTLfunction peek +syntax keyword cppSTLfunction perror +syntax keyword cppSTLfunction polar +syntax keyword cppSTLfunction pop +syntax keyword cppSTLfunction pop_back +syntax keyword cppSTLfunction pop_front +syntax keyword cppSTLfunction pop_heap +syntax keyword cppSTLfunction pow +syntax keyword cppSTLfunction power +syntax keyword cppSTLfunction precision +syntax keyword cppSTLfunction prev_permutation +syntax keyword cppSTLfunction printf +syntax keyword cppSTLfunction ptr_fun +syntax keyword cppSTLfunction push +syntax keyword cppSTLfunction push_back +syntax keyword cppSTLfunction push_front +syntax keyword cppSTLfunction push_heap +syntax keyword cppSTLfunction put +syntax keyword cppSTLfunction putback +syntax keyword cppSTLfunction putc +syntax keyword cppSTLfunction putchar +syntax keyword cppSTLfunction puts +syntax keyword cppSTLfunction qsort +syntax keyword cppSTLfunction quiet_NaN +syntax keyword cppSTLfunction raise +syntax keyword cppSTLfunction rand +syntax keyword cppSTLfunction random_sample +syntax keyword cppSTLfunction random_sample_n +syntax keyword cppSTLfunction random_shuffle +syntax keyword cppSTLfunction rbegin +syntax keyword cppSTLfunction rdbuf +syntax keyword cppSTLfunction rdstate +syntax keyword cppSTLfunction read +syntax keyword cppSTLfunction real +syntax keyword cppSTLfunction realloc +syntax keyword cppSTLfunction remove +syntax keyword cppSTLfunction remove_copy +syntax keyword cppSTLfunction remove_copy_if +syntax keyword cppSTLfunction remove_if +syntax keyword cppSTLfunction rename +syntax keyword cppSTLfunction rend +syntax keyword cppSTLfunction replace +syntax keyword cppSTLfunction replace_copy +syntax keyword cppSTLfunction replace_copy_if +syntax keyword cppSTLfunction replace_if +syntax keyword cppSTLfunction reserve +syntax keyword cppSTLfunction reset +syntax keyword cppSTLfunction resize +syntax keyword cppSTLfunction return_temporary_buffer +syntax keyword cppSTLfunction reverse +syntax keyword cppSTLfunction reverse_copy +syntax keyword cppSTLfunction rewind +syntax keyword cppSTLfunction rfind +syntax keyword cppSTLfunction rotate +syntax keyword cppSTLfunction rotate_copy +syntax keyword cppSTLfunction round_error +syntax keyword cppSTLfunction scanf +syntax keyword cppSTLfunction search +syntax keyword cppSTLfunction search_n +syntax keyword cppSTLfunction second +syntax keyword cppSTLfunction seekg +syntax keyword cppSTLfunction seekp +syntax keyword cppSTLfunction setbuf +syntax keyword cppSTLfunction set_difference +syntax keyword cppSTLfunction setf +syntax keyword cppSTLfunction set_intersection +syntax keyword cppSTLfunction setjmp +syntax keyword cppSTLfunction setlocale +syntax keyword cppSTLfunction set_new_handler +syntax keyword cppSTLfunction set_symmetric_difference +syntax keyword cppSTLfunction set_union +syntax keyword cppSTLfunction setvbuf +syntax keyword cppSTLfunction signal +syntax keyword cppSTLfunction signaling_NaN +syntax keyword cppSTLfunction sin +syntax keyword cppSTLfunction sinh +"syntax keyword cppSTLfunction size +syntax keyword cppSTLfunction sort +syntax keyword cppSTLfunction sort_heap +syntax keyword cppSTLfunction splice +syntax keyword cppSTLfunction sprintf +syntax keyword cppSTLfunction sqrt +syntax keyword cppSTLfunction srand +syntax keyword cppSTLfunction sscanf +syntax keyword cppSTLfunction stable_partition +syntax keyword cppSTLfunction stable_sort +syntax keyword cppSTLfunction str +syntax keyword cppSTLfunction strcat +syntax keyword cppSTLfunction strchr +syntax keyword cppSTLfunction strcmp +syntax keyword cppSTLfunction strcoll +syntax keyword cppSTLfunction strcpy +syntax keyword cppSTLfunction strcspn +syntax keyword cppSTLfunction strerror +syntax keyword cppSTLfunction strftime +syntax keyword cppSTLfunction string +syntax keyword cppSTLfunction strlen +syntax keyword cppSTLfunction strncat +syntax keyword cppSTLfunction strncmp +syntax keyword cppSTLfunction strncpy +syntax keyword cppSTLfunction strpbrk +syntax keyword cppSTLfunction strrchr +syntax keyword cppSTLfunction strspn +syntax keyword cppSTLfunction strstr +syntax keyword cppSTLfunction strtod +syntax keyword cppSTLfunction strtof +syntax keyword cppSTLfunction strtok +syntax keyword cppSTLfunction strtol +syntax keyword cppSTLfunction strtold +syntax keyword cppSTLfunction strtoll +syntax keyword cppSTLfunction strtoul +syntax keyword cppSTLfunction strxfrm +syntax keyword cppSTLfunction substr +syntax keyword cppSTLfunction swap +syntax keyword cppSTLfunction swap_ranges +syntax keyword cppSTLfunction swprintf +syntax keyword cppSTLfunction swscanf +syntax keyword cppSTLfunction sync_with_stdio +"syntax keyword cppSTLfunction system +syntax keyword cppSTLfunction tan +syntax keyword cppSTLfunction tanh +syntax keyword cppSTLfunction tellg +syntax keyword cppSTLfunction tellp +"syntax keyword cppSTLfunction test +"syntax keyword cppSTLfunction time +syntax keyword cppSTLfunction tmpfile +syntax keyword cppSTLfunction tmpnam +syntax keyword cppSTLfunction tolower +syntax keyword cppSTLfunction top +syntax keyword cppSTLfunction to_string +syntax keyword cppSTLfunction to_ulong +syntax keyword cppSTLfunction toupper +syntax keyword cppSTLfunction to_wstring +syntax keyword cppSTLfunction transform +syntax keyword cppSTLfunction unary_compose +syntax keyword cppSTLfunction unget +syntax keyword cppSTLfunction ungetc +syntax keyword cppSTLfunction uninitialized_copy +syntax keyword cppSTLfunction uninitialized_copy_n +syntax keyword cppSTLfunction uninitialized_fill +syntax keyword cppSTLfunction uninitialized_fill_n +syntax keyword cppSTLfunction unique +syntax keyword cppSTLfunction unique_copy +syntax keyword cppSTLfunction unsetf +syntax keyword cppSTLfunction upper_bound +syntax keyword cppSTLfunction va_arg +syntax keyword cppSTLfunction va_copy +syntax keyword cppSTLfunction va_end +syntax keyword cppSTLfunction value_comp +syntax keyword cppSTLfunction va_start +syntax keyword cppSTLfunction vfprintf +syntax keyword cppSTLfunction vfwprintf +syntax keyword cppSTLfunction vprintf +syntax keyword cppSTLfunction vsprintf +syntax keyword cppSTLfunction vswprintf +syntax keyword cppSTLfunction vwprintf +syntax keyword cppSTLfunction width +syntax keyword cppSTLfunction wprintf +syntax keyword cppSTLfunction write +syntax keyword cppSTLfunction wscanf +syntax keyword cppSTLios boolalpha +syntax keyword cppSTLios dec +syntax keyword cppSTLios defaultfloat +syntax keyword cppSTLios endl +syntax keyword cppSTLios ends +syntax keyword cppSTLios fixed +syntax keyword cppSTLios floatfield +syntax keyword cppSTLios flush +syntax keyword cppSTLios get_money +syntax keyword cppSTLios get_time +syntax keyword cppSTLios hex +syntax keyword cppSTLios hexfloat +syntax keyword cppSTLios internal +syntax keyword cppSTLios noboolalpha +syntax keyword cppSTLios noshowbase +syntax keyword cppSTLios noshowpoint +syntax keyword cppSTLios noshowpos +syntax keyword cppSTLios noskipws +syntax keyword cppSTLios nounitbuf +syntax keyword cppSTLios nouppercase +syntax keyword cppSTLios oct +syntax keyword cppSTLios put_money +syntax keyword cppSTLios put_time +syntax keyword cppSTLios resetiosflags +syntax keyword cppSTLios scientific +syntax keyword cppSTLios setbase +syntax keyword cppSTLios setfill +syntax keyword cppSTLios setiosflags +syntax keyword cppSTLios setprecision +syntax keyword cppSTLios setw +syntax keyword cppSTLios showbase +syntax keyword cppSTLios showpoint +syntax keyword cppSTLios showpos +syntax keyword cppSTLios skipws +syntax keyword cppSTLios unitbuf +syntax keyword cppSTLios uppercase +"syntax keyword cppSTLios ws +syntax keyword cppSTLiterator back_insert_iterator +syntax keyword cppSTLiterator bidirectional_iterator +syntax keyword cppSTLiterator const_iterator +syntax keyword cppSTLiterator const_reverse_iterator +syntax keyword cppSTLiterator forward_iterator +syntax keyword cppSTLiterator front_insert_iterator +syntax keyword cppSTLiterator input_iterator +syntax keyword cppSTLiterator insert_iterator +syntax keyword cppSTLiterator istreambuf_iterator +syntax keyword cppSTLiterator istream_iterator +syntax keyword cppSTLiterator iterator +syntax keyword cppSTLiterator ostream_iterator +syntax keyword cppSTLiterator output_iterator +syntax keyword cppSTLiterator random_access_iterator +syntax keyword cppSTLiterator raw_storage_iterator +syntax keyword cppSTLiterator reverse_bidirectional_iterator +syntax keyword cppSTLiterator reverse_iterator +syntax keyword cppSTLiterator_tag bidirectional_iterator_tag +syntax keyword cppSTLiterator_tag forward_iterator_tag +syntax keyword cppSTLiterator_tag input_iterator_tag +syntax keyword cppSTLiterator_tag output_iterator_tag +syntax keyword cppSTLiterator_tag random_access_iterator_tag +syntax keyword cppSTLnamespace rel_ops +syntax keyword cppSTLnamespace std +syntax keyword cppSTLnamespace experimental +syntax keyword cppSTLtype allocator +syntax keyword cppSTLtype auto_ptr +syntax keyword cppSTLtype basic_filebuf +syntax keyword cppSTLtype basic_fstream +syntax keyword cppSTLtype basic_ifstream +syntax keyword cppSTLtype basic_iostream +syntax keyword cppSTLtype basic_istream +syntax keyword cppSTLtype basic_istringstream +syntax keyword cppSTLtype basic_ofstream +syntax keyword cppSTLtype basic_ostream +syntax keyword cppSTLtype basic_ostringstream +syntax keyword cppSTLtype basic_streambuf +syntax keyword cppSTLtype basic_string +syntax keyword cppSTLtype basic_stringbuf +syntax keyword cppSTLtype basic_stringstream +syntax keyword cppSTLtype binary_compose +syntax keyword cppSTLtype binder1st +syntax keyword cppSTLtype binder2nd +syntax keyword cppSTLtype bitset +syntax keyword cppSTLtype char_traits +syntax keyword cppSTLtype char_type +syntax keyword cppSTLtype const_mem_fun1_t +syntax keyword cppSTLtype const_mem_fun_ref1_t +syntax keyword cppSTLtype const_mem_fun_ref_t +syntax keyword cppSTLtype const_mem_fun_t +syntax keyword cppSTLtype const_pointer +syntax keyword cppSTLtype const_reference +syntax keyword cppSTLtype container_type +syntax keyword cppSTLtype deque +syntax keyword cppSTLtype difference_type +syntax keyword cppSTLtype div_t +syntax keyword cppSTLtype double_t +syntax keyword cppSTLtype filebuf +syntax keyword cppSTLtype first_type +syntax keyword cppSTLtype float_denorm_style +syntax keyword cppSTLtype float_round_style +syntax keyword cppSTLtype float_t +syntax keyword cppSTLtype fstream +syntax keyword cppSTLtype gslice_array +syntax keyword cppSTLtype ifstream +syntax keyword cppSTLtype imaxdiv_t +syntax keyword cppSTLtype indirect_array +syntax keyword cppSTLtype int_type +syntax keyword cppSTLtype ios_base +syntax keyword cppSTLtype iostream +syntax keyword cppSTLtype istream +syntax keyword cppSTLtype istringstream +syntax keyword cppSTLtype istrstream +syntax keyword cppSTLtype iterator_traits +syntax keyword cppSTLtype key_compare +syntax keyword cppSTLtype key_type +syntax keyword cppSTLtype ldiv_t +syntax keyword cppSTLtype list +syntax keyword cppSTLtype lldiv_t +syntax keyword cppSTLtype map +syntax keyword cppSTLtype mapped_type +syntax keyword cppSTLtype mask_array +syntax keyword cppSTLtype mem_fun1_t +syntax keyword cppSTLtype mem_fun_ref1_t +syntax keyword cppSTLtype mem_fun_ref_t +syntax keyword cppSTLtype mem_fun_t +syntax keyword cppSTLtype multimap +syntax keyword cppSTLtype multiset +syntax keyword cppSTLtype nothrow_t +syntax keyword cppSTLtype off_type +syntax keyword cppSTLtype ofstream +syntax keyword cppSTLtype ostream +syntax keyword cppSTLtype ostringstream +syntax keyword cppSTLtype ostrstream +syntax keyword cppSTLtype pair +syntax keyword cppSTLtype pointer +syntax keyword cppSTLtype pointer_to_binary_function +syntax keyword cppSTLtype pointer_to_unary_function +syntax keyword cppSTLtype pos_type +syntax keyword cppSTLtype priority_queue +syntax keyword cppSTLtype queue +syntax keyword cppSTLtype reference +syntax keyword cppSTLtype second_type +syntax keyword cppSTLtype sequence_buffer +syntax keyword cppSTLtype set +syntax keyword cppSTLtype sig_atomic_t +syntax keyword cppSTLtype size_type +syntax keyword cppSTLtype slice_array +syntax keyword cppSTLtype stack +syntax keyword cppSTLtype stream +syntax keyword cppSTLtype streambuf +syntax keyword cppSTLtype streamsize +syntax keyword cppSTLtype string +syntax keyword cppSTLtype stringbuf +syntax keyword cppSTLtype stringstream +syntax keyword cppSTLtype strstream +syntax keyword cppSTLtype strstreambuf +syntax keyword cppSTLtype temporary_buffer +syntax keyword cppSTLtype test_type +syntax keyword cppSTLtype time_t +syntax keyword cppSTLtype tm +syntax keyword cppSTLtype traits_type +syntax keyword cppSTLtype type_info +syntax keyword cppSTLtype u16string +syntax keyword cppSTLtype u32string +syntax keyword cppSTLtype unary_compose +syntax keyword cppSTLtype unary_negate +syntax keyword cppSTLtype valarray +syntax keyword cppSTLtype value_compare +syntax keyword cppSTLtype value_type +syntax keyword cppSTLtype vector +syntax keyword cppSTLtype wfilebuf +syntax keyword cppSTLtype wfstream +syntax keyword cppSTLtype wifstream +syntax keyword cppSTLtype wiostream +syntax keyword cppSTLtype wistream +syntax keyword cppSTLtype wistringstream +syntax keyword cppSTLtype wofstream +syntax keyword cppSTLtype wostream +syntax keyword cppSTLtype wostringstream +syntax keyword cppSTLtype wstreambuf +syntax keyword cppSTLtype wstring +syntax keyword cppSTLtype wstringbuf +syntax keyword cppSTLtype wstringstream + +syntax keyword cppSTLfunction mblen +syntax keyword cppSTLfunction mbtowc +syntax keyword cppSTLfunction wctomb +syntax keyword cppSTLfunction mbstowcs +syntax keyword cppSTLfunction wcstombs +syntax keyword cppSTLfunction mbsinit +syntax keyword cppSTLfunction btowc +syntax keyword cppSTLfunction wctob +syntax keyword cppSTLfunction mbrlen +syntax keyword cppSTLfunction mbrtowc +syntax keyword cppSTLfunction wcrtomb +syntax keyword cppSTLfunction mbsrtowcs +syntax keyword cppSTLfunction wcsrtombs + +syntax keyword cppSTLtype mbstate_t + +syntax keyword cppSTLconstant MB_LEN_MAX +syntax keyword cppSTLconstant MB_CUR_MAX +syntax keyword cppSTLconstant __STDC_UTF_16__ +syntax keyword cppSTLconstant __STDC_UTF_32__ + +syntax keyword cppSTLfunction iswalnum +syntax keyword cppSTLfunction iswalpha +syntax keyword cppSTLfunction iswlower +syntax keyword cppSTLfunction iswupper +syntax keyword cppSTLfunction iswdigit +syntax keyword cppSTLfunction iswxdigit +syntax keyword cppSTLfunction iswcntrl +syntax keyword cppSTLfunction iswgraph +syntax keyword cppSTLfunction iswspace +syntax keyword cppSTLfunction iswprint +syntax keyword cppSTLfunction iswpunct +syntax keyword cppSTLfunction iswctype +syntax keyword cppSTLfunction wctype + +syntax keyword cppSTLfunction towlower +syntax keyword cppSTLfunction towupper +syntax keyword cppSTLfunction towctrans +syntax keyword cppSTLfunction wctrans + +syntax keyword cppSTLfunction wcstol +syntax keyword cppSTLfunction wcstoll +syntax keyword cppSTLfunction wcstoul +syntax keyword cppSTLfunction wcstoull +syntax keyword cppSTLfunction wcstof +syntax keyword cppSTLfunction wcstod +syntax keyword cppSTLfunction wcstold + +syntax keyword cppSTLfunction wcscpy +syntax keyword cppSTLfunction wcsncpy +syntax keyword cppSTLfunction wcscat +syntax keyword cppSTLfunction wcsncat +syntax keyword cppSTLfunction wcsxfrm +syntax keyword cppSTLfunction wcslen +syntax keyword cppSTLfunction wcscmp +syntax keyword cppSTLfunction wcsncmp +syntax keyword cppSTLfunction wcscoll +syntax keyword cppSTLfunction wcschr +syntax keyword cppSTLfunction wcsrchr +syntax keyword cppSTLfunction wcsspn +syntax keyword cppSTLfunction wcscspn +syntax keyword cppSTLfunction wcspbrk +syntax keyword cppSTLfunction wcsstr +syntax keyword cppSTLfunction wcstok +syntax keyword cppSTLfunction wmemcpy +syntax keyword cppSTLfunction wmemmove +syntax keyword cppSTLfunction wmemcmp +syntax keyword cppSTLfunction wmemchr +syntax keyword cppSTLfunction wmemset + +syntax keyword cppSTLtype wctrans_t +syntax keyword cppSTLtype wctype_t +syntax keyword cppSTLtype wint_t + +syntax keyword cppSTLconstant WEOF +syntax keyword cppSTLconstant WCHAR_MIN +syntax keyword cppSTLconstant WCHAR_MAX + +" locale +syntax keyword cppSTLtype locale +syntax keyword cppSTLtype ctype_base +syntax keyword cppSTLtype codecvt_base +syntax keyword cppSTLtype messages_base +syntax keyword cppSTLtype time_base +syntax keyword cppSTLtype money_base +syntax keyword cppSTLtype ctype +syntax keyword cppSTLtype codecvt +syntax keyword cppSTLtype collate +syntax keyword cppSTLtype messages +syntax keyword cppSTLtype time_get +syntax keyword cppSTLtype time_put +syntax keyword cppSTLtype num_get +syntax keyword cppSTLtype num_put +syntax keyword cppSTLtype numpunct +syntax keyword cppSTLtype money_get +syntax keyword cppSTLtype money_put +syntax keyword cppSTLtype moneypunct +syntax keyword cppSTLtype ctype_byname +syntax keyword cppSTLtype codecvt_byname +syntax keyword cppSTLtype messages_byname +syntax keyword cppSTLtype collate_byname +syntax keyword cppSTLtype time_get_byname +syntax keyword cppSTLtype time_put_byname +syntax keyword cppSTLtype numpunct_byname +syntax keyword cppSTLtype moneypunct_byname +syntax keyword cppSTLfunction use_facet +syntax keyword cppSTLfunction has_facet +syntax keyword cppSTLfunction isspace isblank iscntrl isupper islower isalpha +syntax keyword cppSTLfunction isdigit ispunct isxdigit isalnum isprint isgraph + +if !exists("cpp_no_cpp11") + syntax keyword cppSTLconstant nullptr + + " containers (array, vector, list, *map, *set, ...) + syntax keyword cppSTLtype array + syntax keyword cppSTLfunction cbegin cend + syntax keyword cppSTLfunction crbegin crend + syntax keyword cppSTLfunction shrink_to_fit + syntax keyword cppSTLfunction emplace + syntax keyword cppSTLfunction emplace_back + syntax keyword cppSTLfunction emplace_front + syntax keyword cppSTLfunction emplace_hint + + " algorithm + syntax keyword cppSTLfunction all_of any_of none_of + syntax keyword cppSTLfunction find_if_not + syntax keyword cppSTLfunction copy_if + syntax keyword cppSTLfunction copy_n + syntax keyword cppSTLfunction move + syntax keyword cppSTLfunction move_backward + syntax keyword cppSTLfunction shuffle + syntax keyword cppSTLfunction is_partitioned + syntax keyword cppSTLfunction partition_copy + syntax keyword cppSTLfunction partition_point + syntax keyword cppSTLfunction is_sorted + syntax keyword cppSTLfunction is_sorted_until + syntax keyword cppSTLfunction is_heap + syntax keyword cppSTLfunction is_heap_until + syntax keyword cppSTLfunction minmax + syntax keyword cppSTLfunction minmax_element + syntax keyword cppSTLfunction is_permutation + syntax keyword cppSTLfunction itoa + + " atomic + syntax keyword cppSTLtype atomic + syntax keyword cppSTLtype atomic_flag + syntax keyword cppSTLtype atomic_bool + syntax keyword cppSTLtype atomic_char + syntax keyword cppSTLtype atomic_schar + syntax keyword cppSTLtype atomic_uchar + syntax keyword cppSTLtype atomic_short + syntax keyword cppSTLtype atomic_ushort + syntax keyword cppSTLtype atomic_int + syntax keyword cppSTLtype atomic_uint + syntax keyword cppSTLtype atomic_long + syntax keyword cppSTLtype atomic_ulong + syntax keyword cppSTLtype atomic_llong + syntax keyword cppSTLtype atomic_ullong + syntax keyword cppSTLtype atomic_char16_t + syntax keyword cppSTLtype atomic_char32_t + syntax keyword cppSTLtype atomic_wchar_t + syntax keyword cppSTLtype atomic_int_least8_t + syntax keyword cppSTLtype atomic_uint_least8_t + syntax keyword cppSTLtype atomic_int_least16_t + syntax keyword cppSTLtype atomic_uint_least16_t + syntax keyword cppSTLtype atomic_int_least32_t + syntax keyword cppSTLtype atomic_uint_least32_t + syntax keyword cppSTLtype atomic_int_least64_t + syntax keyword cppSTLtype atomic_uint_least64_t + syntax keyword cppSTLtype atomic_int_fast8_t + syntax keyword cppSTLtype atomic_uint_fast8_t + syntax keyword cppSTLtype atomic_int_fast16_t + syntax keyword cppSTLtype atomic_uint_fast16_t + syntax keyword cppSTLtype atomic_int_fast32_t + syntax keyword cppSTLtype atomic_uint_fast32_t + syntax keyword cppSTLtype atomic_int_fast64_t + syntax keyword cppSTLtype atomic_uint_fast64_t + syntax keyword cppSTLtype atomic_intptr_t + syntax keyword cppSTLtype atomic_uintptr_t + syntax keyword cppSTLtype atomic_size_t + syntax keyword cppSTLtype atomic_ptrdiff_t + syntax keyword cppSTLtype atomic_intmax_t + syntax keyword cppSTLtype atomic_uintmax_t + syntax keyword cppSTLconstant ATOMIC_FLAG_INIT + syntax keyword cppSTLenum memory_order + syntax keyword cppSTLfunction is_lock_free + syntax keyword cppSTLfunction compare_exchange_weak + syntax keyword cppSTLfunction compare_exchange_strong + syntax keyword cppSTLfunction fetch_add + syntax keyword cppSTLfunction fetch_sub + syntax keyword cppSTLfunction fetch_and + syntax keyword cppSTLfunction fetch_or + syntax keyword cppSTLfunction fetch_xor + syntax keyword cppSTLfunction atomic_is_lock_free + syntax keyword cppSTLfunction atomic_store + syntax keyword cppSTLfunction atomic_store_explicit + syntax keyword cppSTLfunction atomic_load + syntax keyword cppSTLfunction atomic_load_explicit + syntax keyword cppSTLfunction atomic_exchange + syntax keyword cppSTLfunction atomic_exchange_explicit + syntax keyword cppSTLfunction atomic_compare_exchange_weak + syntax keyword cppSTLfunction atomic_compare_exchange_weak_explicit + syntax keyword cppSTLfunction atomic_compare_exchange_strong + syntax keyword cppSTLfunction atomic_compare_exchange_strong_explicit + syntax keyword cppSTLfunction atomic_fetch_add + syntax keyword cppSTLfunction atomic_fetch_add_explicit + syntax keyword cppSTLfunction atomic_fetch_sub + syntax keyword cppSTLfunction atomic_fetch_sub_explicit + syntax keyword cppSTLfunction atomic_fetch_and + syntax keyword cppSTLfunction atomic_fetch_and_explicit + syntax keyword cppSTLfunction atomic_fetch_or + syntax keyword cppSTLfunction atomic_fetch_or_explicit + syntax keyword cppSTLfunction atomic_fetch_xor + syntax keyword cppSTLfunction atomic_fetch_xor_explicit + syntax keyword cppSTLfunction atomic_flag_test_and_set + syntax keyword cppSTLfunction atomic_flag_test_and_set_explicit + syntax keyword cppSTLfunction atomic_flag_clear + syntax keyword cppSTLfunction atomic_flag_clear_explicit + syntax keyword cppSTLfunction atomic_init + syntax keyword cppSTLfunction ATOMIC_VAR_INIT + syntax keyword cppSTLfunction kill_dependency + syntax keyword cppSTLfunction atomic_thread_fence + syntax keyword cppSTLfunction atomic_signal_fence + syntax keyword cppSTLfunction exchange + " syntax keyword cppSTLfunction store + " syntax keyword cppSTLfunction load + + " bitset + syntax keyword cppSTLfunction to_ullong + " syntax keyword cppSTLfunction all + + " cinttypes + syntax keyword cppSTLfunction strtoimax + syntax keyword cppSTLfunction strtoumax + syntax keyword cppSTLfunction wcstoimax + syntax keyword cppSTLfunction wcstoumax + + " chrono + syntax keyword cppSTLnamespace chrono + syntax keyword cppSTLcast duration_cast + syntax keyword cppSTLcast time_point_cast + syntax keyword cppSTLtype duration + syntax keyword cppSTLtype system_clock + syntax keyword cppSTLtype steady_clock + syntax keyword cppSTLtype high_resolution_clock + syntax keyword cppSTLtype time_point + syntax keyword cppSTLtype nanoseconds + syntax keyword cppSTLtype microseconds + syntax keyword cppSTLtype milliseconds + syntax keyword cppSTLtype seconds + syntax keyword cppSTLtype minutes + syntax keyword cppSTLtype hours + syntax keyword cppSTLtype treat_as_floating_point + syntax keyword cppSTLtype duration_values + " syntax keyword cppSTLtype rep period + syntax keyword cppSTLfunction time_since_epoch + syntax keyword cppSTLfunction to_time_t + syntax keyword cppSTLfunction from_time_t + " syntax keyword cppSTLfunction zero + " syntax keyword cppSTLfunction now + + " complex + " syntax keyword cppSTLfunction proj + + " condition_variable + syntax keyword cppSTLtype condition_variable + syntax keyword cppSTLfunction notify_all + syntax keyword cppSTLfunction notify_one + + " cstddef + syntax keyword cppSTLtype nullptr_t max_align_t + + " cstdlib + syntax keyword cppSTLfunction quick_exit + syntax keyword cppSTLfunction _Exit + syntax keyword cppSTLfunction at_quick_exit + + " cuchar + syntax keyword cppSTLfunction mbrtoc16 + syntax keyword cppSTLfunction c16rtomb + syntax keyword cppSTLfunction mbrtoc32 + syntax keyword cppSTLfunction c32rtomb + + " exception + syntax keyword cppSTLtype exception_ptr + syntax keyword cppSTLtype nested_exception + syntax keyword cppSTLfunction get_terminate + syntax keyword cppSTLfunction make_exception_ptr + syntax keyword cppSTLfunction current_exception + syntax keyword cppSTLfunction rethrow_exception + syntax keyword cppSTLfunction throw_with_nested + syntax keyword cppSTLfunction rethrow_if_nested + syntax keyword cppSTLfunction rethrow_nested + + " forward_list + syntax keyword cppSTLtype forward_list + syntax keyword cppSTLfunction before_begin + syntax keyword cppSTLfunction cbefore_begin + syntax keyword cppSTLfunction insert_after + syntax keyword cppSTLfunction emplace_after + syntax keyword cppSTLfunction erase_after + syntax keyword cppSTLfunction splice_after + + " functional + syntax keyword cppSTLexception bad_function_call + syntax keyword cppSTLfunctional function + syntax keyword cppSTLconstant _1 _2 _3 _4 _5 _6 _7 _8 _9 + syntax keyword cppSTLtype hash + syntax keyword cppSTLtype is_bind_expression + syntax keyword cppSTLtype is_placeholder + syntax keyword cppSTLtype reference_wrapper + syntax keyword cppSTLfunction bind + syntax keyword cppSTLfunction mem_fn + syntax keyword cppSTLfunction ref cref + + " future + syntax keyword cppSTLtype future + syntax keyword cppSTLtype packaged_task + syntax keyword cppSTLtype promise + syntax keyword cppSTLtype shared_future + syntax keyword cppSTLenum future_status + syntax keyword cppSTLenum future_errc + syntax keyword cppSTLenum launch + syntax keyword cppSTLexception future_error + syntax keyword cppSTLfunction get_future + syntax keyword cppSTLfunction set_value + syntax keyword cppSTLfunction set_value_at_thread_exit + syntax keyword cppSTLfunction set_exception + syntax keyword cppSTLfunction set_exception_at_thread_exit + syntax keyword cppSTLfunction wait_for + syntax keyword cppSTLfunction wait_until + syntax keyword cppSTLfunction future_category + syntax keyword cppSTLfunction make_error_code + syntax keyword cppSTLfunction make_error_condition + syntax keyword cppSTLfunction make_ready_at_thread_exit + " syntax keyword cppSTLfunction async + " syntax keyword cppSTLfunction share + " syntax keyword cppSTLfunction valid + " syntax keyword cppSTLfunction wait + + " initializer_list + syntax keyword cppSTLtype initializer_list + + " io + syntax keyword cppSTLenum io_errc + syntax keyword cppSTLfunction iostream_category + syntax keyword cppSTLfunction vscanf vfscanf vsscanf + syntax keyword cppSTLfunction snprintf vsnprintf + syntax keyword cppSTLfunction vwscanf vfwscanf vswscanf + + " iterator + syntax keyword cppSTLiterator move_iterator + syntax keyword cppSTLfunction make_move_iterator + syntax keyword cppSTLfunction next prev + + " limits + syntax keyword cppSTLconstant max_digits10 + syntax keyword cppSTLfunction lowest + + " locale + syntax keyword cppSTLtype wstring_convert + syntax keyword cppSTLtype wbuffer_convert + syntax keyword cppSTLtype codecvt_utf8 + syntax keyword cppSTLtype codecvt_utf16 + syntax keyword cppSTLtype codecvt_utf8_utf16 + syntax keyword cppSTLtype codecvt_mode + syntax keyword cppSTLfunction isblank + syntax keyword cppSTLfunction iswblank + + " memory + syntax keyword cppSTLtype unique_ptr + syntax keyword cppSTLtype shared_ptr + syntax keyword cppSTLtype weak_ptr + syntax keyword cppSTLtype owner_less + syntax keyword cppSTLtype enable_shared_from_this + syntax keyword cppSTLtype default_delete + syntax keyword cppSTLtype allocator_traits + syntax keyword cppSTLtype allocator_type + syntax keyword cppSTLtype allocator_arg_t + syntax keyword cppSTLtype uses_allocator + syntax keyword cppSTLtype scoped_allocator_adaptor + syntax keyword cppSTLtype pointer_safety + syntax keyword cppSTLtype pointer_traits + syntax keyword cppSTLconstant allocator_arg + syntax keyword cppSTLexception bad_weak_ptr + syntax keyword cppSTLcast static_pointer_cast + syntax keyword cppSTLcast dynamic_pointer_cast + syntax keyword cppSTLcast const_pointer_cast + syntax keyword cppSTLfunction make_shared + syntax keyword cppSTLfunction declare_reachable + syntax keyword cppSTLfunction undeclare_reachable + syntax keyword cppSTLfunction declare_no_pointers + syntax keyword cppSTLfunction undeclare_no_pointers + syntax keyword cppSTLfunction get_pointer_safety + syntax keyword cppSTLfunction addressof + syntax keyword cppSTLfunction allocate_shared + syntax keyword cppSTLfunction get_deleter + " syntax keyword cppSTLfunction align + + " mutex + syntax keyword cppSTLtype mutex + syntax keyword cppSTLtype timed_mutex + syntax keyword cppSTLtype recursive_mutex + syntax keyword cppSTLtype recursive_timed_mutex + syntax keyword cppSTLtype lock_guard + syntax keyword cppSTLtype unique_lock + syntax keyword cppSTLtype defer_lock_t + syntax keyword cppSTLtype try_to_lock_t + syntax keyword cppSTLtype adopt_lock_t + syntax keyword cppSTLtype once_flag + syntax keyword cppSTLtype condition_variable_any + syntax keyword cppSTLenum cv_status + syntax keyword cppSTLconstant defer_lock try_to_lock adopt_lock + syntax keyword cppSTLfunction try_lock lock unlock try_lock_for try_lock_until + syntax keyword cppSTLfunction call_once + syntax keyword cppSTLfunction owns_lock + syntax keyword cppSTLfunction notify_all_at_thread_exit + syntax keyword cppSTLfunction release + " Note: unique_lock has method 'mutex()', but already set as cppSTLtype + " syntax keyword cppSTLfunction mutex + + " new + syntax keyword cppSTLexception bad_array_new_length + syntax keyword cppSTLfunction get_new_handler + + " numerics, cmath + syntax keyword cppSTLconstant HUGE_VALF + syntax keyword cppSTLconstant HUGE_VALL + syntax keyword cppSTLconstant INFINITY + syntax keyword cppSTLconstant NAN + syntax keyword cppSTLconstant math_errhandling + syntax keyword cppSTLconstant MATH_ERRNO + syntax keyword cppSTLconstant MATH_ERREXCEPT + syntax keyword cppSTLconstant FP_NORMAL + syntax keyword cppSTLconstant FP_SUBNORMAL + syntax keyword cppSTLconstant FP_ZERO + syntax keyword cppSTLconstant FP_INFINITY + syntax keyword cppSTLconstant FP_NAN + syntax keyword cppSTLconstant FLT_EVAL_METHOD + syntax keyword cppSTLfunction imaxabs + syntax keyword cppSTLfunction imaxdiv + syntax keyword cppSTLfunction remainder + syntax keyword cppSTLfunction remquo + syntax keyword cppSTLfunction fma + syntax keyword cppSTLfunction fmax + syntax keyword cppSTLfunction fmin + syntax keyword cppSTLfunction fdim + syntax keyword cppSTLfunction nan + syntax keyword cppSTLfunction nanf + syntax keyword cppSTLfunction nanl + syntax keyword cppSTLfunction exp2 + syntax keyword cppSTLfunction expm1 + syntax keyword cppSTLfunction log1p + syntax keyword cppSTLfunction log2 + syntax keyword cppSTLfunction cbrt + syntax keyword cppSTLfunction hypot + syntax keyword cppSTLfunction asinh + syntax keyword cppSTLfunction acosh + syntax keyword cppSTLfunction atanh + syntax keyword cppSTLfunction erf + syntax keyword cppSTLfunction erfc + syntax keyword cppSTLfunction lgamma + syntax keyword cppSTLfunction tgamma + syntax keyword cppSTLfunction trunc + syntax keyword cppSTLfunction round + syntax keyword cppSTLfunction lround + syntax keyword cppSTLfunction llround + syntax keyword cppSTLfunction nearbyint + syntax keyword cppSTLfunction rint + syntax keyword cppSTLfunction lrint + syntax keyword cppSTLfunction llrint + syntax keyword cppSTLfunction scalbn + syntax keyword cppSTLfunction scalbln + syntax keyword cppSTLfunction ilogb + syntax keyword cppSTLfunction logb + syntax keyword cppSTLfunction nextafter + syntax keyword cppSTLfunction nexttoward + syntax keyword cppSTLfunction copysign + syntax keyword cppSTLfunction fpclassify + syntax keyword cppSTLfunction isfinite + syntax keyword cppSTLfunction isinf + syntax keyword cppSTLfunction isnan + syntax keyword cppSTLfunction isnormal + syntax keyword cppSTLfunction signbit + + " random + syntax keyword cppSTLtype linear_congruential_engine + syntax keyword cppSTLtype mersenne_twister_engine + syntax keyword cppSTLtype subtract_with_carry_engine + syntax keyword cppSTLtype discard_block_engine + syntax keyword cppSTLtype independent_bits_engine + syntax keyword cppSTLtype shuffle_order_engine + syntax keyword cppSTLtype random_device + syntax keyword cppSTLtype default_random_engine + syntax keyword cppSTLtype minstd_rand0 + syntax keyword cppSTLtype minstd_rand + syntax keyword cppSTLtype mt19937 + syntax keyword cppSTLtype mt19937_64 + syntax keyword cppSTLtype ranlux24_base + syntax keyword cppSTLtype ranlux48_base + syntax keyword cppSTLtype ranlux24 + syntax keyword cppSTLtype ranlux48 + syntax keyword cppSTLtype knuth_b + syntax keyword cppSTLtype uniform_int_distribution + syntax keyword cppSTLtype uniform_real_distribution + syntax keyword cppSTLtype bernoulli_distribution + syntax keyword cppSTLtype binomial_distribution + syntax keyword cppSTLtype negative_binomial_distribution + syntax keyword cppSTLtype geometric_distribution + syntax keyword cppSTLtype poisson_distribution + syntax keyword cppSTLtype exponential_distribution + syntax keyword cppSTLtype gamma_distribution + syntax keyword cppSTLtype weibull_distribution + syntax keyword cppSTLtype extreme_value_distribution + syntax keyword cppSTLtype normal_distribution + syntax keyword cppSTLtype lognormal_distribution + syntax keyword cppSTLtype chi_squared_distribution + syntax keyword cppSTLtype cauchy_distribution + syntax keyword cppSTLtype fisher_f_distribution + syntax keyword cppSTLtype student_t_distribution + syntax keyword cppSTLtype discrete_distribution + syntax keyword cppSTLtype piecewise_constant_distribution + syntax keyword cppSTLtype piecewise_linear_distribution + syntax keyword cppSTLtype seed_seq + syntax keyword cppSTLfunction generate_canonical + + " ratio + syntax keyword cppSTLtype ratio + syntax keyword cppSTLtype yocto + syntax keyword cppSTLtype zepto + syntax keyword cppSTLtype atto + syntax keyword cppSTLtype femto + syntax keyword cppSTLtype pico + syntax keyword cppSTLtype nano + syntax keyword cppSTLtype micro + syntax keyword cppSTLtype milli + syntax keyword cppSTLtype centi + syntax keyword cppSTLtype deci + syntax keyword cppSTLtype deca + syntax keyword cppSTLtype hecto + syntax keyword cppSTLtype kilo + syntax keyword cppSTLtype mega + syntax keyword cppSTLtype giga + syntax keyword cppSTLtype tera + syntax keyword cppSTLtype peta + syntax keyword cppSTLtype exa + syntax keyword cppSTLtype zetta + syntax keyword cppSTLtype yotta + syntax keyword cppSTLtype ratio_add + syntax keyword cppSTLtype ratio_subtract + syntax keyword cppSTLtype ratio_multiply + syntax keyword cppSTLtype ratio_divide + syntax keyword cppSTLtype ratio_equal + syntax keyword cppSTLtype ratio_not_equal + syntax keyword cppSTLtype ratio_less + syntax keyword cppSTLtype ratio_less_equal + syntax keyword cppSTLtype ratio_greater + syntax keyword cppSTLtype ratio_greater_equal + + " regex + syntax keyword cppSTLtype basic_regex + syntax keyword cppSTLtype sub_match + syntax keyword cppSTLtype match_results + syntax keyword cppSTLtype regex_traits + syntax keyword cppSTLtype regex_match regex_search regex_replace + syntax keyword cppSTLiterator regex_iterator + syntax keyword cppSTLiterator regex_token_iterator + syntax keyword cppSTLexception regex_error + syntax keyword cppSTLtype syntax_option_type match_flag_type error_type + + " string + syntax keyword cppSTLfunction stoi + syntax keyword cppSTLfunction stol + syntax keyword cppSTLfunction stoll + syntax keyword cppSTLfunction stoul + syntax keyword cppSTLfunction stoull + syntax keyword cppSTLfunction stof + syntax keyword cppSTLfunction stod + syntax keyword cppSTLfunction stold + + " system_error + syntax keyword cppSTLenum errc + syntax keyword cppSTLtype system_error + syntax keyword cppSTLtype error_code + syntax keyword cppSTLtype error_condition + syntax keyword cppSTLtype error_category + syntax keyword cppSTLtype is_error_code_enum + syntax keyword cppSTLtype is_error_condition_enum + " syntax keyword cppSTLfunction default_error_condition + " syntax keyword cppSTLfunction generic_category + " syntax keyword cppSTLfunction system_category + " syntax keyword cppSTLfunction code + " syntax keyword cppSTLfunction category + " syntax keyword cppSTLfunction message + " syntax keyword cppSTLfunction equivalent + + " thread + syntax keyword cppSTLnamespace this_thread + syntax keyword cppSTLtype thread + syntax keyword cppSTLfunction get_id + syntax keyword cppSTLfunction sleep_for + syntax keyword cppSTLfunction sleep_until + syntax keyword cppSTLfunction joinable + syntax keyword cppSTLfunction native_handle + syntax keyword cppSTLfunction hardware_concurrency + " syntax keyword cppSTLfunction yield + " syntax keyword cppSTLfunction join + " syntax keyword cppSTLfunction detach + + " tuple + syntax keyword cppSTLtype tuple + syntax keyword cppSTLtype tuple_size + syntax keyword cppSTLtype tuple_element + syntax keyword cppSTLfunction make_tuple + syntax keyword cppSTLfunction tie + syntax keyword cppSTLfunction forward_as_tuple + syntax keyword cppSTLfunction tuple_cat + " Note: 'ignore' is already set as cppSTLfunction + " syntax keyword cppSTLconstant ignore + + " typeindex + syntax keyword cppSTLtype type_index + + " type_traits + syntax keyword cppSTLtype is_void + syntax keyword cppSTLtype is_integral + syntax keyword cppSTLtype is_floating_point + syntax keyword cppSTLtype is_array + syntax keyword cppSTLtype is_enum + syntax keyword cppSTLtype is_union + syntax keyword cppSTLtype is_class + syntax keyword cppSTLtype is_function + syntax keyword cppSTLtype is_pointer + syntax keyword cppSTLtype is_lvalue_reference + syntax keyword cppSTLtype is_rvalue_reference + syntax keyword cppSTLtype is_member_object_pointer + syntax keyword cppSTLtype is_member_function_pointer + syntax keyword cppSTLtype is_fundamental + syntax keyword cppSTLtype is_arithmetic + syntax keyword cppSTLtype is_scalar + syntax keyword cppSTLtype is_object + syntax keyword cppSTLtype is_compound + syntax keyword cppSTLtype is_reference + syntax keyword cppSTLtype is_member_pointer + syntax keyword cppSTLtype is_const + syntax keyword cppSTLtype is_volatile + syntax keyword cppSTLtype is_trivial + syntax keyword cppSTLtype is_trivially_copyable + syntax keyword cppSTLtype is_standard_layout + syntax keyword cppSTLtype is_pod + syntax keyword cppSTLtype is_literal_type + syntax keyword cppSTLtype is_empty + syntax keyword cppSTLtype is_polymorphic + syntax keyword cppSTLtype is_abstract + syntax keyword cppSTLtype is_signed + syntax keyword cppSTLtype is_unsigned + syntax keyword cppSTLtype is_constructible + syntax keyword cppSTLtype is_trivially_constructible + syntax keyword cppSTLtype is_nothrow_constructible + syntax keyword cppSTLtype is_default_constructible + syntax keyword cppSTLtype is_trivially_default_constructible + syntax keyword cppSTLtype is_nothrow_default_constructible + syntax keyword cppSTLtype is_copy_constructible + syntax keyword cppSTLtype is_trivially_copy_constructible + syntax keyword cppSTLtype is_nothrow_copy_constructible + syntax keyword cppSTLtype is_move_constructible + syntax keyword cppSTLtype is_trivially_move_constructible + syntax keyword cppSTLtype is_nothrow_move_constructible + syntax keyword cppSTLtype is_assignable + syntax keyword cppSTLtype is_trivially_assignable + syntax keyword cppSTLtype is_nothrow_assignable + syntax keyword cppSTLtype is_copy_assignable + syntax keyword cppSTLtype is_trivially_copy_assignable + syntax keyword cppSTLtype is_nothrow_copy_assignable + syntax keyword cppSTLtype is_move_assignable + syntax keyword cppSTLtype is_trivially_move_assignable + syntax keyword cppSTLtype is_nothrow_move_assignable + syntax keyword cppSTLtype is_destructible + syntax keyword cppSTLtype is_trivially_destructible + syntax keyword cppSTLtype is_nothrow_destructible + syntax keyword cppSTLtype has_virtual_destructor + syntax keyword cppSTLtype alignment_of + syntax keyword cppSTLtype rank + syntax keyword cppSTLtype extent + syntax keyword cppSTLtype is_same + syntax keyword cppSTLtype is_base_of + syntax keyword cppSTLtype is_convertible + syntax keyword cppSTLtype remove_cv + syntax keyword cppSTLtype remove_const + syntax keyword cppSTLtype remove_volatile + syntax keyword cppSTLtype add_cv + syntax keyword cppSTLtype add_const + syntax keyword cppSTLtype add_volatile + syntax keyword cppSTLtype remove_reference + syntax keyword cppSTLtype add_lvalue_reference + syntax keyword cppSTLtype add_rvalue_reference + syntax keyword cppSTLtype remove_pointer + syntax keyword cppSTLtype add_pointer + syntax keyword cppSTLtype make_signed + syntax keyword cppSTLtype make_unsigned + syntax keyword cppSTLtype remove_extent + syntax keyword cppSTLtype remove_all_extents + syntax keyword cppSTLtype aligned_storage + syntax keyword cppSTLtype aligned_union + syntax keyword cppSTLtype decay + syntax keyword cppSTLtype enable_if + syntax keyword cppSTLtype conditional + syntax keyword cppSTLtype common_type + syntax keyword cppSTLtype underlying_type + syntax keyword cppSTLtype result_of + syntax keyword cppSTLtype integral_constant + syntax keyword cppSTLtype true_type + syntax keyword cppSTLtype false_type + + " unordered_map, unordered_set, unordered_multimap, unordered_multiset + syntax keyword cppSTLtype unordered_map + syntax keyword cppSTLtype unordered_set + syntax keyword cppSTLtype unordered_multimap + syntax keyword cppSTLtype unordered_multiset + syntax keyword cppSTLtype hasher + syntax keyword cppSTLtype key_equal + syntax keyword cppSTLiterator local_iterator + syntax keyword cppSTLiterator const_local_iterator + syntax keyword cppSTLfunction bucket_count + syntax keyword cppSTLfunction max_bucket_count + syntax keyword cppSTLfunction bucket_size + syntax keyword cppSTLfunction bucket + syntax keyword cppSTLfunction load_factor + syntax keyword cppSTLfunction max_load_factor + syntax keyword cppSTLfunction rehash + syntax keyword cppSTLfunction reserve + syntax keyword cppSTLfunction hash_function + syntax keyword cppSTLfunction key_eq + + " utility + syntax keyword cppSTLtype piecewise_construct_t + syntax keyword cppSTLconstant piecewise_construct + syntax keyword cppSTLfunction declval + syntax keyword cppSTLfunction forward + syntax keyword cppSTLfunction move_if_noexcept + + " raw string literals + syntax region cppRawString matchgroup=cppRawDelimiter start=@\%(u8\|[uLU]\)\=R"\z([[:alnum:]_{}[\]#<>%:;.?*\+\-/\^&|~!=,"']\{,16}\)(@ end=/)\z1"/ contains=@Spell + + syn match cNumber "0b[01]\+" +endif " C++11 + + +if !exists("cpp_no_cpp14") + " chrono + syntax keyword cppSTLnamespace literals + syntax keyword cppSTLnamespace chrono_literals + + " iterator + syntax keyword cppSTLfunction make_reverse_iterator + + " memory + syntax keyword cppSTLfunction make_unique + + " utility + syntax keyword cppSTLtype integer_sequence + syntax keyword cppSTLtype index_sequence + syntax keyword cppSTLtype make_integer_sequence + syntax keyword cppSTLtype make_index_sequence + syntax keyword cppSTLtype index_sequence_for + + " shared_mutex + syntax keyword cppSTLtype shared_timed_mutex + syntax keyword cppSTLtype shared_lock + syntax keyword cppSTLfunction lock_shared + syntax keyword cppSTLfunction unlock_shared + syntax keyword cppSTLfunction try_lock_shared + syntax keyword cppSTLfunction try_lock_shared_for + syntax keyword cppSTLfunction try_lock_shared_until + + " string + syntax keyword cppSTLnamespace string_literals + + " tuple + syntax keyword cppSTLtype tuple_element_t + + " type_traits + syntax keyword cppSTLtype is_null_pointer + syntax keyword cppSTLtype remove_cv_t + syntax keyword cppSTLtype remove_const_t + syntax keyword cppSTLtype remove_volatile_t + syntax keyword cppSTLtype add_cv_t + syntax keyword cppSTLtype add_const_t + syntax keyword cppSTLtype add_volatile_t + syntax keyword cppSTLtype remove_reference_t + syntax keyword cppSTLtype add_lvalue_reference_t + syntax keyword cppSTLtype add_rvalue_reference_t + syntax keyword cppSTLtype remove_pointer_t + syntax keyword cppSTLtype add_pointer_t + syntax keyword cppSTLtype make_signed_t + syntax keyword cppSTLtype make_unsigned_t + syntax keyword cppSTLtype remove_extent_t + syntax keyword cppSTLtype remove_all_extents_t + syntax keyword cppSTLtype aligned_storage_t + syntax keyword cppSTLtype aligned_union_t + syntax keyword cppSTLtype decay_t + syntax keyword cppSTLtype enable_if_t + syntax keyword cppSTLtype conditional_t + syntax keyword cppSTLtype common_type_t + syntax keyword cppSTLtype underlying_type_t + syntax keyword cppSTLtype result_of_t +endif " C++14 + + +if !exists("cpp_no_cpp17") + " algorithm + syntax keyword cppSTLfunction clamp + syntax keyword cppSTLfunction for_each_n + + " any + syntax keyword cppSTLtype any + syntax keyword cppSTLexception bad_any_cast + syntax keyword cppSTLcast any_cast + syntax keyword cppSTLfunction make_any + + " array + syntax keyword cppSTLfunction to_array + syntax keyword cppSTLfunction make_array + + " atomic + syntax keyword cppSTLconstant is_always_lock_free + + " chrono + syntax keyword cppSTLbool treat_as_floating_point_v + + " cmath + syntax keyword cppSTLfunction assoc_laguerre assoc_laguerref assoc_laguerrel + syntax keyword cppSTLfunction assoc_legendre assoc_legendref assoc_legendrel + syntax keyword cppSTLfunction beta betaf betal + syntax keyword cppSTLfunction comp_ellint_1 comp_ellint_1f comp_ellint_1l + syntax keyword cppSTLfunction comp_ellint_2 comp_ellint_2f comp_ellint_2l + syntax keyword cppSTLfunction comp_ellint_3 comp_ellint_3f comp_ellint_3l + syntax keyword cppSTLfunction cyl_bessel_i cyl_bessel_if cyl_bessel_il + syntax keyword cppSTLfunction cyl_bessel_j cyl_bessel_jf cyl_bessel_jl + syntax keyword cppSTLfunction cyl_bessel_k cyl_bessel_kf cyl_bessel_kl + syntax keyword cppSTLfunction cyl_neumann cyl_neumannf cyl_neumannl + syntax keyword cppSTLfunction ellint_1 ellint_1f ellint_1l + syntax keyword cppSTLfunction ellint_2 ellint_2f ellint_2l + syntax keyword cppSTLfunction ellint_3 ellint_3f ellint_3l + syntax keyword cppSTLfunction expint expintf expintl + syntax keyword cppSTLfunction hermite hermitef hermitel + syntax keyword cppSTLfunction legendre legendrefl egendrel + syntax keyword cppSTLfunction laguerre laguerref laguerrel + syntax keyword cppSTLfunction riemann_zeta riemann_zetaf riemann_zetal + syntax keyword cppSTLfunction sph_bessel sph_besself sph_bessell + syntax keyword cppSTLfunction sph_legendre sph_legendref sph_legendrel + syntax keyword cppSTLfunction sph_neumann sph_neumannf sph_neumannl + + " cstdlib + syntax keyword cppSTLfunction aligned_alloc + + " exception + syntax keyword cppSTLfunction uncaught_exceptions + + " execution + syntax keyword cppSTLnamespace execution + syntax keyword cppSTLconstant seq par par_unseq + syntax keyword cppSTLbool is_execution_policy_v + syntax keyword cppSTLtype sequenced_policy + syntax keyword cppSTLtype parallel_policy + syntax keyword cppSTLtype parallel_unsequenced_policy + syntax keyword cppSTLtype is_execution_policy + + " filesystem + syntax keyword cppSTLnamespace filesystem + syntax keyword cppSTLexception filesystem_error + syntax keyword cppSTLtype path + syntax keyword cppSTLtype directory_entry + syntax keyword cppSTLtype directory_iterator + syntax keyword cppSTLtype recursive_directory_iterator + syntax keyword cppSTLtype file_status + syntax keyword cppSTLtype space_info + syntax keyword cppSTLtype file_time_type + syntax keyword cppSTLenum file_type + syntax keyword cppSTLenum perms + syntax keyword cppSTLenum copy_options + syntax keyword cppSTLenum directory_options + syntax keyword cppSTLConstant preferred_separator + syntax keyword cppSTLconstant available + " Note: 'capacity' and 'free' are already set as cppSTLfunction + " syntax keyword cppSTLconstant capacity + " syntax keyword cppSTLconstant free + syntax keyword cppSTLfunction concat + syntax keyword cppSTLfunction make_preferred + syntax keyword cppSTLfunction remove_filename + syntax keyword cppSTLfunction replace_filename + syntax keyword cppSTLfunction replace_extension + syntax keyword cppSTLfunction native + syntax keyword cppSTLfunction string_type + " Note: wstring, u8string, u16string, u32string already set as cppSTLtype + " syntax keyword cppSTLfunction wstring + " syntax keyword cppSTLfunction u8string + " syntax keyword cppSTLfunction u16string + " syntax keyword cppSTLfunction u32string + syntax keyword cppSTLfunction generic_string + syntax keyword cppSTLfunction generic_wstring + syntax keyword cppSTLfunction generic_u8string + syntax keyword cppSTLfunction generic_u16string + syntax keyword cppSTLfunction generic_u32string + syntax keyword cppSTLfunction lexically_normal + syntax keyword cppSTLfunction lexically_relative + syntax keyword cppSTLfunction lexically_proximate + syntax keyword cppSTLfunction root_name + syntax keyword cppSTLfunction root_directory + syntax keyword cppSTLfunction root_path + syntax keyword cppSTLfunction relative_path + syntax keyword cppSTLfunction parent_path + " syntax keyword cppSTLfunction filename + syntax keyword cppSTLfunction stem + syntax keyword cppSTLfunction extension + syntax keyword cppSTLfunction has_root_name + syntax keyword cppSTLfunction has_root_directory + syntax keyword cppSTLfunction has_root_path + syntax keyword cppSTLfunction has_relative_path + syntax keyword cppSTLfunction has_parent_path + syntax keyword cppSTLfunction has_filename + syntax keyword cppSTLfunction has_stem + syntax keyword cppSTLfunction has_extension + syntax keyword cppSTLfunction is_absolute + syntax keyword cppSTLfunction is_relative + syntax keyword cppSTLfunction hash_value + syntax keyword cppSTLfunction u8path + syntax keyword cppSTLfunction path1 + syntax keyword cppSTLfunction path2 + " syntax keyword cppSTLfunction path + syntax keyword cppSTLfunction status + syntax keyword cppSTLfunction symlink_status + syntax keyword cppSTLfunction options + " syntax keyword cppSTLfunction depth + syntax keyword cppSTLfunction recursive_pending + syntax keyword cppSTLfunction disable_recursive_pending + " syntax keyword cppSTLfunction type + syntax keyword cppSTLfunction permissions + syntax keyword cppSTLfunction absolute + syntax keyword cppSTLfunction system_complete + syntax keyword cppSTLfunction canonical + syntax keyword cppSTLfunction weakly_canonical + syntax keyword cppSTLfunction relative + syntax keyword cppSTLfunction proximate + syntax keyword cppSTLfunction copy_file + syntax keyword cppSTLfunction copy_symlink + syntax keyword cppSTLfunction create_directory + syntax keyword cppSTLfunction create_directories + syntax keyword cppSTLfunction create_hard_link + syntax keyword cppSTLfunction create_symlink + syntax keyword cppSTLfunction create_directory_symlink + syntax keyword cppSTLfunction current_path + " syntax keyword cppSTLfunction exists + syntax keyword cppSTLfunction file_size + syntax keyword cppSTLfunction hard_link_count + syntax keyword cppSTLfunction last_write_time + syntax keyword cppSTLfunction read_symlink + syntax keyword cppSTLfunction remove_all + syntax keyword cppSTLfunction resize_file + syntax keyword cppSTLfunction space + syntax keyword cppSTLfunction temp_directory_path + syntax keyword cppSTLfunction is_block_file + syntax keyword cppSTLfunction is_character_file + syntax keyword cppSTLfunction is_directory + syntax keyword cppSTLfunction is_fifo + syntax keyword cppSTLfunction is_other + syntax keyword cppSTLfunction is_regular_file + syntax keyword cppSTLfunction is_socket + syntax keyword cppSTLfunction is_symlink + syntax keyword cppSTLfunction status_known + " Note: 'is_empty' already set as cppSTLtype + " syntax keyword cppSTLfunction is_empty + + " functional + syntax keyword cppSTLtype default_order + syntax keyword cppSTLtype default_order_t + syntax keyword cppSTLtype default_searcher + syntax keyword cppSTLtype boyer_moore_searcher + syntax keyword cppSTLtype boyer_moore_horspool_searcher + syntax keyword cppSTLbool is_bind_expression_v + syntax keyword cppSTLbool is_placeholder_v + syntax keyword cppSTLfunction not_fn + syntax keyword cppSTLfunction make_default_searcher + syntax keyword cppSTLfunction make_boyer_moore_searcher + syntax keyword cppSTLfunction make_boyer_moore_horspool_searcher + " syntax keyword cppSTLfunction invoke + + " memory + syntax keyword cppSTLcast reinterpret_pointer_cast + syntax keyword cppSTLfunction uninitialized_move + syntax keyword cppSTLfunction uninitialized_move_n + syntax keyword cppSTLfunction uninitialized_default_construct + syntax keyword cppSTLfunction uninitialized_default_construct_n + syntax keyword cppSTLfunction uninitialized_value_construct + syntax keyword cppSTLfunction uninitialized_value_construct_n + syntax keyword cppSTLfunction destroy_at + syntax keyword cppSTLfunction destroy_n + + " memory_resource + syntax keyword cppSTLtype polymorphic_allocator + syntax keyword cppSTLtype memory_resource + syntax keyword cppSTLtype synchronized_pool_resource + syntax keyword cppSTLtype unsynchronized_pool_resource + syntax keyword cppSTLtype pool_options + syntax keyword cppSTLtype monotonic_buffer_resource + syntax keyword cppSTLfunction upstream_resource + syntax keyword cppSTLfunction get_default_resource + syntax keyword cppSTLfunction new_default_resource + syntax keyword cppSTLfunction set_default_resource + syntax keyword cppSTLfunction null_memory_resource + syntax keyword cppSTLfunction allocate + syntax keyword cppSTLfunction deallocate + syntax keyword cppSTLfunction construct + syntax keyword cppSTLfunction destruct + syntax keyword cppSTLfunction resource + syntax keyword cppSTLfunction select_on_container_copy_construction + syntax keyword cppSTLfunction do_allocate + syntax keyword cppSTLfunction do_deallocate + syntax keyword cppSTLfunction do_is_equal + + " mutex + syntax keyword cppSTLtype scoped_lock + + " new + syntax keyword cppSTLconstant hardware_destructive_interference_size + syntax keyword cppSTLconstant hardware_constructive_interference_size + syntax keyword cppSTLfunction launder + + " numeric + syntax keyword cppSTLfunction gcd + syntax keyword cppSTLfunction lcm + syntax keyword cppSTLfunction exclusive_scan + syntax keyword cppSTLfunction inclusive_scan + syntax keyword cppSTLfunction transform_reduce + syntax keyword cppSTLfunction transform_exclusive_scan + syntax keyword cppSTLfunction transform_inclusive_scan + " syntax keyword cppSTLfunction reduce + + " optional + syntax keyword cppSTLtype optional + syntax keyword cppSTLtype nullopt_t + syntax keyword cppSTLexception bad_optional_access + syntax keyword cppSTLconstant nullopt + syntax keyword cppSTLfunction make_optional + syntax keyword cppSTLfunction value_or + syntax keyword cppSTLfunction has_value + " syntax keyword cppSTLfunction value + + " string_view + syntax keyword cppSTLtype basic_string_view + syntax keyword cppSTLtype string_view + syntax keyword cppSTLtype wstring_view + syntax keyword cppSTLtype u16string_view + syntax keyword cppSTLtype u32string_view + syntax keyword cppSTLfunction remove_prefix + syntax keyword cppSTLfunction remove_suffix + + " system_error + syntax keyword cppSTLbool is_error_code_enum_v + syntax keyword cppSTLbool is_error_condition_enum_v + + " shared_mutex + syntax keyword cppSTLtype shared_mutex + + " tuple + syntax keyword cppSTLconstant tuple_size_v + syntax keyword cppSTLfunction make_from_tuple + " syntax keyword cppSTLfunction apply + + " type_traits + syntax keyword cppSTLbool is_void_v + syntax keyword cppSTLbool is_null_pointer_v + syntax keyword cppSTLbool is_integral_v + syntax keyword cppSTLbool is_floating_point_v + syntax keyword cppSTLbool is_array_v + syntax keyword cppSTLbool is_enum_v + syntax keyword cppSTLbool is_union_v + syntax keyword cppSTLbool is_class_v + syntax keyword cppSTLbool is_function_v + syntax keyword cppSTLbool is_pointer_v + syntax keyword cppSTLbool is_lvalue_reference_v + syntax keyword cppSTLbool is_rvalue_reference_v + syntax keyword cppSTLbool is_member_object_pointer_v + syntax keyword cppSTLbool is_member_function_pointer_v + syntax keyword cppSTLbool is_fundamental_v + syntax keyword cppSTLbool is_arithmetic_v + syntax keyword cppSTLbool is_scalar_v + syntax keyword cppSTLbool is_object_v + syntax keyword cppSTLbool is_compound_v + syntax keyword cppSTLbool is_reference_v + syntax keyword cppSTLbool is_member_pointer_v + syntax keyword cppSTLbool is_const_v + syntax keyword cppSTLbool is_volatile_v + syntax keyword cppSTLbool is_trivial_v + syntax keyword cppSTLbool is_trivially_copyable_v + syntax keyword cppSTLbool is_standard_layout_v + syntax keyword cppSTLbool is_pod_v + syntax keyword cppSTLbool is_literal_type_v + syntax keyword cppSTLbool is_empty_v + syntax keyword cppSTLbool is_polymorphic_v + syntax keyword cppSTLbool is_abstract_v + syntax keyword cppSTLbool is_signed_v + syntax keyword cppSTLbool is_unsigned_v + syntax keyword cppSTLbool is_constructible_v + syntax keyword cppSTLbool is_trivially_constructible_v + syntax keyword cppSTLbool is_nothrow_constructible_v + syntax keyword cppSTLbool is_default_constructible_v + syntax keyword cppSTLbool is_trivially_default_constructible_v + syntax keyword cppSTLbool is_nothrow_default_constructible_v + syntax keyword cppSTLbool is_copy_constructible_v + syntax keyword cppSTLbool is_trivially_copy_constructible_v + syntax keyword cppSTLbool is_nothrow_copy_constructible_v + syntax keyword cppSTLbool is_move_constructible_v + syntax keyword cppSTLbool is_trivially_move_constructible_v + syntax keyword cppSTLbool is_nothrow_move_constructible_v + syntax keyword cppSTLbool is_assignable_v + syntax keyword cppSTLbool is_trivially_assignable_v + syntax keyword cppSTLbool is_nothrow_assignable_v + syntax keyword cppSTLbool is_copy_assignable_v + syntax keyword cppSTLbool is_trivially_copy_assignable_v + syntax keyword cppSTLbool is_nothrow_copy_assignable_v + syntax keyword cppSTLbool is_move_assignable_v + syntax keyword cppSTLbool is_trivially_move_assignable_v + syntax keyword cppSTLbool is_nothrow_move_assignable_v + syntax keyword cppSTLbool is_destructible_v + syntax keyword cppSTLbool is_trivially_destructible_v + syntax keyword cppSTLbool is_nothrow_destructible_v + syntax keyword cppSTLbool has_virtual_destructor_v + syntax keyword cppSTLbool is_same_v + syntax keyword cppSTLbool is_base_of_v + syntax keyword cppSTLbool is_convertible_v + syntax keyword cppSTLbool is_callable_v + syntax keyword cppSTLbool is_nowthrow_callable_v + syntax keyword cppSTLbool conjunction_v + syntax keyword cppSTLbool disjunction_v + syntax keyword cppSTLbool negation_v + syntax keyword cppSTLbool has_unique_object_representations_v + syntax keyword cppSTLbool is_swappable_v + syntax keyword cppSTLbool is_swappable_with_v + syntax keyword cppSTLbool is_nothrow_swappable_v + syntax keyword cppSTLbool is_nothrow_swappable_with_v + syntax keyword cppSTLbool is_invocable_v + syntax keyword cppSTLbool is_invocable_r_v + syntax keyword cppSTLbool is_nothrow_invocable_v + syntax keyword cppSTLbool is_nothrow_invocable_r_v + syntax keyword cppSTLbool is_aggregate_v + syntax keyword cppSTLconstant alignment_of_v + syntax keyword cppSTLconstant rank_v + syntax keyword cppSTLconstant extent_v + syntax keyword cppSTLtype bool_constant + syntax keyword cppSTLtype is_callable + syntax keyword cppSTLtype is_nowthrow_callable + syntax keyword cppSTLtype conjunction + syntax keyword cppSTLtype disjunction + syntax keyword cppSTLtype negation + syntax keyword cppSTLtype void_t + syntax keyword cppSTLtype has_unique_object_representations + syntax keyword cppSTLtype is_swappable + syntax keyword cppSTLtype is_swappable_with + syntax keyword cppSTLtype is_nothrow_swappable + syntax keyword cppSTLtype is_nothrow_swappable_with + syntax keyword cppSTLtype is_invocable + syntax keyword cppSTLtype is_invocable_r + syntax keyword cppSTLtype is_nothrow_invocable + syntax keyword cppSTLtype is_nothrow_invocable_r + syntax keyword cppSTLtype invoke_result + syntax keyword cppSTLtype invoke_result_t + syntax keyword cppSTLtype is_aggregate + + " unordered_map, unordered_set, unordered_multimap, unordered_multiset + syntax keyword cppSTLtype node_type + syntax keyword cppSTLtype insert_return_type + syntax keyword cppSTLfunction try_emplace + syntax keyword cppSTLfunction insert_or_assign + syntax keyword cppSTLfunction extract + + " utility + syntax keyword cppSTLtype in_place_tag + syntax keyword cppSTLtype in_place_t + syntax keyword cppSTLtype in_place_type_t + syntax keyword cppSTLtype in_place_index_t + syntax keyword cppSTLfunction in_place + syntax keyword cppSTLfunction as_const + + " variant + syntax keyword cppSTLtype variant + syntax keyword cppSTLtype monostate + syntax keyword cppSTLtype variant_size + syntax keyword cppSTLtype variant_alternative + syntax keyword cppSTLtype variant_alternative_t + syntax keyword cppSTLconstant variant_size_v + syntax keyword cppSTLconstant variant_npos + syntax keyword cppSTLexception bad_variant_access + syntax keyword cppSTLfunction valueless_by_exception + syntax keyword cppSTLfunction holds_alternative + syntax keyword cppSTLfunction get_if + syntax keyword cppSTLfunction visit + " syntax keyword cppSTLfunction index +endif " C++17 + + +if !exists("cpp_no_cpp20") + " type_traits + syntax keyword cppSTLtype remove_cvref remove_cvref_t +endif + + +if exists('g:cpp_concepts_highlight') && g:cpp_concepts_highlight + syntax keyword cppStatement concept + syntax keyword cppStorageClass requires + syntax keyword cppSTLtype DefaultConstructible + syntax keyword cppSTLtype MoveConstructible + syntax keyword cppSTLtype CopyConstructible + syntax keyword cppSTLtype MoveAssignable + syntax keyword cppSTLtype CopyAssignable + syntax keyword cppSTLtype Destructible + syntax keyword cppSTLtype TriviallyCopyable + syntax keyword cppSTLtype TrivialType + syntax keyword cppSTLtype StandardLayoutType + syntax keyword cppSTLtype PODType + syntax keyword cppSTLtype EqualityComparable + syntax keyword cppSTLtype LessThanComparable + syntax keyword cppSTLtype Swappable + syntax keyword cppSTLtype ValueSwappable + syntax keyword cppSTLtype NullablePointer + syntax keyword cppSTLtype Hash + syntax keyword cppSTLtype Allocator + syntax keyword cppSTLtype FunctionObject + syntax keyword cppSTLtype Callable + syntax keyword cppSTLtype Predicate + syntax keyword cppSTLtype BinaryPredicate + syntax keyword cppSTLtype Compare + syntax keyword cppSTLtype Container + syntax keyword cppSTLtype ReversibleContainer + syntax keyword cppSTLtype AllocatorAwareContainer + syntax keyword cppSTLtype SequenceContainer + syntax keyword cppSTLtype ContiguousContainer + syntax keyword cppSTLtype AssociativeContainer + syntax keyword cppSTLtype UnorderedAssociativeContainer + syntax keyword cppSTLtype DefaultInsertable + syntax keyword cppSTLtype CopyInsertable + syntax keyword cppSTLtype CopyInsertable + syntax keyword cppSTLtype MoveInsertable + syntax keyword cppSTLtype EmplaceConstructible + syntax keyword cppSTLtype Erasable + syntax keyword cppSTLtype Iterator + syntax keyword cppSTLtype InputIterator + syntax keyword cppSTLtype OutputIterator + syntax keyword cppSTLtype ForwardIterator + syntax keyword cppSTLtype BidirectionalIterator + syntax keyword cppSTLtype RandomAccessIterator + syntax keyword cppSTLtype ContiguousIterator + syntax keyword cppSTLtype UnformattedInputFunction + syntax keyword cppSTLtype FormattedInputFunction + syntax keyword cppSTLtype UnformattedOutputFunction + syntax keyword cppSTLtype FormattedOutputFunction + syntax keyword cppSTLtype SeedSequence + syntax keyword cppSTLtype UniformRandomBitGenerator + syntax keyword cppSTLtype RandomNumberEngine + syntax keyword cppSTLtype RandomNumberEngineAdaptor + syntax keyword cppSTLtype RandomNumberDistribution + syntax keyword cppSTLtype BasicLockable + syntax keyword cppSTLtype Lockable + syntax keyword cppSTLtype TimedLockable + syntax keyword cppSTLtype Mutex + syntax keyword cppSTLtype TimedMutex + syntax keyword cppSTLtype SharedMutex + syntax keyword cppSTLtype SharedTimedMutex + syntax keyword cppSTLtype UnaryTypeTrait + syntax keyword cppSTLtype BinaryTypeTrait + syntax keyword cppSTLtype TransformationTrait + syntax keyword cppSTLtype Clock + syntax keyword cppSTLtype TrivialClock + syntax keyword cppSTLtype CharTraits + syntax keyword cppSTLtype pos_type + syntax keyword cppSTLtype off_type + syntax keyword cppSTLtype BitmaskType + syntax keyword cppSTLtype NumericType + syntax keyword cppSTLtype RegexTraits + syntax keyword cppSTLtype LiteralType +endif " C++ concepts + + +if !exists("cpp_no_boost") + syntax keyword cppSTLnamespace boost + syntax keyword cppSTLcast lexical_cast +endif " boost + + +" Default highlighting +if version >= 508 || !exists("did_cpp_syntax_inits") + if version < 508 + let did_cpp_syntax_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + HiLink cppSTLbool Boolean + HiLink cppStorageClass StorageClass + HiLink cppStatement Statement + HiLink cppSTLfunction Function + HiLink cppSTLfunctional Typedef + HiLink cppSTLconstant Constant + HiLink cppSTLnamespace Constant + HiLink cppSTLtype Typedef + HiLink cppSTLexception Exception + HiLink cppSTLiterator Typedef + HiLink cppSTLiterator_tag Typedef + HiLink cppSTLenum Typedef + HiLink cppSTLios Function + HiLink cppSTLcast Statement " be consistent with official syntax + HiLink cppRawString String + HiLink cppRawDelimiter Delimiter + delcommand HiLink +endif diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/python.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/python.vim new file mode 100644 index 0000000..39100c1 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/after/syntax/python.vim @@ -0,0 +1,562 @@ +" Vim syntax file +" Language: Python +" Current Maintainer: Dmitry Vasiliev +" Previous Maintainer: Neil Schemenauer +" URL: https://github.com/hdima/python-syntax +" Last Change: 2015-11-01 +" Filenames: *.py +" Version: 3.6.0 +" +" Based on python.vim (from Vim 6.1 distribution) +" by Neil Schemenauer +" +" Please use the following channels for reporting bugs, offering suggestions or +" feedback: + +" - python.vim issue tracker: https://github.com/hdima/python-syntax/issues +" - Email: Dmitry Vasiliev (dima at hlabs.org) +" - Send a message or follow me for updates on Twitter: `@hdima +" `__ +" +" Contributors +" ============ +" +" List of the contributors in alphabetical order: +" +" Andrea Riciputi +" Anton Butanaev +" Antony Lee +" Caleb Adamantine +" David Briscoe +" Elizabeth Myers +" Ihor Gorobets +" Jeroen Ruigrok van der Werven +" John Eikenberry +" Joongi Kim +" Marc Weber +" Pedro Algarvio +" Victor Salgado +" Will Gray +" Yuri Habrusiev +" +" Options +" ======= +" +" :let OPTION_NAME = 1 Enable option +" :let OPTION_NAME = 0 Disable option +" +" +" Option to select Python version +" ------------------------------- +" +" python_version_2 Enable highlighting for Python 2 +" (Python 3 highlighting is enabled +" by default). Can also be set as +" a buffer (b:python_version_2) +" variable. +" +" You can also use the following local to buffer commands to switch +" between two highlighting modes: +" +" :Python2Syntax Switch to Python 2 highlighting +" mode +" :Python3Syntax Switch to Python 3 highlighting +" mode +" +" Option names used by the script +" ------------------------------- +" +" python_highlight_builtins Highlight builtin functions and +" objects +" python_highlight_builtin_objs Highlight builtin objects only +" python_highlight_builtin_funcs Highlight builtin functions only +" python_highlight_exceptions Highlight standard exceptions +" python_highlight_string_formatting Highlight % string formatting +" python_highlight_string_format Highlight str.format syntax +" python_highlight_string_templates Highlight string.Template syntax +" python_highlight_indent_errors Highlight indentation errors +" python_highlight_space_errors Highlight trailing spaces +" python_highlight_doctests Highlight doc-tests +" python_print_as_function Highlight 'print' statement as +" function for Python 2 +" python_highlight_file_headers_as_comments +" Highlight shebang and coding +" headers as comments +" +" python_highlight_all Enable all the options above +" NOTE: This option don't override +" any previously set options +" +" python_slow_sync Can be set to 0 for slow machines +" + +" For version 5.x: Clear all syntax items +" For versions greater than 6.x: Quit when a syntax file was already loaded + +" +" Commands +" +command! -buffer Python3Syntax let b:python_version_2 = 0 | let &syntax=&syntax + +" Enable option if it's not defined +function! s:EnableByDefault(name) + if !exists(a:name) + let {a:name} = 1 + endif +endfunction + +" Check if option is enabled +function! s:Enabled(name) + return exists(a:name) && {a:name} +endfunction + +" Is it Python 2 syntax? +function! s:Python2Syntax() + if exists("b:python_version_2") + return b:python_version_2 + endif + return s:Enabled("g:python_version_2") +endfunction + +" +" Default options +" + +call s:EnableByDefault("g:python_slow_sync") + +if s:Enabled("g:python_highlight_all") + call s:EnableByDefault("g:python_highlight_builtins") + if s:Enabled("g:python_highlight_builtins") + call s:EnableByDefault("g:python_highlight_builtin_objs") + call s:EnableByDefault("g:python_highlight_builtin_funcs") + endif + call s:EnableByDefault("g:python_highlight_exceptions") + call s:EnableByDefault("g:python_highlight_string_formatting") + call s:EnableByDefault("g:python_highlight_string_format") + call s:EnableByDefault("g:python_highlight_string_templates") + call s:EnableByDefault("g:python_highlight_indent_errors") + call s:EnableByDefault("g:python_highlight_space_errors") + call s:EnableByDefault("g:python_highlight_doctests") + call s:EnableByDefault("g:python_print_as_function") +endif + +" +" Keywords +" + +syn keyword pythonStatement break continue del +syn keyword pythonStatement exec return +syn keyword pythonStatement pass raise +syn keyword pythonStatement global assert +syn keyword pythonStatement lambda +syn keyword pythonStatement with +syn keyword pythonStatement def class nextgroup=pythonFunction skipwhite +syn keyword pythonRepeat for while +syn keyword pythonConditional if elif else +" The standard pyrex.vim unconditionally removes the pythonInclude group, so +" we provide a dummy group here to avoid crashing pyrex.vim. +syn keyword pythonInclude import +syn keyword pythonImport import +syn keyword pythonException try except finally +syn keyword pythonOperator and in is not or + +syn match pythonStatement "\" display +syn match pythonImport "\" display + +if s:Python2Syntax() + if !s:Enabled("g:python_print_as_function") + syn keyword pythonStatement print + endif + syn keyword pythonImport as + syn match pythonFunction "[a-zA-Z_][a-zA-Z0-9_]*" display contained +else + syn keyword pythonStatement as nonlocal None + syn match pythonStatement "\" display + syn keyword pythonBoolean True False + syn match pythonFunction "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained + syn keyword pythonStatement await + syn match pythonStatement "\" nextgroup=pythonFunction skipwhite + syn match pythonStatement "\" display + syn match pythonStatement "\" display +endif + +" +" Decorators (new in Python 2.4) +" + +syn match pythonDecorator "@" display nextgroup=pythonDottedName skipwhite +if s:Python2Syntax() + syn match pythonDottedName "[a-zA-Z_][a-zA-Z0-9_]*\%(\.[a-zA-Z_][a-zA-Z0-9_]*\)*" display contained +else + syn match pythonDottedName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\)*" display contained +endif +syn match pythonDot "\." display containedin=pythonDottedName + +" +" Comments +" + +syn match pythonComment "#.*$" display contains=pythonTodo,@Spell +if !s:Enabled("g:python_highlight_file_headers_as_comments") + syn match pythonRun "\%^#!.*$" + syn match pythonCoding "\%^.*\%(\n.*\)\?#.*coding[:=]\s*[0-9A-Za-z-_.]\+.*$" +endif +syn keyword pythonTodo TODO FIXME XXX contained + +" +" Errors +" + +syn match pythonError "\<\d\+\D\+\>" display +syn match pythonError "[$?]" display +syn match pythonError "[&|]\{2,}" display +syn match pythonError "[=]\{3,}" display + +" Mixing spaces and tabs also may be used for pretty formatting multiline +" statements +if s:Enabled("g:python_highlight_indent_errors") + syn match pythonIndentError "^\s*\%( \t\|\t \)\s*\S"me=e-1 display +endif + +" Trailing space errors +if s:Enabled("g:python_highlight_space_errors") + syn match pythonSpaceError "\s\+$" display +endif + +" +" Strings +" + +if s:Python2Syntax() + " Python 2 strings + syn region pythonString start=+[bB]\='+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+[bB]\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+[bB]\="""+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell + syn region pythonString start=+[bB]\='''+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell +else + " Python 3 byte strings + syn region pythonBytes start=+[bB]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesError,pythonBytesContent,@Spell + syn region pythonBytes start=+[bB]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesError,pythonBytesContent,@Spell + syn region pythonBytes start=+[bB]"""+ end=+"""+ keepend contains=pythonBytesError,pythonBytesContent,pythonDocTest2,pythonSpaceError,@Spell + syn region pythonBytes start=+[bB]'''+ end=+'''+ keepend contains=pythonBytesError,pythonBytesContent,pythonDocTest,pythonSpaceError,@Spell + + syn match pythonBytesError ".\+" display contained + syn match pythonBytesContent "[\u0000-\u00ff]\+" display contained contains=pythonBytesEscape,pythonBytesEscapeError +endif + +syn match pythonBytesEscape +\\[abfnrtv'"\\]+ display contained +syn match pythonBytesEscape "\\\o\o\=\o\=" display contained +syn match pythonBytesEscapeError "\\\o\{,2}[89]" display contained +syn match pythonBytesEscape "\\x\x\{2}" display contained +syn match pythonBytesEscapeError "\\x\x\=\X" display contained +syn match pythonBytesEscape "\\$" + +syn match pythonUniEscape "\\u\x\{4}" display contained +syn match pythonUniEscapeError "\\u\x\{,3}\X" display contained +syn match pythonUniEscape "\\U\x\{8}" display contained +syn match pythonUniEscapeError "\\U\x\{,7}\X" display contained +syn match pythonUniEscape "\\N{[A-Z ]\+}" display contained +syn match pythonUniEscapeError "\\N{[^A-Z ]\+}" display contained + +if s:Python2Syntax() + " Python 2 Unicode strings + syn region pythonUniString start=+[uU]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonUniString start=+[uU]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonUniString start=+[uU]"""+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell + syn region pythonUniString start=+[uU]'''+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell +else + " Python 3 strings + syn region pythonString start=+'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,@Spell + syn region pythonString start=+"""+ end=+"""+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest2,pythonSpaceError,@Spell + syn region pythonString start=+'''+ end=+'''+ keepend contains=pythonBytesEscape,pythonBytesEscapeError,pythonUniEscape,pythonUniEscapeError,pythonDocTest,pythonSpaceError,@Spell +endif + +if s:Python2Syntax() + " Python 2 Unicode raw strings + syn region pythonUniRawString start=+[uU][rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell + syn region pythonUniRawString start=+[uU][rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,pythonUniRawEscape,pythonUniRawEscapeError,@Spell + syn region pythonUniRawString start=+[uU][rR]"""+ end=+"""+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest2,pythonSpaceError,@Spell + syn region pythonUniRawString start=+[uU][rR]'''+ end=+'''+ keepend contains=pythonUniRawEscape,pythonUniRawEscapeError,pythonDocTest,pythonSpaceError,@Spell + + syn match pythonUniRawEscape "\([^\\]\(\\\\\)*\)\@<=\\u\x\{4}" display contained + syn match pythonUniRawEscapeError "\([^\\]\(\\\\\)*\)\@<=\\u\x\{,3}\X" display contained +endif + +" Python 2/3 raw strings +if s:Python2Syntax() + syn region pythonRawString start=+[bB]\=[rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[bB]\=[rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[bB]\=[rR]"""+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell + syn region pythonRawString start=+[bB]\=[rR]'''+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell +else + syn region pythonRawString start=+[rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawString start=+[rR]"""+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell + syn region pythonRawString start=+[rR]'''+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell + + syn region pythonRawBytes start=+[bB][rR]'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawBytes start=+[bB][rR]"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=pythonRawEscape,@Spell + syn region pythonRawBytes start=+[bB][rR]"""+ end=+"""+ keepend contains=pythonDocTest2,pythonSpaceError,@Spell + syn region pythonRawBytes start=+[bB][rR]'''+ end=+'''+ keepend contains=pythonDocTest,pythonSpaceError,@Spell +endif + +syn match pythonRawEscape +\\['"]+ display transparent contained + +if s:Enabled("g:python_highlight_string_formatting") + " % operator string formatting + if s:Python2Syntax() + syn match pythonStrFormatting "%\%(([^)]\+)\)\=[-#0 +]*\d*\%(\.\d\+\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrFormatting "%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + else + syn match pythonStrFormatting "%\%(([^)]\+)\)\=[-#0 +]*\d*\%(\.\d\+\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonRawString + syn match pythonStrFormatting "%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)\=[hlL]\=[diouxXeEfFgGcrs%]" contained containedin=pythonString,pythonRawString + endif +endif + +if s:Enabled("g:python_highlight_string_format") + " str.format syntax + if s:Python2Syntax() + syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrFormat "{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + else + syn match pythonStrFormat "{{\|}}" contained containedin=pythonString,pythonRawString + syn match pythonStrFormat "{\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)\=\%(\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\[\%(\d\+\|[^!:\}]\+\)\]\)*\%(![rsa]\)\=\%(:\%({\%(\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*\|\d\+\)}\|\%([^}]\=[<>=^]\)\=[ +-]\=#\=0\=\d*,\=\%(\.\d\+\)\=[bcdeEfFgGnosxX%]\=\)\=\)\=}" contained containedin=pythonString,pythonRawString + endif +endif + +if s:Enabled("g:python_highlight_string_templates") + " string.Template format + if s:Python2Syntax() + syn match pythonStrTemplate "\$\$" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrTemplate "\${[a-zA-Z_][a-zA-Z0-9_]*}" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + syn match pythonStrTemplate "\$[a-zA-Z_][a-zA-Z0-9_]*" contained containedin=pythonString,pythonUniString,pythonUniRawString,pythonRawString + else + syn match pythonStrTemplate "\$\$" contained containedin=pythonString,pythonRawString + syn match pythonStrTemplate "\${[a-zA-Z_][a-zA-Z0-9_]*}" contained containedin=pythonString,pythonRawString + syn match pythonStrTemplate "\$[a-zA-Z_][a-zA-Z0-9_]*" contained containedin=pythonString,pythonRawString + endif +endif + +if s:Enabled("g:python_highlight_doctests") + " DocTests + syn region pythonDocTest start="^\s*>>>" end=+'''+he=s-1 end="^\s*$" contained + syn region pythonDocTest2 start="^\s*>>>" end=+"""+he=s-1 end="^\s*$" contained +endif + +" +" Numbers (ints, longs, floats, complex) +" + +if s:Python2Syntax() + syn match pythonHexError "\<0[xX]\x*[g-zG-Z]\+\x*[lL]\=\>" display + syn match pythonOctError "\<0[oO]\=\o*\D\+\d*[lL]\=\>" display + syn match pythonBinError "\<0[bB][01]*\D\+\d*[lL]\=\>" display + + syn match pythonHexNumber "\<0[xX]\x\+[lL]\=\>" display + syn match pythonOctNumber "\<0[oO]\o\+[lL]\=\>" display + syn match pythonBinNumber "\<0[bB][01]\+[lL]\=\>" display + + syn match pythonNumberError "\<\d\+\D[lL]\=\>" display + syn match pythonNumber "\<\d[lL]\=\>" display + syn match pythonNumber "\<[0-9]\d\+[lL]\=\>" display + syn match pythonNumber "\<\d\+[lLjJ]\>" display + + syn match pythonOctError "\<0[oO]\=\o*[8-9]\d*[lL]\=\>" display + syn match pythonBinError "\<0[bB][01]*[2-9]\d*[lL]\=\>" display +else + syn match pythonHexError "\<0[xX]\x*[g-zG-Z]\x*\>" display + syn match pythonOctError "\<0[oO]\=\o*\D\+\d*\>" display + syn match pythonBinError "\<0[bB][01]*\D\+\d*\>" display + + syn match pythonHexNumber "\<0[xX]\x\+\>" display + syn match pythonOctNumber "\<0[oO]\o\+\>" display + syn match pythonBinNumber "\<0[bB][01]\+\>" display + + syn match pythonNumberError "\<\d\+\D\>" display + syn match pythonNumberError "\<0\d\+\>" display + syn match pythonNumber "\<\d\>" display + syn match pythonNumber "\<[1-9]\d\+\>" display + syn match pythonNumber "\<\d\+[jJ]\>" display + + syn match pythonOctError "\<0[oO]\=\o*[8-9]\d*\>" display + syn match pythonBinError "\<0[bB][01]*[2-9]\d*\>" display +endif + +syn match pythonFloat "\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>" display +syn match pythonFloat "\<\d\+[eE][+-]\=\d\+[jJ]\=\>" display +syn match pythonFloat "\<\d\+\.\d*\%([eE][+-]\=\d\+\)\=[jJ]\=" display + +" +" Builtin objects and types +" + +if s:Enabled("g:python_highlight_builtin_objs") + if s:Python2Syntax() + syn keyword pythonBuiltinObj None + syn keyword pythonBoolean True False + endif + syn keyword pythonBuiltinObj Ellipsis NotImplemented + syn keyword pythonBuiltinObj __debug__ __doc__ __file__ __name__ __package__ +endif + +" +" Builtin functions +" + +if s:Enabled("g:python_highlight_builtin_funcs") + if s:Python2Syntax() + syn keyword pythonBuiltinFunc apply basestring buffer callable coerce + syn keyword pythonBuiltinFunc execfile file help intern long raw_input + syn keyword pythonBuiltinFunc reduce reload unichr unicode xrange + if s:Enabled("g:python_print_as_function") + syn keyword pythonBuiltinFunc print + endif + else + syn keyword pythonBuiltinFunc ascii exec memoryview print + endif + syn keyword pythonBuiltinFunc __import__ abs all any + syn keyword pythonBuiltinFunc bin bool bytearray bytes + syn keyword pythonBuiltinFunc chr classmethod cmp compile complex + syn keyword pythonBuiltinFunc delattr dict dir divmod enumerate eval + syn keyword pythonBuiltinFunc filter float format frozenset getattr + syn keyword pythonBuiltinFunc globals hasattr hash hex id + syn keyword pythonBuiltinFunc input int isinstance + syn keyword pythonBuiltinFunc issubclass iter len list locals map max + syn keyword pythonBuiltinFunc min next object oct open ord + syn keyword pythonBuiltinFunc pow property range + syn keyword pythonBuiltinFunc repr reversed round set setattr + syn keyword pythonBuiltinFunc slice sorted staticmethod str sum super tuple + syn keyword pythonBuiltinFunc type vars zip +endif + +" +" Builtin exceptions and warnings +" + +if s:Enabled("g:python_highlight_exceptions") + if s:Python2Syntax() + syn keyword pythonExClass StandardError + else + syn keyword pythonExClass BlockingIOError ChildProcessError + syn keyword pythonExClass ConnectionError BrokenPipeError + syn keyword pythonExClass ConnectionAbortedError ConnectionRefusedError + syn keyword pythonExClass ConnectionResetError FileExistsError + syn keyword pythonExClass FileNotFoundError InterruptedError + syn keyword pythonExClass IsADirectoryError NotADirectoryError + syn keyword pythonExClass PermissionError ProcessLookupError TimeoutError + + syn keyword pythonExClass ResourceWarning + endif + syn keyword pythonExClass BaseException + syn keyword pythonExClass Exception ArithmeticError + syn keyword pythonExClass LookupError EnvironmentError + + syn keyword pythonExClass AssertionError AttributeError BufferError EOFError + syn keyword pythonExClass FloatingPointError GeneratorExit IOError + syn keyword pythonExClass ImportError IndexError KeyError + syn keyword pythonExClass KeyboardInterrupt MemoryError NameError + syn keyword pythonExClass NotImplementedError OSError OverflowError + syn keyword pythonExClass ReferenceError RuntimeError StopIteration + syn keyword pythonExClass SyntaxError IndentationError TabError + syn keyword pythonExClass SystemError SystemExit TypeError + syn keyword pythonExClass UnboundLocalError UnicodeError + syn keyword pythonExClass UnicodeEncodeError UnicodeDecodeError + syn keyword pythonExClass UnicodeTranslateError ValueError VMSError + syn keyword pythonExClass WindowsError ZeroDivisionError + + syn keyword pythonExClass Warning UserWarning BytesWarning DeprecationWarning + syn keyword pythonExClass PendingDepricationWarning SyntaxWarning + syn keyword pythonExClass RuntimeWarning FutureWarning + syn keyword pythonExClass ImportWarning UnicodeWarning +endif + +if s:Enabled("g:python_slow_sync") + syn sync minlines=2000 +else + " This is fast but code inside triple quoted strings screws it up. It + " is impossible to fix because the only way to know if you are inside a + " triple quoted string is to start from the beginning of the file. + syn sync match pythonSync grouphere NONE "):$" + syn sync maxlines=200 +endif + +if version >= 508 || !exists("did_python_syn_inits") + if version <= 508 + let did_python_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink pythonStatement Statement + HiLink pythonImport Include + HiLink pythonFunction Function + HiLink pythonConditional Conditional + HiLink pythonRepeat Repeat + HiLink pythonException Exception + HiLink pythonOperator Operator + + HiLink pythonDecorator Define + HiLink pythonDottedName Function + HiLink pythonDot Normal + + HiLink pythonComment Comment + if !s:Enabled("g:python_highlight_file_headers_as_comments") + HiLink pythonCoding Special + HiLink pythonRun Special + endif + HiLink pythonTodo Todo + + HiLink pythonError Error + HiLink pythonIndentError Error + HiLink pythonSpaceError Error + + HiLink pythonString String + HiLink pythonRawString String + + HiLink pythonUniEscape Special + HiLink pythonUniEscapeError Error + + if s:Python2Syntax() + HiLink pythonUniString String + HiLink pythonUniRawString String + HiLink pythonUniRawEscape Special + HiLink pythonUniRawEscapeError Error + else + HiLink pythonBytes String + HiLink pythonRawBytes String + HiLink pythonBytesContent String + HiLink pythonBytesError Error + HiLink pythonBytesEscape Special + HiLink pythonBytesEscapeError Error + endif + + HiLink pythonStrFormatting Special + HiLink pythonStrFormat Special + HiLink pythonStrTemplate Special + + HiLink pythonDocTest Special + HiLink pythonDocTest2 Special + + HiLink pythonNumber Number + HiLink pythonHexNumber Number + HiLink pythonOctNumber Number + HiLink pythonBinNumber Number + HiLink pythonFloat Float + HiLink pythonNumberError Error + HiLink pythonOctError Error + HiLink pythonHexError Error + HiLink pythonBinError Error + + HiLink pythonBoolean Boolean + + HiLink pythonBuiltinObj Structure + HiLink pythonBuiltinFunc Function + + HiLink pythonExClass Structure + + delcommand HiLink +endif + +let b:current_syntax = "python" diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/airline/themes/gruvbox.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/airline/themes/gruvbox.vim new file mode 100644 index 0000000..6862a81 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/airline/themes/gruvbox.vim @@ -0,0 +1,79 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Airline +" Author: morhetz +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 12 Aug 2017 +" ----------------------------------------------------------------------------- + +let g:airline#themes#gruvbox#palette = {} + +function! airline#themes#gruvbox#refresh() + + let M0 = airline#themes#get_highlight('Identifier') + let accents_group = airline#themes#get_highlight('Special') + let modified_group = [M0[0], '', M0[2], '', ''] + let warning_group = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg']) + let error_group = airline#themes#get_highlight2(['Normal', 'bg'], ['WarningMsg', 'fg']) + + let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['StatusLineNC', 'bg']) + let s:N2 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['Pmenu', 'bg']) + let s:N3 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['CursorLine', 'bg']) + let g:airline#themes#gruvbox#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + let g:airline#themes#gruvbox#palette.normal_modified = { 'airline_c': modified_group } + let g:airline#themes#gruvbox#palette.normal.airline_warning = warning_group + let g:airline#themes#gruvbox#palette.normal_modified.airline_warning = warning_group + let g:airline#themes#gruvbox#palette.normal.airline_error = error_group + let g:airline#themes#gruvbox#palette.normal_modified.airline_error = error_group + + let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Identifier', 'fg']) + let s:I2 = s:N2 + let s:I3 = airline#themes#get_highlight2(['Normal', 'fg'], ['Pmenu', 'bg']) + let g:airline#themes#gruvbox#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) + let g:airline#themes#gruvbox#palette.insert_modified = g:airline#themes#gruvbox#palette.normal_modified + let g:airline#themes#gruvbox#palette.insert.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning + let g:airline#themes#gruvbox#palette.insert_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning + let g:airline#themes#gruvbox#palette.insert.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error + let g:airline#themes#gruvbox#palette.insert_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error + + let s:R1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Structure', 'fg']) + let s:R2 = s:I2 + let s:R3 = s:I3 + let g:airline#themes#gruvbox#palette.replace = airline#themes#generate_color_map(s:R1, s:R2, s:R3) + let g:airline#themes#gruvbox#palette.replace_modified = g:airline#themes#gruvbox#palette.normal_modified + let g:airline#themes#gruvbox#palette.replace.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning + let g:airline#themes#gruvbox#palette.replace_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning + let g:airline#themes#gruvbox#palette.replace.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error + let g:airline#themes#gruvbox#palette.replace_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error + + let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg']) + let s:V2 = s:N2 + let s:V3 = airline#themes#get_highlight2(['Normal', 'bg'], ['TabLine', 'fg']) + let g:airline#themes#gruvbox#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) + let g:airline#themes#gruvbox#palette.visual_modified = { 'airline_c': [ s:V3[0], '', s:V3[2], '', '' ] } + let g:airline#themes#gruvbox#palette.visual.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning + let g:airline#themes#gruvbox#palette.visual_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning + let g:airline#themes#gruvbox#palette.visual.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error + let g:airline#themes#gruvbox#palette.visual_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error + + let s:IA = airline#themes#get_highlight2(['TabLine', 'fg'], ['CursorLine', 'bg']) + let g:airline#themes#gruvbox#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) + let g:airline#themes#gruvbox#palette.inactive_modified = { 'airline_c': modified_group } + + let g:airline#themes#gruvbox#palette.accents = { 'red': accents_group } + + let s:TF = airline#themes#get_highlight2(['Normal', 'bg'], ['Normal', 'bg']) + let g:airline#themes#gruvbox#palette.tabline = { + \ 'airline_tab': s:N2, + \ 'airline_tabsel': s:N1, + \ 'airline_tabtype': s:V1, + \ 'airline_tabfill': s:TF, + \ 'airline_tabhid': s:IA, + \ 'airline_tabmod': s:I1 + \ } + +endfunction + +call airline#themes#gruvbox#refresh() + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/airline/themes/quantum.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/airline/themes/quantum.vim new file mode 100644 index 0000000..c446c5a --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/airline/themes/quantum.vim @@ -0,0 +1,42 @@ +let g:airline#themes#quantum#palette = {} + +function! airline#themes#quantum#refresh() + let g:airline#themes#quantum#palette.accents = { + \ 'red': airline#themes#get_highlight('Identifier'), + \ } + + let s:N1 = airline#themes#get_highlight2(['CursorLine', 'bg'], ['Directory', 'fg'], 'bold') + let s:N2 = airline#themes#get_highlight('Pmenu') + let s:N3 = airline#themes#get_highlight('TabLine') + let g:airline#themes#quantum#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + + let group = airline#themes#get_highlight('Type') + let g:airline#themes#quantum#palette.normal_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + let s:I1 = airline#themes#get_highlight2(['CursorLine', 'bg'], ['MoreMsg', 'fg'], 'bold') + let g:airline#themes#quantum#palette.insert = airline#themes#generate_color_map(s:I1, s:N2, s:N3) + let g:airline#themes#quantum#palette.insert_modified = g:airline#themes#quantum#palette.normal_modified + + let s:R1 = airline#themes#get_highlight2(['CursorLine', 'bg'], ['Error', 'fg'], 'bold') + let g:airline#themes#quantum#palette.replace = airline#themes#generate_color_map(s:R1, s:N2, s:N3) + let g:airline#themes#quantum#palette.replace_modified = g:airline#themes#quantum#palette.normal_modified + + let s:V1 = airline#themes#get_highlight2(['CursorLine', 'bg'], ['Statement', 'fg'], 'bold') + let g:airline#themes#quantum#palette.visual = airline#themes#generate_color_map(s:V1, s:N2, s:N3) + let g:airline#themes#quantum#palette.visual_modified = g:airline#themes#quantum#palette.normal_modified + + let s:IA = airline#themes#get_highlight2(['NonText', 'fg'], ['CursorLine', 'bg']) + let g:airline#themes#quantum#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) + let g:airline#themes#quantum#palette.inactive_modified = g:airline#themes#quantum#palette.normal_modified + + if get(g:, 'loaded_ctrlp', 0) + let g:airline#themes#quantum#palette.ctrlp = airline#extensions#ctrlp#generate_color_map( + \ airline#themes#get_highlight('CursorLine'), + \ airline#themes#get_highlight2(['Operator', 'fg'], ['Normal', 'bg']), + \ airline#themes#get_highlight2(['Normal', 'bg'], ['Operator', 'fg'], 'bold')) + endif +endfun + +call airline#themes#quantum#refresh() diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/plug.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/plug.vim new file mode 100644 index 0000000..78fdc03 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/autoload/plug.vim @@ -0,0 +1,2597 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-master branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if &shell =~# 'powershell\.exe' + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win && a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') || has('wsl') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = get(spec, 'branch', 'master') + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ plug#shellescape(spec.uri, {'script': 0}), + \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +function! plug#shellescape(arg, ...) + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\.exe' + return s:shellesc_cmd(a:arg, script) + elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp))) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let cmd = 'git log --graph --color=never ' + \ . (s:git_version_requirement(2, 10, 0) ? '--no-show-signature ' : '') + \ . join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)')) + if has_key(v, 'rtp') + let cmd .= ' -- '.plug#shellescape(v.rtp) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@`-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +let s:me = resolve(expand(':p')) +let s:base_spec = { 'branch': 'master', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(fnamemodify(expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('Call plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if exists('g:did_load_filetypes') + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +if s:is_win + function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction +else + function! s:rtp(spec) + return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + endfunction + + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]).'/**' + for dir in ['ftdetect', 'ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + if type == s:TYPE.string + let opts.tag = a:arg + elseif type == s:TYPE.dict + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-/ + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :if b:plug_preview==1pcendifbd + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if s:is_win + set shell=cmd.exe shellcmdflag=/c shellredir=>%s\ 2>&1 + elseif a:swap + set shell=sh shellredir=>%s\ 2>&1 + endif + return prev +endfunction + +function! s:bang(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:system('git rev-parse HEAD', a:spec.dir) + if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:system( + \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + let s:clone_opt = get(g:, 'plug_shallow', 1) ? + \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + + if has('win32unix') + let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + else + let branch = s:esc(get(spec, 'branch', 'master')) + call s:log4(name, 'Merging origin/'.branch) + let out = s:system('git checkout -q '.branch.' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return a:event == 'stdout' ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'batchfile': (s:is_win && (s:nvim || s:vim8)) ? tempname().'.bat' : '', + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd + if !empty(job.batchfile) + call writefile(["@echo off\r", cmd . "\r"], job.batchfile) + let cmd = job.batchfile + endif + let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], cmd) + + if s:nvim + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = jobstart(argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', [cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + if has_key(job, 'batchfile') && !empty(job.batchfile) + call delete(job.batchfile) + endif + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + for i in range(4, line('$')) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, line('$')) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' + call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + call s:spawn(name, + \ printf('git clone %s %s %s %s 2>&1', + \ has_tag ? '' : s:clone_opt, + \ prog, + \ s:shellesc(spec.uri), + \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = vim.eval('s:clone_opt') +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg) + let escaped = substitute(a:arg, '[&|<>()@^]', '^&', 'g') + let escaped = substitute(escaped, '%', '%%', 'g') + let escaped = substitute(escaped, '"', '\\^&', 'g') + let escaped = substitute(escaped, '\(\\\+\)\(\\^\)', '\1\1\2', 'g') + return '^"'.substitute(escaped, '\(\\\+\)$', '\1\1', '').'^"' +endfunction + +function! s:shellesc(arg) + if &shell =~# 'cmd.exe$' + return s:shellesc_cmd(a:arg) + endif + return shellescape(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir) + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +endfunction + +function! s:system(cmd, ...) + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + return system(s:is_win ? '('.cmd.')' : cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let remote = result[-1] + if v:shell_error + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) + let sha = result[-1] + if v:shell_error + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let branch = result[0] + " Check tag + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif a:spec.branch !=# branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ branch, a:spec.branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system(printf( + \ 'git rev-list --count --left-right HEAD...origin/%s', + \ a:spec.branch), a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ a:spec.branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + call s:rm_rf(line[2:]) + setlocal modifiable + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + call setline(4, printf('Removed %d directories.', s:clean_count)) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(printf('git clone --depth 1 %s %s', s:shellesc(s:plug_src), s:shellesc(tmp))) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' sha + else + execute 'pedit' sha + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.s:shellesc(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let batchfile = tempname().'.bat' + call writefile(["@echo off\r", cmd . "\r"], batchfile) + let cmd = batchfile + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' + let cmd = 'git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 's:shellesc(v:val)')) + if has_key(v, 'rtp') + let cmd .= ' -- '.s:shellesc(v.rtp) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@= 0.4.3 only.", + "default": false + }, + "suggest.disableKind": { + "type": "boolean", + "description": "Remove kind field from vim complete item.", + "default": false + }, + "suggest.disableMenu": { + "type": "boolean", + "description": "Remove menu field from vim complete item.", + "default": false + }, + "suggest.disableMenuShortcut": { + "type": "boolean", + "description": "Disable shortcut of completion source in menu.", + "default": false + }, + "suggest.snippetIndicator": { + "type": "string", + "default": "~", + "description": "The character used in abbr of complete item to indicate the item could be expand as snippet." + }, + "suggest.maxCompleteItemCount": { + "type": "number", + "default": 50, + "description": "Maximum number of complete items shown in vim" + }, + "suggest.preferCompleteThanJumpPlaceholder": { + "type": "boolean", + "description": "Confirm completion instead of jump to next placeholder when completion is activated.", + "default": false + }, + "suggest.fixInsertedWord": { + "type": "boolean", + "description": "Make inserted word replace word characters after cursor position.", + "default": true + }, + "suggest.localityBonus": { + "type": "boolean", + "description": "Boost suggestions that appear closer to the cursor position.", + "default": true + }, + "suggest.triggerAfterInsertEnter": { + "type": "boolean", + "description": "Trigger completion after InsertEnter, auto trigger should be 'always' to enable this option", + "default": false + }, + "suggest.timeout": { + "type": "integer", + "default": 5000, + "minimum": 500, + "maximum": 15000, + "description": "Timeout for completion, in miliseconds." + }, + "suggest.minTriggerInputLength": { + "type": "number", + "default": 1, + "description": "Mininal input length for trigger completion, default 1" + }, + "suggest.triggerCompletionWait": { + "type": "integer", + "default": 50, + "minimum": 30, + "maximum": 500, + "description": "Wait time between text change and completion start, cancel completion when text changed during wait." + }, + "suggest.echodocSupport": { + "type": "boolean", + "default": false, + "description": "When enabled, add function signature to user_data.signature to support echodoc.vim" + }, + "suggest.acceptSuggestionOnCommitCharacter": { + "type": "boolean", + "default": false, + "description": "Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character. Requires CompleteChanged event to work." + }, + "suggest.noselect": { + "type": "boolean", + "description": "Not make vim select first item on completion start", + "default": true + }, + "suggest.keepCompleteopt": { + "type": "boolean", + "description": "When enabled, completeopt is not overriden, auto completion will be disabled if completeopt doesn't have noinsert and noselect.", + "default": false + }, + "suggest.lowPrioritySourceLimit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Max items count for source priority lower than 90." + }, + "suggest.highPrioritySourceLimit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Max items count for source priority bigger than or equal to 90." + }, + "suggest.removeDuplicateItems": { + "type": "boolean", + "description": "Remove completion items with duplicated word for all sources, snippet items are excluded.", + "default": false + }, + "suggest.defaultSortMethod": { + "type": "string", + "description": "Default sorting behavior for suggested completion items.", + "default": "length", + "enum": ["length", "alphabetical"] + }, + "suggest.completionItemKindLabels": { + "type": "object", + "default": {}, + "description": "Set custom labels to completion items' kinds.", + "properties": { + "text": { "type": "string" }, + "method": { "type": "string" }, + "function": { "type": "string" }, + "constructor": { "type": "string" }, + "field": { "type": "string" }, + "variable": { "type": "string" }, + "class": { "type": "string" }, + "interface": { "type": "string" }, + "module": { "type": "string" }, + "property": { "type": "string" }, + "unit": { "type": "string" }, + "value": { "type": "string" }, + "enum": { "type": "string" }, + "keyword": { "type": "string" }, + "snippet": { "type": "string" }, + "color": { "type": "string" }, + "file": { "type": "string" }, + "reference": { "type": "string" }, + "folder": { "type": "string" }, + "enumMember": { "type": "string" }, + "constant": { "type": "string" }, + "struct": { "type": "string" }, + "event": { "type": "string" }, + "operator": { "type": "string" }, + "typeParameter": { "type": "string" }, + "default": { "type": "string" } + }, + "additionalProperties": false + }, + "suggest.invalidInsertCharacters": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Invalid character for strip valid word when inserting text of complete item.", + "default": [" ", "(", "<", "{", "[", "\r", "\n"] + }, + "suggest.asciiCharactersOnly": { + "type": "boolean", + "description": "Suggest ASCII characters only", + "default": false + }, + "diagnostic.enable": { + "type": "boolean", + "description": "Set to false to disable diagnostic display", + "default": true + }, + "diagnostic.level": { + "type": "string", + "description": "Used for filter diagnostics by diagnostic severity.", + "default": "hint", + "enum": ["hint", "information", "warning", "error"] + }, + "diagnostic.checkCurrentLine": { + "type": "boolean", + "description": "When enabled, show all diagnostics of current line if there are none at the current position.", + "default": false + }, + "diagnostic.messageTarget": { + "type": "string", + "description": "Diagnostic message target.", + "default": "float", + "enum": ["echo", "float"] + }, + "diagnostic.messageDelay": { + "type": "number", + "description": "How long to wait (in milliseconds) before displaying the diagnostic message with echo or float", + "default": 200 + }, + "diagnostic.refreshOnInsertMode": { + "type": "boolean", + "description": "Enable diagnostic refresh on insert mode, default false.", + "default": false + }, + "diagnostic.refreshAfterSave": { + "type": "boolean", + "description": "Only refresh diagnostics after save, default false.", + "default": false + }, + "diagnostic.displayByAle": { + "type": "boolean", + "description": "Use Ale for display diagnostics in vim, will disable coc for display diagnostics, restart required on change.", + "default": false + }, + "diagnostic.virtualText": { + "type": "boolean", + "description": "Use NeoVim virtual text to display diagnostics", + "default": false + }, + "diagnostic.virtualTextCurrentLineOnly": { + "type": "boolean", + "description": "Only show virtualText diagnostic on current cursor line", + "default": true + }, + "diagnostic.virtualTextPrefix": { + "type": "string", + "description": "The prefix added virtual text diagnostics", + "default": " " + }, + "diagnostic.virtualTextLines": { + "type": "number", + "description": "The number of non empty lines from a diagnostic to display", + "default": 3 + }, + "diagnostic.virtualTextLineSeparator": { + "type": "string", + "description": "The text that will mark a line end from the diagnostic message", + "default": " \\ " + }, + "diagnostic.enableSign": { + "type": "boolean", + "default": true, + "description": "Enable signs for diagnostics." + }, + "diagnostic.enableHighlightLineNumber": { + "type": "boolean", + "default": true, + "description": "Enable highlighting line numbers for diagnostics, only works with neovim and diagnostic.enableSign is true." + }, + "diagnostic.enableMessage": { + "type": "string", + "default": "always", + "description": "When to enable show messages of diagnostics.", + "enum": ["always", "jump", "never"] + }, + "diagnostic.highlightOffset": { + "type": "number", + "description": "Offset number of buffer.addHighlight, neovim only.", + "default": 1000 + }, + "diagnostic.signOffset": { + "type": "number", + "description": "Offset number of sign", + "default": 1000 + }, + "diagnostic.errorSign": { + "type": "string", + "description": "Text of error sign", + "default": ">>" + }, + "diagnostic.warningSign": { + "type": "string", + "description": "Text of warning sign", + "default": "⚠" + }, + "diagnostic.infoSign": { + "type": "string", + "description": "Text of info sign", + "default": ">>" + }, + "diagnostic.hintSign": { + "type": "string", + "description": "Text of hint sign", + "default": ">>" + }, + "diagnostic.maxWindowHeight": { + "type": "number", + "description": "Maximum height of diagnostics floating window.", + "default": 8 + }, + "diagnostic.maxWindowWidth": { + "type": "number", + "description": "Maximum width of diagnostics floating window.", + "default": 80 + }, + "diagnostic.filetypeMap": { + "type": "object", + "description": "A map between buffer filetype and the filetype assigned to diagnostics. To syntax highlight diagnostics withs their parent buffer type use `\"default\": \"bufferType\"`", + "default": {} + }, + "diagnostic.format": { + "type": "string", + "description": "Define the diagnostic format. Available parts: source, code, severity, message", + "default": "[%source%code] [%severity] %message" + }, + "diagnostic.separateRelatedInformationAsDiagnostics": { + "type": "boolean", + "default": false, + "description": "Separate related information as diagnostics" + }, + "signature.enable": { + "type": "boolean", + "description": "Enable signature help when trigger character typed, require restart service on change.", + "default": true + }, + "signature.triggerSignatureWait": { + "type": "integer", + "default": 50, + "minimum": 50, + "maximum": 300, + "description": "Timeout for trigger signature help, in miliseconds." + }, + "signature.target": { + "type": "string", + "description": "Target of signature help, use float when possible by default.", + "enum": ["float", "echo"] + }, + "signature.floatMaxWidth": { + "type": "integer", + "default": 60, + "description": "Max width of signature float window." + }, + "signature.preferShownAbove": { + "type": "boolean", + "description": "Show signature help float window above cursor when possible, require restart service on change.", + "default": true + }, + "signature.hideOnTextChange": { + "type": "boolean", + "description": "Hide signature float window when text changed, require restart service on change.", + "default": false + }, + "signature.maxWindowHeight": { + "type": "number", + "description": "Maximum height of floating signature help window.", + "default": 8 + }, + "codeLens.enable": { + "type": "boolean", + "description": "Enable codeLens feature, require neovim with set virtual text feature.", + "default": false + }, + "codeLens.separator": { + "type": "string", + "description": "Separator text for codeLens in virtual text", + "default": "‣" + }, + "codeLens.subseparator": { + "type": "string", + "description": "Subseparator between codeLenses in virtual text", + "default": " " + }, + "refactor.openCommand": { + "type": "string", + "description": "Open command for refactor window.", + "default": "vsplit" + }, + "refactor.beforeContext": { + "type": "number", + "default": 3, + "description": "Print num lines of leading context before each match." + }, + "refactor.afterContext": { + "type": "number", + "default": 3, + "description": "Print num lines of trailing context after each match." + }, + "workspace.ignoredFiletypes": { + "type": "array", + "default": ["markdown", "log", "txt", "help"], + "description": "Filetypes that should be ignored for resolve workspace folder.", + "items": { + "type": "string" + } + }, + "list.indicator": { + "type": "string", + "default": ">", + "description": "The character used as first character in prompt line" + }, + "list.interactiveDebounceTime": { + "type": "number", + "default": 100, + "description": "Debouce time for input change on interactive mode." + }, + "list.maxHeight": { + "type": "number", + "default": 10, + "description": "Maximum height of list window." + }, + "list.minHeight": { + "type": "number", + "default": 1, + "description": "Minimum height of list window." + }, + "list.signOffset": { + "type": "number", + "default": 900, + "description": "Sign offset of list, should be different from other plugins." + }, + "list.selectedSignText": { + "type": "string", + "default": "*", + "description": "Sign text for selected lines." + }, + "list.extendedSearchMode": { + "type": "boolean", + "default": true, + "description": "Enable extended search mode which allows multiple search patterns delimited by spaces." + }, + "list.autoResize": { + "type": "boolean", + "default": true, + "description": "Enable auto resize feature." + }, + "list.limitLines": { + "type": "number", + "default": 30000, + "description": "Limit lines for list buffer." + }, + "list.maxPreviewHeight": { + "type": "number", + "default": 12, + "description": "Max height for preview window of list." + }, + "list.previewSplitRight": { + "type": "boolean", + "default": false, + "description": "Use vsplit for preview window." + }, + "list.previewHighlightGroup": { + "type": "string", + "default": "Search", + "description": "Highlight group used for highlight the range in preview window." + }, + "list.nextKeymap": { + "type": "string", + "default": "", + "description": "Key used for select next line on insert mode." + }, + "list.previousKeymap": { + "type": "string", + "default": "", + "description": "Key used for select previous line on insert mode." + }, + "list.normalMappings": { + "type": "object", + "default": {}, + "description": "Custom keymappings on normal mode." + }, + "list.insertMappings": { + "type": "object", + "default": {}, + "description": "Custom keymappings on insert mode." + }, + "list.source.symbols.excludes": { + "type": "array", + "default": [], + "description": "Patterns of mimimatch for filepath to execlude from symbols list.", + "items": { + "type": "string" + } + }, + "list.source.outline.ctagsFilestypes": { + "type": "array", + "default": [], + "description": "Filetypes that should use ctags for outline instead of language server.", + "items": { + "type": "string" + } + }, + "cursors.cancelKey": { + "type": "string", + "default": "", + "description": "Key used for cancel cursors session." + }, + "cursors.nextKey": { + "type": "string", + "default": "", + "description": "Key used for jump to next cursors position. " + }, + "cursors.previousKey": { + "type": "string", + "default": "", + "description": "Key used for jump to previous cursors position." + }, + "coc.preferences.maxFileSize": { + "type": "string", + "default": "10MB", + "description": "Maximum file size in bytes that coc.nvim should handle, default '10MB'" + }, + "coc.preferences.promptWorkspaceEdit": { + "type": "boolean", + "description": "Prompt confirm from user when apply workspace edit for unloaded files.", + "default": true + }, + "coc.preferences.listOfWorkspaceEdit": { + "type": "string", + "default": "quickfix", + "description": "List should contains changed locations after workspace edit, default to vim's quickfix", + "enum": ["quickfix", "location", "none"] + }, + "coc.preferences.useQuickfixForLocations": { + "type": "boolean", + "description": "Use vim's quickfix list for jump locations,\n need restart on change.", + "default": false + }, + "coc.preferences.extensionUpdateCheck": { + "type": "string", + "default": "never", + "description": "Interval for check extension update, could be daily, weekly, never", + "enum": ["daily", "weekly", "never"] + }, + "coc.preferences.snippetStatusText": { + "type": "string", + "default": "SNIP", + "description": "Text shown in statusline to indicate snippet session is activated." + }, + "coc.preferences.hoverTarget": { + "type": "string", + "description": "Target to show hover information, default is floating window when possible.", + "enum": ["preview", "echo", "float"] + }, + "coc.preferences.colorSupport": { + "type": "boolean", + "description": "Enable color highlight if language server support it.", + "default": true + }, + "coc.preferences.previewAutoClose": { + "type": "boolean", + "description": "Auto close preview window on cursor move.", + "default": true + }, + "coc.preferences.previewMaxHeight": { + "type": "number", + "default": 12, + "description": "Max height of preview window for hover." + }, + "coc.preferences.currentFunctionSymbolAutoUpdate": { + "type": "boolean", + "description": "Automatically update the value of b:coc_current_function on CursorHold event", + "default": false + }, + "coc.preferences.formatOnSaveFiletypes": { + "type": "array", + "default": [], + "description": "Filetypes that should run format on save.", + "items": { + "type": "string" + } + }, + "coc.preferences.formatOnInsertLeave": { + "type": "boolean", + "description": "Trigger format on type when insert leave by send \n to the server.", + "default": false + }, + "coc.preferences.enableFloatHighlight": { + "type": "boolean", + "description": "Enable highlight for floating window.", + "default": true + }, + "coc.preferences.rootPatterns": { + "type": "array", + "default": [".git", ".hg", ".projections.json"], + "description": "Root patterns to resolve workspaceFolder from parent folders of opened files, resolved from up to down.", + "items": { + "type": "string" + } + }, + "coc.preferences.watchmanPath": { + "type": "string", + "description": "executable path for https://facebook.github.io/watchman/, detected from $PATH by default", + "default": null + }, + "coc.preferences.jumpCommand": { + "type": "string", + "description": "Command used for location jump, like goto definition, goto references etc.", + "default": "edit" + }, + "coc.preferences.messageLevel": { + "type": "string", + "description": "Message level for filter echoed messages, could be 'more', 'warning' and 'error'", + "default": "more", + "enum": ["more", "warning", "error"] + }, + "coc.preferences.bracketEnterImprove": { + "type": "boolean", + "description": "Improve enter inside bracket `<> {} [] ()` by add new empty line below and place cursor to it. Works with `coc#on_enter()`", + "default": true + }, + "coc.preferences.formatOnType": { + "type": "boolean", + "description": "Set to true to enable format on type", + "default": false + }, + "coc.preferences.formatOnTypeFiletypes": { + "type": "array", + "default": [], + "description": "Filetypes that should run format on typing. Only take effect when `coc.preferences.formatOnType` set `true`", + "items": { + "type": "string" + } + }, + "coc.preferences.highlightTimeout": { + "type": "integer", + "default": 500, + "minimum": 200, + "maximum": 5000, + "description": "Highlight timeout for buffer in floating window." + }, + "coc.preferences.snippets.enable": { + "type": "boolean", + "description": "Set to false to disable snippets support.", + "default": true + }, + "coc.source.around.enable": { + "type": "boolean", + "default": true + }, + "coc.source.around.firstMatch": { + "type": "boolean", + "description": "Filter complete items by first letter strict match.", + "default": true + }, + "coc.source.around.shortcut": { + "type": "string", + "default": "A" + }, + "coc.source.around.priority": { + "type": "integer", + "default": 1 + }, + "coc.source.around.disableSyntaxes": { + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "coc.source.buffer.enable": { + "type": "boolean", + "default": true + }, + "coc.source.buffer.shortcut": { + "type": "string", + "default": "B" + }, + "coc.source.buffer.priority": { + "type": "integer", + "default": 1 + }, + "coc.source.buffer.firstMatch": { + "type": "boolean", + "description": "Filter complete items by first letter strict match.", + "default": true + }, + "coc.source.buffer.ignoreGitignore": { + "type": "boolean", + "default": true, + "description": "Ignore git ignored files for buffer words" + }, + "coc.source.buffer.disableSyntaxes": { + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "coc.source.file.enable": { + "type": "boolean", + "default": true + }, + "coc.source.file.shortcut": { + "type": "string", + "default": "F" + }, + "coc.source.file.priority": { + "type": "integer", + "default": 10 + }, + "coc.source.file.disableSyntaxes": { + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "coc.source.file.triggerCharacters": { + "type": "array", + "default": ["/"], + "items": { + "type": "string" + } + }, + "coc.source.file.trimSameExts": { + "type": "array", + "default": [".ts", ".js"], + "description": "Trim same extension on file completion", + "items": { + "type": "string" + } + }, + "coc.source.file.ignoreHidden": { + "type": "boolean", + "default": true, + "description": "Ignore completion for hidden files" + }, + "coc.source.file.ignorePatterns": { + "type": "array", + "default": [], + "description": "Ignore patterns of matcher", + "items": { + "type": "string" + } + }, + "languageserver": { + "type": "object", + "default": {}, + "description": "Dictionary of languageservers, key is used as id of languageserver.", + "patternProperties": { + "^[_a-zA-Z]+$": { + "oneOf": [ + { + "$ref": "#/definitions/languageServerModule" + }, + { + "$ref": "#/definitions/languageServerCommand" + }, + { + "$ref": "#/definitions/languageServerSocket" + } + ] + } + } + } + }, + "cSpell.ignoreWords": [ + "", + "postgresql", + "pytest", + "sigint", + "trainsets" + ], + "clangd.path": "/home/matt/.config/coc/extensions/coc-clangd-data/install/10.0.0/clangd_10.0.0/bin/clangd" + } + diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/PaperColor.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/PaperColor.vim new file mode 100644 index 0000000..e03886b --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/PaperColor.vim @@ -0,0 +1,2238 @@ +" Theme: PaperColor +" Author: Nikyle Nguyen +" License: MIT +" Source: http://github.com/NLKNguyen/papercolor-theme + +let s:version = '0.9.x' + +" Note on navigating this source code: +" - Use folding feature to collapse/uncollapse blocks of marked code +" zM to fold all markers in this file to see the structure of the source code +" zR to unfold all recursively +" za to toggle a fold +" See: http://vim.wikia.com/wiki/Folding +" - The main section is at the end where the functions are called in order. + +" Theme Repository: {{{ + +let s:themes = {} + +" }}} + +fun! s:register_default_theme() + " Theme name should be lowercase + let s:themes['default'] = { + \ 'maintainer' : 'Nikyle Nguyen ', + \ 'source' : 'http://github.com/NLKNguyen/papercolor-theme', + \ 'description' : 'The original PaperColor Theme, inspired by Google Material Design', + \ 'options' : { + \ 'allow_bold': 1 + \ } + \ } + + " Theme can have 'light' and/or 'dark' color palette. + " Color values can be HEX and/or 256-color. Use empty string '' if not provided. + " Only color00 -> color15 are required. The rest are optional. + let s:themes['default'].light = { + \ 'NO_CONVERSION': 1, + \ 'TEST_256_COLOR_CONSISTENCY' : 1, + \ 'palette' : { + \ 'color00' : ['#eeeeee', '255'], + \ 'color01' : ['#af0000', '124'], + \ 'color02' : ['#008700', '28'], + \ 'color03' : ['#5f8700', '64'], + \ 'color04' : ['#0087af', '31'], + \ 'color05' : ['#878787', '102'], + \ 'color06' : ['#005f87', '24'], + \ 'color07' : ['#444444', '238'], + \ 'color08' : ['#bcbcbc', '250'], + \ 'color09' : ['#d70000', '160'], + \ 'color10' : ['#d70087', '162'], + \ 'color11' : ['#8700af', '91'], + \ 'color12' : ['#d75f00', '166'], + \ 'color13' : ['#d75f00', '166'], + \ 'color14' : ['#005faf', '25'], + \ 'color15' : ['#005f87', '24'], + \ 'color16' : ['#0087af', '31'], + \ 'color17' : ['#008700', '28'], + \ 'cursor_fg' : ['#eeeeee', '255'], + \ 'cursor_bg' : ['#005f87', '24'], + \ 'cursorline' : ['#e4e4e4', '254'], + \ 'cursorcolumn' : ['#e4e4e4', '254'], + \ 'cursorlinenr_fg' : ['#af5f00', '130'], + \ 'cursorlinenr_bg' : ['#eeeeee', '255'], + \ 'popupmenu_fg' : ['#444444', '238'], + \ 'popupmenu_bg' : ['#d0d0d0', '252'], + \ 'search_fg' : ['#444444', '238'], + \ 'search_bg' : ['#ffff5f', '227'], + \ 'linenumber_fg' : ['#b2b2b2', '249'], + \ 'linenumber_bg' : ['#eeeeee', '255'], + \ 'vertsplit_fg' : ['#005f87', '24'], + \ 'vertsplit_bg' : ['#eeeeee', '255'], + \ 'statusline_active_fg' : ['#e4e4e4', '254'], + \ 'statusline_active_bg' : ['#005f87', '24'], + \ 'statusline_inactive_fg' : ['#444444', '238'], + \ 'statusline_inactive_bg' : ['#d0d0d0', '252'], + \ 'todo_fg' : ['#00af5f', '35'], + \ 'todo_bg' : ['#eeeeee', '255'], + \ 'error_fg' : ['#af0000', '124'], + \ 'error_bg' : ['#ffd7ff', '225'], + \ 'matchparen_bg' : ['#c6c6c6', '251'], + \ 'matchparen_fg' : ['#005f87', '24'], + \ 'visual_fg' : ['#eeeeee', '255'], + \ 'visual_bg' : ['#0087af', '31'], + \ 'folded_fg' : ['#0087af', '31'], + \ 'folded_bg' : ['#afd7ff', '153'], + \ 'wildmenu_fg': ['#444444', '238'], + \ 'wildmenu_bg': ['#ffff00', '226'], + \ 'spellbad': ['#ffafd7', '218'], + \ 'spellcap': ['#ffffaf', '229'], + \ 'spellrare': ['#afff87', '156'], + \ 'spelllocal': ['#d7d7ff', '189'], + \ 'diffadd_fg': ['#008700', '28'], + \ 'diffadd_bg': ['#afffaf', '157'], + \ 'diffdelete_fg': ['#af0000', '124'], + \ 'diffdelete_bg': ['#ffd7ff', '225'], + \ 'difftext_fg': ['#0087af', '31'], + \ 'difftext_bg': ['#ffffd7', '230'], + \ 'diffchange_fg': ['#444444', '238'], + \ 'diffchange_bg': ['#ffd787', '222'], + \ 'tabline_bg': ['#005f87', '24'], + \ 'tabline_active_fg': ['#444444', '238'], + \ 'tabline_active_bg': ['#e4e4e4', '254'], + \ 'tabline_inactive_fg': ['#eeeeee', '255'], + \ 'tabline_inactive_bg': ['#0087af', '31'], + \ 'buftabline_bg': ['#005f87', '24'], + \ 'buftabline_current_fg': ['#444444', '238'], + \ 'buftabline_current_bg': ['#e4e4e4', '254'], + \ 'buftabline_active_fg': ['#eeeeee', '255'], + \ 'buftabline_active_bg': ['#005faf', '25'], + \ 'buftabline_inactive_fg': ['#eeeeee', '255'], + \ 'buftabline_inactive_bg': ['#0087af', '31'] + \ } + \ } + + " TODO: idea for subtheme options + " let s:themes['default'].light.subtheme = { + " \ 'alternative' : { + " \ 'options' : { + " \ 'transparent_background': 1 + " \ }, + " \ 'palette' : { + " \ } + " \ } + " \ } + + let s:themes['default'].dark = { + \ 'NO_CONVERSION': 1, + \ 'TEST_256_COLOR_CONSISTENCY' : 1, + \ 'palette' : { + \ 'color00' : ['#1c1c1c', '234'], + \ 'color01' : ['#af005f', '125'], + \ 'color02' : ['#5faf00', '70'], + \ 'color03' : ['#d7af5f', '179'], + \ 'color04' : ['#5fafd7', '74'], + \ 'color05' : ['#808080', '244'], + \ 'color06' : ['#d7875f', '173'], + \ 'color07' : ['#d0d0d0', '252'], + \ 'color08' : ['#585858', '240'], + \ 'color09' : ['#5faf5f', '71'], + \ 'color10' : ['#afd700', '148'], + \ 'color11' : ['#af87d7', '140'], + \ 'color12' : ['#ffaf00', '214'], + \ 'color13' : ['#ff5faf', '205'], + \ 'color14' : ['#00afaf', '37'], + \ 'color15' : ['#5f8787', '66'], + \ 'color16' : ['#5fafd7', '74'], + \ 'color17' : ['#d7af00', '178'], + \ 'cursor_fg' : ['#1c1c1c', '234'], + \ 'cursor_bg' : ['#c6c6c6', '251'], + \ 'cursorline' : ['#303030', '236'], + \ 'cursorcolumn' : ['#303030', '236'], + \ 'cursorlinenr_fg' : ['#ffff00', '226'], + \ 'cursorlinenr_bg' : ['#1c1c1c', '234'], + \ 'popupmenu_fg' : ['#c6c6c6', '251'], + \ 'popupmenu_bg' : ['#303030', '236'], + \ 'search_fg' : ['#000000', '16'], + \ 'search_bg' : ['#00875f', '29'], + \ 'linenumber_fg' : ['#585858', '240'], + \ 'linenumber_bg' : ['#1c1c1c', '234'], + \ 'vertsplit_fg' : ['#5f8787', '66'], + \ 'vertsplit_bg' : ['#1c1c1c', '234'], + \ 'statusline_active_fg' : ['#1c1c1c', '234'], + \ 'statusline_active_bg' : ['#5f8787', '66'], + \ 'statusline_inactive_fg' : ['#bcbcbc', '250'], + \ 'statusline_inactive_bg' : ['#3a3a3a', '237'], + \ 'todo_fg' : ['#ff8700', '208'], + \ 'todo_bg' : ['#1c1c1c', '234'], + \ 'error_fg' : ['#af005f', '125'], + \ 'error_bg' : ['#5f0000', '52'], + \ 'matchparen_bg' : ['#4e4e4e', '239'], + \ 'matchparen_fg' : ['#c6c6c6', '251'], + \ 'visual_fg' : ['#000000', '16'], + \ 'visual_bg' : ['#8787af', '103'], + \ 'folded_fg' : ['#d787ff', '177'], + \ 'folded_bg' : ['#5f005f', '53'], + \ 'wildmenu_fg': ['#1c1c1c', '234'], + \ 'wildmenu_bg': ['#afd700', '148'], + \ 'spellbad': ['#5f0000', '52'], + \ 'spellcap': ['#5f005f', '53'], + \ 'spellrare': ['#005f00', '22'], + \ 'spelllocal': ['#00005f', '17'], + \ 'diffadd_fg': ['#87d700', '112'], + \ 'diffadd_bg': ['#005f00', '22'], + \ 'diffdelete_fg': ['#af005f', '125'], + \ 'diffdelete_bg': ['#5f0000', '52'], + \ 'difftext_fg': ['#5fffff', '87'], + \ 'difftext_bg': ['#008787', '30'], + \ 'diffchange_fg': ['#d0d0d0', '252'], + \ 'diffchange_bg': ['#005f5f', '23'], + \ 'tabline_bg': ['#262626', '235'], + \ 'tabline_active_fg': ['#121212', '233'], + \ 'tabline_active_bg': ['#00afaf', '37'], + \ 'tabline_inactive_fg': ['#bcbcbc', '250'], + \ 'tabline_inactive_bg': ['#585858', '240'], + \ 'buftabline_bg': ['#262626', '235'], + \ 'buftabline_current_fg': ['#121212', '233'], + \ 'buftabline_current_bg': ['#00afaf', '37'], + \ 'buftabline_active_fg': ['#00afaf', '37'], + \ 'buftabline_active_bg': ['#585858', '240'], + \ 'buftabline_inactive_fg': ['#bcbcbc', '250'], + \ 'buftabline_inactive_bg': ['#585858', '240'] + \ } + \ } +endfun + +" ============================ THEME REGISTER ================================= + +" Acquire Theme Data: {{{ + +" Brief: +" Function to get theme information and store in variables for other +" functions to use +" +" Require: +" s:themes collection of all theme palettes +" +" Require Optionally: +" {g:PaperColor_Theme_[s:theme_name]} user custom theme palette +" g:PaperColor_Theme_Options user options +" +" Expose: +" s:theme_name the name of the selected theme +" s:selected_theme the selected theme object (contains palette, etc.) +" s:selected_variant 'light' or 'dark' +" s:palette the palette of selected theme +" s:options user options +fun! s:acquire_theme_data() + + " Get theme name: {{{ + let s:theme_name = 'default' + + if exists("g:PaperColor_Theme") " Users expressed theme preference + let lowercase_theme_name = tolower(g:PaperColor_Theme) + + if lowercase_theme_name !=? 'default' + let theme_identifier = 'PaperColor_' . lowercase_theme_name + let autoload_function = theme_identifier . '#register' + + call {autoload_function}() + + let theme_variable = 'g:' . theme_identifier + + if exists(theme_variable) + let s:theme_name = lowercase_theme_name + let s:themes[s:theme_name] = {theme_variable} + endif + + endif + + endif + " }}} + + if s:theme_name ==? 'default' + " Either no other theme is specified or they failed to load + " Defer loading default theme until now + call s:register_default_theme() + endif + + let s:selected_theme = s:themes[s:theme_name] + + " Get Theme Variant: either dark or light {{{ + let s:selected_variant = 'dark' + + let s:is_dark=(&background == 'dark') + + if s:is_dark + if has_key(s:selected_theme, 'dark') + let s:selected_variant = 'dark' + else " in case the theme only provides the other variant + let s:selected_variant = 'light' + endif + + else " is light background + if has_key(s:selected_theme, 'light') + let s:selected_variant = 'light' + else " in case the theme only provides the other variant + let s:selected_variant = 'dark' + endif + endif + + let s:palette = s:selected_theme[s:selected_variant].palette + + " Systematic User-Config Options: {{{ + " Example config in .vimrc + " let g:PaperColor_Theme_Options = { + " \ 'theme': { + " \ 'default': { + " \ 'allow_bold': 1, + " \ 'allow_italic': 0, + " \ 'transparent_background': 1 + " \ } + " \ }, + " \ 'language': { + " \ 'python': { + " \ 'highlight_builtins' : 1 + " \ }, + " \ 'c': { + " \ 'highlight_builtins' : 1 + " \ }, + " \ 'cpp': { + " \ 'highlight_standard_library': 1 + " \ } + " \ } + " \ } + " + let s:options = {} + + + if exists("g:PaperColor_Theme_Options") + let s:options = g:PaperColor_Theme_Options + endif + " }}} + + " }}} +endfun + + +" }}} + +" Identify Color Mode: {{{ + +fun! s:identify_color_mode() + let s:MODE_16_COLOR = 0 + let s:MODE_256_COLOR = 1 + let s:MODE_GUI_COLOR = 2 + + if has("gui_running") || has('termguicolors') && &termguicolors || has('nvim') && $NVIM_TUI_ENABLE_TRUE_COLOR + let s:mode = s:MODE_GUI_COLOR + elseif (&t_Co >= 256) + let s:mode = s:MODE_256_COLOR + else + let s:mode = s:MODE_16_COLOR + endif +endfun + +" }}} + +" ============================ OPTION HANDLER ================================= + +" Generate Them Option Variables: {{{ + + +fun! s:generate_theme_option_variables() + " 0. All possible theme option names must be registered here + let l:available_theme_options = [ + \ 'allow_bold', + \ 'allow_italic', + \ 'transparent_background', + \ ] + + " 1. Generate variables and set to default value + for l:option in l:available_theme_options + let s:{'themeOpt_' . l:option} = 0 + endfor + + let s:themeOpt_override = {} " special case, this has to be a dictionary + + " 2. Reassign value to the above variables based on theme settings + + " 2.1 In case the theme has top-level options + if has_key(s:selected_theme, 'options') + let l:theme_options = s:selected_theme['options'] + for l:opt_name in keys(l:theme_options) + let s:{'themeOpt_' . l:opt_name} = l:theme_options[l:opt_name] + " echo 's:themeOpt_' . l:opt_name . ' = ' . s:{'themeOpt_' . l:opt_name} + endfor + endif + + " 2.2 In case the theme has specific variant options + if has_key(s:selected_theme[s:selected_variant], 'options') + let l:theme_options = s:selected_theme[s:selected_variant]['options'] + for l:opt_name in keys(l:theme_options) + let s:{'themeOpt_' . l:opt_name} = l:theme_options[l:opt_name] + " echo 's:themeOpt_' . l:opt_name . ' = ' . s:{'themeOpt_' . l:opt_name} + endfor + endif + + + " 3. Reassign value to the above variables which the user customizes + " Part of user-config options + let s:theme_options = {} + if has_key(s:options, 'theme') + let s:theme_options = s:options['theme'] + endif + + " 3.1 In case user sets for a theme without specifying which variant + if has_key(s:theme_options, s:theme_name) + let l:theme_options = s:theme_options[s:theme_name] + for l:opt_name in keys(l:theme_options) + let s:{'themeOpt_' . l:opt_name} = l:theme_options[l:opt_name] + " echo 's:themeOpt_' . l:opt_name . ' = ' . s:{'themeOpt_' . l:opt_name} + endfor + endif + + + " 3.2 In case user sets for a specific variant of a theme + + " Create the string that the user might have set for this theme variant + " for example, 'default.dark' + let l:specific_theme_variant = s:theme_name . '.' . s:selected_variant + + if has_key(s:theme_options, l:specific_theme_variant) + let l:theme_options = s:theme_options[l:specific_theme_variant] + for l:opt_name in keys(l:theme_options) + let s:{'themeOpt_' . l:opt_name} = l:theme_options[l:opt_name] + " echo 's:themeOpt_' . l:opt_name . ' = ' . s:{'themeOpt_' . l:opt_name} + endfor + endif + +endfun +" }}} + +" Check If Theme Has Hint: {{{ +" +" Brief: +" Function to Check if the selected theme and variant has a hint +" +" Details: +" A hint is a known key that has value 1 +" It is not part of theme design but is used for technical purposes +" +" Example: +" If a theme has hint 'NO_CONVERSION', then we can assume that every +" color value is a complete pair, so we don't have to check. + +fun! s:theme_has_hint(hint) + return has_key(s:selected_theme[s:selected_variant], a:hint) && + \ s:selected_theme[s:selected_variant][a:hint] == 1 +endfun +" }}} + +" Set Overriding Colors: {{{ + +fun! s:set_overriding_colors() + + if s:theme_has_hint('NO_CONVERSION') + " s:convert_colors will not do anything, so we take care of conversion + " for the overriding colors that need to be converted + + if s:mode == s:MODE_GUI_COLOR + " if GUI color is not provided, convert from 256 color that must be available + if !empty(s:themeOpt_override) + call s:load_256_to_GUI_converter() + endif + + for l:color in keys(s:themeOpt_override) + let l:value = s:themeOpt_override[l:color] + if l:value[0] == '' + let l:value[0] = s:to_HEX[l:value[1]] + endif + let s:palette[l:color] = l:value + endfor + + elseif s:mode == s:MODE_256_COLOR + " if 256 color is not provided, convert from GUI color that must be available + if !empty(s:themeOpt_override) + call s:load_GUI_to_256_converter() + endif + + for l:color in keys(s:themeOpt_override) + let l:value = s:themeOpt_override[l:color] + if l:value[1] == '' + let l:value[1] = s:to_256(l:value[0]) + endif + let s:palette[l:color] = l:value + endfor + endif + + else " simply set the colors and let s:convert_colors() take care of conversion + + for l:color in keys(s:themeOpt_override) + let s:palette[l:color] = s:themeOpt_override[l:color] + endfor + endif + +endfun +" }}} + +" Generate Language Option Variables: {{{ + +" Brief: +" Function to generate language option variables so that there is no need to +" look up from the dictionary every time the option value is checked in the +" function s:apply_syntax_highlightings() +" +" Require: +" s:options user options +" +" Require Optionally: +" g:PaperColor_Theme_Options user option config in .vimrc +" +" Expose: +" s:langOpt_[LANGUAGE]__[OPTION] variables for language options +" +" Example: +" g:PaperColor_Theme_Options has something like this: +" 'language': { +" \ 'python': { +" \ 'highlight_builtins': 1 +" \ } +" } +" The following variable will be generated: +" s:langOpt_python__highlight_builtins = 1 + +fun! s:generate_language_option_variables() + " 0. All possible theme option names must be registered here + let l:available_language_options = [ + \ 'c__highlight_builtins', + \ 'cpp__highlight_standard_library', + \ 'python__highlight_builtins' + \ ] + + " 1. Generate variables and set to default value + for l:option in l:available_language_options + let s:{'langOpt_' . l:option} = 0 + endfor + + " Part of user-config options + if has_key(s:options, 'language') + let l:language_options = s:options['language'] + " echo l:language_options + for l:lang in keys(l:language_options) + let l:options = l:language_options[l:lang] + " echo l:lang + " echo l:options + for l:option in keys(l:options) + let s:{'langOpt_' . l:lang . '__' . l:option} = l:options[l:option] + " echo 's:langOpt_' . l:lang . '__' . l:option . ' = ' . l:options[l:option] + endfor + endfor + + endif + +endfun +" }}} + +" =========================== COLOR CONVERTER ================================= + +fun! s:load_GUI_to_256_converter() + " GUI-color To 256-color: {{{ + " Returns an approximate grey index for the given grey level + fun! s:grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun! s:grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun! s:grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun! s:rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun! s:rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun! s:rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun! s:colour(r, g, b) + " Get the closest grey + let l:gx = s:grey_number(a:r) + let l:gy = s:grey_number(a:g) + let l:gz = s:grey_number(a:b) + + " Get the closest colour + let l:x = s:rgb_number(a:r) + let l:y = s:rgb_number(a:g) + let l:z = s:rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = s:grey_level(l:gx) - a:r + let l:dgg = s:grey_level(l:gy) - a:g + let l:dgb = s:grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = s:rgb_level(l:gx) - a:r + let l:dg = s:rgb_level(l:gy) - a:g + let l:db = s:rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return s:grey_colour(l:gx) + else + " Use the colour + return s:rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return s:rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the '#rrggbb' hex string + fun! s:to_256(rgb) + let l:r = ("0x" . strpart(a:rgb, 1, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 3, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 5, 2)) + 0 + + return s:colour(l:r, l:g, l:b) + endfun + + + + " }}} +endfun + +fun! s:load_256_to_GUI_converter() +" 256-color To GUI-color: {{{ + +""" Xterm 256 color dictionary +" See: http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html +" +let s:to_HEX = { + \ '00': '#000000', '01': '#800000', '02': '#008000', '03': '#808000', '04': '#000080', + \ '05': '#800080', '06': '#008080', '07': '#c0c0c0', '08': '#808080', '09': '#ff0000', + \ '10': '#00ff00', '11': '#ffff00', '12': '#0000ff', '13': '#ff00ff', '14': '#00ffff', + \ '15': '#ffffff', '16': '#000000', '17': '#00005f', '18': '#000087', '19': '#0000af', + \ '20': '#0000d7', '21': '#0000ff', '22': '#005f00', '23': '#005f5f', '24': '#005f87', + \ '25': '#005faf', '26': '#005fd7', '27': '#005fff', '28': '#008700', '29': '#00875f', + \ '30': '#008787', '31': '#0087af', '32': '#0087d7', '33': '#0087ff', '34': '#00af00', + \ '35': '#00af5f', '36': '#00af87', '37': '#00afaf', '38': '#00afd7', '39': '#00afff', + \ '40': '#00d700', '41': '#00d75f', '42': '#00d787', '43': '#00d7af', '44': '#00d7d7', + \ '45': '#00d7ff', '46': '#00ff00', '47': '#00ff5f', '48': '#00ff87', '49': '#00ffaf', + \ '50': '#00ffd7', '51': '#00ffff', '52': '#5f0000', '53': '#5f005f', '54': '#5f0087', + \ '55': '#5f00af', '56': '#5f00d7', '57': '#5f00ff', '58': '#5f5f00', '59': '#5f5f5f', + \ '60': '#5f5f87', '61': '#5f5faf', '62': '#5f5fd7', '63': '#5f5fff', '64': '#5f8700', + \ '65': '#5f875f', '66': '#5f8787', '67': '#5f87af', '68': '#5f87d7', '69': '#5f87ff', + \ '70': '#5faf00', '71': '#5faf5f', '72': '#5faf87', '73': '#5fafaf', '74': '#5fafd7', + \ '75': '#5fafff', '76': '#5fd700', '77': '#5fd75f', '78': '#5fd787', '79': '#5fd7af', + \ '80': '#5fd7d7', '81': '#5fd7ff', '82': '#5fff00', '83': '#5fff5f', '84': '#5fff87', + \ '85': '#5fffaf', '86': '#5fffd7', '87': '#5fffff', '88': '#870000', '89': '#87005f', + \ '90': '#870087', '91': '#8700af', '92': '#8700d7', '93': '#8700ff', '94': '#875f00', + \ '95': '#875f5f', '96': '#875f87', '97': '#875faf', '98': '#875fd7', '99': '#875fff', + \ '100': '#878700', '101': '#87875f', '102': '#878787', '103': '#8787af', '104': '#8787d7', + \ '105': '#8787ff', '106': '#87af00', '107': '#87af5f', '108': '#87af87', '109': '#87afaf', + \ '110': '#87afd7', '111': '#87afff', '112': '#87d700', '113': '#87d75f', '114': '#87d787', + \ '115': '#87d7af', '116': '#87d7d7', '117': '#87d7ff', '118': '#87ff00', '119': '#87ff5f', + \ '120': '#87ff87', '121': '#87ffaf', '122': '#87ffd7', '123': '#87ffff', '124': '#af0000', + \ '125': '#af005f', '126': '#af0087', '127': '#af00af', '128': '#af00d7', '129': '#af00ff', + \ '130': '#af5f00', '131': '#af5f5f', '132': '#af5f87', '133': '#af5faf', '134': '#af5fd7', + \ '135': '#af5fff', '136': '#af8700', '137': '#af875f', '138': '#af8787', '139': '#af87af', + \ '140': '#af87d7', '141': '#af87ff', '142': '#afaf00', '143': '#afaf5f', '144': '#afaf87', + \ '145': '#afafaf', '146': '#afafd7', '147': '#afafff', '148': '#afd700', '149': '#afd75f', + \ '150': '#afd787', '151': '#afd7af', '152': '#afd7d7', '153': '#afd7ff', '154': '#afff00', + \ '155': '#afff5f', '156': '#afff87', '157': '#afffaf', '158': '#afffd7', '159': '#afffff', + \ '160': '#d70000', '161': '#d7005f', '162': '#d70087', '163': '#d700af', '164': '#d700d7', + \ '165': '#d700ff', '166': '#d75f00', '167': '#d75f5f', '168': '#d75f87', '169': '#d75faf', + \ '170': '#d75fd7', '171': '#d75fff', '172': '#d78700', '173': '#d7875f', '174': '#d78787', + \ '175': '#d787af', '176': '#d787d7', '177': '#d787ff', '178': '#d7af00', '179': '#d7af5f', + \ '180': '#d7af87', '181': '#d7afaf', '182': '#d7afd7', '183': '#d7afff', '184': '#d7d700', + \ '185': '#d7d75f', '186': '#d7d787', '187': '#d7d7af', '188': '#d7d7d7', '189': '#d7d7ff', + \ '190': '#d7ff00', '191': '#d7ff5f', '192': '#d7ff87', '193': '#d7ffaf', '194': '#d7ffd7', + \ '195': '#d7ffff', '196': '#ff0000', '197': '#ff005f', '198': '#ff0087', '199': '#ff00af', + \ '200': '#ff00d7', '201': '#ff00ff', '202': '#ff5f00', '203': '#ff5f5f', '204': '#ff5f87', + \ '205': '#ff5faf', '206': '#ff5fd7', '207': '#ff5fff', '208': '#ff8700', '209': '#ff875f', + \ '210': '#ff8787', '211': '#ff87af', '212': '#ff87d7', '213': '#ff87ff', '214': '#ffaf00', + \ '215': '#ffaf5f', '216': '#ffaf87', '217': '#ffafaf', '218': '#ffafd7', '219': '#ffafff', + \ '220': '#ffd700', '221': '#ffd75f', '222': '#ffd787', '223': '#ffd7af', '224': '#ffd7d7', + \ '225': '#ffd7ff', '226': '#ffff00', '227': '#ffff5f', '228': '#ffff87', '229': '#ffffaf', + \ '230': '#ffffd7', '231': '#ffffff', '232': '#080808', '233': '#121212', '234': '#1c1c1c', + \ '235': '#262626', '236': '#303030', '237': '#3a3a3a', '238': '#444444', '239': '#4e4e4e', + \ '240': '#585858', '241': '#626262', '242': '#6c6c6c', '243': '#767676', '244': '#808080', + \ '245': '#8a8a8a', '246': '#949494', '247': '#9e9e9e', '248': '#a8a8a8', '249': '#b2b2b2', + \ '250': '#bcbcbc', '251': '#c6c6c6', '252': '#d0d0d0', '253': '#dadada', '254': '#e4e4e4', + \ '255': '#eeeeee' } + +" }}} +endfun + +" ========================== ENVIRONMENT ADAPTER ============================== + +" Set Format Attributes: {{{ + +fun! s:set_format_attributes() + " These are the default + if s:mode == s:MODE_GUI_COLOR + let s:ft_bold = " cterm=bold gui=bold " + let s:ft_none = " cterm=none gui=none " + let s:ft_reverse = " cterm=reverse gui=reverse " + let s:ft_italic = " cterm=italic gui=italic " + let s:ft_italic_bold = " cterm=italic,bold gui=italic,bold " + elseif s:mode == s:MODE_256_COLOR + let s:ft_bold = " cterm=bold " + let s:ft_none = " cterm=none " + let s:ft_reverse = " cterm=reverse " + let s:ft_italic = " cterm=italic " + let s:ft_italic_bold = " cterm=italic,bold " + else + let s:ft_bold = "" + let s:ft_none = " cterm=none " + let s:ft_reverse = " cterm=reverse " + let s:ft_italic = "" + let s:ft_italic_bold = "" + endif + + " Unless instructed otherwise either by theme setting or user overriding + + if s:themeOpt_allow_bold == 0 + let s:ft_bold = "" + endif + if s:themeOpt_allow_italic == 0 + let s:ft_italic = "" + let s:ft_italic_bold = s:ft_bold + endif + +endfun + +" }}} + +" Convert Colors If Needed: {{{ +fun! s:convert_colors() + if s:theme_has_hint('NO_CONVERSION') + return + endif + + if s:mode == s:MODE_GUI_COLOR + " if GUI color is not provided, convert from 256 color that must be available + call s:load_256_to_GUI_converter() + + for l:color in keys(s:palette) + let l:value = s:palette[l:color] + if l:value[0] == '' + let l:value[0] = s:to_HEX[l:value[1]] + endif + let s:palette[l:color] = l:value + endfor + + elseif s:mode == s:MODE_256_COLOR + " if 256 color is not provided, convert from GUI color that must be available + call s:load_GUI_to_256_converter() + + for l:color in keys(s:palette) + let l:value = s:palette[l:color] + if l:value[1] == '' + let l:value[1] = s:to_256(l:value[0]) + endif + let s:palette[l:color] = l:value + endfor + endif + " otherwise use the terminal colors and none of the theme colors are used +endfun + +" }}} + +" ============================ COLOR POPULARIZER =============================== + +" Set Color Variables: {{{ +fun! s:set_color_variables() + + " Helper: {{{ + " ------- + " Function to dynamically generate variables that store the color strings + " for setting highlighting. Each color name will have 2 variables with prefix + " s:fg_ and s:bg_. For example: + " if a:color_name is 'Normal' and a:color_value is ['#000000', '0', 'Black'], + " the following 2 variables will be created: + " s:fg_Normal that stores the string ' guifg=#000000 ' + " s:bg_Normal that stores the string ' guibg=#000000 ' + " Depending on the color mode, ctermfg and ctermbg will be either 0 or Black + " + " Rationale: + " The whole purpose is for speed. We generate these ahead of time so that we + " don't have to do look up or do any if-branch when we set the highlightings. + " + " Furthermore, multiple function definitions for each mode actually reduces + " the need for multiple if-branches inside a single function. This is not + " pretty, but Vim Script is slow, so reducing if-branches in function that is + " often called helps speeding things up quite a bit. Think of this like macro. + " + " If you are familiar with the old code base (v0.9 and ealier), this way of + " generate variables dramatically reduces the loading speed. + " None of previous optimization tricks gets anywhere near this. + if s:mode == s:MODE_GUI_COLOR + fun! s:create_color_variables(color_name, rich_color, term_color) + let {'s:fg_' . a:color_name} = ' guifg=' . a:rich_color[0] . ' ' + let {'s:bg_' . a:color_name} = ' guibg=' . a:rich_color[0] . ' ' + endfun + elseif s:mode == s:MODE_256_COLOR + fun! s:create_color_variables(color_name, rich_color, term_color) + let {'s:fg_' . a:color_name} = ' ctermfg=' . a:rich_color[1] . ' ' + let {'s:bg_' . a:color_name} = ' ctermbg=' . a:rich_color[1] . ' ' + endfun + else + fun! s:create_color_variables(color_name, rich_color, term_color) + let {'s:fg_' . a:color_name} = ' ctermfg=' . a:term_color . ' ' + let {'s:bg_' . a:color_name} = ' ctermbg=' . a:term_color . ' ' + endfun + endif + " }}} + + " Color value format: Array [, <256-Base>, <16-Base>] + " 16-Base is terminal's native color palette that can be alternated through + " the terminal settings. The 16-color names are according to `:h cterm-colors` + + " BASIC COLORS: + " color00-15 are required by all themes. + " These are also how the terminal color palette for the target theme should be. + " See README for theme design guideline + " + " An example format of the below variable's value: ['#262626', '234', 'Black'] + " Where the 1st value is HEX color for GUI Vim, 2nd value is for 256-color terminal, + " and the color name on the right is for 16-color terminal (the actual terminal colors + " can be different from what the color names suggest). See :h cterm-colors + " + " Depending on the provided color palette and current Vim, the 1st and 2nd + " parameter might not exist, for example, on 16-color terminal, the variables below + " only store the color names to use the terminal color palette which is the only + " thing available therefore no need for GUI-color or 256-color. + + let color00 = get(s:palette, 'color00') + let color01 = get(s:palette, 'color01') + let color02 = get(s:palette, 'color02') + let color03 = get(s:palette, 'color03') + let color04 = get(s:palette, 'color04') + let color05 = get(s:palette, 'color05') + let color06 = get(s:palette, 'color06') + let color07 = get(s:palette, 'color07') + let color08 = get(s:palette, 'color08') + let color09 = get(s:palette, 'color09') + let color10 = get(s:palette, 'color10') + let color11 = get(s:palette, 'color11') + let color12 = get(s:palette, 'color12') + let color13 = get(s:palette, 'color13') + let color14 = get(s:palette, 'color14') + let color15 = get(s:palette, 'color15') + + call s:create_color_variables('background', color00 , 'Black') + call s:create_color_variables('negative', color01 , 'DarkRed') + call s:create_color_variables('positive', color02 , 'DarkGreen') + call s:create_color_variables('olive', color03 , 'DarkYellow') " string + call s:create_color_variables('neutral', color04 , 'DarkBlue') + call s:create_color_variables('comment', color05 , 'DarkMagenta') + call s:create_color_variables('navy', color06 , 'DarkCyan') " storageclass + call s:create_color_variables('foreground', color07 , 'LightGray') + + call s:create_color_variables('nontext', color08 , 'DarkGray') + call s:create_color_variables('red', color09 , 'LightRed') " import / try/catch + call s:create_color_variables('pink', color10 , 'LightGreen') " statement, type + call s:create_color_variables('purple', color11 , 'LightYellow') " if / conditional + call s:create_color_variables('accent', color12 , 'LightBlue') + call s:create_color_variables('orange', color13 , 'LightMagenta') " number + call s:create_color_variables('blue', color14 , 'LightCyan') " other keyword + call s:create_color_variables('highlight', color15 , 'White') + + " Note: special case for FoldColumn group. I want to get rid of this case. + call s:create_color_variables('transparent', [color00[0], 'none'], 'none') + + " EXTENDED COLORS: + " From here on, all colors are optional and must have default values (3rd parameter of the + " `get` command) that point to the above basic colors in case the target theme doesn't + " provide the extended colors. The default values should be reasonably sensible. + " The terminal color must be provided also. + + call s:create_color_variables('aqua', get(s:palette, 'color16', color14) , 'LightCyan') + call s:create_color_variables('green', get(s:palette, 'color17', color13) , 'LightMagenta') + call s:create_color_variables('wine', get(s:palette, 'color18', color11) , 'LightYellow') + + " LineNumber: when set number + call s:create_color_variables('linenumber_fg', get(s:palette, 'linenumber_fg', color08) , 'DarkGray') + call s:create_color_variables('linenumber_bg', get(s:palette, 'linenumber_bg', color00) , 'Black') + + " Vertical Split: when there are more than 1 window side by side, ex: + call s:create_color_variables('vertsplit_fg', get(s:palette, 'vertsplit_fg', color15) , 'White') + call s:create_color_variables('vertsplit_bg', get(s:palette, 'vertsplit_bg', color00) , 'Black') + + " Statusline: when set status=2 + call s:create_color_variables('statusline_active_fg', get(s:palette, 'statusline_active_fg', color00) , 'Black') + call s:create_color_variables('statusline_active_bg', get(s:palette, 'statusline_active_bg', color15) , 'White') + call s:create_color_variables('statusline_inactive_fg', get(s:palette, 'statusline_inactive_fg', color07) , 'LightGray') + call s:create_color_variables('statusline_inactive_bg', get(s:palette, 'statusline_inactive_bg', color08) , 'DarkGray') + + + " Cursor: in normal mode + call s:create_color_variables('cursor_fg', get(s:palette, 'cursor_fg', color00) , 'Black') + call s:create_color_variables('cursor_bg', get(s:palette, 'cursor_bg', color07) , 'LightGray') + + call s:create_color_variables('cursorline', get(s:palette, 'cursorline', color00) , 'Black') + + " CursorColumn: when set cursorcolumn + call s:create_color_variables('cursorcolumn', get(s:palette, 'cursorcolumn', color00) , 'Black') + + " CursorLine Number: when set cursorline number + call s:create_color_variables('cursorlinenr_fg', get(s:palette, 'cursorlinenr_fg', color13) , 'LightMagenta') + call s:create_color_variables('cursorlinenr_bg', get(s:palette, 'cursorlinenr_bg', color00) , 'Black') + + " Popup Menu: when for autocomplete + call s:create_color_variables('popupmenu_fg', get(s:palette, 'popupmenu_fg', color07) , 'LightGray') + call s:create_color_variables('popupmenu_bg', get(s:palette, 'popupmenu_bg', color08) , 'DarkGray') " TODO: double check this, might resolve an issue + + " Search: ex: when * on a word + call s:create_color_variables('search_fg', get(s:palette, 'search_fg', color00) , 'Black') + call s:create_color_variables('search_bg', get(s:palette, 'search_bg', color15) , 'Yellow') + + " Todo: ex: TODO + call s:create_color_variables('todo_fg', get(s:palette, 'todo_fg', color05) , 'LightYellow') + call s:create_color_variables('todo_bg', get(s:palette, 'todo_bg', color00) , 'Black') + + " Error: ex: turn spell on and have invalid words + call s:create_color_variables('error_fg', get(s:palette, 'error_fg', color01) , 'DarkRed') + call s:create_color_variables('error_bg', get(s:palette, 'error_bg', color00) , 'Black') + + " Match Parenthesis: selecting an opening/closing pair and the other one will be highlighted + call s:create_color_variables('matchparen_fg', get(s:palette, 'matchparen_fg', color00) , 'LightMagenta') + call s:create_color_variables('matchparen_bg', get(s:palette, 'matchparen_bg', color05) , 'Black') + + " Visual: + call s:create_color_variables('visual_fg', get(s:palette, 'visual_fg', color08) , 'Black') + call s:create_color_variables('visual_bg', get(s:palette, 'visual_bg', color07) , 'White') + + " Folded: + call s:create_color_variables('folded_fg', get(s:palette, 'folded_fg', color00) , 'Black') + call s:create_color_variables('folded_bg', get(s:palette, 'folded_bg', color05) , 'DarkYellow') + + " WildMenu: Autocomplete command, ex: :color + call s:create_color_variables('wildmenu_fg', get(s:palette, 'wildmenu_fg', color00) , 'Black') + call s:create_color_variables('wildmenu_bg', get(s:palette, 'wildmenu_bg', color06) , 'LightGray') + + " Spelling: when spell on and there are spelling problems like this for example: papercolor. a vim color scheme + call s:create_color_variables('spellbad', get(s:palette, 'spellbad', color04) , 'DarkRed') + call s:create_color_variables('spellcap', get(s:palette, 'spellcap', color05) , 'DarkMagenta') + call s:create_color_variables('spellrare', get(s:palette, 'spellrare', color06) , 'DarkYellow') + call s:create_color_variables('spelllocal', get(s:palette, 'spelllocal', color01) , 'DarkBlue') + + " Diff: + call s:create_color_variables('diffadd_fg', get(s:palette, 'diffadd_fg', color00) , 'Black') + call s:create_color_variables('diffadd_bg', get(s:palette, 'diffadd_bg', color02) , 'DarkGreen') + + call s:create_color_variables('diffdelete_fg', get(s:palette, 'diffdelete_fg', color00) , 'Black') + call s:create_color_variables('diffdelete_bg', get(s:palette, 'diffdelete_bg', color04) , 'DarkRed') + + call s:create_color_variables('difftext_fg', get(s:palette, 'difftext_fg', color00) , 'Black') + call s:create_color_variables('difftext_bg', get(s:palette, 'difftext_bg', color06) , 'DarkYellow') + + call s:create_color_variables('diffchange_fg', get(s:palette, 'diffchange_fg', color00) , 'Black') + call s:create_color_variables('diffchange_bg', get(s:palette, 'diffchange_bg', color14) , 'LightYellow') + + " Tabline: when having tabs, ex: :tabnew + call s:create_color_variables('tabline_bg', get(s:palette, 'tabline_bg', color00) , 'Black') + call s:create_color_variables('tabline_active_fg', get(s:palette, 'tabline_active_fg', color07) , 'LightGray') + call s:create_color_variables('tabline_active_bg', get(s:palette, 'tabline_active_bg', color00) , 'Black') + call s:create_color_variables('tabline_inactive_fg', get(s:palette, 'tabline_inactive_fg', color07) , 'Black') + call s:create_color_variables('tabline_inactive_bg', get(s:palette, 'tabline_inactive_bg', color08) , 'DarkMagenta') + + " Plugin: BufTabLine https://github.com/ap/vim-buftabline + call s:create_color_variables('buftabline_bg', get(s:palette, 'buftabline_bg', color00) , 'Black') + call s:create_color_variables('buftabline_current_fg', get(s:palette, 'buftabline_current_fg', color07) , 'LightGray') + call s:create_color_variables('buftabline_current_bg', get(s:palette, 'buftabline_current_bg', color05) , 'DarkMagenta') + call s:create_color_variables('buftabline_active_fg', get(s:palette, 'buftabline_active_fg', color07) , 'LightGray') + call s:create_color_variables('buftabline_active_bg', get(s:palette, 'buftabline_active_bg', color12) , 'LightBlue') + call s:create_color_variables('buftabline_inactive_fg', get(s:palette, 'buftabline_inactive_fg', color07) , 'LightGray') + call s:create_color_variables('buftabline_inactive_bg', get(s:palette, 'buftabline_inactive_bg', color00) , 'Black') + + " Neovim terminal colors https://neovim.io/doc/user/nvim_terminal_emulator.html#nvim-terminal-emulator-configuration + " TODO: Fix this + let g:terminal_color_0 = color00[0] + let g:terminal_color_1 = color01[0] + let g:terminal_color_2 = color02[0] + let g:terminal_color_3 = color03[0] + let g:terminal_color_4 = color04[0] + let g:terminal_color_5 = color05[0] + let g:terminal_color_6 = color06[0] + let g:terminal_color_7 = color07[0] + let g:terminal_color_8 = color08[0] + let g:terminal_color_9 = color09[0] + let g:terminal_color_10 = color10[0] + let g:terminal_color_11 = color11[0] + let g:terminal_color_12 = color12[0] + let g:terminal_color_13 = color13[0] + let g:terminal_color_14 = color14[0] + let g:terminal_color_15 = color15[0] + + " Vim 8's :terminal buffer ANSI colors + if has('terminal') + let g:terminal_ansi_colors = [color00[0], color01[0], color02[0], color03[0], + \ color04[0], color05[0], color06[0], color07[0], color08[0], color09[0], + \ color10[0], color11[0], color12[0], color13[0], color14[0], color15[0]] + endif + +endfun +" }}} + +" Apply Syntax Highlightings: {{{ + +fun! s:apply_syntax_highlightings() + + if s:themeOpt_transparent_background + exec 'hi Normal' . s:fg_foreground + " Switching between dark & light variant through `set background` + " NOTE: Handle background switching right after `Normal` group because of + " God-know-why reason. Not doing this way had caused issue before + if s:is_dark " DARK VARIANT + set background=dark + else " LIGHT VARIANT + set background=light + endif + + exec 'hi NonText' . s:fg_nontext + exec 'hi LineNr' . s:fg_linenumber_fg + exec 'hi Conceal' . s:fg_linenumber_fg + exec 'hi VertSplit' . s:fg_vertsplit_fg . s:ft_none + exec 'hi FoldColumn' . s:fg_folded_fg . s:bg_transparent . s:ft_none + else + exec 'hi Normal' . s:fg_foreground . s:bg_background + " Switching between dark & light variant through `set background` + if s:is_dark " DARK VARIANT + set background=dark + exec 'hi EndOfBuffer' . s:fg_cursor_fg . s:ft_none + else " LIGHT VARIANT + set background=light + endif + + exec 'hi NonText' . s:fg_nontext . s:bg_background + exec 'hi LineNr' . s:fg_linenumber_fg . s:bg_linenumber_bg + exec 'hi Conceal' . s:fg_linenumber_fg . s:bg_linenumber_bg + exec 'hi VertSplit' . s:fg_vertsplit_bg . s:bg_vertsplit_fg + exec 'hi FoldColumn' . s:fg_folded_fg . s:bg_background . s:ft_none + endif + + exec 'hi Cursor' . s:fg_cursor_fg . s:bg_cursor_bg + exec 'hi SpecialKey' . s:fg_nontext + exec 'hi Search' . s:fg_search_fg . s:bg_search_bg + exec 'hi StatusLine' . s:fg_statusline_active_bg . s:bg_statusline_active_fg + exec 'hi StatusLineNC' . s:fg_statusline_inactive_bg . s:bg_statusline_inactive_fg + exec 'hi StatusLineTerm' . s:fg_statusline_active_bg . s:bg_statusline_active_fg + exec 'hi StatusLineTermNC' . s:fg_statusline_inactive_bg . s:bg_statusline_inactive_fg + exec 'hi Visual' . s:fg_visual_fg . s:bg_visual_bg + exec 'hi Directory' . s:fg_blue + exec 'hi ModeMsg' . s:fg_olive + exec 'hi MoreMsg' . s:fg_olive + exec 'hi Question' . s:fg_olive + exec 'hi WarningMsg' . s:fg_pink + exec 'hi MatchParen' . s:fg_matchparen_fg . s:bg_matchparen_bg + exec 'hi Folded' . s:fg_folded_fg . s:bg_folded_bg + exec 'hi WildMenu' . s:fg_wildmenu_fg . s:bg_wildmenu_bg . s:ft_bold + + if version >= 700 + exec 'hi CursorLine' . s:bg_cursorline . s:ft_none + if s:mode == s:MODE_16_COLOR + exec 'hi CursorLineNr' . s:fg_cursorlinenr_fg . s:bg_cursorlinenr_bg + else + exec 'hi CursorLineNr' . s:fg_cursorlinenr_fg . s:bg_cursorlinenr_bg . s:ft_none + endif + exec 'hi CursorColumn' . s:bg_cursorcolumn . s:ft_none + exec 'hi PMenu' . s:fg_popupmenu_fg . s:bg_popupmenu_bg . s:ft_none + exec 'hi PMenuSel' . s:fg_popupmenu_fg . s:bg_popupmenu_bg . s:ft_reverse + if s:themeOpt_transparent_background + exec 'hi SignColumn' . s:fg_green . s:ft_none + else + exec 'hi SignColumn' . s:fg_green . s:bg_background . s:ft_none + endif + end + if version >= 703 + exec 'hi ColorColumn' . s:bg_cursorcolumn . s:ft_none + end + + exec 'hi TabLine' . s:fg_tabline_inactive_fg . s:bg_tabline_inactive_bg . s:ft_none + exec 'hi TabLineFill' . s:fg_tabline_bg . s:bg_tabline_bg . s:ft_none + exec 'hi TabLineSel' . s:fg_tabline_active_fg . s:bg_tabline_active_bg . s:ft_none + + exec 'hi BufTabLineCurrent' . s:fg_buftabline_current_fg . s:bg_buftabline_current_bg . s:ft_none + exec 'hi BufTabLineActive' . s:fg_buftabline_active_fg . s:bg_buftabline_active_bg . s:ft_none + exec 'hi BufTabLineHidden' . s:fg_buftabline_inactive_fg . s:bg_buftabline_inactive_bg . s:ft_none + exec 'hi BufTabLineFill' . s:bg_buftabline_bg . s:ft_none + + " Standard Group Highlighting: + exec 'hi Comment' . s:fg_comment . s:ft_italic + + exec 'hi Constant' . s:fg_orange + exec 'hi String' . s:fg_olive + exec 'hi Character' . s:fg_olive + exec 'hi Number' . s:fg_orange + exec 'hi Boolean' . s:fg_green . s:ft_bold + exec 'hi Float' . s:fg_orange + + exec 'hi Identifier' . s:fg_navy + exec 'hi Function' . s:fg_foreground + + exec 'hi Statement' . s:fg_pink . s:ft_none + exec 'hi Conditional' . s:fg_purple . s:ft_bold + exec 'hi Repeat' . s:fg_purple . s:ft_bold + exec 'hi Label' . s:fg_blue + exec 'hi Operator' . s:fg_aqua . s:ft_none + exec 'hi Keyword' . s:fg_blue + exec 'hi Exception' . s:fg_red + + exec 'hi PreProc' . s:fg_blue + exec 'hi Include' . s:fg_red + exec 'hi Define' . s:fg_blue + exec 'hi Macro' . s:fg_blue + exec 'hi PreCondit' . s:fg_aqua + + exec 'hi Type' . s:fg_pink . s:ft_bold + exec 'hi StorageClass' . s:fg_navy . s:ft_bold + exec 'hi Structure' . s:fg_blue . s:ft_bold + exec 'hi Typedef' . s:fg_pink . s:ft_bold + + exec 'hi Special' . s:fg_foreground + exec 'hi SpecialChar' . s:fg_foreground + exec 'hi Tag' . s:fg_green + exec 'hi Delimiter' . s:fg_aqua + exec 'hi SpecialComment' . s:fg_comment . s:ft_bold + exec 'hi Debug' . s:fg_orange + + exec 'hi Error' . s:fg_error_fg . s:bg_error_bg + exec 'hi Todo' . s:fg_todo_fg . s:bg_todo_bg . s:ft_bold + + exec 'hi Title' . s:fg_comment + exec 'hi Global' . s:fg_blue + + + " Extension {{{ + " VimL Highlighting + exec 'hi vimCommand' . s:fg_pink + exec 'hi vimVar' . s:fg_navy + exec 'hi vimFuncKey' . s:fg_pink + exec 'hi vimFunction' . s:fg_blue . s:ft_bold + exec 'hi vimNotFunc' . s:fg_pink + exec 'hi vimMap' . s:fg_red + exec 'hi vimAutoEvent' . s:fg_aqua . s:ft_bold + exec 'hi vimMapModKey' . s:fg_aqua + exec 'hi vimFuncName' . s:fg_purple + exec 'hi vimIsCommand' . s:fg_foreground + exec 'hi vimFuncVar' . s:fg_aqua + exec 'hi vimLet' . s:fg_red + exec 'hi vimContinue' . s:fg_aqua + exec 'hi vimMapRhsExtend' . s:fg_foreground + exec 'hi vimCommentTitle' . s:fg_comment . s:ft_italic_bold + exec 'hi vimBracket' . s:fg_aqua + exec 'hi vimParenSep' . s:fg_aqua + exec 'hi vimNotation' . s:fg_aqua + exec 'hi vimOper' . s:fg_foreground + exec 'hi vimOperParen' . s:fg_foreground + exec 'hi vimSynType' . s:fg_purple + exec 'hi vimSynReg' . s:fg_pink . s:ft_none + exec 'hi vimSynRegion' . s:fg_foreground + exec 'hi vimSynMtchGrp' . s:fg_pink + exec 'hi vimSynNextgroup' . s:fg_pink + exec 'hi vimSynKeyRegion' . s:fg_green + exec 'hi vimSynRegOpt' . s:fg_blue + exec 'hi vimSynMtchOpt' . s:fg_blue + exec 'hi vimSynContains' . s:fg_pink + exec 'hi vimGroupName' . s:fg_foreground + exec 'hi vimGroupList' . s:fg_foreground + exec 'hi vimHiGroup' . s:fg_foreground + exec 'hi vimGroup' . s:fg_navy . s:ft_bold + exec 'hi vimOnlyOption' . s:fg_blue + + " Makefile Highlighting + exec 'hi makeIdent' . s:fg_blue + exec 'hi makeSpecTarget' . s:fg_olive + exec 'hi makeTarget' . s:fg_red + exec 'hi makeStatement' . s:fg_aqua . s:ft_bold + exec 'hi makeCommands' . s:fg_foreground + exec 'hi makeSpecial' . s:fg_orange . s:ft_bold + + " CMake Highlighting (Builtin) + exec 'hi cmakeStatement' . s:fg_blue + exec 'hi cmakeArguments' . s:fg_foreground + exec 'hi cmakeVariableValue' . s:fg_pink + + " CMake Highlighting (Plugin: https://github.com/pboettch/vim-cmake-syntax) + exec 'hi cmakeCommand' . s:fg_blue + exec 'hi cmakeCommandConditional' . s:fg_purple . s:ft_bold + exec 'hi cmakeKWset' . s:fg_orange + exec 'hi cmakeKWvariable_watch' . s:fg_orange + exec 'hi cmakeKWif' . s:fg_orange + exec 'hi cmakeArguments' . s:fg_foreground + exec 'hi cmakeKWproject' . s:fg_pink + exec 'hi cmakeGeneratorExpressions' . s:fg_orange + exec 'hi cmakeGeneratorExpression' . s:fg_aqua + exec 'hi cmakeVariable' . s:fg_pink + exec 'hi cmakeProperty' . s:fg_aqua + exec 'hi cmakeKWforeach' . s:fg_aqua + exec 'hi cmakeKWunset' . s:fg_aqua + exec 'hi cmakeKWmacro' . s:fg_aqua + exec 'hi cmakeKWget_property' . s:fg_aqua + exec 'hi cmakeKWset_tests_properties' . s:fg_aqua + exec 'hi cmakeKWmessage' . s:fg_aqua + exec 'hi cmakeKWinstall_targets' . s:fg_orange + exec 'hi cmakeKWsource_group' . s:fg_orange + exec 'hi cmakeKWfind_package' . s:fg_aqua + exec 'hi cmakeKWstring' . s:fg_olive + exec 'hi cmakeKWinstall' . s:fg_aqua + exec 'hi cmakeKWtarget_sources' . s:fg_orange + + " C Highlighting + exec 'hi cType' . s:fg_pink . s:ft_bold + exec 'hi cFormat' . s:fg_olive + exec 'hi cStorageClass' . s:fg_navy . s:ft_bold + + exec 'hi cBoolean' . s:fg_green . s:ft_bold + exec 'hi cCharacter' . s:fg_olive + exec 'hi cConstant' . s:fg_green . s:ft_bold + exec 'hi cConditional' . s:fg_purple . s:ft_bold + exec 'hi cSpecial' . s:fg_olive . s:ft_bold + exec 'hi cDefine' . s:fg_blue + exec 'hi cNumber' . s:fg_orange + exec 'hi cPreCondit' . s:fg_aqua + exec 'hi cRepeat' . s:fg_purple . s:ft_bold + exec 'hi cLabel' . s:fg_aqua + " exec 'hi cAnsiFunction' . s:fg_aqua . s:ft_bold + " exec 'hi cAnsiName' . s:fg_pink + exec 'hi cDelimiter' . s:fg_blue + " exec 'hi cBraces' . s:fg_foreground + " exec 'hi cIdentifier' . s:fg_blue . s:bg_pink + " exec 'hi cSemiColon' . s:bg_blue + exec 'hi cOperator' . s:fg_aqua + " exec 'hi cStatement' . s:fg_pink + " exec 'hi cTodo' . s:fg_comment . s:ft_bold + " exec 'hi cStructure' . s:fg_blue . s:ft_bold + exec 'hi cCustomParen' . s:fg_foreground + " exec 'hi cCustomFunc' . s:fg_foreground + " exec 'hi cUserFunction' . s:fg_blue . s:ft_bold + exec 'hi cOctalZero' . s:fg_purple . s:ft_bold + if s:langOpt_c__highlight_builtins == 1 + exec 'hi cFunction' . s:fg_blue + else + exec 'hi cFunction' . s:fg_foreground + endif + + " CPP highlighting + exec 'hi cppBoolean' . s:fg_green . s:ft_bold + exec 'hi cppSTLnamespace' . s:fg_purple + exec 'hi cppSTLexception' . s:fg_pink + exec 'hi cppSTLfunctional' . s:fg_foreground . s:ft_bold + exec 'hi cppSTLiterator' . s:fg_foreground . s:ft_bold + exec 'hi cppExceptions' . s:fg_red + exec 'hi cppStatement' . s:fg_blue + exec 'hi cppStorageClass' . s:fg_navy . s:ft_bold + exec 'hi cppAccess' . s:fg_orange . s:ft_bold + if s:langOpt_cpp__highlight_standard_library == 1 + exec 'hi cppSTLconstant' . s:fg_green . s:ft_bold + exec 'hi cppSTLtype' . s:fg_pink . s:ft_bold + exec 'hi cppSTLfunction' . s:fg_blue + exec 'hi cppSTLios' . s:fg_olive . s:ft_bold + else + exec 'hi cppSTLconstant' . s:fg_foreground + exec 'hi cppSTLtype' . s:fg_foreground + exec 'hi cppSTLfunction' . s:fg_foreground + exec 'hi cppSTLios' . s:fg_foreground + endif + " exec 'hi cppSTL' . s:fg_blue + + " Rust highlighting + exec 'hi rustKeyword' . s:fg_pink + exec 'hi rustModPath' . s:fg_blue + exec 'hi rustModPathSep' . s:fg_blue + exec 'hi rustLifetime' . s:fg_purple + exec 'hi rustStructure' . s:fg_aqua . s:ft_bold + exec 'hi rustAttribute' . s:fg_aqua . s:ft_bold + exec 'hi rustPanic' . s:fg_olive . s:ft_bold + exec 'hi rustTrait' . s:fg_blue . s:ft_bold + exec 'hi rustEnum' . s:fg_green . s:ft_bold + exec 'hi rustEnumVariant' . s:fg_green + exec 'hi rustSelf' . s:fg_orange + exec 'hi rustSigil' . s:fg_aqua . s:ft_bold + exec 'hi rustOperator' . s:fg_aqua . s:ft_bold + exec 'hi rustMacro' . s:fg_olive . s:ft_bold + exec 'hi rustMacroVariable' . s:fg_olive + exec 'hi rustAssert' . s:fg_olive . s:ft_bold + exec 'hi rustConditional' . s:fg_purple . s:ft_bold + + " Lex highlighting + exec 'hi lexCFunctions' . s:fg_foreground + exec 'hi lexAbbrv' . s:fg_purple + exec 'hi lexAbbrvRegExp' . s:fg_aqua + exec 'hi lexAbbrvComment' . s:fg_comment + exec 'hi lexBrace' . s:fg_navy + exec 'hi lexPat' . s:fg_aqua + exec 'hi lexPatComment' . s:fg_comment + exec 'hi lexPatTag' . s:fg_orange + " exec 'hi lexPatBlock' . s:fg_foreground . s:ft_bold + exec 'hi lexSlashQuote' . s:fg_foreground + exec 'hi lexSep' . s:fg_foreground + exec 'hi lexStartState' . s:fg_orange + exec 'hi lexPatTagZone' . s:fg_olive . s:ft_bold + exec 'hi lexMorePat' . s:fg_olive . s:ft_bold + exec 'hi lexOptions' . s:fg_olive . s:ft_bold + exec 'hi lexPatString' . s:fg_olive + + " Yacc highlighting + exec 'hi yaccNonterminal' . s:fg_navy + exec 'hi yaccDelim' . s:fg_orange + exec 'hi yaccInitKey' . s:fg_aqua + exec 'hi yaccInit' . s:fg_navy + exec 'hi yaccKey' . s:fg_purple + exec 'hi yaccVar' . s:fg_aqua + + " NASM highlighting + exec 'hi nasmStdInstruction' . s:fg_navy + exec 'hi nasmGen08Register' . s:fg_aqua + exec 'hi nasmGen16Register' . s:fg_aqua + exec 'hi nasmGen32Register' . s:fg_aqua + exec 'hi nasmGen64Register' . s:fg_aqua + exec 'hi nasmHexNumber' . s:fg_purple + exec 'hi nasmStorage' . s:fg_aqua . s:ft_bold + exec 'hi nasmLabel' . s:fg_pink + exec 'hi nasmDirective' . s:fg_blue . s:ft_bold + exec 'hi nasmLocalLabel' . s:fg_orange + + " GAS highlighting + exec 'hi gasSymbol' . s:fg_pink + exec 'hi gasDirective' . s:fg_blue . s:ft_bold + exec 'hi gasOpcode_386_Base' . s:fg_navy + exec 'hi gasDecimalNumber' . s:fg_purple + exec 'hi gasSymbolRef' . s:fg_pink + exec 'hi gasRegisterX86' . s:fg_blue + exec 'hi gasOpcode_P6_Base' . s:fg_navy + exec 'hi gasDirectiveStore' . s:fg_foreground . s:ft_bold + + " MIPS highlighting + exec 'hi mipsInstruction' . s:fg_pink + exec 'hi mipsRegister' . s:fg_navy + exec 'hi mipsLabel' . s:fg_aqua . s:ft_bold + exec 'hi mipsDirective' . s:fg_purple . s:ft_bold + + " Shell/Bash highlighting + exec 'hi bashStatement' . s:fg_foreground . s:ft_bold + exec 'hi shDerefVar' . s:fg_aqua . s:ft_bold + exec 'hi shDerefSimple' . s:fg_aqua + exec 'hi shFunction' . s:fg_orange . s:ft_bold + exec 'hi shStatement' . s:fg_foreground + exec 'hi shLoop' . s:fg_purple . s:ft_bold + exec 'hi shQuote' . s:fg_olive + exec 'hi shCaseEsac' . s:fg_aqua . s:ft_bold + exec 'hi shSnglCase' . s:fg_purple . s:ft_none + exec 'hi shFunctionOne' . s:fg_navy + exec 'hi shCase' . s:fg_navy + exec 'hi shSetList' . s:fg_navy + " @see Dockerfile Highlighting section for more sh* + + " PowerShell Highlighting + exec 'hi ps1Type' . s:fg_green . s:ft_bold + exec 'hi ps1Variable' . s:fg_navy + exec 'hi ps1Boolean' . s:fg_navy . s:ft_bold + exec 'hi ps1FunctionInvocation' . s:fg_pink + exec 'hi ps1FunctionDeclaration' . s:fg_pink + exec 'hi ps1Keyword' . s:fg_blue . s:ft_bold + exec 'hi ps1Exception' . s:fg_red + exec 'hi ps1Operator' . s:fg_aqua . s:ft_bold + exec 'hi ps1CommentDoc' . s:fg_purple + exec 'hi ps1CDocParam' . s:fg_orange + + " HTML Highlighting + exec 'hi htmlTitle' . s:fg_green . s:ft_bold + exec 'hi htmlH1' . s:fg_green . s:ft_bold + exec 'hi htmlH2' . s:fg_aqua . s:ft_bold + exec 'hi htmlH3' . s:fg_purple . s:ft_bold + exec 'hi htmlH4' . s:fg_orange . s:ft_bold + exec 'hi htmlTag' . s:fg_comment + exec 'hi htmlTagName' . s:fg_wine + exec 'hi htmlArg' . s:fg_pink + exec 'hi htmlEndTag' . s:fg_comment + exec 'hi htmlString' . s:fg_blue + exec 'hi htmlScriptTag' . s:fg_comment + exec 'hi htmlBold' . s:fg_foreground . s:ft_bold + exec 'hi htmlItalic' . s:fg_comment . s:ft_italic + exec 'hi htmlBoldItalic' . s:fg_navy . s:ft_italic_bold + " exec 'hi htmlLink' . s:fg_blue . s:ft_bold + exec 'hi htmlTagN' . s:fg_wine . s:ft_bold + exec 'hi htmlSpecialTagName' . s:fg_wine + exec 'hi htmlComment' . s:fg_comment . s:ft_italic + exec 'hi htmlCommentPart' . s:fg_comment . s:ft_italic + + " CSS Highlighting + exec 'hi cssIdentifier' . s:fg_pink + exec 'hi cssPositioningProp' . s:fg_foreground + exec 'hi cssNoise' . s:fg_foreground + exec 'hi cssBoxProp' . s:fg_foreground + exec 'hi cssTableAttr' . s:fg_purple + exec 'hi cssPositioningAttr' . s:fg_navy + exec 'hi cssValueLength' . s:fg_orange + exec 'hi cssFunctionName' . s:fg_blue + exec 'hi cssUnitDecorators' . s:fg_aqua + exec 'hi cssColor' . s:fg_blue . s:ft_bold + exec 'hi cssBraces' . s:fg_pink + exec 'hi cssBackgroundProp' . s:fg_foreground + exec 'hi cssTextProp' . s:fg_foreground + exec 'hi cssDimensionProp' . s:fg_foreground + exec 'hi cssClassName' . s:fg_pink + + " Markdown Highlighting + exec 'hi markdownHeadingRule' . s:fg_pink . s:ft_bold + exec 'hi markdownH1' . s:fg_pink . s:ft_bold + exec 'hi markdownH2' . s:fg_orange . s:ft_bold + exec 'hi markdownBlockquote' . s:fg_pink + exec 'hi markdownCodeBlock' . s:fg_olive + exec 'hi markdownCode' . s:fg_olive + exec 'hi markdownLink' . s:fg_blue . s:ft_bold + exec 'hi markdownUrl' . s:fg_blue + exec 'hi markdownLinkText' . s:fg_pink + exec 'hi markdownLinkTextDelimiter' . s:fg_purple + exec 'hi markdownLinkDelimiter' . s:fg_purple + exec 'hi markdownCodeDelimiter' . s:fg_blue + + exec 'hi mkdCode' . s:fg_olive + exec 'hi mkdLink' . s:fg_blue . s:ft_bold + exec 'hi mkdURL' . s:fg_comment + exec 'hi mkdString' . s:fg_foreground + exec 'hi mkdBlockQuote' . s:fg_pink + exec 'hi mkdLinkTitle' . s:fg_pink + exec 'hi mkdDelimiter' . s:fg_aqua + exec 'hi mkdRule' . s:fg_pink + + " reStructuredText Highlighting + exec 'hi rstSections' . s:fg_pink . s:ft_bold + exec 'hi rstDelimiter' . s:fg_pink . s:ft_bold + exec 'hi rstExplicitMarkup' . s:fg_pink . s:ft_bold + exec 'hi rstDirective' . s:fg_blue + exec 'hi rstHyperlinkTarget' . s:fg_green + exec 'hi rstExDirective' . s:fg_foreground + exec 'hi rstInlineLiteral' . s:fg_olive + exec 'hi rstInterpretedTextOrHyperlinkReference' . s:fg_blue + + " Python Highlighting + exec 'hi pythonImport' . s:fg_pink . s:ft_bold + exec 'hi pythonExceptions' . s:fg_red + exec 'hi pythonException' . s:fg_purple . s:ft_bold + exec 'hi pythonInclude' . s:fg_red + exec 'hi pythonStatement' . s:fg_pink + exec 'hi pythonConditional' . s:fg_purple . s:ft_bold + exec 'hi pythonRepeat' . s:fg_purple . s:ft_bold + exec 'hi pythonFunction' . s:fg_aqua . s:ft_bold + exec 'hi pythonPreCondit' . s:fg_purple + exec 'hi pythonExClass' . s:fg_orange + exec 'hi pythonOperator' . s:fg_purple . s:ft_bold + exec 'hi pythonBuiltin' . s:fg_foreground + exec 'hi pythonDecorator' . s:fg_orange + + exec 'hi pythonString' . s:fg_olive + exec 'hi pythonEscape' . s:fg_olive . s:ft_bold + exec 'hi pythonStrFormatting' . s:fg_olive . s:ft_bold + + exec 'hi pythonBoolean' . s:fg_green . s:ft_bold + exec 'hi pythonExClass' . s:fg_red + exec 'hi pythonBytesEscape' . s:fg_olive . s:ft_bold + exec 'hi pythonDottedName' . s:fg_purple + exec 'hi pythonStrFormat' . s:fg_foreground + + if s:langOpt_python__highlight_builtins == 1 + exec 'hi pythonBuiltinFunc' . s:fg_blue + exec 'hi pythonBuiltinObj' . s:fg_red + else + exec 'hi pythonBuiltinFunc' . s:fg_foreground + exec 'hi pythonBuiltinObj' . s:fg_foreground + endif + + " Java Highlighting + exec 'hi javaExternal' . s:fg_pink + exec 'hi javaAnnotation' . s:fg_orange + exec 'hi javaTypedef' . s:fg_aqua + exec 'hi javaClassDecl' . s:fg_aqua . s:ft_bold + exec 'hi javaScopeDecl' . s:fg_blue . s:ft_bold + exec 'hi javaStorageClass' . s:fg_navy . s:ft_bold + exec 'hi javaBoolean' . s:fg_green . s:ft_bold + exec 'hi javaConstant' . s:fg_blue + exec 'hi javaCommentTitle' . s:fg_wine + exec 'hi javaDocTags' . s:fg_aqua + exec 'hi javaDocComment' . s:fg_comment + exec 'hi javaDocParam' . s:fg_foreground + exec 'hi javaStatement' . s:fg_pink + + " JavaScript Highlighting + exec 'hi javaScriptBraces' . s:fg_blue + exec 'hi javaScriptParens' . s:fg_blue + exec 'hi javaScriptIdentifier' . s:fg_pink + exec 'hi javaScriptFunction' . s:fg_blue . s:ft_bold + exec 'hi javaScriptConditional' . s:fg_purple . s:ft_bold + exec 'hi javaScriptRepeat' . s:fg_purple . s:ft_bold + exec 'hi javaScriptBoolean' . s:fg_green . s:ft_bold + exec 'hi javaScriptNumber' . s:fg_orange + exec 'hi javaScriptMember' . s:fg_navy + exec 'hi javaScriptReserved' . s:fg_navy + exec 'hi javascriptNull' . s:fg_comment . s:ft_bold + exec 'hi javascriptGlobal' . s:fg_foreground + exec 'hi javascriptStatement' . s:fg_pink + exec 'hi javaScriptMessage' . s:fg_foreground + exec 'hi javaScriptMember' . s:fg_foreground + + " @target https://github.com/pangloss/vim-javascript + exec 'hi jsFuncParens' . s:fg_blue + exec 'hi jsFuncBraces' . s:fg_blue + exec 'hi jsParens' . s:fg_blue + exec 'hi jsBraces' . s:fg_blue + exec 'hi jsNoise' . s:fg_blue + + " Jsx Highlighting + " @target https://github.com/MaxMEllon/vim-jsx-pretty + exec 'hi jsxTagName' . s:fg_wine + exec 'hi jsxComponentName' . s:fg_wine + exec 'hi jsxAttrib' . s:fg_pink + exec 'hi jsxEqual' . s:fg_comment + exec 'hi jsxString' . s:fg_blue + exec 'hi jsxCloseTag' . s:fg_comment + exec 'hi jsxCloseString' . s:fg_comment + exec 'hi jsxDot' . s:fg_wine + exec 'hi jsxNamespace' . s:fg_wine + exec 'hi jsxPunct' . s:fg_comment + + " Json Highlighting + " @target https://github.com/elzr/vim-json + exec 'hi jsonKeyword' . s:fg_blue + exec 'hi jsonString' . s:fg_olive + exec 'hi jsonQuote' . s:fg_comment + exec 'hi jsonNoise' . s:fg_foreground + exec 'hi jsonKeywordMatch' . s:fg_foreground + exec 'hi jsonBraces' . s:fg_foreground + exec 'hi jsonNumber' . s:fg_orange + exec 'hi jsonNull' . s:fg_purple . s:ft_bold + exec 'hi jsonBoolean' . s:fg_green . s:ft_bold + exec 'hi jsonCommentError' . s:fg_pink . s:bg_background + + " Go Highlighting + exec 'hi goDirective' . s:fg_red + exec 'hi goDeclaration' . s:fg_blue . s:ft_bold + exec 'hi goStatement' . s:fg_pink + exec 'hi goConditional' . s:fg_purple . s:ft_bold + exec 'hi goConstants' . s:fg_orange + exec 'hi goFunction' . s:fg_orange + " exec 'hi goTodo' . s:fg_comment . s:ft_bold + exec 'hi goDeclType' . s:fg_blue + exec 'hi goBuiltins' . s:fg_purple + + " Systemtap Highlighting + " exec 'hi stapBlock' . s:fg_comment . s:ft_none + exec 'hi stapComment' . s:fg_comment . s:ft_none + exec 'hi stapProbe' . s:fg_aqua . s:ft_bold + exec 'hi stapStat' . s:fg_navy . s:ft_bold + exec 'hi stapFunc' . s:fg_foreground + exec 'hi stapString' . s:fg_olive + exec 'hi stapTarget' . s:fg_navy + exec 'hi stapStatement' . s:fg_pink + exec 'hi stapType' . s:fg_pink . s:ft_bold + exec 'hi stapSharpBang' . s:fg_comment + exec 'hi stapDeclaration' . s:fg_pink + exec 'hi stapCMacro' . s:fg_blue + + " DTrace Highlighting + exec 'hi dtraceProbe' . s:fg_blue + exec 'hi dtracePredicate' . s:fg_purple . s:ft_bold + exec 'hi dtraceComment' . s:fg_comment + exec 'hi dtraceFunction' . s:fg_foreground + exec 'hi dtraceAggregatingFunction' . s:fg_blue . s:ft_bold + exec 'hi dtraceStatement' . s:fg_navy . s:ft_bold + exec 'hi dtraceIdentifier' . s:fg_pink + exec 'hi dtraceOption' . s:fg_pink + exec 'hi dtraceConstant' . s:fg_orange + exec 'hi dtraceType' . s:fg_pink . s:ft_bold + + " PlantUML Highlighting + exec 'hi plantumlPreProc' . s:fg_orange . s:ft_bold + exec 'hi plantumlDirectedOrVerticalArrowRL' . s:fg_pink + exec 'hi plantumlDirectedOrVerticalArrowLR' . s:fg_pink + exec 'hi plantumlString' . s:fg_olive + exec 'hi plantumlActivityThing' . s:fg_purple + exec 'hi plantumlText' . s:fg_navy + exec 'hi plantumlClassPublic' . s:fg_olive . s:ft_bold + exec 'hi plantumlClassPrivate' . s:fg_red + exec 'hi plantumlColonLine' . s:fg_orange + exec 'hi plantumlClass' . s:fg_navy + exec 'hi plantumlHorizontalArrow' . s:fg_pink + exec 'hi plantumlTypeKeyword' . s:fg_blue . s:ft_bold + exec 'hi plantumlKeyword' . s:fg_pink . s:ft_bold + + exec 'hi plantumlType' . s:fg_blue . s:ft_bold + exec 'hi plantumlBlock' . s:fg_pink . s:ft_bold + exec 'hi plantumlPreposition' . s:fg_orange + exec 'hi plantumlLayout' . s:fg_blue . s:ft_bold + exec 'hi plantumlNote' . s:fg_orange + exec 'hi plantumlLifecycle' . s:fg_aqua + exec 'hi plantumlParticipant' . s:fg_foreground . s:ft_bold + + + " Haskell Highlighting + exec 'hi haskellType' . s:fg_aqua . s:ft_bold + exec 'hi haskellIdentifier' . s:fg_orange . s:ft_bold + exec 'hi haskellOperators' . s:fg_pink + exec 'hi haskellWhere' . s:fg_foreground . s:ft_bold + exec 'hi haskellDelimiter' . s:fg_aqua + exec 'hi haskellImportKeywords' . s:fg_pink + exec 'hi haskellStatement' . s:fg_purple . s:ft_bold + + + " SQL/MySQL Highlighting + exec 'hi sqlStatement' . s:fg_pink . s:ft_bold + exec 'hi sqlType' . s:fg_blue . s:ft_bold + exec 'hi sqlKeyword' . s:fg_pink + exec 'hi sqlOperator' . s:fg_aqua + exec 'hi sqlSpecial' . s:fg_green . s:ft_bold + + exec 'hi mysqlVariable' . s:fg_olive . s:ft_bold + exec 'hi mysqlType' . s:fg_blue . s:ft_bold + exec 'hi mysqlKeyword' . s:fg_pink + exec 'hi mysqlOperator' . s:fg_aqua + exec 'hi mysqlSpecial' . s:fg_green . s:ft_bold + + + " Octave/MATLAB Highlighting + exec 'hi octaveVariable' . s:fg_foreground + exec 'hi octaveDelimiter' . s:fg_pink + exec 'hi octaveQueryVar' . s:fg_foreground + exec 'hi octaveSemicolon' . s:fg_purple + exec 'hi octaveFunction' . s:fg_navy + exec 'hi octaveSetVar' . s:fg_blue + exec 'hi octaveUserVar' . s:fg_foreground + exec 'hi octaveArithmeticOperator' . s:fg_aqua + exec 'hi octaveBeginKeyword' . s:fg_purple . s:ft_bold + exec 'hi octaveElseKeyword' . s:fg_purple . s:ft_bold + exec 'hi octaveEndKeyword' . s:fg_purple . s:ft_bold + exec 'hi octaveStatement' . s:fg_pink + + " Ruby Highlighting + exec 'hi rubyModule' . s:fg_navy . s:ft_bold + exec 'hi rubyClass' . s:fg_pink . s:ft_bold + exec 'hi rubyPseudoVariable' . s:fg_comment . s:ft_bold + exec 'hi rubyKeyword' . s:fg_pink + exec 'hi rubyInstanceVariable' . s:fg_purple + exec 'hi rubyFunction' . s:fg_foreground . s:ft_bold + exec 'hi rubyDefine' . s:fg_pink + exec 'hi rubySymbol' . s:fg_aqua + exec 'hi rubyConstant' . s:fg_blue + exec 'hi rubyAccess' . s:fg_navy + exec 'hi rubyAttribute' . s:fg_green + exec 'hi rubyInclude' . s:fg_red + exec 'hi rubyLocalVariableOrMethod' . s:fg_orange + exec 'hi rubyCurlyBlock' . s:fg_foreground + exec 'hi rubyCurlyBlockDelimiter' . s:fg_aqua + exec 'hi rubyArrayDelimiter' . s:fg_aqua + exec 'hi rubyStringDelimiter' . s:fg_olive + exec 'hi rubyInterpolationDelimiter' . s:fg_orange + exec 'hi rubyConditional' . s:fg_purple . s:ft_bold + exec 'hi rubyRepeat' . s:fg_purple . s:ft_bold + exec 'hi rubyControl' . s:fg_purple . s:ft_bold + exec 'hi rubyException' . s:fg_purple . s:ft_bold + exec 'hi rubyExceptional' . s:fg_purple . s:ft_bold + exec 'hi rubyBoolean' . s:fg_green . s:ft_bold + + " Fortran Highlighting + exec 'hi fortranUnitHeader' . s:fg_blue . s:ft_bold + exec 'hi fortranIntrinsic' . s:fg_blue . s:bg_background . s:ft_none + exec 'hi fortranType' . s:fg_pink . s:ft_bold + exec 'hi fortranTypeOb' . s:fg_pink . s:ft_bold + exec 'hi fortranStructure' . s:fg_aqua + exec 'hi fortranStorageClass' . s:fg_navy . s:ft_bold + exec 'hi fortranStorageClassR' . s:fg_navy . s:ft_bold + exec 'hi fortranKeyword' . s:fg_pink + exec 'hi fortranReadWrite' . s:fg_aqua . s:ft_bold + exec 'hi fortranIO' . s:fg_navy + exec 'hi fortranOperator' . s:fg_aqua . s:ft_bold + exec 'hi fortranCall' . s:fg_aqua . s:ft_bold + exec 'hi fortranContinueMark' . s:fg_green + + " ALGOL Highlighting (Plugin: https://github.com/sterpe/vim-algol68) + exec 'hi algol68Statement' . s:fg_blue . s:ft_bold + exec 'hi algol68Operator' . s:fg_aqua . s:ft_bold + exec 'hi algol68PreProc' . s:fg_green + exec 'hi algol68Function' . s:fg_blue + + " R Highlighting + exec 'hi rType' . s:fg_blue + exec 'hi rArrow' . s:fg_pink + exec 'hi rDollar' . s:fg_blue + + " XXD Highlighting + exec 'hi xxdAddress' . s:fg_navy + exec 'hi xxdSep' . s:fg_pink + exec 'hi xxdAscii' . s:fg_pink + exec 'hi xxdDot' . s:fg_aqua + + " PHP Highlighting + exec 'hi phpIdentifier' . s:fg_foreground + exec 'hi phpVarSelector' . s:fg_pink + exec 'hi phpKeyword' . s:fg_blue + exec 'hi phpRepeat' . s:fg_purple . s:ft_bold + exec 'hi phpConditional' . s:fg_purple . s:ft_bold + exec 'hi phpStatement' . s:fg_pink + exec 'hi phpAssignByRef' . s:fg_aqua . s:ft_bold + exec 'hi phpSpecialFunction' . s:fg_blue + exec 'hi phpFunctions' . s:fg_blue + exec 'hi phpComparison' . s:fg_aqua + exec 'hi phpBackslashSequences' . s:fg_olive . s:ft_bold + exec 'hi phpMemberSelector' . s:fg_blue + exec 'hi phpStorageClass' . s:fg_purple . s:ft_bold + exec 'hi phpDefine' . s:fg_navy + exec 'hi phpIntVar' . s:fg_navy . s:ft_bold + + " Perl Highlighting + exec 'hi perlFiledescRead' . s:fg_green + exec 'hi perlMatchStartEnd' . s:fg_pink + exec 'hi perlStatementFlow' . s:fg_pink + exec 'hi perlStatementStorage' . s:fg_pink + exec 'hi perlFunction' . s:fg_pink . s:ft_bold + exec 'hi perlMethod' . s:fg_foreground + exec 'hi perlStatementFiledesc' . s:fg_orange + exec 'hi perlVarPlain' . s:fg_navy + exec 'hi perlSharpBang' . s:fg_comment + exec 'hi perlStatementInclude' . s:fg_aqua . s:ft_bold + exec 'hi perlStatementScalar' . s:fg_purple + exec 'hi perlSubName' . s:fg_aqua . s:ft_bold + exec 'hi perlSpecialString' . s:fg_olive . s:ft_bold + + " Pascal Highlighting + exec 'hi pascalType' . s:fg_pink . s:ft_bold + exec 'hi pascalStatement' . s:fg_blue . s:ft_bold + exec 'hi pascalPredefined' . s:fg_pink + exec 'hi pascalFunction' . s:fg_foreground + exec 'hi pascalStruct' . s:fg_navy . s:ft_bold + exec 'hi pascalOperator' . s:fg_aqua . s:ft_bold + exec 'hi pascalPreProc' . s:fg_green + exec 'hi pascalAcces' . s:fg_navy . s:ft_bold + + " Lua Highlighting + exec 'hi luaFunc' . s:fg_foreground + exec 'hi luaIn' . s:fg_blue . s:ft_bold + exec 'hi luaFunction' . s:fg_pink + exec 'hi luaStatement' . s:fg_blue + exec 'hi luaRepeat' . s:fg_blue . s:ft_bold + exec 'hi luaCondStart' . s:fg_purple . s:ft_bold + exec 'hi luaTable' . s:fg_aqua . s:ft_bold + exec 'hi luaConstant' . s:fg_green . s:ft_bold + exec 'hi luaElse' . s:fg_purple . s:ft_bold + exec 'hi luaCondElseif' . s:fg_purple . s:ft_bold + exec 'hi luaCond' . s:fg_purple . s:ft_bold + exec 'hi luaCondEnd' . s:fg_purple + + " Clojure highlighting: + exec 'hi clojureConstant' . s:fg_blue + exec 'hi clojureBoolean' . s:fg_orange + exec 'hi clojureCharacter' . s:fg_olive + exec 'hi clojureKeyword' . s:fg_pink + exec 'hi clojureNumber' . s:fg_orange + exec 'hi clojureString' . s:fg_olive + exec 'hi clojureRegexp' . s:fg_purple + exec 'hi clojureRegexpEscape' . s:fg_pink + exec 'hi clojureParen' . s:fg_aqua + exec 'hi clojureVariable' . s:fg_olive + exec 'hi clojureCond' . s:fg_blue + exec 'hi clojureDefine' . s:fg_blue . s:ft_bold + exec 'hi clojureException' . s:fg_red + exec 'hi clojureFunc' . s:fg_navy + exec 'hi clojureMacro' . s:fg_blue + exec 'hi clojureRepeat' . s:fg_blue + exec 'hi clojureSpecial' . s:fg_blue . s:ft_bold + exec 'hi clojureQuote' . s:fg_blue + exec 'hi clojureUnquote' . s:fg_blue + exec 'hi clojureMeta' . s:fg_blue + exec 'hi clojureDeref' . s:fg_blue + exec 'hi clojureAnonArg' . s:fg_blue + exec 'hi clojureRepeat' . s:fg_blue + exec 'hi clojureDispatch' . s:fg_aqua + + " Dockerfile Highlighting + " @target https://github.com/docker/docker/tree/master/contrib/syntax/vim + exec 'hi dockerfileKeyword' . s:fg_blue + exec 'hi shDerefVar' . s:fg_purple . s:ft_bold + exec 'hi shOperator' . s:fg_aqua + exec 'hi shOption' . s:fg_navy + exec 'hi shLine' . s:fg_foreground + exec 'hi shWrapLineOperator' . s:fg_pink + + " NGINX Highlighting + " @target https://github.com/evanmiller/nginx-vim-syntax + exec 'hi ngxDirectiveBlock' . s:fg_pink . s:ft_bold + exec 'hi ngxDirective' . s:fg_blue . s:ft_none + exec 'hi ngxDirectiveImportant' . s:fg_blue . s:ft_bold + exec 'hi ngxString' . s:fg_olive + exec 'hi ngxVariableString' . s:fg_purple + exec 'hi ngxVariable' . s:fg_purple . s:ft_none + + " Yaml Highlighting + exec 'hi yamlBlockMappingKey' . s:fg_blue + exec 'hi yamlKeyValueDelimiter' . s:fg_pink + exec 'hi yamlBlockCollectionItemStart' . s:fg_pink + + " Qt QML Highlighting + exec 'hi qmlObjectLiteralType' . s:fg_pink + exec 'hi qmlReserved' . s:fg_purple + exec 'hi qmlBindingProperty' . s:fg_navy + exec 'hi qmlType' . s:fg_navy + + " Dosini Highlighting + exec 'hi dosiniHeader' . s:fg_pink + exec 'hi dosiniLabel' . s:fg_blue + + " Mail highlighting + exec 'hi mailHeaderKey' . s:fg_blue + exec 'hi mailHeaderEmail' . s:fg_purple + exec 'hi mailSubject' . s:fg_pink + exec 'hi mailHeader' . s:fg_comment + exec 'hi mailURL' . s:fg_aqua + exec 'hi mailEmail' . s:fg_purple + exec 'hi mailQuoted1' . s:fg_olive + exec 'hi mailQuoted2' . s:fg_navy + + " XML Highlighting + exec 'hi xmlProcessingDelim' . s:fg_pink + exec 'hi xmlString' . s:fg_olive + exec 'hi xmlEqual' . s:fg_orange + exec 'hi xmlAttrib' . s:fg_navy + exec 'hi xmlAttribPunct' . s:fg_pink + exec 'hi xmlTag' . s:fg_blue + exec 'hi xmlTagName' . s:fg_blue + exec 'hi xmlEndTag' . s:fg_blue + exec 'hi xmlNamespace' . s:fg_orange + + " Exlixir Highlighting + " @target https://github.com/elixir-lang/vim-elixir + exec 'hi elixirAlias' . s:fg_blue . s:ft_bold + exec 'hi elixirAtom' . s:fg_navy + exec 'hi elixirVariable' . s:fg_navy + exec 'hi elixirUnusedVariable' . s:fg_foreground . s:ft_bold + exec 'hi elixirInclude' . s:fg_purple + exec 'hi elixirStringDelimiter' . s:fg_olive + exec 'hi elixirKeyword' . s:fg_purple . s:ft_bold + exec 'hi elixirFunctionDeclaration' . s:fg_aqua . s:ft_bold + exec 'hi elixirBlockDefinition' . s:fg_pink + exec 'hi elixirDefine' . s:fg_pink + exec 'hi elixirStructDefine' . s:fg_pink + exec 'hi elixirPrivateDefine' . s:fg_pink + exec 'hi elixirModuleDefine' . s:fg_pink + exec 'hi elixirProtocolDefine' . s:fg_pink + exec 'hi elixirImplDefine' . s:fg_pink + exec 'hi elixirModuleDeclaration' . s:fg_aqua . s:ft_bold + exec 'hi elixirDocString' . s:fg_olive + exec 'hi elixirDocTest' . s:fg_green . s:ft_bold + + " Erlang Highlighting + exec 'hi erlangBIF' . s:fg_purple . s:ft_bold + exec 'hi erlangBracket' . s:fg_pink + exec 'hi erlangLocalFuncCall' . s:fg_foreground + exec 'hi erlangVariable' . s:fg_foreground + exec 'hi erlangAtom' . s:fg_navy + exec 'hi erlangAttribute' . s:fg_blue . s:ft_bold + exec 'hi erlangRecordDef' . s:fg_blue . s:ft_bold + exec 'hi erlangRecord' . s:fg_blue + exec 'hi erlangRightArrow' . s:fg_blue . s:ft_bold + exec 'hi erlangStringModifier' . s:fg_olive . s:ft_bold + exec 'hi erlangInclude' . s:fg_blue . s:ft_bold + exec 'hi erlangKeyword' . s:fg_pink + exec 'hi erlangGlobalFuncCall' . s:fg_foreground + + " Cucumber Highlighting + exec 'hi cucumberFeature' . s:fg_blue . s:ft_bold + exec 'hi cucumberBackground' . s:fg_pink . s:ft_bold + exec 'hi cucumberScenario' . s:fg_pink . s:ft_bold + exec 'hi cucumberGiven' . s:fg_orange + exec 'hi cucumberGivenAnd' . s:fg_blue + exec 'hi cucumberThen' . s:fg_orange + exec 'hi cucumberThenAnd' . s:fg_blue + exec 'hi cucumberWhen' . s:fg_purple . s:ft_bold + exec 'hi cucumberScenarioOutline' . s:fg_pink . s:ft_bold + exec 'hi cucumberExamples' . s:fg_aqua + exec 'hi cucumberTags' . s:fg_aqua + exec 'hi cucumberPlaceholder' . s:fg_aqua + + " Ada Highlighting + exec 'hi adaInc' . s:fg_aqua . s:ft_bold + exec 'hi adaSpecial' . s:fg_aqua . s:ft_bold + exec 'hi adaKeyword' . s:fg_pink + exec 'hi adaBegin' . s:fg_pink + exec 'hi adaEnd' . s:fg_pink + exec 'hi adaTypedef' . s:fg_navy . s:ft_bold + exec 'hi adaAssignment' . s:fg_aqua . s:ft_bold + exec 'hi adaAttribute' . s:fg_green + + " COBOL Highlighting + exec 'hi cobolMarker' . s:fg_comment . s:bg_cursorline + exec 'hi cobolLine' . s:fg_foreground + exec 'hi cobolReserved' . s:fg_blue + exec 'hi cobolDivision' . s:fg_pink . s:ft_bold + exec 'hi cobolDivisionName' . s:fg_pink . s:ft_bold + exec 'hi cobolSection' . s:fg_navy . s:ft_bold + exec 'hi cobolSectionName' . s:fg_navy . s:ft_bold + exec 'hi cobolParagraph' . s:fg_purple + exec 'hi cobolParagraphName' . s:fg_purple + exec 'hi cobolDeclA' . s:fg_purple + exec 'hi cobolDecl' . s:fg_green + exec 'hi cobolCALLs' . s:fg_aqua . s:ft_bold + exec 'hi cobolEXECs' . s:fg_aqua . s:ft_bold + + " GNU sed highlighting + exec 'hi sedST' . s:fg_purple . s:ft_bold + exec 'hi sedFlag' . s:fg_purple . s:ft_bold + exec 'hi sedRegexp47' . s:fg_pink + exec 'hi sedRegexpMeta' . s:fg_blue . s:ft_bold + exec 'hi sedReplacement47' . s:fg_olive + exec 'hi sedReplaceMeta' . s:fg_orange . s:ft_bold + exec 'hi sedAddress' . s:fg_pink + exec 'hi sedFunction' . s:fg_aqua . s:ft_bold + exec 'hi sedBranch' . s:fg_green . s:ft_bold + exec 'hi sedLabel' . s:fg_green . s:ft_bold + + " GNU awk highlighting + exec 'hi awkPatterns' . s:fg_pink . s:ft_bold + exec 'hi awkSearch' . s:fg_pink + exec 'hi awkRegExp' . s:fg_blue . s:ft_bold + exec 'hi awkCharClass' . s:fg_blue . s:ft_bold + exec 'hi awkFieldVars' . s:fg_green . s:ft_bold + exec 'hi awkStatement' . s:fg_blue . s:ft_bold + exec 'hi awkFunction' . s:fg_blue + exec 'hi awkVariables' . s:fg_green . s:ft_bold + exec 'hi awkArrayElement' . s:fg_orange + exec 'hi awkOperator' . s:fg_foreground + exec 'hi awkBoolLogic' . s:fg_foreground + exec 'hi awkExpression' . s:fg_foreground + exec 'hi awkSpecialPrintf' . s:fg_olive . s:ft_bold + + " Elm highlighting + exec 'hi elmImport' . s:fg_navy + exec 'hi elmAlias' . s:fg_aqua + exec 'hi elmType' . s:fg_pink + exec 'hi elmOperator' . s:fg_aqua . s:ft_bold + exec 'hi elmBraces' . s:fg_aqua . s:ft_bold + exec 'hi elmTypedef' . s:fg_blue . s:ft_bold + exec 'hi elmTopLevelDecl' . s:fg_green . s:ft_bold + + " Purescript highlighting + exec 'hi purescriptModuleKeyword' . s:fg_navy + exec 'hi purescriptImportKeyword' . s:fg_navy + exec 'hi purescriptModuleName' . s:fg_pink + exec 'hi purescriptOperator' . s:fg_aqua . s:ft_bold + exec 'hi purescriptType' . s:fg_pink + exec 'hi purescriptTypeVar' . s:fg_navy + exec 'hi purescriptStructure' . s:fg_blue . s:ft_bold + exec 'hi purescriptLet' . s:fg_blue . s:ft_bold + exec 'hi purescriptFunction' . s:fg_green . s:ft_bold + exec 'hi purescriptDelimiter' . s:fg_aqua . s:ft_bold + exec 'hi purescriptStatement' . s:fg_purple . s:ft_bold + exec 'hi purescriptConstructor' . s:fg_pink + exec 'hi purescriptWhere' . s:fg_purple . s:ft_bold + + " F# highlighting + exec 'hi fsharpTypeName' . s:fg_pink + exec 'hi fsharpCoreClass' . s:fg_pink + exec 'hi fsharpType' . s:fg_pink + exec 'hi fsharpKeyword' . s:fg_blue . s:ft_bold + exec 'hi fsharpOperator' . s:fg_aqua . s:ft_bold + exec 'hi fsharpBoolean' . s:fg_green . s:ft_bold + exec 'hi fsharpFormat' . s:fg_foreground + exec 'hi fsharpLinq' . s:fg_blue + exec 'hi fsharpKeyChar' . s:fg_aqua . s:ft_bold + exec 'hi fsharpOption' . s:fg_orange + exec 'hi fsharpCoreMethod' . s:fg_purple + exec 'hi fsharpAttrib' . s:fg_orange + exec 'hi fsharpModifier' . s:fg_aqua + exec 'hi fsharpOpen' . s:fg_red + + " ASN.1 highlighting + exec 'hi asnExternal' . s:fg_green . s:ft_bold + exec 'hi asnTagModifier' . s:fg_purple + exec 'hi asnBraces' . s:fg_aqua . s:ft_bold + exec 'hi asnDefinition' . s:fg_foreground + exec 'hi asnStructure' . s:fg_blue + exec 'hi asnType' . s:fg_pink + exec 'hi asnTypeInfo' . s:fg_aqua . s:ft_bold + exec 'hi asnFieldOption' . s:fg_purple + + " }}} + + " Plugin: Netrw + exec 'hi netrwVersion' . s:fg_red + exec 'hi netrwList' . s:fg_pink + exec 'hi netrwHidePat' . s:fg_olive + exec 'hi netrwQuickHelp' . s:fg_blue + exec 'hi netrwHelpCmd' . s:fg_blue + exec 'hi netrwDir' . s:fg_aqua . s:ft_bold + exec 'hi netrwClassify' . s:fg_pink + exec 'hi netrwExe' . s:fg_green + exec 'hi netrwSuffixes' . s:fg_comment + exec 'hi netrwTreeBar' . s:fg_linenumber_fg + + " Plugin: NERDTree + exec 'hi NERDTreeUp' . s:fg_comment + exec 'hi NERDTreeHelpCommand' . s:fg_pink + exec 'hi NERDTreeHelpTitle' . s:fg_blue . s:ft_bold + exec 'hi NERDTreeHelpKey' . s:fg_pink + exec 'hi NERDTreeHelp' . s:fg_foreground + exec 'hi NERDTreeToggleOff' . s:fg_red + exec 'hi NERDTreeToggleOn' . s:fg_green + exec 'hi NERDTreeDir' . s:fg_blue . s:ft_bold + exec 'hi NERDTreeDirSlash' . s:fg_pink + exec 'hi NERDTreeFile' . s:fg_foreground + exec 'hi NERDTreeExecFile' . s:fg_green + exec 'hi NERDTreeOpenable' . s:fg_aqua . s:ft_bold + exec 'hi NERDTreeClosable' . s:fg_pink + + " Plugin: Tagbar + exec 'hi TagbarHelpTitle' . s:fg_blue . s:ft_bold + exec 'hi TagbarHelp' . s:fg_foreground + exec 'hi TagbarKind' . s:fg_pink + exec 'hi TagbarSignature' . s:fg_aqua + + " Plugin: Vimdiff + exec 'hi DiffAdd' . s:fg_diffadd_fg . s:bg_diffadd_bg . s:ft_none + exec 'hi DiffChange' . s:fg_diffchange_fg . s:bg_diffchange_bg . s:ft_none + exec 'hi DiffDelete' . s:fg_diffdelete_fg . s:bg_diffdelete_bg . s:ft_none + exec 'hi DiffText' . s:fg_difftext_fg . s:bg_difftext_bg . s:ft_none + + " Plugin: AGit + exec 'hi agitHead' . s:fg_green . s:ft_bold + exec 'hi agitHeader' . s:fg_olive + exec 'hi agitStatAdded' . s:fg_diffadd_fg + exec 'hi agitStatRemoved' . s:fg_diffdelete_fg + exec 'hi agitDiffAdd' . s:fg_diffadd_fg + exec 'hi agitDiffRemove' . s:fg_diffdelete_fg + exec 'hi agitDiffHeader' . s:fg_pink + exec 'hi agitDiff' . s:fg_foreground + exec 'hi agitDiffIndex' . s:fg_purple + exec 'hi agitDiffFileName' . s:fg_aqua + exec 'hi agitLog' . s:fg_foreground + exec 'hi agitAuthorMark' . s:fg_olive + exec 'hi agitDateMark' . s:fg_comment + exec 'hi agitHeaderLabel' . s:fg_aqua + exec 'hi agitDate' . s:fg_aqua + exec 'hi agitTree' . s:fg_pink + exec 'hi agitRef' . s:fg_blue . s:ft_bold + exec 'hi agitRemote' . s:fg_purple . s:ft_bold + exec 'hi agitTag' . s:fg_orange . s:ft_bold + + " Plugin: Spell Checking + exec 'hi SpellBad' . s:fg_foreground . s:bg_spellbad + exec 'hi SpellCap' . s:fg_foreground . s:bg_spellcap + exec 'hi SpellRare' . s:fg_foreground . s:bg_spellrare + exec 'hi SpellLocal' . s:fg_foreground . s:bg_spelllocal + + " Plugin: Indent Guides + exec 'hi IndentGuidesOdd' . s:bg_background + exec 'hi IndentGuidesEven' . s:bg_cursorline + + " Plugin: Startify + exec 'hi StartifyFile' . s:fg_blue . s:ft_bold + exec 'hi StartifyNumber' . s:fg_orange + exec 'hi StartifyHeader' . s:fg_comment + exec 'hi StartifySection' . s:fg_pink + exec 'hi StartifyPath' . s:fg_foreground + exec 'hi StartifySlash' . s:fg_navy + exec 'hi StartifyBracket' . s:fg_aqua + exec 'hi StartifySpecial' . s:fg_aqua + + " Git commit message + exec 'hi gitcommitSummary' . s:fg_blue + exec 'hi gitcommitHeader' . s:fg_green . s:ft_bold + exec 'hi gitcommitSelectedType' . s:fg_blue + exec 'hi gitcommitSelectedFile' . s:fg_pink + exec 'hi gitcommitUntrackedFile' . s:fg_diffdelete_fg + exec 'hi gitcommitBranch' . s:fg_aqua . s:ft_bold + exec 'hi gitcommitDiscardedType' . s:fg_diffdelete_fg + exec 'hi gitcommitDiff' . s:fg_comment + + exec 'hi diffFile' . s:fg_blue + exec 'hi diffSubname' . s:fg_comment + exec 'hi diffIndexLine' . s:fg_comment + exec 'hi diffAdded' . s:fg_diffadd_fg + exec 'hi diffRemoved' . s:fg_diffdelete_fg + exec 'hi diffLine' . s:fg_orange + exec 'hi diffBDiffer' . s:fg_orange + exec 'hi diffNewFile' . s:fg_comment + +endfun +" }}} + +" ================================== MISC ===================================== +" Command to show theme information {{{ +fun! g:PaperColor() + echom 'PaperColor Theme Framework' + echom ' version ' . s:version + echom ' by Nikyle Nguyen et al.' + echom ' at https://github.com/NLKNguyen/papercolor-theme/' + echom ' ' + echom 'Current theme: ' . s:theme_name + echom ' ' . s:selected_theme['description'] + echom ' by ' . s:selected_theme['maintainer'] + echom ' at ' . s:selected_theme['source'] + + " TODO: add diff display for theme color names between 'default' and current + " theme if it is a custom theme, i.e. child theme. +endfun + +" @brief command alias for g:PaperColor() +command! -nargs=0 PaperColor :call g:PaperColor() +" }}} + +" =============================== MAIN ======================================== + +hi clear +syntax reset +let g:colors_name = "PaperColor" + +call s:acquire_theme_data() +call s:identify_color_mode() + +call s:generate_theme_option_variables() +call s:generate_language_option_variables() + +call s:set_format_attributes() +call s:set_overriding_colors() + +call s:convert_colors() +call s:set_color_variables() + +call s:apply_syntax_highlightings() + +" ============================================================================= +" Cheers! +" vim: fdm=marker ff=unix diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/badwolf.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/badwolf.vim new file mode 100644 index 0000000..2cf4095 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/badwolf.vim @@ -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 +color=#1f1f1f +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 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 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') + +" }}} + +" }}} + diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/jellybeans.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/jellybeans.vim new file mode 100644 index 0000000..fd8e132 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/jellybeans.vim @@ -0,0 +1,672 @@ + +set background=dark + +hi clear + +if exists("syntax_on") + syntax reset +endif + +let colors_name = "jellybeans" + +if has("gui_running") || (has('termguicolors') && &termguicolors) + let s:true_color = 1 +else + let s:true_color = 0 +endif + +if s:true_color || &t_Co >= 88 + let s:low_color = 0 +else + let s:low_color = 1 +endif + +" Configuration Variables: +" - g:jellybeans_overrides (default = {}) +" - g:jellybeans_use_lowcolor_black (default = 0) +" - g:jellybeans_use_gui_italics (default = 1) +" - g:jellybeans_use_term_italics (default = 0) + +let s:background_color = "000" + +if exists("g:jellybeans_overrides") + let s:overrides = g:jellybeans_overrides +else + let s:overrides = {} +endif + +" Backwards compatibility +if exists("g:jellybeans_background_color") + \ || exists("g:jellybeans_background_color_256") + \ || exists("g:jellybeans_use_term_background_color") + + let s:overrides = deepcopy(s:overrides) + + if !has_key(s:overrides, "background") + let s:overrides["background"] = {} + endif + + if exists("g:jellybeans_background_color") + let s:overrides["background"]["guibg"] = g:jellybeans_background_color + endif + + if exists("g:jellybeans_background_color_256") + let s:overrides["background"]["256ctermbg"] = g:jellybeans_background_color_256 + endif + + if exists("g:jellybeans_use_term_background_color") + \ && g:jellybeans_use_term_background_color + let s:overrides["background"]["ctermbg"] = "NONE" + let s:overrides["background"]["256ctermbg"] = "NONE" + endif +endif + +if exists("g:jellybeans_use_lowcolor_black") && g:jellybeans_use_lowcolor_black + let s:termBlack = "Black" +else + let s:termBlack = "Grey" +endif + +" When `termguicolors` is set, Vim[^1] ignores `hi Normal guibg=NONE` +" after Normal's `guibg` is already set to a color. See: +" +" - https://github.com/vim/vim/issues/981 +" - https://github.com/nanotech/jellybeans.vim/issues/64 +" +" To work around this, ensure we don't set the default background +" color before an override changes it to `NONE` by ensuring that the +" background color isn't set to a value different from its override. +" +" [^1]: Tested on 8.0.567. Does not apply to Neovim. +" +if has_key(s:overrides, "background") && has_key(s:overrides["background"], "guibg") + let s:background_color = s:overrides["background"]["guibg"] +endif + +" Color approximation functions by Henry So, Jr. and David Liang {{{ +" Added to jellybeans.vim by Daniel Herbert + +if &t_Co == 88 + + " returns an approximate grey index for the given grey level + fun! s:grey_number(x) + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + endfun + + " returns the actual grey level represented by the grey index + fun! s:grey_level(n) + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + endfun + + " returns the palette index for the given grey index + fun! s:grey_color(n) + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + endfun + + " returns an approximate color index for the given color level + fun! s:rgb_number(x) + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + endfun + + " returns the actual color level for the given color index + fun! s:rgb_level(n) + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + endfun + + " returns the palette index for the given R/G/B color indices + fun! s:rgb_color(x, y, z) + return 16 + (a:x * 16) + (a:y * 4) + a:z + endfun + +else " assuming &t_Co == 256 + + " returns an approximate grey index for the given grey level + fun! s:grey_number(x) + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endfun + + " returns the actual grey level represented by the grey index + fun! s:grey_level(n) + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endfun + + " returns the palette index for the given grey index + fun! s:grey_color(n) + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endfun + + " returns an approximate color index for the given color level + fun! s:rgb_number(x) + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endfun + + " returns the actual color level for the given color index + fun! s:rgb_level(n) + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endfun + + " returns the palette index for the given R/G/B color indices + fun! s:rgb_color(x, y, z) + return 16 + (a:x * 36) + (a:y * 6) + a:z + endfun + +endif + +" returns the palette index to approximate the given R/G/B color levels +fun! s:color(r, g, b) + " map greys directly (see xterm's 256colres.pl) + if &t_Co == 256 && a:r == a:g && a:g == a:b && a:r > 3 && a:r < 243 + return (a:r - 8) / 10 + 232 + endif + + " get the closest grey + let l:gx = s:grey_number(a:r) + let l:gy = s:grey_number(a:g) + let l:gz = s:grey_number(a:b) + + " get the closest color + let l:x = s:rgb_number(a:r) + let l:y = s:rgb_number(a:g) + let l:z = s:rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " there are two possibilities + let l:dgr = s:grey_level(l:gx) - a:r + let l:dgg = s:grey_level(l:gy) - a:g + let l:dgb = s:grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = s:rgb_level(l:gx) - a:r + let l:dg = s:rgb_level(l:gy) - a:g + let l:db = s:rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " use the grey + return s:grey_color(l:gx) + else + " use the color + return s:rgb_color(l:x, l:y, l:z) + endif + else + " only one possibility + return s:rgb_color(l:x, l:y, l:z) + endif +endfun + +fun! s:is_empty_or_none(str) + return empty(a:str) || a:str ==? "NONE" +endfun + +" returns the palette index to approximate the 'rrggbb' hex string +fun! s:rgb(rgb) + if s:is_empty_or_none(a:rgb) + return "NONE" + endif + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + return s:color(l:r, l:g, l:b) +endfun + +fun! s:prefix_highlight_value_with(prefix, color) + if s:is_empty_or_none(a:color) + return "NONE" + else + return a:prefix . a:color + endif +endfun + +fun! s:remove_italic_attr(attr) + let l:attr = join(filter(split(a:attr, ","), "v:val !=? 'italic'"), ",") + if empty(l:attr) + let l:attr = "NONE" + endif + return l:attr +endfun + +" sets the highlighting for the given group +fun! s:X(group, fg, bg, attr, lcfg, lcbg) + if s:low_color + let l:cmd = "hi ".a:group. + \ " ctermfg=".s:prefix_highlight_value_with("", a:lcfg). + \ " ctermbg=".s:prefix_highlight_value_with("", a:lcbg) + else + let l:cmd = "hi ".a:group. + \ " guifg=".s:prefix_highlight_value_with("#", a:fg). + \ " guibg=".s:prefix_highlight_value_with("#", a:bg) + if !s:true_color + let l:cmd = l:cmd. + \ " ctermfg=".s:rgb(a:fg). + \ " ctermbg=".s:rgb(a:bg) + endif + endif + + let l:attr = s:prefix_highlight_value_with("", a:attr) + + if exists("g:jellybeans_use_term_italics") && g:jellybeans_use_term_italics + let l:cterm_attr = l:attr + else + let l:cterm_attr = s:remove_italic_attr(l:attr) + endif + + if !exists("g:jellybeans_use_gui_italics") || g:jellybeans_use_gui_italics + let l:gui_attr = l:attr + else + let l:gui_attr = s:remove_italic_attr(l:attr) + endif + + let l:cmd = l:cmd." gui=".l:gui_attr." cterm=".l:cterm_attr + exec l:cmd +endfun +" }}} + +call s:X("Normal","e8e8d3",s:background_color,"","White","") +set background=dark + +call s:X("CursorLine","","1c1c1c","","",s:termBlack) +call s:X("CursorColumn","","1c1c1c","","",s:termBlack) + +" Some of Terminal.app's default themes have a cursor color +" too close to Jellybeans' preferred MatchParen background +" color to be easily distinguishable. Other terminals tend +" to use a brighter cursor color. +" +" Use a more distinct color in Terminal.app, and also in +" low-color terminals if the preferred background color is +" not available. +if !has('gui_running') && $TERM_PROGRAM == "Apple_Terminal" + let s:matchParenGuiFg = "dd0093" + let s:matchParenGuiBg = "000000" +else + let s:matchParenGuiFg = "ffffff" + let s:matchParenGuiBg = "556779" +endif +if s:termBlack != "Black" + let s:matchParenTermFg = "Magenta" + let s:matchParenTermBg = "" +else + let s:matchParenTermFg = "" + let s:matchParenTermBg = s:termBlack +endif +call s:X("MatchParen",s:matchParenGuiFg,s:matchParenGuiBg,"bold", +\ s:matchParenTermFg,s:matchParenTermBg) + +call s:X("TabLine","000000","b0b8c0","italic","",s:termBlack) +call s:X("TabLineFill","9098a0","","","",s:termBlack) +call s:X("TabLineSel","000000","f0f0f0","italic,bold",s:termBlack,"White") + +" Auto-completion +call s:X("Pmenu","ffffff","606060","","White",s:termBlack) +call s:X("PmenuSel","101010","eeeeee","",s:termBlack,"White") + +call s:X("Visual","","404040","","",s:termBlack) +call s:X("Cursor",s:background_color,"b0d0f0","","","") + +call s:X("LineNr","605958",s:background_color,"NONE",s:termBlack,"") +call s:X("CursorLineNr","ccc5c4","","NONE","White","") +call s:X("Comment","888888","","italic","Grey","") +call s:X("Todo","c7c7c7","","bold","White",s:termBlack) + +call s:X("StatusLine","000000","dddddd","italic","","White") +call s:X("StatusLineNC","ffffff","403c41","italic","White","Black") +call s:X("VertSplit","777777","403c41","",s:termBlack,s:termBlack) +call s:X("WildMenu","f0a0c0","302028","","Magenta","") + +call s:X("Folded","a0a8b0","384048","italic",s:termBlack,"") +call s:X("FoldColumn","535D66","1f1f1f","","",s:termBlack) +call s:X("SignColumn","777777","333333","","",s:termBlack) +call s:X("ColorColumn","","000000","","",s:termBlack) + +call s:X("Title","70b950","","bold","Green","") + +call s:X("Constant","cf6a4c","","","Red","") +call s:X("Special","799d6a","","","Green","") +call s:X("Delimiter","668799","","","Grey","") + +call s:X("String","99ad6a","","","Green","") +call s:X("StringDelimiter","556633","","","DarkGreen","") + +call s:X("Identifier","c6b6ee","","","LightCyan","") +call s:X("Structure","8fbfdc","","","LightCyan","") +call s:X("Function","fad07a","","","Yellow","") +call s:X("Statement","8197bf","","","DarkBlue","") +call s:X("PreProc","8fbfdc","","","LightBlue","") + +hi! link Operator Structure +hi! link Conceal Operator + +call s:X("Type","ffb964","","","Yellow","") +call s:X("NonText","606060",s:background_color,"",s:termBlack,"") + +call s:X("SpecialKey","444444","1c1c1c","",s:termBlack,"") + +call s:X("Search","f0a0c0","302028","underline","Magenta","") + +call s:X("Directory","dad085","","","Yellow","") +call s:X("ErrorMsg","","902020","","","DarkRed") +hi! link Error ErrorMsg +hi! link MoreMsg Special +call s:X("Question","65C254","","","Green","") + + +" Spell Checking + +call s:X("SpellBad","","902020","underline","","DarkRed") +call s:X("SpellCap","","0000df","underline","","Blue") +call s:X("SpellRare","","540063","underline","","DarkMagenta") +call s:X("SpellLocal","","2D7067","underline","","Green") + +" Diff + +hi! link diffRemoved Constant +hi! link diffAdded String + +" VimDiff + +call s:X("DiffAdd","D2EBBE","437019","","White","DarkGreen") +call s:X("DiffDelete","40000A","700009","","DarkRed","DarkRed") +call s:X("DiffChange","","2B5B77","","White","DarkBlue") +call s:X("DiffText","8fbfdc","000000","reverse","Yellow","") + +" PHP + +hi! link phpFunctions Function +call s:X("StorageClass","c59f6f","","","Red","") +hi! link phpSuperglobal Identifier +hi! link phpQuoteSingle StringDelimiter +hi! link phpQuoteDouble StringDelimiter +hi! link phpBoolean Constant +hi! link phpNull Constant +hi! link phpArrayPair Operator +hi! link phpOperator Normal +hi! link phpRelation Normal +hi! link phpVarSelector Identifier + +" Python + +hi! link pythonOperator Statement + +" Ruby + +hi! link rubySharpBang Comment +call s:X("rubyClass","447799","","","DarkBlue","") +call s:X("rubyIdentifier","c6b6fe","","","Cyan","") +hi! link rubyConstant Type +hi! link rubyFunction Function + +call s:X("rubyInstanceVariable","c6b6fe","","","Cyan","") +call s:X("rubySymbol","7697d6","","","Blue","") +hi! link rubyGlobalVariable rubyInstanceVariable +hi! link rubyModule rubyClass +call s:X("rubyControl","7597c6","","","Blue","") + +hi! link rubyString String +hi! link rubyStringDelimiter StringDelimiter +hi! link rubyInterpolationDelimiter Identifier + +call s:X("rubyRegexpDelimiter","540063","","","Magenta","") +call s:X("rubyRegexp","dd0093","","","DarkMagenta","") +call s:X("rubyRegexpSpecial","a40073","","","Magenta","") + +call s:X("rubyPredefinedIdentifier","de5577","","","Red","") + +" Erlang + +hi! link erlangAtom rubySymbol +hi! link erlangBIF rubyPredefinedIdentifier +hi! link erlangFunction rubyPredefinedIdentifier +hi! link erlangDirective Statement +hi! link erlangNode Identifier + +" Elixir + +hi! link elixirAtom rubySymbol + + +" JavaScript + +hi! link javaScriptValue Constant +hi! link javaScriptRegexpString rubyRegexp +hi! link javaScriptTemplateVar StringDelim +hi! link javaScriptTemplateDelim Identifier +hi! link javaScriptTemplateString String + +" CoffeeScript + +hi! link coffeeRegExp javaScriptRegexpString + +" Lua + +hi! link luaOperator Conditional + +" C + +hi! link cFormat Identifier +hi! link cOperator Constant + +" Objective-C/Cocoa + +hi! link objcClass Type +hi! link cocoaClass objcClass +hi! link objcSubclass objcClass +hi! link objcSuperclass objcClass +hi! link objcDirective rubyClass +hi! link objcStatement Constant +hi! link cocoaFunction Function +hi! link objcMethodName Identifier +hi! link objcMethodArg Normal +hi! link objcMessageName Identifier + +" Vimscript + +hi! link vimOper Normal + +" HTML + +hi! link htmlTag Statement +hi! link htmlEndTag htmlTag +hi! link htmlTagName htmlTag + +" XML + +hi! link xmlTag Statement +hi! link xmlEndTag xmlTag +hi! link xmlTagName xmlTag +hi! link xmlEqual xmlTag +hi! link xmlEntity Special +hi! link xmlEntityPunct xmlEntity +hi! link xmlDocTypeDecl PreProc +hi! link xmlDocTypeKeyword PreProc +hi! link xmlProcessingDelim xmlAttrib + +" Debugger.vim + +call s:X("DbgCurrent","DEEBFE","345FA8","","White","DarkBlue") +call s:X("DbgBreakPt","","4F0037","","","DarkMagenta") + +" vim-indent-guides + +if !exists("g:indent_guides_auto_colors") + let g:indent_guides_auto_colors = 0 +endif +call s:X("IndentGuidesOdd","","232323","","","") +call s:X("IndentGuidesEven","","1b1b1b","","","") + +" Plugins, etc. + +hi! link TagListFileName Directory +call s:X("PreciseJumpTarget","B9ED67","405026","","White","Green") + +" Manual overrides for 256-color terminals. Dark colors auto-map badly. +if !s:low_color + hi StatusLineNC ctermbg=235 + hi Folded ctermbg=236 + hi DiffText ctermfg=81 + hi DbgBreakPt ctermbg=53 + hi IndentGuidesOdd ctermbg=235 + hi IndentGuidesEven ctermbg=234 +endif + +if !empty("s:overrides") + fun! s:current_attr(group) + let l:synid = synIDtrans(hlID(a:group)) + let l:attrs = [] + for l:attr in ["bold", "italic", "reverse", "standout", "underline", "undercurl"] + if synIDattr(l:synid, l:attr, "gui") == 1 + call add(l:attrs, l:attr) + endif + endfor + return join(l:attrs, ",") + endfun + fun! s:current_color(group, what, mode) + let l:color = synIDattr(synIDtrans(hlID(a:group)), a:what, a:mode) + if l:color == -1 + return "" + else + return substitute(l:color, "^#", "", "") + endif + endfun + fun! s:load_color_def(group, def) + call s:X(a:group, get(a:def, "guifg", s:current_color(a:group, "fg", "gui")), + \ get(a:def, "guibg", s:current_color(a:group, "bg", "gui")), + \ get(a:def, "attr", s:current_attr(a:group)), + \ get(a:def, "ctermfg", s:current_color(a:group, "fg", "cterm")), + \ get(a:def, "ctermbg", s:current_color(a:group, "bg", "cterm"))) + if !s:low_color + for l:prop in ["ctermfg", "ctermbg"] + let l:override_key = "256".l:prop + if has_key(a:def, l:override_key) + exec "hi ".a:group." ".l:prop."=".a:def[l:override_key] + endif + endfor + endif + endfun + fun! s:load_colors(defs) + for [l:group, l:def] in items(a:defs) + if l:group == "background" + call s:load_color_def("LineNr", l:def) + call s:load_color_def("NonText", l:def) + call s:load_color_def("Normal", l:def) + else + call s:load_color_def(l:group, l:def) + endif + unlet l:group + unlet l:def + endfor + endfun + call s:load_colors(s:overrides) + delf s:load_colors + delf s:load_color_def + delf s:current_color + delf s:current_attr +endif + +" delete functions {{{ +delf s:X +delf s:remove_italic_attr +delf s:prefix_highlight_value_with +delf s:rgb +delf s:is_empty_or_none +delf s:color +delf s:rgb_color +delf s:rgb_level +delf s:rgb_number +delf s:grey_color +delf s:grey_level +delf s:grey_number +" }}} diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/quantum.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/quantum.vim new file mode 100644 index 0000000..edfb739 --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/colors/quantum.vim @@ -0,0 +1,261 @@ +" Quantum - A 24-bit Material color scheme for Vim +" Author: Brandon Siders +" License: MIT + +highlight clear + +if exists('syntax_on') + syntax reset +endif + +set background=dark +let g:colors_name = 'quantum' + +let g:quantum_italics = get(g:, 'quantum_italics', 0) +let g:quantum_black = get(g:, 'quantum_black', 0) + +" Color Palette +let s:gray1 = g:quantum_black ? '#000000' : '#000' +let s:gray2 = g:quantum_black ? '#292929' : '#2c3a41' +let s:gray3 = g:quantum_black ? '#474646' : '#425762' +let s:gray4 = g:quantum_black ? '#6a6c6c' : '#658494' +let s:gray5 = g:quantum_black ? '#b7bdc0' : '#aebbc5' +let s:red = '#dd7186' +let s:green = '#87bb7c' +let s:yellow = '#d5b875' +let s:blue = '#70ace5' +let s:purple = '#a48add' +let s:cyan = '#69c5ce' +let s:orange = '#d7956e' +let s:indigo = '#7681de' + +function! s:HL(group, fg, bg, attr) + let l:attr = a:attr + if !g:quantum_italics && l:attr ==# 'italic' + let l:attr = 'none' + endif + + if !empty(a:fg) + exec 'hi ' . a:group . ' guifg=' . a:fg + endif + if !empty(a:bg) + exec 'hi ' . a:group . ' guibg=' . a:bg + endif + if !empty(a:attr) + exec 'hi ' . a:group . ' gui=' . l:attr . ' cterm=' . l:attr + endif +endfun + +" Vim Editor +call s:HL('ColorColumn', '', s:gray2, '') +call s:HL('Cursor', s:gray2, s:gray5, '') +call s:HL('CursorColumn', '', s:gray2, '') +call s:HL('CursorLine', '', s:gray2, 'none') +call s:HL('CursorLineNr', s:cyan, s:gray2, 'none') +call s:HL('Directory', s:blue, '', '') +call s:HL('DiffAdd', s:green, s:gray2, 'none') +call s:HL('DiffChange', s:yellow, s:gray2, 'none') +call s:HL('DiffDelete', s:red, s:gray2, 'none') +call s:HL('DiffText', s:blue, s:gray2, 'none') +call s:HL('ErrorMsg', s:red, s:gray1, 'bold') +call s:HL('FoldColumn', s:gray4, s:gray1, '') +call s:HL('Folded', s:gray3, s:gray1, '') +call s:HL('IncSearch', s:gray1, 's:gray5', '') +call s:HL('LineNr', s:gray3, '', '') +call s:HL('MatchParen', s:gray4, s:cyan, 'bold') +call s:HL('ModeMsg', s:green, '', '') +call s:HL('MoreMsg', s:green, '', '') +call s:HL('NonText', s:gray4, '', 'none') +call s:HL('Normal', s:gray5, s:gray1, 'none') +call s:HL('Pmenu', s:gray5, s:gray3, '') +call s:HL('PmenuSbar', '', s:gray2, '') +call s:HL('PmenuSel', s:gray2, s:cyan, '') +call s:HL('PmenuThumb', '', s:gray4, '') +call s:HL('Question', s:blue, '', 'none') +call s:HL('Search', s:yellow, s:gray1, '') +call s:HL('SignColumn', s:gray5, s:gray1, '') +call s:HL('SpecialKey', s:gray4, '', '') +call s:HL('SpellCap', s:blue, s:gray2, 'undercurl') +call s:HL('SpellBad', s:red, s:gray2, 'undercurl') +call s:HL('StatusLine', s:gray5, s:gray3, 'none') +call s:HL('StatusLineNC', s:gray2, s:gray4, '') +call s:HL('TabLine', s:gray4, s:gray2, 'none') +call s:HL('TabLineFill', s:gray4, s:gray2, 'none') +call s:HL('TabLineSel', s:yellow, s:gray3, 'none') +call s:HL('Title', s:green, '', 'none') +call s:HL('VertSplit', s:gray4, s:gray1, 'none') +call s:HL('Visual', s:gray5, s:gray3, '') +call s:HL('WarningMsg', s:red, '', '') +call s:HL('WildMenu', s:gray2, s:cyan, '') + +" Standard Syntax +call s:HL('Comment', s:gray4, '', 'italic') +call s:HL('Constant', s:orange, '', '') +call s:HL('String', s:green, '', '') +call s:HL('Character', s:green, '', '') +call s:HL('Identifier', s:red, '', 'none') +call s:HL('Function', s:blue, '', '') +call s:HL('Statement', s:purple, '', 'none') +call s:HL('Operator', s:cyan, '', '') +call s:HL('PreProc', s:cyan, '', '') +call s:HL('Include', s:blue, '', '') +call s:HL('Define', s:purple, '', 'none') +call s:HL('Macro', s:purple, '', '') +call s:HL('Type', s:yellow, '', 'none') +call s:HL('Structure', s:cyan, '', '') +call s:HL('Special', s:indigo, '', '') +call s:HL('Underlined', s:blue, '', 'none') +call s:HL('Error', s:red, s:gray1, 'bold') +call s:HL('Todo', s:orange, s:gray1, 'bold') + +" CSS +call s:HL('cssAttrComma', s:gray5, '', '') +call s:HL('cssPseudoClassId', s:yellow, '', '') +call s:HL('cssBraces', s:gray5, '', '') +call s:HL('cssClassName', s:yellow, '', '') +call s:HL('cssClassNameDot', s:yellow, '', '') +call s:HL('cssFunctionName', s:blue, '', '') +call s:HL('cssImportant', s:cyan, '', '') +call s:HL('cssIncludeKeyword', s:purple, '', '') +call s:HL('cssTagName', s:red, '', '') +call s:HL('cssMediaType', s:orange, '', '') +call s:HL('cssProp', s:gray5, '', '') +call s:HL('cssSelectorOp', s:cyan, '', '') +call s:HL('cssSelectorOp2', s:cyan, '', '') + +" Commit Messages (Git) +call s:HL('gitcommitHeader', s:purple, '', '') +call s:HL('gitcommitUnmerged', s:green, '', '') +call s:HL('gitcommitSelectedFile', s:green, '', '') +call s:HL('gitcommitDiscardedFile', s:red, '', '') +call s:HL('gitcommitUnmergedFile', s:yellow, '', '') +call s:HL('gitcommitSelectedType', s:green, '', '') +call s:HL('gitcommitSummary', s:blue, '', '') +call s:HL('gitcommitDiscardedType', 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 + +" HTML +call s:HL('htmlEndTag', s:blue, '', '') +call s:HL('htmlLink', s:red, '', '') +call s:HL('htmlTag', s:blue, '', '') +call s:HL('htmlTitle', s:gray5, '', '') +call s:HL('htmlSpecialTagName', s:purple, '', '') + +" Javascript +call s:HL('javaScriptBraces', s:gray5, '', '') +call s:HL('javaScriptNull', s:orange, '', '') +call s:HL('javaScriptIdentifier', s:purple, '', '') +call s:HL('javaScriptNumber', s:orange, '', '') +call s:HL('javaScriptRequire', s:cyan, '', '') +call s:HL('javaScriptReserved', s:purple, '', '') +" pangloss/vim-javascript +call s:HL('jsArrowFunction', s:purple, '', '') +call s:HL('jsAsyncKeyword', s:purple, '', '') +call s:HL('jsExtendsKeyword', s:purple, '', '') +call s:HL('jsClassKeyword', s:purple, '', '') +call s:HL('jsDocParam', s:green, '', '') +call s:HL('jsDocTags', s:cyan, '', '') +call s:HL('jsForAwait', s:purple, '', '') +call s:HL('jsFlowArgumentDef', s:yellow, '', '') +call s:HL('jsFrom', s:purple, '', '') +call s:HL('jsImport', s:purple, '', '') +call s:HL('jsExport', s:purple, '', '') +call s:HL('jsExportDefault', s:purple, '', '') +call s:HL('jsFuncCall', s:blue, '', '') +call s:HL('jsFunction', s:purple, '', '') +call s:HL('jsGlobalObjects', s:yellow, '', '') +call s:HL('jsGlobalNodeObjects', s:yellow, '', '') +call s:HL('jsModuleAs', s:purple, '', '') +call s:HL('jsNull', s:orange, '', '') +call s:HL('jsStorageClass', s:purple, '', '') +call s:HL('jsTemplateBraces', s:red, '', '') +call s:HL('jsTemplateExpression', s:red, '', '') +call s:HL('jsThis', s:red, '', '') +call s:HL('jsUndefined', s:orange, '', '') + +" JSON +call s:HL('jsonBraces', s:gray5, '', '') + +" Less +call s:HL('lessAmpersand', s:red, '', '') +call s:HL('lessClassChar', s:yellow, '', '') +call s:HL('lessCssAttribute', s:gray5, '', '') +call s:HL('lessFunction', s:blue, '', '') +call s:HL('lessVariable', s:purple, '', '') + +" Markdown +call s:HL('markdownBold', s:yellow, '', 'bold') +call s:HL('markdownCode', s:cyan, '', '') +call s:HL('markdownCodeBlock', s:cyan, '', '') +call s:HL('markdownCodeDelimiter', s:cyan, '', '') +call s:HL('markdownHeadingDelimiter', s:green, '', '') +call s:HL('markdownHeadingRule', s:gray4, '', '') +call s:HL('markdownId', s:purple, '', '') +call s:HL('markdownItalic', s:blue, '', 'italic') +call s:HL('markdownListMarker', s:orange, '', '') +call s:HL('markdownOrderedListMarker', s:orange, '', '') +call s:HL('markdownRule', s:gray4, '', '') +call s:HL('markdownUrl', s:purple, '', '') +call s:HL('markdownUrlTitleDelimiter', s:green, '', '') + +" Ruby +call s:HL('rubyInterpolation', s:cyan, '', '') +call s:HL('rubyInterpolationDelimiter', s:indigo, '', '') +call s:HL('rubyRegexp', s:cyan, '', '') +call s:HL('rubyRegexpDelimiter', s:indigo, '', '') +call s:HL('rubyStringDelimiter', s:green, '', '') + +" Sass +call s:HL('sassAmpersand', s:red, '', '') +call s:HL('sassClassChar', s:yellow, '', '') +call s:HL('sassMixinName', s:blue, '', '') +call s:HL('sassVariable', s:purple, '', '') + +" Vim-Fugitive +call s:HL('diffAdded', s:green, '', '') +call s:HL('diffRemoved', s:red, '', '') + +" Vim-Gittgutter +call s:HL('GitGutterAdd', s:green, '', '') +call s:HL('GitGutterChange', s:yellow, '', '') +call s:HL('GitGutterChangeDelete', s:orange, '', '') +call s:HL('GitGutterDelete', s:red, '', '') + +" Vim-Signify +hi link SignifySignAdd GitGutterAdd +hi link SignifySignChange GitGutterChange +hi link SignifySignDelete GitGutterDelete + +" XML +call s:HL('xmlAttrib', s:yellow, '', '') +call s:HL('xmlEndTag', s:blue, '', '') +call s:HL('xmlTag', s:blue, '', '') +call s:HL('xmlTagName', s:blue, '', '') + +" Neovim terminal colors +if has('nvim') + let g:terminal_color_0 = s:gray1 + let g:terminal_color_1 = s:red + let g:terminal_color_2 = s:green + let g:terminal_color_3 = s:yellow + let g:terminal_color_4 = s:blue + let g:terminal_color_5 = s:purple + let g:terminal_color_6 = s:cyan + let g:terminal_color_7 = s:gray5 + let g:terminal_color_8 = s:gray3 + let g:terminal_color_9 = s:red + let g:terminal_color_10 = s:green + let g:terminal_color_11 = s:yellow + let g:terminal_color_12 = s:blue + let g:terminal_color_13 = s:purple + let g:terminal_color_14 = s:cyan + let g:terminal_color_15 = s:gray4 + let g:terminal_color_background = g:terminal_color_0 + let g:terminal_color_foreground = g:terminal_color_7 +endif diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/custom.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/custom.vim new file mode 100644 index 0000000..0852b2e --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/custom.vim @@ -0,0 +1,216 @@ + +" Goyo mappings +nmap :Goyo 60x60 + +" Enable the Vue Language server +let g:LanguageClient_serverCommands = { + \ 'vue': ['vls'] + \ } + +" init rainbow brackets +"set to 0 if you want to enable it later via :RainbowToggle +let g:rainbow_active = 0 + +" Emmet mappings +let g:user_emmet_mode='a' " enable all functions in all modes +let g:user_emmet_leader_key='' + +" Devicon Configurations +" loading the plugin +let g:webdevicons_enable = 1 + +" Indention Config +let g:indentLine_char = '┊' + + +" Lightline Themes Configurations +let g:lightline = { + \ 'colorscheme': 'simpleblack', + \ 'active': { + \ 'left': [ [ 'mode', 'paste' ], + \ [ 'cocstatus', 'readonly', 'filename', 'modified' ] ] + \ }, + \ 'component_function': { + \ 'cocstatus': 'coc#status' + \ }, + \ } + + +" Use auocmd to force lightline update. +autocmd User CocStatusChange,CocDiagnosticChange call lightline#update() + +" Fancy markdown syntax +let g:markdown_fenced_languages = ['css', 'js=javascript'] + +" +++++++++++++++++++++ vim-float-term configuration +++++++++++++++++++++++++ + +let g:floaterm_keymap_new = '.' +let g:floaterm_position = 'center' +let g:floaterm_type = 'normal' + +" custom mappings for my person tools in normal mode only +nnoremap :FloatermNew ipython +nnoremap :FloatermNew lf +nnoremap :FloatermNew sefr + +" +++++++++++++++++++++++++ Conquer of Completion +++++++++++++++++++++++++ + +" if hidden is not set, TextEdit might fail. +set hidden + +" Some servers have issues with backup files, see #649 +set nobackup +set nowritebackup + +" Better display for messages +set cmdheight=2 + +" You will have bad experience for diagnostic messages when it's default 4000. +set updatetime=300 + +" don't give |ins-completion-menu| messages. +set shortmess+=c + +" always show signcolumns +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate. +" Use command ':verbose imap ' to make sure tab is not mapped by other plugin. +inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() +inoremap pumvisible() ? "\" : "\" + +function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion. +inoremap coc#refresh() + +" Use to confirm completion, `u` means break undo chain at current position. +" Coc only does snippet and additional edit on confirm. +inoremap pumvisible() ? "\" : "\u\" +" Or use `complete_info` if your vim support it, like: +" inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" + +" Use `[g` and `]g` to navigate diagnostics +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" Remap keys for gotos +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window +"nnoremap K :call show_documentation() + +function! s:show_documentation() + if (index(['vim','help'], &filetype) >= 0) + execute 'h '.expand('') + else + call CocAction('doHover') + endif +endfunction + +" Highlight symbol under cursor on CursorHold +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Remap for rename current word +nmap rn (coc-rename) + +" Remap for format selected region +xmap fr (coc-format-selected) +nmap fr (coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s). + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Remap for do codeAction of selected region, ex: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap for do codeAction of current line +nmap ac (coc-codeaction) +" Fix autofix problem of current line +nmap qf (coc-fix-current) + +" Create mappings for function text object, requires document symbols feature of languageserver. +xmap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap if (coc-funcobj-i) +omap af (coc-funcobj-a) + +" Use for select selections ranges, needs server support, like: coc-tsserver, coc-python +nmap (coc-range-select) +xmap (coc-range-select) + +" Use `:Format` to format current buffer +command! -nargs=0 Format :call CocAction('format') + +" Use `:Fold` to fold current buffer +command! -nargs=? Fold :call CocAction('fold', ) + +" use `:OR` for organize import of current buffer +command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') + +" Add status line support, for integration with other plugin, checkout `:h coc-status` +set statusline^=%{StatusDiagnostic()} + +" Using CocList +" Show all diagnostics +nnoremap a :CocList diagnostics +" Manage extensions +nnoremap e :CocList extensions +" Show commands +nnoremap c :CocList commands +" Find symbol of current document +nnoremap o :CocList outline +" Search workspace symbols +nnoremap s :CocList -I symbols +" Do default action for next item. +nnoremap j :CocNext +" Do default action for previous item. +nnoremap k :CocPrev +" Resume latest coc list +nnoremap p :CocListResume + +" Auto command for python projects +autocmd FileType python let b:coc_root_patterns = ['.git', '.env'] + +" Auto command for correct comment highlighting in Json files + autocmd FileType json syntax match Comment +\/\/.\+$+ +" status line function +function! StatusDiagnostic() abort + let info = get(b:, 'coc_diagnostic_info', {}) + if empty(info) | return '' | endif + let msgs = [] + if get(info, 'error', 0) + call add(msgs, 'E' . info['error']) + endif + if get(info, 'warning', 0) + call add(msgs, 'W' . info['warning']) + endif + return join(msgs, ' ') . ' ' . get(g:, 'coc_status', '') +endfunction + +" Disable node version warning +let g:coc_disable_startup_warning = 1 + +" Vim script coc extension +let g:markdown_fenced_languages = [ + \ 'vim', + \ 'help' + \] + +" Emoji completion +set completefunc=emoji#complete diff --git a/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/init.vim b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/init.vim new file mode 100644 index 0000000..9e8279b --- /dev/null +++ b/dotfiles/.config/nvim/library/MattDev_NvimConfig⛺/init.vim @@ -0,0 +1,23 @@ +runtime plugins.vim +runtime settings.vim +runtime themes.vim +runtime autocommands.vim +runtime coc.vim +runtime keys.vim + +" Check code as python3 by default +let g:neomake_python_python_maker = neomake#makers#ft#python#python() +let g:neomake_python_flake8_maker = neomake#makers#ft#python#flake8() +let g:neomake_python_python_maker.exe = 'python3 -m py_compile' +let g:neomake_python_flake8_maker.exe = 'python3 -m flake8' + +" Disable error messages inside the buffer, next to the problematic line +let g:neomake_virtualtext_current_error = 1 + +"------------------------------------------------------------------------------ +" Shawn Anderson as of September 30th 2020 +noremap f 0 +noremap j $ +map / :nohl + +test diff --git a/dotfiles/.config/nvim/library/mach2-plugins.vim b/dotfiles/.config/nvim/library/mach2-plugins.vim new file mode 100644 index 0000000..e69de29 diff --git a/dotfiles/.config/nvim/library/serious⌚/changelog.md b/dotfiles/.config/nvim/library/serious⌚/changelog.md new file mode 100644 index 0000000..39f7c4d --- /dev/null +++ b/dotfiles/.config/nvim/library/serious⌚/changelog.md @@ -0,0 +1,20 @@ + +" September 29th 2020 - Shawn Anderson +" ------------------------------------------------------------------------------ +" I have established a package management worklow with vim using stow. This has +" far reaching implications. +The command to load up the nvim environment that you want to be running is: +`stow -v -R nvim_v1/ -t ../` + +" September 22nd 2020 - Shawn Anderson +" ------------------------------------------------------------------------------ +" Now that I actually know what I'm doing in vim (somewhat) I'm starting a new +" config from scratch that will be the amalgamation of all the vim tricks and +" tweaks that I have accumulated over the years. Development is in close +" collaboration with Matthew Williams, whom I have been having a lot of vim +" discussions with lately. Original plugin count: Matt-28 Shawn-39. Only 10 +" overlapping. Matt had the deprecated nerdtree and Shawn had the deprecated +" nerdcommenter. In these cases the author has changed to preservim from +" scrooloose. +" + diff --git a/dotfiles/.config/nvim/library/serious⌚/init.vim b/dotfiles/.config/nvim/library/serious⌚/init.vim new file mode 100644 index 0000000..88b624b --- /dev/null +++ b/dotfiles/.config/nvim/library/serious⌚/init.vim @@ -0,0 +1,135 @@ +" ____ _ +" / ___|| |__ __ ___ ___ __ +" \___ \| '_ \ / _` \ \ /\ / / '_ \ +" ___) | | | | (_| |\ V V /| | | | +" |____/|_| |_|\__,_| \_/\_/ |_| |_| +" _ _ +" / \ _ __ __| | ___ _ __ ___ ___ _ __ +" / _ \ | '_ \ / _` |/ _ \ '__/ __|/ _ \| '_ \ +" / ___ \| | | | (_| | __/ | \__ \ (_) | | | | +" /_/ \_\_| |_|\__,_|\___|_| |___/\___/|_| |_| +" +" __ ___ +" \ \ / (_)_ __ ___ +" \ \ / /| | '_ ` _ \ +" \ V / | | | | | | | +"Neo \_/ |_|_| |_| |_| +" ____ __ _ _ _ +" / ___|___ _ __ / _(_) __ _ _ _ _ __ __ _| |_(_) ___ _ __ +" | | / _ \| '_ \| |_| |/ _` | | | | '__/ _` | __| |/ _ \| '_ \ +" | |__| (_) | | | | _| | (_| | |_| | | | (_| | |_| | (_) | | | | +" \____\___/|_| |_|_| |_|\__, |\__,_|_| \__,_|\__|_|\___/|_| |_| +" |___/ +" +" ============================================================================== +" Now that I actually know what I'm doing in vim (somewhat) I'm starting a new +" config from scratch that will be the amalgamation of all the vim tricks and +" tweaks that I have accumulated over the years. Development is in close +" collaboration with Matthew Williams, whom I have been having a lot of vim +" discussions with lately. Original plugin count: Matt-28 Shawn-39. Only 10 +" overlapping. Matt had the deprecated nerdtree and Shawn had the deprecated +" nerdcommenter. In these cases the author has changed to preservim from +" scrooloose. +" +" September 22nd 2020 - Shawn Anderson +" ============================================================================== +" Contents +" 0. Header and Introduction +" 1. Table of Contents +" 2. Feature List +" 3. Key Binding Listing and Philosophy +" 4. Plugin Directory and Customization +" 5. Conquer of Completion +" 6. General Configuration +" 7. Language Specific Configuration +" ============================================================================== +" Feature List +" TODO Tag based organization +" TODO Fuzzy search oriented workflow +" TODO Use ripgrep for plazingly fast file and string searches +" TODO Use bat for beautiful previews during fuzzy searches +" TODO Nerdtree Power Usage +" TODO Rapid Configuration with Key Bindings +" TODO Open plugin documentation from init.vim +" TODO Plugin graduation process from experimental to optional to required +" TODO Sort plugins by author, category, or requirment status +" ============================================================================== +" Key Binding List +" ============================================================================== +" Plugin Directory and Configuration +call plug#begin('~/.config/nvim/plugged') +Plug 'airblade/vim-gitgutter' " #git #:experimental #Origin-Shawn +Plug 'airblade/vim-rooter' " Used by fzf... TODO Why? #FuzzySearch #:experimental #Origin-Shawn +Plug 'alvan/vim-closetag' " Close tag pairs #Coding #:experimental #Origin-Shawn +Plug 'arielrossanigo/dir-configs-override.vim' "Override configs by directory TODO What is this? #Origin-Matt +Plug 'bfredl/nvim-ipy' " Ipython in Vim. TODO Is this complementary to Matt's floaterm workflow? #Coding #Python #:experimental #Origin-Shawn +Plug 'donRaphaco/neotex', {'for': 'tex'} "Plugin for live preview of LaTex #Origin-Matt +Plug 'euclio/vim-markdown-composer', { 'do': function('BuildComposer') } " Compose Markdown to view in browser #Workflow #:optional #Origin-Shawn +Plug 'fisadev/FixedTaskList.vim' "Pending tasks list #Origin-Matt +Plug 'itchyny/lightline.vim' "Lightline #Origin-Matt +Plug 'jeetsukumaran/vim-indentwise' " Indentation based movements #Origin-Matt +Plug 'jeffkreeftmeijer/vim-numbertoggle' " TODO What is this? #:experimental #Origin-Shawn +Plug 'jez/vim-superman' " Man Pages in Vim #SystemUtility #:experimental #Origin-Shawn +Plug 'jiangmiao/auto-pairs' " Auto close brackets TODO Is this necessary? #Coding #:experimental #Origin-Shawn +Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } "Code and files fuzzy finder #Origin-Matt +Plug 'junegunn/fzf.vim' "fzf for vim #Origin-Matt +Plug 'junegunn/goyo.vim' " Distraction free programming #Origin-Matt #:optional #Origin-Shawn +Plug 'junegunn/gv.vim' " #git #:experimental #Origin-Shawn +Plug 'junegunn/limelight.vim' " #:optional #Origin-Shawn +Plug 'junegunn/vim-easy-align' " #:experimental #Origin-Shawn +Plug 'junegunn/vim-emoji' "Vim Emoji #typing #Origin-Matt +Plug 'junegunn/vim-github-dashboard' " #git #:experimental #Origin-Shawn +Plug 'jreybert/vimagit' " Interactive git dashboard like emacs magit #git #:experimental #Origin-Shawn +Plug 'lilydjwg/colorizer' " Paint css colors with the real color #Origin-Matt +Plug 'liuchengxu/vista.vim' " Language server protocol.. TODO how does this relate to COC? #:experimental #Origin-Shawn +Plug 'lotabout/slimux' " Send strings across tmux panes! #Workflow #:optional #Origin-Shawn +Plug 'luochen1990/rainbow' "Rainbow Brackets #typing #Origin-Matt +Plug 'majutsushi/tagbar' "Class/module browser TODO known problems: * current block not refreshing' #Origin-Matt +Plug 'mattn/emmet-vim' " Generate html in a simple way TODO is this obsolete by coc-emmet #Origin-Matt +Plug 'mhinz/vim-signify' " Git/mercurial/others diff icons on the side of the file lines #Origin-Matt +Plug 'mhinz/vim-startify' " Fun homepage for vim #Workflow #:optional #Origin-Shawn +Plug 'michaeljsmith/vim-indent-object' " Indent text object #Origin-Matt +Plug 'mileszs/ack.vim' " Ack code search (requires ack installed in the system) TODO is there a way to prevent the progress which hides the editor? #Origin-Matt +Plug 'neoclide/coc.nvim', {'branch': 'release'} "Conquer of Completion #Completions #Origin-Matt #:required #Origin-Shawn +Plug 'neoclide/coc-eslint' " #Javascript #Linting #:experimental #Origin-Shawn +Plug 'neoclide/coc-prettier' " #Javascript #Linting #:experimental #Origin-Shawn +Plug 'neoclide/jsonc.vim' " TODO What is this? #:experimental #Origin-Shawn +Plug 'neomake/neomake' " #Linters TODO is it running on save? or when? TODO not detecting errors, just style, is it using pylint? #Origin-Matt #Origin-Shawn +Plug 'preservim/nerdcommenter' "Quick Commentor #typing #Origin-Matt +Plug 'preservim/nerdtree' | " #:required #Origin-Shawn + \ Plug 'Xuyuanp/nerdtree-git-plugin' | " #:optional #Origin-Shawn + \ Plug 'ryanoasis/vim-devicons' "Nice icons: Need to install patched font for this to work #Origin-Matt #:optional #Origin-Shawn +Plug 'scrooloose/nerdcommenter' " #:optional #Origin-Shawn +Plug 'scrooloose/nerdtree' "Vim extendable file browser #Origin-Matt +Plug 'sheerun/vim-polyglot' " #Origin-Shawn +Plug 'sheerun/vim-polyglot' " Better language packs #Origin-Matt +Plug 'shougo/context_filetype.vim' "Completion from other opened files #Origin-Matt +Plug 'Shougo/denite.nvim' " Unite all interfaces TODO Is this necessary with fzf? #Workflow #:experimental #Origin-Shawn +Plug 'tomlion/vim-solidity' " TODO I'm sure that we don't need this given COC #:experimental #Origin-Shawn +Plug 'townk/vim-autoclose' "Automatically close parenthesis, etc #Origin-Matt +Plug 'tpope/vim-fugitive' " Git integration #git #Origin-Matt +Plug 'tpope/vim-fugitive' " #:required #Origin-Shawn +Plug 'tpope/vim-repeat' " Enable dot operator to work on plugin commands #Workflow #:required #Origin-Shawn +Plug 'tpope/vim-rhubarb' " TODO What the heck is this? #:experimental #Origin-Shawn +Plug 'tpope/vim-speeddating' " TODO What is this? #:experimental #Origin-Shawn +Plug 'tpope/vim-surround' " Nice vim utility for surrounding blocks with things #Workflow #:optional #Origin-Shawn +Plug 'tpope/vim-unimpaired' " TODO What does this do? #Workflow #:experimental #Origin-Shawn +Plug 'vim-airline/vim-airline' " Airline status bar. TODO I'm sure I don't need this. Whatever Matt is doing is better. #:optional #Origin-Shawn +Plug 'vim-airline/vim-airline-themes' " Airline status bar. TODO I'm sure I don't need this. Whatever Matt is doing is better. #:optional #Origin-Shawn +Plug 'vim-scripts/indexedsearch' "Search results counter #Origin-Matt +Plug 'vimwiki/vimwiki' " For ultimate organization. #Workflow #:required #Origin-Shawn +Plug 'voldikss/vim-floaterm' "Integrated Floating terminal #Origin-Matt +Plug 'yggdroot/indentline' "Show indention level through lines #Origin-Matt +Plug 'yggdroot/indentline' " #Origin-Shawn +call plug#end() +" ============================================================================ + +:smile + +" vim-devicons +" add or override individual additional filetypes +" let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols = {} " needed +" let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['mkv'] = 'ƛ' + + + diff --git a/dotfiles/.config/nvim/library/serious⌚/vim-plug/plugins.vim b/dotfiles/.config/nvim/library/serious⌚/vim-plug/plugins.vim new file mode 100644 index 0000000..e69de29 diff --git a/dotfiles/.config/nvim/library/stow.fish b/dotfiles/.config/nvim/library/stow.fish new file mode 100644 index 0000000..d7a90d5 --- /dev/null +++ b/dotfiles/.config/nvim/library/stow.fish @@ -0,0 +1 @@ +stow -v -R serious/ -t ../ diff --git a/dotfiles/.config/nvim/library/unstow.fish b/dotfiles/.config/nvim/library/unstow.fish new file mode 100644 index 0000000..7977b76 --- /dev/null +++ b/dotfiles/.config/nvim/library/unstow.fish @@ -0,0 +1 @@ +stow -v -D serious/ -t ../