diff --git a/.config/nvim/colors/challenger-deep b/.config/nvim/colors/challenger-deep deleted file mode 160000 index 56e87bb..0000000 --- a/.config/nvim/colors/challenger-deep +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 56e87bbc83caf66b4c7326eb27890a79cc66bc52 diff --git a/.config/nvim/colors/challenger-deep/LICENSE b/.config/nvim/colors/challenger-deep/LICENSE new file mode 100755 index 0000000..6f354e0 --- /dev/null +++ b/.config/nvim/colors/challenger-deep/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 MaxSt + +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. diff --git a/.config/nvim/colors/challenger-deep/README.md b/.config/nvim/colors/challenger-deep/README.md new file mode 100755 index 0000000..9512971 --- /dev/null +++ b/.config/nvim/colors/challenger-deep/README.md @@ -0,0 +1,109 @@ +![Challenger Deep](https://challenger-deep-theme.github.io/images/logo.png) + +### [Challenger Deep Theme](https://challenger-deep-theme.github.io/) for VIM + +To enable this color scheme, set it in your vimrc: +``` +colorscheme challenger_deep +``` + +### Terminal True Color Support ### + Add this to your .vimrc to enable true colors: +``` +if has('nvim') || has('termguicolors') + set termguicolors +endif +``` + +### Installation + +#### vim-plug ### +``` +Plug 'challenger-deep-theme/vim', { 'as': 'challenger-deep' } +``` +#### vundle ### +``` +Plugin 'challenger-deep-theme/vim', {'name': 'challenger-deep-theme'} +``` + +### Screenshot ### + +![Screenshot](https://challenger-deep-theme.github.io/images/screenshots/vim.png) + +### Options ### + * **g:challenger_deep_termcolors** + This options sets the terminal colors to 16 or 256 Colors. Default value is 256. + If it is set to 16 ,this colorscheme will attempt to use the standard 16 colors of your terminal emulator and background color will be the default background color of your terminal emulator. + For the best colors in terminal, its recommended to set set your terminalcolors to [Challenger Deep Terminal Colors](#challenger-deep-terminal-colors) and use 16 colors. + + +### Challenger Deep Terminal Colors ### +``` +! ~/.Xresource +*.foreground: #cbe3e7 +*.background: #1e1c31 +*.cursorColor: #fbfcfc + +! black +*.color0: #565575 +*.color8: #100e23 + +! red +*.color1: #ff8080 +*.color9: #ff5458 + +! green +*.color2: #95ffa4 +*.color10: #62d196 + +! yellow +*.color3: #ffe9aa +*.color11: #ffb378 + +! blue +*.color4: #91ddff +*.color12: #65b2ff + +! magenta +*.color5: #c991e1 +*.color13: #906cff + +! cyan +*.color6: #aaffe4 +*.color14: #63f2f1 + +! white +*.color7: #cbe3e7 +*.color15: #a6b3cc +``` + +### Lightline Theme ### + +![Lightline](https://challenger-deep-theme.github.io/images/screenshots/vim-lightline.png) + +Challenger Deep supports [lightline.vim](https://github.com/itchyny/lightline.vim). To enable the colorscheme, +add one of the following lines to your `.vimrc`: + +``` viml +let g:lightline = { 'colorscheme': 'challenger_deep'} +``` + +### Lualine Theme ### + +Challenger Deep also supports [lualine.vim](https://github.com/nvim-lualine/lualine.nvim). To enable the colorscheme, +add the following lines to your `init.lua`: + +```lua +require'lualine'.setup { + options = { theme = 'challenger_deep' } +} +``` + +### Troubleshooting ### + If you are running vim inside tmux with the alacritty terminal, make sure to set `default-terminal` to `xterm-256color` in your tmux config (see [this issue](https://github.com/challenger-deep-theme/vim/issues/18) for more details: + +```text +# ... +set-option -g default-terminal "xterm-256color" +# ... +``` diff --git a/.config/nvim/colors/challenger-deep/autoload/airline/themes/challenger_deep.vim b/.config/nvim/colors/challenger-deep/autoload/airline/themes/challenger_deep.vim new file mode 100755 index 0000000..71d84e9 --- /dev/null +++ b/.config/nvim/colors/challenger-deep/autoload/airline/themes/challenger_deep.vim @@ -0,0 +1,116 @@ +" Colors +let s:black = { "gui": "#212121", "cterm": "0", "cterm16" : "0" } +let s:medium_gray = { "gui": "#767676", "cterm": "243", "cterm16" : "243" } +let s:white = { "gui": "#F3F3F3", "cterm": "15", "cterm16" : "15" } +let s:actual_white = { "gui": "#FFFFFF", "cterm": "231", "cterm16" : "231" } +let s:light_black = { "gui": "#424242", "cterm": "8", "cterm16" : "8" } +let s:lighter_black = { "gui": "#545454", "cterm": "240", "cterm16" : "240" } + +" lighter shadows and darker grays +let s:subtle_black = { "gui": "#303030", "cterm": "236", "cterm16" : "236" } +let s:light_gray = { "gui": "#B2B2B2", "cterm": "249", "cterm16" : "249" } +let s:lighter_gray = { "gui": "#C6C6C6", "cterm": "251", "cterm16" : "251" } + +" flat colors: +let s:asphalt = { "gui": "#1e1c31", "cterm": "233", "cterm16": "NONE"} +let s:asphalt_subtle= { "gui": "#100E23", "cterm": "232", "cterm16": "8"} +let s:dark_asphalt = { "gui": "#565575", "cterm": "236", "cterm16": "0"} + +let s:red = { "gui": "#ff8080", "cterm": "204", "cterm16": "1"} +let s:dark_red = { "gui": "#ff5458", "cterm": "203", "cterm16": "9"} + +let s:green = { "gui": "#95ffa4", "cterm": "120", "cterm16": "2"} +let s:dark_green = { "gui": "#62d196", "cterm": "119", "cterm16": "10"} + +let s:yellow = { "gui": "#ffe9aa", "cterm": "228", "cterm16": "3"} +let s:dark_yellow = { "gui": "#ffb378", "cterm": "215", "cterm16": "11"} + +let s:blue = { "gui": "#91ddff", "cterm": "159", "cterm16": "4"} +let s:dark_blue = { "gui": "#65b2ff", "cterm": "75", "cterm16": "12"} + +let s:purple = { "gui": "#c991e1", "cterm": "141", "cterm16": "5"} +let s:dark_purple = { "gui": "#906cff", "cterm": "135", "cterm16": "13"} + +let s:cyan = { "gui": "#aaffe4", "cterm": "122", "cterm16": "6"} +let s:dark_cyan = { "gui": "#63f2f1", "cterm": "121", "cterm16": "14"} + +let s:clouds = { "gui": "#cbe3e7", "cterm": "253", "cterm16": "7"} +let s:dark_clouds = { "gui": "#a6b3cc", "cterm": "252", "cterm16": "15"} + +let s:bg = s:asphalt +let s:bg_subtle = s:asphalt_subtle +let s:bg_dark = s:dark_asphalt +let s:norm = s:clouds +let s:norm_subtle = s:dark_clouds +let s:visual = s:bg_dark +let g:airline#themes#challenger_deep#palette = {} + +let s:N1 = [ s:bg_subtle.gui, s:cyan.gui, s:bg_subtle.cterm16, s:cyan.cterm16 ] +let s:N2 = [ s:bg_subtle.gui, s:dark_cyan.gui, s:bg_subtle.cterm16, s:dark_cyan.cterm16 ] +let s:N3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + +let g:airline#themes#challenger_deep#palette.normal_modified = { + \ 'airline_c': [ s:N3[0] , s:N3[1] , s:N3[2] , s:N3[3], '' ] , + \ } + +let s:I1 = [ s:bg_subtle.gui , s:red.gui , s:bg_subtle.cterm16 , s:red.cterm16] +let s:I2 = [ s:bg_subtle.gui , s:dark_red.gui , s:bg_subtle.cterm16 , s:dark_red.cterm16] +let s:I3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) +let g:airline#themes#challenger_deep#palette.insert_modified = { + \ 'airline_c': [ s:white.gui , s:bg_subtle.gui , s:white.cterm16, s:bg_subtle.cterm16 , '' ] , + \ } +let g:airline#themes#challenger_deep#palette.insert_paste = { + \ 'airline_a': [ s:I1[0] , s:yellow.gui , s:I1[2] , s:yellow.cterm16 , '' ] , + \ } + + +let g:airline#themes#challenger_deep#palette.replace = copy(g:airline#themes#challenger_deep#palette.insert) +let g:airline#themes#challenger_deep#palette.replace.airline_a = [ s:I2[0] , s:yellow.gui , s:I2[2] , s:yellow.cterm16 , '' ] +let g:airline#themes#challenger_deep#palette.replace_modified = g:airline#themes#challenger_deep#palette.insert_modified + + +let s:V1 = [ s:bg_subtle.gui , s:yellow.gui , s:bg_subtle.cterm16 , s:yellow.cterm16] +let s:V2 = [ s:bg_subtle.gui , s:dark_yellow.gui , s:bg_subtle.cterm16 , s:dark_yellow.cterm16] +let s:V3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) +let g:airline#themes#challenger_deep#palette.visual_modified = { + \ 'airline_c': [ s:V3[0] , s:V3[1] , s:V3[2] , s:V3[3], '' ] , + \ } + +let s:IA1 = [ s:bg_subtle.gui , s:purple.gui , s:bg_subtle.cterm16 , s:purple.cterm16] +let s:IA2 = [ s:bg_subtle.gui , s:dark_purple.gui , s:bg_subtle.cterm16 , s:dark_purple.cterm16] +let s:IA3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.inactive = airline#themes#generate_color_map(s:IA1, s:IA2, s:IA3) +let g:airline#themes#challenger_deep#palette.inactive_modified = { + \ 'airline_c': [ s:IA3[0] , s:IA3[1] , s:IA3[2] , s:IA3[3], '' ] , + \ } + + +let s:WI = [ s:yellow.gui, s:dark_red.gui, s:yellow.cterm16, s:dark_red.cterm16 ] +let g:airline#themes#challenger_deep#palette.normal.airline_warning = [ + \ s:WI[0], s:WI[1], s:WI[2], s:WI[3] + \ ] + +let g:airline#themes#challenger_deep#palette.normal_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.insert.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.insert_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.visual.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.visual_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.replace.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.replace_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + diff --git a/.config/nvim/colors/challenger-deep/autoload/lightline/colorscheme/challenger_deep.vim b/.config/nvim/colors/challenger-deep/autoload/lightline/colorscheme/challenger_deep.vim new file mode 100755 index 0000000..88385ff --- /dev/null +++ b/.config/nvim/colors/challenger-deep/autoload/lightline/colorscheme/challenger_deep.vim @@ -0,0 +1,114 @@ +" Colors +let s:black = { "gui": "#212121", "cterm": "0", "cterm16" : "0" } +let s:medium_gray = { "gui": "#767676", "cterm": "243", "cterm16" : "243" } +let s:white = { "gui": "#F3F3F3", "cterm": "15", "cterm16" : "15" } +let s:actual_white = { "gui": "#FFFFFF", "cterm": "231", "cterm16" : "231" } +let s:light_black = { "gui": "#424242", "cterm": "8", "cterm16" : "8" } +let s:lighter_black = { "gui": "#545454", "cterm": "240", "cterm16" : "240" } + +" lighter shadows and darker grays +let s:subtle_black = { "gui": "#303030", "cterm": "236", "cterm16" : "236" } +let s:light_gray = { "gui": "#B2B2B2", "cterm": "249", "cterm16" : "249" } +let s:lighter_gray = { "gui": "#C6C6C6", "cterm": "251", "cterm16" : "251" } + +" challenger deep colors: +let s:asphalt = { "gui": "#1e1c31", "cterm": "233", "cterm16": "NONE"} +let s:asphalt_subtle= { "gui": "#100E23", "cterm": "232", "cterm16": "8"} +let s:dark_asphalt = { "gui": "#565575", "cterm": "236", "cterm16": "0"} + +let s:red = { "gui": "#ff8080", "cterm": "204", "cterm16": "1"} +let s:dark_red = { "gui": "#ff5458", "cterm": "203", "cterm16": "9"} + +let s:green = { "gui": "#95ffa4", "cterm": "120", "cterm16": "2"} +let s:dark_green = { "gui": "#62d196", "cterm": "119", "cterm16": "10"} + +let s:yellow = { "gui": "#ffe9aa", "cterm": "228", "cterm16": "3"} +let s:dark_yellow = { "gui": "#ffb378", "cterm": "215", "cterm16": "11"} + +let s:blue = { "gui": "#91ddff", "cterm": "159", "cterm16": "4"} +let s:dark_blue = { "gui": "#65b2ff", "cterm": "75", "cterm16": "12"} + +let s:purple = { "gui": "#c991e1", "cterm": "141", "cterm16": "5"} +let s:dark_purple = { "gui": "#906cff", "cterm": "135", "cterm16": "13"} + +let s:cyan = { "gui": "#aaffe4", "cterm": "122", "cterm16": "6"} +let s:dark_cyan = { "gui": "#63f2f1", "cterm": "121", "cterm16": "14"} + +let s:clouds = { "gui": "#cbe3e7", "cterm": "253", "cterm16": "7"} +let s:dark_clouds = { "gui": "#a6b3cc", "cterm": "252", "cterm16": "15"} + +let s:bg = s:asphalt +let s:bg_subtle = s:asphalt_subtle +let s:bg_dark = s:dark_asphalt +let s:norm = s:clouds +let s:norm_subtle = s:dark_clouds +let s:visual = s:bg_dark + +" lightline challenger deep colors: +let s:lfc = { + \'black': [ s:black.gui, s:black.cterm16], + \'medium_gray': [ s:medium_gray.gui, s:medium_gray.cterm16], + \'white': [ s:white.gui, s:white.cterm16], + \'actual_white': [ s:actual_white.gui, s:actual_white.cterm16 ], + \'light_black': [s:light_black.gui, s:light_black.cterm16], + \'lighter_black': [ s:lighter_black.gui, s:lighter_black.cterm16], + \'subtle_black': [ s:subtle_black.gui, s:subtle_black.cterm16], + \'light_gray': [ s:light_gray.gui, s:light_gray.cterm16], + \'lighter_gray': [ s:lighter_gray.gui, s:lighter_gray.cterm16], + \'asphalt': [s:asphalt.gui, s:asphalt.cterm16], + \'asphalt_subtle': [s:asphalt_subtle.gui, s:asphalt_subtle.cterm16], + \'dark_asphalt' : [s:dark_asphalt.gui, s:dark_asphalt.cterm16], + \'red' : [s:red.gui, s:red.cterm16], + \'dark_red' : [s:dark_red.gui, s:dark_red.cterm16], + \'green' : [s:green.gui, s:green.cterm16], + \'dark_green' : [s:dark_green.gui, s:dark_green.cterm16], + \'yellow' : [s:yellow.gui, s:yellow.cterm16], + \'dark_yellow' : [s:dark_yellow.gui, s:dark_yellow.cterm16], + \'blue' : [s:blue.gui, s:blue.cterm16], + \'dark_blue' : [s:dark_blue.gui, s:dark_blue.cterm16], + \'purple' : [s:purple.gui, s:purple.cterm16], + \'dark_purple' : [s:dark_purple.gui, s:dark_purple.cterm16], + \'cyan' : [s:cyan.gui, s:cyan.cterm16], + \'dark_cyan' : [s:dark_cyan.gui, s:dark_cyan.cterm16], + \'clouds' : [s:clouds.gui, s:clouds.cterm16], + \'dark_clouds' : [s:dark_clouds.gui, s:dark_clouds.cterm16], + \'bg': [s:bg.gui, s:bg.cterm16], + \'bg_subtle': [s:bg_subtle.gui, s:bg_subtle.cterm16], + \'bg_dark': [s:bg_dark.gui, s:bg_dark.cterm16], + \'norm': [s:norm.gui, s:norm.cterm16], + \'norm_subtle': [s:norm_subtle.gui, s:norm_subtle.cterm16], + \} + +let s:p = { 'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {} } + +" Tabline +let s:p.tabline.left = [ [ s:lfc.white, s:lfc.bg_subtle ] ] +let s:p.tabline.tabsel = [ [ s:lfc.bg_subtle, s:lfc.blue ] ] +let s:p.tabline.middle = [ [ s:lfc.white, s:lfc.bg_subtle ] ] +let s:p.tabline.right = [ [ s:lfc.bg_subtle, s:lfc.red ] ] + +" Normal mode +let s:p.normal.left = [ [ s:lfc.bg_subtle, s:lfc.cyan ], [ s:lfc.bg_subtle, s:lfc.dark_cyan ] ] +let s:p.normal.middle = [ [ s:lfc.white, s:lfc.bg_subtle ] ] +let s:p.normal.right = [ [ s:lfc.bg_subtle, s:lfc.cyan ], [ s:lfc.bg_subtle, s:lfc.dark_cyan ] ] +let s:p.normal.error = [ [ s:lfc.red, s:lfc.bg_subtle ] ] +let s:p.normal.warning = [ [ s:lfc.yellow, s:lfc.bg_subtle ] ] + +" Visual mode +let s:p.visual.left = [ [ s:lfc.bg_subtle, s:lfc.yellow ], [ s:lfc.bg_subtle, s:lfc.dark_yellow ] ] +let s:p.visual.right = [ [ s:lfc.bg_subtle, s:lfc.yellow ], [ s:lfc.bg_subtle, s:lfc.dark_yellow ] ] + +" Replace mode +let s:p.replace.left = [ [ s:lfc.bg_subtle, s:lfc.green ], [ s:lfc.bg_subtle, s:lfc.dark_green ] ] +let s:p.replace.right = [ [ s:lfc.bg_subtle, s:lfc.green ], [ s:lfc.bg_subtle, s:lfc.dark_green ] ] + +" Insert mode +let s:p.insert.left = [ [ s:lfc.bg_subtle, s:lfc.red ], [ s:lfc.bg_subtle, s:lfc.dark_red ] ] +let s:p.insert.right = [ [ s:lfc.bg_subtle, s:lfc.red ], [ s:lfc.bg_subtle, s:lfc.dark_red ] ] + +" Inactive split +let s:p.inactive.left = [ [ s:lfc.dark_asphalt, s:lfc.bg_subtle ], [ s:lfc.dark_asphalt, s:lfc.bg_subtle ] ] +let s:p.inactive.middle = [ [ s:lfc.dark_asphalt, s:lfc.bg_subtle ] ] +let s:p.inactive.right = [ [ s:lfc.dark_asphalt, s:lfc.bg_subtle ], [ s:lfc.dark_asphalt, s:lfc.bg_subtle ] ] + +let g:lightline#colorscheme#challenger_deep#palette = lightline#colorscheme#flatten(s:p) diff --git a/.config/nvim/colors/challenger-deep/colors/challenger_deep.vim b/.config/nvim/colors/challenger-deep/colors/challenger_deep.vim new file mode 100755 index 0000000..720dfe4 --- /dev/null +++ b/.config/nvim/colors/challenger-deep/colors/challenger_deep.vim @@ -0,0 +1,338 @@ +" Vim Color File +" Name: challenger_deep.vim +" Version: 2.0 +" Maintainer: github.com/MaxSt +" License: The MIT License (MIT) +" Based On: pencil by github.com/reedes and github.com/mattly + +hi clear + +if exists('syntax on') + syntax reset +endif + +let g:colors_name='challenger_deep' +set background=dark + + +if ! exists("g:challenger_deep_termcolors") + let g:challenger_deep_termcolors = 256 +endif + +" not all terminals support italics properly. If yours does, opt-in. +if ! exists("g:challenger_deep_terminal_italics") + let g:challenger_deep_terminal_italics = 0 +endif + +" Colors +let s:black = { "gui": "#212121", "cterm": "0", "cterm16" : "8" } +let s:medium_gray = { "gui": "#767676", "cterm": "243", "cterm16" : "243" } +let s:white = { "gui": "#F3F3F3", "cterm": "15", "cterm16" : "15" } +let s:actual_white = { "gui": "#FFFFFF", "cterm": "231", "cterm16" : "231" } +let s:light_black = { "gui": "#424242", "cterm": "8", "cterm16" : "0" } +let s:lighter_black = { "gui": "#545454", "cterm": "240", "cterm16" : "240" } + +" lighter shadows and darker grays +let s:subtle_black = { "gui": "#303030", "cterm": "236", "cterm16" : "236" } +let s:light_gray = { "gui": "#B2B2B2", "cterm": "249", "cterm16" : "249" } +let s:lighter_gray = { "gui": "#C6C6C6", "cterm": "251", "cterm16" : "251" } + +" flat colors: +let s:asphalt = { "gui": "#1e1c31", "cterm": "233", "cterm16": "NONE"} +let s:asphalt_subtle= { "gui": "#100E23", "cterm": "232", "cterm16": "0"} +let s:dark_asphalt = { "gui": "#565575", "cterm": "236", "cterm16": "8"} + +let s:red = { "gui": "#ff8080", "cterm": "204", "cterm16": "1"} +let s:dark_red = { "gui": "#ff5458", "cterm": "203", "cterm16": "9"} + +let s:green = { "gui": "#95ffa4", "cterm": "120", "cterm16": "2"} +let s:dark_green = { "gui": "#62d196", "cterm": "119", "cterm16": "10"} + +let s:yellow = { "gui": "#ffe9aa", "cterm": "228", "cterm16": "3"} +let s:dark_yellow = { "gui": "#ffb378", "cterm": "215", "cterm16": "11"} + +let s:blue = { "gui": "#91ddff", "cterm": "159", "cterm16": "4"} +let s:dark_blue = { "gui": "#65b2ff", "cterm": "75", "cterm16": "12"} + +let s:purple = { "gui": "#c991e1", "cterm": "141", "cterm16": "5"} +let s:dark_purple = { "gui": "#906cff", "cterm": "135", "cterm16": "13"} + +let s:cyan = { "gui": "#aaffe4", "cterm": "122", "cterm16": "6"} +let s:dark_cyan = { "gui": "#63f2f1", "cterm": "121", "cterm16": "14"} + +let s:clouds = { "gui": "#cbe3e7", "cterm": "253", "cterm16": "7"} +let s:dark_clouds = { "gui": "#a6b3cc", "cterm": "252", "cterm16": "15"} + +let s:bg = s:asphalt +let s:bg_subtle = s:asphalt_subtle +let s:bg_dark = s:dark_asphalt +let s:norm = s:clouds +let s:norm_subtle = s:dark_clouds +let s:visual = s:bg_dark + +let s:head_a = s:dark_blue +let s:head_b = s:blue +let s:head_c = s:dark_cyan + +" shamelessly stolen from hemisu: https://github.com/noahfrederick/vim-hemisu/ +function! s:h(group, style) + " Not all terminals support italics properly. If yours does, opt-in. + if g:challenger_deep_terminal_italics == 0 && has_key(a:style, "cterm") && a:style["cterm"] == "italic" + unlet a:style.cterm + endif + if g:challenger_deep_termcolors == 16 + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm16 : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm16 : "NONE") + else + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm : "NONE") + end + execute "highlight" a:group + \ "guifg=" (has_key(a:style, "fg") ? a:style.fg.gui : "NONE") + \ "guibg=" (has_key(a:style, "bg") ? a:style.bg.gui : "NONE") + \ "guisp=" (has_key(a:style, "sp") ? a:style.sp.gui : "NONE") + \ "gui=" (has_key(a:style, "gui") ? a:style.gui : "NONE") + \ "ctermfg=" . l:ctermfg + \ "ctermbg=" . l:ctermbg + \ "cterm=" (has_key(a:style, "cterm") ? a:style.cterm : "NONE") +endfunction + +" common groups ================================================================ +" (see `:h w18`) + +call s:h("Normal", {"bg": s:bg, "fg": s:norm}) +call s:h("Cursor", {"bg": s:blue, "fg": s:bg_dark}) +call s:h("Comment", {"fg": s:medium_gray, "gui": "italic", "cterm": "italic"}) + +call s:h("Constant", {"fg": s:yellow}) +hi! link String Constant +hi! link Character Constant + +call s:h("Number", {"fg": s:dark_yellow}) +hi! link Boolean Constant +hi! link Float Constant + +call s:h("Identifier", {"fg": s:purple}) +hi! link Function Identifier + +call s:h("Label", {"fg": s:dark_blue}) +hi! link Conditonal Statement +hi! link Exception Statement + +call s:h("Operator", {"fg": s:dark_cyan}) +hi! link Repeat Operator + +call s:h("PreProc", {"fg": s:green}) +hi! link Include PreProc +hi! link Define PreProc +hi! link Macro PreProc +hi! link PreCondit PreProc + + +call s:h("Keyword", {"fg": s:red}) +hi! link Statement Keyword + +call s:h("Type", {"fg": s:blue}) +hi! link StorageClass Type +hi! link Structure Type +hi! link Typedef Type + +call s:h("Special", {"fg": s:cyan}) +hi! link SpecialChar Special +hi! link Tag Special +hi! link Delimiter Special +hi! link SpecialComment Special +hi! link Debug Special + +call s:h("Underlined", {"fg": s:norm , "gui": "underline", "cterm": "underline"}) +call s:h("Ignore", {"fg": s:bg }) +call s:h("Error", {"fg": s:dark_red, "bg": s:bg_subtle , "gui": "bold" , "cterm": "bold" }) +call s:h("Todo", {"fg": s:dark_yellow, "bg": s:bg_subtle, "gui": "bold" , "cterm": "bold" }) + +" ui chrome ==================================================================== +" ordered according to `:help hitest.vim` + +call s:h("SpecialKey", {"fg": s:blue}) +call s:h("Boolean", {"fg": s:dark_yellow}) +call s:h("Number", {"fg": s:dark_yellow}) +call s:h("Float", {"fg": s:dark_yellow}) +call s:h("NonText", {"fg": s:bg_dark}) +call s:h("Directory", {"fg": s:purple}) +call s:h("ErrorMsg", {"fg": s:dark_red}) +call s:h("IncSearch", {"bg": s:red, "fg": s:clouds}) +call s:h("Search", {"bg": s:bg_dark}) +call s:h("MoreMsg", {"fg": s:medium_gray, "gui": "bold", "cterm": "bold"}) +hi! link ModeMsg MoreMsg +call s:h("LineNr", {"fg": s:dark_asphalt, "bg": s:bg_subtle}) +call s:h("CursorLineNr", {"bg": s:bg_subtle, "fg": s:blue, "gui": "bold"}) +call s:h("Question", {"fg": s:red}) +call s:h("StatusLine", {"bg": s:bg_dark}) +call s:h("Conceal", {"fg": s:norm}) +call s:h("StatusLineNC", {"bg": s:bg_dark, "fg": s:medium_gray}) +call s:h("VertSplit", {"fg": s:bg_subtle}) +call s:h("Title", {"fg": s:dark_blue}) +call s:h("Visual", {"bg": s:visual}) +call s:h("WarningMsg", {"fg": s:yellow}) +call s:h("WildMenu", {"fg": s:bg_subtle, "bg": s:cyan}) +call s:h("Folded", {"bg": s:purple, "fg": s:bg_subtle}) +call s:h("FoldColumn", {"fg": s:yellow}) +call s:h("DiffAdd", {"fg": s:green}) +call s:h("DiffDelete", {"fg": s:red}) +call s:h("DiffChange", {"fg": s:dark_yellow}) +call s:h("DiffText", {"fg": s:dark_blue}) +call s:h("SignColumn", {"fg": s:green}) + +if has("gui_running") + call s:h("SpellBad", {"gui": "underline", "sp": s:dark_red}) + call s:h("SpellCap", {"gui": "underline", "sp": s:green}) + call s:h("SpellRare", {"gui": "underline", "sp": s:red}) + call s:h("SpellLocal", {"gui": "underline", "sp": s:dark_green}) +else + call s:h("SpellBad", {"cterm": "underline", "fg": s:dark_red}) + call s:h("SpellCap", {"cterm": "underline", "fg": s:green}) + call s:h("SpellRare", {"cterm": "underline", "fg": s:red}) + call s:h("SpellLocal", {"cterm": "underline", "fg": s:dark_green}) +endif +call s:h("Pmenu", {"fg": s:norm, "bg": s:bg_subtle}) +call s:h("PmenuSel", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("PmenuSbar", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("PmenuThumb", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("TabLine", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("TabLineSel", {"fg": s:norm, "bg": s:bg_subtle, "gui": "bold", "cterm": "bold"}) +call s:h("TabLineFill", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("CursorColumn", {"bg": s:bg_subtle}) +call s:h("CursorLine", {"bg": s:bg_subtle}) +call s:h("ColorColumn", {"bg": s:bg_subtle}) + +" remainder of syntax highlighting +call s:h("MatchParen", {"bg": s:bg_subtle, "fg": s:purple, "gui": "bold", "cterm": "bold"}) +call s:h("qfLineNr", {"fg": s:medium_gray}) + +" hi helpHyperTextJump guifg=#5FAFD7 ctermfg=74 + +" HTML syntax +hi! link htmlTag Special +hi! link htmlEndTag htmlTag + +hi! link htmlTagName KeyWord +" html5 tags show up as htmlTagN +hi! link htmlTagN Keyword + +" HTML content +call s:h("htmlH1", {"fg": s:head_a, "gui": "bold,italic", "cterm": "bold" }) +call s:h("htmlH2", {"fg": s:head_a, "gui": "bold" , "cterm": "bold" }) +call s:h("htmlH3", {"fg": s:head_b, "gui": "italic" , "cterm": "italic" }) +call s:h("htmlH4", {"fg": s:head_b, "gui": "italic" , "cterm": "italic" }) +call s:h("htmlH5", {"fg": s:head_c }) +call s:h("htmlH6", {"fg": s:head_c }) +call s:h("htmlLink", {"fg": s:blue , "gui": "underline" , "cterm": "underline"}) +call s:h("htmlItalic", { "gui": "italic" , "cterm": "italic" }) +call s:h("htmlBold", { "gui": "bold" , "cterm": "bold" }) +call s:h("htmlBoldItalic",{ "gui": "bold,italic", "cterm": "bold" }) +" hi htmlString guifg=#87875f guibg=NONE gui=NONE ctermfg=101 ctermbg=NONE cterm=NONE + +" tpope/vim-markdown +call s:h("markdownBlockquote", {"fg": s:norm}) +call s:h("markdownBold", {"fg": s:norm , "gui": "bold" , "cterm": "bold" }) +call s:h("markdownBoldItalic", {"fg": s:norm , "gui": "bold,italic", "cterm": "bold" }) +call s:h("markdownEscape", {"fg": s:norm}) +call s:h("markdownH1", {"fg": s:head_a, "gui": "bold,italic", "cterm": "bold" }) +call s:h("markdownH2", {"fg": s:head_a, "gui": "bold" , "cterm": "bold" }) +call s:h("markdownH3", {"fg": s:head_a, "gui": "italic" , "cterm": "italic"}) +call s:h("markdownH4", {"fg": s:head_a, "gui": "italic" , "cterm": "italic"}) +call s:h("mckarkdownH5", {"fg": s:head_a}) +call s:h("markdownH6", {"fg": s:head_a}) +call s:h("markdownHeadingDelimiter", {"fg": s:norm}) +call s:h("markdownHeadingRule", {"fg": s:norm}) +call s:h("markdownId", {"fg": s:medium_gray}) +call s:h("markdownIdDeclaration", {"fg": s:norm_subtle}) +call s:h("markdownItalic", {"fg": s:norm , "gui": "italic" , "cterm": "italic"}) +call s:h("markdownLinkDelimiter", {"fg": s:medium_gray}) +call s:h("markdownLinkText", {"fg": s:norm}) +call s:h("markdownLinkTextDelimiter", {"fg": s:medium_gray}) +call s:h("markdownListMarker", {"fg": s:norm}) +call s:h("markdownOrderedListMarker", {"fg": s:norm}) +call s:h("markdownRule", {"fg": s:norm}) +call s:h("markdownUrl", {"fg": s:medium_gray, "gui": "underline", "cterm": "underline"}) +call s:h("markdownUrlDelimiter", {"fg": s:medium_gray}) +call s:h("markdownUrlTitle", {"fg": s:norm}) +call s:h("markdownUrlTitleDelimiter", {"fg": s:medium_gray}) +call s:h("markdownCode", {"fg": s:norm}) +call s:h("markdownCodeDelimiter", {"fg": s:norm}) + +" plasticboy/vim-markdown +call s:h("mkdBlockQuote", {"fg": s:norm}) +call s:h("mkdDelimiter", {"fg": s:medium_gray}) +call s:h("mkdID", {"fg": s:medium_gray}) +call s:h("mkdLineContinue", {"fg": s:norm}) +call s:h("mkdLink", {"fg": s:norm}) +call s:h("mkdLinkDef", {"fg": s:medium_gray}) +call s:h("mkdListItem", {"fg": s:norm}) +call s:h("mkdNonListItemBlock", {"fg": s:norm}) " bug in syntax? +call s:h("mkdRule", {"fg": s:norm}) +call s:h("mkdUrl", {"fg": s:medium_gray, "gui": "underline", "cterm": "underline"}) +call s:h("mkdCode", {"fg": s:norm}) +call s:h("mkdIndentCode", {"fg": s:norm}) + +" gabrielelana/vim-markdown +call s:h("markdownBlockquoteDelimiter", {"fg": s:norm}) +call s:h("markdownInlineDelimiter", {"fg": s:norm}) +call s:h("markdownItemDelimiter", {"fg": s:norm}) +call s:h("markdownLinkReference", {"fg": s:medium_gray}) +call s:h("markdownLinkText", {"fg": s:norm}) +call s:h("markdownLinkTextContainer", {"fg": s:medium_gray}) +call s:h("markdownLinkUrl", {"fg": s:medium_gray, "gui": "underline", "cterm": "underline"}) +call s:h("markdownLinkUrlContainer", {"fg": s:medium_gray}) +call s:h("markdownFencedCodeBlock", {"fg": s:norm}) +call s:h("markdownInlineCode", {"fg": s:norm}) + +" mattly/vim-markdown-enhancements +call s:h("mmdFootnoteDelimiter", {"fg": s:medium_gray}) +call s:h("mmdFootnoteMarker", {"fg": s:norm}) +call s:h("mmdTableAlign", {"fg": s:norm}) +call s:h("mmdTableDelimiter", {"fg": s:norm}) +call s:h("mmdTableHeadDelimiter", {"fg": s:norm}) +call s:h("mmdTableHeader", {"fg": s:norm}) +call s:h("mmdTableCaptionDelimiter", {"fg": s:norm}) +call s:h("mmdTableCaption", {"fg": s:norm}) + +" Textile content +" https://github.com/timcharper/textile.vim/blob/master/syntax/textile.vim +"call s:h("txtBold", {"fg": s:norm , "gui": "bold" , "cterm": "bold" }) +"call s:h("txtEmphasis", {"fg": s:norm , "gui": "italic" , "cterm": "italic"}) + +" XML content +hi! link xmlTag htmlTag +hi! link xmlEndTag xmlTag +hi! link xmlTagName htmlTagName + +" Signify +call s:h("SignifySignAdd",{"fg": s:green, "bg": s:bg_subtle}) +call s:h("SignifySignDelete",{"fg": s:red, "bg": s:bg_subtle}) +call s:h("SignifySignChange",{"fg": s:yellow, "bg": s:bg_subtle}) +call s:h("SignifySignDeleteFirstLine",{"fg": s:red, "bg": s:bg_subtle}) + +" GitGutter +call s:h("GitGutterAdd",{"fg": s:green, "bg": s:bg_subtle}) +call s:h("GitGutterDelete",{"fg": s:red, "bg": s:bg_subtle}) +call s:h("GitGutterChange",{"fg": s:yellow, "bg": s:bg_subtle}) +call s:h("GitGutterChangeDelete",{"fg": s:red, "bg": s:bg_subtle}) + + +"nvim terminal colors +let g:terminal_color_0 = s:bg_dark.gui +let g:terminal_color_1 = s:red.gui +let g:terminal_color_2 = s:green.gui +let g:terminal_color_3 = s:yellow.gui +let g:terminal_color_4 = s:blue.gui +let g:terminal_color_5 = s:purple.gui +let g:terminal_color_6 = s:cyan.gui +let g:terminal_color_7 = s:clouds.gui +let g:terminal_color_8 = s:bg_subtle.gui +let g:terminal_color_9 = s:dark_red.gui +let g:terminal_color_10 = s:dark_green.gui +let g:terminal_color_11 = s:dark_yellow.gui +let g:terminal_color_12 = s:dark_blue.gui +let g:terminal_color_13 = s:dark_purple.gui +let g:terminal_color_14 = s:dark_cyan.gui +let g:terminal_color_15 = s:dark_clouds.gui diff --git a/.config/nvim/colors/challenger-deep/lua/lualine/themes/challenger_deep.lua b/.config/nvim/colors/challenger-deep/lua/lualine/themes/challenger_deep.lua new file mode 100755 index 0000000..d9dee11 --- /dev/null +++ b/.config/nvim/colors/challenger-deep/lua/lualine/themes/challenger_deep.lua @@ -0,0 +1,46 @@ +-- ============================================================================= +-- Genarated by lightline to lualine theme converter +-- https://gist.github.com/shadmansaleh/000871c9a608a012721c6acc6d7a19b9 +-- License: MIT License +-- ============================================================================= + +local colors = { + red = "#ff8080", + green = "#95ffa4", + yellow = "#ffe9aa", + cyan = "#aaffe4", + white = "#F3F3F3", + dark_red = "#ff5458", + dark_green = "#62d196", + dark_yellow = "#ffb378", + dark_cyan = "#63f2f1", + dark_asphalt = "#565575", + asphalt_subtle = "#100E23", +} + +local challenger_deep = { + normal = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_cyan }, + a = { fg = colors.asphalt_subtle, bg = colors.cyan , gui = "bold", }, + c = { fg = colors.white, bg = colors.asphalt_subtle }, + }, + visual = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_yellow }, + a = { fg = colors.asphalt_subtle, bg = colors.yellow , gui = "bold", }, + }, + inactive = { + b = { fg = colors.dark_asphalt, bg = colors.asphalt_subtle }, + a = { fg = colors.dark_asphalt, bg = colors.asphalt_subtle , gui = "bold", }, + c = { fg = colors.dark_asphalt, bg = colors.asphalt_subtle }, + }, + replace = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_green }, + a = { fg = colors.asphalt_subtle, bg = colors.green , gui = "bold", }, + }, + insert = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_red }, + a = { fg = colors.asphalt_subtle, bg = colors.red , gui = "bold", }, + }, +} + +return challenger_deep diff --git a/.config/nvim/colors/falcon b/.config/nvim/colors/falcon deleted file mode 160000 index 0ecdf0f..0000000 --- a/.config/nvim/colors/falcon +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0ecdf0fbeb441d7c4134fb28f9f5f6a3cfc1e837 diff --git a/.config/nvim/colors/falcon/.vimrc_check b/.config/nvim/colors/falcon/.vimrc_check new file mode 100755 index 0000000..19c7b25 --- /dev/null +++ b/.config/nvim/colors/falcon/.vimrc_check @@ -0,0 +1,16 @@ +set nocompatible " disable compatibility with vi +syntax enable "enable syntax highlighting + +" Assumes vim-plug is installed. +call plug#begin() +Plug 'fenetikm/falcon' +call plug#end() + +"enable 24bit support. +set termguicolors + +" enables the active / inactive functionality. +let g:falcon_background = 0 +let g:falcon_inactive = 1 + +colorscheme falcon diff --git a/.config/nvim/colors/falcon/LICENSE b/.config/nvim/colors/falcon/LICENSE new file mode 100755 index 0000000..15d3f6a --- /dev/null +++ b/.config/nvim/colors/falcon/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 fenetikm + +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. diff --git a/.config/nvim/colors/falcon/README.md b/.config/nvim/colors/falcon/README.md new file mode 100755 index 0000000..e6b71f6 --- /dev/null +++ b/.config/nvim/colors/falcon/README.md @@ -0,0 +1,28 @@ +![falcon logo](https://raw.githubusercontent.com/fenetikm/falcon/master/support/logo2.png) + +A colour scheme for terminals, vim and friends. + +This is **v2.0** - vastly improved, with more tweak, less cruft. + +Falcon is a work horse of a colour scheme that will (hopefully) stand the test of time - with fewer gimmicks, a more restrained colour palette but with a splash just enough to distinguish everything semantically as well a touch of delight thrown in. + +![hero shot](https://raw.githubusercontent.com/fenetikm/falcon/master/support/hero2.png) + +## Get started + +Head to [the wiki installation page](https://github.com/fenetikm/falcon/wiki/Installation) to get going. Also have a look through what plugins and programs are [covered](https://github.com/fenetikm/falcon/wiki/Coverage), browse the [screenshot gallery](https://github.com/fenetikm/falcon/wiki/Screenshots), the [palette](https://github.com/fenetikm/falcon/wiki/Palette) and if you need a little bit of help there is also the [troubleshooting section and +FAQ](https://github.com/fenetikm/falcon/wiki/Troubleshooting-&-FAQ). + +## Contact + +If you want to get in touch please [drop me a line](https://michaelwelford.com/contact). + +## Big Thanks + +* Built with [estilo](https://github.com/jacoborus/estilo), gracias! +* Inspiration: gruvbox for not being quite right to my tastes and thus being the seed of this project +* Everyone who Vims, f'yeah! + +## License + +Falcon is released under the [MIT license](https://github.com/fenetikm/falcon/blob/master/LICENSE). diff --git a/.config/nvim/colors/falcon/TODO.md b/.config/nvim/colors/falcon/TODO.md new file mode 100755 index 0000000..a331652 --- /dev/null +++ b/.config/nvim/colors/falcon/TODO.md @@ -0,0 +1,75 @@ +# Falcon Todo + +## @Todo +* statusline - airline check +* increase contrast in markdown for code blocks - maybe another gray... +* check gnome +* add in palette file with rbg and hex and names +* vscode scheme, in progress +* update other themes with indigo for selection colour +* kitty file for inclusion + +## VSCode refs +- https://github.com/sdras/night-owl-vscode-theme +- https://css-tricks.com/creating-a-vs-code-theme/ +- https://marketplace.visualstudio.com/items?itemName=whizkydee.material-palenight-theme&WT.mc_id=csstricks-themearticle-sdras + +## Full list +* Tag current version, create 2.x branch +* Add in some lean prompt stuff, fix up brackets to be delimiter colour etc. +* Fill out corpus (https://rosettacode.org/wiki/Rosetta_Code, https://rosettacode.org/wiki/Sorting_algorithms/Quicksort) + * PHP + * Python + * JS + * Java + * C++ + * HTML + * Haskell + * Shell + * CSS + * HTML +* Automate the screenshot taking + +## Done +* redo screenshots since String syntax change +* Option to force background colour / don't do +* Update all values across repo - done? +* everything else: + * alfred + * alacritty + * prism + * taskwarrior + * timewarrior +* Update palette images +* Update hero image +* New logo +* The README is too long - split into wiki pages on github +* vimdiff colours - done +* Check all grays re blueness - done +* kitty - done +* terminal colours - done +* inactive colour - a touch bluer and brighter - done +* purple use - anywhere else? - done +* fix status line and cursor line, too close - done +* other syntax highlighting for different code types = done? +* PHP - done +* tmux - done +* Colour ideas: + * Introduce a tan colour, mostly in place of bright yellow - done + * Maybe introduce another darker blue colour - done + * Tweak the terminal colours, more subdued, try other alternates e.g. pink - done +* Background colour bluer - done +* Fix contrast and: - done +* Tweak colours back to their humanistic values e.g. remove saturation from some of the brighter colours - done +* Inactive background colour more gray, tad lighter - done +* Tweak contrast, use of white vs orange for delimiters - done +* Fix exa attributes, too colourful currently - done + +## Someday +* L*a*b values +* Light version? probably not though. Maybe some contrast options. +* More support: + * Mutt + * TeX + * highlight: https://gitlab.com/saalen/highlight +* Setup page under projects on michaelwelford.com, point to blog posts about it. diff --git a/.config/nvim/colors/falcon/alacritty/alacritty.yml b/.config/nvim/colors/falcon/alacritty/alacritty.yml new file mode 100755 index 0000000..487b252 --- /dev/null +++ b/.config/nvim/colors/falcon/alacritty/alacritty.yml @@ -0,0 +1,38 @@ +# falcon colorscheme for alacritty +# by fenetikm, https://github.com/fenetikm/falcon +colors: + # Default colors + primary: + background: '0x020221' + foreground: '0xb4b4b9' + + # Colors the cursor will use if `custom_cursor_colors` is true + cursor: + text: '0x020221' + cursor: '0xffe8c0' + + # Normal colors + normal: + black: '0x000004' + red: '0xff3600' + green: '0x718e3f' + yellow: '0xffc552' + blue: '0x635196' + magenta: '0xff761a' + cyan: '0x34bfa4' + white: '0xb4b4b9' + + # Bright colors + bright: + black: '0x020221' + red: '0xff8e78' + green: '0xb1bf75' + yellow: '0xffd392' + blue: '0x99a4bc' + magenta: '0xffb07b' + cyan: '0x8bccbf' + white: '0xf8f8ff' + +# Use custom cursor colors. If true, display the cursor in the cursor.foreground +# and cursor.background colors, otherwise invert the colors of the cursor. +custom_cursor_colors: true diff --git a/.config/nvim/colors/falcon/alfred/falcon-alternate.alfredappearance b/.config/nvim/colors/falcon/alfred/falcon-alternate.alfredappearance new file mode 100755 index 0000000..1e5463f --- /dev/null +++ b/.config/nvim/colors/falcon/alfred/falcon-alternate.alfredappearance @@ -0,0 +1,61 @@ +{ + "alfredtheme" : { + "result" : { + "textSpacing" : 4, + "subtext" : { + "size" : 12, + "colorSelected" : "#DFDFE5FF", + "font" : "Fira Code", + "color" : "#57575EFF" + }, + "shortcut" : { + "size" : 16, + "colorSelected" : "#B4B4B9FF", + "font" : "Fira Code", + "color" : "#787882FF" + }, + "backgroundSelected" : "#212127FF", + "text" : { + "size" : 20, + "colorSelected" : "#F8F8FFFF", + "font" : "Fira Code", + "color" : "#B4B4B9FF" + }, + "iconPaddingHorizontal" : 12, + "paddingVertical" : 9, + "iconSize" : 32 + }, + "search" : { + "paddingVertical" : 11, + "background" : "#2F2F3AFF", + "spacing" : 0, + "text" : { + "size" : 32, + "colorSelected" : "#000004FF", + "font" : "Fira Code", + "color" : "#FFC552FF" + }, + "backgroundSelected" : "#BFDAFFFF" + }, + "window" : { + "color" : "#2F2F3AFF", + "paddingHorizontal" : 9, + "width" : 560, + "borderPadding" : 0, + "borderColor" : "#FFC552FF", + "blur" : 0, + "roundness" : -16, + "paddingVertical" : 0 + }, + "credit" : "Michael Welford", + "separator" : { + "color" : "#00000400", + "thickness" : 0 + }, + "scrollbar" : { + "color" : "#57575EFF", + "thickness" : 0 + }, + "name" : "Falcon Alternate" + } +} diff --git a/.config/nvim/colors/falcon/alfred/falcon-default.alfredappearance b/.config/nvim/colors/falcon/alfred/falcon-default.alfredappearance new file mode 100755 index 0000000..0ffd035 --- /dev/null +++ b/.config/nvim/colors/falcon/alfred/falcon-default.alfredappearance @@ -0,0 +1,61 @@ +{ + "alfredtheme" : { + "result" : { + "textSpacing" : 4, + "subtext" : { + "size" : 12, + "colorSelected" : "#DFDFE5FF", + "font" : "Fira Code", + "color" : "#57575EFF" + }, + "shortcut" : { + "size" : 16, + "colorSelected" : "#B4B4B9FF", + "font" : "Fira Code", + "color" : "#787882FF" + }, + "backgroundSelected" : "#212127FF", + "text" : { + "size" : 20, + "colorSelected" : "#F8F8FFFF", + "font" : "Fira Code", + "color" : "#B4B4B9FF" + }, + "iconPaddingHorizontal" : 12, + "paddingVertical" : 9, + "iconSize" : 32 + }, + "search" : { + "paddingVertical" : 11, + "background" : "#020221FF", + "spacing" : 0, + "text" : { + "size" : 32, + "colorSelected" : "#000004FF", + "font" : "Fira Code", + "color" : "#FFC552FF" + }, + "backgroundSelected" : "#BFDAFFFF" + }, + "window" : { + "color" : "#020221FF", + "paddingHorizontal" : 9, + "width" : 560, + "borderPadding" : 0, + "borderColor" : "#FFC552FF", + "blur" : 0, + "roundness" : -16, + "paddingVertical" : 0 + }, + "credit" : "Michael Welford", + "separator" : { + "color" : "#00000400", + "thickness" : 0 + }, + "scrollbar" : { + "color" : "#57575EFF", + "thickness" : 0 + }, + "name" : "Falcon Default" + } +} diff --git a/.config/nvim/colors/falcon/autoload/airline/themes/falcon.vim b/.config/nvim/colors/falcon/autoload/airline/themes/falcon.vim new file mode 100755 index 0000000..6927e46 --- /dev/null +++ b/.config/nvim/colors/falcon/autoload/airline/themes/falcon.vim @@ -0,0 +1,50 @@ +" ============================================================ +" falcon +" +" URL:https://github.com/fenetikm/falcon +" Author: Michael Welford +" License: MIT +" Last Change: 2021/10/25 20:07 +" ============================================================ + +let g:airline#themes#falcon#palette = {} + +let s:normal1 = [ "#000004", "#B4B4B9", 0, 249 ] +let s:normal2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:normal3 = [ "#787882", "#28282D", 243, 235 ] +let g:airline#themes#falcon#palette.normal = airline#themes#generate_color_map(s:normal1, s:normal2, s:normal3) + +let s:insert1 = [ "#000004", "#FF3600", 0, 202 ] +let s:insert2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:insert3 = [ "#B4B4B9", "#28282D", 249, 235 ] +let g:airline#themes#falcon#palette.insert = airline#themes#generate_color_map(s:insert1, s:insert2, s:insert3) + +let s:replace1 = [ "#000004", "#FF761A", 0, 208 ] +let s:replace2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:replace3 = [ "#B4B4B9", "#28282D", 249, 235 ] +let g:airline#themes#falcon#palette.replace = airline#themes#generate_color_map(s:replace1, s:replace2, s:replace3) + +let s:visual1 = [ "#000004", "#FFC552", 0, 221 ] +let s:visual2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:visual3 = [ "#B4B4B9", "#28282D", 249, 235 ] +let g:airline#themes#falcon#palette.visual = airline#themes#generate_color_map(s:visual1, s:visual2, s:visual3) + +let s:inactive1 = [ "#57575E", "#1C1C22", 240, 234 ] +let s:inactive2 = [ "#57575E", "#1C1C22", 240, 234 ] +let s:inactive3 = [ "#57575E", "#1C1C22", 240, 234 ] +let g:airline#themes#falcon#palette.inactive = airline#themes#generate_color_map(s:inactive1, s:inactive2, s:inactive3) + +if !get(g:, 'loaded_ctrlp', 0) + finish +endif + +let s:CP1 = [ "#787882", "#36363A", 243, 237 ] +let s:CP2 = [ "#787882", "#36363A", 243, 237 ] +let s:CP3 = [ "#787882", "#36363A", 243, 237 ] + +let g:airline#themes#falcon#palette.ctrlp = airline#extensions#ctrlp#generate_color_map(s:CP1, s:CP2, s:CP3) + +" =================================== +" Generated by Estilo 1.5.0 +" https://github.com/jacoborus/estilo +" =================================== diff --git a/.config/nvim/colors/falcon/autoload/lightline/colorscheme/falcon.vim b/.config/nvim/colors/falcon/autoload/lightline/colorscheme/falcon.vim new file mode 100755 index 0000000..af951ac --- /dev/null +++ b/.config/nvim/colors/falcon/autoload/lightline/colorscheme/falcon.vim @@ -0,0 +1,42 @@ +" ============================================================ +" Falcon +" +" URL: https://github.com/fenetikm/falcon +" Author: Michael Welford +" License: MIT +" Last Change: 2018/01/06 22:27 +" ============================================================ + +if exists('g:lightline') + let s:p = {"normal": {}, "inactive": {}, "insert": {}, "replace": {}, "visual": {}, "tabline": {} } + + let s:p.normal.left = [[["#000004", 0], ["#dfdfe5", 254]], [["#dfdfe5", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.normal.right = [[["#000004", 0], ["#dfdfe5", 254]], [["#787882", 248], ["#28282d", 241]]] + let s:p.normal.middle = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.inactive.left = [[["#57575e", 241], ["#1c1c22", 237], 'italic'], [["#57575e", 241], ["#1c1c22", 237], 'italic']] + let s:p.inactive.right = [[["#57575e", 241], ["#1c1c22", 237], 'italic'], [["#57575e", 241], ["#1c1c22", 237], 'italic']] + let s:p.inactive.middle = [[["#57575e", 241], ["#1c1c22", 237], 'italic']] + let s:p.insert.left = [[["#000004", 0], ["#ff3600", 202]], [["#d4d4d9", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.insert.right = [[["#000004", 0], ["#ff3600", 202]], [["#787882", 248], ["#28282d", 241]]] + let s:p.insert.middle = [[["#57575e", 241], ["#28282d", 241]]] + let s:p.replace.left = [[["#000004", 0], ["#ff761a", 208]], [["#d4d4d9", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.replace.right = [[["#000004", 0], ["#ff761a", 208]], [["#787882", 248], ["#28282d", 241]]] + let s:p.replace.middle = [[["#57575e", 241], ["#28282d", 241]]] + let s:p.visual.left = [[["#000004", 0], ["#ffc552", 220]], [["#d4d4d9", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.visual.right = [[["#000004", 0], ["#ffc552", 220]], [["#787882", 248], ["#28282d", 241]]] + let s:p.visual.middle = [[["#57575e", 241], ["#28282d", 241]]] + let s:p.tabline.left = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.tabline.tabsel = [[["#dfdfe5", 248], ["#28282d", 237]]] + let s:p.tabline.middle = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.tabline.right = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.normal.error = [[["#000004", 254], ["#ff3600", 202]]] + let s:p.normal.warning = [[["#000004", 208], ["#ff761a", 208]]] + let s:p.normal.ok = [[["#000004", 208], ["#718e3f", 208]]] + + let g:lightline#colorscheme#falcon#palette = lightline#colorscheme#flatten(s:p) +endif + +" =================================== +" Generated by Estilo 1.3.3 +" https://github.com/jacoborus/estilo +" =================================== diff --git a/.config/nvim/colors/falcon/colors/falcon.vim b/.config/nvim/colors/falcon/colors/falcon.vim new file mode 100755 index 0000000..33f21df --- /dev/null +++ b/.config/nvim/colors/falcon/colors/falcon.vim @@ -0,0 +1,597 @@ +" =============================================================== +" falcon +" +" URL: https://github.com/fenetikm/falcon +" Author: Michael Welford +" License: MIT +" Last Change: 2021/10/25 20:07 +" =============================================================== + +set background=dark +hi clear +if exists("syntax_on") + syntax reset +endif +let g:colors_name="falcon" + + +let Italic = "" +if exists('g:falcon_italic') + let Italic = "italic" +endif +let g:falcon_italic = get(g:, 'falcon_italic', 0) + +let Bold = "" +if exists('g:falcon_bold') + let Bold = "bold" +endif + +let g:falcon_bold = get(g:, 'falcon_bold', 0) +hi ALEErrorSign guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi ALEWarningSign guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi ALEInfoSign guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link AspVBSVariableSimple Identifier +hi link AspVBSStatement Keyword +hi ColorColumn guifg=NONE ctermfg=NONE guibg=#151521 ctermbg=234 gui=NONE cterm=NONE +hi Conceal guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Cursor guifg=NONE ctermfg=NONE guibg=#787882 ctermbg=243 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE ctermfg=NONE guibg=#171729 ctermbg=234 gui=NONE cterm=NONE +hi CursorLine guifg=NONE ctermfg=NONE guibg=#2F2F3A ctermbg=236 gui=NONE cterm=NONE +hi CursorLineNr guifg=#B4B4B9 ctermfg=249 guibg=#2F2F3A ctermbg=236 gui=NONE cterm=NONE +hi Directory guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi DiffAdd guifg=NONE ctermfg=NONE guibg=#203003 ctermbg=234 gui=NONE cterm=NONE +hi DiffChange guifg=NONE ctermfg=NONE guibg=#031630 ctermbg=233 gui=NONE cterm=NONE +hi DiffDelete guifg=NONE ctermfg=NONE guibg=#300E03 ctermbg=233 gui=NONE cterm=NONE +hi DiffText guifg=NONE ctermfg=NONE guibg=#203003 ctermbg=234 gui=NONE cterm=NONE +hi ErrorMsg guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VertSplit guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Folded guifg=#787882 ctermfg=243 guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi FoldColumn guifg=#787882 ctermfg=243 guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi SignColumn guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IncSearch guifg=#020221 ctermfg=0 guibg=#BFDAFF ctermbg=153 gui=Bold cterm=Bold +hi LineNr guifg=#57575E ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=#f0e1ce ctermfg=224 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi NonText guifg=#36363A ctermfg=237 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE +hi Normal guifg=#B4B4B9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE +hi PMenu guifg=#878791 ctermfg=102 guibg=#171729 ctermbg=234 gui=NONE cterm=NONE +hi PMenuSel guifg=#000004 ctermfg=0 guibg=#FFC552 ctermbg=221 gui=NONE cterm=NONE +hi PmenuSbar guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi PmenuThumb guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Question guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Search guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=Bold,underline cterm=Bold,underline +hi SpecialKey guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=underline cterm=underline +hi SpellLocal guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=underline cterm=underline +hi SpellCap guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=undercurl cterm=undercurl +hi SpellRare guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=underline cterm=underline +hi StatusLine guifg=#787882 ctermfg=243 guibg=#28282D ctermbg=235 gui=NONE cterm=NONE +hi StatusLineNC guifg=#787882 ctermfg=243 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi TabLine guifg=#787882 ctermfg=243 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi TabLineFill guifg=NONE ctermfg=NONE guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi TabLineSel guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Title guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Visual guifg=#DFDFE5 ctermfg=254 guibg=#2D1078 ctermbg=4 gui=NONE cterm=NONE +hi WildMenu guifg=#020221 ctermfg=0 guibg=#FFC552 ctermbg=221 gui=NONE cterm=NONE +hi Comment guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi Constant guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi String guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Character String +hi Boolean guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi Number guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Float Number +hi Identifier guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Function guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Statement guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Conditional guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Repeat Statement +hi link Label Statement +hi Operator guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Keyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Exception Statement +hi PreProc guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Include PreProc +hi link Define PreProc +hi link Macro PreProc +hi link PreCondit PreProc +hi Type guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link StorageClass Type +hi link Structure Type +hi link Typedef Type +hi Special guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link SpecialChar Special +hi link Tag Special +hi Delimiter guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link SpecialComment Special +hi link Debug Special +hi Underlined guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi Todo guifg=#020221 ctermfg=0 guibg=#cfc1b2 ctermbg=181 gui=Italic cterm=Italic +hi QuickFixLine guifg=#BFDAFF ctermfg=153 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi Bold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi Italic guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi IndentBlanklineChar guifg=#36363A ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IndentBlanklineIndent1 guifg=#36363A ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IndentBlanklineIndent2 guifg=#4F4F59 ctermfg=239 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi BufTabLineCurrent guifg=#B4B4B9 ctermfg=249 guibg=#787882 ctermbg=243 gui=NONE cterm=NONE +hi BufTabLineActive guifg=#DFDFE5 ctermfg=254 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi BufTabLineHidden guifg=#787882 ctermfg=243 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi BufTabLineFill guifg=NONE ctermfg=NONE guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi CleverFDefaultLabel guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi cPreCondit guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link cDefine Define +hi cStructure guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link cStorageClass StorageClass +hi link cType Type +hi cCustomParen guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cConditional guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cCustomFunc guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cStatement guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cppSTLnamespace guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cppAccess guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cAnsiFunction guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cSpecial guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi cssVendor guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssTagName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssSelectorOp2 guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssAttrComma guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link cssFunction Function +hi cssIdentifier guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssInclude guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssIncludeKeyword guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssImportant guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link cssBraces Delimiter +hi cssAttributeSelector guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssMediaType guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi cssMediaKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssFontDescriptor guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssClassName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssClassNameDot guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssProp guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssAttr guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssNoise guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssPseudoClass guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssAtRuleLogical guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Done guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Partial guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link diffAdded DiffAdd +hi link diffRemoved DiffDelete +hi link diffFile Title +hi diffLine guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi diffSubname guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi dockercomposeKeywords guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link elmTypeDef Type +hi elmType guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi elmTopLevelDecl guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link elmAlias Identifier +hi fugitiveSymbolicRef guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fugitiveHeader guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fugitiveHunk guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fugitiveModifier guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fzf1 guifg=#FFC552 ctermfg=221 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi fzf2 guifg=#FF761A ctermfg=208 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi fzf3 guifg=#FF761A ctermfg=208 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi gitcommitSummary guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitBranch guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitDiscardedType guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitSelectedType guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitDiscardedFile guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitSelectedFile guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitconfigSection guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitconfigVariable guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsAdd guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsChange guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsDelete guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsChangeDelete guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goLabel guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goBuiltins guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goVar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goPackage guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link goImport goPackage +hi graphqlVariable guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlStructure guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlOperator guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpHyperTextJump guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi helpStar guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpHeadline guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpSectionDelim guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpOption guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi HighlightedyankRegion guifg=#F8F8FF ctermfg=15 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlTag guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlEndTag guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlArg guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link htmlTagName Number +hi htmlSpecialTagName guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlH1 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi htmlH2 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link htmlH3 htmlH2 +hi link htmlH4 htmlH2 +hi link htmlH5 htmlH2 +hi link htmlH6 htmlH2 +hi htmlTitle guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi htmlSpecialChar guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IndentGuidesOdd guifg=NONE ctermfg=NONE guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi IndentGuidesEven guifg=NONE ctermfg=NONE guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi javaRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link javaStatement javaRepeat +hi javaScriptBraces guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi javaScriptNull guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi javaScriptGlobal guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link jsBrackets Delimiter +hi link jsClassBraces jsBrackets +hi link jsBraces jsBrackets +hi link jsObjectBraces jsBrackets +hi link jsParens jsBrackets +hi jsObjectKey guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsFuncBraces jsBrackets +hi link jsFuncParens jsBrackets +hi link jsIfElseBraces jsBrackets +hi jsFuncArgs guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsExtendsKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsArrowFunction Operator +hi jsFunction guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsRepeat jsFunction +hi jsReturn guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassDefinition guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassProperty guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsNull guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link jsStorageClass StorageClass +hi jsObjectSeparator guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsObjectValue guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsExportDefault guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsRegexpCharClass guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsTemplateBraces guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsThis guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi jsFuncCall guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsObjectProp guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsConditional guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsVariableDef guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsFuncBlock guifg=#F8F8FF ctermfg=15 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsTry guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsCatch jsTry +hi jsTryCatchBraces guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsGlobalObjects guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi jsParen guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsParenCatch jsParen +hi link jsParenIfElse jsParen +hi jsAsyncKeyword guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsForAwait jsAsyncKeyword +hi jsGlobalNodeObjects guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsonBoolean guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsonKeywordMatch Delimiter +hi link xmlEqual Operator +hi xmlEndTag guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlTagN guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlTagName guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultError guifg=#a82400 ctermfg=124 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultWarning guifg=#c99c40 ctermfg=179 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultInformation guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultHint guifg=#a1968a ctermfg=246 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspReferenceRead guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi LspReferenceText guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi LspReferenceWrite guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi LspDiagnosticsVirtualTextError guifg=#a82400 ctermfg=124 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsVirtualTextWarning guifg=#c99c40 ctermfg=179 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsVirtualTextHint guifg=#a1968a ctermfg=246 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsVirtualTextInformation guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsUnderlineError guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#a82400 +hi LspDiagnosticsUnderlineWarning guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#c99c40 +hi LspDiagnosticsUnderlineHint guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#a1968a +hi LspDiagnosticsUnderlineInformation guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#787882 +hi luaFuncKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncTable guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncCall guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncArgName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaCond guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link luaStatement luaCond +hi link luaLocal Constant +hi link luaFuncParens Delimiter +hi link luaParens luaFuncParens +hi link luaBraces luaFuncParens +hi luaDocTag guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link markdownHeadingDelimiter Delimiter +hi link markdownItemDelimiter Delimiter +hi markdownInlineDelimiter guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link markdownOrderedListMarker Delimiter +hi link markdownListMarker Delimiter +hi link markdownLinkTextDelimiter Delimiter +hi markdownUrl guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi markdownCodeDelimiter guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi markdownCode guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link markdownError SpellBad +hi markdownXmlElement guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link mkdLink Underlined +hi mkdURL guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi mkdInlineURL guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi mkdBold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi htmlBold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link mkdListItem Delimiter +hi htmlItalic guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi mkdCode guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi mkdCodeDelimiter guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link mkdHeading Delimiter +hi healthSuccess guifg=#020221 ctermfg=0 guibg=#718E3F ctermbg=65 gui=NONE cterm=NONE +hi healthError guifg=#020221 ctermfg=0 guibg=#FF3600 ctermbg=202 gui=NONE cterm=NONE +hi NormalFloat guifg=NONE ctermfg=NONE guibg=#2F2F3A ctermbg=236 gui=NONE cterm=NONE +hi NormalFloatAlt guifg=NONE ctermfg=NONE guibg=#242430 ctermbg=235 gui=NONE cterm=NONE +hi NERDTreeCWD guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeOpenable guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeClosable guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeFlags guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeGitStatusDirDirty guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi netrwClassify guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbr guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbrDeprecated guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbrMatch guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbrMatchFuzzy guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemKind guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemMenu guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeFolderName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeRootFolder guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeFolderIcon guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeEmptyFolderName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeOpenedFolderName guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeOpenedFile guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi NvimTreeGitDirty guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitStaged guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitMerge guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitRenamed guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitNew guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitDeleted guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpCommentTitle guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi phpDocTags guifg=#a1968a ctermfg=246 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi phpDocCustomTags guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpDocNamespaceSeparator Comment +hi phpUseNamespaceSeparator guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpBoolean Boolean +hi phpStorageClass guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpClasses guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpStaticClasses guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi phpClassImplements guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link phpClassExtends phpClassImplements +hi phpStructure guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi phpMethod guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpFunctions guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpKeyword Keyword +hi link phpType Type +hi link phpParent Delimiter +hi phpMemberSelector guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpOperator Operator +hi phpVarSelector guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpIdentifier Identifier +hi phpStringDelimiter guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpSuperglobals guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi phpSpecialChar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link phpNullValue Boolean +hi plugDeleted guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi plugBracket guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi plug1 guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi plug2 guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonStatement guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonFunction guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonExClass guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonBuiltinObj guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonDot guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonBuiltinFunc guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link pythonNone Boolean +hi rstSections guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rstCodeBlock guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rstDirective guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rstHyperlinkTarget guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi rstExDirective guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyClass guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyClassName Normal +hi rubyModule guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyModuleName Normal +hi rubyDefine guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyFunction guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyControl guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyConstant guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyGlobalVariable guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi rubySymbol guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyArrayDelimiter Delimiter +hi rubyBlockParameterList guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyCurlyBlockDelimiter Delimiter +hi rubyDoBlock guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyLocalVariableOrMethod guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyMethodBlock guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyHeredocDelimiter guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyCurlyBlock guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shCaseBar Operator +hi link shQuote Delimiter +hi shFunction guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shLoop Function +hi link shTestOpr Operator +hi shVariable guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi bashSpecialVariables guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shSnglCase Delimiter +hi shSetList guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi shStatement guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shSet shStatement +hi Sneak guifg=#F8F8FF ctermfg=15 guibg=#2D1078 ctermbg=4 gui=NONE cterm=NONE +hi SneakLabel guifg=#F8F8FF ctermfg=15 guibg=#2D1078 ctermbg=4 gui=NONE cterm=NONE +hi SneakScope guifg=#F8F8FF ctermfg=15 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link sqlStatement Function +hi sqlKeyword guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link sqlSpecial Number +hi sqlType guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link sqlFunction Title +hi link mysqlKeyword sqlKeyword +hi link mysqlOperator Operator +hi link mysqlFunction sqlType +hi link mysqlStatement sqlStatement +hi link mysqlType sqlType +hi link Quote Delimiter +hi sshconfigKeyword guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi sshconfigMatch guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi sshconfigYesNo guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi sshconfigLogLevel guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifySlash guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyPath guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyHeader guifg=#5521D9 ctermfg=56 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyFile guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifySection guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyNumber guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarComment guifg=#36363A ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarKind guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarNestedKind guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarScope guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarType guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarSignature guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarPseudoID guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarFoldIcon guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarHighlight guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarVisibilityPublic guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarVisibilityProtected guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarVisibilityPrivate guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxCmds guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxOptsSet guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxOptions guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxOptsSetw guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link TSKeyword Keyword +hi link TSVariable Identifier +hi TSMethod guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link TSVariableBuiltin Type +hi link TSFunction Keyword +hi link TSOperator Operator +hi TSConstructor guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link TSException Keyword +hi link TSConstant Constant +hi link TSConstBuiltin Boolean +hi TSError guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link twigVarDelim Delimiter +hi link twigTagDelim Delimiter +hi twigString guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi twigOperator guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi twigTagBlock guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlLink guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link twigVariable Identifier +hi twigFilter guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi snipSnippetHeaderKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link snipSnippetFooterKeyword snipSnippetHeaderKeyword +hi link snipTabStop Identifier +hi snipTabStopDefault guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link snipMirror snipTabStop +hi link snipSnippetTrigger String +hi link snipSnippetDocContextString Comment +hi DbgBreakptLine guifg=NONE ctermfg=NONE guibg=#031630 ctermbg=233 gui=NONE cterm=NONE +hi DbgBreakptSign guifg=#031630 ctermfg=233 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi DbgCurrentLine guifg=NONE ctermfg=NONE guibg=#300E03 ctermbg=233 gui=NONE cterm=NONE +hi DbgCurrentSign guifg=#300E03 ctermfg=233 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterAdd guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterChange guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterDelete guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterChangeDelete guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi SignatureMarkText guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Terminal guifg=#B4B4B9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE +hi titleEntry guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimCommentTitle guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi vimCommand guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimVar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimLet guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimNotFunc guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimIsCommand guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link vimOperParen Delimiter +hi vimFuncVar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi vimFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimAutoEvent guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimMap guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimGroup guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimHiTerm guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimSetSep guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link vimHighlight vimLet +hi vimSetEqual guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimNotation guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimMapLhs guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimMapRhs guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link VimwikiLink Underlined +hi link VimwikiHeaderChar Delimiter +hi VimwikiHeader1 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi VimwikiHeader2 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link VimwikiHeader3 VimwikiHeader2 +hi link VimwikiHeader4 VimwikiHeader2 +hi link VimwikiHeader5 VimwikiHeader2 +hi link VimwikiHeader6 VimwikiHeader2 +hi link VimwikiList Delimiter +hi VimwikiPre guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiCode guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiCodeChar guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiMarkers guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiBold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi VimwikiItalic guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi VistaTag guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VistaPrefix guifg=#57575E ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlAttrib guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlTag guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlProcessingDelim guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlFlowStringDelimiter guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlBlockCollectionItemStart guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlBlockMappingKey guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlFlowMappingKey guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link yamlFlowIndicator Delimiter +hi link yamlKeyValueDelimiter Delimiter +hi yamlNull guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link yamlBool Number +hi yamlPlainScalar guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi zshCommands guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link zshBrackets Delimiter +hi zshOptStart guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi zshVariableDef guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link zshTypes Type +hi link zshKeyword Keyword +hi link zshStringDelimiter Delimiter +hi link zshDelimiter Delimiter +hi link zshParentheses Delimiter + +if exists('*term_setansicolors') + let g:terminal_ansi_colors = repeat([0], 16) + + let g:terminal_ansi_colors[0] = '#000004' + let g:terminal_ansi_colors[1] = '#FF3600' + let g:terminal_ansi_colors[2] = '#718E3F' + let g:terminal_ansi_colors[3] = '#FFC552' + let g:terminal_ansi_colors[4] = '#635196' + let g:terminal_ansi_colors[5] = '#FF761A' + let g:terminal_ansi_colors[6] = '#34bfa4' + let g:terminal_ansi_colors[7] = '#B4B4B9' + let g:terminal_ansi_colors[8] = '#020221' + let g:terminal_ansi_colors[9] = '#FF8E78' + let g:terminal_ansi_colors[10] = '#B1BF75' + let g:terminal_ansi_colors[11] = '#FFD392' + let g:terminal_ansi_colors[12] = '#99A4BC' + let g:terminal_ansi_colors[13] = '#FFB07B' + let g:terminal_ansi_colors[14] = '#8BCCBF' + let g:terminal_ansi_colors[15] = '#F8F8FF' +endif + +if has('nvim') + let g:terminal_color_0 = '#000004' + let g:terminal_color_1 = '#FF3600' + let g:terminal_color_2 = '#718E3F' + let g:terminal_color_3 = '#FFC552' + let g:terminal_color_4 = '#635196' + let g:terminal_color_5 = '#FF761A' + let g:terminal_color_6 = '#34bfa4' + let g:terminal_color_7 = '#B4B4B9' + let g:terminal_color_8 = '#020221' + let g:terminal_color_9 = '#FF8E78' + let g:terminal_color_10 = '#B1BF75' + let g:terminal_color_11 = '#FFD392' + let g:terminal_color_12 = '#99A4BC' + let g:terminal_color_13 = '#FFB07B' + let g:terminal_color_14 = '#8BCCBF' + let g:terminal_color_15 = '#F8F8FF' +endif + +" =================================== +" Generated by Estilo 1.5.0 +" https://github.com/jacoborus/estilo +" =================================== diff --git a/.config/nvim/colors/falcon/corpus/README.rst b/.config/nvim/colors/falcon/corpus/README.rst new file mode 100755 index 0000000..19f85ca --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/README.rst @@ -0,0 +1,107 @@ +digimarks +========= + +|PyPI version| |PyPI license| |Code health| |Codacy| + +Simple bookmarking service, using a SQLite database to store bookmarks, supporting tags and automatic title fetching. + + +Installation +------------ + +From PyPI +~~~~~~~~~ + +Assuming you already are inside a virtualenv: + +.. code-block:: bash + + pip install digimarks + + +From Git +~~~~~~~~ + +Create a new virtualenv (if you are not already in one) and install the +necessary packages: + +.. code-block:: bash + + git clone https://github.com/aquatix/digimarks.git + cd digimarks + mkvirtualenv digimarks # or whatever project you are working on + pip install -r requirements.txt + + +Usage / example configuration +----------------------------- + +Copy ``settings.py`` from example_config to the parent directory and +configure to your needs (*at the least* change the value of `SYSTEMKEY`). + +Run digimarks as a service under nginx or apache and call the appropriate +url's when wanted. + +Url's are of the form https://marks.example.com// + + +Bookmarklet +~~~~~~~~~~~ + +To easily save a link from your browser, open its bookmark manager and create a new bookmark with as url: + +.. code-block:: javascript + + javascript:location.href='http://marks.example.com/1234567890abcdef/add?url='+encodeURIComponent(location.href); + + +Creating a new user +------------------- + +After having set up the ```settings.py``` as under Usage, you can add a new user, by going to this path on your digimarks server: + +//adduser + +where `secretkey` is the value set in settings.SYSTEMKEY + +digimarks will then redirect to the bookmarks overview page of the new user. Please remember the user key (the hash in the url), as it will not be visible otherwise in the interface. + +If you for whatever reason would lose this user key, just either look on the console (or webserver logs) where the list of available user keys is printed on digimarks startup, or open bookmarks.db with a SQLite editor. + + +Server configuration +~~~~~~~~~~~~~~~~~~~~ + +* `vhost for Apache2.4`_ +* `uwsgi.ini`_ + + +What's new? +----------- + +See the `Changelog`_. + + +Attributions +------------ + +'M' favicon by `Freepik`_. + + +.. _digimarks: https://github.com/aquatix/digimarks +.. _webhook: https://en.wikipedia.org/wiki/Webhook +.. |PyPI version| image:: https://img.shields.io/pypi/v/digimarks.svg + :target: https://pypi.python.org/pypi/digimarks/ +.. |PyPI license| image:: https://img.shields.io/github/license/aquatix/digimarks.svg + :target: https://pypi.python.org/pypi/digimarks/ +.. |Code health| image:: https://landscape.io/github/aquatix/digimarks/master/landscape.svg?style=flat + :target: https://landscape.io/github/aquatix/digimarks/master + :alt: Code Health +.. |Codacy| image:: https://api.codacy.com/project/badge/Grade/9a34319d917b43219a29e59e9ac75e3b + :alt: Codacy Badge + :target: https://app.codacy.com/app/aquatix/digimarks?utm_source=github.com&utm_medium=referral&utm_content=aquatix/digimarks&utm_campaign=badger +.. _hook settings: https://github.com/aquatix/digimarks/blob/master/example_config/examples.yaml +.. _vhost for Apache2.4: https://github.com/aquatix/digimarks/blob/master/example_config/apache_vhost.conf +.. _uwsgi.ini: https://github.com/aquatix/digimarks/blob/master/example_config/uwsgi.ini +.. _Changelog: https://github.com/aquatix/digimarks/blob/master/CHANGELOG.md +.. _Freepik: http://www.flaticon.com/free-icon/letter-m_2041 diff --git a/.config/nvim/colors/falcon/corpus/bash.sh b/.config/nvim/colors/falcon/corpus/bash.sh new file mode 100755 index 0000000..cd73db1 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/bash.sh @@ -0,0 +1,35 @@ +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi +# +# aliases +alias grpe=grep +alias grep='grep --color --line-number' +alias vim="vim -p" +alias rebash="source ~/.bashrc" + +alias install='sudo apt-get -y install' +alias search='apt-cache search' +alias purge='sudo apt-get purge' + +export EDITOR=vim + +# set up the prompt to the hostname +shopt -s checkwinsize +PS1="\e[1;35m[\w] --- \@ \d \n$>\[\e[0m\]" +PS2="\e[1;35m->\[\e[0m\]" + +#-------------------------------------------------- +# grabs some definitions from google +#-------------------------------------------------- +define () { + lynx -dump "http://www.google.com/search?hl=en&q=define%3A+${1}" | grep -m 25 -w "*" | sed 's/;/ -/g' | cut -d- -f5 > /tmp/templookup.txt + if [[ -s /tmp/templookup.txt ]] ;then + until ! read response + do + echo "${response}" + done < /tmp/templookup.txt + else + echo "Sorry $USER, I can't find the term \"${1} \"" + fi diff --git a/.config/nvim/colors/falcon/corpus/c.c b/.config/nvim/colors/falcon/corpus/c.c new file mode 100755 index 0000000..c46b913 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/c.c @@ -0,0 +1,48 @@ +#include + +void quicksort(int *A, int len); + +/** + * Main starts here. + */ +int main (void) { + int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1}; + int n = sizeof a / sizeof a[0]; + + int i; + for (i = 0; i < n; i++) { + printf("%d ", a[i]); + } + printf("\n hello"); + + quicksort(a, n); + + for (i = 0; i < n; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} + +// This is quicksort. +void quicksort(int *A, int len) { + if (len < 2) return; + + int pivot = A[len / 2]; + + int i, j; + for (i = 0, j = len - 1; ; i++, j--) { + while (A[i] < pivot) i++; + while (A[j] > pivot) j--; + + if (i >= j) break; + + int temp = A[i]; + A[i] = A[j]; + A[j] = temp; + } + + quicksort(A, i); + quicksort(A + i, len - i); +} diff --git a/.config/nvim/colors/falcon/corpus/clojure.clj b/.config/nvim/colors/falcon/corpus/clojure.clj new file mode 100755 index 0000000..788f045 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/clojure.clj @@ -0,0 +1,48 @@ +;; A comment! +(defn qsort [L] + (if (empty? L) + '() + (let [[pivot & L2] L] + (lazy-cat (qsort (for [y L2 :when (< y pivot)] y)) + (list pivot) + (qsort (for [y L2 :when (>= y pivot)] y)))))) + +(defn qsort3 [[pivot :as coll]] + (when pivot + (lazy-cat (qsort (filter #(< % pivot) coll)) + (filter #{pivot} coll) + (qsort (filter #(> % pivot) coll))))) + +(def bit-bucket-writer + (proxy [java.io.Writer] [] + (write [buf] nil) + (close [] nil) + (flush [] nil))) + +(defmacro noprint + "Evaluates the given expressions with all printing to *out* silenced." + [& forms] + `(binding [*out* bit-bucket-writer] + ~@forms)) + +(noprint + (println "Hello, nobody!")) + +(defn run [nvecs nitems nthreads niters] + (let [vec-refs (->> (range (* nvecs nitems)) (partition nitems) (map (comp ref vec)) vec) + swap #(let [v1 (rand-int nvecs) + v2 (rand-int nvecs) + i1 (rand-int nitems) + i2 (rand-int nitems)] + (dosync + (let [tmp (nth @(vec-refs v1) i1)] + (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) + (alter (vec-refs v2) assoc i2 tmp)))) + report #(let [derefed (map deref vec-refs)] + (prn derefed) + (println "Distinct:" (->> derefed (apply concat) distinct count)))] + (report) + (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) + (report))) + +(run 100 10 10 100000) diff --git a/.config/nvim/colors/falcon/corpus/cpp.cpp b/.config/nvim/colors/falcon/corpus/cpp.cpp new file mode 100755 index 0000000..5e53f1b --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/cpp.cpp @@ -0,0 +1,73 @@ +/** + * From: http://rosettacode.org/wiki/Sorting_algorithms/ + */ +#include +#include // for std::partition +#include // for std::less + +// helper function for median of three +template + T median(T t1, T t2, T t3) +{ + if (t1 < t2) + { + if (t2 < t3) + return t2; + else if (t1 < t3) + return t3; + else + return t1; + } + else + { + if (t1 < t3) + return t1; + else if (t2 < t3) + return t3; + else + return t2; + } +} + +// helper object to get <= from < +template struct non_strict_op: + public std::binary_function +{ + non_strict_op(Order o): order(o) {} + bool operator()(typename Order::second_argument_type arg1, + typename Order::first_argument_type arg2) const + { + return !order(arg2, arg1); + } +private: + Order order; +}; + +template non_strict_op non_strict(Order o) +{ + return non_strict_op(o); +} + +template + void quicksort(RandomAccessIterator first, RandomAccessIterator last, Order order) +{ + if (first != last && first+1 != last) + { + typedef typename std::iterator_traits::value_type value_type; + RandomAccessIterator mid = first + (last - first)/2; + value_type pivot = median(*first, *mid, *(last-1)); + RandomAccessIterator split1 = std::partition(first, last, std::bind2nd(order, pivot)); + RandomAccessIterator split2 = std::partition(split1, last, std::bind2nd(non_strict(order), pivot)); + quicksort(first, split1, order); + quicksort(split2, last, order); + } +} + +template + void quicksort(RandomAccessIterator first, RandomAccessIterator last) +{ + quicksort(first, last, std::less::value_type>()); +} diff --git a/.config/nvim/colors/falcon/corpus/css.css b/.config/nvim/colors/falcon/corpus/css.css new file mode 100755 index 0000000..fce85dc --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/css.css @@ -0,0 +1,59 @@ +/* A comment. */ +@font-face { + font-family: 'Fira Code'; + src: url('eot/FiraCode-Bold.eot'); + src: url('eot/FiraCode-Bold.eot') format('embedded-opentype'), + url('woff2/FiraCode-Bold.woff2') format('woff2'), + url('woff/FiraCode-Bold.woff') format('woff'), + url('ttf/FiraCode-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal !important; + color: #fff; +} + +html, body { + padding: 0; + margin: 0; +} + +html { + font-size: 14px; +} + +@media screen and (min-width: 320px) { + html { + font-size: calc(11px + 9 * ((100vw - 320px) / 680)); + } +} + +@media screen and (min-width: 1000px) { + html { + font-size: 21px; + } +} + +body { + font-family: "Fira Code", monospace; + background: #000002; + color: #d4d4d9; + font-feature-settings: "calt" 1; /* Enable ligatures for IE 10+, Edge */ + text-rendering: optimizeLegibility; /* Force ligatures for Webkit, Blink, Gecko */ + -webkit-font-smoothing: subpixel-antialiased; +} + +#canvas { + display: block; + z-index: -1; + position: fixed; + top: 0; + left: 0; +} + +code, pre { + font-family: "Fira Code", monospace; + background: transparent; +} + +.blah #thing:nth-child(1) { + display: inline; +} diff --git a/.config/nvim/colors/falcon/corpus/elm.elm b/.config/nvim/colors/falcon/corpus/elm.elm new file mode 100755 index 0000000..de6a5e8 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/elm.elm @@ -0,0 +1,86 @@ +import Html exposing (..) + +{-| TodoMVC implemented in Elm, using plain HTML and CSS for rendering. +This application is broken up into three key parts: + 1. Model - a full definition of the application's state + 2. Update - a way to step the application state forward + 3. View - a way to visualize our application state with HTML +This clean division of concerns is a core part of Elm. You can read more about +this in +-} + + +main : Program (Maybe Model) Model Msg +main = + Browser.document + { init = init + , view = \model -> { title = "Elm • TodoMVC", body = [view model] } + , update = updateWithStorage + , subscriptions = \_ -> Sub.none + } + +-- The full application state of our todo app. +type alias Model = + { entries : List Entry + , field : String + , uid : Int + , visibility : String + } + +type Msg + = NoOp + | UpdateField String + | EditingEntry Int Bool + | UpdateEntry Int String + | Add + | Delete Int + | DeleteComplete + | Check Int Bool + | CheckAll Bool + | ChangeVisibility String + +-- How we update our Model on a given Msg? +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + NoOp -> + ( model, Cmd.none ) + + Add -> + ( { model + | uid = model.uid + 1 + , field = "" + , entries = + if String.isEmpty model.field then + model.entries + else + model.entries ++ [ newEntry model.field model.uid ] + } + , Cmd.none + ) + + UpdateField str -> + ( { model | field = str } + , Cmd.none + ) + +-- VIEW CONTROLS AND FOOTER + + +viewControls : String -> List Entry -> Html Msg +viewControls visibility entries = + let + entriesCompleted = + List.length (List.filter .completed entries) + + entriesLeft = + List.length entries - entriesCompleted + in + footer + [ class "footer" + , hidden (List.isEmpty entries) + ] + [ lazy viewControlsCount entriesLeft + , lazy viewControlsFilters visibility + , lazy viewControlsClear entriesCompleted + ] diff --git a/.config/nvim/colors/falcon/corpus/go.go b/.config/nvim/colors/falcon/corpus/go.go new file mode 100755 index 0000000..cc1d6ff --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/go.go @@ -0,0 +1,93 @@ +package main + +import "fmt" + +func main() { + list := []int{31, 41, 59, 26, 53, 58, 97, 93, 23, 84} + fmt.Println("unsorted:", list) + + quicksort(list) + fmt.Println("sorted! ", list) +} + +func quicksort(a []int) { + var pex func(int, int) + pex = func(lower, upper int) { + for { + switch upper - lower { + case -1, 0: // 0 or 1 item in segment. nothing to do here! + return + case 1: // 2 items in segment + // < operator respects strict weak order + if a[upper] < a[lower] { + // a quick exchange and we're done. + a[upper], a[lower] = a[lower], a[upper] + } + return + // Hoare suggests optimized sort-3 or sort-4 algorithms here, + // but does not provide an algorithm. + } + + // Hoare stresses picking a bound in a way to avoid worst case + // behavior, but offers no suggestions other than picking a + // random element. A function call to get a random number is + // relatively expensive, so the method used here is to simply + // choose the middle element. This at least avoids worst case + // behavior for the obvious common case of an already sorted list. + bx := (upper + lower) / 2 + b := a[bx] // b = Hoare's "bound" (aka "pivot") + lp := lower // lp = Hoare's "lower pointer" + up := upper // up = Hoare's "upper pointer" + outer: + for { + // use < operator to respect strict weak order + for lp < upper && !(b < a[lp]) { + lp++ + } + for { + if lp > up { + // "pointers crossed!" + break outer + } + // < operator for strict weak order + if a[up] < b { + break // inner + } + up-- + } + // exchange + a[lp], a[up] = a[up], a[lp] + lp++ + up-- + } + // segment boundary is between up and lp, but lp-up might be + // 1 or 2, so just call segment boundary between lp-1 and lp. + if bx < lp { + // bound was in lower segment + if bx < lp-1 { + // exchange bx with lp-1 + a[bx], a[lp-1] = a[lp-1], b + } + up = lp - 2 + } else { + // bound was in upper segment + if bx > lp { + // exchange + a[bx], a[lp] = a[lp], b + } + up = lp - 1 + lp++ + } + // "postpone the larger of the two segments" = recurse on + // the smaller segment, then iterate on the remaining one. + if up-lower < upper-lp { + pex(lower, up) + lower = lp + } else { + pex(lp, upper) + upper = up + } + } + } + pex(0, len(a)-1) +} diff --git a/.config/nvim/colors/falcon/corpus/html.html b/.config/nvim/colors/falcon/corpus/html.html new file mode 100755 index 0000000..3d333a1 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/html.html @@ -0,0 +1,36 @@ + + + + Name Submission + + + + + + +

Submit your Name here!

+

We'll get more information on the following pages..

+
+ First name >
+ Last name: >
+ +
+

Click "Submit" to continue..

+ +

A nested List:

+ Google +
    +
  • Coffee & Tea
  • +
  • Tea +
      +
    • Black tea
    • +
    • Green tea +
        +
      • China
      • +
      • Africa
      • +
      +
    • +
    +
  • +
  • Milk
  • +
diff --git a/.config/nvim/colors/falcon/corpus/java.java b/.config/nvim/colors/falcon/corpus/java.java new file mode 100755 index 0000000..f55e307 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/java.java @@ -0,0 +1,31 @@ +// From http://rosettacode.org/wiki/Sorting_algorithms +public static > List quickSort(List arr) { + if (arr.isEmpty()) + return arr; + else { + E pivot = arr.get(0); + + List less = new LinkedList(); + List pivotList = new LinkedList(); + List more = new LinkedList(); + + // Partition + for (E i: arr) { + if (i.compareTo(pivot) < 0) + less.add(i); + else if (i.compareTo(pivot) > 0) + more.add(i); + else + pivotList.add(i); + } + + // Recursively sort sublists + less = quickSort(less); + more = quickSort(more); + + // Concatenate results + less.addAll(pivotList); + less.addAll(more); + return less; + } +} diff --git a/.config/nvim/colors/falcon/corpus/javascript.js b/.config/nvim/colors/falcon/corpus/javascript.js new file mode 100755 index 0000000..8ffeaed --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/javascript.js @@ -0,0 +1,53 @@ +/** + * @file + * + * Watch changes to *.es6.js files and compile them to ES5 during development. + * + * @internal This file is part of the core javascript build process and is only + * meant to be used in that context. + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const chokidar = require('chokidar'); +const nconst = 4; +const arr = thing[1]; + +const changeOrAdded = require('./changeOrAdded'); +const log = require('./log'); + +// Match only on .es6.js files. +const fileMatch = './**/*.es6.js'; +// Ignore everything in node_modules +const watcher = chokidar.watch(fileMatch, { + ignoreInitial: true, + ignored: './node_modules/**' +}); + +const unlinkHandler = (err) => { + if (err) { + log(err); + } + for (var i = 0; i < 9; i++) { + console.log(i); + } +}; + +const bool = false; +const nullish = null; + +console.log('Check.'); + +// Watch for filesystem changes. +watcher + .on('add', changeOrAdded) + .on('change', changeOrAdded) + .on('unlink', (filePath) => { + const fileName = filePath.slice(0, -7); + fs.stat(`${fileName}.js`, () => { + fs.unlink(`${fileName}.js`, unlinkHandler); + }); + }) + .on('ready', () => log(`Watching '${fileMatch}' for changes.`)); diff --git a/.config/nvim/colors/falcon/corpus/lua.lua b/.config/nvim/colors/falcon/corpus/lua.lua new file mode 100755 index 0000000..b2c19ee --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/lua.lua @@ -0,0 +1,45 @@ +-- in-place quicksort +-- @todo do the thing +function quicksort(t, start, endi) + start, endi = start or 1, endi or #t + --partition w.r.t. first element + if(endi - start < 1) then return t end + local pivot = start + for i = start + 1, endi do + if t[i] <= t[pivot] then + if i == pivot + 1 then + t[pivot],t[pivot+1] = t[pivot+1],t[pivot] + else + t[pivot],t[pivot+1],t[i] = t[i],t[pivot],t[pivot+1] + end + pivot = pivot + 1 + end + end + t = quicksort(t, start, pivot - 1) + return quicksort(t, pivot + 1, endi) +end + +-- example +print(unpack(quicksort{5, 2, 7, 3, 4, 7, 1})) + +function quicksort(t) + if #t<2 then return t end + local pivot=t[1] + local a,b,c={},{},{} + for _,v in ipairs(t) do + if vpivot then c[#c+1]=v + else b[#b+1]=v + end + end + a=quicksort(a) + c=quicksort(c) + for _,v in ipairs(b) do a[#a+1]=v end + for _,v in ipairs(c) do a[#a+1]=v end + return a +end + +-- on purpose errors to check LSP +re +function + diff --git a/.config/nvim/colors/falcon/corpus/markdown.md b/.config/nvim/colors/falcon/corpus/markdown.md new file mode 100755 index 0000000..927efbf --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/markdown.md @@ -0,0 +1,35 @@ +# Top level +## Another level down +1. Number list item +2. Another item + - Ul item + - And another + +A Paragraph with some _italics_ and something **bold** and now a [link](http://example.com). + +> This is a block +> + +Inline `code` perhaps? + +```sh +ls -al +``` + +```php +$thing = 'string'; +``` +![image](http://example.com) + +## Other stuff +- [ ] A checkbox +- [X] A checkbox that is marked + +Tables: + +First Header | Second Header +------------ | ------------- +Content from cell 1 | Content from cell 2 +Content in the first column | Content in the second column + +~~strikethrough~~ ? diff --git a/.config/nvim/colors/falcon/corpus/php.php b/.config/nvim/colors/falcon/corpus/php.php new file mode 100755 index 0000000..56ced4a --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/php.php @@ -0,0 +1,61 @@ +loadUserByName($reviewer_id); + if (!empty($reviewer)) { + return reset($reviewer); + } + $change; + + $user_storage = $this->entityTypeManager->getStorage('user'); + $reviewer = $user_storage->create(); + $reviewer->setUsername($reviewer_id) + ->enforceIsNew() + ->activate() + ->set('roles', ['reviewer']) + ->set(CcspUserService::FIELD_FULL_NAME, $reviewer_name) + ->setEmail($email) + ->save(); + + define('CONST', 1); //thing + // Here is a comment + + $a_flag = FALSE; + $a_number = 0; + $a_null = NULL; + + // @TODO fix this up, plaz. + return $reviewer; + + $hello = array_map(function($item) { + return $item; + }, $arr); + } + +} diff --git a/.config/nvim/colors/falcon/corpus/php_old.php b/.config/nvim/colors/falcon/corpus/php_old.php new file mode 100755 index 0000000..57900c9 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/php_old.php @@ -0,0 +1,36 @@ +prepare($sql); + } +} diff --git a/.config/nvim/colors/falcon/corpus/python.py b/.config/nvim/colors/falcon/corpus/python.py new file mode 100755 index 0000000..e50e1af --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/python.py @@ -0,0 +1,54 @@ +def dump_args(func): + "This decorator dumps out the arguments passed to a function before calling it" + argnames = func.func_code.co_varnames[:func.func_code.co_argcount] + fname = func.func_name + def echo_func(*args,**kwargs): + print fname, ":", ', '.join( + '%s=%r' % entry + for entry in zip(argnames,args) + kwargs.items()) + return func(*args, **kwargs) + return echo_func + +@dump_args +def f1(a,b,c): + print a + b + c + +f1(1, 2, 3) + +def precondition(precondition, use_conditions=DEFAULT_ON): + return conditions(precondition, None, use_conditions) + +def postcondition(postcondition, use_conditions=DEFAULT_ON): + return conditions(None, postcondition, use_conditions) + +class conditions(object): + __slots__ = ('__precondition', '__postcondition') + + def __init__(self, pre, post, use_conditions=DEFAULT_ON): + if not use_conditions: + pre, post = None, None + + self.__precondition = pre + self.__postcondition = post + +def quickSort(arr): + less = [] + pivotList = [] + more = [] + if len(arr) <= 1: + return arr + else: + pivot = arr[0] + for i in arr: + if i < pivot: + less.append(i) + elif i > pivot: + more.append(i) + else: + pivotList.append(i) + less = quickSort(less) + more = quickSort(more) + return less + pivotList + more + +a = [4, 65, 2, -31, 0, 99, 83, 782, 1] +a = quickSort(a) diff --git a/.config/nvim/colors/falcon/corpus/ruby.rb b/.config/nvim/colors/falcon/corpus/ruby.rb new file mode 100755 index 0000000..b2a0900 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/ruby.rb @@ -0,0 +1,37 @@ +require 'active_support' + +module VimColors + class RubyExample + CONSTANT = /^[0-9]+ regex awesomes$/ + + attr_reader :colorscheme + + # TODO: Bacon ipsum dolor sit amet + def initialize(attributes = {}) + @colorscheme = attributes[:colorscheme] + end + + def self.examples + # Bacon ipsum dolor sit amet + ['string', :symbol, true, false, nil, 99.9, 1..2].each do |value| + puts "it appears that #{value.inspect} is a #{value.class}" + end + + {:key1 => :value1, key2: 'value2'}.each do |key, value| + puts "the #{key.inspect} key has a value of #{value.inspect}" + end + + %w[One Two Three].each { |number| puts number } + end + + private + + def heredoc_example + <<-SQL + SELECT * + FROM colorschemes + WHERE background = 'dark' + SQL + end + end +end diff --git a/.config/nvim/colors/falcon/corpus/twig.html.twig b/.config/nvim/colors/falcon/corpus/twig.html.twig new file mode 100755 index 0000000..0f5ba83 --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/twig.html.twig @@ -0,0 +1,87 @@ +{# +/** + * @file + * Theme override to display a single page. + * + * The doctype, html, head and body tags are not in this template. Instead they + * can be found in the html.html.twig template in this directory. + * + * Available variables: + * + * General utility variables: + * - base_path: The base URL path of the Drupal installation. Will usually be + * "/" unless you have installed Drupal in a sub-directory. + * - is_front: A flag indicating if the current page is the front page. + * - logged_in: A flag indicating if the user is registered and signed in. + * - is_admin: A flag indicating if the user has permission to access + * administration pages. + * + * Site identity: + * - front_page: The URL of the front page. Use this instead of base_path when + * linking to the front page. This includes the language domain or prefix. + * + * Page content (in order of occurrence in the default page.html.twig): + * - node: Fully loaded node, if there is an automatically-loaded node + * associated with the page and the node ID is the second argument in the + * page's path (e.g. node/12345 and node/12345/revisions, but not + * comment/reply/12345). + * + * Regions: + * - page.header: Items for the header region. + * - page.primary_menu: Items for the primary menu region. + * - page.secondary_menu: Items for the secondary menu region. + * - page.highlighted: Items for the highlighted content region. + * - page.help: Dynamic help text, mostly for admin pages. + * - page.content: The main content of the current page. + * - page.sidebar_first: Items for the first sidebar. + * - page.sidebar_second: Items for the second sidebar. + * - page.footer: Items for the footer region. + * - page.breadcrumb: Items for the breadcrumb region. + * + * @see template_preprocess_page() + * @see html.html.twig + */ +#} +
+ +
+ {{ page.header }} +
+ + {{ page.primary_menu }} + {{ page.secondary_menu }} + + {{ page.breadcrumb }} + + {{ page.highlighted }} + + {{ page.help }} + +
+ {# link is in html.html.twig #} + +
+ {{ page.content }} +
{# /.layout-content #} + + {% if page.sidebar_first %} + + {% endif %} + + {% if page.sidebar_second %} + + {% endif %} + +
+ + {% if page.footer %} +
+ {{ page.footer }} +
+ {% endif %} + +
{# /.layout-container #} diff --git a/.config/nvim/colors/falcon/corpus/xml.xml b/.config/nvim/colors/falcon/corpus/xml.xml new file mode 100755 index 0000000..4cff2ae --- /dev/null +++ b/.config/nvim/colors/falcon/corpus/xml.xml @@ -0,0 +1,24 @@ + + + + + ./tests/Behat/Gherkin/ + + + + + + ./src/Behat/Gherkin/ + + + diff --git a/.config/nvim/colors/falcon/estilo.yml b/.config/nvim/colors/falcon/estilo.yml new file mode 100755 index 0000000..38c91e1 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo.yml @@ -0,0 +1,18 @@ +name: 'Falcon' +version: '0.0.8' +license: 'MIT' +author: 'Michael Welford' +url: 'https://github.com/fenetikm/falcon' +description: 'A dark, easy on the eyes, fiery gray bluish kinda colour scheme' +colorschemes: + - name: falcon + background: dark + palette: falcon +lightline: + - name: falcon + palette: falcon + style: falcon +airline: + - name: falcon + palette: falcon + style: falcon diff --git a/.config/nvim/colors/falcon/estilo/addons/nvim-term.yml b/.config/nvim/colors/falcon/estilo/addons/nvim-term.yml new file mode 100755 index 0000000..ebbf21e --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/addons/nvim-term.yml @@ -0,0 +1,18 @@ +color_foreground: 'normal_gray' +color_background: 'bg' +color_0: 'black' +color_1: 'red' +color_2: 'green' +color_3: 'yellow' +color_4: 'purple' +color_5: 'orange' +color_6: 'cyan' +color_7: 'normal_gray' +color_8: 'bg' +color_9: 'bright_red' +color_10: 'bright_green' +color_11: 'bright_yellow' +color_12: 'blue_gray' +color_13: 'bright_orange' +color_14: 'bright_cyan' +color_15: 'white' diff --git a/.config/nvim/colors/falcon/estilo/addons/term.yml b/.config/nvim/colors/falcon/estilo/addons/term.yml new file mode 100755 index 0000000..4bc85c8 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/addons/term.yml @@ -0,0 +1,16 @@ +0: 'black' +1: 'red' +2: 'green' +3: 'yellow' +4: 'purple' +5: 'orange' +6: 'cyan' +7: 'normal_gray' +8: 'bg' +9: 'bright_red' +10: 'bright_green' +11: 'bright_yellow' +12: 'blue_gray' +13: 'bright_orange' +14: 'bright_cyan' +15: 'white' diff --git a/.config/nvim/colors/falcon/estilo/airline/falcon.yml b/.config/nvim/colors/falcon/estilo/airline/falcon.yml new file mode 100755 index 0000000..9c197a4 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/airline/falcon.yml @@ -0,0 +1,18 @@ +normal1: 'black normal_gray' +normal2: 'normal_gray dark_gray' +normal3: 'mid_gray status' +inactive1: 'mid_dark_gray inactive_status' +inactive2: 'mid_dark_gray inactive_status' +inactive3: 'mid_dark_gray inactive_status' +insert1: 'black red' +insert2: 'normal_gray dark_gray' +insert3: 'normal_gray status' +replace1: 'black orange' +replace2: 'normal_gray dark_gray' +replace3: 'normal_gray status' +visual1: 'black yellow' +visual2: 'normal_gray dark_gray' +visual3: 'normal_gray status' +ctrlp1: 'mid_gray dark_gray' +ctrlp2: 'mid_gray dark_gray' +ctrlp3: 'mid_gray dark_gray' diff --git a/.config/nvim/colors/falcon/estilo/lightline/falcon.yml b/.config/nvim/colors/falcon/estilo/lightline/falcon.yml new file mode 100755 index 0000000..260173a --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/lightline/falcon.yml @@ -0,0 +1,30 @@ +normal1: 'black normal_gray' +normal2: 'normal_gray status' +normal3: 'mid_gray dark_gray' +normal4: 'light_gray mid_gray' +normal5: 'black normal_gray' +normalError: 'black red' +inactive1: 'mid_gray dark_gray' +inactive2: 'mid_gray dark_gray' +inactive3: 'mid_gray dark_gray' +inactive4: 'mid_gray dark_gray' +inactive5: 'mid_gray dark_gray' +insert1: 'black red' +insert2: 'normal_gray mid_gray' +insert3: 'normal_gray mid_gray' +insert4: 'normal_gray mid_gray' +insert5: 'black red' +replace1: 'black orange' +replace2: 'normal_gray mid_gray' +replace3: 'normal_gray mid_gray' +replace4: 'normal_gray mid_gray' +replace5: 'black orange' +visual1: 'black yellow' +visual2: 'normal_gray mid_gray' +visual3: 'normal_gray mid_gray' +visual4: 'normal_gray mid_gray' +visual5: 'black yellow' +tablineLeft: 'mid_gray dark_gray' +tablineSelected: 'light_gray dark_gray' +tablineMiddle: 'mid_gray dark_gray' +tablineRight: 'mid_gray dark_gray' diff --git a/.config/nvim/colors/falcon/estilo/palettes/falcon.yml b/.config/nvim/colors/falcon/estilo/palettes/falcon.yml new file mode 100755 index 0000000..937c96c --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/palettes/falcon.yml @@ -0,0 +1,48 @@ +red: '#FF3600' +mid_red: '#a82400' +orange: '#FF761A' +yellow: '#FFC552' +mid_yellow: '#c99c40' +green: '#718E3F' +light_blue_gray: '#C8D0E3' +blue_gray: '#99A4BC' +blue_mid_gray: '#4F4F59' +blue_dark_gray: '#2F2F3A' +blue_dark_gray_alt: '#242430' +blue_darkest_gray: '#171729' +dark_tan: '#a1968a' +tan: '#cfc1b2' +br_tan: '#f0e1ce' +tan_yellow: '#FFD392' +br_yellow: '#FFE8C0' +br_green: '#EAFFC0' +br_blue: '#BFDAFF' +white: '#F8F8FF' +light_gray: '#DFDFE5' +normal_gray: '#B4B4B9' +mid_gray_alt: '#878791' +mid_gray: '#787882' +mid_dark_gray: '#57575E' +dark_gray: '#36363A' +darker_gray: '#212127' +black: '#000004' +bg: '#020221' +bg_alt: '#0A0A29' +inactive_bg: '#151521' +purple_dark_gray: '#3F3A59' +purple: '#635196' +lavender: '#9F97CC' +status: '#28282D' +inactive_status: '#1C1C22' +off_red: '#300E03' +off_blue: '#031630' +off_green: '#203003' +dark_indigo: '#2D1078' +indigo: '#5521D9' +br_indigo: '#8859FF' +cyan: '#34bfa4' +bright_red: '#FF8E78' +bright_green: '#B1BF75' +bright_yellow: '#FFD392' +bright_orange: '#FFB07B' +bright_cyan: '#8BCCBF' diff --git a/.config/nvim/colors/falcon/estilo/syntax/ale.yml b/.config/nvim/colors/falcon/estilo/syntax/ale.yml new file mode 100755 index 0000000..231ab5a --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/ale.yml @@ -0,0 +1,3 @@ +ALEErrorSign: 'red -' +ALEWarningSign: 'orange -' +ALEInfoSign: 'normal_gray -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/aspvbs.yml b/.config/nvim/colors/falcon/estilo/syntax/aspvbs.yml new file mode 100755 index 0000000..34e70af --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/aspvbs.yml @@ -0,0 +1,2 @@ +AspVBSVariableSimple: '@Identifier' +AspVBSStatement: '@Keyword' diff --git a/.config/nvim/colors/falcon/estilo/syntax/base.yml b/.config/nvim/colors/falcon/estilo/syntax/base.yml new file mode 100755 index 0000000..99904cd --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/base.yml @@ -0,0 +1,85 @@ +# BASE UI +ColorColumn: '- inactive_bg' +Conceal: '- -' +Cursor: '- mid_gray' +CursorIM: '' +CursorColumn: '- blue_darkest_gray' +CursorLine: '- blue_dark_gray' +CursorLineNr: 'normal_gray blue_dark_gray' +Directory: 'blue_gray' +DiffAdd: '- off_green' +DiffChange: '- off_blue' +DiffDelete: '- off_red' +DiffText: '- off_green' +ErrorMsg: 'red -' +VertSplit: 'mid_gray -' +Folded: 'mid_gray darker_gray' +FoldColumn: 'mid_gray darker_gray' +SignColumn: 'blue_gray' +IncSearch: 'bg br_blue b' +LineNr: 'mid_dark_gray' +MatchParen: 'br_tan - b' +ModeMsg: '' +MoreMsg: '' +NonText: 'dark_gray bg' +Normal: 'normal_gray bg' +PMenu: 'mid_gray_alt blue_darkest_gray' +PMenuSel: 'black yellow' +PmenuSbar: 'normal_gray' +PmenuThumb: 'light_gray' +Question: 'light_gray' +Search: 'br_blue - bu' +SpecialKey: 'mid_gray' +SpellBad: '- purple_dark_gray u' +SpellLocal: '- purple_dark_gray u' +SpellCap: '- purple_dark_gray c' +SpellRare: '- purple_dark_gray u' +StatusLine: 'mid_gray status' +StatusLineNC: 'mid_gray dark_gray' +TabLine: 'mid_gray dark_gray' +TabLineFill: '- darker_gray' +TabLineSel: 'light_gray -' +Title: 'tan' +Visual: 'light_gray dark_indigo' +VisualNOS: '' +WarningMsg: '' +WildMenu: 'bg yellow' +# BASE SYNTAX +Comment: 'mid_gray - i' +Constant: 'normal_gray - b' +String: 'light_blue_gray' # Constant +Character: '@String' # Constant +Boolean: 'normal_gray - i' # Constant +Number: 'normal_gray' # Constant +Float: '@Number' # Constant +Identifier: 'blue_gray' +Function: 'yellow' # Identifier +Statement: 'blue_gray' +Conditional: 'yellow' # Statement +Repeat: '@Statement' # Statement +Label: '@Statement' # Statement +Operator: 'orange' # Statement +Keyword: 'yellow' # Statement +Exception: '@Statement' # Statement +PreProc: 'tan' +Include: '@PreProc' # PreProc +Define: '@PreProc' # PreProc +Macro: '@PreProc' # PreProc +PreCondit: '@PreProc' # PreProc +Type: 'light_gray -' +StorageClass: '@Type' # Type +Structure: '@Type' # Type +Typedef: '@Type' # Type +Special: 'orange' +SpecialChar: '@Special' # Special +Tag: '@Special' # Special +Delimiter: 'light_gray' # Special +SpecialComment: '@Special' # Special +Debug: '@Special' # Special +Underlined: 'blue_gray - u' +Ignore: '' +Error: '' +Todo: 'bg tan i' +QuickFixLine: 'br_blue dark_gray' +Bold: '- - b' +Italic: '- - i' diff --git a/.config/nvim/colors/falcon/estilo/syntax/blankline.yml b/.config/nvim/colors/falcon/estilo/syntax/blankline.yml new file mode 100755 index 0000000..dab6cbb --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/blankline.yml @@ -0,0 +1,3 @@ +IndentBlanklineChar: 'dark_gray -' +IndentBlanklineIndent1: 'dark_gray -' +IndentBlanklineIndent2: 'blue_mid_gray -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/buftabline.yml b/.config/nvim/colors/falcon/estilo/syntax/buftabline.yml new file mode 100755 index 0000000..a728018 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/buftabline.yml @@ -0,0 +1,4 @@ +BufTabLineCurrent: 'normal_gray mid_gray' +BufTabLineActive: 'light_gray dark_gray' +BufTabLineHidden: 'mid_gray dark_gray' +BufTabLineFill: '- darker_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/cleverf.yml b/.config/nvim/colors/falcon/estilo/syntax/cleverf.yml new file mode 100755 index 0000000..8e2bee6 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/cleverf.yml @@ -0,0 +1 @@ +CleverFDefaultLabel: 'br_blue - u' diff --git a/.config/nvim/colors/falcon/estilo/syntax/cpp.yml b/.config/nvim/colors/falcon/estilo/syntax/cpp.yml new file mode 100755 index 0000000..34916bd --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/cpp.yml @@ -0,0 +1,14 @@ +cPreCondit: 'br_blue' +cDefine: '@Define' +cStructure: 'blue_gray' +cStorageClass: '@StorageClass' +cType: '@Type' +cCustomParen: 'orange' +cConditional: 'yellow' +cCustomFunc: 'blue_gray' +cStatement: 'yellow' +cppSTLnamespace: 'light_blue_gray' +cppAccess: 'light_gray' +cAnsiFunction: 'tan' +cRepeat: 'yellow' +cSpecial: 'light_blue_gray - b' diff --git a/.config/nvim/colors/falcon/estilo/syntax/css.yml b/.config/nvim/colors/falcon/estilo/syntax/css.yml new file mode 100755 index 0000000..51f7d5e --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/css.yml @@ -0,0 +1,120 @@ +cssComment: '' # Comment +cssVendor: 'tan' # Comment +cssHacks: '' # Comment +cssTagName: 'blue_gray' # Statement +cssDeprecated: '' # Error +cssSelectorOp: '' # Special +cssSelectorOp2: 'yellow' # Special +cssAttrComma: 'normal_gray' # Special +cssAnimationProp: '' # cssProp +cssBackgroundProp: '' # cssProp +cssBorderProp: '' # cssProp +cssBoxProp: '' # cssProp +cssColorProp: '' # cssProp +cssContentForPagedMediaProp: '' # cssProp +cssDimensionProp: '' # cssProp +cssFlexibleBoxProp: '' # cssProp +cssFontProp: '' # cssProp +cssGeneratedContentProp: '' # cssProp +cssGridProp: '' # cssProp +cssHyerlinkProp: '' # cssProp +cssLineboxProp: '' # cssProp +cssListProp: '' # cssProp +cssMarqueeProp: '' # cssProp +cssMultiColumnProp: '' # cssProp +cssPagedMediaProp: '' # cssProp +cssPositioningProp: '' # cssProp +cssPrintProp: '' # cssProp +cssRubyProp: '' # cssProp +cssSpeechProp: '' # cssProp +cssTableProp: '' # cssProp +cssTextProp: '' # cssProp +cssTransformProp: '' # cssProp +cssTransitionProp: '' # cssProp +cssUIProp: '' # cssProp +cssIEUIProp: '' # cssProp +cssAuralProp: '' # cssProp +cssRenderProp: '' # cssProp +cssMobileTextProp: '' # cssProp +cssAnimationAttr: '' # cssAttr +cssBackgroundAttr: '' # cssAttr +cssBorderAttr: '' # cssAttr +cssBoxAttr: '' # cssAttr +cssContentForPagedMediaAttr: '' # cssAttr +cssDimensionAttr: '' # cssAttr +cssFlexibleBoxAttr: '' # cssAttr +cssFontAttr: '' # cssAttr +cssGeneratedContentAttr: '' # cssAttr +cssGridAttr: '' # cssAttr +cssHyerlinkAttr: '' # cssAttr +cssLineboxAttr: '' # cssAttr +cssListAttr: '' # cssAttr +cssMarginAttr: '' # cssAttr +cssMarqueeAttr: '' # cssAttr +cssMultiColumnAttr: '' # cssAttr +cssPaddingAttr: '' # cssAttr +cssPagedMediaAttr: '' # cssAttr +cssPositioningAttr: '' # cssAttr +cssGradientAttr: '' # cssAttr +cssPrintAttr: '' # cssAttr +cssRubyAttr: '' # cssAttr +cssSpeechAttr: '' # cssAttr +cssTableAttr: '' # cssAttr +cssTextAttr: '' # cssAttr +cssTransformAttr: '' # cssAttr +cssTransitionAttr: '' # cssAttr +cssUIAttr: '' # cssAttr +cssIEUIAttr: '' # cssAttr +cssAuralAttr: '' # cssAttr +cssRenderAttr: '' # cssAttr +cssCommonAttr: '' # cssAttr +cssPseudoClassId: '' # PreProc +cssPseudoClassLang: '' # Constant +cssValueLength: '' # Number +cssValueInteger: '' # Number +cssValueNumber: '' # Number +cssValueAngle: '' # Number +cssValueTime: '' # Number +cssValueFrequency: '' # Number +cssFunction: '@Function' # Constant +cssURL: '' # String +cssFunctionName: '' # Function +cssFunctionComma: '' # Function +cssColor: '' # Constant +cssIdentifier: 'normal_gray' # Function +cssInclude: 'normal_gray' # Include +cssIncludeKeyword: 'tan' # atKeyword +cssImportant: 'red - b' # Special +cssBraces: '@Delimiter' # Function +cssBraceError: '' # Error +cssError: '' # Error +cssUnicodeEscape: '' # Special +cssStringQQ: '' # String +cssStringQ: '' # String +cssAttributeSelector: 'normal_gray' # String +cssMedia: '' # atKeyword +cssMediaType: 'yellow - i' # Special +cssMediaComma: '' # Normal +cssMediaKeyword: 'yellow' # Statement +cssMediaProp: '' # cssProp +cssMediaAttr: '' # cssAttr +cssPage: '' # atKeyword +cssPagePseudo: '' # PreProc +cssPageMargin: '' # atKeyword +cssPageProp: '' # cssProp +cssKeyFrame: '' # atKeyword +cssKeyFrameSelector: '' # Constant +cssFontDescriptor: 'tan' # Special +cssFontDescriptorFunction: '' # Constant +cssFontDescriptorProp: '' # cssProp +cssFontDescriptorAttr: '' # cssAttr +cssUnicodeRange: '' # Constant +cssClassName: 'normal_gray' # Function +cssClassNameDot: 'yellow' # Function +cssProp: 'normal_gray' # StorageClass +cssAttr: 'light_gray' # Constant +cssUnitDecorators: '' # Number +cssNoise: 'light_gray' # Noise +atKeyword: '' # PreProc +cssPseudoClass: 'light_gray' +cssAtRuleLogical: 'orange' diff --git a/.config/nvim/colors/falcon/estilo/syntax/custom.yml b/.config/nvim/colors/falcon/estilo/syntax/custom.yml new file mode 100755 index 0000000..d040a7a --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/custom.yml @@ -0,0 +1,2 @@ +Done: 'green -' +Partial: 'yellow -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/diff.yml b/.config/nvim/colors/falcon/estilo/syntax/diff.yml new file mode 100755 index 0000000..895f847 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/diff.yml @@ -0,0 +1,7 @@ +# git commit messages +diffAdded: 'light_gray off_green' +diffRemoved: 'light_gray off_red' +diffFile: '@Title' +diffLine: 'light_blue_gray' +diffSubname: 'light_gray' +# vimdiff uses DiffAdd etc. in base.yml diff --git a/.config/nvim/colors/falcon/estilo/syntax/docker.yml b/.config/nvim/colors/falcon/estilo/syntax/docker.yml new file mode 100755 index 0000000..5a0580e --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/docker.yml @@ -0,0 +1 @@ +dockercomposeKeywords: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/elm.yml b/.config/nvim/colors/falcon/estilo/syntax/elm.yml new file mode 100755 index 0000000..4dead7d --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/elm.yml @@ -0,0 +1,4 @@ +elmTypeDef: '@Type' +elmType: 'light_gray' +elmTopLevelDecl: 'tan' +elmAlias: '@Identifier' diff --git a/.config/nvim/colors/falcon/estilo/syntax/fugitive.yml b/.config/nvim/colors/falcon/estilo/syntax/fugitive.yml new file mode 100755 index 0000000..4bc1bb5 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/fugitive.yml @@ -0,0 +1,14 @@ +FugitiveblameBoundary: '' # Keyword +FugitiveblameHash: '' # Identifier +FugitiveblameUncommitted: '' # Ignore +FugitiveblameTime: '' # PreProc +FugitiveblameLineNumber: '' # Number +FugitiveblameOriginalFile: '' # String +FugitiveblameOriginalLineNumber: '' # +FugitiveblameShort: '' # FugitiveblameDelimiter +FugitiveblameDelimiter: '' # Delimiter +FugitiveblameNotCommittedYet: '' # Comment +fugitiveSymbolicRef: 'blue_gray' +fugitiveHeader: 'yellow' +fugitiveHunk: 'normal_gray' +fugitiveModifier: 'orange' diff --git a/.config/nvim/colors/falcon/estilo/syntax/fzf.yml b/.config/nvim/colors/falcon/estilo/syntax/fzf.yml new file mode 100755 index 0000000..1d321ce --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/fzf.yml @@ -0,0 +1,3 @@ +fzf1: 'yellow dark_gray' +fzf2: 'orange dark_gray' +fzf3: 'orange dark_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/gitcommit.yml b/.config/nvim/colors/falcon/estilo/syntax/gitcommit.yml new file mode 100755 index 0000000..1afc818 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/gitcommit.yml @@ -0,0 +1,26 @@ +gitcommitSummary: 'normal_gray' # Keyword +gitcommitComment: '' # Comment +gitcommitUntracked: '' # gitcommitComment +gitcommitDiscarded: '' # gitcommitComment +gitcommitSelected: '' # gitcommitComment +gitcommitUnmerged: '' # gitcommitComment +gitcommitOnBranch: '' # Comment +gitcommitBranch: 'normal_gray' # Special +gitcommitNoBranch: '' # gitCommitBranch +gitcommitDiscardedType: 'blue_gray' # gitcommitType +gitcommitSelectedType: 'green' # gitcommitType +gitcommitUnmergedType: '' # gitcommitType +gitcommitType: '' # Type +gitcommitNoChanges: '' # gitcommitHeader +gitcommitHeader: '' # PreProc +gitcommitUntrackedFile: '' # gitcommitFile +gitcommitDiscardedFile: 'light_gray' # gitcommitFile +gitcommitSelectedFile: 'normal_gray' # gitcommitFile +gitcommitUnmergedFile: '' # gitcommitFile +gitcommitFile: '' # Constant +gitcommitDiscardedArrow: '' # gitcommitArrow +gitcommitSelectedArrow: '' # gitcommitArrow +gitcommitUnmergedArrow: '' # gitcommitArrow +gitcommitArrow: '' # gitcommitComment +gitcommitOverflow: '' # none +gitcommitBlank: '' # Error diff --git a/.config/nvim/colors/falcon/estilo/syntax/gitconfig.yml b/.config/nvim/colors/falcon/estilo/syntax/gitconfig.yml new file mode 100755 index 0000000..b0c23b5 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/gitconfig.yml @@ -0,0 +1,2 @@ +gitconfigSection: 'yellow' +gitconfigVariable: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/gitsigns.yml b/.config/nvim/colors/falcon/estilo/syntax/gitsigns.yml new file mode 100755 index 0000000..89ee290 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/gitsigns.yml @@ -0,0 +1,5 @@ +# GitGutter airblade/vim-gitgutter +GitSignsAdd: 'green -' +GitSignsChange: 'yellow -' +GitSignsDelete: 'red -' +GitSignsChangeDelete: 'orange -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/go.yml b/.config/nvim/colors/falcon/estilo/syntax/go.yml new file mode 100755 index 0000000..598a1cf --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/go.yml @@ -0,0 +1,37 @@ +goDirective: '' # Statement +goDeclaration: '' # Keyword +goDeclType: '' # Keyword +goStatement: '' # Statement +goConditional: '' # Conditional +goLabel: 'yellow' # Label +goRepeat: 'yellow' # Repeat +goType: '' # Type +goSignedInts: '' # Type +goUnsignedInts: '' # Type +goFloats: '' # Type +goComplexes: '' # Type +goBuiltins: 'yellow' # Keyword +goConstants: '' # Keyword +goComment: '' # Comment +goTodo: '' # Todo +goEscapeOctal: '' # goSpecialString +goEscapeC: '' # goSpecialString +goEscapeX: '' # goSpecialString +goEscapeU: '' # goSpecialString +goEscapeBigU: '' # goSpecialString +goSpecialString: '' # Special +goEscapeError: '' # Error +goString: '' # String +goRawString: '' # String +goCharacter: '' # Character +goDecimalInt: '' # Integer +goHexadecimalInt: '' # Integer +goOctalInt: '' # Integer +Integer: '' # Number +goFloat: '' # Float +goImaginary: '' # Number +goExtraType: '' # Type +goSpaceError: '' # Error +goVar: 'blue_gray' +goPackage: 'tan' +goImport: '@goPackage' diff --git a/.config/nvim/colors/falcon/estilo/syntax/graphql.yml b/.config/nvim/colors/falcon/estilo/syntax/graphql.yml new file mode 100755 index 0000000..5f538e6 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/graphql.yml @@ -0,0 +1,5 @@ +graphqlVariable: 'blue_gray' +graphqlStructure: 'tan' +graphqlName: 'normal_gray' +graphqlKeyword: 'yellow' +graphqlOperator: 'orange' diff --git a/.config/nvim/colors/falcon/estilo/syntax/help.yml b/.config/nvim/colors/falcon/estilo/syntax/help.yml new file mode 100755 index 0000000..f782544 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/help.yml @@ -0,0 +1,49 @@ +helpIgnore: '' # Ignore +helpHyperTextJump: 'blue_gray - u' # Identifier +helpBar: '' # Ignore +helpBacktick: '' # Ignore +helpStar: 'br_blue' # Ignore +helpHyperTextEntry: '' # String +helpHeadline: 'yellow' # Statement +helpHeader: '' # PreProc +helpSectionDelim: 'tan' # PreProc +helpVim: '' # Identifier +helpCommand: '' # Comment +helpExample: '' # Comment +helpOption: 'tan' # Type +helpSpecial: '' # Special +helpNote: '' # Todo +helpComment: '' # Comment +helpConstant: '' # Constant +helpString: '' # String +helpCharacter: '' # Character +helpNumber: '' # Number +helpBoolean: '' # Boolean +helpFloat: '' # Float +helpIdentifier: '' # Identifier +helpFunction: '' # Function +helpStatement: '' # Statement +helpConditional: '' # Conditional +helpRepeat: '' # Repeat +helpLabel: '' # Label +helpOperator: '' # Operator +helpKeyword: '' # Keyword +helpException: '' # Exception +helpPreProc: '' # PreProc +helpInclude: '' # Include +helpDefine: '' # Define +helpMacro: '' # Macro +helpPreCondit: '' # PreCondit +helpType: '' # Type +helpStorageClass: '' # StorageClass +helpStructure: '' # Structure +helpTypedef: '' # Typedef +helpSpecialChar: '' # SpecialChar +helpTag: '' # Tag +helpDelimiter: '' # Delimiter +helpSpecialComment: '' # SpecialComment +helpDebug: '' # Debug +helpUnderlined: '' # Underlined +helpError: '' # Error +helpTodo: '' # Todo +helpURL: '' # String diff --git a/.config/nvim/colors/falcon/estilo/syntax/highlightedyank.yml b/.config/nvim/colors/falcon/estilo/syntax/highlightedyank.yml new file mode 100755 index 0000000..e65e970 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/highlightedyank.yml @@ -0,0 +1 @@ +HighlightedyankRegion: 'white -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/html.yml b/.config/nvim/colors/falcon/estilo/syntax/html.yml new file mode 100755 index 0000000..fd75955 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/html.yml @@ -0,0 +1,44 @@ +htmlTag: 'normal_gray' # Function +htmlEndTag: '@Delimiter' # Identifier +htmlArg: 'blue_gray' # Type +htmlTagName: '@Number' # htmlStatement +htmlSpecialTagName: 'yellow' # Exception +htmlValue: '' # String +htmlH1: 'yellow' # Title +htmlH2: 'tan' # htmlH1 +htmlH3: 'tan' # htmlH2 +htmlH4: 'tan' # htmlH3 +htmlH5: 'tan' # htmlH4 +htmlH6: 'tan' # htmlH5 +htmlHead: '' # PreProc +htmlTitle: 'normal_gray - b' # Title +htmlBoldItalicUnderline: '' # htmlBoldUnderlineItalic +htmlUnderlineBold: '' # htmlBoldUnderline +htmlUnderlineItalicBold: '' # htmlBoldUnderlineItalic +htmlUnderlineBoldItalic: '' # htmlBoldUnderlineItalic +htmlItalicUnderline: '' # htmlUnderlineItalic +htmlItalicBold: '' # htmlBoldItalic +htmlItalicBoldUnderline: '' # htmlBoldUnderlineItalic +htmlItalicUnderlineBold: '' # htmlBoldUnderlineItalic +htmlLink: '' # Underlined +htmlLeadingSpace: '' # None +htmlPreStmt: '' # PreProc +htmlPreError: '' # Error +htmlPreProc: '' # PreProc +htmlPreAttr: '' # String +htmlPreProcAttrName: '' # PreProc +htmlPreProcAttrError: '' # Error +htmlSpecial: '' # Special +htmlSpecialChar: 'tan' # Special +htmlString: '' # String +htmlStatement: '' # Statement +htmlComment: '' # Comment +htmlCommentPart: '' # Comment +htmlCommentError: '' # htmlError +htmlTagError: '' # htmlError +htmlEvent: '' # javaScript +htmlError: '' # Error +javaScript: '' # Special +javaScriptExpression: '' # javaScript +htmlCssStyleComment: '' # Comment +htmlCssDefinition: '' # Special diff --git a/.config/nvim/colors/falcon/estilo/syntax/indent.yml b/.config/nvim/colors/falcon/estilo/syntax/indent.yml new file mode 100755 index 0000000..72de954 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/indent.yml @@ -0,0 +1,2 @@ +IndentGuidesOdd: '- dark_gray' +IndentGuidesEven: '- darker_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/java.yml b/.config/nvim/colors/falcon/estilo/syntax/java.yml new file mode 100755 index 0000000..369ee31 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/java.yml @@ -0,0 +1,2 @@ +javaRepeat: 'yellow' +javaStatement: '@javaRepeat' diff --git a/.config/nvim/colors/falcon/estilo/syntax/javascript.yml b/.config/nvim/colors/falcon/estilo/syntax/javascript.yml new file mode 100755 index 0000000..b7cd6d0 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/javascript.yml @@ -0,0 +1,75 @@ +javaScriptComment: '' # Comment +javaScriptLineComment: '' # Comment +javaScriptCommentTodo: '' # Todo +javaScriptSpecial: '' # Special +javaScriptStringS: '' # String +javaScriptStringD: '' # String +javaScriptCharacter: '' # Character +javaScriptSpecialCharacter: '' # javaScriptSpecial +javaScriptNumber: '' # javaScriptValue +javaScriptConditional: '' # Conditional +javaScriptRepeat: '' # Repeat +javaScriptBranch: '' # Conditional +javaScriptOperator: '' # Operator +javaScriptType: '' # Type +javaScriptStatement: '' # Statement +javaScriptFunction: '' # Function +javaScriptBraces: 'orange' # Function +javaScriptError: '' # Error +javaScriptParensError: '' # Error +javaScriptNull: 'normal_gray - i' # Keyword +javaScriptBoolean: '' # Boolean +javaScriptRegexpString: '' # String +javaScriptIdentifier: '' # Identifier +javaScriptLabel: '' # Label +javaScriptException: '' # Exception +javaScriptMessage: '' # Keyword +javaScriptGlobal: 'lavender - b' # Keyword +javaScriptMember: '' # Keyword +javaScriptDeprecated: '' # Exception +javaScriptReserved: '' # Keyword +javaScriptDebug: '' # Debug +javaScriptConstant: '' # Label +jsBrackets: '@Delimiter' +jsClassBraces: '@jsBrackets' +jsBraces: '@jsBrackets' +jsObjectBraces: '@jsBrackets' +jsParens: '@jsBrackets' +jsObjectKey: 'blue_gray' +jsFuncBraces: '@jsBrackets' +jsFuncParens: '@jsBrackets' +jsIfElseBraces: '@jsBrackets' +jsFuncArgs: 'blue_gray' +jsExtendsKeyword: 'yellow' +jsArrowFunction: '@Operator' +jsFunction: 'yellow' +jsRepeat: '@jsFunction' +jsReturn: 'yellow' +jsClassDefinition: 'normal_gray' +jsClassProperty: 'normal_gray' +jsClassKeyword: 'yellow' +jsClassFuncName: 'normal_gray' +jsFuncName: 'normal_gray' +jsNull: 'normal_gray - i' +jsStorageClass: '@StorageClass' +jsObjectSeparator: 'normal_gray' +jsObjectValue: 'blue_gray' +jsExportDefault: 'blue_gray' +jsRegexpCharClass: 'orange' +jsTemplateBraces: 'orange' +jsThis: 'blue_gray - b' +jsFuncCall: 'tan' +jsObjectProp: 'normal_gray' +jsConditional: 'yellow' +jsVariableDef: 'blue_gray' +jsFuncBlock: 'white' +jsTry: 'yellow' +jsCatch: '@jsTry' +jsTryCatchBraces: 'orange' +jsGlobalObjects: 'lavender - b' +jsParen: 'blue_gray' +jsParenCatch: '@jsParen' +jsParenIfElse: '@jsParen' +jsAsyncKeyword: 'tan' +jsForAwait: '@jsAsyncKeyword' +jsGlobalNodeObjects: 'tan' diff --git a/.config/nvim/colors/falcon/estilo/syntax/json.yml b/.config/nvim/colors/falcon/estilo/syntax/json.yml new file mode 100755 index 0000000..c7f79b0 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/json.yml @@ -0,0 +1,20 @@ +jsonPadding: '' # Operator +jsonString: '' # String +jsonTest: '' # Label +jsonEscape: '' # Special +jsonNumber: '' # Number +jsonBraces: '' # Delimiter +jsonNull: '' # Function +jsonBoolean: 'red' # Boolean +jsonKeyword: '' # Label +jsonNumError: '' # Error +jsonCommentError: '' # Error +jsonSemicolonError: '' # Error +jsonTrailingCommaError: '' # Error +jsonMissingCommaError: '' # Error +jsonStringSQError: '' # Error +jsonNoQuotesError: '' # Error +jsonTripleQuotesError: '' # Error +jsonQuote: '' # Quote +jsonNoise: '' # Noise +jsonKeywordMatch: '@Delimiter' diff --git a/.config/nvim/colors/falcon/estilo/syntax/jsx.yml b/.config/nvim/colors/falcon/estilo/syntax/jsx.yml new file mode 100755 index 0000000..b67c758 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/jsx.yml @@ -0,0 +1,4 @@ +xmlEqual: 'yellow' +xmlEndTag: 'yellow' +xmlTagN: 'blue_gray' +xmlTagName: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/lsp.yml b/.config/nvim/colors/falcon/estilo/syntax/lsp.yml new file mode 100755 index 0000000..60b610c --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/lsp.yml @@ -0,0 +1,15 @@ +LspDiagnosticsDefaultError: 'mid_red - ' +LspDiagnosticsDefaultWarning: 'mid_yellow -' +LspDiagnosticsDefaultInformation: 'mid_gray - ' +LspDiagnosticsDefaultHint: 'dark_tan -' +LspReferenceRead: '- - u' +LspReferenceText: '- - u' +LspReferenceWrite: '- - u' +LspDiagnosticsVirtualTextError: 'mid_red - i' +LspDiagnosticsVirtualTextWarning: 'mid_yellow - i' +LspDiagnosticsVirtualTextHint: 'dark_tan - i' +LspDiagnosticsVirtualTextInformation: 'mid_gray - i' +LspDiagnosticsUnderlineError: '- - c mid_red' +LspDiagnosticsUnderlineWarning: '- - c mid_yellow' +LspDiagnosticsUnderlineHint: '- - c dark_tan' +LspDiagnosticsUnderlineInformation: '- - c mid_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/lua.yml b/.config/nvim/colors/falcon/estilo/syntax/lua.yml new file mode 100755 index 0000000..f03ea78 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/lua.yml @@ -0,0 +1,12 @@ +luaFuncKeyword: 'yellow' +luaFuncTable: 'normal_gray' +luaFuncName: 'normal_gray' +luaFuncCall: 'normal_gray' +luaFuncArgName: 'blue_gray' +luaCond: 'yellow' +luaStatement: '@luaCond' +luaLocal: '@Constant' +luaFuncParens: '@Delimiter' +luaParens: '@luaFuncParens' +luaBraces: '@luaFuncParens' +luaDocTag: 'tan - i' diff --git a/.config/nvim/colors/falcon/estilo/syntax/markdown.yml b/.config/nvim/colors/falcon/estilo/syntax/markdown.yml new file mode 100755 index 0000000..d3d2db0 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/markdown.yml @@ -0,0 +1,53 @@ +markdownH1: '' # htmlH1 +markdownH2: '' # htmlH2 +markdownH3: '' # htmlH3 +markdownH4: '' # htmlH4 +markdownH5: '' # htmlH5 +markdownH6: '' # htmlH6 +markdownHeadingRule: '' # markdownRule +markdownHeadingDelimiter: '@Delimiter' # Delimiter +markdownItemDelimiter: '@Delimiter' +markdownInlineDelimiter: 'tan' +markdownOrderedListMarker: '@Delimiter' # markdownListMarker +markdownListMarker: '@Delimiter' # htmlTagName +markdownBlockquote: '' # Comment +markdownRule: '' # PreProc +markdownLinkText: '' # htmlLink +markdownLinkTextDelimiter: '@Delimiter' +markdownIdDeclaration: '' # Typedef +markdownId: '' # Type +markdownAutomaticLink: '' # markdownUrl +markdownUrl: 'blue_gray - u' # Float +markdownUrlTitle: '' # String +markdownIdDelimiter: '' # markdownLinkDelimiter +markdownUrlDelimiter: '' # htmlTag +markdownUrlTitleDelimiter: '' # Delimiter +markdownItalic: '' # htmlItalic +markdownBold: '' # htmlBold +markdownBoldItalic: '' # htmlBoldItalic +markdownCodeDelimiter: 'orange' # Delimiter +markdownCode: 'mid_gray_alt' +markdownEscape: '' # Special +markdownError: '@SpellBad' # Error +markdownXmlElement: 'mid_gray' + +htmlH1: 'br_blue - b' +htmlH2: 'br_blue -' +htmlH3: '@htmlH2' +htmlH4: '@htmlH2' +htmlH5: '@htmlH2' +htmlH6: '@htmlH2' +mkdLink: '@Underlined' +mkdURL: 'blue_gray - u' +mkdInlineURL: 'blue_gray - u' +mkdBold: '- - b' +htmlBold: '- - b' +mkdListItem: '@Delimiter' +htmlItalic: '- - i' +mkdCode: 'mid_gray_alt' +mkdCodeDelimiter: 'orange' +mkdHeading: '@Delimiter' + +# These are used when running Neovim health checks. +healthSuccess: 'bg green' +healthError: 'bg red' diff --git a/.config/nvim/colors/falcon/estilo/syntax/neovim.yml b/.config/nvim/colors/falcon/estilo/syntax/neovim.yml new file mode 100755 index 0000000..a3e3c60 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/neovim.yml @@ -0,0 +1,2 @@ +NormalFloat: '- blue_dark_gray' +NormalFloatAlt: '- blue_dark_gray_alt' diff --git a/.config/nvim/colors/falcon/estilo/syntax/nerdtree.yml b/.config/nvim/colors/falcon/estilo/syntax/nerdtree.yml new file mode 100755 index 0000000..414e51f --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/nerdtree.yml @@ -0,0 +1,27 @@ +NERDTreePart: '' # Special +NERDTreePartFile: '' # Type +NERDTreeExecFile: '' # Title +NERDTreeDirSlash: '' # Identifier +NERDTreeBookmarksHeader: '' # statement +NERDTreeBookmarksLeader: '' # ignore +NERDTreeBookmarkName: '' # Identifier +NERDTreeBookmark: '' # normal +NERDTreeHelp: '' # String +NERDTreeHelpKey: '' # Identifier +NERDTreeHelpCommand: '' # Identifier +NERDTreeHelpTitle: '' # Macro +NERDTreeToggleOn: '' # Question +NERDTreeToggleOff: '' # WarningMsg +NERDTreeLinkTarget: '' # Type +NERDTreeLinkFile: '' # Macro +NERDTreeLinkDir: '' # Macro +NERDTreeDir: '' # Directory +NERDTreeUp: '' # Directory +NERDTreeFile: '' # Normal +NERDTreeCWD: 'yellow' # Statement +NERDTreeOpenable: 'light_blue_gray' # Title +NERDTreeClosable: 'light_blue_gray' # Title +NERDTreeIgnore: '' # ignore +NERDTreeRO: '' # WarningMsg +NERDTreeFlags: 'light_blue_gray' # Number +NERDTreeGitStatusDirDirty: 'red' diff --git a/.config/nvim/colors/falcon/estilo/syntax/netrw.yml b/.config/nvim/colors/falcon/estilo/syntax/netrw.yml new file mode 100755 index 0000000..0d24bc7 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/netrw.yml @@ -0,0 +1 @@ +netrwClassify: 'normal_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/nvim-cmp.yml b/.config/nvim/colors/falcon/estilo/syntax/nvim-cmp.yml new file mode 100755 index 0000000..56d686c --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/nvim-cmp.yml @@ -0,0 +1,6 @@ +CmpItemAbbr: 'mid_gray_alt' +CmpItemAbbrDeprecated: 'tan' +CmpItemAbbrMatch: 'light_gray' +CmpItemAbbrMatchFuzzy: 'light_gray' +CmpItemKind: 'mid_gray' +CmpItemMenu: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/nvim-tree.yml b/.config/nvim/colors/falcon/estilo/syntax/nvim-tree.yml new file mode 100755 index 0000000..d7a20f5 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/nvim-tree.yml @@ -0,0 +1,34 @@ +NvimTreeSymlink: '' +NvimTreeFolderName: 'blue_gray' +NvimTreeRootFolder: 'light_blue_gray' +NvimTreeFolderIcon: 'light_blue_gray' +NvimTreeEmptyFolderName: 'blue_gray' +NvimTreeOpenedFolderName: 'light_gray' +NvimTreeOpenedFile: 'br_blue - u' +NvimTreeExecFile: '' +NvimTreeSpecialFile: '' +NvimTreeImageFile: '' +NvimTreeMarkdownFile: '' +NvimTreeIndentMarker: '' +NvimTreeLspDiagnostics: '' +NvimTreeLicenseIcon: '' +NvimTreeYamlIcon: '' +NvimTreeTomlIcon: '' +NvimTreeGitignoreIcon: '' +NvimTreeJsonIcon: '' +NvimTreeLuaIcon: '' +NvimTreePythonIcon: '' +NvimTreeShellIcon: '' +NvimTreeJavascriptIcon: '' +NvimTreeCIcon: '' +NvimTreeReactIcon: '' +NvimTreeHtmlIcon: '' +NvimTreeRustIcon: '' +NvimTreeVimIcon: '' +NvimTreeTypescriptIcon: '' +NvimTreeGitDirty: 'orange' +NvimTreeGitStaged: 'orange' +NvimTreeGitMerge: 'yellow' +NvimTreeGitRenamed: 'yellow' +NvimTreeGitNew: 'green' +NvimTreeGitDeleted: 'red' diff --git a/.config/nvim/colors/falcon/estilo/syntax/php.yml b/.config/nvim/colors/falcon/estilo/syntax/php.yml new file mode 100755 index 0000000..1024ffc --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/php.yml @@ -0,0 +1,63 @@ +phpConstant: '' # Constant +phpCoreConstant: '' # Constant +phpComment: '' # Comment +phpCommentTitle: 'mid_gray_alt - i' +phpDocTags: 'dark_tan - i' # PreProc +phpDocCustomTags: 'br_blue' # Type +phpDocNamespaceSeparator: '@Comment' +phpUseNamespaceSeparator: 'light_gray -' +phpException: '' # Exception +phpBoolean: '@Boolean' # Boolean +phpStorageClass: 'orange' # StorageClass +phpClasses: 'light_gray' +phpStaticClasses: 'normal_gray - b' +phpClassImplements: 'normal_gray - i' +phpClassExtends: '@phpClassImplements' +phpSCKeyword: '' # StorageClass +phpFCKeyword: '' # Define +phpStructure: 'blue_gray - b' # Structure +phpStringSingle: '' # String +phpStringDouble: '' # String +phpBacktick: '' # String +phpNumber: '' # Number +phpFloat: '' # Float +phpMethod: 'normal_gray' # Function +phpFunctions: 'tan' # Function +phpBaselib: '' # Function +phpRepeat: 'yellow' # Repeat +phpConditional: '' # Conditional +phpLabel: '' # Label +phpStatement: '' # Statement +phpKeyword: '@Keyword' # Statement +phpType: '@Type' # Type +phpInclude: '' # Include +phpDefine: '' # Define +phpBackslashSequences: '' # SpecialChar +phpBackslashDoubleQuote: '' # SpecialChar +phpBackslashSingleQuote: '' # SpecialChar +phpParent: '@Delimiter' # Delimiter +phpBrackets: '' # Delimiter +phpIdentifierConst: '' # Delimiter +phpParentError: '' # Error +phpOctalError: '' # Error +phpInterpSimpleError: '' # Error +phpInterpBogusDollarCurley: '' # Error +phpInterpDollarCurly1: '' # Error +phpInterpDollarCurly2: '' # Error +phpInterpSimpleBracketsInner: '' # String +phpInterpSimpleCurly: '' # Delimiter +phpInterpVarname: '' # Identifier +phpTodo: '' # Todo +phpDocTodo: '' # Todo +phpMemberSelector: 'light_gray' # Structure +phpIntVar: '' # Identifier +phpEnvVar: '' # Identifier +phpOperator: '@Operator' # Operator +phpVarSelector: 'light_gray' # Operator +phpRelation: '' # Operator +phpIdentifier: '@Identifier' # Identifier +phpIdentifierSimply: '' # Identifier +phpStringDelimiter: 'light_gray' +phpSuperglobals: 'lavender - b' +phpSpecialChar: 'blue_gray - b' +phpNullValue: '@Boolean' diff --git a/.config/nvim/colors/falcon/estilo/syntax/plug.yml b/.config/nvim/colors/falcon/estilo/syntax/plug.yml new file mode 100755 index 0000000..4391d0e --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/plug.yml @@ -0,0 +1,4 @@ +plugDeleted: 'red' +plugBracket: 'orange' +plug1: 'tan' +plug2: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/python.yml b/.config/nvim/colors/falcon/estilo/syntax/python.yml new file mode 100755 index 0000000..2eb1c86 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/python.yml @@ -0,0 +1,26 @@ +pythonStatement: 'yellow' # Statement +pythonConditional: '' # Conditional +pythonRepeat: 'yellow' # Repeat +pythonOperator: '' # Operator +pythonException: '' # Exception +pythonInclude: '' # Include +pythonDecorator: '' # Define +pythonFunction: 'normal_gray' # Function +pythonComment: '' # Comment +pythonTodo: '' # Todo +pythonString: '' # String +pythonRawString: '' # String +pythonQuotes: '' # String +pythonTripleQuotes: '' # pythonQuotes +pythonEscape: '' # Special +pythonNumber: '' # Number +pythonBuiltin: '' # Function +pythonExceptions: '' # Structure +pythonSpaceError: '' # Error +pythonDoctest: '' # Special +pythonDoctestValue: '' # Define +pythonExClass: 'tan' +pythonBuiltinObj: 'yellow' +pythonDot: 'orange' +pythonBuiltinFunc: 'tan' +pythonNone: '@Boolean' diff --git a/.config/nvim/colors/falcon/estilo/syntax/rst.yml b/.config/nvim/colors/falcon/estilo/syntax/rst.yml new file mode 100755 index 0000000..ef98327 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/rst.yml @@ -0,0 +1,5 @@ +rstSections: 'br_blue' +rstCodeBlock: 'mid_gray_alt' +rstDirective: 'orange' +rstHyperlinkTarget: 'blue_gray - u' +rstExDirective: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/ruby.yml b/.config/nvim/colors/falcon/estilo/syntax/ruby.yml new file mode 100755 index 0000000..f9e1bd5 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/ruby.yml @@ -0,0 +1,71 @@ +rubyClass: 'light_gray' # rubyDefine +rubyClassName: '@Normal' +rubyModule: 'light_gray' # rubyDefine +rubyModuleName: '@Normal' +rubyMethodExceptional: '' # rubyDefine +rubyDefine: 'yellow' # Define +rubyFunction: 'normal_gray' # Function +rubyConditional: '' # Conditional +rubyConditionalModifier: '' # rubyConditional +rubyExceptional: '' # rubyConditional +rubyRepeat: '' # Repeat +rubyRepeatModifier: '' # rubyRepeat +rubyOptionalDo: '' # rubyRepeat +rubyControl: 'yellow' # Statement +rubyInclude: '' # Include +rubyInteger: '' # Number +rubyASCIICode: '' # Character +rubyFloat: '' # Float +rubyBoolean: '' # Boolean +rubyException: '' # Exception +rubyIdentifier: '' # Identifier +rubyClassVariable: '' # rubyIdentifier +rubyConstant: 'light_blue_gray' # Type +rubyGlobalVariable: 'lavender - b' # rubyIdentifier +rubyBlockParameter: '' # rubyIdentifier +rubyInstanceVariable: '' # rubyIdentifier +rubyPredefinedIdentifier: '' # rubyIdentifier +rubyPredefinedConstant: '' # rubyPredefinedIdentifier +rubyPredefinedVariable: '' # rubyPredefinedIdentifier +rubySymbol: 'blue_gray' # Constant +rubyKeyword: '' # Keyword +rubyOperator: '' # Operator +rubyBeginEnd: '' # Statement +rubyAccess: '' # Statement +rubyAttribute: '' # Statement +rubyEval: '' # Statement +rubyPseudoVariable: '' # Constant +rubyComment: '' # Comment +rubyData: '' # Comment +rubyDataDirective: '' # Delimiter +rubyDocumentation: '' # Comment +rubyTodo: '' # Todo +rubyQuoteEscape: '' # rubyStringEscape +rubyStringEscape: '' # Special +rubyInterpolationDelimiter: '' # Delimiter +rubyNoInterpolation: '' # rubyString +rubySharpBang: '' # PreProc +rubyRegexpDelimiter: '' # rubyStringDelimiter +rubySymbolDelimiter: '' # rubyStringDelimiter +rubyStringDelimiter: '' # Delimiter +rubyHeredoc: '' # rubyString +rubyString: '' # String +rubyRegexpEscape: '' # rubyRegexpSpecial +rubyRegexpQuantifier: '' # rubyRegexpSpecial +rubyRegexpAnchor: '' # rubyRegexpSpecial +rubyRegexpDot: '' # rubyRegexpCharClass +rubyRegexpCharClass: '' # rubyRegexpSpecial +rubyRegexpSpecial: '' # Special +rubyRegexpComment: '' # Comment +rubyRegexp: '' # rubyString +rubyInvalidVariable: '' # Error +rubyError: '' # Error +rubySpaceError: '' # rubyError +rubyArrayDelimiter: '@Delimiter' +rubyBlockParameterList: 'blue_gray' +rubyCurlyBlockDelimiter: '@Delimiter' +rubyDoBlock: 'yellow' +rubyLocalVariableOrMethod: 'blue_gray' +rubyMethodBlock: 'tan' +rubyHeredocDelimiter: 'orange' +rubyCurlyBlock: 'orange' diff --git a/.config/nvim/colors/falcon/estilo/syntax/sh.yml b/.config/nvim/colors/falcon/estilo/syntax/sh.yml new file mode 100755 index 0000000..5f95162 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/sh.yml @@ -0,0 +1,127 @@ +shArithRegion: '' # shShellVariables +shAtExpr: '' # shSetList +shBeginHere: '' # shRedir +shCaseBar: '@Operator' # shConditional +shCaseCommandSub: '' # shCommandSub +shCaseDoubleQuote: '' # shDoubleQuote +shCaseIn: '' # shConditional +shQuote: '@Delimiter' # shOperator +shCaseSingleQuote: '' # shSingleQuote +shCaseStart: '' # shConditional +shCmdSubRegion: '' # shShellVariables +shColon: '' # shComment +shDerefOp: '' # shOperator +shDerefPOL: '' # shDerefOp +shDerefPPS: '' # shDerefOp +shDeref: '' # shShellVariables +shDerefDelim: '' # shOperator +shDerefSimple: '' # shDeref +shDerefSpecial: '' # shDeref +shDerefString: '' # shDoubleQuote +shDerefVar: '' # shDeref +shDoubleQuote: '' # shString +shEcho: '' # shString +shEchoDelim: '' # shOperator +shEchoQuote: '' # shString +shForPP: '' # shLoop +shEmbeddedEcho: '' # shString +shEscape: '' # shCommandSub +shExDoubleQuote: '' # shDoubleQuote +shExSingleQuote: '' # shSingleQuote +shFunction: 'normal_gray' # Function +shHereDoc: '' # shString +shHerePayload: '' # shHereDoc +shLoop: '@Function' # shStatement +shMoreSpecial: '' # shSpecial +shOption: '' # shCommandSub +shPattern: '' # shString +shParen: '' # shArithmetic +shPosnParm: '' # shShellVariables +shQuickComment: '' # shComment +shRange: '' # shOperator +shRedir: '' # shOperator +shSetListDelim: '' # shOperator +shSetOption: '' # shOption +shSingleQuote: '' # shString +shSource: '' # shOperator +shStringSpecial: '' # shSpecial +shSubShRegion: '' # shOperator +shTestOpr: '@Operator' # shConditional +shTestPattern: '' # shString +shTestDoubleQuote: '' # shString +shTestSingleQuote: '' # shString +shVariable: 'blue_gray' # shSetList +shWrapLineOperator: '' # shOperator +bashAdminStatement: '' # shStatement if exists("b:is_bash") +bashSpecialVariables: 'blue_gray' # shShellVariables if exists("b:is_bash") +bashStatement: '' # shStatement if exists("b:is_bash") +shFunctionParen: '' # Delimiter if exists("b:is_bash") +shFunctionDelim: '' # Delimiter if exists("b:is_bash") +kshSpecialVariables: '' # shShellVariables if exists("b:is_kornshell") +kshStatement: '' # shStatement if exists("b:is_kornshell") +shCaseError: '' # Error if !exists("g:sh_no_error") +shCondError: '' # Error if !exists("g:sh_no_error") +shCurlyError: '' # Error if !exists("g:sh_no_error") +shDerefError: '' # Error if !exists("g:sh_no_error") +shDerefOpError: '' # Error if !exists("g:sh_no_error") +shDerefWordError: '' # Error if !exists("g:sh_no_error") +shDoError: '' # Error if !exists("g:sh_no_error") +shEsacError: '' # Error if !exists("g:sh_no_error") +shIfError: '' # Error if !exists("g:sh_no_error") +shInError: '' # Error if !exists("g:sh_no_error") +shParenError: '' # Error if !exists("g:sh_no_error") +shTestError: '' # Error if !exists("g:sh_no_error") +shDTestError: '' # Error if exists("b:is_kornshell") +shArithmetic: '' # Special +shCharClass: '' # Identifier +shSnglCase: '@Delimiter' # Statement +shCommandSub: '' # Special +shComment: '' # Comment +shConditional: '' # Conditional +shCtrlSeq: '' # Special +shExprRegion: '' # Delimiter +shFunctionKey: '' # Function +shFunctionName: '' # Function +shNumber: '' # Number +shOperator: '' # Operator +shRepeat: '' # Repeat +shSetList: 'light_blue_gray' # Identifier +shShellVariables: '' # PreProc +shSpecial: '' # Special +shStatement: 'normal_gray' # Statement +shSet: '@shStatement' # Statement +shString: '' # String +shTodo: '' # Todo +shAlias: '' # Identifier +shHereDoc01: '' # shRedir +shHereDoc02: '' # shRedir +shHereDoc03: '' # shRedir +shHereDoc04: '' # shRedir +shHereDoc05: '' # shRedir +shHereDoc06: '' # shRedir +shHereDoc07: '' # shRedir +shHereDoc08: '' # shRedir +shHereDoc09: '' # shRedir +shHereDoc10: '' # shRedir +shHereDoc11: '' # shRedir +shHereDoc12: '' # shRedir +shHereDoc13: '' # shRedir +shHereDoc14: '' # shRedir +shHereDoc15: '' # shRedir +shHereDoc16: '' # shRedir +shHereDoc17: '' # shRedir +shHereDoc18: '' # shRedir +shHereDoc19: '' # shRedir +shHereDoc20: '' # shRedir +shHereDoc21: '' # shRedir +shHereDoc22: '' # shRedir +shHereDoc23: '' # shRedir +shHereDoc24: '' # shRedir +shHereDoc25: '' # shRedir +shHereDoc26: '' # shRedir +shHereDoc27: '' # shRedir +shHereDoc28: '' # shRedir +shHereDoc29: '' # shRedir +shHereDoc30: '' # shRedir +shHereDoc31: '' # shRedir +shHereDoc32: '' # shRedir diff --git a/.config/nvim/colors/falcon/estilo/syntax/sneak.yml b/.config/nvim/colors/falcon/estilo/syntax/sneak.yml new file mode 100755 index 0000000..41938db --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/sneak.yml @@ -0,0 +1,3 @@ +Sneak: 'white dark_indigo' +SneakLabel: 'white dark_indigo' +SneakScope: 'white -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/sql.yml b/.config/nvim/colors/falcon/estilo/syntax/sql.yml new file mode 100755 index 0000000..fe6ccf3 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/sql.yml @@ -0,0 +1,11 @@ +sqlStatement: '@Function' +sqlKeyword: 'tan' +sqlSpecial: '@Number' +sqlType: 'blue_gray' +sqlFunction: '@Title' +mysqlKeyword: '@sqlKeyword' +mysqlOperator: '@Operator' +mysqlFunction: '@sqlType' +mysqlStatement: '@sqlStatement' +mysqlType: '@sqlType' +Quote: '@Delimiter' diff --git a/.config/nvim/colors/falcon/estilo/syntax/sshconfig.yml b/.config/nvim/colors/falcon/estilo/syntax/sshconfig.yml new file mode 100755 index 0000000..f1e998b --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/sshconfig.yml @@ -0,0 +1,4 @@ +sshconfigKeyword: 'blue_gray' +sshconfigMatch: 'blue_gray' +sshconfigYesNo: 'red' +sshconfigLogLevel: 'tan' diff --git a/.config/nvim/colors/falcon/estilo/syntax/startify.yml b/.config/nvim/colors/falcon/estilo/syntax/startify.yml new file mode 100755 index 0000000..59e4303 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/startify.yml @@ -0,0 +1,6 @@ +StartifySlash: 'mid_gray' +StartifyPath: 'mid_gray' +StartifyHeader: 'indigo' +StartifyFile: 'normal_gray' +StartifySection: 'yellow' +StartifyNumber: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/tagbar.yml b/.config/nvim/colors/falcon/estilo/syntax/tagbar.yml new file mode 100755 index 0000000..1d6e442 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/tagbar.yml @@ -0,0 +1,12 @@ +TagbarComment: 'dark_gray -' +TagbarKind: 'blue_gray -' +TagbarNestedKind: 'blue_gray -' +TagbarScope: 'tan' +TagbarType: 'light_gray -' +TagbarSignature: 'normal_gray -' +TagbarPseudoID: 'normal_gray -' +TagbarFoldIcon: 'mid_gray -' +TagbarHighlight: 'normal_gray -' +TagbarVisibilityPublic: 'green -' +TagbarVisibilityProtected: 'orange -' +TagbarVisibilityPrivate: 'red -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/tmux.yml b/.config/nvim/colors/falcon/estilo/syntax/tmux.yml new file mode 100755 index 0000000..c36927c --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/tmux.yml @@ -0,0 +1,4 @@ +tmuxCmds: 'yellow' +tmuxOptsSet: 'blue_gray' +tmuxOptions: 'orange' +tmuxOptsSetw: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/treesitter.yml b/.config/nvim/colors/falcon/estilo/syntax/treesitter.yml new file mode 100755 index 0000000..3150807 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/treesitter.yml @@ -0,0 +1,11 @@ +TSKeyword: '@Keyword' +TSVariable: '@Identifier' +TSMethod: 'normal_gray' +TSVariableBuiltin: '@Type' +TSFunction: '@Keyword' +TSOperator: '@Operator' +TSConstructor: 'normal_gray - b' +TSException: '@Keyword' +TSConstant: '@Constant' +TSConstBuiltin: '@Boolean' +TSError: 'yellow' diff --git a/.config/nvim/colors/falcon/estilo/syntax/twig.yml b/.config/nvim/colors/falcon/estilo/syntax/twig.yml new file mode 100755 index 0000000..69c5c42 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/twig.yml @@ -0,0 +1,9 @@ +twigVarDelim: '@Delimiter' +twigTagDelim: '@Delimiter' +htmlEndTag: 'yellow' +twigString: 'light_gray' +twigOperator: 'orange' +twigTagBlock: 'yellow' +htmlLink: 'blue_gray' +twigVariable: '@Identifier' +twigFilter: 'tan' diff --git a/.config/nvim/colors/falcon/estilo/syntax/ultisnips.yml b/.config/nvim/colors/falcon/estilo/syntax/ultisnips.yml new file mode 100755 index 0000000..153d034 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/ultisnips.yml @@ -0,0 +1,7 @@ +snipSnippetHeaderKeyword: 'yellow' +snipSnippetFooterKeyword: '@snipSnippetHeaderKeyword' +snipTabStop: '@Identifier' +snipTabStopDefault: 'blue_gray - i' +snipMirror: '@snipTabStop' +snipSnippetTrigger: '@String' +snipSnippetDocContextString: '@Comment' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vdebug.yml b/.config/nvim/colors/falcon/estilo/syntax/vdebug.yml new file mode 100755 index 0000000..fda5330 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vdebug.yml @@ -0,0 +1,4 @@ +DbgBreakptLine: '- off_blue' +DbgBreakptSign: 'off_blue -' +DbgCurrentLine: '- off_red' +DbgCurrentSign: 'off_red -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vim-gitgutter.yml b/.config/nvim/colors/falcon/estilo/syntax/vim-gitgutter.yml new file mode 100755 index 0000000..ebf78ce --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vim-gitgutter.yml @@ -0,0 +1,5 @@ +# GitGutter airblade/vim-gitgutter +GitGutterAdd: 'green -' +GitGutterChange: 'yellow -' +GitGutterDelete: 'red -' +GitGutterChangeDelete: 'orange -' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vim-signature.yml b/.config/nvim/colors/falcon/estilo/syntax/vim-signature.yml new file mode 100755 index 0000000..a656b1d --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vim-signature.yml @@ -0,0 +1 @@ +SignatureMarkText: 'blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vim.yml b/.config/nvim/colors/falcon/estilo/syntax/vim.yml new file mode 100755 index 0000000..219699a --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vim.yml @@ -0,0 +1 @@ +Terminal: 'normal_gray bg' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vimagit.yml b/.config/nvim/colors/falcon/estilo/syntax/vimagit.yml new file mode 100755 index 0000000..50757bb --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vimagit.yml @@ -0,0 +1,3 @@ +titleEntry: 'yellow' +diffRemoved: '@DiffDelete' +diffAdded: '@DiffAdd' diff --git a/.config/nvim/colors/falcon/estilo/syntax/viml.yml b/.config/nvim/colors/falcon/estilo/syntax/viml.yml new file mode 100755 index 0000000..a96cf2a --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/viml.yml @@ -0,0 +1,19 @@ +vimCommentTitle: 'light_gray - i' +vimCommand: 'tan' +vimVar: 'blue_gray' +vimLet: 'yellow' +vimNotFunc: 'yellow' +vimIsCommand: 'yellow' +vimOperParen: '@Delimiter' +vimFuncVar: 'blue_gray - b' +vimFuncName: 'normal_gray' +vimAutoEvent: 'red' +vimMap: 'blue_gray' +vimGroup: 'blue_gray' +vimHiTerm: 'blue_gray' +vimSetSep: 'normal_gray' +vimHighlight: '@vimLet' +vimSetEqual: 'orange' +vimNotation: 'normal_gray' +vimMapLhs: 'tan' +vimMapRhs: 'light_blue_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vimwiki.yml b/.config/nvim/colors/falcon/estilo/syntax/vimwiki.yml new file mode 100755 index 0000000..1ca6569 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vimwiki.yml @@ -0,0 +1,17 @@ +VimwikiLink: '@Underlined' +VimwikiHeaderChar: '@Delimiter' +VimwikiHeader1: 'br_blue - b' +VimwikiHeader2: 'br_blue -' +VimwikiHeader3: '@VimwikiHeader2' +VimwikiHeader4: '@VimwikiHeader2' +VimwikiHeader5: '@VimwikiHeader2' +VimwikiHeader6: '@VimwikiHeader2' +VimwikiList: '@Delimiter' +# preformatted block, unfortunately not just the fence but all the code too +VimwikiPre: 'mid_gray_alt' +# inline +VimwikiCode: 'mid_gray_alt' +VimwikiCodeChar: 'orange' +VimwikiMarkers: 'tan' +VimwikiBold: '- - b' +VimwikiItalic: '- - i' diff --git a/.config/nvim/colors/falcon/estilo/syntax/vista.yml b/.config/nvim/colors/falcon/estilo/syntax/vista.yml new file mode 100755 index 0000000..0b43a45 --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/vista.yml @@ -0,0 +1,2 @@ +VistaTag: 'normal_gray -' +VistaPrefix: 'mid_dark_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/xml.yml b/.config/nvim/colors/falcon/estilo/syntax/xml.yml new file mode 100755 index 0000000..d7b86fb --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/xml.yml @@ -0,0 +1,6 @@ +xmlEndTag: 'blue_gray' +xmlEqual: '@Operator' +xmlTagName: 'light_blue_gray' +xmlAttrib: 'blue_gray' +xmlTag: 'normal_gray' +xmlProcessingDelim: 'orange' diff --git a/.config/nvim/colors/falcon/estilo/syntax/yaml.yml b/.config/nvim/colors/falcon/estilo/syntax/yaml.yml new file mode 100755 index 0000000..2e66d3b --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/yaml.yml @@ -0,0 +1,34 @@ +yamlTodo: '' # Todo +yamlComment: '' # Comment +yamlDocumentStart: '' # PreProc +yamlDocumentEnd: '' # PreProc +yamlDirectiveName: '' # Keyword +yamlTAGDirective: '' # yamlDirectiveName +yamlTagHandle: '' # String +yamlTagPrefix: '' # String +yamlYAMLDirective: '' # yamlDirectiveName +yamlReservedDirective: '' # Error +yamlYAMLVersion: '' # Number +yamlString: '' # String +yamlFlowString: '' # yamlString +yamlFlowStringDelimiter: 'normal_gray' # yamlString +yamlEscape: '' # SpecialChar +yamlSingleEscape: '' # SpecialChar +yamlBlockCollectionItemStart: 'orange' # Label +yamlBlockMappingKey: 'blue_gray' # Identifier +yamlBlockMappingMerge: '' # Special +yamlFlowMappingKey: 'normal_gray' # Identifier +yamlFlowMappingMerge: '' # Special +yamlMappingKeyStart: '' # Special +yamlFlowIndicator: '@Delimiter' # Special +yamlKeyValueDelimiter: '@Delimiter' # Special +yamlConstant: '' # Constant +yamlNull: 'normal_gray - i' # yamlConstant +yamlBool: '@Number' # yamlConstant +yamlAnchor: '' # Type +yamlAlias: '' # Type +yamlNodeTag: '' # Type +yamlInteger: '' # Number +yamlFloat: '' # Float +yamlTimestamp: '' # Number +yamlPlainScalar: 'normal_gray' diff --git a/.config/nvim/colors/falcon/estilo/syntax/zsh.yml b/.config/nvim/colors/falcon/estilo/syntax/zsh.yml new file mode 100755 index 0000000..f3cb3ff --- /dev/null +++ b/.config/nvim/colors/falcon/estilo/syntax/zsh.yml @@ -0,0 +1,9 @@ +zshCommands: 'yellow' +zshBrackets: '@Delimiter' +zshOptStart: 'orange' +zshVariableDef: 'blue_gray' +zshTypes: '@Type' +zshKeyword: '@Keyword' +zshStringDelimiter: '@Delimiter' +zshDelimiter: '@Delimiter' +zshParentheses: '@Delimiter' diff --git a/.config/nvim/colors/falcon/exa/EXA_COLORS b/.config/nvim/colors/falcon/exa/EXA_COLORS new file mode 100755 index 0000000..789554c --- /dev/null +++ b/.config/nvim/colors/falcon/exa/EXA_COLORS @@ -0,0 +1,20 @@ +# di directories +# ex executable files +# fi regular files +# ln symlinks +# ur,uw,ux user permissions +# gr,gw,gx group permissions +# tr,tw,tx others permissions +# sn the numbers of a file's size +# sb the units of a file's size +# uu user that is you +# un user that is someone else +# gu a group that you belong to +# gn a group you aren't a member of +# ga new file in Git +# gm a modified file in Git +# gd a deleted file in Git +# gv a renamed file in Git +# da a file's date +# xa is the special attribute +export EXA_COLORS="uu=38;5;249:un=38;5;241:gu=38;5;245:gn=38;5;241:da=38;5;245:sn=38;5;7:sb=38;5;7:ur=38;5;3;1:uw=38;5;5;1:ux=38;5;1;1:ue=38;5;1;1:gr=38;5;249:gw=38;5;249:gx=38;5;249:tr=38;5;249:tw=38;5;249:tx=38;5;249:fi=38;5;248:di=38;5;253:ex=38;5;1:xa=38;5;12:*.png=38;5;4:*.jpg=38;5;4:*.gif=38;5;4" diff --git a/.config/nvim/colors/falcon/iterm2/falcon.itermcolors b/.config/nvim/colors/falcon/iterm2/falcon.itermcolors new file mode 100755 index 0000000..2e9e51a --- /dev/null +++ b/.config/nvim/colors/falcon/iterm2/falcon.itermcolors @@ -0,0 +1,344 @@ + + + + + Ansi 0 Color + + Alpha Component + 1 + Blue Component + 0.015686275437474251 + Color Space + sRGB + Green Component + 0.0 + Red Component + 0.0 + + Ansi 1 Color + + Alpha Component + 1 + Blue Component + 0.0 + Color Space + sRGB + Green Component + 0.21176470816135406 + Red Component + 1 + + Ansi 10 Color + + Alpha Component + 1 + Blue Component + 0.45882353186607361 + Color Space + sRGB + Green Component + 0.74901962280273438 + Red Component + 0.69411766529083252 + + Ansi 11 Color + + Alpha Component + 1 + Blue Component + 0.57254904508590698 + Color Space + sRGB + Green Component + 0.82745099067687988 + Red Component + 1 + + Ansi 12 Color + + Alpha Component + 1 + Blue Component + 0.73725491762161255 + Color Space + sRGB + Green Component + 0.64313727617263794 + Red Component + 0.60000002384185791 + + Ansi 13 Color + + Alpha Component + 1 + Blue Component + 0.48235294222831726 + Color Space + sRGB + Green Component + 0.69019609689712524 + Red Component + 1 + + Ansi 14 Color + + Alpha Component + 1 + Blue Component + 0.74901962280273438 + Color Space + sRGB + Green Component + 0.80000001192092896 + Red Component + 0.5215686559677124 + + Ansi 15 Color + + Alpha Component + 1 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.97254902124404907 + Red Component + 0.97254902124404907 + + Ansi 2 Color + + Alpha Component + 1 + Blue Component + 0.24705882370471954 + Color Space + sRGB + Green Component + 0.55686277151107788 + Red Component + 0.44313725829124451 + + Ansi 3 Color + + Alpha Component + 1 + Blue Component + 0.32156863808631897 + Color Space + sRGB + Green Component + 0.77254903316497803 + Red Component + 1 + + Ansi 4 Color + + Alpha Component + 1 + Blue Component + 0.58823531866073608 + Color Space + sRGB + Green Component + 0.31764706969261169 + Red Component + 0.38823530077934265 + + Ansi 5 Color + + Alpha Component + 1 + Blue Component + 0.10196078568696976 + Color Space + sRGB + Green Component + 0.46274510025978088 + Red Component + 1 + + Ansi 6 Color + + Alpha Component + 1 + Blue Component + 0.64313727617263794 + Color Space + sRGB + Green Component + 0.74901962280273438 + Red Component + 0.20392157137393951 + + Ansi 7 Color + + Alpha Component + 1 + Blue Component + 0.72549021244049072 + Color Space + sRGB + Green Component + 0.70588237047195435 + Red Component + 0.70588237047195435 + + Ansi 8 Color + + Alpha Component + 1 + Blue Component + 0.12941177189350128 + Color Space + sRGB + Green Component + 0.0078431377187371254 + Red Component + 0.0078431377187371254 + + Ansi 9 Color + + Alpha Component + 1 + Blue Component + 0.47058823704719543 + Color Space + sRGB + Green Component + 0.55686277151107788 + Red Component + 1 + + Background Color + + Alpha Component + 1 + Blue Component + 0.12941177189350128 + Color Space + sRGB + Green Component + 0.0078431377187371254 + Red Component + 0.0078431377187371254 + + Badge Color + + Alpha Component + 0.5 + Blue Component + 0.054901950061321259 + Color Space + sRGB + Green Component + 0.36470580101013184 + Red Component + 0.83921569585800171 + + Bold Color + + Alpha Component + 1 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.97254902124404907 + Red Component + 0.97254902124404907 + + Cursor Color + + Alpha Component + 1 + Blue Component + 0.75294119119644165 + Color Space + sRGB + Green Component + 0.90980392694473267 + Red Component + 1 + + Cursor Guide Color + + Alpha Component + 1 + Blue Component + 0.21176469326019287 + Color Space + sRGB + Green Component + 0.21960783004760742 + Red Component + 0.23529419302940369 + + Cursor Text Color + + Alpha Component + 1 + Blue Component + 0.12941177189350128 + Color Space + sRGB + Green Component + 0.08235294371843338 + Red Component + 0.08235294371843338 + + Foreground Color + + Alpha Component + 1 + Blue Component + 0.72549021244049072 + Color Space + sRGB + Green Component + 0.70588237047195435 + Red Component + 0.70588237047195435 + + Link Color + + Alpha Component + 1 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.85490196943283081 + Red Component + 0.74901962280273438 + + Selected Text Color + + Alpha Component + 1 + Blue Component + 0.89803922176361084 + Color Space + sRGB + Green Component + 0.87450981140136719 + Red Component + 0.87450981140136719 + + Selection Color + + Alpha Component + 1 + Blue Component + 0.50980395078659058 + Color Space + sRGB + Green Component + 0.054901961237192154 + Red Component + 0.18431372940540314 + + + diff --git a/.config/nvim/colors/falcon/kitty/kitty.falcon.conf b/.config/nvim/colors/falcon/kitty/kitty.falcon.conf new file mode 100755 index 0000000..e56cacb --- /dev/null +++ b/.config/nvim/colors/falcon/kitty/kitty.falcon.conf @@ -0,0 +1,45 @@ +# falcon colour scheme + +cursor #ffe8c0 +cursor_text_color #151521 + +url_color #bfdaff + +foreground #b4b4b9 +background #020221 + +selection_foreground #dfdfe5 +selection_background #2d1078 + +#: black +color0 #000004 +color8 #020221 + +#: red +color1 #ff3600 +color9 #ff8e78 + +#: green +color2 #718e3f +color10 #b1bf75 + +#: yellow +color3 #ffc552 +color11 #ffd392 + +#: blue +color4 #635196 +color12 #99a4bc + +#: magenta +color5 #ff761a +color13 #ffb07b + +#: cyan +color6 #34bfa4 +color14 #85ccbf + +#: white +color7 #b4b4b9 +color15 #f8f8ff + diff --git a/.config/nvim/colors/falcon/lua/falcon.lua b/.config/nvim/colors/falcon/lua/falcon.lua new file mode 100755 index 0000000..b6188e2 --- /dev/null +++ b/.config/nvim/colors/falcon/lua/falcon.lua @@ -0,0 +1,26 @@ +vim.api.nvim_set_var('falcon.palette', { + red = '#ff3600', + orange = '#ff761a', + yellow = '#ffc552', + green = '#718e3f', + blue_gray = '#99a4bc', + purple = '#635196', + indigo = '#5521d9', + status = '#28282d', + status_2 = '#36363a', + inactive_status = '#1c1c22', + black = '#000004', + white = '#F8F8FF', + light_gray = '#dfdfe5', + normal_gray = '#b4b4b9', + mid_gray = '#787882', + mid_dark_gray = '#57575e', + dark_gray = '#36363a', + modified = '#c8d0e3', + branch = '#99a4bc', + method = '#a1968a', + path = '#787882', + info = '#a1968a', + error = '#a82400', + warning = '#c99c40' +}) diff --git a/.config/nvim/colors/falcon/mintty/.minttyrc b/.config/nvim/colors/falcon/mintty/.minttyrc new file mode 100755 index 0000000..3b31550 --- /dev/null +++ b/.config/nvim/colors/falcon/mintty/.minttyrc @@ -0,0 +1,20 @@ +ForegroundColour=180,180,185 +BackgroundColour=2,2,33 +CursorColour=255,232,192 + +Black=0,0,4 +Red=255,54,0 +Green=113,142,63 +Yellow=255,197,82 +Blue=99,81,150 +Magenta=255,118,26 +Cyan=52,181,164 +White=180,180,185 +BoldBlack=2,2,33 +BoldRed=255,142,120 +BoldGreen=177,191,177 +BoldYellow=255,211,146 +BoldBlue=153,164,188 +BoldMagenta=255,176,123 +BoldCyan=139,204,191 +BoldWhite=248,248,255 diff --git a/.config/nvim/colors/falcon/nix/.Xresources b/.config/nvim/colors/falcon/nix/.Xresources new file mode 100755 index 0000000..d085bc5 --- /dev/null +++ b/.config/nvim/colors/falcon/nix/.Xresources @@ -0,0 +1,18 @@ +*.foreground: #B4B4B9 +*.background: #020221 +*.color0: #000004 +*.color8: #020221 +*.color1: #FF3600 +*.color9: #FF8E78 +*.color2: #718E3F +*.color10: #B1BF75 +*.color3: #FFC552 +*.color11: #FFD392 +*.color4: #635196 +*.color12: #99A4BC +*.color5: #FF761A +*.color13: #FFB07B +*.color6: #34BFA4 +*.color14: #85CCBF +*.color7: #B4B4B9 +*.color15: #F8F8FF diff --git a/.config/nvim/colors/falcon/plugin/falcon.vim b/.config/nvim/colors/falcon/plugin/falcon.vim new file mode 100755 index 0000000..09552e8 --- /dev/null +++ b/.config/nvim/colors/falcon/plugin/falcon.vim @@ -0,0 +1,95 @@ +" Guard +if exists('g:colors_name') && g:colors_name != "falcon" + finish +endif + +if exists('g:loaded_falcon') + finish +endif +let g:loaded_falcon=1 + +" Required as colors will come from terminal without +if !exists('g:fzf_colors') + let g:fzf_colors= + \ { 'fg': ['fg', 'Comment'], + \ 'bg': ['bg', 'PMenu'], + \ 'hl': ['fg', 'Normal'], + \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], + \ 'bg+': ['bg', 'PMenu', 'PMenu'], + \ 'hl+': ['fg', 'Keyword'], + \ 'info': ['fg', 'PreProc'], + \ 'border': ['fg', 'Ignore'], + \ 'prompt': ['fg', 'Conditional'], + \ 'pointer': ['fg', 'Question'], + \ 'marker': ['fg', 'Directory'], + \ 'spinner': ['fg', 'Label'], + \ 'header': ['fg', 'Comment'] } +endif + +function s:HandleInactiveBackground() + " NeoVim has support for changing background colour depending on active or not + if !exists('g:falcon_inactive') + let g:falcon_inactive=0 + endif + + " Put in a background colour for gui + if !exists('g:falcon_background') + let g:falcon_background=1 + endif + + if !has("gui_running") || g:falcon_background == 0 + hi NonText guifg=#36363a ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + hi Normal guifg=#b4b4b9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + else + hi NonText guifg=#36363a ctermfg=237 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + hi Normal guifg=#b4b4b9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + endif + + if exists('+winhighlight') && g:falcon_inactive == 1 + hi ActiveWindow guibg=NONE + hi InactiveWindow guibg=#151521 + + "TODO normalfloat background settings to not use PMenu + set winhighlight=Normal:ActiveWindow,NormalNC:InactiveWindow + return + endif + + if g:falcon_background == 1 + hi ActiveWindow guibg=#020221 + hi InactiveWindow guibg=#151521 + else + hi ActiveWindow guibg=NONE + hi InactiveWindow guibg=NONE + endif +endfunction + +function s:SetColors() + " Guard + if !exists('g:colors_name') || !exists('g:loaded_falcon') + return + endif + + if g:colors_name != "falcon" + return + endif + + call s:HandleInactiveBackground() +endfunction + +" goyo support +function! s:GoyoEnter() + " add in background colour + hi NonText guifg=#36363a ctermfg=237 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + hi Normal guifg=#b4b4b9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + hi ActiveWindow guibg=#020221 + hi InactiveWindow guibg=#020221 +endfunction + +function! s:GoyoLeave() + call s:HandleInactiveBackground() +endfunction + +autocmd! User GoyoEnter nested call GoyoEnter() +autocmd! User GoyoLeave nested call GoyoLeave() + +autocmd VimEnter,ColorScheme * call s:SetColors() diff --git a/.config/nvim/colors/falcon/prism/prism-falcon.css b/.config/nvim/colors/falcon/prism/prism-falcon.css new file mode 100755 index 0000000..6a82894 --- /dev/null +++ b/.config/nvim/colors/falcon/prism/prism-falcon.css @@ -0,0 +1,71 @@ +.token.function { + color: #b4b4b9; +} + +.token.brackets { + color: #f8f8ff; +} + +.token.punctuation { + color: #f8f8ff; +} + +.token.variable, .token.function-variable, .token.this, .token.key, .token.builtin { + color: #99a4bc; +} + +.token.variable .dollar { + color: #b4b4b9; +} + +.token.string { + color: #dfdfe5; +} + +.token.comment { + color: #787882; + font-style: italic; +} + +.token.comment .doc-block { + color: #ddcfbf; +} + +.token.scope { + color: #b4b4b9; + font-weight: 700; +} + +.token.class-name { + color: #b4b4b9; +} + +.token.delimiter.important { + color: #dfdfe5; + font-weight: normal; +} + +.token.keyword.keyword-protected, .token.keyword.keyword-public, .token.keyword.keyword-private, .token.keyword.keyword-parent, .token.keyword.keyword-array, .token.keyword.keyword-NULL, .token.keyword.keyword-use, .token.keyword.keyword-namespace { + color: #ddcfbf; + font-weight: normal; +} + +.token.boolean, .token.php-boolean, .token.number { + color: #ff3600; +} + +.token.php-functions { + color: #ddcfbf; +} + +.token.property { + color: #b4b4b9; +} + +.token.operator { + color: #ff761a; +} + +.token.keyword { + color: #ffc552; +} diff --git a/.config/nvim/colors/falcon/prism/prism-falcon.php.js b/.config/nvim/colors/falcon/prism/prism-falcon.php.js new file mode 100755 index 0000000..0443de1 --- /dev/null +++ b/.config/nvim/colors/falcon/prism/prism-falcon.php.js @@ -0,0 +1,50 @@ +(function(Prism) { + + Prism.languages.php = Prism.languages.insertBefore('php', 'punctuation', { + 'brackets': { + pattern: /\(|\)|\{|\}|\[|\]/ + }, + 'operator': { + pattern: /\.|\&|\!|\=\=\>|\!\=\=|\=\=\=|\=|\?\?/ + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'package', { + 'variable': { + pattern: /\$+(?:\w+\b|(?={))/i, + inside: { + 'dollar': { + pattern: /\$/ + } + } + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'punctuation', { + 'member-selector': { + pattern: /\-\>|\:\:/g + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'keyword', { + 'php-functions': { + pattern: /method_exists|function_exists|array_reduce|array_map|array_filter|array_replace/ + }, + 'php-boolean': { + pattern: /FALSE|TRUE/ + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'package', { + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true, + inside: { + 'doc-block': { + pattern: /\@var|\@param|\{\@inheritdoc\}/ + } + } + } + }); + +})(Prism); diff --git a/.config/nvim/colors/falcon/ranger/falcon.py b/.config/nvim/colors/falcon/ranger/falcon.py new file mode 100755 index 0000000..ccf9cbb --- /dev/null +++ b/.config/nvim/colors/falcon/ranger/falcon.py @@ -0,0 +1,140 @@ +# Falcon ranger colorscheme. + +from __future__ import (absolute_import, division, print_function) + +from ranger.gui.colorscheme import ColorScheme +from ranger.gui.color import ( + cyan, magenta, red, white, default, + normal, bold, reverse, + default_colors, +) + +class Solarized(ColorScheme): + progress_bar_color = 3 + + def use(self, context): # pylint: disable=too-many-branches,too-many-statements + fg, bg, attr = default_colors + + if context.reset: + return default_colors + + elif context.in_browser: + fg = 7 + # selected means under cursor + if context.selected: + attr = reverse + fg = 15 + else: + attr = normal + if context.empty or context.error: + fg = 235 + bg = 160 + if context.border: + fg = default + if context.media: + if context.image: + fg = 5 + else: + fg = 5 + if context.container: + fg = 61 + if context.directory: + fg = 253 + elif context.executable and not \ + any((context.media, context.container, + context.fifo, context.socket)): + fg = 1 + attr |= bold + if context.socket: + fg = 136 + bg = 230 + attr |= bold + if context.fifo: + fg = 136 + bg = 230 + attr |= bold + if context.device: + fg = 244 + bg = 230 + attr |= bold + if context.link: + fg = 37 if context.good else 160 + attr |= bold + if context.bad: + bg = 235 + if context.tag_marker and not context.selected: + attr |= bold + if fg in (red, magenta): + fg = white + else: + fg = red + if not context.selected and (context.cut or context.copied): + fg = 234 + attr |= bold + if context.main_column: + if context.selected: + attr |= bold + if context.marked: + attr |= bold + bg = 3 + fg = 8 + if context.badinfo: + if attr & reverse: + bg = magenta + else: + fg = magenta + + if context.inactive_pane: + fg = 3 + + elif context.in_titlebar: + attr |= bold + if context.hostname: + fg = 16 if context.bad else 249 + if context.bad: + bg = 166 + elif context.directory: + fg = 253 + elif context.tab: + fg = 0 if context.good else 7 + bg = 5 if context.good else 237 + elif context.link: + fg = cyan + + elif context.in_statusbar: + if context.permissions: + if context.good: + fg = 3 + elif context.bad: + fg = 160 + bg = 235 + if context.marked: + attr |= bold | reverse + fg = 2 + bg = 15 + if context.message: + if context.bad: + attr |= bold + fg = 160 + bg = 235 + if context.loaded: + bg = self.progress_bar_color + + if context.text: + if context.highlight: + attr |= reverse + + if context.in_taskview: + if context.title: + fg = 93 + + if context.selected: + attr |= reverse + + if context.loaded: + if context.selected: + fg = self.progress_bar_color + else: + bg = self.progress_bar_color + + return fg, bg, attr diff --git a/.config/nvim/colors/falcon/slack/slack.txt b/.config/nvim/colors/falcon/slack/slack.txt new file mode 100755 index 0000000..2df38c1 --- /dev/null +++ b/.config/nvim/colors/falcon/slack/slack.txt @@ -0,0 +1 @@ +#151521,#4f4f59,#2f2f3a,#F8f8ff,#36363a,#b4b4b9,#99a4bc,#718e3f diff --git a/.config/nvim/colors/falcon/sublime/falcon.tmTheme b/.config/nvim/colors/falcon/sublime/falcon.tmTheme new file mode 100755 index 0000000..742690d --- /dev/null +++ b/.config/nvim/colors/falcon/sublime/falcon.tmTheme @@ -0,0 +1,2166 @@ + + + + + name + Falcon + semanticClass + falcon.dark + gutterSettings + + background + #020221 + divider + #020221 + foreground + #586E75 + selectionBackground + #073642 + selectionForeground + #586E75 + + settings + + + settings + + background + #020221 + caret + #ddcfbf + foreground + #b4b4b9 + invisibles + #073642 + lineHighlight + #073642 + selection + #ddcfbfb + + + + name + Comment + scope + comment + settings + + fontStyle + + foreground + #787882 + + + + name + String + scope + string + settings + + foreground + #dfdfe5 + + + + name + StringNumber + scope + string + settings + + foreground + #dfdfe5 + + + + name + Regexp + scope + string.regexp + settings + + foreground + #ff761a + + + + name + Number + scope + constant.numeric + settings + + foreground + #dfdfe5 + + + + name + Variable + scope + variable.language, variable.other + settings + + foreground + #99a4bc + + + + name + Keyword + scope + keyword + settings + + foreground + #ffc552 + + + + name + Storage + scope + storage + settings + + fontStyle + + foreground + #ff761a + + + + name + Class name + scope + entity.name.class, entity.name.type.class + settings + + foreground + #b4b4b9 + + + + name + Function name + scope + entity.name.function + settings + + foreground + #ddcfbf + + + + name + Variable start + scope + punctuation.definition.variable + settings + + foreground + #99a4bc + + + + name + Embedded code markers + scope + punctuation.section.embedded.begin, punctuation.section.embedded.end + settings + + foreground + #ff761a + + + + name + Built-in constant + scope + constant.language, meta.preprocessor + settings + + foreground + #dfdfe5 + + + + name + Support.construct + scope + support.function.construct, keyword.other.new + settings + + foreground + #ff3600 + + + + name + User-defined constant + scope + constant.character, constant.other + settings + + foreground + #dfdfe5 + + + + name + Inherited class + scope + entity.other.inherited-class + settings + + + + name + Function argument + scope + variable.parameter + settings + + + + name + Tag name + scope + entity.name.tag + settings + + fontStyle + bold + foreground + #99a4bc + + + + name + Tag start/end + scope + punctuation.definition.tag.html, punctuation.definition.tag.begin, punctuation.definition.tag.end + settings + + foreground + #dfdfe5 + + + + name + Tag attribute + scope + entity.other.attribute-name + settings + + foreground + #99a4bc + + + + name + Library function + scope + support.function + settings + + foreground + #ddcfbf + + + + name + Continuation + scope + punctuation.separator.continuation + settings + + foreground + #ff3600 + + + + name + Library constant + scope + support.constant + settings + + + + name + Library class/type + scope + support.type, support.class + settings + + foreground + #9f97cc + + + + name + Library Exception + scope + support.type.exception + settings + + foreground + #b24d36 + + + + name + Special + scope + keyword.other.special-method + settings + + foreground + #b24d36 + + + + name + Library variable + scope + support.other.variable + settings + + + + name + Invalid + scope + invalid + settings + + + + name + Quoted String + scope + string.quoted.double, string.quoted.single + settings + + foreground + #dfdfe5 + + + + name + Quotes + scope + punctuation.definition.string.begin, punctuation.definition.string.end + settings + + foreground + #b4b4b9 + + + + name + CSS: Property + scope + entity.name.tag.css, support.type.property-name.css, meta.property-name.css + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + CSS: @font-face + scope + source.css + settings + + foreground + #ddcfbf + + + + name + CSS: Selector + scope + meta.selector.css + settings + + fontStyle + + foreground + #ffc552 + + + + name + CSS: {} + scope + punctuation.section.property-list.css + settings + + foreground + #dfdfe5 + + + + name + CSS: Numeric Value + scope + meta.property-value.css constant.numeric.css, keyword.other.unit.css,constant.other.color.rgb-value.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS: Value + scope + meta.property-value.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS: !Important + scope + keyword.other.important.css + settings + + foreground + #ff3600 + + + + name + CSS: Standard Value + scope + support.constant.color + settings + + foreground + #dfdfe5 + + + + name + CSS: Tag + scope + entity.name.tag.css + settings + + foreground + #dfdfe5 + + + + name + CSS: : , + scope + punctuation.separator.key-value.css, punctuation.terminator.rule.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS .class + scope + entity.other.attribute-name.class.css + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + CSS :pseudo + scope + entity.other.attribute-name.pseudo-element.css, entity.other.attribute-name.pseudo-class.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS: #id + scope + entity.other.attribute-name.id.css + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + JS: Function Name + scope + meta.function.js, entity.name.function.js, support.function.dom.js + settings + + foreground + #ffc552 + + + + name + JS: Source + scope + text.html.basic source.js.embedded.html + settings + + fontStyle + + foreground + #ffc552 + + + + name + JS: Function + scope + storage.type.function.js + settings + + foreground + #ddcfbf + + + + name + JS: Numeric Constant + scope + constant.numeric.js + settings + + foreground + #dfdfe5 + + + + name + JS: [] + scope + meta.brace.square.js + settings + + foreground + #dfdfe5 + + + + name + JS: Storage Type + scope + storage.type.js + settings + + foreground + #dfdfe5 + + + + name + () + scope + meta.brace.round, punctuation.definition.parameters.begin.js, punctuation.definition.parameters.end.js + settings + + foreground + #dfdfe5 + + + + name + {} + scope + meta.brace.curly.js + settings + + foreground + #dfdfe5 + + + + name + HTML: Doctype + scope + entity.name.tag.doctype.html, meta.tag.sgml.html, string.quoted.double.doctype.identifiers-and-DTDs.html + settings + + fontStyle + italic + foreground + #787882 + + + + name + HTML: Comment Block + scope + comment.block.html + settings + + fontStyle + italic + foreground + #787882 + + + + name + HTML: Script + scope + entity.name.tag.script.html + settings + + fontStyle + italic + + + + name + HTML: Style + scope + source.css.embedded.html string.quoted.double.html + settings + + fontStyle + + foreground + #99a4bc + + + + name + HTML: Text + scope + text.html.ruby + settings + + fontStyle + bold + foreground + #dfdfe5 + + + + name + HTML: = + scope + text.html.basic meta.tag.other.html, text.html.basic meta.tag.any.html, text.html.basic meta.tag.block.any, text.html.basic meta.tag.inline.any, text.html.basic meta.tag.structure.any.html, text.html.basic source.js.embedded.html, punctuation.separator.key-value.html + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + HTML: something= + scope + text.html.basic entity.other.attribute-name.html + settings + + foreground + #99a4bc + + + + name + HTML: " + scope + text.html.basic meta.tag.structure.any.html punctuation.definition.string.begin.html, punctuation.definition.string.begin.html, punctuation.definition.string.end.html + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + HTML: <tag> + scope + entity.name.tag.block.any.html + settings + + fontStyle + bold + foreground + #dfdfe5 + + + + name + HTML: style + scope + source.css.embedded.html entity.name.tag.style.html + settings + + fontStyle + italic + + + + name + HTML: <style> + scope + entity.name.tag.style.html + settings + + fontStyle + + + + + name + HTML: {} + scope + text.html.basic punctuation.section.property-list.css + settings + + fontStyle + + + + + name + HTML: Embeddable + scope + source.css.embedded.html, comment.block.html + settings + + fontStyle + italic + foreground + #99a4bc + + + + name + Ruby: Variable definition + scope + punctuation.definition.variable.ruby + settings + + fontStyle + + foreground + #99a4bc + + + + name + Ruby: Function Name + scope + meta.function.method.with-arguments.ruby + settings + + foreground + #b4b4b9 + + + + name + Ruby: Variable + scope + variable.language.ruby + settings + + foreground + #99a4bc + + + + name + Ruby: Function + scope + entity.name.function.ruby + settings + + foreground + #b4b4b9 + + + + name + Ruby: Keyword Control + scope + keyword.control.ruby, keyword.control.def.ruby + settings + + fontStyle + bold + foreground + #ffc552 + + + + name + Ruby: Class + scope + keyword.control.class.ruby, meta.class.ruby + settings + + foreground + #b4b4b9 + + + + name + Ruby: Class Name + scope + entity.name.type.class.ruby + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + Ruby: Keyword + scope + keyword.control.ruby + settings + + fontStyle + + foreground + #ffc552 + + + + name + Ruby: Support Class + scope + support.class.ruby + settings + + fontStyle + + foreground + #ffc552 + + + + name + Ruby: Special Method + scope + keyword.other.special-method.ruby + settings + + foreground + #ff761a + + + + name + Ruby: Constant + scope + constant.language.ruby, constant.numeric.ruby + settings + + foreground + #dfdfe5 + + + + name + Ruby: Constant Other + scope + variable.other.constant.ruby + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + Ruby: :symbol + scope + constant.other.symbol.ruby + settings + + fontStyle + + foreground + #99a4bc + + + + name + Ruby: Punctuation Section '' + scope + punctuation.section.embedded.ruby, punctuation.definition.string.begin.ruby, punctuation.definition.string.end.ruby + settings + + foreground + #dc322f + + + + name + Ruby: Special Method + scope + keyword.other.special-method.ruby + settings + + foreground + #ff761a + + + + name + PHP: Include + scope + keyword.control.import.include.php + settings + + foreground + #ddcfbf + + + + name + Ruby: erb = + scope + text.html.ruby meta.tag.inline.any.html + settings + + fontStyle + + foreground + #839496 + + + + name + Ruby: erb "" + scope + text.html.ruby punctuation.definition.string.begin, text.html.ruby punctuation.definition.string.end + settings + + fontStyle + + foreground + #2aa198 + + + + name + PHP: Quoted Single + scope + punctuation.definition.string.begin, punctuation.definition.string.end + settings + + foreground + #839496 + + + + name + PHP: Class Names + scope + support.class.php + settings + + foreground + #839496 + + + + name + PHP: [] + scope + keyword.operator.index-start.php, keyword.operator.index-end.php + settings + + foreground + #dc322f + + + + name + PHP: Array + scope + meta.array.php + settings + + foreground + #586e75 + + + + name + PHP: Array() + scope + meta.array.php support.function.construct.php, meta.array.empty.php support.function.construct.php + settings + + fontStyle + + foreground + #b58900 + + + + name + PHP: Array Construct + scope + support.function.construct.php + settings + + foreground + #b58900 + + + + name + PHP: Array Begin + scope + punctuation.definition.array.begin, punctuation.definition.array.end + settings + + foreground + #dc322f + + + + name + PHP: Numeric Constant + scope + constant.numeric.php + settings + + foreground + #2aa198 + + + + name + PHP: New + scope + keyword.other.new.php + settings + + foreground + #CB4B16 + + + + name + PHP: :: + scope + keyword.operator.class + settings + + fontStyle + + foreground + #839496 + + + + name + PHP: Other Property + scope + variable.other.property.php + settings + + foreground + #93a1a1 + + + + name + PHP: Class + scope + storage.modifier.extends.php, storage.type.class.php, keyword.operator.class.php + settings + + foreground + #b58900 + + + + name + PHP: Class Function + settings + + + + name + PHP: Semicolon + scope + punctuation.terminator.expression.php + settings + + foreground + #839496 + + + + name + PHP: Inherited Class + scope + meta.other.inherited-class.php + settings + + fontStyle + + foreground + #586e75 + + + + name + PHP: Storage Type + scope + storage.type.php + settings + + foreground + #859900 + + + + name + PHP: Function + scope + entity.name.function.php + settings + + foreground + #93a1a1 + + + + name + PHP: Function Construct + scope + support.function.construct.php + settings + + foreground + #859900 + + + + name + PHP: Function Call + scope + entity.name.type.class.php, meta.function-call.php, meta.function-call.static.php, meta.function-call.object.php + settings + + foreground + #839496 + + + + name + PHP: Comment + scope + keyword.other.phpdoc + settings + + fontStyle + + foreground + #93a1a1 + + + + name + PHP: Source Emebedded + scope + source.php.embedded.block.html + settings + + foreground + #cb4b16 + + + + name + PHP: Storage Type Function + scope + storage.type.function.php + settings + + foreground + #cb4b16 + + + + name + C: constant + scope + constant.numeric.c + settings + + fontStyle + + foreground + #2aa198 + + + + name + C: Meta Preprocessor + scope + meta.preprocessor.c.include, meta.preprocessor.macro.c + settings + + fontStyle + + foreground + #cb4b16 + + + + name + C: Keyword + scope + keyword.control.import.define.c, keyword.control.import.include.c + settings + + fontStyle + + foreground + #cb4b16 + + + + name + C: Function Preprocessor + scope + entity.name.function.preprocessor.c + settings + + fontStyle + + foreground + #cb4b16 + + + + name + C: include <something.c> + scope + meta.preprocessor.c.include string.quoted.other.lt-gt.include.c, meta.preprocessor.c.include punctuation.definition.string.begin.c, meta.preprocessor.c.include punctuation.definition.string.end.c + settings + + fontStyle + + foreground + #2aa198 + + + + name + C: Function + scope + support.function.C99.c, support.function.any-method.c, entity.name.function.c + settings + + fontStyle + + foreground + #586e75 + + + + name + C: " + scope + punctuation.definition.string.begin.c, punctuation.definition.string.end.c + settings + + fontStyle + + foreground + #2aa198 + + + + name + C: Storage Type + scope + storage.type.c + settings + + fontStyle + + foreground + #b58900 + + + + name + diff: header + scope + meta.diff, meta.diff.header + settings + + background + #b58900 + fontStyle + italic + foreground + #E0EDDD + + + + name + diff: deleted + scope + markup.deleted + settings + + background + #eee8d5 + fontStyle + + foreground + #dc322f + + + + name + diff: changed + scope + markup.changed + settings + + background + #eee8d5 + fontStyle + + foreground + #cb4b16 + + + + name + diff: inserted + scope + markup.inserted + settings + + background + #eee8d5 + foreground + #219186 + + + + name + Markdown: Linebreak + scope + text.html.markdown meta.dummy.line-break + settings + + background + #b58900 + foreground + #E0EDDD + + + + name + Markdown: Raw + scope + text.html.markdown markup.raw.inline + settings + + foreground + #2aa198 + + + + name + reST raw + scope + text.restructuredtext markup.raw + settings + + foreground + #2aa198 + + + + name + Other: Removal + scope + other.package.exclude, other.remove + settings + + fontStyle + + foreground + #dc322f + + + + name + Other: Add + scope + other.add + settings + + foreground + #2aa198 + + + + name + Tex: {} + scope + punctuation.section.group.tex , punctuation.definition.arguments.begin.latex, punctuation.definition.arguments.end.latex, punctuation.definition.arguments.latex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: {text} + scope + meta.group.braces.tex + settings + + fontStyle + + foreground + #b58900 + + + + name + Tex: Other Math + scope + string.other.math.tex + settings + + fontStyle + + foreground + #b58900 + + + + name + Tex: {var} + scope + variable.parameter.function.latex + settings + + fontStyle + + foreground + #cb4b16 + + + + name + Tex: Math \\ + scope + punctuation.definition.constant.math.tex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: Constant Math + scope + text.tex.latex constant.other.math.tex, constant.other.general.math.tex, constant.other.general.math.tex, constant.character.math.tex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Tex: Other Math String + scope + string.other.math.tex + settings + + fontStyle + + foreground + #b58900 + + + + name + Tex: $ + scope + punctuation.definition.string.begin.tex, punctuation.definition.string.end.tex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: \label + scope + keyword.control.label.latex, text.tex.latex constant.other.general.math.tex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Tex: \label { } + scope + variable.parameter.definition.label.latex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: Function + scope + support.function.be.latex + settings + + fontStyle + + foreground + #859900 + + + + name + Tex: Support Function Section + scope + support.function.section.latex + settings + + fontStyle + + foreground + #cb4b16 + + + + name + Tex: Support Function + scope + support.function.general.tex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Tex: Comment + scope + punctuation.definition.comment.tex, comment.line.percentage.tex + settings + + fontStyle + italic + + + + name + Tex: Reference Label + scope + keyword.control.ref.latex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Python: docstring + scope + string.quoted.double.block.python + settings + + fontStyle + + foreground + #586e75 + + + + name + Python: storage + scope + storage.type.class.python, storage.type.function.python, storage.modifier.global.python + settings + + fontStyle + + foreground + #859900 + + + + name + Python: import + scope + keyword.control.import.python, keyword.control.import.from.python + settings + + foreground + #cb4b16 + + + + name + Python: Support.exception + scope + support.type.exception.python + settings + + foreground + #b58900 + + + + name + Shell: builtin + scope + support.function.builtin.shell + settings + + foreground + #859900 + + + + name + Shell: variable + scope + variable.other.normal.shell + settings + + foreground + #cb4b16 + + + + name + Shell: DOT_FILES + scope + source.shell + settings + + fontStyle + + foreground + #268BD2 + + + + name + Shell: meta scope in loop + scope + meta.scope.for-in-loop.shell, variable.other.loop.shell + settings + + fontStyle + + foreground + #586e75 + + + + name + Shell: "" + scope + punctuation.definition.string.end.shell, punctuation.definition.string.begin.shell + settings + + fontStyle + + foreground + #859900 + + + + name + Shell: Meta Block + scope + meta.scope.case-block.shell, meta.scope.case-body.shell + settings + + fontStyle + + foreground + #586e75 + + + + name + Shell: [] + scope + punctuation.definition.logical-expression.shell + settings + + fontStyle + + foreground + #dc322f + + + + name + Shell: Comment + scope + comment.line.number-sign.shell + settings + + fontStyle + italic + + + + name + Java: import + scope + keyword.other.import.java + settings + + fontStyle + + foreground + #cb4b16 + + + + name + Java: meta-import + scope + storage.modifier.import.java + settings + + fontStyle + + foreground + #586E75 + + + + name + Java: Class + scope + meta.class.java storage.modifier.java + settings + + fontStyle + + foreground + #b58900 + + + + name + Java: /* comment */ + scope + source.java comment.block + settings + + fontStyle + + foreground + #586e75 + + + + name + Java: /* @param */ + scope + comment.block meta.documentation.tag.param.javadoc keyword.other.documentation.param.javadoc + settings + + fontStyle + + foreground + #586e75 + + + + name + Perl: variables + scope + punctuation.definition.variable.perl, variable.other.readwrite.global.perl, variable.other.predefined.perl, keyword.operator.comparison.perl + settings + + foreground + #B58900 + + + + name + Perl: functions + scope + support.function.perl + settings + + foreground + #859900 + + + + name + Perl: comments + scope + comment.line.number-sign.perl + settings + + fontStyle + italic + foreground + #586E75 + + + + name + Perl: quotes + scope + punctuation.definition.string.begin.perl, punctuation.definition.string.end.perl + settings + + foreground + #2AA198 + + + + name + Perl: \char + scope + constant.character.escape.perl + settings + + foreground + #DC322F + + + + + name + Markdown: Headings + scope + markup.heading.markdown, markup.heading.1.markdown, markup.heading.2.markdown, markup.heading.3.markdown, markup.heading.4.markdown, markup.heading.5.markdown, markup.heading.6.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Bold + scope + markup.bold.markdown + settings + + fontStyle + bold + foreground + #b4b4b9 + + + + name + Markdown: Italic + scope + markup.italic.markdown + settings + + fontStyle + italic + foreground + #b4b4b9 + + + + name + Markdown: Punctuation for Bold, Italic, and Inline Block + scope + punctuation.definition.bold.markdown, punctuation.definition.italic.markdown, punctuation.definition.raw.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Bulleted List + scope + markup.list.unnumbered.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Numbered List + scope + markup.list.numbered.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Block and Inline Block + scope + markup.raw.block.markdown, markup.raw.inline.markdown + settings + + foreground + #b4b4b9 + + + + name + Markdown: Quote Block and Punctuation + scope + markup.quote.markdown, punctuation.definition.blockquote.markdown + settings + + foreground + #b4b4b9 + + + + name + Markdown: Seperator + scope + meta.separator.markdown + settings + + foreground + #ff761a + + + + name + Markdown: Link and Reference URL + scope + meta.image.inline.markdown, markup.underline.link.markdown + settings + + fontStyle + italic + foreground + #99a4bc + + + + name + Markdown: Link Title, Image Description + scope + string.other.link.title.markdown, string.other.link.description.markdown + settings + + foreground + #99a4bc + + + + name + Markdown: Angle Brakets on Link and Image + scope + punctuation.definition.link.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Parens on Link and Image + scope + punctuation.definition.metadata.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Square Brakets on Link, Image, and Reference + scope + punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown, punctuation.definition.constant.markdown + settings + + foreground + #dfdfe5 + + + + name + SublimeLinter Annotations + scope + sublimelinter.notes + settings + + background + #eee8d5 + foreground + #eee8d5 + + + + name + SublimeLinter Error Outline + scope + sublimelinter.outline.illegal + settings + + background + #93A1A1 + foreground + #93A1A1 + + + + name + SublimeLinter Error Underline + scope + sublimelinter.underline.illegal + settings + + background + #DC322F + + + + name + SublimeLinter Warning Outline + scope + sublimelinter.outline.warning + settings + + background + #839496 + foreground + #839496 + + + + name + SublimeLinter Warning Underline + scope + sublimelinter.underline.warning + settings + + background + #B58900 + + + + name + SublimeLinter Violation Outline + scope + sublimelinter.outline.violation + settings + + background + #657b83 + foreground + #657b83 + + + + name + SublimeLinter Violation Underline + scope + sublimelinter.underline.violation + settings + + background + #ff3600 + + + + + uuid + A4299D9C-1DE5-4BC4-87F6-A757E71B1597 + colorSpaceName + sRGB + + diff --git a/.config/nvim/colors/falcon/support/alfred.jpg b/.config/nvim/colors/falcon/support/alfred.jpg new file mode 100755 index 0000000..423e644 Binary files /dev/null and b/.config/nvim/colors/falcon/support/alfred.jpg differ diff --git a/.config/nvim/colors/falcon/support/alfred_alternate.jpg b/.config/nvim/colors/falcon/support/alfred_alternate.jpg new file mode 100755 index 0000000..ccc2596 Binary files /dev/null and b/.config/nvim/colors/falcon/support/alfred_alternate.jpg differ diff --git a/.config/nvim/colors/falcon/support/hero2.png b/.config/nvim/colors/falcon/support/hero2.png new file mode 100755 index 0000000..d25a05f Binary files /dev/null and b/.config/nvim/colors/falcon/support/hero2.png differ diff --git a/.config/nvim/colors/falcon/support/logo2.png b/.config/nvim/colors/falcon/support/logo2.png new file mode 100755 index 0000000..f16c162 Binary files /dev/null and b/.config/nvim/colors/falcon/support/logo2.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/c.png b/.config/nvim/colors/falcon/support/snaps/c.png new file mode 100755 index 0000000..52bf862 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/c.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/clojure.png b/.config/nvim/colors/falcon/support/snaps/clojure.png new file mode 100755 index 0000000..cf1a266 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/clojure.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/cpp.png b/.config/nvim/colors/falcon/support/snaps/cpp.png new file mode 100755 index 0000000..d4ee604 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/cpp.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/css.png b/.config/nvim/colors/falcon/support/snaps/css.png new file mode 100755 index 0000000..d931072 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/css.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/elm.png b/.config/nvim/colors/falcon/support/snaps/elm.png new file mode 100755 index 0000000..5e2102b Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/elm.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/exa.png b/.config/nvim/colors/falcon/support/snaps/exa.png new file mode 100755 index 0000000..64843e3 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/exa.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/gitr.png b/.config/nvim/colors/falcon/support/snaps/gitr.png new file mode 100755 index 0000000..32f8596 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/gitr.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/go.png b/.config/nvim/colors/falcon/support/snaps/go.png new file mode 100755 index 0000000..486a05c Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/go.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/js.png b/.config/nvim/colors/falcon/support/snaps/js.png new file mode 100755 index 0000000..f5d0261 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/js.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/json.png b/.config/nvim/colors/falcon/support/snaps/json.png new file mode 100755 index 0000000..0074974 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/json.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/lua.png b/.config/nvim/colors/falcon/support/snaps/lua.png new file mode 100755 index 0000000..a402839 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/lua.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/php.png b/.config/nvim/colors/falcon/support/snaps/php.png new file mode 100755 index 0000000..ab4bedd Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/php.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/python.png b/.config/nvim/colors/falcon/support/snaps/python.png new file mode 100755 index 0000000..479efbd Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/python.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/ruby.png b/.config/nvim/colors/falcon/support/snaps/ruby.png new file mode 100755 index 0000000..b1336c1 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/ruby.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/startup.png b/.config/nvim/colors/falcon/support/snaps/startup.png new file mode 100755 index 0000000..9c0f2fb Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/startup.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/twig.png b/.config/nvim/colors/falcon/support/snaps/twig.png new file mode 100755 index 0000000..fac1253 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/twig.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/vim.png b/.config/nvim/colors/falcon/support/snaps/vim.png new file mode 100755 index 0000000..5ef279d Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/vim.png differ diff --git a/.config/nvim/colors/falcon/support/snaps/zsh.png b/.config/nvim/colors/falcon/support/snaps/zsh.png new file mode 100755 index 0000000..f6fb076 Binary files /dev/null and b/.config/nvim/colors/falcon/support/snaps/zsh.png differ diff --git a/.config/nvim/colors/falcon/support/swatches_terminal.png b/.config/nvim/colors/falcon/support/swatches_terminal.png new file mode 100755 index 0000000..911dc1e Binary files /dev/null and b/.config/nvim/colors/falcon/support/swatches_terminal.png differ diff --git a/.config/nvim/colors/falcon/support/swatches_vim.png b/.config/nvim/colors/falcon/support/swatches_vim.png new file mode 100755 index 0000000..abcf6ac Binary files /dev/null and b/.config/nvim/colors/falcon/support/swatches_vim.png differ diff --git a/.config/nvim/colors/falcon/taskwarrior/falcon.theme b/.config/nvim/colors/falcon/taskwarrior/falcon.theme new file mode 100755 index 0000000..ce402ab --- /dev/null +++ b/.config/nvim/colors/falcon/taskwarrior/falcon.theme @@ -0,0 +1,99 @@ +################################################################################ +# +# Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. +# +# 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. +# +# http://www.opensource.org/licenses/mit-license.php +# +############################################################################### + +# Taskwarrior falcon theme. + +rule.precedence.color=deleted,completed,active,keyword.,tag.,project.,overdue,scheduled,due.today,due,blocked,blocking,recurring,tagged,uda. + +# General decoration +color.label= +color.label.sort= +color.alternate=on color0 +color.header=color15 +color.footnote=color195 +color.warning=color0 on color3 +color.error=color195 +color.debug=color249 + +# Task state +color.completed= +color.deleted= +color.active=bold color207 on color8 +color.recurring=color4 +color.scheduled= +color.until= +color.blocked=bold color253 on color235 +color.blocking=color253 on color237 + +# Project +color.project.none= + +# Priority +color.uda.priority.H=bold color3 +color.uda.priority.M=bold color5 +color.uda.priority.L=bold color4 + +# Tags +color.tag.next= +color.tag.none= +color.tagged=color110 + +# Due +color.due=color230 +color.due.today=color1 +color.overdue=bold color15 on color1 + +# Report: burndown +color.burndown.done=color0 on color2 +color.burndown.pending=color0 on color1 +color.burndown.started=color0 on color3 + +# Report: history +color.history.add=color0 on color1 +color.history.delete=color0 on color3 +color.history.done=color0 on color2 + +# Report: summary +color.summary.background=on color0 +color.summary.bar=color0 on color110 + +# Command: calendar +color.calendar.due=color0 on color230 +color.calendar.due.today=color0 on color1 +color.calendar.holiday=color0 on color3 +color.calendar.overdue=color0 on color5 +color.calendar.today=color0 on color207 +color.calendar.weekend=on color0 +color.calendar.weeknumber=color110 + +# Command: sync +color.sync.added=color110 +color.sync.changed=color9 +color.sync.rejected=color13 + +# Command: undo +color.undo.after=color2 +color.undo.before=color1 diff --git a/.config/nvim/colors/falcon/terminal/falcon.terminal b/.config/nvim/colors/falcon/terminal/falcon.terminal new file mode 100755 index 0000000..32e9ade --- /dev/null +++ b/.config/nvim/colors/falcon/terminal/falcon.terminal @@ -0,0 +1,1609 @@ + + + + + ANSIBlackColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEBMwIDAgMC4wMTU2 + ODYyNzQ1MSAxTxASMCAwIDAuMDE5MzYyNDQ5NjUAEAGAAoAG0xQVDRYXGFROU0lEVU5T + SUNDEAeAA4AF0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAH + zgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA + AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA + ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBk + bWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz + AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAE + PAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29t + cGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC + IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAA + AFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA + JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1 + bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4x + IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx + OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU + Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA + AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA + AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA + fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7 + AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB + qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE + Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YD + ogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw + BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG + jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha + CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoK + gQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZ + DPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oP + lg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE + EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V + 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlr + GZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd + cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGh + Ic4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3Jicm + VyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 + K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGww + pDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3 + NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8 + ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 + QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJ + qUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 + UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y + fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBX + YKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo + 7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV + cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7 + BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSA + hOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaO + zo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk + mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak + VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L + sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 + p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ + yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU + y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM + 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv + zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 + /kv+3P9t//+ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg + IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj + ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa + ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMAKIAtwC5ALsAvQDEAMkAzwDRANMA1QDaAOIN + Lg0wDTUNQA1JDVcNWw1iDWsNcA19DYANjQ2SDZoNnQ2vDbINtwAAAAAAAAIBAAAAAAAA + AC8AAAAAAAAAAAAAAAAAAA25 + + ANSIBlueColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjM4ODIzNTI5 + NDEgMC4zMTc2NDcwNTg4IDAuNTc2NDcwNTg4MiAxTxAnMC4zMTI1MjcyMDk1IDAuMjM1 + ODUxNDY2NyAwLjUwMzg0MTgxNzQAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightBlackColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECwwLjAwNzg0MzEz + NzI1NSAwLjAwNzg0MzEzNzI1NSAwLjEyNTQ5MDE5NjEgMU8QLDAuMDA5MjM2NzEwMTQ2 + IDAuMDAyMTM1NzE1NDQ3IDAuMDk0ODA4NDg5MDgAEAGAAoAG0xQVDRYXGFROU0lEVU5T + SUNDEAeAA4AF0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAH + zgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA + AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA + ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBk + bWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz + AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAE + PAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29t + cGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC + IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAA + AFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA + JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1 + bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4x + IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx + OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU + Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA + AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA + AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA + fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7 + AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB + qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE + Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YD + ogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw + BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG + jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha + CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoK + gQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZ + DPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oP + lg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE + EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V + 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlr + GZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd + cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGh + Ic4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3Jicm + VyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 + K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGww + pDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3 + NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8 + ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 + QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJ + qUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 + UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y + fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBX + YKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo + 7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV + cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7 + BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSA + hOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaO + zo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk + mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak + VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L + sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 + p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ + yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU + y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM + 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv + zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 + /kv+3P9t//+ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg + IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj + ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa + ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALsA6gDsAO4A8AD3APwBAgEEAQYBCAENARUN + YQ1jDWgNcw18DYoNjg2VDZ4Now2wDbMNwA3FDc0N0A3iDeUN6gAAAAAAAAIBAAAAAAAA + AC8AAAAAAAAAAAAAAAAAAA3s + + ANSIBrightBlueColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjYgMC42NDMx + MzcyNTQ5IDAuNzMzMzMzMzMzMyAxTxAmMC41MzA2MjE2NDc4IDAuNTczODM0Nzc2OSAw + LjY3NzY5MTEwMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXSGg0bHFdOUy5k + YXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZU + AAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl + c2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoA + AAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANM + AAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAA + DHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJp + Z2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJz + UkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAA + AAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAA + A5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAA + AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cu + aWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNl + IC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3Vy + IHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZl + cmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAs + UmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4A + AAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA + AAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgA + LQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACp + AK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB + OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHy + AfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC + 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQT + BCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF + hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcr + Bz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJ + JQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR + C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN + 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCb + ELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT + xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd + F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa + 7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7p + HxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj + ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN + KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwt + QS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKb + MtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4 + jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g + PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF + VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq + THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19T + qlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF + W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Nj + l2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/ + bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 + KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i + fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI + aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6 + kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed + ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhS + qMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660 + JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1 + wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM + tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls + 2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbn + H+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC + 9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE0h4fICFaJGNs + YXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFYTlNPYmplY3TS + Hh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlNDb2xvcqIpI18Q + D05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/AEUAUABdAGMA + cACFAIwArgDXANkA2wDdAOQA6QDvAPEA8wD1APoBAg1ODVANVQ1gDWkNdw17DYINiw2Q + DZ0NoA2tDbINug29Dc8N0g3XAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAAAAAAAAAADdk= + + ANSIBrightCyanColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjU0OTAxOTYw + NzggMC44IDAuNzQ5MDE5NjA3OCAxTxAnMC40ODQxNzc1Mjk4IDAuNzYyMjY4MDY2NCAw + LjY5NTg4ODUxOTMAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF0hoNGxxXTlMu + ZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNG + VAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNk + ZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFla + AAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD + TAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAA + AAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHly + aWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAAS + c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA + AAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUA + AAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3 + LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFj + ZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91 + ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVm + ZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA + LFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1ye + AAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo + AC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQA + qQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy + ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB + 8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLg + AusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYE + EwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 + BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH + Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQ + CSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkL + UQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3D + Dd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4Q + mxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOk + E8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoX + HRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrF + GuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e + 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4 + I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo + DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M + LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMy + mzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQ + OIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+ + oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUS + RVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JM + KkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf + U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVb + RVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GND + Y5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr + /2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTM + dSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+ + Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gE + iGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGS + epLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3 + nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+Co + UqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu + tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ + 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1 + zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ + bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW + 5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0 + wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+ABNIeHyAhWiRj + bGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRhWE5TT2JqZWN0 + 0h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05TQ29sb3KiKSNf + EA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcAPwBFAFAAXQBj + AHAAhQCMAK4A2ADaANwA3gDlAOoA8ADyAPQA9gD7AQMNTw1RDVYNYQ1qDXgNfA2DDYwN + kQ2eDaENrg2zDbsNvg3QDdMN2AAAAAAAAAIBAAAAAAAAAC8AAAAAAAAAAAAAAAAAAA3a + + ANSIBrightGreenColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjY5NDExNzY0 + NzEgMC43NDkwMTk2MDc4IDAuNDgyMzUyOTQxMiAxTxAnMC42MzU2Njk2NDg2IDAuNzA1 + NDY2NDQ5MyAwLjQwNzc5Nzg0MzIAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightMagentaColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC42OTAxOTYwNzg0IDAuNTAxOTYwNzg0MyAxTxAnMC45ODc0NzQ2MjAzIDAuNjI2 + MDc3MTE1NSAwLjQyODQ3NDYwNTEAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightRedColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC41NjA3ODQzMTM3IDAuNDgyMzUyOTQxMiAxTxAnMC45ODUwNDk2MDU0IDAuNDc2 + MTA3NDE4NSAwLjQwODQxODIzODIAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightWhiteColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0wLjk3MjU0OTAx + OTYgMC45NzI1NDkwMTk2IDEgMU8QJzAuOTY1Mzg2ODY3NSAwLjk2NDIzMzc1NjEgMC45 + OTk4ODA5MDk5ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + ANSIBrightYellowColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0xIDAuODI3NDUw + OTgwNCAwLjU5MjE1Njg2MjcgMU8QJzAuOTk1NTMyNjMxOSAwLjc5MTI1NjA3MDEgMC41 + MjI3ODYyNTk3ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + ANSICyanColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjIxOTYwNzg0 + MzEgMC43NDkwMTk2MDc4IDAuNjQ3MDU4ODIzNSAxTxAnMC4xOTM0MzMyNjk5IDAuNzA2 + ODY3ODczNyAwLjU4MDY4MjAzOTMAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIGreenColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjQ0MzEzNzI1 + NDkgMC41NTY4NjI3NDUxIDAuMjc0NTA5ODAzOSAxTxAnMC4zNzE0OTQ3NzAxIDAuNDky + NzgxOTA3MyAwLjIxMjg3MDY4NzIAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIMagentaColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC40NjY2NjY2NjY3IDAuMTgwMzkyMTU2OSAxTxAnMC45ODM4NzA1MDYzIDAuMzc4 + MTUyNzI4MSAwLjE0MDM5MTQ5ODgAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIRedColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC4yMjM1Mjk0MTE4IDAuMTAxOTYwNzg0MyAxTxAoMC45ODE2ODI0MTk4IDAuMTIy + ODEzMDYwOSAwLjA4NTc5NjAyODM4ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOA + BdIaDRscV05TLmRhdGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYA + MQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAg + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3By + dAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA + AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQA + AACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAk + dGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4 + dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRl + c2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2 + Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAA + AAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAA + ts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMg + aHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBj + b2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0 + IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MA + AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA + AAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD + 7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAA + AAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAP + ABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsA + kACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET + ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEB + yQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKs + ArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD + 0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUr + BToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG + 0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiq + CL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK + 3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1A + DVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQ + CRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMD + EyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkW + bBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoE + GioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHewe + Fh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJV + IoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3Jugn + GCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwF + LDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUox + gjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426Tck + N2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9 + YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA + RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1K + xEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1Hm + UjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ + uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2Gi + YfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFq + SGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMB + c11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8 + gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YO + hnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQ + bpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrV + m0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pamm + GqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFg + sdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9 + j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5 + yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW + 2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr + 5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx + //KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf// + gATSHh8gIVokY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0 + YVhOU09iamVjdNIeHyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldO + U0NvbG9yoikjXxAPTlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3 + AD8ARQBQAF0AYwBwAIUAjAC3AOIA5ADmAOgA7wD0APoA/AD+AQABBQENDVkNWw1gDWsN + dA2CDYYNjQ2WDZsNqA2rDbgNvQ3FDcgN2g3dDeIAAAAAAAACAQAAAAAAAAAvAAAAAAAA + AAAAAAAAAAAN5A== + + ANSIWhiteColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjcwNTg4MjM1 + MjkgMC43MDU4ODIzNTI5IDAuNzI1NDkwMTk2MSAxTxAmMC42NDY3MjkzNTAxIDAuNjQ1 + OTgzOTk0IDAuNjY5MDE2MDYzMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + ANSIYellowColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0xIDAuNzcyNTQ5 + MDE5NiAwLjM3MjU0OTAxOTYgMU8QJzAuOTk0MzQ4OTQzMiAwLjcyNzk1ODkxNzYgMC4z + MDMwNjMzOTI2ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECwwLjAwNzg0MzEz + NzI1NSAwLjAwNzg0MzEzNzI1NSAwLjEyNTQ5MDE5NjEgMU8QLDAuMDA5MjM2NzEwMTQ2 + IDAuMDAyMTM1NzE1NDQ3IDAuMDk0ODA4NDg5MDgAEAGAAoAG0xQVDRYXGFROU0lEVU5T + SUNDEAeAA4AF0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAH + zgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA + AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA + ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBk + bWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz + AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAE + PAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29t + cGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC + IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAA + AFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA + JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1 + bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4x + IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx + OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU + Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA + AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA + AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA + fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7 + AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB + qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE + Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YD + ogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw + BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG + jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha + CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoK + gQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZ + DPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oP + lg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE + EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V + 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlr + GZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd + cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGh + Ic4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3Jicm + VyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 + K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGww + pDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3 + NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8 + ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 + QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJ + qUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 + UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y + fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBX + YKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo + 7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV + cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7 + BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSA + hOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaO + zo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk + mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak + VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L + sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 + p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ + yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU + y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM + 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv + zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 + /kv+3P9t//+ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg + IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj + ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa + ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALsA6gDsAO4A8AD3APwBAgEEAQYBCAENARUN + YQ1jDWgNcw18DYoNjg2VDZ4Now2wDbMNwA3FDc0N0A3iDeUN6gAAAAAAAAIBAAAAAAAA + AC8AAAAAAAAAAAAAAAAAAA3s + + CursorColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0xIDAuOTA5ODAz + OTIxNiAwLjc2NDcwNTg4MjQgMU8QJzAuOTk3NjE2MDUyNiAwLjg5MDczOTY3OTMgMC43 + MTUxMzQ5MTg3ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + Font + + YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs + YXNzI0AsAAAAAAAAEBCAAoADXxAgRnVyYUNvZGVOZXJkRm9udENvbXBsZXRlLVJlZ3Vs + YXLSExQVFlokY2xhc3NuYW1lWCRjbGFzc2VzVk5TRm9udKIVF1hOU09iamVjdF8QD05T + S2V5ZWRBcmNoaXZlctEaG1Ryb290gAEIERojLTI3PEJLUltiaXJ0dniboKu0u77H2dzh + AAAAAAAAAQEAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAOM= + + ProfileCurrentVersion + 2.0499999999999998 + SelectionColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjg2NjY2NjY2 + NjcgMC44MTE3NjQ3MDU5IDAuNzUyOTQxMTc2NSAxTxAmMC44MzM2ODE1MjM4IDAuNzcw + MzczNTgyOCAwLjcwMTAwMjEyMQAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0wLjk3MjU0OTAx + OTYgMC45NzI1NDkwMTk2IDEgMU8QJzAuOTY1Mzg2ODY3NSAwLjk2NDIzMzc1NjEgMC45 + OTk4ODA5MDk5ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + TextColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjcwNTg4MjM1 + MjkgMC43MDU4ODIzNTI5IDAuNzI1NDkwMTk2MSAxTxAmMC42NDY3MjkzNTAxIDAuNjQ1 + OTgzOTk0IDAuNjY5MDE2MDYzMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + name + falcon + type + Window Settings + + diff --git a/.config/nvim/colors/falcon/timewarrior/falcon.theme b/.config/nvim/colors/falcon/timewarrior/falcon.theme new file mode 100755 index 0000000..6e827b4 --- /dev/null +++ b/.config/nvim/colors/falcon/timewarrior/falcon.theme @@ -0,0 +1,44 @@ +############################################################################### +# +# Copyright 2015 - 2016, Paul Beckingham, Federico Hernandez. +# +# 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. +# +# https://www.opensource.org/licenses/mit-license.php +# +############################################################################### + +define theme: + description = "falcon.theme" + colors: + # General UI color. + exclusion = "gray8 on gray4" + today = "color3" + holiday = "gray4" + label = "color249" + ids = "color12" + debug = "blue" + + # Rotating Color Palette for tags. The leading zeroes allow the order to be + # preserved. + palette: + color01 = "color7 on color3" + color02 = "color7 on color4" + color03 = "color7 on color5" + color04 = "color7 on color6" diff --git a/.config/nvim/colors/falcon/tmux/falcon.tmux.conf b/.config/nvim/colors/falcon/tmux/falcon.tmux.conf new file mode 100755 index 0000000..1c45cfd --- /dev/null +++ b/.config/nvim/colors/falcon/tmux/falcon.tmux.conf @@ -0,0 +1,36 @@ +# status +set -g status "on" +set -g status-style "bg=#020221,none,align=left" + +# messages +set -g message-style "fg=#b4b4b9,bg=#020221" +set -g message-command-style "fg=#99a4bc,bg=#020221" + +# panes +set -g pane-border-style "fg=#57575e,bg=#151521" +set -g pane-active-border-style "fg=#57575e,bg=#020221" + +# put a line above the status +set -g pane-border-status bottom +set -g pane-border-format '─' + +# selection +set -g mode-style "fg=#dfdfe5,bg=#2f0e82" + +# active / inactive pane bg +set -g window-style "bg=#151521" +set -g window-active-style "bg=#020221" + +# window status +setw -g window-status-style "fg=#b4b4b9,bg=black,none" +setw -g window-status-activity-style "fg=magenta,bg=#36363a,none" +setw -g window-status-separator "" +setw -g window-status-format "#[fg=#787882,bg=#020221] #I:#W " +setw -g window-status-current-format "#[fg=white,bg=#020221] #I#[fg=#787882]:#[fg=yellow]#{?window_zoomed_flag,#[fg=#c8d0e3](,}#W#{?window_zoomed_flag,#[fg=#c8d0e3]),} " + +set -g status-left-style "none" +set -g status-right-style "none" +set -g status-left-length "100" +set -g status-right-length "100" +set -g status-left "#[fg=white] #S #[fg=#57575e]│ " +set -g status-right "#[fg=yellow,bg=#36363a]$USER@#h #[fg=#787882]│ #[fg=white]%d/%m/%Y %H:%M " diff --git a/.config/nvim/colors/falcon/tmux/falcon.tmux.conf.pre-2.9 b/.config/nvim/colors/falcon/tmux/falcon.tmux.conf.pre-2.9 new file mode 100755 index 0000000..d92159f --- /dev/null +++ b/.config/nvim/colors/falcon/tmux/falcon.tmux.conf.pre-2.9 @@ -0,0 +1,46 @@ +# status +set -g status-justify "left" +set -g status "on" +set -g status-attr "none" +set -g status-bg "#020221" + +# messages +set -g message-fg "#b4b4b9" +set -g message-bg "#020221" +set -g message-command-fg "#99a4bc" +set -g message-command-bg "#020221" + +# panes +set -g pane-active-border-fg "#57575e" +set -g pane-active-border-bg "#020221" +set -g pane-border-fg "#57575e" +set -g pane-border-bg "#151521" + +# put a line above the status +set -g pane-border-status bottom +set -g pane-border-format '─' + +# selection +set -g mode-style "fg=#dfdfe5,bg=#2f0e82" + +# active / inactive pane bg +set -g window-style "bg=#151521" +set -g window-active-style "bg=#020221" + +# window status +setw -g window-status-fg "#b4b4b9" +setw -g window-status-attr "none" +setw -g window-status-activity-bg "#36363a" +setw -g window-status-activity-attr "none" +setw -g window-status-activity-fg "magenta" +setw -g window-status-separator "" +setw -g window-status-bg "black" +setw -g window-status-format "#[fg=#787882,bg=#020221] #I:#W " +setw -g window-status-current-format "#[fg=white,bg=#020221] #I#[fg=#787882]:#[fg=yellow]#{?window_zoomed_flag,#[fg=black](,}#W#{?window_zoomed_flag,#[fg=black]),} " + +set -g status-left-attr "none" +set -g status-left-length "100" +set -g status-right-attr "none" +set -g status-right-length "100" +set -g status-left "#[fg=white] #S #[fg=#57575e]│ " +set -g status-right "#[fg=yellow,bg=#36363a]$USER@#h #[fg=#787882]│ #[fg=white]%d/%m/%Y %H:%M " diff --git a/.config/nvim/colors/falcon/wallpapers/geometric_3840x1600.jpg b/.config/nvim/colors/falcon/wallpapers/geometric_3840x1600.jpg new file mode 100755 index 0000000..da6bfa7 Binary files /dev/null and b/.config/nvim/colors/falcon/wallpapers/geometric_3840x1600.jpg differ diff --git a/.config/nvim/colors/falcon/wallpapers/hex2_3840x1600.jpg b/.config/nvim/colors/falcon/wallpapers/hex2_3840x1600.jpg new file mode 100755 index 0000000..bc4cf6a Binary files /dev/null and b/.config/nvim/colors/falcon/wallpapers/hex2_3840x1600.jpg differ diff --git a/.config/nvim/colors/falcon/wallpapers/hex3_3840x1600.jpg b/.config/nvim/colors/falcon/wallpapers/hex3_3840x1600.jpg new file mode 100755 index 0000000..ac6b7ce Binary files /dev/null and b/.config/nvim/colors/falcon/wallpapers/hex3_3840x1600.jpg differ diff --git a/.config/nvim/colors/falcon/wallpapers/hex_3840x1600.jpg b/.config/nvim/colors/falcon/wallpapers/hex_3840x1600.jpg new file mode 100755 index 0000000..c5cf720 Binary files /dev/null and b/.config/nvim/colors/falcon/wallpapers/hex_3840x1600.jpg differ diff --git a/.config/nvim/colors/falcon/zsh/falcon.zsh b/.config/nvim/colors/falcon/zsh/falcon.zsh new file mode 100755 index 0000000..ab00f63 --- /dev/null +++ b/.config/nvim/colors/falcon/zsh/falcon.zsh @@ -0,0 +1,20 @@ +#!/bin/zsh + +# add in colouring to man +# mb = blink +# md = begin bold +# me = end mode +# se = end stand out +# so = begin stand out +# ue = end underline +# us = begin underline +man() { + LESS_TERMCAP_mb=$'\e[01;31m' \ + LESS_TERMCAP_md=$'\e[01;97m' \ + LESS_TERMCAP_me=$'\e[0m' \ + LESS_TERMCAP_so=$'\e[01;48;5;117;30m' \ + LESS_TERMCAP_se=$'\e[0m' \ + LESS_TERMCAP_ue=$'\e[0m' \ + LESS_TERMCAP_us=$'\e[04;94m' \ + command man "$@" +} diff --git a/.config/nvim/colors/gruvbox b/.config/nvim/colors/gruvbox deleted file mode 160000 index bf2885a..0000000 --- a/.config/nvim/colors/gruvbox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bf2885a95efdad7bd5e4794dd0213917770d79b7 diff --git a/.config/nvim/colors/gruvbox/CHANGELOG.md b/.config/nvim/colors/gruvbox/CHANGELOG.md new file mode 100755 index 0000000..90fd3a2 --- /dev/null +++ b/.config/nvim/colors/gruvbox/CHANGELOG.md @@ -0,0 +1,117 @@ +# Change Log + +## [Unreleased](https://github.com/morhetz/gruvbox/tree/HEAD) + +[Full Changelog](https://github.com/morhetz/gruvbox/compare/v1.3.5...HEAD) + +**Fixed bugs:** + +- Lighter background on terminal [\#8](https://github.com/morhetz/gruvbox/issues/8) + +**Closed issues:** + +- Installation issue. [\#54](https://github.com/morhetz/gruvbox/issues/54) + +- Italic font in terminal\(urxvt\) [\#49](https://github.com/morhetz/gruvbox/issues/49) + +- Unable to log in when sourcing the palette shellscript [\#48](https://github.com/morhetz/gruvbox/issues/48) + +- How can i modify multiple comment scheme [\#46](https://github.com/morhetz/gruvbox/issues/46) + +- Remove comment highlight in iterm [\#44](https://github.com/morhetz/gruvbox/issues/44) + +- Comments looking strange withing tmux [\#43](https://github.com/morhetz/gruvbox/issues/43) + +- comments are reverse-video in xterm [\#41](https://github.com/morhetz/gruvbox/issues/41) + +- What font are you using in the screenshots? [\#39](https://github.com/morhetz/gruvbox/issues/39) + +- vim-signature crashes when I use gruvbox [\#38](https://github.com/morhetz/gruvbox/issues/38) + +- Color of statusbar in inactive windows [\#37](https://github.com/morhetz/gruvbox/issues/37) + +- Go method and struct highlighting missing [\#36](https://github.com/morhetz/gruvbox/issues/36) + +- gruvbox\_256palette.sh doesn't work for Konsole [\#35](https://github.com/morhetz/gruvbox/issues/35) + +- Contrast in jekyll markdown files [\#33](https://github.com/morhetz/gruvbox/issues/33) + +- Pentadactyl Gruvbox Theme [\#32](https://github.com/morhetz/gruvbox/issues/32) + +- make vertsplit better [\#31](https://github.com/morhetz/gruvbox/issues/31) + +- Console support. [\#30](https://github.com/morhetz/gruvbox/issues/30) + +- How can I change the background color? [\#29](https://github.com/morhetz/gruvbox/issues/29) + +- Some words are not bold [\#28](https://github.com/morhetz/gruvbox/issues/28) + +- Terminal theme on base gruvbox [\#25](https://github.com/morhetz/gruvbox/issues/25) + +- Markdown has inverted colors when using \* [\#24](https://github.com/morhetz/gruvbox/issues/24) + +- how install it on mac osx [\#23](https://github.com/morhetz/gruvbox/issues/23) + +- Comments color for Terminal Vim [\#22](https://github.com/morhetz/gruvbox/issues/22) + +- Move palette files to gruvbox-generalized [\#20](https://github.com/morhetz/gruvbox/issues/20) + +- Maybe add Gruvbox Airline theme? [\#19](https://github.com/morhetz/gruvbox/issues/19) + +- For Sublime text [\#18](https://github.com/morhetz/gruvbox/issues/18) + +**Merged pull requests:** + +- Fix the 256 palette script failed login issue [\#53](https://github.com/morhetz/gruvbox/pull/53) ([jonasmalacofilho](https://github.com/jonasmalacofilho)) + +- add minimal coloring for gitcommit highlighting [\#52](https://github.com/morhetz/gruvbox/pull/52) ([daniely](https://github.com/daniely)) + +- For terminals, turn off italics by default. [\#47](https://github.com/morhetz/gruvbox/pull/47) ([ryanmjacobs](https://github.com/ryanmjacobs)) + +- Change color of vertical/horizontal seperators between split windows [\#45](https://github.com/morhetz/gruvbox/pull/45) ([deshtop](https://github.com/deshtop)) + +- Improve gruvbox with C code [\#34](https://github.com/morhetz/gruvbox/pull/34) ([gladiac](https://github.com/gladiac)) + +- Fix for linux console [\#27](https://github.com/morhetz/gruvbox/pull/27) ([vyp](https://github.com/vyp)) + +- Colors for plugin vimshell.vim [\#21](https://github.com/morhetz/gruvbox/pull/21) ([joelmo](https://github.com/joelmo)) + +## [v1.3.5](https://github.com/morhetz/gruvbox/tree/v1.3.5) (2014-03-19) + +[Full Changelog](https://github.com/morhetz/gruvbox/compare/v0.0.8...v1.3.5) + +**Implemented enhancements:** + +- Better selection colors [\#15](https://github.com/morhetz/gruvbox/issues/15) + +- When hlsearch is on, the cursor inverts the search color and not visible [\#2](https://github.com/morhetz/gruvbox/issues/2) + +**Fixed bugs:** + +- Problem with changing between dark and light on 256 color terminal [\#7](https://github.com/morhetz/gruvbox/issues/7) + +- IndentGuides coloring doesn't show up [\#1](https://github.com/morhetz/gruvbox/issues/1) + +**Closed issues:** + +- Requesting rxvt-unicode theme [\#17](https://github.com/morhetz/gruvbox/issues/17) + +- gruvbox\_256palette.sh gets reset \(gnome-terminal on Ubuntu\) [\#13](https://github.com/morhetz/gruvbox/issues/13) + +- Powerline colors [\#12](https://github.com/morhetz/gruvbox/issues/12) + +- Info necessary for making a port of this colorscheme [\#10](https://github.com/morhetz/gruvbox/issues/10) + +**Merged pull requests:** + +- Fix GNU screen detection for \*-bce [\#16](https://github.com/morhetz/gruvbox/pull/16) ([blueyed](https://github.com/blueyed)) + +- Added iTerm2 dark theme [\#11](https://github.com/morhetz/gruvbox/pull/11) ([Greduan](https://github.com/Greduan)) + +- Fix typo in Readme [\#5](https://github.com/morhetz/gruvbox/pull/5) ([ViViDboarder](https://github.com/ViViDboarder)) + +## [v0.0.8](https://github.com/morhetz/gruvbox/tree/v0.0.8) (2012-12-08) + + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/.config/nvim/colors/gruvbox/README.md b/.config/nvim/colors/gruvbox/README.md new file mode 100755 index 0000000..eca249c --- /dev/null +++ b/.config/nvim/colors/gruvbox/README.md @@ -0,0 +1,113 @@ + + +gruvbox is heavily inspired by [badwolf][], [jellybeans][] and [solarized][]. + +Designed as a bright theme with pastel 'retro groove' colors and light/dark mode switching in the way of [solarized][]. The main focus when developing gruvbox is to keep colors easily distinguishable, contrast enough and still pleasant for the eyes. + + [badwolf]: https://github.com/sjl/badwolf + [jellybeans]: https://github.com/nanotech/jellybeans.vim + [solarized]: http://ethanschoonover.com/solarized + +Attention +--------- + +1. [Read this first](https://github.com/morhetz/gruvbox/wiki/Terminal-specific) +2. Typeface from gallery is [Fantasque Sans Mono](https://github.com/belluzj/fantasque-sans) +3. Typeface from screenshots below is [Fira Mono](https://mozilla.github.io/Fira/) + +Screenshots +----------- + +Refer [Gallery][] for more syntax-specific screenshots. + + [Gallery]: https://github.com/morhetz/gruvbox/wiki/Gallery + +### Dark mode + +![Screenshot Dark](http://i.imgur.com/GkIl8Fn.png) + +### Light mode + +![Screenshot Light](http://i.imgur.com/X75niEa.png) + +### Airline theme + +![Screenshot Airline](http://i.imgur.com/wRQceUR.png) + +Palette +------- + +### Dark mode + +![Palette Dark](http://i.imgur.com/wa666xg.png) + +### Light mode + +![Palette Light](http://i.imgur.com/49qKyYW.png) + +Contrast options +---------------- + +Refer [wiki section][] for contrast configuration and other options. + + [wiki section]: https://github.com/morhetz/gruvbox/wiki/Configuration#ggruvbox_contrast_dark + +![Contrast Options](http://i.imgur.com/5MSbe6T.png) + +Documentation +------------- + +Please check [wiki][] for installation details, terminal-specific setup, troubleshooting, configuration options and others. + + [wiki]: https://github.com/morhetz/gruvbox/wiki + +Features +-------- + +* Lots of style-customization options (contrast, color invertion, italics usage etc.) +* Extended filetype highlighting: Html, Xml, Vim, Clojure, C, Python, JavaScript, TypeScript, PureScript, CoffeeScript, Ruby, Objective-C, Go, Lua, MoonScript, Java, Markdown, Haskell, Elixir +* Supported plugins: [EasyMotion][], [vim-sneak][], [Indent Guides][], [indentLine][], [Rainbow Parentheses][], [Airline][], [Lightline][], [GitGutter][], [Signify][], [ShowMarks][], [Signature][], [Syntastic][], [Ale][], [CtrlP][], [Startify][], [NERDTree][], [Dirvish][] + + [EasyMotion]: https://github.com/Lokaltog/vim-easymotion + [vim-sneak]: https://github.com/justinmk/vim-sneak + [Indent Guides]: https://github.com/nathanaelkane/vim-indent-guides + [indentLine]: https://github.com/Yggdroot/indentLine + [Rainbow Parentheses]: https://github.com/kien/rainbow_parentheses.vim + [Airline]: https://github.com/bling/vim-airline + [Lightline]: https://github.com/itchyny/lightline.vim + [GitGutter]: https://github.com/airblade/vim-gitgutter + [Signify]: https://github.com/mhinz/vim-signify + [ShowMarks]: http://www.vim.org/scripts/script.php?script_id=152 + [Signature]: https://github.com/kshenoy/vim-signature + [Syntastic]: https://github.com/scrooloose/syntastic + [Ale]: https://github.com/w0rp/ale + [CtrlP]: https://github.com/kien/ctrlp.vim + [Startify]: https://github.com/mhinz/vim-startify + [NERDTree]: https://github.com/scrooloose/nerdtree + [Dirvish]: https://github.com/justinmk/vim-dirvish + +Contributions +------------- + +See [gruvbox-contrib][] repo for contributions, ports and extras. + +[gruvbox-contrib]: https://github.com/morhetz/gruvbox-contrib + +ToDo +---- + +* Filetype syntax highlighting (R, TeX, Swift, Erlang) +* Plugin support (Tagbar, VimPlug) + +Self-Promotion +-------------- + +If you like gruvbox follow the repository on +[GitHub](https://github.com/morhetz/gruvbox) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=4349). + +License +------- +[MIT/X11][] + + [MIT/X11]: https://en.wikipedia.org/wiki/MIT_License diff --git a/.config/nvim/colors/gruvbox/autoload/airline/themes/gruvbox.vim b/.config/nvim/colors/gruvbox/autoload/airline/themes/gruvbox.vim new file mode 100755 index 0000000..6862a81 --- /dev/null +++ b/.config/nvim/colors/gruvbox/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/.config/nvim/colors/gruvbox/autoload/gruvbox.vim b/.config/nvim/colors/gruvbox/autoload/gruvbox.vim new file mode 100755 index 0000000..44bec6e --- /dev/null +++ b/.config/nvim/colors/gruvbox/autoload/gruvbox.vim @@ -0,0 +1,41 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Vim +" Author: morhetz +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 09 Apr 2014 +" ----------------------------------------------------------------------------- + +function! gruvbox#invert_signs_toggle() + if g:gruvbox_invert_signs == 0 + let g:gruvbox_invert_signs=1 + else + let g:gruvbox_invert_signs=0 + endif + + colorscheme gruvbox +endfunction + +" Search Highlighting {{{ + +function! gruvbox#hls_show() + set hlsearch + call GruvboxHlsShowCursor() +endfunction + +function! gruvbox#hls_hide() + set nohlsearch + call GruvboxHlsHideCursor() +endfunction + +function! gruvbox#hls_toggle() + if &hlsearch + call gruvbox#hls_hide() + else + call gruvbox#hls_show() + endif +endfunction + +" }}} + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/.config/nvim/colors/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/.config/nvim/colors/gruvbox/autoload/lightline/colorscheme/gruvbox.vim new file mode 100755 index 0000000..4730c09 --- /dev/null +++ b/.config/nvim/colors/gruvbox/autoload/lightline/colorscheme/gruvbox.vim @@ -0,0 +1,57 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Gruvbox colorscheme for Lightline (itchyny/lightline.vim) +" Author: gmoe +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 20 Sep 2017 +" ----------------------------------------------------------------------------- + +function! s:getGruvColor(group) + let guiColor = synIDattr(hlID(a:group), "fg", "gui") + let termColor = synIDattr(hlID(a:group), "fg", "cterm") + return [ guiColor, termColor ] +endfunction + +if exists('g:lightline') + + let s:bg0 = s:getGruvColor('GruvboxBg0') + let s:bg1 = s:getGruvColor('GruvboxBg1') + let s:bg2 = s:getGruvColor('GruvboxBg2') + let s:bg4 = s:getGruvColor('GruvboxBg4') + let s:fg1 = s:getGruvColor('GruvboxFg1') + let s:fg4 = s:getGruvColor('GruvboxFg4') + + let s:yellow = s:getGruvColor('GruvboxYellow') + let s:blue = s:getGruvColor('GruvboxBlue') + let s:aqua = s:getGruvColor('GruvboxAqua') + let s:orange = s:getGruvColor('GruvboxOrange') + let s:green = s:getGruvColor('GruvboxGreen') + + let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}, 'terminal':{}} + let s:p.normal.left = [ [ s:bg0, s:fg4, 'bold' ], [ s:fg4, s:bg2 ] ] + let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] + let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ] + let s:p.inactive.right = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] + let s:p.inactive.left = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] + let s:p.inactive.middle = [ [ s:bg4, s:bg1 ] ] + let s:p.insert.left = [ [ s:bg0, s:blue, 'bold' ], [ s:fg1, s:bg2 ] ] + let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] + let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.terminal.left = [ [ s:bg0, s:green, 'bold' ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.right = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.replace.left = [ [ s:bg0, s:aqua, 'bold' ], [ s:fg1, s:bg2 ] ] + let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] + let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.visual.left = [ [ s:bg0, s:orange, 'bold' ], [ s:bg0, s:bg4 ] ] + let s:p.visual.right = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ] + let s:p.visual.middle = [ [ s:fg4, s:bg1 ] ] + let s:p.tabline.left = [ [ s:fg4, s:bg2 ] ] + let s:p.tabline.tabsel = [ [ s:bg0, s:fg4 ] ] + let s:p.tabline.middle = [ [ s:bg0, s:bg0 ] ] + let s:p.tabline.right = [ [ s:bg0, s:orange ] ] + let s:p.normal.error = [ [ s:bg0, s:orange ] ] + let s:p.normal.warning = [ [ s:bg2, s:yellow ] ] + + let g:lightline#colorscheme#gruvbox#palette = lightline#colorscheme#flatten(s:p) +endif diff --git a/.config/nvim/colors/gruvbox/colors/gruvbox.vim b/.config/nvim/colors/gruvbox/colors/gruvbox.vim new file mode 100755 index 0000000..66246fb --- /dev/null +++ b/.config/nvim/colors/gruvbox/colors/gruvbox.vim @@ -0,0 +1,1418 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Vim +" Author: morhetz +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 12 Aug 2017 +" ----------------------------------------------------------------------------- + +" Supporting code ------------------------------------------------------------- +" Initialisation: {{{ + +if version > 580 + hi clear + if exists("syntax_on") + syntax reset + endif +endif + +let g:colors_name='gruvbox' + +if !(has('termguicolors') && &termguicolors) && !has('gui_running') && &t_Co != 256 + finish +endif + +" }}} +" Global Settings: {{{ + +if !exists('g:gruvbox_bold') + let g:gruvbox_bold=1 +endif +if !exists('g:gruvbox_italic') + if has('gui_running') || $TERM_ITALICS == 'true' + let g:gruvbox_italic=1 + else + let g:gruvbox_italic=0 + endif +endif +if !exists('g:gruvbox_undercurl') + let g:gruvbox_undercurl=1 +endif +if !exists('g:gruvbox_underline') + let g:gruvbox_underline=1 +endif +if !exists('g:gruvbox_inverse') + let g:gruvbox_inverse=1 +endif + +if !exists('g:gruvbox_guisp_fallback') || index(['fg', 'bg'], g:gruvbox_guisp_fallback) == -1 + let g:gruvbox_guisp_fallback='NONE' +endif + +if !exists('g:gruvbox_improved_strings') + let g:gruvbox_improved_strings=0 +endif + +if !exists('g:gruvbox_improved_warnings') + let g:gruvbox_improved_warnings=0 +endif + +if !exists('g:gruvbox_termcolors') + let g:gruvbox_termcolors=256 +endif + +if !exists('g:gruvbox_invert_indent_guides') + let g:gruvbox_invert_indent_guides=0 +endif + +if exists('g:gruvbox_contrast') + echo 'g:gruvbox_contrast is deprecated; use g:gruvbox_contrast_light and g:gruvbox_contrast_dark instead' +endif + +if !exists('g:gruvbox_contrast_dark') + let g:gruvbox_contrast_dark='medium' +endif + +if !exists('g:gruvbox_contrast_light') + let g:gruvbox_contrast_light='medium' +endif + +let s:is_dark=(&background == 'dark') + +" }}} +" Palette: {{{ + +" setup palette dictionary +let s:gb = {} + +" fill it with absolute colors +let s:gb.dark0_hard = ['#1d2021', 234] " 29-32-33 +let s:gb.dark0 = ['#282828', 235] " 40-40-40 +let s:gb.dark0_soft = ['#32302f', 236] " 50-48-47 +let s:gb.dark1 = ['#3c3836', 237] " 60-56-54 +let s:gb.dark2 = ['#504945', 239] " 80-73-69 +let s:gb.dark3 = ['#665c54', 241] " 102-92-84 +let s:gb.dark4 = ['#7c6f64', 243] " 124-111-100 +let s:gb.dark4_256 = ['#7c6f64', 243] " 124-111-100 + +let s:gb.gray_245 = ['#928374', 245] " 146-131-116 +let s:gb.gray_244 = ['#928374', 244] " 146-131-116 + +let s:gb.light0_hard = ['#f9f5d7', 230] " 249-245-215 +let s:gb.light0 = ['#fbf1c7', 229] " 253-244-193 +let s:gb.light0_soft = ['#f2e5bc', 228] " 242-229-188 +let s:gb.light1 = ['#ebdbb2', 223] " 235-219-178 +let s:gb.light2 = ['#d5c4a1', 250] " 213-196-161 +let s:gb.light3 = ['#bdae93', 248] " 189-174-147 +let s:gb.light4 = ['#a89984', 246] " 168-153-132 +let s:gb.light4_256 = ['#a89984', 246] " 168-153-132 + +let s:gb.bright_red = ['#fb4934', 167] " 251-73-52 +let s:gb.bright_green = ['#b8bb26', 142] " 184-187-38 +let s:gb.bright_yellow = ['#fabd2f', 214] " 250-189-47 +let s:gb.bright_blue = ['#83a598', 109] " 131-165-152 +let s:gb.bright_purple = ['#d3869b', 175] " 211-134-155 +let s:gb.bright_aqua = ['#8ec07c', 108] " 142-192-124 +let s:gb.bright_orange = ['#fe8019', 208] " 254-128-25 + +let s:gb.neutral_red = ['#cc241d', 124] " 204-36-29 +let s:gb.neutral_green = ['#98971a', 106] " 152-151-26 +let s:gb.neutral_yellow = ['#d79921', 172] " 215-153-33 +let s:gb.neutral_blue = ['#458588', 66] " 69-133-136 +let s:gb.neutral_purple = ['#b16286', 132] " 177-98-134 +let s:gb.neutral_aqua = ['#689d6a', 72] " 104-157-106 +let s:gb.neutral_orange = ['#d65d0e', 166] " 214-93-14 + +let s:gb.faded_red = ['#9d0006', 88] " 157-0-6 +let s:gb.faded_green = ['#79740e', 100] " 121-116-14 +let s:gb.faded_yellow = ['#b57614', 136] " 181-118-20 +let s:gb.faded_blue = ['#076678', 24] " 7-102-120 +let s:gb.faded_purple = ['#8f3f71', 96] " 143-63-113 +let s:gb.faded_aqua = ['#427b58', 66] " 66-123-88 +let s:gb.faded_orange = ['#af3a03', 130] " 175-58-3 + +" }}} +" Setup Emphasis: {{{ + +let s:bold = 'bold,' +if g:gruvbox_bold == 0 + let s:bold = '' +endif + +let s:italic = 'italic,' +if g:gruvbox_italic == 0 + let s:italic = '' +endif + +let s:underline = 'underline,' +if g:gruvbox_underline == 0 + let s:underline = '' +endif + +let s:undercurl = 'undercurl,' +if g:gruvbox_undercurl == 0 + let s:undercurl = '' +endif + +let s:inverse = 'inverse,' +if g:gruvbox_inverse == 0 + let s:inverse = '' +endif + +" }}} +" Setup Colors: {{{ + +let s:vim_bg = ['bg', 'bg'] +let s:vim_fg = ['fg', 'fg'] +let s:none = ['NONE', 'NONE'] + +" determine relative colors +if s:is_dark + let s:bg0 = s:gb.dark0 + if g:gruvbox_contrast_dark == 'soft' + let s:bg0 = s:gb.dark0_soft + elseif g:gruvbox_contrast_dark == 'hard' + let s:bg0 = s:gb.dark0_hard + endif + + let s:bg1 = s:gb.dark1 + let s:bg2 = s:gb.dark2 + let s:bg3 = s:gb.dark3 + let s:bg4 = s:gb.dark4 + + let s:gray = s:gb.gray_245 + + let s:fg0 = s:gb.light0 + let s:fg1 = s:gb.light1 + let s:fg2 = s:gb.light2 + let s:fg3 = s:gb.light3 + let s:fg4 = s:gb.light4 + + let s:fg4_256 = s:gb.light4_256 + + let s:red = s:gb.bright_red + let s:green = s:gb.bright_green + let s:yellow = s:gb.bright_yellow + let s:blue = s:gb.bright_blue + let s:purple = s:gb.bright_purple + let s:aqua = s:gb.bright_aqua + let s:orange = s:gb.bright_orange +else + let s:bg0 = s:gb.light0 + if g:gruvbox_contrast_light == 'soft' + let s:bg0 = s:gb.light0_soft + elseif g:gruvbox_contrast_light == 'hard' + let s:bg0 = s:gb.light0_hard + endif + + let s:bg1 = s:gb.light1 + let s:bg2 = s:gb.light2 + let s:bg3 = s:gb.light3 + let s:bg4 = s:gb.light4 + + let s:gray = s:gb.gray_244 + + let s:fg0 = s:gb.dark0 + let s:fg1 = s:gb.dark1 + let s:fg2 = s:gb.dark2 + let s:fg3 = s:gb.dark3 + let s:fg4 = s:gb.dark4 + + let s:fg4_256 = s:gb.dark4_256 + + let s:red = s:gb.faded_red + let s:green = s:gb.faded_green + let s:yellow = s:gb.faded_yellow + let s:blue = s:gb.faded_blue + let s:purple = s:gb.faded_purple + let s:aqua = s:gb.faded_aqua + let s:orange = s:gb.faded_orange +endif + +" reset to 16 colors fallback +if g:gruvbox_termcolors == 16 + let s:bg0[1] = 0 + let s:fg4[1] = 7 + let s:gray[1] = 8 + let s:red[1] = 9 + let s:green[1] = 10 + let s:yellow[1] = 11 + let s:blue[1] = 12 + let s:purple[1] = 13 + let s:aqua[1] = 14 + let s:fg1[1] = 15 +endif + +" save current relative colors back to palette dictionary +let s:gb.bg0 = s:bg0 +let s:gb.bg1 = s:bg1 +let s:gb.bg2 = s:bg2 +let s:gb.bg3 = s:bg3 +let s:gb.bg4 = s:bg4 + +let s:gb.gray = s:gray + +let s:gb.fg0 = s:fg0 +let s:gb.fg1 = s:fg1 +let s:gb.fg2 = s:fg2 +let s:gb.fg3 = s:fg3 +let s:gb.fg4 = s:fg4 + +let s:gb.fg4_256 = s:fg4_256 + +let s:gb.red = s:red +let s:gb.green = s:green +let s:gb.yellow = s:yellow +let s:gb.blue = s:blue +let s:gb.purple = s:purple +let s:gb.aqua = s:aqua +let s:gb.orange = s:orange + +" }}} +" Setup Terminal Colors For Neovim: {{{ + +if has('nvim') + let g:terminal_color_0 = s:bg0[0] + let g:terminal_color_8 = s:gray[0] + + let g:terminal_color_1 = s:gb.neutral_red[0] + let g:terminal_color_9 = s:red[0] + + let g:terminal_color_2 = s:gb.neutral_green[0] + let g:terminal_color_10 = s:green[0] + + let g:terminal_color_3 = s:gb.neutral_yellow[0] + let g:terminal_color_11 = s:yellow[0] + + let g:terminal_color_4 = s:gb.neutral_blue[0] + let g:terminal_color_12 = s:blue[0] + + let g:terminal_color_5 = s:gb.neutral_purple[0] + let g:terminal_color_13 = s:purple[0] + + let g:terminal_color_6 = s:gb.neutral_aqua[0] + let g:terminal_color_14 = s:aqua[0] + + let g:terminal_color_7 = s:fg4[0] + let g:terminal_color_15 = s:fg1[0] +endif + +" }}} +" Overload Setting: {{{ + +let s:hls_cursor = s:orange +if exists('g:gruvbox_hls_cursor') + let s:hls_cursor = get(s:gb, g:gruvbox_hls_cursor) +endif + +let s:number_column = s:none +if exists('g:gruvbox_number_column') + let s:number_column = get(s:gb, g:gruvbox_number_column) +endif + +let s:sign_column = s:bg1 + +if exists('g:gitgutter_override_sign_column_highlight') && + \ g:gitgutter_override_sign_column_highlight == 1 + let s:sign_column = s:number_column +else + let g:gitgutter_override_sign_column_highlight = 0 + + if exists('g:gruvbox_sign_column') + let s:sign_column = get(s:gb, g:gruvbox_sign_column) + endif +endif + +let s:color_column = s:bg1 +if exists('g:gruvbox_color_column') + let s:color_column = get(s:gb, g:gruvbox_color_column) +endif + +let s:vert_split = s:bg0 +if exists('g:gruvbox_vert_split') + let s:vert_split = get(s:gb, g:gruvbox_vert_split) +endif + +let s:invert_signs = '' +if exists('g:gruvbox_invert_signs') + if g:gruvbox_invert_signs == 1 + let s:invert_signs = s:inverse + endif +endif + +let s:invert_selection = s:inverse +if exists('g:gruvbox_invert_selection') + if g:gruvbox_invert_selection == 0 + let s:invert_selection = '' + endif +endif + +let s:invert_tabline = '' +if exists('g:gruvbox_invert_tabline') + if g:gruvbox_invert_tabline == 1 + let s:invert_tabline = s:inverse + endif +endif + +let s:italicize_comments = s:italic +if exists('g:gruvbox_italicize_comments') + if g:gruvbox_italicize_comments == 0 + let s:italicize_comments = '' + endif +endif + +let s:italicize_strings = '' +if exists('g:gruvbox_italicize_strings') + if g:gruvbox_italicize_strings == 1 + let s:italicize_strings = s:italic + endif +endif + +" }}} +" Highlighting Function: {{{ + +function! s:HL(group, fg, ...) + " Arguments: group, guifg, guibg, gui, guisp + + " foreground + let fg = a:fg + + " background + if a:0 >= 1 + let bg = a:1 + else + let bg = s:none + endif + + " emphasis + if a:0 >= 2 && strlen(a:2) + let emstr = a:2 + else + let emstr = 'NONE,' + endif + + " special fallback + if a:0 >= 3 + if g:gruvbox_guisp_fallback != 'NONE' + let fg = a:3 + endif + + " bg fallback mode should invert higlighting + if g:gruvbox_guisp_fallback == 'bg' + let emstr .= 'inverse,' + endif + endif + + let histring = [ 'hi', a:group, + \ 'guifg=' . fg[0], 'ctermfg=' . fg[1], + \ 'guibg=' . bg[0], 'ctermbg=' . bg[1], + \ 'gui=' . emstr[:-2], 'cterm=' . emstr[:-2] + \ ] + + " special + if a:0 >= 3 + call add(histring, 'guisp=' . a:3[0]) + endif + + execute join(histring, ' ') +endfunction + +" }}} +" Gruvbox Hi Groups: {{{ + +" memoize common hi groups +call s:HL('GruvboxFg0', s:fg0) +call s:HL('GruvboxFg1', s:fg1) +call s:HL('GruvboxFg2', s:fg2) +call s:HL('GruvboxFg3', s:fg3) +call s:HL('GruvboxFg4', s:fg4) +call s:HL('GruvboxGray', s:gray) +call s:HL('GruvboxBg0', s:bg0) +call s:HL('GruvboxBg1', s:bg1) +call s:HL('GruvboxBg2', s:bg2) +call s:HL('GruvboxBg3', s:bg3) +call s:HL('GruvboxBg4', s:bg4) + +call s:HL('GruvboxRed', s:red) +call s:HL('GruvboxRedBold', s:red, s:none, s:bold) +call s:HL('GruvboxGreen', s:green) +call s:HL('GruvboxGreenBold', s:green, s:none, s:bold) +call s:HL('GruvboxYellow', s:yellow) +call s:HL('GruvboxYellowBold', s:yellow, s:none, s:bold) +call s:HL('GruvboxBlue', s:blue) +call s:HL('GruvboxBlueBold', s:blue, s:none, s:bold) +call s:HL('GruvboxPurple', s:purple) +call s:HL('GruvboxPurpleBold', s:purple, s:none, s:bold) +call s:HL('GruvboxAqua', s:aqua) +call s:HL('GruvboxAquaBold', s:aqua, s:none, s:bold) +call s:HL('GruvboxOrange', s:orange) +call s:HL('GruvboxOrangeBold', s:orange, s:none, s:bold) + +call s:HL('GruvboxRedSign', s:red, s:sign_column, s:invert_signs) +call s:HL('GruvboxGreenSign', s:green, s:sign_column, s:invert_signs) +call s:HL('GruvboxYellowSign', s:yellow, s:sign_column, s:invert_signs) +call s:HL('GruvboxBlueSign', s:blue, s:sign_column, s:invert_signs) +call s:HL('GruvboxPurpleSign', s:purple, s:sign_column, s:invert_signs) +call s:HL('GruvboxAquaSign', s:aqua, s:sign_column, s:invert_signs) +call s:HL('GruvboxOrangeSign', s:orange, s:sign_column, s:invert_signs) + +" }}} + +" Vanilla colorscheme --------------------------------------------------------- +" General UI: {{{ + +" Normal text +call s:HL('Normal', s:fg1, s:bg0) + +" Correct background (see issue #7): +" --- Problem with changing between dark and light on 256 color terminal +" --- https://github.com/morhetz/gruvbox/issues/7 +if s:is_dark + set background=dark +else + set background=light +endif + +if version >= 700 + " Screen line that the cursor is + call s:HL('CursorLine', s:none, s:bg1) + " Screen column that the cursor is + hi! link CursorColumn CursorLine + + " Tab pages line filler + call s:HL('TabLineFill', s:bg4, s:bg1, s:invert_tabline) + " Active tab page label + call s:HL('TabLineSel', s:green, s:bg1, s:invert_tabline) + " Not active tab page label + hi! link TabLine TabLineFill + + " Match paired bracket under the cursor + call s:HL('MatchParen', s:none, s:bg3, s:bold) +endif + +if version >= 703 + " Highlighted screen columns + call s:HL('ColorColumn', s:none, s:color_column) + + " Concealed element: \lambda → λ + call s:HL('Conceal', s:blue, s:none) + + " Line number of CursorLine + call s:HL('CursorLineNr', s:yellow, s:bg1) +endif + +hi! link NonText GruvboxBg2 +hi! link SpecialKey GruvboxBg2 + +call s:HL('Visual', s:none, s:bg3, s:invert_selection) +hi! link VisualNOS Visual + +call s:HL('Search', s:yellow, s:bg0, s:inverse) +call s:HL('IncSearch', s:hls_cursor, s:bg0, s:inverse) + +call s:HL('Underlined', s:blue, s:none, s:underline) + +call s:HL('StatusLine', s:bg2, s:fg1, s:inverse) +call s:HL('StatusLineNC', s:bg1, s:fg4, s:inverse) + +" The column separating vertically split windows +call s:HL('VertSplit', s:bg3, s:vert_split) + +" Current match in wildmenu completion +call s:HL('WildMenu', s:blue, s:bg2, s:bold) + +" Directory names, special names in listing +hi! link Directory GruvboxGreenBold + +" Titles for output from :set all, :autocmd, etc. +hi! link Title GruvboxGreenBold + +" Error messages on the command line +call s:HL('ErrorMsg', s:bg0, s:red, s:bold) +" More prompt: -- More -- +hi! link MoreMsg GruvboxYellowBold +" Current mode message: -- INSERT -- +hi! link ModeMsg GruvboxYellowBold +" 'Press enter' prompt and yes/no questions +hi! link Question GruvboxOrangeBold +" Warning messages +hi! link WarningMsg GruvboxRedBold + +" }}} +" Gutter: {{{ + +" Line number for :number and :# commands +call s:HL('LineNr', s:bg4, s:number_column) + +" Column where signs are displayed +call s:HL('SignColumn', s:none, s:sign_column) + +" Line used for closed folds +call s:HL('Folded', s:gray, s:bg1, s:italic) +" Column where folds are displayed +call s:HL('FoldColumn', s:gray, s:bg1) + +" }}} +" Cursor: {{{ + +" Character under cursor +call s:HL('Cursor', s:none, s:none, s:inverse) +" Visual mode cursor, selection +hi! link vCursor Cursor +" Input moder cursor +hi! link iCursor Cursor +" Language mapping cursor +hi! link lCursor Cursor + +" }}} +" Syntax Highlighting: {{{ + +if g:gruvbox_improved_strings == 0 + hi! link Special GruvboxOrange +else + call s:HL('Special', s:orange, s:bg1, s:italicize_strings) +endif + +call s:HL('Comment', s:gray, s:none, s:italicize_comments) +call s:HL('Todo', s:vim_fg, s:vim_bg, s:bold . s:italic) +call s:HL('Error', s:red, s:vim_bg, s:bold . s:inverse) + +" Generic statement +hi! link Statement GruvboxRed +" if, then, else, endif, swicth, etc. +hi! link Conditional GruvboxRed +" for, do, while, etc. +hi! link Repeat GruvboxRed +" case, default, etc. +hi! link Label GruvboxRed +" try, catch, throw +hi! link Exception GruvboxRed +" sizeof, "+", "*", etc. +hi! link Operator Normal +" Any other keyword +hi! link Keyword GruvboxRed + +" Variable name +hi! link Identifier GruvboxBlue +" Function name +hi! link Function GruvboxGreenBold + +" Generic preprocessor +hi! link PreProc GruvboxAqua +" Preprocessor #include +hi! link Include GruvboxAqua +" Preprocessor #define +hi! link Define GruvboxAqua +" Same as Define +hi! link Macro GruvboxAqua +" Preprocessor #if, #else, #endif, etc. +hi! link PreCondit GruvboxAqua + +" Generic constant +hi! link Constant GruvboxPurple +" Character constant: 'c', '/n' +hi! link Character GruvboxPurple +" String constant: "this is a string" +if g:gruvbox_improved_strings == 0 + call s:HL('String', s:green, s:none, s:italicize_strings) +else + call s:HL('String', s:fg1, s:bg1, s:italicize_strings) +endif +" Boolean constant: TRUE, false +hi! link Boolean GruvboxPurple +" Number constant: 234, 0xff +hi! link Number GruvboxPurple +" Floating point constant: 2.3e10 +hi! link Float GruvboxPurple + +" Generic type +hi! link Type GruvboxYellow +" static, register, volatile, etc +hi! link StorageClass GruvboxOrange +" struct, union, enum, etc. +hi! link Structure GruvboxAqua +" typedef +hi! link Typedef GruvboxYellow + +" }}} +" Completion Menu: {{{ + +if version >= 700 + " Popup menu: normal item + call s:HL('Pmenu', s:fg1, s:bg2) + " Popup menu: selected item + call s:HL('PmenuSel', s:bg2, s:blue, s:bold) + " Popup menu: scrollbar + call s:HL('PmenuSbar', s:none, s:bg2) + " Popup menu: scrollbar thumb + call s:HL('PmenuThumb', s:none, s:bg4) +endif + +" }}} +" Diffs: {{{ + +call s:HL('DiffDelete', s:red, s:bg0, s:inverse) +call s:HL('DiffAdd', s:green, s:bg0, s:inverse) +"call s:HL('DiffChange', s:bg0, s:blue) +"call s:HL('DiffText', s:bg0, s:yellow) + +" Alternative setting +call s:HL('DiffChange', s:aqua, s:bg0, s:inverse) +call s:HL('DiffText', s:yellow, s:bg0, s:inverse) + +" }}} +" Spelling: {{{ + +if has("spell") + " Not capitalised word, or compile warnings + if g:gruvbox_improved_warnings == 0 + call s:HL('SpellCap', s:none, s:none, s:undercurl, s:red) + else + call s:HL('SpellCap', s:green, s:none, s:bold . s:italic) + endif + " Not recognized word + call s:HL('SpellBad', s:none, s:none, s:undercurl, s:blue) + " Wrong spelling for selected region + call s:HL('SpellLocal', s:none, s:none, s:undercurl, s:aqua) + " Rare word + call s:HL('SpellRare', s:none, s:none, s:undercurl, s:purple) +endif + +" }}} + +" Plugin specific ------------------------------------------------------------- +" EasyMotion: {{{ + +hi! link EasyMotionTarget Search +hi! link EasyMotionShade Comment + +" }}} +" Sneak: {{{ + +hi! link Sneak Search +hi! link SneakLabel Search + +" }}} +" Indent Guides: {{{ + +if !exists('g:indent_guides_auto_colors') + let g:indent_guides_auto_colors = 0 +endif + +if g:indent_guides_auto_colors == 0 + if g:gruvbox_invert_indent_guides == 0 + call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2) + call s:HL('IndentGuidesEven', s:vim_bg, s:bg1) + else + call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2, s:inverse) + call s:HL('IndentGuidesEven', s:vim_bg, s:bg3, s:inverse) + endif +endif + +" }}} +" IndentLine: {{{ + +if !exists('g:indentLine_color_term') + let g:indentLine_color_term = s:bg2[1] +endif +if !exists('g:indentLine_color_gui') + let g:indentLine_color_gui = s:bg2[0] +endif + +" }}} +" Rainbow Parentheses: {{{ + +if !exists('g:rbpt_colorpairs') + let g:rbpt_colorpairs = + \ [ + \ ['blue', '#458588'], ['magenta', '#b16286'], + \ ['red', '#cc241d'], ['166', '#d65d0e'] + \ ] +endif + +let g:rainbow_guifgs = [ '#d65d0e', '#cc241d', '#b16286', '#458588' ] +let g:rainbow_ctermfgs = [ '166', 'red', 'magenta', 'blue' ] + +if !exists('g:rainbow_conf') + let g:rainbow_conf = {} +endif +if !has_key(g:rainbow_conf, 'guifgs') + let g:rainbow_conf['guifgs'] = g:rainbow_guifgs +endif +if !has_key(g:rainbow_conf, 'ctermfgs') + let g:rainbow_conf['ctermfgs'] = g:rainbow_ctermfgs +endif + +let g:niji_dark_colours = g:rbpt_colorpairs +let g:niji_light_colours = g:rbpt_colorpairs + +"}}} +" GitGutter: {{{ + +hi! link GitGutterAdd GruvboxGreenSign +hi! link GitGutterChange GruvboxAquaSign +hi! link GitGutterDelete GruvboxRedSign +hi! link GitGutterChangeDelete GruvboxAquaSign + +" }}} +" GitCommit: "{{{ + +hi! link gitcommitSelectedFile GruvboxGreen +hi! link gitcommitDiscardedFile GruvboxRed + +" }}} +" Signify: {{{ + +hi! link SignifySignAdd GruvboxGreenSign +hi! link SignifySignChange GruvboxAquaSign +hi! link SignifySignDelete GruvboxRedSign + +" }}} +" Syntastic: {{{ + +call s:HL('SyntasticError', s:none, s:none, s:undercurl, s:red) +call s:HL('SyntasticWarning', s:none, s:none, s:undercurl, s:yellow) + +hi! link SyntasticErrorSign GruvboxRedSign +hi! link SyntasticWarningSign GruvboxYellowSign + +" }}} +" Signature: {{{ +hi! link SignatureMarkText GruvboxBlueSign +hi! link SignatureMarkerText GruvboxPurpleSign + +" }}} +" ShowMarks: {{{ + +hi! link ShowMarksHLl GruvboxBlueSign +hi! link ShowMarksHLu GruvboxBlueSign +hi! link ShowMarksHLo GruvboxBlueSign +hi! link ShowMarksHLm GruvboxBlueSign + +" }}} +" CtrlP: {{{ + +hi! link CtrlPMatch GruvboxYellow +hi! link CtrlPNoEntries GruvboxRed +hi! link CtrlPPrtBase GruvboxBg2 +hi! link CtrlPPrtCursor GruvboxBlue +hi! link CtrlPLinePre GruvboxBg2 + +call s:HL('CtrlPMode1', s:blue, s:bg2, s:bold) +call s:HL('CtrlPMode2', s:bg0, s:blue, s:bold) +call s:HL('CtrlPStats', s:fg4, s:bg2, s:bold) + +" }}} +" Startify: {{{ + +hi! link StartifyBracket GruvboxFg3 +hi! link StartifyFile GruvboxFg1 +hi! link StartifyNumber GruvboxBlue +hi! link StartifyPath GruvboxGray +hi! link StartifySlash GruvboxGray +hi! link StartifySection GruvboxYellow +hi! link StartifySpecial GruvboxBg2 +hi! link StartifyHeader GruvboxOrange +hi! link StartifyFooter GruvboxBg2 + +" }}} +" Vimshell: {{{ + +let g:vimshell_escape_colors = [ + \ s:bg4[0], s:red[0], s:green[0], s:yellow[0], + \ s:blue[0], s:purple[0], s:aqua[0], s:fg4[0], + \ s:bg0[0], s:red[0], s:green[0], s:orange[0], + \ s:blue[0], s:purple[0], s:aqua[0], s:fg0[0] + \ ] + +" }}} +" BufTabLine: {{{ + +call s:HL('BufTabLineCurrent', s:bg0, s:fg4) +call s:HL('BufTabLineActive', s:fg4, s:bg2) +call s:HL('BufTabLineHidden', s:bg4, s:bg1) +call s:HL('BufTabLineFill', s:bg0, s:bg0) + +" }}} +" Asynchronous Lint Engine: {{{ + +call s:HL('ALEError', s:none, s:none, s:undercurl, s:red) +call s:HL('ALEWarning', s:none, s:none, s:undercurl, s:yellow) +call s:HL('ALEInfo', s:none, s:none, s:undercurl, s:blue) + +hi! link ALEErrorSign GruvboxRedSign +hi! link ALEWarningSign GruvboxYellowSign +hi! link ALEInfoSign GruvboxBlueSign + +" }}} +" Dirvish: {{{ + +hi! link DirvishPathTail GruvboxAqua +hi! link DirvishArg GruvboxYellow + +" }}} +" Netrw: {{{ + +hi! link netrwDir GruvboxAqua +hi! link netrwClassify GruvboxAqua +hi! link netrwLink GruvboxGray +hi! link netrwSymLink GruvboxFg1 +hi! link netrwExe GruvboxYellow +hi! link netrwComment GruvboxGray +hi! link netrwList GruvboxBlue +hi! link netrwHelpCmd GruvboxAqua +hi! link netrwCmdSep GruvboxFg3 +hi! link netrwVersion GruvboxGreen + +" }}} +" NERDTree: {{{ + +hi! link NERDTreeDir GruvboxAqua +hi! link NERDTreeDirSlash GruvboxAqua + +hi! link NERDTreeOpenable GruvboxOrange +hi! link NERDTreeClosable GruvboxOrange + +hi! link NERDTreeFile GruvboxFg1 +hi! link NERDTreeExecFile GruvboxYellow + +hi! link NERDTreeUp GruvboxGray +hi! link NERDTreeCWD GruvboxGreen +hi! link NERDTreeHelp GruvboxFg1 + +hi! link NERDTreeToggleOn GruvboxGreen +hi! link NERDTreeToggleOff GruvboxRed + +" }}} +" Vim Multiple Cursors: {{{ + +call s:HL('multiple_cursors_cursor', s:none, s:none, s:inverse) +call s:HL('multiple_cursors_visual', s:none, s:bg2) + +" }}} +" coc.nvim: {{{ + +hi! link CocErrorSign GruvboxRedSign +hi! link CocWarningSign GruvboxOrangeSign +hi! link CocInfoSign GruvboxYellowSign +hi! link CocHintSign GruvboxBlueSign +hi! link CocErrorFloat GruvboxRed +hi! link CocWarningFloat GruvboxOrange +hi! link CocInfoFloat GruvboxYellow +hi! link CocHintFloat GruvboxBlue +hi! link CocDiagnosticsError GruvboxRed +hi! link CocDiagnosticsWarning GruvboxOrange +hi! link CocDiagnosticsInfo GruvboxYellow +hi! link CocDiagnosticsHint GruvboxBlue + +hi! link CocSelectedText GruvboxRed +hi! link CocCodeLens GruvboxGray + +call s:HL('CocErrorHighlight', s:none, s:none, s:undercurl, s:red) +call s:HL('CocWarningHighlight', s:none, s:none, s:undercurl, s:orange) +call s:HL('CocInfoHighlight', s:none, s:none, s:undercurl, s:yellow) +call s:HL('CocHintHighlight', s:none, s:none, s:undercurl, s:blue) + +" }}} + +" Filetype specific ----------------------------------------------------------- +" Diff: {{{ + +hi! link diffAdded GruvboxGreen +hi! link diffRemoved GruvboxRed +hi! link diffChanged GruvboxAqua + +hi! link diffFile GruvboxOrange +hi! link diffNewFile GruvboxYellow + +hi! link diffLine GruvboxBlue + +" }}} +" Html: {{{ + +hi! link htmlTag GruvboxBlue +hi! link htmlEndTag GruvboxBlue + +hi! link htmlTagName GruvboxAquaBold +hi! link htmlArg GruvboxAqua + +hi! link htmlScriptTag GruvboxPurple +hi! link htmlTagN GruvboxFg1 +hi! link htmlSpecialTagName GruvboxAquaBold + +call s:HL('htmlLink', s:fg4, s:none, s:underline) + +hi! link htmlSpecialChar GruvboxOrange + +call s:HL('htmlBold', s:vim_fg, s:vim_bg, s:bold) +call s:HL('htmlBoldUnderline', s:vim_fg, s:vim_bg, s:bold . s:underline) +call s:HL('htmlBoldItalic', s:vim_fg, s:vim_bg, s:bold . s:italic) +call s:HL('htmlBoldUnderlineItalic', s:vim_fg, s:vim_bg, s:bold . s:underline . s:italic) + +call s:HL('htmlUnderline', s:vim_fg, s:vim_bg, s:underline) +call s:HL('htmlUnderlineItalic', s:vim_fg, s:vim_bg, s:underline . s:italic) +call s:HL('htmlItalic', s:vim_fg, s:vim_bg, s:italic) + +" }}} +" Xml: {{{ + +hi! link xmlTag GruvboxBlue +hi! link xmlEndTag GruvboxBlue +hi! link xmlTagName GruvboxBlue +hi! link xmlEqual GruvboxBlue +hi! link docbkKeyword GruvboxAquaBold + +hi! link xmlDocTypeDecl GruvboxGray +hi! link xmlDocTypeKeyword GruvboxPurple +hi! link xmlCdataStart GruvboxGray +hi! link xmlCdataCdata GruvboxPurple +hi! link dtdFunction GruvboxGray +hi! link dtdTagName GruvboxPurple + +hi! link xmlAttrib GruvboxAqua +hi! link xmlProcessingDelim GruvboxGray +hi! link dtdParamEntityPunct GruvboxGray +hi! link dtdParamEntityDPunct GruvboxGray +hi! link xmlAttribPunct GruvboxGray + +hi! link xmlEntity GruvboxOrange +hi! link xmlEntityPunct GruvboxOrange +" }}} +" Vim: {{{ + +call s:HL('vimCommentTitle', s:fg4_256, s:none, s:bold . s:italicize_comments) + +hi! link vimNotation GruvboxOrange +hi! link vimBracket GruvboxOrange +hi! link vimMapModKey GruvboxOrange +hi! link vimFuncSID GruvboxFg3 +hi! link vimSetSep GruvboxFg3 +hi! link vimSep GruvboxFg3 +hi! link vimContinue GruvboxFg3 + +" }}} +" Clojure: {{{ + +hi! link clojureKeyword GruvboxBlue +hi! link clojureCond GruvboxOrange +hi! link clojureSpecial GruvboxOrange +hi! link clojureDefine GruvboxOrange + +hi! link clojureFunc GruvboxYellow +hi! link clojureRepeat GruvboxYellow +hi! link clojureCharacter GruvboxAqua +hi! link clojureStringEscape GruvboxAqua +hi! link clojureException GruvboxRed + +hi! link clojureRegexp GruvboxAqua +hi! link clojureRegexpEscape GruvboxAqua +call s:HL('clojureRegexpCharClass', s:fg3, s:none, s:bold) +hi! link clojureRegexpMod clojureRegexpCharClass +hi! link clojureRegexpQuantifier clojureRegexpCharClass + +hi! link clojureParen GruvboxFg3 +hi! link clojureAnonArg GruvboxYellow +hi! link clojureVariable GruvboxBlue +hi! link clojureMacro GruvboxOrange + +hi! link clojureMeta GruvboxYellow +hi! link clojureDeref GruvboxYellow +hi! link clojureQuote GruvboxYellow +hi! link clojureUnquote GruvboxYellow + +" }}} +" C: {{{ + +hi! link cOperator GruvboxPurple +hi! link cStructure GruvboxOrange + +" }}} +" Python: {{{ + +hi! link pythonBuiltin GruvboxOrange +hi! link pythonBuiltinObj GruvboxOrange +hi! link pythonBuiltinFunc GruvboxOrange +hi! link pythonFunction GruvboxAqua +hi! link pythonDecorator GruvboxRed +hi! link pythonInclude GruvboxBlue +hi! link pythonImport GruvboxBlue +hi! link pythonRun GruvboxBlue +hi! link pythonCoding GruvboxBlue +hi! link pythonOperator GruvboxRed +hi! link pythonException GruvboxRed +hi! link pythonExceptions GruvboxPurple +hi! link pythonBoolean GruvboxPurple +hi! link pythonDot GruvboxFg3 +hi! link pythonConditional GruvboxRed +hi! link pythonRepeat GruvboxRed +hi! link pythonDottedName GruvboxGreenBold + +" }}} +" CSS: {{{ + +hi! link cssBraces GruvboxBlue +hi! link cssFunctionName GruvboxYellow +hi! link cssIdentifier GruvboxOrange +hi! link cssClassName GruvboxGreen +hi! link cssColor GruvboxBlue +hi! link cssSelectorOp GruvboxBlue +hi! link cssSelectorOp2 GruvboxBlue +hi! link cssImportant GruvboxGreen +hi! link cssVendor GruvboxFg1 + +hi! link cssTextProp GruvboxAqua +hi! link cssAnimationProp GruvboxAqua +hi! link cssUIProp GruvboxYellow +hi! link cssTransformProp GruvboxAqua +hi! link cssTransitionProp GruvboxAqua +hi! link cssPrintProp GruvboxAqua +hi! link cssPositioningProp GruvboxYellow +hi! link cssBoxProp GruvboxAqua +hi! link cssFontDescriptorProp GruvboxAqua +hi! link cssFlexibleBoxProp GruvboxAqua +hi! link cssBorderOutlineProp GruvboxAqua +hi! link cssBackgroundProp GruvboxAqua +hi! link cssMarginProp GruvboxAqua +hi! link cssListProp GruvboxAqua +hi! link cssTableProp GruvboxAqua +hi! link cssFontProp GruvboxAqua +hi! link cssPaddingProp GruvboxAqua +hi! link cssDimensionProp GruvboxAqua +hi! link cssRenderProp GruvboxAqua +hi! link cssColorProp GruvboxAqua +hi! link cssGeneratedContentProp GruvboxAqua + +" }}} +" JavaScript: {{{ + +hi! link javaScriptBraces GruvboxFg1 +hi! link javaScriptFunction GruvboxAqua +hi! link javaScriptIdentifier GruvboxRed +hi! link javaScriptMember GruvboxBlue +hi! link javaScriptNumber GruvboxPurple +hi! link javaScriptNull GruvboxPurple +hi! link javaScriptParens GruvboxFg3 + +" }}} +" YAJS: {{{ + +hi! link javascriptImport GruvboxAqua +hi! link javascriptExport GruvboxAqua +hi! link javascriptClassKeyword GruvboxAqua +hi! link javascriptClassExtends GruvboxAqua +hi! link javascriptDefault GruvboxAqua + +hi! link javascriptClassName GruvboxYellow +hi! link javascriptClassSuperName GruvboxYellow +hi! link javascriptGlobal GruvboxYellow + +hi! link javascriptEndColons GruvboxFg1 +hi! link javascriptFuncArg GruvboxFg1 +hi! link javascriptGlobalMethod GruvboxFg1 +hi! link javascriptNodeGlobal GruvboxFg1 +hi! link javascriptBOMWindowProp GruvboxFg1 +hi! link javascriptArrayMethod GruvboxFg1 +hi! link javascriptArrayStaticMethod GruvboxFg1 +hi! link javascriptCacheMethod GruvboxFg1 +hi! link javascriptDateMethod GruvboxFg1 +hi! link javascriptMathStaticMethod GruvboxFg1 + +" hi! link javascriptProp GruvboxFg1 +hi! link javascriptURLUtilsProp GruvboxFg1 +hi! link javascriptBOMNavigatorProp GruvboxFg1 +hi! link javascriptDOMDocMethod GruvboxFg1 +hi! link javascriptDOMDocProp GruvboxFg1 +hi! link javascriptBOMLocationMethod GruvboxFg1 +hi! link javascriptBOMWindowMethod GruvboxFg1 +hi! link javascriptStringMethod GruvboxFg1 + +hi! link javascriptVariable GruvboxOrange +" hi! link javascriptVariable GruvboxRed +" hi! link javascriptIdentifier GruvboxOrange +" hi! link javascriptClassSuper GruvboxOrange +hi! link javascriptIdentifier GruvboxOrange +hi! link javascriptClassSuper GruvboxOrange + +" hi! link javascriptFuncKeyword GruvboxOrange +" hi! link javascriptAsyncFunc GruvboxOrange +hi! link javascriptFuncKeyword GruvboxAqua +hi! link javascriptAsyncFunc GruvboxAqua +hi! link javascriptClassStatic GruvboxOrange + +hi! link javascriptOperator GruvboxRed +hi! link javascriptForOperator GruvboxRed +hi! link javascriptYield GruvboxRed +hi! link javascriptExceptions GruvboxRed +hi! link javascriptMessage GruvboxRed + +hi! link javascriptTemplateSB GruvboxAqua +hi! link javascriptTemplateSubstitution GruvboxFg1 + +" hi! link javascriptLabel GruvboxBlue +" hi! link javascriptObjectLabel GruvboxBlue +" hi! link javascriptPropertyName GruvboxBlue +hi! link javascriptLabel GruvboxFg1 +hi! link javascriptObjectLabel GruvboxFg1 +hi! link javascriptPropertyName GruvboxFg1 + +hi! link javascriptLogicSymbols GruvboxFg1 +hi! link javascriptArrowFunc GruvboxYellow + +hi! link javascriptDocParamName GruvboxFg4 +hi! link javascriptDocTags GruvboxFg4 +hi! link javascriptDocNotation GruvboxFg4 +hi! link javascriptDocParamType GruvboxFg4 +hi! link javascriptDocNamedParamType GruvboxFg4 + +hi! link javascriptBrackets GruvboxFg1 +hi! link javascriptDOMElemAttrs GruvboxFg1 +hi! link javascriptDOMEventMethod GruvboxFg1 +hi! link javascriptDOMNodeMethod GruvboxFg1 +hi! link javascriptDOMStorageMethod GruvboxFg1 +hi! link javascriptHeadersMethod GruvboxFg1 + +hi! link javascriptAsyncFuncKeyword GruvboxRed +hi! link javascriptAwaitFuncKeyword GruvboxRed + +" }}} +" PanglossJS: {{{ + +hi! link jsClassKeyword GruvboxAqua +hi! link jsExtendsKeyword GruvboxAqua +hi! link jsExportDefault GruvboxAqua +hi! link jsTemplateBraces GruvboxAqua +hi! link jsGlobalNodeObjects GruvboxFg1 +hi! link jsGlobalObjects GruvboxFg1 +hi! link jsFunction GruvboxAqua +hi! link jsFuncParens GruvboxFg3 +hi! link jsParens GruvboxFg3 +hi! link jsNull GruvboxPurple +hi! link jsUndefined GruvboxPurple +hi! link jsClassDefinition GruvboxYellow + +" }}} +" TypeScript: {{{ + +hi! link typeScriptReserved GruvboxAqua +hi! link typeScriptLabel GruvboxAqua +hi! link typeScriptFuncKeyword GruvboxAqua +hi! link typeScriptIdentifier GruvboxOrange +hi! link typeScriptBraces GruvboxFg1 +hi! link typeScriptEndColons GruvboxFg1 +hi! link typeScriptDOMObjects GruvboxFg1 +hi! link typeScriptAjaxMethods GruvboxFg1 +hi! link typeScriptLogicSymbols GruvboxFg1 +hi! link typeScriptDocSeeTag Comment +hi! link typeScriptDocParam Comment +hi! link typeScriptDocTags vimCommentTitle +hi! link typeScriptGlobalObjects GruvboxFg1 +hi! link typeScriptParens GruvboxFg3 +hi! link typeScriptOpSymbols GruvboxFg3 +hi! link typeScriptHtmlElemProperties GruvboxFg1 +hi! link typeScriptNull GruvboxPurple +hi! link typeScriptInterpolationDelimiter GruvboxAqua + +" }}} +" PureScript: {{{ + +hi! link purescriptModuleKeyword GruvboxAqua +hi! link purescriptModuleName GruvboxFg1 +hi! link purescriptWhere GruvboxAqua +hi! link purescriptDelimiter GruvboxFg4 +hi! link purescriptType GruvboxFg1 +hi! link purescriptImportKeyword GruvboxAqua +hi! link purescriptHidingKeyword GruvboxAqua +hi! link purescriptAsKeyword GruvboxAqua +hi! link purescriptStructure GruvboxAqua +hi! link purescriptOperator GruvboxBlue + +hi! link purescriptTypeVar GruvboxFg1 +hi! link purescriptConstructor GruvboxFg1 +hi! link purescriptFunction GruvboxFg1 +hi! link purescriptConditional GruvboxOrange +hi! link purescriptBacktick GruvboxOrange + +" }}} +" CoffeeScript: {{{ + +hi! link coffeeExtendedOp GruvboxFg3 +hi! link coffeeSpecialOp GruvboxFg3 +hi! link coffeeCurly GruvboxOrange +hi! link coffeeParen GruvboxFg3 +hi! link coffeeBracket GruvboxOrange + +" }}} +" Ruby: {{{ + +hi! link rubyStringDelimiter GruvboxGreen +hi! link rubyInterpolationDelimiter GruvboxAqua + +" }}} +" ObjectiveC: {{{ + +hi! link objcTypeModifier GruvboxRed +hi! link objcDirective GruvboxBlue + +" }}} +" Go: {{{ + +hi! link goDirective GruvboxAqua +hi! link goConstants GruvboxPurple +hi! link goDeclaration GruvboxRed +hi! link goDeclType GruvboxBlue +hi! link goBuiltins GruvboxOrange + +" }}} +" Lua: {{{ + +hi! link luaIn GruvboxRed +hi! link luaFunction GruvboxAqua +hi! link luaTable GruvboxOrange + +" }}} +" MoonScript: {{{ + +hi! link moonSpecialOp GruvboxFg3 +hi! link moonExtendedOp GruvboxFg3 +hi! link moonFunction GruvboxFg3 +hi! link moonObject GruvboxYellow + +" }}} +" Java: {{{ + +hi! link javaAnnotation GruvboxBlue +hi! link javaDocTags GruvboxAqua +hi! link javaCommentTitle vimCommentTitle +hi! link javaParen GruvboxFg3 +hi! link javaParen1 GruvboxFg3 +hi! link javaParen2 GruvboxFg3 +hi! link javaParen3 GruvboxFg3 +hi! link javaParen4 GruvboxFg3 +hi! link javaParen5 GruvboxFg3 +hi! link javaOperator GruvboxOrange + +hi! link javaVarArg GruvboxGreen + +" }}} +" Elixir: {{{ + +hi! link elixirDocString Comment + +hi! link elixirStringDelimiter GruvboxGreen +hi! link elixirInterpolationDelimiter GruvboxAqua + +hi! link elixirModuleDeclaration GruvboxYellow + +" }}} +" Scala: {{{ + +" NB: scala vim syntax file is kinda horrible +hi! link scalaNameDefinition GruvboxFg1 +hi! link scalaCaseFollowing GruvboxFg1 +hi! link scalaCapitalWord GruvboxFg1 +hi! link scalaTypeExtension GruvboxFg1 + +hi! link scalaKeyword GruvboxRed +hi! link scalaKeywordModifier GruvboxRed + +hi! link scalaSpecial GruvboxAqua +hi! link scalaOperator GruvboxFg1 + +hi! link scalaTypeDeclaration GruvboxYellow +hi! link scalaTypeTypePostDeclaration GruvboxYellow + +hi! link scalaInstanceDeclaration GruvboxFg1 +hi! link scalaInterpolation GruvboxAqua + +" }}} +" Markdown: {{{ + +call s:HL('markdownItalic', s:fg3, s:none, s:italic) + +hi! link markdownH1 GruvboxGreenBold +hi! link markdownH2 GruvboxGreenBold +hi! link markdownH3 GruvboxYellowBold +hi! link markdownH4 GruvboxYellowBold +hi! link markdownH5 GruvboxYellow +hi! link markdownH6 GruvboxYellow + +hi! link markdownCode GruvboxAqua +hi! link markdownCodeBlock GruvboxAqua +hi! link markdownCodeDelimiter GruvboxAqua + +hi! link markdownBlockquote GruvboxGray +hi! link markdownListMarker GruvboxGray +hi! link markdownOrderedListMarker GruvboxGray +hi! link markdownRule GruvboxGray +hi! link markdownHeadingRule GruvboxGray + +hi! link markdownUrlDelimiter GruvboxFg3 +hi! link markdownLinkDelimiter GruvboxFg3 +hi! link markdownLinkTextDelimiter GruvboxFg3 + +hi! link markdownHeadingDelimiter GruvboxOrange +hi! link markdownUrl GruvboxPurple +hi! link markdownUrlTitleDelimiter GruvboxGreen + +call s:HL('markdownLinkText', s:gray, s:none, s:underline) +hi! link markdownIdDeclaration markdownLinkText + +" }}} +" Haskell: {{{ + +" hi! link haskellType GruvboxYellow +" hi! link haskellOperators GruvboxOrange +" hi! link haskellConditional GruvboxAqua +" hi! link haskellLet GruvboxOrange +" +hi! link haskellType GruvboxFg1 +hi! link haskellIdentifier GruvboxFg1 +hi! link haskellSeparator GruvboxFg1 +hi! link haskellDelimiter GruvboxFg4 +hi! link haskellOperators GruvboxBlue +" +hi! link haskellBacktick GruvboxOrange +hi! link haskellStatement GruvboxOrange +hi! link haskellConditional GruvboxOrange + +hi! link haskellLet GruvboxAqua +hi! link haskellDefault GruvboxAqua +hi! link haskellWhere GruvboxAqua +hi! link haskellBottom GruvboxAqua +hi! link haskellBlockKeywords GruvboxAqua +hi! link haskellImportKeywords GruvboxAqua +hi! link haskellDeclKeyword GruvboxAqua +hi! link haskellDeriving GruvboxAqua +hi! link haskellAssocType GruvboxAqua + +hi! link haskellNumber GruvboxPurple +hi! link haskellPragma GruvboxPurple + +hi! link haskellString GruvboxGreen +hi! link haskellChar GruvboxGreen + +" }}} +" Json: {{{ + +hi! link jsonKeyword GruvboxGreen +hi! link jsonQuote GruvboxGreen +hi! link jsonBraces GruvboxFg1 +hi! link jsonString GruvboxFg1 + +" }}} + + +" Functions ------------------------------------------------------------------- +" Search Highlighting Cursor {{{ + +function! GruvboxHlsShowCursor() + call s:HL('Cursor', s:bg0, s:hls_cursor) +endfunction + +function! GruvboxHlsHideCursor() + call s:HL('Cursor', s:none, s:none, s:inverse) +endfunction + +" }}} + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/.config/nvim/colors/gruvbox/gruvbox_256palette.sh b/.config/nvim/colors/gruvbox/gruvbox_256palette.sh new file mode 100755 index 0000000..c7fd190 --- /dev/null +++ b/.config/nvim/colors/gruvbox/gruvbox_256palette.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +if [ "${TERM%%-*}" = "screen" ]; then + if [ -n "$TMUX" ]; then + printf "\033Ptmux;\033\033]4;236;rgb:32/30/2f\007\033\\" + printf "\033Ptmux;\033\033]4;234;rgb:1d/20/21\007\033\\" + + printf "\033Ptmux;\033\033]4;235;rgb:28/28/28\007\033\\" + printf "\033Ptmux;\033\033]4;237;rgb:3c/38/36\007\033\\" + printf "\033Ptmux;\033\033]4;239;rgb:50/49/45\007\033\\" + printf "\033Ptmux;\033\033]4;241;rgb:66/5c/54\007\033\\" + printf "\033Ptmux;\033\033]4;243;rgb:7c/6f/64\007\033\\" + + printf "\033Ptmux;\033\033]4;244;rgb:92/83/74\007\033\\" + printf "\033Ptmux;\033\033]4;245;rgb:92/83/74\007\033\\" + + printf "\033Ptmux;\033\033]4;228;rgb:f2/e5/bc\007\033\\" + printf "\033Ptmux;\033\033]4;230;rgb:f9/f5/d7\007\033\\" + + printf "\033Ptmux;\033\033]4;229;rgb:fb/f1/c7\007\033\\" + printf "\033Ptmux;\033\033]4;223;rgb:eb/db/b2\007\033\\" + printf "\033Ptmux;\033\033]4;250;rgb:d5/c4/a1\007\033\\" + printf "\033Ptmux;\033\033]4;248;rgb:bd/ae/93\007\033\\" + printf "\033Ptmux;\033\033]4;246;rgb:a8/99/84\007\033\\" + + printf "\033Ptmux;\033\033]4;167;rgb:fb/49/34\007\033\\" + printf "\033Ptmux;\033\033]4;142;rgb:b8/bb/26\007\033\\" + printf "\033Ptmux;\033\033]4;214;rgb:fa/bd/2f\007\033\\" + printf "\033Ptmux;\033\033]4;109;rgb:83/a5/98\007\033\\" + printf "\033Ptmux;\033\033]4;175;rgb:d3/86/9b\007\033\\" + printf "\033Ptmux;\033\033]4;108;rgb:8e/c0/7c\007\033\\" + printf "\033Ptmux;\033\033]4;208;rgb:fe/80/19\007\033\\" + + printf "\033Ptmux;\033\033]4;88;rgb:9d/00/06\007\033\\" + printf "\033Ptmux;\033\033]4;100;rgb:79/74/0e\007\033\\" + printf "\033Ptmux;\033\033]4;136;rgb:b5/76/14\007\033\\" + printf "\033Ptmux;\033\033]4;24;rgb:07/66/78\007\033\\" + printf "\033Ptmux;\033\033]4;96;rgb:8f/3f/71\007\033\\" + printf "\033Ptmux;\033\033]4;66;rgb:42/7b/58\007\033\\" + printf "\033Ptmux;\033\033]4;130;rgb:af/3a/03\007\033\\" + else + printf "\033P\033]4;236;rgb:32/30/2f\007\033\\" + printf "\033P\033]4;234;rgb:1d/20/21\007\033\\" + + printf "\033P\033]4;235;rgb:28/28/28\007\033\\" + printf "\033P\033]4;237;rgb:3c/38/36\007\033\\" + printf "\033P\033]4;239;rgb:50/49/45\007\033\\" + printf "\033P\033]4;241;rgb:66/5c/54\007\033\\" + printf "\033P\033]4;243;rgb:7c/6f/64\007\033\\" + + printf "\033P\033]4;244;rgb:92/83/74\007\033\\" + printf "\033P\033]4;245;rgb:92/83/74\007\033\\" + + printf "\033P\033]4;228;rgb:f2/e5/bc\007\033\\" + printf "\033P\033]4;230;rgb:f9/f5/d7\007\033\\" + + printf "\033P\033]4;229;rgb:fb/f1/c7\007\033\\" + printf "\033P\033]4;223;rgb:eb/db/b2\007\033\\" + printf "\033P\033]4;250;rgb:d5/c4/a1\007\033\\" + printf "\033P\033]4;248;rgb:bd/ae/93\007\033\\" + printf "\033P\033]4;246;rgb:a8/99/84\007\033\\" + + printf "\033P\033]4;167;rgb:fb/49/34\007\033\\" + printf "\033P\033]4;142;rgb:b8/bb/26\007\033\\" + printf "\033P\033]4;214;rgb:fa/bd/2f\007\033\\" + printf "\033P\033]4;109;rgb:83/a5/98\007\033\\" + printf "\033P\033]4;175;rgb:d3/86/9b\007\033\\" + printf "\033P\033]4;108;rgb:8e/c0/7c\007\033\\" + printf "\033P\033]4;208;rgb:fe/80/19\007\033\\" + + printf "\033P\033]4;88;rgb:9d/00/06\007\033\\" + printf "\033P\033]4;100;rgb:79/74/0e\007\033\\" + printf "\033P\033]4;136;rgb:b5/76/14\007\033\\" + printf "\033P\033]4;24;rgb:07/66/78\007\033\\" + printf "\033P\033]4;96;rgb:8f/3f/71\007\033\\" + printf "\033P\033]4;66;rgb:42/7b/58\007\033\\" + printf "\033P\033]4;130;rgb:af/3a/03\007\033\\" + fi + +elif [ "$TERM" != "linux" ] && [ "$TERM" != "vt100" ] && [ "$TERM" != "vt220" ]; then + + printf "\033]4;236;rgb:32/30/2f\033\\" + printf "\033]4;234;rgb:1d/20/21\033\\" + + printf "\033]4;235;rgb:28/28/28\033\\" + printf "\033]4;237;rgb:3c/38/36\033\\" + printf "\033]4;239;rgb:50/49/45\033\\" + printf "\033]4;241;rgb:66/5c/54\033\\" + printf "\033]4;243;rgb:7c/6f/64\033\\" + + printf "\033]4;244;rgb:92/83/74\033\\" + printf "\033]4;245;rgb:92/83/74\033\\" + + printf "\033]4;228;rgb:f2/e5/bc\033\\" + printf "\033]4;230;rgb:f9/f5/d7\033\\" + + printf "\033]4;229;rgb:fb/f1/c7\033\\" + printf "\033]4;223;rgb:eb/db/b2\033\\" + printf "\033]4;250;rgb:d5/c4/a1\033\\" + printf "\033]4;248;rgb:bd/ae/93\033\\" + printf "\033]4;246;rgb:a8/99/84\033\\" + + printf "\033]4;167;rgb:fb/49/34\033\\" + printf "\033]4;142;rgb:b8/bb/26\033\\" + printf "\033]4;214;rgb:fa/bd/2f\033\\" + printf "\033]4;109;rgb:83/a5/98\033\\" + printf "\033]4;175;rgb:d3/86/9b\033\\" + printf "\033]4;108;rgb:8e/c0/7c\033\\" + printf "\033]4;208;rgb:fe/80/19\033\\" + + printf "\033]4;88;rgb:9d/00/06\033\\" + printf "\033]4;100;rgb:79/74/0e\033\\" + printf "\033]4;136;rgb:b5/76/14\033\\" + printf "\033]4;24;rgb:07/66/78\033\\" + printf "\033]4;96;rgb:8f/3f/71\033\\" + printf "\033]4;66;rgb:42/7b/58\033\\" + printf "\033]4;130;rgb:af/3a/03\033\\" +fi diff --git a/.config/nvim/colors/gruvbox/gruvbox_256palette_osx.sh b/.config/nvim/colors/gruvbox/gruvbox_256palette_osx.sh new file mode 100755 index 0000000..ad5111a --- /dev/null +++ b/.config/nvim/colors/gruvbox/gruvbox_256palette_osx.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +if [ "${TERM%%-*}" = "screen" ]; then + if [ -n "$TMUX" ]; then + printf "\033Ptmux;\033\033]4;236;rgb:26/24/23\007\033\\" + printf "\033Ptmux;\033\033]4;234;rgb:16/18/19\007\033\\" + + printf "\033Ptmux;\033\033]4;235;rgb:1e/1e/1e\007\033\\" + printf "\033Ptmux;\033\033]4;237;rgb:2e/2a/29\007\033\\" + printf "\033Ptmux;\033\033]4;239;rgb:3f/39/35\007\033\\" + printf "\033Ptmux;\033\033]4;241;rgb:53/4a/42\007\033\\" + printf "\033Ptmux;\033\033]4;243;rgb:68/5c/51\007\033\\" + + printf "\033Ptmux;\033\033]4;244;rgb:7f/70/61\007\033\\" + printf "\033Ptmux;\033\033]4;245;rgb:7f/70/61\007\033\\" + + printf "\033Ptmux;\033\033]4;228;rgb:ef/df/ae\007\033\\" + printf "\033Ptmux;\033\033]4;230;rgb:f8/f4/cd\007\033\\" + + printf "\033Ptmux;\033\033]4;229;rgb:fa/ee/bb\007\033\\" + printf "\033Ptmux;\033\033]4;223;rgb:e6/d4/a3\007\033\\" + printf "\033Ptmux;\033\033]4;250;rgb:cb/b8/90\007\033\\" + printf "\033Ptmux;\033\033]4;248;rgb:af/9f/81\007\033\\" + printf "\033Ptmux;\033\033]4;246;rgb:97/87/71\007\033\\" + + printf "\033Ptmux;\033\033]4;167;rgb:f7/30/28\007\033\\" + printf "\033Ptmux;\033\033]4;142;rgb:aa/b0/1e\007\033\\" + printf "\033Ptmux;\033\033]4;214;rgb:f7/b1/25\007\033\\" + printf "\033Ptmux;\033\033]4;109;rgb:71/95/86\007\033\\" + printf "\033Ptmux;\033\033]4;175;rgb:c7/70/89\007\033\\" + printf "\033Ptmux;\033\033]4;108;rgb:7d/b6/69\007\033\\" + printf "\033Ptmux;\033\033]4;208;rgb:fb/6a/16\007\033\\" + + printf "\033Ptmux;\033\033]4;88;rgb:89/00/09\007\033\\" + printf "\033Ptmux;\033\033]4;100;rgb:66/62/0d\007\033\\" + printf "\033Ptmux;\033\033]4;136;rgb:a5/63/11\007\033\\" + printf "\033Ptmux;\033\033]4;24;rgb:0e/53/65\007\033\\" + printf "\033Ptmux;\033\033]4;96;rgb:7b/2b/5e\007\033\\" + printf "\033Ptmux;\033\033]4;66;rgb:35/6a/46\007\033\\" + printf "\033Ptmux;\033\033]4;130;rgb:9d/28/07\007\033\\" + else + printf "\033P\033]4;236;rgb:26/24/23\007\033\\" + printf "\033P\033]4;234;rgb:16/18/19\007\033\\" + + printf "\033P\033]4;235;rgb:1e/1e/1e\007\033\\" + printf "\033P\033]4;237;rgb:2e/2a/29\007\033\\" + printf "\033P\033]4;239;rgb:3f/39/35\007\033\\" + printf "\033P\033]4;241;rgb:53/4a/42\007\033\\" + printf "\033P\033]4;243;rgb:68/5c/51\007\033\\" + + printf "\033P\033]4;244;rgb:7f/70/61\007\033\\" + printf "\033P\033]4;245;rgb:7f/70/61\007\033\\" + + printf "\033P\033]4;228;rgb:ef/df/ae\007\033\\" + printf "\033P\033]4;230;rgb:f8/f4/cd\007\033\\" + + printf "\033P\033]4;229;rgb:fa/ee/bb\007\033\\" + printf "\033P\033]4;223;rgb:e6/d4/a3\007\033\\" + printf "\033P\033]4;250;rgb:cb/b8/90\007\033\\" + printf "\033P\033]4;248;rgb:af/9f/81\007\033\\" + printf "\033P\033]4;246;rgb:97/87/71\007\033\\" + + printf "\033P\033]4;167;rgb:f7/30/28\007\033\\" + printf "\033P\033]4;142;rgb:aa/b0/1e\007\033\\" + printf "\033P\033]4;214;rgb:f7/b1/25\007\033\\" + printf "\033P\033]4;109;rgb:71/95/86\007\033\\" + printf "\033P\033]4;175;rgb:c7/70/89\007\033\\" + printf "\033P\033]4;108;rgb:7d/b6/69\007\033\\" + printf "\033P\033]4;208;rgb:fb/6a/16\007\033\\" + + printf "\033P\033]4;88;rgb:89/00/09\007\033\\" + printf "\033P\033]4;100;rgb:66/62/0d\007\033\\" + printf "\033P\033]4;136;rgb:a5/63/11\007\033\\" + printf "\033P\033]4;24;rgb:0e/53/65\007\033\\" + printf "\033P\033]4;96;rgb:7b/2b/5e\007\033\\" + printf "\033P\033]4;66;rgb:35/6a/46\007\033\\" + printf "\033P\033]4;130;rgb:9d/28/07\007\033\\" + fi +else + printf "\033]4;236;rgb:26/24/23\033\\" + printf "\033]4;234;rgb:16/18/19\033\\" + + printf "\033]4;235;rgb:1e/1e/1e\033\\" + printf "\033]4;237;rgb:2e/2a/29\033\\" + printf "\033]4;239;rgb:3f/39/35\033\\" + printf "\033]4;241;rgb:53/4a/42\033\\" + printf "\033]4;243;rgb:68/5c/51\033\\" + + printf "\033]4;244;rgb:7f/70/61\033\\" + printf "\033]4;245;rgb:7f/70/61\033\\" + + printf "\033]4;228;rgb:ef/df/ae\033\\" + printf "\033]4;230;rgb:f8/f4/cd\033\\" + + printf "\033]4;229;rgb:fa/ee/bb\033\\" + printf "\033]4;223;rgb:e6/d4/a3\033\\" + printf "\033]4;250;rgb:cb/b8/90\033\\" + printf "\033]4;248;rgb:af/9f/81\033\\" + printf "\033]4;246;rgb:97/87/71\033\\" + + printf "\033]4;167;rgb:f7/30/28\033\\" + printf "\033]4;142;rgb:aa/b0/1e\033\\" + printf "\033]4;214;rgb:f7/b1/25\033\\" + printf "\033]4;109;rgb:71/95/86\033\\" + printf "\033]4;175;rgb:c7/70/89\033\\" + printf "\033]4;108;rgb:7d/b6/69\033\\" + printf "\033]4;208;rgb:fb/6a/16\033\\" + + printf "\033]4;88;rgb:89/00/09\033\\" + printf "\033]4;100;rgb:66/62/0d\033\\" + printf "\033]4;136;rgb:a5/63/11\033\\" + printf "\033]4;24;rgb:0e/53/65\033\\" + printf "\033]4;96;rgb:7b/2b/5e\033\\" + printf "\033]4;66;rgb:35/6a/46\033\\" + printf "\033]4;130;rgb:9d/28/07\033\\" +fi diff --git a/.config/nvim/colors/gruvbox/package.json b/.config/nvim/colors/gruvbox/package.json new file mode 100755 index 0000000..355c180 --- /dev/null +++ b/.config/nvim/colors/gruvbox/package.json @@ -0,0 +1,10 @@ +{ + "name": "gruvbox", + "version": "2.0.0", + "repository": "git@github.com:morhetz/gruvbox.git", + "author": "Pavel Pertsev ", + "license": "MIT", + "vim": { + "opt": true + } +} diff --git a/.config/nvim/colors/neodark b/.config/nvim/colors/neodark deleted file mode 160000 index 44919aa..0000000 --- a/.config/nvim/colors/neodark +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 44919aa0bebfa60e93e653fdd2a81d1c75c2e721 diff --git a/.config/nvim/colors/neodark/202020.png b/.config/nvim/colors/neodark/202020.png new file mode 100755 index 0000000..b1c373c Binary files /dev/null and b/.config/nvim/colors/neodark/202020.png differ diff --git a/.config/nvim/colors/neodark/256.png b/.config/nvim/colors/neodark/256.png new file mode 100755 index 0000000..f483cc6 Binary files /dev/null and b/.config/nvim/colors/neodark/256.png differ diff --git a/.config/nvim/colors/neodark/README.md b/.config/nvim/colors/neodark/README.md new file mode 100755 index 0000000..27badb1 --- /dev/null +++ b/.config/nvim/colors/neodark/README.md @@ -0,0 +1,87 @@ +# neodark.vim + +### Vim (True color) + +**Default color** + +![vim](https://github.com/KeitaNakamura/neodark.vim/blob/master/default.png) + +**`#202020` background color** + +![vim](https://github.com/KeitaNakamura/neodark.vim/blob/master/202020.png) + +### Vim (256 color) +![vim](https://github.com/KeitaNakamura/neodark.vim/blob/master/256.png) + +### tmux +![tmux](https://github.com/KeitaNakamura/neodark.vim/blob/master/tmux.png) + +## Installation + +### Vim +For vim-plug + +```vim +Plug 'KeitaNakamura/neodark.vim' +colorscheme neodark +``` + +If you want to change background, set the 6 digit color code: + +```vim +let g:neodark#background = '#202020' +``` + +To use 256-color in both of vim and gvim: + +```vim +let g:neodark#use_256color = 1 " default: 0 +``` + +To use your default terminal background: +```vim +let g:neodark#terminal_transparent = 1 " default: 0 +``` + +If you want solid vertical split matching the statusline: +```vim +let g:neodark#solid_vertsplit = 1 " default: 0 +``` + +[Airline](https://github.com/vim-airline/vim-airline) and [lightline](https://github.com/itchyny/lightline.vim) themes are also included. For lightline, + +```vim +let g:lightline = {} +let g:lightline.colorscheme = 'neodark' +``` + +For airline, just use! + +### Terminal +Custom terminal themes (`terms/NeoDark.terminal` for Terminal.app and `terms/NeoDark.itermcolors` for iTerm2) are also available. + +```vim +let g:neodark#use_custom_terminal_theme = 1 " default: 0 +``` + +In this case, even if you use a terminal which doesn't support true color like Terminal.app, you can get true color scheme! + +### tmux + +``` +cat tmuxcolors.conf >> ~/.tmux.conf +``` + +or + +``` +set -g @plugin 'KeitaNakamura/neodark.vim' +``` + +in `.tmux.conf` with [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm). +[tmux-statusbar](https://github.com/KeitaNakamura/tmux-statusbar) is used for tmux statusbar in the screen shot. + +## Inspiration and special thanks +* [tyrannicaltoucan/vim-deep-space](https://github.com/tyrannicaltoucan/vim-deep-space) +* [tyrannicaltoucan/vim-quantum](https://github.com/tyrannicaltoucan/vim-quantum) +* [joshdick/onedark.vim](https://github.com/joshdick/onedark.vim) diff --git a/.config/nvim/colors/neodark/autoload/airline/themes/neodark.vim b/.config/nvim/colors/neodark/autoload/airline/themes/neodark.vim new file mode 100755 index 0000000..e71bd84 --- /dev/null +++ b/.config/nvim/colors/neodark/autoload/airline/themes/neodark.vim @@ -0,0 +1,42 @@ +let g:airline#themes#neodark#palette = {} + +function! airline#themes#neodark#refresh() + let g:airline#themes#neodark#palette.accents = { + \ 'red': airline#themes#get_highlight('Error'), + \ } + + let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Statement', 'fg'], 'none') + let s:N2 = airline#themes#get_highlight('Pmenu') + let s:N3 = airline#themes#get_highlight('FoldColumn') + let g:airline#themes#neodark#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + + let group = airline#themes#get_highlight('Type') + let g:airline#themes#neodark#palette.normal_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Function', 'fg'], 'none') + let g:airline#themes#neodark#palette.insert = airline#themes#generate_color_map(s:I1, s:N2, s:N3) + let g:airline#themes#neodark#palette.insert_modified = g:airline#themes#neodark#palette.normal_modified + + let s:R1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Error', 'fg'], 'none') + let g:airline#themes#neodark#palette.replace = airline#themes#generate_color_map(s:R1, s:N2, s:N3) + let g:airline#themes#neodark#palette.replace_modified = g:airline#themes#neodark#palette.normal_modified + + let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['String', 'fg'], 'none') + let g:airline#themes#neodark#palette.visual = airline#themes#generate_color_map(s:V1, s:N2, s:N3) + let g:airline#themes#neodark#palette.visual_modified = g:airline#themes#neodark#palette.normal_modified + + let s:IA = airline#themes#get_highlight2(['NonText', 'fg'], ['CursorLine', 'bg']) + let g:airline#themes#neodark#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) + let g:airline#themes#neodark#palette.inactive_modified = g:airline#themes#neodark#palette.normal_modified + + if get(g:, 'loaded_ctrlp', 0) + let g:airline#themes#neodark#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'])) + endif +endfun + +call airline#themes#neodark#refresh() diff --git a/.config/nvim/colors/neodark/autoload/lightline/colorscheme/neodark.vim b/.config/nvim/colors/neodark/autoload/lightline/colorscheme/neodark.vim new file mode 100755 index 0000000..ff4e0d2 --- /dev/null +++ b/.config/nvim/colors/neodark/autoload/lightline/colorscheme/neodark.vim @@ -0,0 +1,64 @@ +let s:base1 = neodark#get_color('Normal', 'bg') +let s:base2 = neodark#get_color('CursorLine', 'bg') +let s:base3 = neodark#get_color('Visual', 'bg') +let s:base4 = neodark#get_color('Comment', 'fg') +let s:base5 = neodark#get_color('Normal', 'fg') + +let s:red = neodark#get_color('ErrorMsg', 'fg') +let s:green = neodark#get_color('Statement', 'fg') +let s:yellow = neodark#get_color('Type', 'fg') +let s:blue = neodark#get_color('Function', 'fg') +let s:orange = neodark#get_color('String', 'fg') + +let s:p = { + \ 'normal': {}, + \ 'inactive': {}, + \ 'insert': {}, + \ 'replace': {}, + \ 'visual': {}, + \ 'tabline': {}} + +" [[guifg, guibg, ctermfg, ctermbg], ...] +let s:p.normal.middle = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.normal.left = [ + \ [s:base1[0], s:green[0], s:base1[1], s:green[1]], + \ [s:base5[0], s:base3[0], s:base5[1], s:base3[1]]] +let s:p.normal.right = [ + \ [s:base1[0], s:base4[0], s:base1[1], s:base4[1]], + \ [s:base4[0], s:base3[0], s:base4[1], s:base3[1]]] +let s:p.normal.error = [ + \ [ s:base2[0], s:red[0], s:base2[1], s:red[1]]] +let s:p.normal.warning = [ + \ [ s:base2[0], s:yellow[0], s:base2[1], s:yellow[1]]] + +let s:p.inactive.middle = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.inactive.right = [ + \ [s:base4[0], s:base3[0], s:base4[1], s:base3[1]], + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.inactive.left = [ + \ [s:base4[0], s:base3[0], s:base4[1], s:base3[1]], + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] + +let s:p.insert.left = [ + \ [s:base1[0], s:blue[0], s:base1[1], s:blue[1]], + \ s:p.normal.left[1]] +let s:p.replace.left = [ + \ [s:base1[0], s:red[0], s:base1[1], s:red[1]], + \ s:p.normal.left[1]] +let s:p.visual.left = [ + \ [s:base1[0], s:orange[0], s:base1[1], s:orange[1]], + \ s:p.normal.left[1]] + +let s:p.tabline.middle = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.tabline.right = [ + \ [s:base1[0], s:base4[0], s:base1[1], s:base4[1]], + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.tabline.left = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.tabline.tabsel = [ + \ [s:yellow[0], s:base3[0], s:yellow[1], s:base3[1]]] + +let g:lightline#colorscheme#neodark#palette = s:p diff --git a/.config/nvim/colors/neodark/colors/neodark.vim b/.config/nvim/colors/neodark/colors/neodark.vim new file mode 100755 index 0000000..d5c408d --- /dev/null +++ b/.config/nvim/colors/neodark/colors/neodark.vim @@ -0,0 +1,391 @@ +highlight clear + +if exists('syntax_on') + syntax reset +endif + +let g:colors_name = 'neodark' + +" Functions {{{ +function! s:generate_base_colors(base1) + let b1 = s:RGB2HSL(s:hex2RGB(a:base1)) + let b2 = [b1[0], b1[1], b1[2]+5] + let b3 = [b1[0], b1[1], b2[2]+10] + let b4 = [b1[0], b1[1], b3[2]+15] + let b5 = [b1[0], b1[1], b4[2]+25] + return [a:base1, + \ s:RGB2hex(s:HSL2RGB(b2)), + \ s:RGB2hex(s:HSL2RGB(b3)), + \ s:RGB2hex(s:HSL2RGB(b4)), + \ s:RGB2hex(s:HSL2RGB(b5))] +endfunction + +function! s:hex2RGB(hex) + let R = printf("%d", "0x".a:hex[1:2]) + let G = printf("%d", "0x".a:hex[3:4]) + let B = printf("%d", "0x".a:hex[5:6]) + return [R,G,B] +endfunction + +function! s:RGB2hex(RGB) + return printf("#%x%x%x", a:RGB[0], a:RGB[1], a:RGB[2]) +endfunction + +function! s:RGB2HSL(RGB) + let R = a:RGB[0] + let G = a:RGB[1] + let B = a:RGB[2] + + let MAX = max([R, G, B]) + let MIN = min([R, G, B]) + + let H = MAX - MIN + if H > 0 + if MAX == R + let H = 60 * (G - B) / H + elseif MAX == G + let H = 60 * (B - R) / H + 120 + elseif MAX == B + let H = 60 * (R - G) / H + 240 + endif + if H < 0 + let H += 360 + endif + endif + + let CNT = (MAX + MIN) / 2 + if CNT < 128 + let S = 100 * (MAX - MIN) / (MAX + MIN) + else + let S = 100 * (MAX - MIN) / (510 - MAX - MIN) + endif + + let L = CNT * 100 / 255 + + return [H,S,L] +endfunction + +function! s:HSL2RGB(HSL) + let H = a:HSL[0] + let S = a:HSL[1] + let L = a:HSL[2] + + if L < 50 + let MAX = 255 * (L + L*S/100) / 100 + let MIN = 255 * (L - L*S/100) / 100 + else + let MAX = 255 * (L + (100-L)*S/100) / 100 + let MIN = 255 * (L - (100-L)*S/100) / 100 + endif + + if H < 60 + let R = MAX + let G = H * (MAX-MIN) / 60 + MIN + let B = MIN + elseif H < 120 + let R = (120-H) * (MAX-MIN) / 60 + MIN + let G = MAX + let B = MIN + elseif H < 180 + let R = MIN + let G = MAX + let B = (H-120) * (MAX-MIN) / 60 + MIN + elseif H < 240 + let R = MIN + let G = (240-H) * (MAX-MIN) / 60 + MIN + let B = MAX + elseif H < 300 + let R = (H-240) * (MAX-MIN) / 60 + MIN + let G = MIN + let B = MAX + else + let R = MAX + let G = MIN + let B = (360-H) * (MAX-MIN) / 60 + MIN + endif + return [R,G,B] +endfunction + +" }}} + +if !exists('g:neodark#italics') + let g:neodark#italics = 0 +endif + +if !exists('g:neodark#use_custom_terminal_theme') + let g:neodark#use_custom_terminal_theme = 0 +endif + +if !exists('g:neodark#use_256color') + let g:neodark#use_256color = 0 +endif + +if !exists('g:neodark#background') + let g:neodark#background = '' +endif + +if !exists('g:neodark#terminal_transparent') + let g:neodark#terminal_transparent = 0 +endif + +if !exists('g:neodark#solid_vertsplit') + let g:neodark#solid_vertsplit = 0 +endif + +if g:neodark#background == '' + let s:base1 = ['#1F2F38', 236] + let s:base2 = ['#263A45', 237] + let s:base3 = ['#475C69', 59] + let s:base4 = ['#658595', 245] + let s:base5 = ['#AABBC4', 250] +else + let bases = s:generate_base_colors(g:neodark#background) + let s:base1 = [bases[0], 236] + let s:base2 = [bases[1], 237] + let s:base3 = [bases[2], 59] + let s:base4 = [bases[3], 245] + let s:base5 = [bases[4], 250] +endif + +let s:red = ['#DC657D', 168] +let s:green = ['#84B97C', 108] +let s:yellow = ['#D4B261', 179] +let s:blue = ['#639EE4', 74] +let s:purple = ['#B888E2', 140] +let s:orange = ['#E18254', 173] +let s:pink = ['#E69CA0', 181] +let s:teal = ['#4BB1A7', 73] +let s:beige = ['#C7C18B', 180] +let s:light_blue = ['#72C7D1', 80] +let s:brown = ['#AE8785', 138] + +if g:neodark#use_256color == 1 + let s:base1[0] = '#303030' + let s:base2[0] = '#3a3a3a' + let s:base3[0] = '#5f5f5f' + let s:base4[0] = '#8a8a8a' + let s:base5[0] = '#bcbcbc' + + let s:red[0] = '#d75f87' + let s:green[0] = '#87af87' + let s:yellow[0] = '#d7af5f' + let s:blue[0] = '#5fafd7' + let s:purple[0] = '#af87d7' + let s:orange[0] = '#d7875f' + let s:pink[0] = '#d7afaf' + let s:teal[0] = '#5fafaf' + let s:beige[0] = '#d7af87' + let s:light_blue[0] = '#5fd7d7' + let s:brown[0] = '#af8787' +endif + +if g:neodark#use_custom_terminal_theme == 1 + let s:base1[1] = 0 + let s:base2[1] = 8 + let s:base3[1] = 13 + let s:base4[1] = 7 + let s:base5[1] = 15 + + let s:red[1] = 1 + let s:green[1] = 2 + let s:yellow[1] = 3 + let s:blue[1] = 4 + let s:purple[1] = 5 + let s:orange[1] = 6 + let s:pink[1] = 9 + let s:teal[1] = 10 + let s:beige[1] = 11 + let s:light_blue[1] = 12 + let s:brown[1] = 14 +endif + +" Transparent Background +if g:neodark#terminal_transparent == 1 + let s:base1[1] = 'none' " This doesn't work well for airline +end + +" neovim terminal colors +if has('nvim') + let g:terminal_color_0 = s:base1[0] + let g:terminal_color_1 = s:red[0] + let g:terminal_color_2 = s:green[0] + let g:terminal_color_3 = s:yellow[0] + let g:terminal_color_4 = s:blue[0] + let g:terminal_color_5 = s:purple[0] + let g:terminal_color_6 = s:orange[0] + let g:terminal_color_7 = s:base4[0] + let g:terminal_color_8 = s:base2[0] + let g:terminal_color_9 = s:pink[0] + let g:terminal_color_10 = s:teal[0] + let g:terminal_color_11 = s:beige[0] + let g:terminal_color_12 = s:light_blue[0] + let g:terminal_color_13 = s:base3[0] + let g:terminal_color_14 = s:brown[0] + let g:terminal_color_15 = s:base5[0] +endif + +" vim terminal colors +let g:terminal_ansi_colors = [s:base1[0], s:red[0], s:green[0], s:yellow[0], + \ s:blue[0], s:purple[0], s:orange[0], s:base4[0], s:base2[0], s:pink[0], + \ s:teal[0], s:beige[0], s:light_blue[0], s:base3[0], s:brown[0], s:base5[0]] + +function! s:hi(group, fg, bg, attr) + let l:attr = a:attr + if g:neodark#italics == 0 && l:attr ==? 'italic' + let l:attr = 'none' + endif + + if !empty(a:fg) + exec 'hi ' . a:group . ' guifg=' . a:fg[0] . ' ctermfg=' . a:fg[1] + endif + + if !empty(a:bg) + exec 'hi ' . a:group . ' guibg=' . a:bg[0] . ' ctermbg=' . a:bg[1] + endif + + if l:attr != '' + exec 'hi ' . a:group . ' gui=' . l:attr . ' cterm=' . l:attr . ' guisp=NONE' + endif +endfun + +" Vim Editor +call s:hi('ColorColumn', '', s:base2, '') +call s:hi('Cursor', s:base2, s:base5, '') +call s:hi('CursorColumn', '', s:base2, '') +call s:hi('CursorLine', '', s:base2, 'none') +call s:hi('CursorLineNr', s:light_blue, s:base2, 'none') +call s:hi('Directory', s:blue, '', '') +call s:hi('DiffAdd', s:green, s:base2, 'none') +call s:hi('DiffChange', s:yellow, s:base2, 'none') +call s:hi('DiffDelete', s:red, s:base2, 'none') +call s:hi('DiffText', s:blue, s:base1, 'none') +call s:hi('ErrorMsg', s:red, s:base1, 'bold') +call s:hi('FoldColumn', s:base4, s:base2, '') +call s:hi('Folded', s:base3, s:base1, '') +call s:hi('IncSearch', s:beige, '', '') +call s:hi('LineNr', s:base3, '', '') +call s:hi('MatchParen', s:light_blue, s:base1, 'underline,bold') +call s:hi('ModeMsg', s:green, '', '') +call s:hi('MoreMsg', s:green, '', '') +call s:hi('NonText', s:base4, '', 'none') +call s:hi('Normal', s:base5, s:base1, 'none') +call s:hi('Pmenu', s:base5, s:base3, '') +call s:hi('PmenuSbar', '', s:base2, '') +call s:hi('PmenuSel', s:base2, s:green, '') +call s:hi('PmenuThumb', '', s:base4, '') +call s:hi('Question', s:blue, '', 'none') +call s:hi('Search', s:base1, s:beige, '') +call s:hi('SignColumn', s:base5, s:base1, '') +call s:hi('SpecialKey', s:base4, '', '') +call s:hi('SpellBad', s:red, s:base1, 'underline') +call s:hi('SpellCap', s:brown, s:base1, 'none') +call s:hi('SpellRare', s:brown, s:base1, 'none') +call s:hi('SpellLocal', s:brown, s:base1, 'none') +call s:hi('StatusLine', s:base5, s:base3, 'none') +call s:hi('StatusLineNC', s:base2, s:base4, '') +call s:hi('TabLine', s:base4, s:base2, 'none') +call s:hi('TabLineFill', s:base4, s:base2, 'none') +call s:hi('TabLineSel', s:yellow, s:base3, 'none') +call s:hi('Title', s:orange, '', 'none') +call s:hi('Visual', s:base5, s:base3, '') +call s:hi('WarningMsg', s:red, '', '') +call s:hi('WildMenu', s:base2, s:green, '') + +" Solid bar for vertical split +if g:neodark#solid_vertsplit == 1 + call s:hi('VertSplit', s:base2, s:base2, 'none') +else + call s:hi('VertSplit', s:base4, s:base1, 'none') +endif + +" Standard Syntax +call s:hi('Comment', s:base4, '', 'italic') +call s:hi('Constant', s:red, '', '') +call s:hi('String', s:orange, '', '') +call s:hi('Character', s:orange, '', '') +call s:hi('Identifier', s:teal, '', 'none') +call s:hi('Function', s:blue, '', '') +call s:hi('Statement', s:green, '', 'none') +call s:hi('Exception', s:red, '', '') +call s:hi('PreProc', s:purple, '', '') +call s:hi('Define', s:purple, '', 'none') +call s:hi('Macro', s:purple, '', '') +call s:hi('Type', s:yellow, '', 'none') +call s:hi('StorageClass', s:teal, '', '') +call s:hi('Special', s:pink, '', '') +call s:hi('Delimiter', s:base5, '', '') +call s:hi('Underlined', s:base5, '', 'underline') +call s:hi('Error', s:red, s:base1, 'bold') +call s:hi('Todo', s:base5, s:base1, 'bold') +call s:hi('Conceal', s:beige, s:base1, '') + +" Languages {{{ +" Vim {{{ +hi! link vimFunc Function +hi! link vimUserFunc Function +call s:hi('vimLet', s:yellow, '', '') +" }}} +" Shell {{{ +hi! link shFunction Function +" }}} +" Markdown {{{ +hi! link markdownHeadingDelimiter Statement +hi! link markdownLinkDelimiter Statement +hi! link markdownLinkTextDelimiter Statement +hi! link markdownLinkText Statement +hi! link markdownURL Underlined +call s:hi('markdownCode', s:blue, '', '') +call s:hi('markdownListMarker', s:teal, '', '') +call s:hi('markdownHeadingRule', s:base4, '', '') +call s:hi('markdownCodeDelimiter', s:green, '', '') +call s:hi('markdownBold', '', '', 'bold') +call s:hi('markdownBoldItalic', '', '', 'bold,italic') +" }}} +" Pandoc markdown {{{ +call s:hi('pandocDelimitedCodeBlock', s:blue, '', '') +call s:hi('pandocDelimitedCodeBlockStart', s:base5, '', '') +call s:hi('pandocDelimitedCodeBlockEnd', s:base5, '', '') +call s:hi('pandocAtxHeader', s:orange, '', 'bold') +" }}} +" TeX {{{ +call s:hi('texRefZone', s:orange, '', '') +call s:hi('texMath', s:blue, '', '') +" }}} +" Ruby {{{ +hi! link rubyStringDelimiter String +hi! link rubyBlockParameterList rubyBlockParameter +call s:hi('rubyInterpolationDelimiter', s:teal, '', '') +" }}} +" Go {{{ +hi! link goFunctionCall Function +hi! link goMethodCall Function +" }}} +" }}} +" Plugins {{{ +" Vim-Fugitive +call s:hi('diffAdded', s:green, '', '') +call s:hi('diffRemoved', s:red, '', '') + +" Vim-Gittgutter +call s:hi('GitGutterAdd', s:green, '', '') +call s:hi('GitGutterChange', s:yellow, '', '') +call s:hi('GitGutterDelete', s:red, '', '') +call s:hi('GitGutterChangeDelete', s:orange, '', '') + +" indent-guides +call s:hi('IndentGuidesOdd', '', s:base2, '') +call s:hi('IndentGuidesEven', '', s:base2, '') + +" indentLine +let g:indentLine_color_gui = s:base3[0] +let g:indentLine_bgcolor_gui = s:base1[0] +let g:indentLine_color_term = s:base3[1] +let g:indentLine_bgcolor_term = s:base1[1] + +" Vim-Signify +hi link SignifySignAdd GitGutterAdd +hi link SignifySignChange GitGutterChange +hi link SignifySignDelete GitGutterDelete +" }}} + +set background=dark diff --git a/.config/nvim/colors/neodark/default.png b/.config/nvim/colors/neodark/default.png new file mode 100755 index 0000000..f755aa5 Binary files /dev/null and b/.config/nvim/colors/neodark/default.png differ diff --git a/.config/nvim/colors/neodark/doc/neodark.txt b/.config/nvim/colors/neodark/doc/neodark.txt new file mode 100755 index 0000000..e76f411 --- /dev/null +++ b/.config/nvim/colors/neodark/doc/neodark.txt @@ -0,0 +1,100 @@ +*neodark.txt* Modified: 2018 Oct + + + neodark.vim - Dark Colorscheme by Keita Nakamura~ + + + *neodark* +Neodark is a Vim colorscheme that runs in GUI or 256 color mode and includes +themes for terminal colors, tmux and |status-line| plugins. + +For screenshots, updates and more details please visit: +https://github.com/KeitaNakamura/neodark.vim + +1. Install |neodark-install| +2. Options |neodark-options| +3. Airline and lightline Themes |neodark-statusline| +4. Terminal Themes |neodark-terminal| +5. tmux |neodark-tmux| +6. Inspiration and Special Thanks |neodark-thanks| + +============================================================================== +1. Install *neodark-install* + +Neodark can be installed by maually moving the files to their appropriated +directories, using the native |packages| system or with a custom plugin +manager. For |vim-plug|: > + + Plug 'KeitaNakamura/neodark.vim' + colorscheme neodark +< +============================================================================== +2. Options *neodark-options* + +Supported options can be controlled by setting global variables (|g:|). +Boolean options are set with numbers `1` or `0` for true and false, +respectively. + + *g:neodark#background* {string} Default: '' + Hex color value used as custom background. > + let g:neodark#background = '#202020' +< + *g:neodark#use_256color* {boolean} Default: 0 + Use 256-color in both vim and gvim. + + *g:neodark#terminal_transparent* {boolean} Default: 0 + Use your default terminal background. + + *g:neodark#solid_vertsplit* {boolean} Default: 0 + Enable solid vertical split, matching the + statusline. + + *g:neodark#use_custom_terminal_theme* + {boolean} Default: 0 + Use the native terminal colors. + See |neodark-terminal|. + +============================================================================== +3. Airline and lightline Themes *neodark-statusline* + *neodark-airline* *neodark-lightline* + +Themes for |Airline| and |lightline| are included. To enable in lightline: > + + let g:lightline = {} + let g:lightline.colorscheme = 'neodark' +< +For airline, just use! + + - Airline: https://github.com/vim-airline/vim-airline + - lightline: https://github.com/itchyny/lightline.vim + +============================================================================== +4. Terminal Themes *neodark-terminal* + +Custom terminal themes (`terms/NeoDark.terminal` for Terminal.app and +`terms/NeoDark.itermcolors` for iTerm2) are also available. + +If you use a terminal which doesn't support true color like Terminal.app, you +can get a true color scheme by enabling |g:neodark#use_custom_terminal_theme|. + +============================================================================== +5. tmux + +You can set tmux colors with: > + cat tmuxcolors.conf >> ~/.tmux.conf +or > + set -g @plugin 'KeitaNakamura/neodark.vim' +< +in `.tmux.conf` with Tmux Plugin Manager (https://github.com/tmux-plugins/tpm). + +============================================================================== +6. Inspiration and Special Thanks + + - tyrannicaltoucan/vim-deep-space + https://github.com/tyrannicaltoucan/vim-deep-space + - tyrannicaltoucan/vim-quantum + https://github.com/tyrannicaltoucan/vim-quantum + - joshdick/onedark.vim + https://github.com/joshdick/onedark.vim + + vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/.config/nvim/colors/neodark/plugin/neodark.vim b/.config/nvim/colors/neodark/plugin/neodark.vim new file mode 100755 index 0000000..9d91864 --- /dev/null +++ b/.config/nvim/colors/neodark/plugin/neodark.vim @@ -0,0 +1,20 @@ +if exists("g:loaded_neodark") + finish +endif +let g:loaded_neodark = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function neodark#get_color(hlgroup, fg_or_bg) + let gui = synIDattr(synIDtrans(hlID(a:hlgroup)), a:fg_or_bg, 'gui') + let cterm = synIDattr(synIDtrans(hlID(a:hlgroup)), a:fg_or_bg, 'cterm') + if cterm == '' + let cterm = 'none' + endif + return [l:gui, l:cterm] +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/.config/nvim/colors/neodark/terms/NeoDark.itermcolors b/.config/nvim/colors/neodark/terms/NeoDark.itermcolors new file mode 100755 index 0000000..7e6dcda --- /dev/null +++ b/.config/nvim/colors/neodark/terms/NeoDark.itermcolors @@ -0,0 +1,344 @@ + + + + + Ansi 0 Color + + Alpha Component + 1 + Blue Component + 0.16604986786842346 + Color Space + Calibrated + Green Component + 0.13810592889785767 + Red Component + 0.093520961701869965 + + Ansi 1 Color + + Alpha Component + 1 + Blue Component + 0.41553044319152832 + Color Space + Calibrated + Green Component + 0.30194917321205139 + Red Component + 0.82076919078826904 + + Ansi 10 Color + + Alpha Component + 1 + Blue Component + 0.58926409482955933 + Color Space + Calibrated + Green Component + 0.64080047607421875 + Red Component + 0.24541383981704712 + + Ansi 11 Color + + Alpha Component + 1 + Blue Component + 0.47225937247276306 + Color Space + Calibrated + Green Component + 0.71151053905487061 + Red Component + 0.7323186993598938 + + Ansi 12 Color + + Alpha Component + 1 + Blue Component + 0.77816593647003174 + Color Space + Calibrated + Green Component + 0.73666906356811523 + Red Component + 0.38363903760910034 + + Ansi 13 Color + + Alpha Component + 1 + Blue Component + 0.33687889575958252 + Color Space + Calibrated + Green Component + 0.28850468993186951 + Red Component + 0.21723657846450806 + + Ansi 14 Color + + Alpha Component + 1 + Blue Component + 0.4471639096736908 + Color Space + Calibrated + Green Component + 0.45141583681106567 + Red Component + 0.61654645204544067 + + Ansi 15 Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Ansi 2 Color + + Alpha Component + 1 + Blue Component + 0.41127902269363403 + Color Space + Calibrated + Green Component + 0.68033838272094727 + Red Component + 0.45019713044166565 + + Ansi 3 Color + + Alpha Component + 1 + Blue Component + 0.30927106738090515 + Color Space + Calibrated + Green Component + 0.64334207773208618 + Red Component + 0.78965777158737183 + + Ansi 4 Color + + Alpha Component + 1 + Blue Component + 0.8673635721206665 + Color Space + Calibrated + Green Component + 0.54140889644622803 + Red Component + 0.32095783948898315 + + Ansi 5 Color + + Alpha Component + 1 + Blue Component + 0.85811066627502441 + Color Space + Calibrated + Green Component + 0.43545463681221008 + Red Component + 0.65922987461090088 + + Ansi 6 Color + + Alpha Component + 1 + Blue Component + 0.26240810751914978 + Color Space + Calibrated + Green Component + 0.42816618084907532 + Red Component + 0.84590542316436768 + + Ansi 7 Color + + Alpha Component + 1 + Blue Component + 0.51242685317993164 + Color Space + Calibrated + Green Component + 0.44662865996360779 + Red Component + 0.32551044225692749 + + Ansi 8 Color + + Alpha Component + 1 + Blue Component + 0.20836980640888214 + Color Space + Calibrated + Green Component + 0.17225378751754761 + Red Component + 0.1135505884885788 + + Ansi 9 Color + + Alpha Component + 1 + Blue Component + 0.56007015705108643 + Color Space + Calibrated + Green Component + 0.53337842226028442 + Red Component + 0.8708946704864502 + + Background Color + + Alpha Component + 1 + Blue Component + 0.16604986786842346 + Color Space + Calibrated + Green Component + 0.13810592889785767 + Red Component + 0.093520961701869965 + + Badge Color + + Alpha Component + 0.5 + Blue Component + 0.0 + Color Space + Calibrated + Green Component + 0.0 + Red Component + 1 + + Bold Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Cursor Color + + Alpha Component + 1 + Blue Component + 0.5 + Color Space + Calibrated + Green Component + 0.5 + Red Component + 0.5 + + Cursor Guide Color + + Alpha Component + 0.25 + Blue Component + 1 + Color Space + Calibrated + Green Component + 0.9100000262260437 + Red Component + 0.64999997615814209 + + Cursor Text Color + + Alpha Component + 1 + Blue Component + 0.83052277565002441 + Color Space + Calibrated + Green Component + 0.85444784164428711 + Red Component + 0.87751418352127075 + + Foreground Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Link Color + + Alpha Component + 1 + Blue Component + 0.8673635721206665 + Color Space + Calibrated + Green Component + 0.54140889644622803 + Red Component + 0.32095783948898315 + + Selected Text Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Selection Color + + Alpha Component + 1 + Blue Component + 0.33687889575958252 + Color Space + Calibrated + Green Component + 0.28850468993186951 + Red Component + 0.21723657846450806 + + + diff --git a/.config/nvim/colors/neodark/terms/NeoDark.terminal b/.config/nvim/colors/neodark/terms/NeoDark.terminal new file mode 100755 index 0000000..2f310d4 --- /dev/null +++ b/.config/nvim/colors/neodark/terms/NeoDark.terminal @@ -0,0 +1,559 @@ + + + + + ANSIBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjEyMTU2ODYyNzUgMC4xODQzMTM3MjU1IDAuMjE5NjA3ODQzMQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM4ODIzNTI5NDEgMC42MTk2MDc4NDMxIDAuODk0MTE3NjQ3MQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjE0OTAxOTYwNzggMC4yMjc0NTA5ODA0IDAuMjcwNTg4MjM1MwAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjQ0NzA1ODgyMzUgMC43ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightCyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY4MjM1Mjk0MTIgMC41Mjk0MTE3NjQ3IDAuNTIxNTY4NjI3NQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjI5NDExNzY0NzEgMC42OTQxMTc2NDcxIDAuNjU0OTAxOTYwOAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjI3ODQzMTM3MjUgMC4zNjA3ODQzMTM3IDAuNDExNzY0NzA1OQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightRedColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjkwMTk2MDc4NDMgMC42MTE3NjQ3MDU5IDAuNjI3NDUwOTgwNAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw + LjY2NjY2NjY2NjcgMC43MzMzMzMzMzMzIDAuNzY4NjI3NDUxABACgALSEBESE1okY2xh + c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 + ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA + ABkAAAAAAAAAAAAAAAAAAADY + + ANSIBrightYellowColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljc4MDM5MjE1NjkgMC43NTY4NjI3NDUxIDAuNTQ1MDk4MDM5MgAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSICyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg4MjM1Mjk0MTIgMC41MDk4MDM5MjE2IDAuMzI5NDExNzY0NwAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjUxNzY0NzA1ODggMC43MjU0OTAxOTYxIDAuNDg2Mjc0NTA5OAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjcyMTU2ODYyNzUgMC41MzMzMzMzMzMzIDAuODg2Mjc0NTA5OAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIRedColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjg2Mjc0NTA5 + OCAwLjM5NjA3ODQzMTQgMC40OTAxOTYwNzg0IDFPECcwLjgyMDc2OTE5MDggMC4zMDE5 + NDkxNzMyIDAuNDE1NTMwNDQzMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtgDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + ANSIWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM5NjA3ODQzMTQgMC41MjE1Njg2Mjc1IDAuNTg0MzEzNzI1NQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIYellowColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjgzMTM3MjU0 + OSAwLjY5ODAzOTIxNTcgMC4zODAzOTIxNTY5IDFPECcwLjc4OTY1Nzc3MTYgMC42NDMz + NDIwNzc3IDAuMzA5MjcxMDY3NAAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtgDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + BackgroundBlur + 0.0 + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjEyMTU2ODYy + NzUgMC4xODQzMTM3MjU1IDAuMjE5NjA3ODQzMSAxTxAnMC4wOTM1MjA5NjE3IDAuMTM4 + MTA1OTI4OSAwLjE2NjA0OTg2NzkAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + BackgroundSettingsForInactiveWindows + + Bell + + CommandString + + CursorBlink + + CursorColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjM2MDc4NDk5 + OTkgMC40NzUzMjY4MzMyIDAuNTM0MjMwMDIwMSAxTxAnMC4yOTE5NjMyNDk0IDAuMzk5 + NDU4MzQ4OCAwLjQ1OTYxMjE5MDcAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + Font + + YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs + YXNzI0AoAAAAAAAAEBCAAoADVk1vbmFjb9ITFBUWWiRjbGFzc25hbWVYJGNsYXNzZXNW + TlNGb250ohUXWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RobVHJvb3SAAQgRGiMt + Mjc8QktSW2JpcnR2eH+Ej5ifoqu9wMUAAAAAAAABAQAAAAAAAAAcAAAAAAAAAAAAAAAA + AAAAxw== + + ProfileCurrentVersion + 2.0499999999999998 + RunCommandAsShell + + SelectionColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjI3ODQzMTM3 + MjUgMC4zNjA3ODQzMTM3IDAuNDExNzY0NzA1OSAxTxAnMC4yMTcyMzY1Nzg1IDAuMjg4 + NTA0Njg5OSAwLjMzNjg3ODg5NTgAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw + LjY2NjY2NjY2NjcgMC43MzMzMzMzMzMzIDAuNzY4NjI3NDUxABACgALSEBESE1okY2xh + c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 + ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA + ABkAAAAAAAAAAAAAAAAAAADY + + TextColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw + LjY2NjY2NjY2NjcgMC43MzMzMzMzMzMzIDAuNzY4NjI3NDUxABACgALSEBESE1okY2xh + c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 + ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA + ABkAAAAAAAAAAAAAAAAAAADY + + VisualBell + + name + NeoDark + type + Window Settings + + diff --git a/.config/nvim/colors/neodark/test/test.rb b/.config/nvim/colors/neodark/test/test.rb new file mode 100755 index 0000000..b2a0900 --- /dev/null +++ b/.config/nvim/colors/neodark/test/test.rb @@ -0,0 +1,37 @@ +require 'active_support' + +module VimColors + class RubyExample + CONSTANT = /^[0-9]+ regex awesomes$/ + + attr_reader :colorscheme + + # TODO: Bacon ipsum dolor sit amet + def initialize(attributes = {}) + @colorscheme = attributes[:colorscheme] + end + + def self.examples + # Bacon ipsum dolor sit amet + ['string', :symbol, true, false, nil, 99.9, 1..2].each do |value| + puts "it appears that #{value.inspect} is a #{value.class}" + end + + {:key1 => :value1, key2: 'value2'}.each do |key, value| + puts "the #{key.inspect} key has a value of #{value.inspect}" + end + + %w[One Two Three].each { |number| puts number } + end + + private + + def heredoc_example + <<-SQL + SELECT * + FROM colorschemes + WHERE background = 'dark' + SQL + end + end +end diff --git a/.config/nvim/colors/neodark/tmux.png b/.config/nvim/colors/neodark/tmux.png new file mode 100755 index 0000000..3fdb6c7 Binary files /dev/null and b/.config/nvim/colors/neodark/tmux.png differ diff --git a/.config/nvim/colors/neodark/tmuxcolors.conf b/.config/nvim/colors/neodark/tmuxcolors.conf new file mode 100755 index 0000000..aef83f2 --- /dev/null +++ b/.config/nvim/colors/neodark/tmuxcolors.conf @@ -0,0 +1,28 @@ +# default statusbar colors +set -g status-style bg=colour235,fg=colour6 + +# default window title colors +setw -g window-status-style bg=default,fg=colour15 + +# active window title colors +setw -g window-status-current-style bg=default,fg=red + +# pane border +set -g pane-border-style fg=colour8 +set -g pane-active-border-style fg=green + +# message text +set -g message-style bg=colour235,fg=red + +# modes +setw -g mode-style bg=colour11,fg=colour13,bold + +# pane number display +set -g display-panes-active-colour green +set -g display-panes-colour blue + +# clock +setw -g clock-mode-colour blue + +# bell +# set-window-option -g window-status-bell-style fg=colour235,bg=colour160 #base02, red diff --git a/.config/nvim/colors/neodark/tmuxcolors.tmux b/.config/nvim/colors/neodark/tmuxcolors.tmux new file mode 100755 index 0000000..04d8950 --- /dev/null +++ b/.config/nvim/colors/neodark/tmuxcolors.tmux @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +tmux source-file "$CURRENT_DIR/tmuxcolors.conf" diff --git a/.config/nvim/colors/oceanic-next b/.config/nvim/colors/oceanic-next deleted file mode 160000 index 5ef31a3..0000000 --- a/.config/nvim/colors/oceanic-next +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5ef31a34204f84714885ae9036f66a626036c3dc diff --git a/.config/nvim/colors/oceanic-next/README.md b/.config/nvim/colors/oceanic-next/README.md new file mode 100755 index 0000000..e3e4951 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/README.md @@ -0,0 +1,102 @@ +# Oceanic-Next.vim + +Oceanic-Next.vim is a neovim theme inspired by [Oceanic Next for Sublime](https://github.com/voronianski/oceanic-next-color-scheme). +It is not a direct port, but uses some colors from the sublime theme, that are fitted to work with neovim and vim8. + +For best results, it is suggested that you use the following syntax plugins. + +- [yajs.vim](https://github.com/othree/yajs.vim) +- [html5.vim](https://github.com/othree/html5.vim) +- [yats.vim](https://github.com/HerringtonDarkholme/yats.vim/) + +## Installation + +All major plugin managers for vim/nvim are supported + + ```vim + 'mhartington/oceanic-next' + ``` + +For vim, add the following to your `.vimrc`. + +*(On Google Cloud Shell try to `set t_Co=256` instead of `set termguicolors` even though your vim version is 8)* + + ```viml +" Theme + syntax enable +" for vim 7 + set t_Co=256 + +" for vim 8 + if (has("termguicolors")) + set termguicolors + endif + +colorscheme OceanicNext + ``` + +For neovim, add the following to your `.nvimrc`. + + +```viml +" For Neovim 0.1.3 and 0.1.4 +let $NVIM_TUI_ENABLE_TRUE_COLOR=1 + +" Or if you have Neovim >= 0.1.5 +if (has("termguicolors")) + set termguicolors +endif + +" Theme +syntax enable +colorscheme OceanicNext +``` + +There is an included theme for vim-airline, to use it, just change the airline theme to: + +``` + let g:airline_theme='oceanicnext' +``` + +There is a light mode, but it still needs some work. +Currently, light mode has issues with cursor, need to tweak the colors a bit for that. +Also, the included airline theme could use some work in light mode. Right now it is the exact same as the dark version, I'd like to tweak this a bit. +If anyone would like to contribute, I'd be happy to accept a Pull Request. + +## Configuration + +If your terminal and setup supports it, you can enable italics and bold fonts with the following setting + +```viml + syntax on + let g:oceanic_next_terminal_bold = 1 + let g:oceanic_next_terminal_italic = 1 + colorscheme OceanicNext +``` + +If your terminal has transparancy, you can enable it in neovim by adding the +following lines to your init.vim **after** calling `colorscheme OceanicNext`: + +```viml +hi Normal guibg=NONE ctermbg=NONE +hi LineNr guibg=NONE ctermbg=NONE +hi SignColumn guibg=NONE ctermbg=NONE +hi EndOfBuffer guibg=NONE ctermbg=NONE +``` +Each line above disables the background for a given highlight group +(e.g., LineNr). You can choose which to disable. This will show your terminal's +background (whether or not it's transparent). For best results, use an Oceanic +Next color scheme in your terminal. + +## Screenshot + +Base colors used in the theme. + +![](https://raw.githubusercontent.com/voronianski/oceanic-next-theme/master/colors.png) + +_neovim_ + +![](https://raw.githubusercontent.com/mhartington/oceanic-next/master/oceanic-next-dark.nvim.png) + +Shown here with [vim-devicons](https://github.com/ryanoasis/vim-devicons) + diff --git a/.config/nvim/colors/oceanic-next/after/syntax/xml.vim b/.config/nvim/colors/oceanic-next/after/syntax/xml.vim new file mode 100755 index 0000000..c3935a5 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/after/syntax/xml.vim @@ -0,0 +1,14 @@ +" =============================================================== +" OceanicNext +" Language: XML +" Description: Overrides for XML +" Author: Mike Hartington +" Last Change: 2016/12/11 17:28 +" =============================================================== + +syn region xmlEndTag + \ start=++ + \ contains=xmlTagN +syn match xmlTagN + \ contained +hi(group, fg, bg, attr, attrsp) + " fg, bg, attr, attrsp + if !empty(a:fg) + exec "hi " . a:group . " guifg=" . a:fg[0] + exec "hi " . a:group . " ctermfg=" . a:fg[1] + endif + if !empty(a:bg) + exec "hi " . a:group . " guibg=" . a:bg[0] + exec "hi " . a:group . " ctermbg=" . a:bg[1] + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr + exec "hi " . a:group . " cterm=" . a:attr + endif + if !empty(a:attrsp) + exec "hi " . a:group . " guisp=" . a:attrsp[0] + endif +endfunction +" }}} +" {{{ call s::hi(group, fg, bg, gui, guisp) + call s:hi('Bold', '', '', s:bold, '') + call s:hi('Debug', s:red, '', '', '') + call s:hi('Directory', s:blue, '', '', '') + call s:hi('ErrorMsg', s:red, s:base00, '', '') + call s:hi('Exception', s:red, '', '', '') + call s:hi('FoldColumn', s:blue, s:base00, '', '') + call s:hi('Folded', s:base03, s:base01, s:italic, '') + call s:hi('IncSearch', s:base01, s:orange, 'NONE', '') + call s:hi('Italic', '', '', s:italic, '') + + call s:hi('Macro', s:red, '', '', '') + call s:hi('MatchParen', s:base05, s:base03, '', '') + call s:hi('ModeMsg', s:green, '', '', '') + call s:hi('MoreMsg', s:green, '', '', '') + call s:hi('Question', s:blue, '', '', '') + call s:hi('Search', s:base03, s:yellow, '', '') + call s:hi('SpecialKey', s:base03, '', '', '') + call s:hi('TooLong', s:red, '', '', '') + call s:hi('Underlined', s:red, '', '', '') + call s:hi('Visual', '', s:base02, '', '') + call s:hi('VisualNOS', s:red, '', '', '') + call s:hi('WarningMsg', s:red, '', '', '') + call s:hi('WildMenu', s:base07, s:blue, '', '') + call s:hi('Title', s:blue, '', '', '') + call s:hi('Conceal', s:blue, s:base00, '', '') + call s:hi('Cursor', s:base00, s:base05, '', '') + call s:hi('NonText', s:base03, '', '', '') + call s:hi('Normal', s:base07, s:base00, '', '') + call s:hi('EndOfBuffer', s:base05, s:base00, '', '') + call s:hi('LineNr', s:base03, s:base00, '', '') + call s:hi('SignColumn', s:base00, s:base00, '', '') + call s:hi('StatusLine', s:base01, s:base03, '', '') + call s:hi('StatusLineNC', s:base03, s:base01, '', '') + call s:hi('VertSplit', s:base00, s:base02, '', '') + call s:hi('ColorColumn', '', s:base01, '', '') + call s:hi('CursorColumn', '', s:base01, '', '') + call s:hi('CursorLine', '', s:base01, 'None', '') + call s:hi('CursorLineNR', s:base00, s:base00, '', '') + call s:hi('CursorLineNr', s:base03, s:base01, '', '') + call s:hi('PMenu', s:base04, s:base01, '', '') + call s:hi('PMenuSel', s:base07, s:blue, '', '') + call s:hi('PmenuSbar', '', s:base02, '', '') + call s:hi('PmenuThumb', '', s:base07, '', '') + call s:hi('TabLine', s:base03, s:base01, '', '') + call s:hi('TabLineFill', s:base03, s:base01, '', '') + call s:hi('TabLineSel', s:green, s:base01, '', '') + call s:hi('helpExample', s:yellow, '', '', '') + call s:hi('helpCommand', s:yellow, '', '', '') + + " Standard syntax highlighting + call s:hi('Boolean', s:orange, '', '', '') + call s:hi('Character', s:red, '', '', '') + call s:hi('Comment', s:base03, '', s:italic, '') + call s:hi('Conditional', s:purple, '', '', '') + call s:hi('Constant', s:orange, '', '', '') + call s:hi('Define', s:purple, '', '', '') + call s:hi('Delimiter', s:brown, '', '', '') + call s:hi('Float', s:orange, '', '', '') + call s:hi('Function', s:blue, '', '', '') + + call s:hi('Identifier', s:cyan, '', '', '') + call s:hi('Include', s:blue, '', '', '') + call s:hi('Keyword', s:purple, '', '', '') + + call s:hi('Label', s:yellow, '', '', '') + call s:hi('Number', s:orange, '', '', '') + call s:hi('Operator', s:base05, '', '', '') + call s:hi('PreProc', s:yellow, '', '', '') + call s:hi('Repeat', s:yellow, '', '', '') + call s:hi('Special', s:cyan, '', '', '') + call s:hi('SpecialChar', s:brown, '', '', '') + call s:hi('Statement', s:red, '', '', '') + call s:hi('StorageClass', s:yellow, '', '', '') + call s:hi('String', s:green, '', '', '') + call s:hi('Structure', s:purple, '', '', '') + call s:hi('Tag', s:yellow, '', '', '') + call s:hi('Todo', s:yellow, s:base01, '', '') + call s:hi('Type', s:yellow, '', '', '') + call s:hi('Typedef', s:yellow, '', '', '') + + " LSP + call s:hi('LspDiagnosticsDefaultError', '', '', '', '') + call s:hi('LspDiagnosticsSignError', s:red, '', '', '') + call s:hi('LspDiagnosticsUnderlineError', '', '', 'undercurl', '') + + call s:hi('LspDiagnosticsDefaultWarning', '', '', '', '') + call s:hi('LspDiagnosticsSignWarning', s:yellow, '', '', '') + call s:hi('LspDiagnosticsUnderlineWarning', '', '', 'undercurl', '') + + call s:hi('LspDiagnosticsDefaultInformation', '', '', '', '') + call s:hi('LspDiagnosticsSignInformation', s:blue, '', '', '') + call s:hi('LspDiagnosticsUnderlineInformation', '', '', 'undercurl', '') + + call s:hi('LspDiagnosticsDefaultHint', '', '', '', '') + call s:hi('LspDiagnosticsSignHint', s:cyan, '', '', '') + call s:hi('LspDiagnosticsUnderlineHint', '', '', 'undercurl', '') + + " TreeSitter stuff + call s:hi('TSInclude', s:cyan, '', '', '') + call s:hi('TSPunctBracket', s:cyan, '', '', '') + call s:hi('TSPunctDelimiter', s:base07, '', '', '') + call s:hi('TSParameter', s:base07, '', '', '') + call s:hi('TSType', s:blue, '', '', '') + call s:hi('TSFunction', s:cyan, '', '', '') + + call s:hi('TSTagDelimiter', s:cyan, '', '', '') + call s:hi('TSProperty', s:yellow, '', '', '') + call s:hi('TSMethod', s:blue, '', '', '') + call s:hi('TSParameter', s:yellow, '', '', '') + call s:hi('TSConstructor', s:base07, '', '', '') + call s:hi('TSVariable', s:base07, '', '', '') + call s:hi('TSOperator', s:base07, '', '', '') + call s:hi('TSTag', s:base07, '', '', '') + call s:hi('TSKeyword', s:purple, '', '', '') + call s:hi('TSKeywordOperator', s:purple, '', '', '') + call s:hi('TSVariableBuiltin', s:red, '', '', '') + call s:hi('TSLabel', s:cyan, '', '', '') + + call s:hi('SpellBad', '', '', 'undercurl', '') + call s:hi('SpellLocal', '', '', 'undercurl', '') + call s:hi('SpellCap', '', '', 'undercurl', '') + call s:hi('SpellRare', '', '', 'undercurl', '') + + call s:hi('csClass', s:yellow, '', '', '') + call s:hi('csAttribute', s:yellow, '', '', '') + call s:hi('csModifier', s:purple, '', '', '') + call s:hi('csType', s:red, '', '', '') + call s:hi('csUnspecifiedStatement', s:blue, '', '', '') + call s:hi('csContextualStatement', s:purple, '', '', '') + call s:hi('csNewDecleration', s:red, '', '', '') + call s:hi('cOperator', s:cyan, '', '', '') + call s:hi('cPreCondit', s:purple, '', '', '') + + call s:hi('cssColor', s:cyan, '', '', '') + call s:hi('cssBraces', s:base05, '', '', '') + call s:hi('cssClassName', s:purple, '', '', '') + + + call s:hi('DiffAdd', s:green, s:base01, s:bold, '') + call s:hi('DiffChange', s:base03, s:base01, '', '') + call s:hi('DiffDelete', s:red, s:base01, '', '') + call s:hi('DiffText', s:blue, s:base01, '', '') + call s:hi('DiffAdded', s:base07, s:green, s:bold, '') + call s:hi('DiffFile', s:red, s:base00, '', '') + call s:hi('DiffNewFile', s:green, s:base00, '', '') + call s:hi('DiffLine', s:blue, s:base00, '', '') + call s:hi('DiffRemoved', s:base07, s:red, s:bold, '') + + call s:hi('gitCommitOverflow', s:red, '', '', '') + call s:hi('gitCommitSummary', s:green, '', '', '') + + call s:hi('htmlBold', s:yellow, '', '', '') + call s:hi('htmlItalic', s:purple, '', '', '') + call s:hi('htmlTag', s:cyan, '', '', '') + call s:hi('htmlEndTag', s:cyan, '', '', '') + call s:hi('htmlArg', s:yellow, '', '', '') + call s:hi('htmlTagName', s:base07, '', '', '') + + call s:hi('javaScript', s:base05, '', '', '') + call s:hi('javaScriptNumber', s:orange, '', '', '') + call s:hi('javaScriptBraces', s:base05, '', '', '') + + call s:hi('jsonKeyword', s:green, '', '', '') + call s:hi('jsonQuote', s:green, '', '', '') + + call s:hi('markdownCode', s:green, '', '', '') + call s:hi('markdownCodeBlock', s:green, '', '', '') + call s:hi('markdownHeadingDelimiter', s:blue, '', '', '') + call s:hi('markdownItalic', s:purple, '', s:italic, '') + call s:hi('markdownBold', s:yellow, '', s:bold, '') + call s:hi('markdownCodeDelimiter', s:brown, '', s:italic, '') + call s:hi('markdownError', s:base05, s:base00, '', '') + + call s:hi('typescriptParens', s:base05, s:none, '', '') + + call s:hi('NeomakeErrorSign', s:red, s:base00, '', '') + call s:hi('NeomakeWarningSign', s:yellow, s:base00, '', '') + call s:hi('NeomakeInfoSign', s:white, s:base00, '', '') + call s:hi('NeomakeError', s:red, '', 'underline', s:red) + call s:hi('NeomakeWarning', s:red, '', 'underline', s:red) + + call s:hi('ALEErrorSign', s:red, s:base00, s:bold, '') + call s:hi('ALEWarningSign', s:yellow, s:base00, s:bold, '') + call s:hi('ALEInfoSign', s:white, s:base00, s:bold, '') + + call s:hi('NERDTreeExecFile', s:base05, '', '', '') + call s:hi('NERDTreeDirSlash', s:blue, '', '', '') + call s:hi('NERDTreeOpenable', s:blue, '', '', '') + call s:hi('NERDTreeFile', '', s:none, '', '') + call s:hi('NERDTreeFlags', s:blue, '', '', '') + + call s:hi('phpComparison', s:base05, '', '', '') + call s:hi('phpParent', s:base05, '', '', '') + call s:hi('phpMemberSelector', s:base05, '', '', '') + + call s:hi('pythonRepeat', s:purple, '', '', '') + call s:hi('pythonOperator', s:purple, '', '', '') + + call s:hi('rubyConstant', s:yellow, '', '', '') + call s:hi('rubySymbol', s:green, '', '', '') + call s:hi('rubyAttribute', s:blue, '', '', '') + call s:hi('rubyInterpolation', s:green, '', '', '') + call s:hi('rubyInterpolationDelimiter', s:brown, '', '', '') + call s:hi('rubyStringDelimiter', s:green, '', '', '') + call s:hi('rubyRegexp', s:cyan, '', '', '') + + call s:hi('sassidChar', s:red, '', '', '') + call s:hi('sassClassChar', s:orange, '', '', '') + call s:hi('sassInclude', s:purple, '', '', '') + call s:hi('sassMixing', s:purple, '', '', '') + call s:hi('sassMixinName', s:blue, '', '', '') + + call s:hi('vimfilerLeaf', s:base05, '', '', '') + call s:hi('vimfilerNormalFile', s:base05, s:base00, '', '') + call s:hi('vimfilerOpenedFile', s:blue, '', '', '') + call s:hi('vimfilerClosedFile', s:blue, '', '', '') + + call s:hi('GitGutterAdd', s:green, s:base00, s:bold, '') + call s:hi('GitGutterChange', s:blue, s:base00, s:bold, '') + call s:hi('GitGutterDelete', s:red, s:base00, s:bold, '') + call s:hi('GitGutterChangeDelete', s:purple, s:base00, s:bold, '') + + call s:hi('SignifySignAdd', s:green, s:base00, s:bold, '') + call s:hi('SignifySignChange', s:blue, s:base00, s:bold, '') + call s:hi('SignifySignDelete', s:red, s:base00, s:bold, '') + call s:hi('SignifySignChangeDelete', s:purple, s:base00, s:bold, '') + call s:hi('SignifySignDeleteFirstLine', s:red, s:base00, s:bold, '') + + call s:hi('xmlTag', s:cyan, '', '', '') + call s:hi('xmlTagName', s:base05, '', '', '') + call s:hi('xmlEndTag', s:cyan, '', '', '') + call s:hi('Defx_filename_directory', s:blue, '', '', '') + + call s:hi('CocErrorSign', s:red, '', '', '') + call s:hi('CocWarningSign', s:yellow, '', '', '') + call s:hi('CocInfoSign', s:blue, '', '', '') + call s:hi('CocHintSign', s:cyan, '', '', '') + call s:hi('CocErrorFloat', s:red, '', '', '') + call s:hi('CocWarningFloat', s:yellow, '', '', '') + call s:hi('CocInfoFloat', s:blue, '', '', '') + call s:hi('CocHintFloat', s:cyan, '', '', '') + call s:hi('CocDiagnosticsError', s:red, '', '', '') + call s:hi('CocDiagnosticsWarning', s:yellow, '', '', '') + call s:hi('CocDiagnosticsInfo', s:blue, '', '', '') + call s:hi('CocDiagnosticsHint', s:cyan, '', '', '') + call s:hi('CocSelectedText', s:purple, '', '', '') + call s:hi('CocCodeLens', s:base04, '', '', '') +" }}} +" {{{ Terminal +if has('nvim') + let g:terminal_color_0=s:base00[0] + let g:terminal_color_8=s:base03[0] + + let g:terminal_color_1=s:red[0] + let g:terminal_color_9=s:red[0] + + let g:terminal_color_2=s:green[0] + let g:terminal_color_10=s:green[0] + + let g:terminal_color_3=s:yellow[0] + let g:terminal_color_11=s:yellow[0] + + let g:terminal_color_4=s:blue[0] + let g:terminal_color_12=s:blue[0] + + let g:terminal_color_5=s:purple[0] + let g:terminal_color_13=s:purple[0] + + let g:terminal_color_6=s:cyan[0] + let g:terminal_color_14=s:cyan[0] + + let g:terminal_color_7=s:base05[0] + let g:terminal_color_15=s:base05[0] + + let g:terminal_color_background=s:base00[0] + let g:terminal_color_foreground=s:white[0] +else + let g:terminal_ansi_colors = [ + \ s:base00[0], + \ s:red[0], + \ s:green[0], + \ s:yellow[0], + \ s:blue[0], + \ s:purple[0], + \ s:cyan[0], + \ s:white[0], + \ s:base03[0], + \ s:red[0], + \ s:green[0], + \ s:yellow[0], + \ s:blue[0], + \ s:purple[0], + \ s:cyan[0], + \ s:white[0], + \] + +endif + + diff --git a/.config/nvim/colors/oceanic-next/estilo/addons/nvim-term.yml b/.config/nvim/colors/oceanic-next/estilo/addons/nvim-term.yml new file mode 100755 index 0000000..e2fa29a --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/addons/nvim-term.yml @@ -0,0 +1,29 @@ +color_0: 'base00' +color_1: 'base08' +color_2: 'base0B' +color_3: 'base0A' +color_4: 'base0D' +color_5: 'base0E' +color_6: 'base0C' +color_7: 'base05' +color_8: 'base03' +color_9: 'base09' +color_10: 'base01' +color_11: 'base02' +color_12: 'base04' +color_13: 'base06' +color_14: 'base0F' +color_15: 'base07' +color_background: 'base00' +color_foreground: 'base10' + + +# color_7: 'base07' +# color_8: 'base03' +# color_9: 'base08' +# color_10: 'base01' +# color_11: 'base02' +# color_12: 'base04' +# color_13: 'base05' +# color_14: 'base0F' +# color_15: 'base07' diff --git a/.config/nvim/colors/oceanic-next/estilo/airline/oceanicnextlight.yml b/.config/nvim/colors/oceanic-next/estilo/airline/oceanicnextlight.yml new file mode 100755 index 0000000..66a72ff --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/airline/oceanicnextlight.yml @@ -0,0 +1,15 @@ +normal1: 'base10 base0D' +normal2: 'base07 base03' +normal3: 'base07 base01' +inactive1: 'base07 base03' +inactive2: 'base07 base01' +inactive3: 'base03 base01' +insert1: 'base10 base0B' +insert2: 'base07 base03' +insert3: 'base07 base01' +replace1: 'base10 base08' +replace2: 'base07 base03' +replace3: 'base07 base01' +visual1: 'base10 base09' +visual2: 'base07 base03' +visual3: 'base07 base01' diff --git a/.config/nvim/colors/oceanic-next/estilo/lightline/oceanicnextlight.yml b/.config/nvim/colors/oceanic-next/estilo/lightline/oceanicnextlight.yml new file mode 100755 index 0000000..d98b97d --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/lightline/oceanicnextlight.yml @@ -0,0 +1,33 @@ +normal1: 'base10 base0D' +normal2: 'base10 base03' +normal3: 'base10 base01' +normal4: 'base10 base03' +normal5: 'base10 base03' +# normalError: '' +# normalWarning: '' +inactive1: 'base07 base03' +inactive2: 'base07 base01' +inactive3: 'base03 base01' +inactive4: 'base07 base01' +inactive5: 'base07 base03' + +insert1: 'base10 base0B' +insert2: 'base10 base03' +insert3: 'base10 base01' +insert4: 'base10 base03' +insert5: 'base10 base0B' +replace1: 'base10 base08' +replace2: 'base10 base03' +replace3: 'base10 base01' +replace4: 'base10 base03' +replace5: 'base10 base08' + +visual1: 'base10 base09' +visual2: 'base10 base03' +visual3: 'base10 base01' +visual4: 'base10 base03' +visual5: 'base10 base09' +tablineLeft: 'base03 base01' +tablineSelected: 'base10 base03' +tablineMiddle: 'base03 base01' +tablineRight: 'base03 base01' diff --git a/.config/nvim/colors/oceanic-next/estilo/palettes/oceanic-next-light.yml b/.config/nvim/colors/oceanic-next/estilo/palettes/oceanic-next-light.yml new file mode 100755 index 0000000..b7edc0e --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/palettes/oceanic-next-light.yml @@ -0,0 +1,17 @@ +base00: '#d8dee9' +base01: '#cdd3de' +base02: '#c0c5ce' +base03: '#a7adba' +base04: '#65737e' +base05: '#4f5b66' +base06: '#343d46' +base07: '#1b2b34' +base08: "#b40b11" # #ec5f67 +base09: "#b4713d" # #f99157 +base0A: "#a48c32" # #fac863 +base0B: "#869235" # #99c794 +base0C: "#5b9c90" # #5fb3b3 +base0D: "#526f93" # #6699cc +base0E: "#896a98" # #c594c5 +base0F: "#9a806d" # #ab7967 +base10: '#ffffff' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/base.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/base.yml new file mode 100755 index 0000000..16ae0ea --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/base.yml @@ -0,0 +1,104 @@ +# fg bg b/u/r/i/c +# Vim editor colors + +Base00: 'base00' +Base01: 'base01' +Base02: 'base02' +Base03: 'base03' +Base04: 'base04' +Base05: 'base05' +Base06: 'base06' +Base07: 'base07' +Base08: 'base08' +Base09: 'base09' +Base0A: 'base0A' +Base0B: 'base0B' +Base0C: 'base0C' +Base0D: 'base0D' +Base0E: 'base0E' +Base0F: 'base0F' +Base10: 'base10' + +Bold: '. . b' +Debug: 'base08 . .' +Directory: 'base0D . .' +ErrorMsg: 'base08 base00 .' +Exception: 'base08 . .' +FoldColumn: '. base01 .' +Folded: 'base03 base01 .' +IncSearch: 'base01 base09 .' +# Italic: '. . i' +Italic: '. . u' +Macro: 'base08 . .' +MatchParen: 'base05 base03 .' +ModeMsg: 'base0B . .' +MoreMsg: 'base0B . .' +Question: 'base0D . .' +Search: 'base03 base0A .' +SpecialKey: 'base03 . .' +TooLong: 'base08 . .' +Underlined: 'base08 . .' +Visual: '. base02 .' +VisualNOS: 'base08 . .' +WarningMsg: 'base08 . .' +WildMenu: 'base10 base0D .' +Title: 'base0D . ' +Conceal: 'base0D base00 .' +Cursor: 'base00 base05 .' +NonText: 'base03 . .' +Normal: 'base05 base00 .' +LineNr: 'base03 base01 .' +CursorLineNR: 'base10 base10 .' +SignColumn: 'base03 base01 .' +StatusLine: 'base04 base02 ' +StatusLineNC: 'base03 base01 ' +VertSplit: 'base02 base02 ' +ColorColumn: '. base01 ' +CursorColumn: '. base01 ' +CursorLine: '. base01 ' +CursorLineNr: 'base03 base01 .' +PMenu: 'base04 base01 ' +PMenuSel: 'base01 base04 .' +PmenuSbar: '. base02 .' +PmenuThumb: '. base07 .' +TabLine: 'base03 base01 ' +TabLineFill: 'base03 base01 ' +TabLineSel: 'base0B base01 ' +helpExample: 'base0A . .' +helpCommand: 'base0A . .' + + # Standard syntax highlighting +Boolean: 'base09 . .' +Character: 'base08 . .' +# Comment: 'base03 . i' +Comment: 'base03 .' +Conditional: 'base0E . .' +Constant: 'base09 . .' +Define: 'base0E . ' +Delimiter: 'base0F . .' +Float: 'base09 . .' +Function: 'base0D . .' +Identifier: 'base08 . ' +Include: 'base0D . .' +Keyword: 'base0E . .' +Label: 'base0A . .' +Number: 'base09 . .' +Operator: 'base05 . ' +PreProc: 'base0A . .' +Repeat: 'base0A . .' +Special: 'base0C . .' +SpecialChar: 'base0F . .' +Statement: 'base08 . .' +StorageClass: 'base0A . .' +String: 'base0B . .' +Structure: 'base0E . .' +Tag: 'base0A . .' +Todo: 'base0A base01 .' +Type: 'base0A . ' +Typedef: 'base0A . .' + + # Spelling highlighting +SpellBad: '. base00 c' +SpellLocal: '. base00 c' +SpellCap: '. base00 c' +SpellRare: '. base00 c' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/c-sharp.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/c-sharp.yml new file mode 100755 index 0000000..a63cf9b --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/c-sharp.yml @@ -0,0 +1,8 @@ +# C# highlighting +csClass: 'base0A . .' +csAttribute: 'base0A . .' +csModifier: 'base0E . .' +csType: 'base08 . .' +csUnspecifiedStatement: 'base0D . .' +csContextualStatement: 'base0E . .' +csNewDecleration: 'base08 . .' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/c.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/c.yml new file mode 100755 index 0000000..1a3986e --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/c.yml @@ -0,0 +1,3 @@ +# C highlighting +cOperator: 'base0C . .' +cPreCondit: 'base0E . .' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/css.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/css.yml new file mode 100755 index 0000000..50bae3f --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/css.yml @@ -0,0 +1,120 @@ +# CSS highlighting + +cssComment: '' # Comment +cssVendor: '' # Comment +cssHacks: '' # Comment +cssTagName: '' # Statement +cssDeprecated: '' # Error +cssSelectorOp: '' # Special +cssSelectorOp2: '' # Special +cssAttrComma: '' # Special +cssAnimationProp: '' # cssProp +cssBackgroundProp: '' # cssProp +cssBorderProp: '' # cssProp +cssBoxProp: '' # cssProp +cssColorProp: '' # cssProp +cssContentForPagedMediaProp: '' # cssProp +cssDimensionProp: '' # cssProp +cssFlexibleBoxProp: '' # cssProp +cssFontProp: '' # cssProp +cssGeneratedContentProp: '' # cssProp +cssGridProp: '' # cssProp +cssHyerlinkProp: '' # cssProp +cssLineboxProp: '' # cssProp +cssListProp: '' # cssProp +cssMarqueeProp: '' # cssProp +cssMultiColumnProp: '' # cssProp +cssPagedMediaProp: '' # cssProp +cssPositioningProp: '' # cssProp +cssPrintProp: '' # cssProp +cssRubyProp: '' # cssProp +cssSpeechProp: '' # cssProp +cssTableProp: '' # cssProp +cssTextProp: '' # cssProp +cssTransformProp: '' # cssProp +cssTransitionProp: '' # cssProp +cssUIProp: '' # cssProp +cssIEUIProp: '' # cssProp +cssAuralProp: '' # cssProp +cssRenderProp: '' # cssProp +cssMobileTextProp: '' # cssProp +cssAnimationAttr: '' # cssAttr +cssBackgroundAttr: '' # cssAttr +cssBorderAttr: '' # cssAttr +cssBoxAttr: '' # cssAttr +cssContentForPagedMediaAttr: '' # cssAttr +cssDimensionAttr: '' # cssAttr +cssFlexibleBoxAttr: '' # cssAttr +cssFontAttr: '' # cssAttr +cssGeneratedContentAttr: '' # cssAttr +cssGridAttr: '' # cssAttr +cssHyerlinkAttr: '' # cssAttr +cssLineboxAttr: '' # cssAttr +cssListAttr: '' # cssAttr +cssMarginAttr: '' # cssAttr +cssMarqueeAttr: '' # cssAttr +cssMultiColumnAttr: '' # cssAttr +cssPaddingAttr: '' # cssAttr +cssPagedMediaAttr: '' # cssAttr +cssPositioningAttr: '' # cssAttr +cssGradientAttr: '' # cssAttr +cssPrintAttr: '' # cssAttr +cssRubyAttr: '' # cssAttr +cssSpeechAttr: '' # cssAttr +cssTableAttr: '' # cssAttr +cssTextAttr: '' # cssAttr +cssTransformAttr: '' # cssAttr +cssTransitionAttr: '' # cssAttr +cssUIAttr: '' # cssAttr +cssIEUIAttr: '' # cssAttr +cssAuralAttr: '' # cssAttr +cssRenderAttr: '' # cssAttr +cssCommonAttr: '' # cssAttr +cssPseudoClassId: '' # PreProc +cssPseudoClassLang: '' # Constant +cssValueLength: '' # Number +cssValueInteger: '' # Number +cssValueNumber: '' # Number +cssValueAngle: '' # Number +cssValueTime: '' # Number +cssValueFrequency: '' # Number +cssFunction: '' # Constant +cssURL: '' # String +cssFunctionName: '' # Function +cssFunctionComma: '' # Function +cssColor: 'base0C . .' +cssIdentifier: '' # Function +cssInclude: '' # Include +cssIncludeKeyword: '' # atKeyword +cssImportant: '' # Special +cssBraces: 'base05 . .' +cssBraceError: '' # Error +cssError: '' # Error +cssUnicodeEscape: '' # Special +cssStringQQ: '' # String +cssStringQ: '' # String +cssAttributeSelector: '' # String +cssMedia: '' # atKeyword +cssMediaType: '' # Special +cssMediaComma: '' # Normal +cssMediaKeyword: '' # Statement +cssMediaProp: '' # cssProp +cssMediaAttr: '' # cssAttr +cssPage: '' # atKeyword +cssPagePseudo: '' # PreProc +cssPageMargin: '' # atKeyword +cssPageProp: '' # cssProp +cssKeyFrame: '' # atKeyword +cssKeyFrameSelector: '' # Constant +cssFontDescriptor: '' # Special +cssFontDescriptorFunction: '' # Constant +cssFontDescriptorProp: '' # cssProp +cssFontDescriptorAttr: '' # cssAttr +cssUnicodeRange: '' # Constant +cssClassName: 'base0E . .' +cssClassNameDot: '' # Function +cssProp: '' # StorageClass +cssAttr: '' # Constant +cssUnitDecorators: '' # Number +cssNoise: '' # Noise +atKeyword: '' # PreProc diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/diff.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/diff.yml new file mode 100755 index 0000000..acc54d9 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/diff.yml @@ -0,0 +1,27 @@ +# Diff highlighting +DiffAdd: 'base0B base01 .' +DiffChange: 'base03 base01 .' +DiffDelete: 'base08 base01 .' +DiffText: 'base0D base01 .' +DiffAdded: 'base10 base0B .' +DiffFile: 'base08 base00 .' +DiffNewFile: 'base0B base00 .' +DiffLine: 'base0D base00 .' +DiffRemoved: 'base10 base08 .' + +diffOldFile: '' # diffFile +diffNewFile: '' # diffFile +diffFile: '' # Type +diffOnly: '' # Constant +diffIdentical: '' # Constant +diffDiffer: '' # Constant +diffBDiffer: '' # Constant +diffIsA: '' # Constant +diffNoEOL: '' # Constant +diffCommon: '' # Constant +diffRemoved: '' # Special +diffChanged: '' # PreProc +diffAdded: '' # Identifier +diffLine: '' # Statement +diffSubname: '' # PreProc +diffComment: '' # Comment diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/fugitive.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/fugitive.yml new file mode 100755 index 0000000..54c0bd3 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/fugitive.yml @@ -0,0 +1,10 @@ +FugitiveblameBoundary: '' # Keyword +FugitiveblameHash: '' # Identifier +FugitiveblameUncommitted: '' # Ignore +FugitiveblameTime: '' # PreProc +FugitiveblameLineNumber: '' # Number +FugitiveblameOriginalFile: '' # String +FugitiveblameOriginalLineNumber: '' # +FugitiveblameShort: '' # FugitiveblameDelimiter +FugitiveblameDelimiter: '' # Delimiter +FugitiveblameNotCommittedYet: '' # Comment diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/git.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/git.yml new file mode 100755 index 0000000..eb88530 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/git.yml @@ -0,0 +1,22 @@ + # Git highlighting +gitCommitOverflow: 'base08 . .' +gitCommitSummary: 'base0B . .' +gitDateHeader: '' # gitIdentityHeader +gitIdentityHeader: '' # gitIdentityKeyword +gitIdentityKeyword: '' # Label +gitNotesHeader: '' # gitKeyword +gitReflogHeader: '' # gitKeyword +gitKeyword: '' # Keyword +gitIdentity: '' # String +gitEmailDelimiter: '' # Delimiter +gitEmail: '' # Special +gitDate: '' # Number +gitMode: '' # Number +gitHashAbbrev: '' # gitHash +gitHash: '' # Identifier +gitReflogMiddle: '' # gitReference +gitReference: '' # Function +gitStage: '' # gitType +gitType: '' # Type +gitDiffAdded: '' # diffAdded +gitDiffRemoved: '' # diffRemoved diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/gitcommit.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/gitcommit.yml new file mode 100755 index 0000000..b25254c --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/gitcommit.yml @@ -0,0 +1,26 @@ +gitcommitSummary: '' # Keyword +gitcommitComment: '' # Comment +gitcommitUntracked: '' # gitcommitComment +gitcommitDiscarded: '' # gitcommitComment +gitcommitSelected: '' # gitcommitComment +gitcommitUnmerged: '' # gitcommitComment +gitcommitOnBranch: '' # Comment +gitcommitBranch: '' # Special +gitcommitNoBranch: '' # gitCommitBranch +gitcommitDiscardedType: '' # gitcommitType +gitcommitSelectedType: '' # gitcommitType +gitcommitUnmergedType: '' # gitcommitType +gitcommitType: '' # Type +gitcommitNoChanges: '' # gitcommitHeader +gitcommitHeader: '' # PreProc +gitcommitUntrackedFile: '' # gitcommitFile +gitcommitDiscardedFile: '' # gitcommitFile +gitcommitSelectedFile: '' # gitcommitFile +gitcommitUnmergedFile: '' # gitcommitFile +gitcommitFile: '' # Constant +gitcommitDiscardedArrow: '' # gitcommitArrow +gitcommitSelectedArrow: '' # gitcommitArrow +gitcommitUnmergedArrow: '' # gitcommitArrow +gitcommitArrow: '' # gitcommitComment +gitcommitOverflow: '' # none +gitcommitBlank: '' # Error diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/gitconfig.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/gitconfig.yml new file mode 100755 index 0000000..8909f10 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/gitconfig.yml @@ -0,0 +1,9 @@ +gitconfigComment: '' # Comment +gitconfigSection: '' # Keyword +gitconfigVariable: '' # Identifier +gitconfigBoolean: '' # Boolean +gitconfigNumber: '' # Number +gitconfigString: '' # String +gitconfigDelim: '' # Delimiter +gitconfigEscape: '' # Delimiter +gitconfigError: '' # Error diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/gitrebase.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/gitrebase.yml new file mode 100755 index 0000000..29d56e3 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/gitrebase.yml @@ -0,0 +1,11 @@ +gitrebaseCommit: '' # gitrebaseHash +gitrebaseHash: '' # Identifier +gitrebasePick: '' # Statement +gitrebaseReword: '' # Number +gitrebaseEdit: '' # PreProc +gitrebaseSquash: '' # Type +gitrebaseFixup: '' # Special +gitrebaseExec: '' # Function +gitrebaseSummary: '' # String +gitrebaseComment: '' # Comment +gitrebaseSquashError: '' # Error diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/html.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/html.yml new file mode 100755 index 0000000..5f1401f --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/html.yml @@ -0,0 +1,48 @@ + # HTML highlighting +htmlBold: 'base0A . .' +htmlItalic: 'base0E . .' + +htmlTag: 'base0C . .' +htmlEndTag: 'base0C . .' +htmlArg: 'base0A' # Type +htmlTagName: 'base07 . .' # htmlStatement +htmlSpecialTagName: '' # Exception +htmlValue: '' # String +htmlH1: '' # Title +htmlH2: '' # htmlH1 +htmlH3: '' # htmlH2 +htmlH4: '' # htmlH3 +htmlH5: '' # htmlH4 +htmlH6: '' # htmlH5 +htmlHead: '' # PreProc +htmlTitle: '' # Title +htmlBoldItalicUnderline: '' # htmlBoldUnderlineItalic +htmlUnderlineBold: '' # htmlBoldUnderline +htmlUnderlineItalicBold: '' # htmlBoldUnderlineItalic +htmlUnderlineBoldItalic: '' # htmlBoldUnderlineItalic +htmlItalicUnderline: '' # htmlUnderlineItalic +htmlItalicBold: '' # htmlBoldItalic +htmlItalicBoldUnderline: '' # htmlBoldUnderlineItalic +htmlItalicUnderlineBold: '' # htmlBoldUnderlineItalic +htmlLink: '' # Underlined +htmlLeadingSpace: '' # None +htmlPreStmt: '' # PreProc +htmlPreError: '' # Error +htmlPreProc: '' # PreProc +htmlPreAttr: '' # String +htmlPreProcAttrName: '' # PreProc +htmlPreProcAttrError: '' # Error +htmlSpecial: '' # Special +htmlSpecialChar: '' # Special +htmlString: '' # String +htmlStatement: '' # Statement +htmlComment: '' # Comment +htmlCommentPart: '' # Comment +htmlCommentError: '' # htmlError +htmlTagError: '' # htmlError +htmlEvent: '' # javaScript +htmlError: '' # Error +javaScript: '' # Special +javaScriptExpression: '' # javaScript +htmlCssStyleComment: '' # Comment +htmlCssDefinition: '' # Special diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/javascript.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/javascript.yml new file mode 100755 index 0000000..39ae751 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/javascript.yml @@ -0,0 +1,36 @@ + + # JavaScript highlighting +javaScript: 'base05 . .' + +javaScriptComment: '' # Comment +javaScriptLineComment: '' # Comment +javaScriptCommentTodo: '' # Todo +javaScriptSpecial: '' # Special +javaScriptStringS: '' # String +javaScriptStringD: '' # String +javaScriptCharacter: '' # Character +javaScriptSpecialCharacter: '' # javaScriptSpecial +javaScriptNumber: 'base09 . .' +javaScriptConditional: '' # Conditional +javaScriptRepeat: '' # Repeat +javaScriptBranch: '' # Conditional +javaScriptOperator: '' # Operator +javaScriptType: '' # Type +javaScriptStatement: '' # Statement +javaScriptFunction: '' # Function +javaScriptBraces: 'base05 . .' +javaScriptError: '' # Error +javaScriptParensError: '' # Error +javaScriptNull: '' # Keyword +javaScriptBoolean: '' # Boolean +javaScriptRegexpString: '' # String +javaScriptIdentifier: '' # Identifier +javaScriptLabel: '' # Label +javaScriptException: '' # Exception +javaScriptMessage: '' # Keyword +javaScriptGlobal: '' # Keyword +javaScriptMember: '' # Keyword +javaScriptDeprecated: '' # Exception +javaScriptReserved: '' # Keyword +javaScriptDebug: '' # Debug +javaScriptConstant: '' # Label diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/json.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/json.yml new file mode 100755 index 0000000..6a3bbee --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/json.yml @@ -0,0 +1,19 @@ +jsonPadding: '' # Operator +jsonString: '' # String +jsonTest: '' # Label +jsonEscape: '' # Special +jsonNumber: '' # Number +jsonBraces: '' # Delimiter +jsonNull: '' # Function +jsonBoolean: '' # Boolean +jsonKeyword: '' # Label +jsonNumError: '' # Error +jsonCommentError: '' # Error +jsonSemicolonError: '' # Error +jsonTrailingCommaError: '' # Error +jsonMissingCommaError: '' # Error +jsonStringSQError: '' # Error +jsonNoQuotesError: '' # Error +jsonTripleQuotesError: '' # Error +jsonQuote: '' # Quote +jsonNoise: '' # Noise diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/markdown.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/markdown.yml new file mode 100755 index 0000000..954e3cb --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/markdown.yml @@ -0,0 +1,32 @@ + # Markdown highlighting +markdownCode: 'base0B . .' +markdownCodeBlock: 'base0B . .' + + +markdownH1: '' # htmlH1 +markdownH2: '' # htmlH2 +markdownH3: '' # htmlH3 +markdownH4: '' # htmlH4 +markdownH5: '' # htmlH5 +markdownH6: '' # htmlH6 +markdownHeadingRule: '' # markdownRule +markdownHeadingDelimiter: 'base0D . .' +markdownOrderedListMarker: '' # markdownListMarker +markdownListMarker: '' # htmlTagName +markdownBlockquote: '' # Comment +markdownRule: '' # PreProc +markdownLinkText: '' # htmlLink +markdownIdDeclaration: '' # Typedef +markdownId: '' # Type +markdownAutomaticLink: '' # markdownUrl +markdownUrl: '' # Float +markdownUrlTitle: '' # String +markdownIdDelimiter: '' # markdownLinkDelimiter +markdownUrlDelimiter: '' # htmlTag +markdownUrlTitleDelimiter: '' # Delimiter +markdownItalic: 'base0E . i' +markdownBold: 'base0A . b' +markdownBoldItalic: '' # htmlBoldItalic +markdownCodeDelimiter: 'base0F . i' +markdownEscape: '' # Special +markdownError: 'base05 base00 .' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/neomake.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/neomake.yml new file mode 100755 index 0000000..9edc7d5 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/neomake.yml @@ -0,0 +1,6 @@ +# Neomake highlighting +NeomakeErrorSign: 'base08 base01 .' +NeomakeWarningSign: 'base0A base01 .' +NeomakeInfoSign: 'base10 base01 .' +NeomakeError: 'base08 . c' +NeomakeWarning: 'base08 . c' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/nerdtree.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/nerdtree.yml new file mode 100755 index 0000000..8238c9c --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/nerdtree.yml @@ -0,0 +1,28 @@ + # NERDTree highlighting + +NERDTreePart: '' # Special +NERDTreePartFile: '' # Type +NERDTreeExecFile: 'base05 . .' +NERDTreeDirSlash: 'base0D . .' +NERDTreeBookmarksHeader: '' # statement +NERDTreeBookmarksLeader: '' # ignore +NERDTreeBookmarkName: '' # Identifier +NERDTreeBookmark: '' # normal +NERDTreeHelp: '' # String +NERDTreeHelpKey: '' # Identifier +NERDTreeHelpCommand: '' # Identifier +NERDTreeHelpTitle: '' # Macro +NERDTreeToggleOn: '' # Question +NERDTreeToggleOff: '' # WarningMsg +NERDTreeLinkTarget: '' # Type +NERDTreeLinkFile: '' # Macro +NERDTreeLinkDir: '' # Macro +NERDTreeDir: '' # Directory +NERDTreeUp: '' # Directory +NERDTreeFile: '' # Normal +NERDTreeCWD: '' # Statement +NERDTreeOpenable: 'base0D . .' +NERDTreeClosable: '' # Title +NERDTreeIgnore: '' # ignore +NERDTreeRO: '' # WarningMsg +NERDTreeFlags: '' # Number diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/php.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/php.yml new file mode 100755 index 0000000..35baf62 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/php.yml @@ -0,0 +1,54 @@ +# PHP highlighting +phpComparison: 'base05 . .' +phpConstant: '' # Constant +phpCoreConstant: '' # Constant +phpComment: '' # Comment +phpDocTags: '' # PreProc +phpDocCustomTags: '' # Type +phpException: '' # Exception +phpBoolean: '' # Boolean +phpStorageClass: '' # StorageClass +phpSCKeyword: '' # StorageClass +phpFCKeyword: '' # Define +phpStructure: '' # Structure +phpStringSingle: '' # String +phpStringDouble: '' # String +phpBacktick: '' # String +phpNumber: '' # Number +phpFloat: '' # Float +phpMethods: '' # Function +phpFunctions: '' # Function +phpBaselib: '' # Function +phpRepeat: '' # Repeat +phpConditional: '' # Conditional +phpLabel: '' # Label +phpStatement: '' # Statement +phpKeyword: '' # Statement +phpType: '' # Type +phpInclude: '' # Include +phpDefine: '' # Define +phpBackslashSequences: '' # SpecialChar +phpBackslashDoubleQuote: '' # SpecialChar +phpBackslashSingleQuote: '' # SpecialChar +phpParent: 'base05 . .' +phpBrackets: '' # Delimiter +phpIdentifierConst: '' # Delimiter +phpParentError: '' # Error +phpOctalError: '' # Error +phpInterpSimpleError: '' # Error +phpInterpBogusDollarCurley: '' # Error +phpInterpDollarCurly1: '' # Error +phpInterpDollarCurly2: '' # Error +phpInterpSimpleBracketsInner: '' # String +phpInterpSimpleCurly: '' # Delimiter +phpInterpVarname: '' # Identifier +phpTodo: '' # Todo +phpDocTodo: '' # Todo +phpMemberSelector: 'base05 . .' +phpIntVar: '' # Identifier +phpEnvVar: '' # Identifier +phpOperator: '' # Operator +phpVarSelector: '' # Operator +phpRelation: '' # Operator +phpIdentifier: '' # Identifier +phpIdentifierSimply: '' # Identifier diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/python.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/python.yml new file mode 100755 index 0000000..a90c442 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/python.yml @@ -0,0 +1,23 @@ +# Python highlighting + +pythonStatement: '' # Statement +pythonConditional: '' # Conditional +pythonRepeat: 'base0E . .' +pythonOperator: 'base0E . .' +pythonException: '' # Exception +pythonInclude: '' # Include +pythonDecorator: '' # Define +pythonFunction: '' # Function +pythonComment: '' # Comment +pythonTodo: '' # Todo +pythonString: '' # String +pythonRawString: '' # String +pythonQuotes: '' # String +pythonTripleQuotes: '' # pythonQuotes +pythonEscape: '' # Special +pythonNumber: '' # Number +pythonBuiltin: '' # Function +pythonExceptions: '' # Structure +pythonSpaceError: '' # Error +pythonDoctest: '' # Special +pythonDoctestValue: '' # Define diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/ruby.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/ruby.yml new file mode 100755 index 0000000..e6a8ed6 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/ruby.yml @@ -0,0 +1,64 @@ + # Ruby highlighting + +rubyClass: '' # rubyDefine +rubyModule: '' # rubyDefine +rubyMethodExceptional: '' # rubyDefine +rubyDefine: '' # Define +rubyFunction: '' # Function +rubyConditional: '' # Conditional +rubyConditionalModifier: '' # rubyConditional +rubyExceptional: '' # rubyConditional +rubyRepeat: '' # Repeat +rubyRepeatModifier: '' # rubyRepeat +rubyOptionalDo: '' # rubyRepeat +rubyControl: '' # Statement +rubyInclude: '' # Include +rubyInteger: '' # Number +rubyASCIICode: '' # Character +rubyFloat: '' # Float +rubyBoolean: '' # Boolean +rubyException: '' # Exception +rubyIdentifier: '' # Identifier +rubyClassVariable: '' # rubyIdentifier +rubyConstant: 'base0A . .' +rubyGlobalVariable: '' # rubyIdentifier +rubyBlockParameter: '' # rubyIdentifier +rubyInstanceVariable: '' # rubyIdentifier +rubyPredefinedIdentifier: '' # rubyIdentifier +rubyPredefinedConstant: '' # rubyPredefinedIdentifier +rubyPredefinedVariable: '' # rubyPredefinedIdentifier +rubySymbol: 'base0B . .' +rubyKeyword: '' # Keyword +rubyOperator: '' # Operator +rubyBeginEnd: '' # Statement +rubyAccess: '' # Statement +rubyAttribute: 'base0D . .' +rubyEval: '' # Statement +rubyPseudoVariable: '' # Constant +rubyComment: '' # Comment +rubyData: '' # Comment +rubyDataDirective: '' # Delimiter +rubyDocumentation: '' # Comment +rubyTodo: '' # Todo +rubyQuoteEscape: '' # rubyStringEscape +rubyStringEscape: '' # Special +rubyInterpolation: 'base0B . .' +rubyInterpolationDelimiter: 'base0F . .' +rubyNoInterpolation: '' # rubyString +rubySharpBang: '' # PreProc +rubyRegexpDelimiter: '' # rubyStringDelimiter +rubySymbolDelimiter: '' # rubyStringDelimiter +rubyStringDelimiter: 'base0B . .' +rubyHeredoc: '' # rubyString +rubyString: '' # String +rubyRegexpEscape: '' # rubyRegexpSpecial +rubyRegexpQuantifier: '' # rubyRegexpSpecial +rubyRegexpAnchor: '' # rubyRegexpSpecial +rubyRegexpDot: '' # rubyRegexpCharClass +rubyRegexpCharClass: '' # rubyRegexpSpecial +rubyRegexpSpecial: '' # Special +rubyRegexpComment: '' # Comment +rubyRegexp: 'base0C . .' +rubyInvalidVariable: '' # Error +rubyError: '' # Error +rubySpaceError: '' # rubyError diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/scss.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/scss.yml new file mode 100755 index 0000000..a0a5e66 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/scss.yml @@ -0,0 +1,7 @@ + # SASS highlighting +sassidChar: 'base08 . .' +sassClassChar: 'base09 . .' +sassInclude: 'base0E . .' +sassMixing: 'base0E . .' +sassMixinName: 'base0D . .' + diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/sh.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/sh.yml new file mode 100755 index 0000000..4da69a4 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/sh.yml @@ -0,0 +1,127 @@ +shArithRegion: '' # shShellVariables +shAtExpr: '' # shSetList +shBeginHere: '' # shRedir +shCaseBar: '' # shConditional +shCaseCommandSub: '' # shCommandSub +shCaseDoubleQuote: '' # shDoubleQuote +shCaseIn: '' # shConditional +shQuote: '' # shOperator +shCaseSingleQuote: '' # shSingleQuote +shCaseStart: '' # shConditional +shCmdSubRegion: '' # shShellVariables +shColon: '' # shComment +shDerefOp: '' # shOperator +shDerefPOL: '' # shDerefOp +shDerefPPS: '' # shDerefOp +shDeref: '' # shShellVariables +shDerefDelim: '' # shOperator +shDerefSimple: '' # shDeref +shDerefSpecial: '' # shDeref +shDerefString: '' # shDoubleQuote +shDerefVar: '' # shDeref +shDoubleQuote: '' # shString +shEcho: '' # shString +shEchoDelim: '' # shOperator +shEchoQuote: '' # shString +shForPP: '' # shLoop +shEmbeddedEcho: '' # shString +shEscape: '' # shCommandSub +shExDoubleQuote: '' # shDoubleQuote +shExSingleQuote: '' # shSingleQuote +shFunction: '' # Function +shHereDoc: '' # shString +shHerePayload: '' # shHereDoc +shLoop: '' # shStatement +shMoreSpecial: '' # shSpecial +shOption: '' # shCommandSub +shPattern: '' # shString +shParen: '' # shArithmetic +shPosnParm: '' # shShellVariables +shQuickComment: '' # shComment +shRange: '' # shOperator +shRedir: '' # shOperator +shSetListDelim: '' # shOperator +shSetOption: '' # shOption +shSingleQuote: '' # shString +shSource: '' # shOperator +shStringSpecial: '' # shSpecial +shSubShRegion: '' # shOperator +shTestOpr: '' # shConditional +shTestPattern: '' # shString +shTestDoubleQuote: '' # shString +shTestSingleQuote: '' # shString +shVariable: '' # shSetList +shWrapLineOperator: '' # shOperator +bashAdminStatement: '' # shStatement if exists("b:is_bash") +bashSpecialVariables: '' # shShellVariables if exists("b:is_bash") +bashStatement: '' # shStatement if exists("b:is_bash") +shFunctionParen: '' # Delimiter if exists("b:is_bash") +shFunctionDelim: '' # Delimiter if exists("b:is_bash") +kshSpecialVariables: '' # shShellVariables if exists("b:is_kornshell") +kshStatement: '' # shStatement if exists("b:is_kornshell") +shCaseError: '' # Error if !exists("g:sh_no_error") +shCondError: '' # Error if !exists("g:sh_no_error") +shCurlyError: '' # Error if !exists("g:sh_no_error") +shDerefError: '' # Error if !exists("g:sh_no_error") +shDerefOpError: '' # Error if !exists("g:sh_no_error") +shDerefWordError: '' # Error if !exists("g:sh_no_error") +shDoError: '' # Error if !exists("g:sh_no_error") +shEsacError: '' # Error if !exists("g:sh_no_error") +shIfError: '' # Error if !exists("g:sh_no_error") +shInError: '' # Error if !exists("g:sh_no_error") +shParenError: '' # Error if !exists("g:sh_no_error") +shTestError: '' # Error if !exists("g:sh_no_error") +shDTestError: '' # Error if exists("b:is_kornshell") +shArithmetic: '' # Special +shCharClass: '' # Identifier +shSnglCase: '' # Statement +shCommandSub: '' # Special +shComment: '' # Comment +shConditional: '' # Conditional +shCtrlSeq: '' # Special +shExprRegion: '' # Delimiter +shFunctionKey: '' # Function +shFunctionName: '' # Function +shNumber: '' # Number +shOperator: '' # Operator +shRepeat: '' # Repeat +shSet: '' # Statement +shSetList: '' # Identifier +shShellVariables: '' # PreProc +shSpecial: '' # Special +shStatement: '' # Statement +shString: '' # String +shTodo: '' # Todo +shAlias: '' # Identifier +shHereDoc01: '' # shRedir +shHereDoc02: '' # shRedir +shHereDoc03: '' # shRedir +shHereDoc04: '' # shRedir +shHereDoc05: '' # shRedir +shHereDoc06: '' # shRedir +shHereDoc07: '' # shRedir +shHereDoc08: '' # shRedir +shHereDoc09: '' # shRedir +shHereDoc10: '' # shRedir +shHereDoc11: '' # shRedir +shHereDoc12: '' # shRedir +shHereDoc13: '' # shRedir +shHereDoc14: '' # shRedir +shHereDoc15: '' # shRedir +shHereDoc16: '' # shRedir +shHereDoc17: '' # shRedir +shHereDoc18: '' # shRedir +shHereDoc19: '' # shRedir +shHereDoc20: '' # shRedir +shHereDoc21: '' # shRedir +shHereDoc22: '' # shRedir +shHereDoc23: '' # shRedir +shHereDoc24: '' # shRedir +shHereDoc25: '' # shRedir +shHereDoc26: '' # shRedir +shHereDoc27: '' # shRedir +shHereDoc28: '' # shRedir +shHereDoc29: '' # shRedir +shHereDoc30: '' # shRedir +shHereDoc31: '' # shRedir +shHereDoc32: '' # shRedir diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/unite.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/unite.yml new file mode 100755 index 0000000..88ff793 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/unite.yml @@ -0,0 +1,29 @@ +uniteError: '' # Error +uniteMarkedLine: '' # Statement +uniteCandidateSourceName: '' # Type +uniteQuickMatchText: '' # Special +uniteCandidateIcon: '' # Special +uniteMarkedIcon: '' # Statement +uniteCandidateInputKeyword: '' # Function +uniteChooseAction: '' # NONE +uniteChooseCandidate: '' # NONE +uniteChooseKey: '' # SpecialKey +uniteChooseMessage: '' # NONE +uniteChoosePrompt: '' # uniteSourcePrompt +uniteChooseSource: '' # uniteSourceNames +uniteInputPrompt: '' # Normal +uniteInputLine: '' # Identifier +uniteInputCommand: '' # Statement +uniteStatusNormal: '' # StatusLine +uniteStatusHead: '' # Statement +uniteStatusSourceNames: '' # PreProc +uniteStatusSourceCandidates: '' # Constant +uniteStatusMessage: '' # Comment +uniteStatusLineNR: '' # LineNR + + +#vimfiler +vimfilerLeaf: 'base05 . .' +vimfilerNormalFile: 'base05 base00 .' +vimfilerOpenedFile: 'base0D . .' +vimfilerClosedFile: 'base0D . .' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/vim-gitgutter.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/vim-gitgutter.yml new file mode 100755 index 0000000..f89c9d9 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/vim-gitgutter.yml @@ -0,0 +1,5 @@ +# GitGutter airblade/vim-gitgutter +GitGutterAdd: 'base0B base01 .' +GitGutterChange: 'base0D base01 .' +GitGutterDelete: 'base08 base01 .' +GitGutterChangeDelete: 'base0E base01 .' diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/xml.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/xml.yml new file mode 100755 index 0000000..76c00af --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/xml.yml @@ -0,0 +1,24 @@ +xmlTodo: '' # Todo +xmlTag: 'base0C' # Function +xmlTagName: 'base05' # Function +xmlEndTag: 'base0C . .' +xmlNamespace: '' # Tag +xmlEntity: '' # Statement +xmlEntityPunct: '' # Type +xmlAttribPunct: '' # Comment +xmlAttrib: '' # Type +xmlString: '' # String +xmlComment: '' # Comment +xmlCommentStart: '' # xmlComment +xmlCommentPart: '' # Comment +xmlCommentError: '' # Error +xmlError: '' # Error +xmlProcessingDelim: '' # Comment +xmlProcessing: '' # Type +xmlCdata: '' # String +xmlCdataCdata: '' # Statement +xmlCdataStart: '' # Type +xmlCdataEnd: '' # Type +xmlDocTypeDecl: '' # Function +xmlDocTypeKeyword: '' # Statement +xmlInlineDTD: '' # Function diff --git a/.config/nvim/colors/oceanic-next/estilo/syntax/yajs.yml b/.config/nvim/colors/oceanic-next/estilo/syntax/yajs.yml new file mode 100755 index 0000000..5846471 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/estilo/syntax/yajs.yml @@ -0,0 +1,80 @@ +javascriptReserved: '' # Error +javascriptReservedCase: '' # Error +javascriptInvalidOp: '' # Error +javascriptEndColons: '' # Statement +javascriptOpSymbol: '' # Normal +javascriptBraces: '' # Function +javascriptBrackets: '' # Function +javascriptParens: '' # Normal +javascriptComment: '' # Comment +javascriptLineComment: '' # Comment +javascriptDocComment: '' # Comment +javascriptCommentTodo: '' # Todo +javascriptDocNotation: '' # SpecialComment +javascriptDocTags: '' # SpecialComment +javascriptDocNGParam: '' # javascriptDocParam +javascriptDocParam: '' # Function +javascriptDocNumParam: '' # Function +javascriptDocEventRef: '' # Function +javascriptDocNamedParamType: '' # Type +javascriptDocParamName: '' # Type +javascriptDocParamType: '' # Type +javascriptString: '' # String +javascriptTemplate: '' # String +javascriptEventString: '' # String +javascriptASCII: '' # Label +javascriptTemplateSubstitution: '' # Label +javascriptTemplateSB: '' # javascriptTemplateSubstitution +javascriptRegexpString: '' # String +javascriptGlobal: '' # Constant +javascriptCharacter: '' # Character +javascriptPrototype: '' # Type +javascriptConditional: '' # Conditional +javascriptConditionalElse: '' # Conditional +javascriptSwitch: '' # Conditional +javascriptCase: '' # Conditional +javascriptDefault: '' # javascriptCase +javascriptExportDefault: '' # javascriptCase +javascriptBranch: '' # Conditional +javascriptIdentifier: '' # Structure +javascriptVariable: '' # Identifier +javascriptRepeat: '' # Repeat +javascriptForComprehension: '' # Repeat +javascriptIfComprehension: '' # Repeat +javascriptOfComprehension: '' # Repeat +javascriptForOperator: '' # Repeat +javascriptStatementKeyword: '' # Statement +javascriptReturn: '' # Statement +javascriptYield: '' # Statement +javascriptYieldGen: '' # Statement +javascriptMessage: '' # Keyword +javascriptOperator: '' # Identifier +javascriptTarget: '' # Identifier +javascriptNull: '' # Boolean +javascriptNumber: '' # Number +javascriptBoolean: '' # Boolean +javascriptObjectLabel: '' # javascriptLabel +javascriptObjectLabelColon: '' # javascriptLabel +javascriptLabel: '' # Label +javascriptPropertyName: '' # Label +javascriptImport: '' # Special +javascriptExport: '' # Special +javascriptTry: '' # Statement +javascriptExceptions: '' # Statement +javascriptMethodName: '' # Function +javascriptMethodAccessor: '' # Operator +javascriptObjectMethodName: '' # Function +javascriptFuncKeyword: '' # Keyword +javascriptAsyncFunc: '' # Keyword +javascriptArrowFunc: '' # Type +javascriptFuncName: '' # Function +javascriptFuncArg: '' # Special +javascriptArrowFuncArg: '' # javascriptFuncArg +javascriptComma: '' # Normal +javascriptClassKeyword: '' # Keyword +javascriptClassExtends: '' # Keyword +javascriptClassName: '' # Function +javascriptClassSuperName: '' # Function +javascriptClassStatic: '' # StorageClass +javascriptClassSuper: '' # keyword +shellbang: '' # Comment diff --git a/.config/nvim/colors/oceanic-next/license.txt b/.config/nvim/colors/oceanic-next/license.txt new file mode 100755 index 0000000..bd98b5e --- /dev/null +++ b/.config/nvim/colors/oceanic-next/license.txt @@ -0,0 +1,272 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +==== + +The above license applies to all parts of Neovim except (1) parts that were +contributed under the Vim license and (2) externally maintained libraries. + +The externally maintained libraries used by Neovim are: + + - Klib: a Generic Library in C. MIT/X11 license. + - libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license. + - LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license. + +==== + +Any parts of Neovim that were contributed under the Vim license are licensed +under the Vim license unless the copyright holder gave permission to license +those contributions under the Apache 2.0 license. + +The Vim license follows: + +VIM LICENSE + +I) There are no restrictions on distributing unmodified copies of Vim except + that they must include this license text. You can also distribute + unmodified parts of Vim, likewise unrestricted except that they must + include this license text. You are also allowed to include executables + that you made from the unmodified Vim sources, plus your own usage + examples and Vim scripts. + +II) It is allowed to distribute a modified (or extended) version of Vim, + including executables and/or source code, when the following four + conditions are met: + 1) This license text must be included unmodified. + 2) The modified Vim must be distributed in one of the following five ways: + a) If you make changes to Vim yourself, you must clearly describe in + the distribution how to contact you. When the maintainer asks you + (in any way) for a copy of the modified Vim you distributed, you + must make your changes, including source code, available to the + maintainer without fee. The maintainer reserves the right to + include your changes in the official version of Vim. What the + maintainer will do with your changes and under what license they + will be distributed is negotiable. If there has been no negotiation + then this license, or a later version, also applies to your changes. + The current maintainer is Bram Moolenaar . If this + changes it will be announced in appropriate places (most likely + vim.sf.net, www.vim.org and/or comp.editors). When it is completely + impossible to contact the maintainer, the obligation to send him + your changes ceases. Once the maintainer has confirmed that he has + received your changes they will not have to be sent again. + b) If you have received a modified Vim that was distributed as + mentioned under a) you are allowed to further distribute it + unmodified, as mentioned at I). If you make additional changes the + text under a) applies to those changes. + c) Provide all the changes, including source code, with every copy of + the modified Vim you distribute. This may be done in the form of a + context diff. You can choose what license to use for new code you + add. The changes and their license must not restrict others from + making their own changes to the official version of Vim. + d) When you have a modified Vim which includes changes as mentioned + under c), you can distribute it without the source code for the + changes if the following three conditions are met: + - The license that applies to the changes permits you to distribute + the changes to the Vim maintainer without fee or restriction, and + permits the Vim maintainer to include the changes in the official + version of Vim without fee or restriction. + - You keep the changes for at least three years after last + distributing the corresponding modified Vim. When the maintainer + or someone who you distributed the modified Vim to asks you (in + any way) for the changes within this period, you must make them + available to him. + - You clearly describe in the distribution how to contact you. This + contact information must remain valid for at least three years + after last distributing the corresponding modified Vim, or as long + as possible. + e) When the GNU General Public License (GPL) applies to the changes, + you can distribute the modified Vim under the GNU GPL version 2 or + any later version. + 3) A message must be added, at least in the output of the ":version" + command and in the intro screen, such that the user of the modified Vim + is able to see that it was modified. When distributing as mentioned + under 2)e) adding the message is only required for as far as this does + not conflict with the license used for the changes. + 4) The contact information as required under 2)a) and 2)d) must not be + removed or changed, except that the person himself can make + corrections. + +III) If you distribute a modified version of Vim, you are encouraged to use + the Vim license for your changes and make them available to the + maintainer, including the source code. The preferred way to do this is + by e-mail or by uploading the files to a server and e-mailing the URL. + If the number of changes is small (e.g., a modified Makefile) e-mailing a + context diff will do. The e-mail address to be used is + + +IV) It is not allowed to remove this license from the distribution of the Vim + sources, parts of it or from a modified version. You may use this + license for previous Vim releases instead of the license that they came + with, at your option. diff --git a/.config/nvim/colors/oceanic-next/oceanic-next-dark.nvim.png b/.config/nvim/colors/oceanic-next/oceanic-next-dark.nvim.png new file mode 100755 index 0000000..2d59173 Binary files /dev/null and b/.config/nvim/colors/oceanic-next/oceanic-next-dark.nvim.png differ diff --git a/.config/nvim/colors/oceanic-next/test/react.Component.tsx b/.config/nvim/colors/oceanic-next/test/react.Component.tsx new file mode 100755 index 0000000..895725c --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/react.Component.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +class MyComponent extends React.Component { + constructor() { + super(); + + this.state = { + title: 'World', + }; + } + + componentDidMount() { + console.log('MyComponent is mounted!'); + } + + clickHandler(title) { + this.setState({ title }); + } + + render() { + const { title } = this.state; + + return ( +
+

Hello, {title}!

+ +
+ ); + } +} +export default MyComponent; diff --git a/.config/nvim/colors/oceanic-next/test/react.js b/.config/nvim/colors/oceanic-next/test/react.js new file mode 100755 index 0000000..895725c --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/react.js @@ -0,0 +1,31 @@ +import React from 'react'; + +class MyComponent extends React.Component { + constructor() { + super(); + + this.state = { + title: 'World', + }; + } + + componentDidMount() { + console.log('MyComponent is mounted!'); + } + + clickHandler(title) { + this.setState({ title }); + } + + render() { + const { title } = this.state; + + return ( +
+

Hello, {title}!

+ +
+ ); + } +} +export default MyComponent; diff --git a/.config/nvim/colors/oceanic-next/test/rust.rs b/.config/nvim/colors/oceanic-next/test/rust.rs new file mode 100755 index 0000000..3978def --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/rust.rs @@ -0,0 +1 @@ +#[tokio::main] diff --git a/.config/nvim/colors/oceanic-next/test/style-components.js b/.config/nvim/colors/oceanic-next/test/style-components.js new file mode 100755 index 0000000..52929ac --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/style-components.js @@ -0,0 +1,17 @@ +import styled from 'styled-components'; + +const Button = styled.button` + /* Color the background and border with theme.main */ + background: ${props => props.theme.main}; + border: 2px solid ${props => props.theme.main}; + + /* …more styles here… */ +`; + +// Set the default theme, in our case main will be +// palevioletred if no other theme is specified +Button.defaultProps = { + theme: { + main: 'palevioletred', + }, +}; diff --git a/.config/nvim/colors/oceanic-next/test/test.css b/.config/nvim/colors/oceanic-next/test/test.css new file mode 100755 index 0000000..11cbf94 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/test.css @@ -0,0 +1,88 @@ +.color{ + color: #202020; /* dark-gray */ + color: #303030; /* med-gray-hi */ + color: #3a3a3a; /* med-gray-lo */ + color: #505050; /* light-gray */ + color: #99cc99; /* green */ + color: #6a9fb5; /* blue */ + color: #aa769f; /* purple */ + color: #d28446; /* orange */ + color: #ac4142; /* red */ + color: #d7afdc; /* pink */ + +} + +elm{ + let s:gui00 = "132838" + let s:gui01 = "343d46" + let s:gui02 = "4f5b66" + let s:gui03 = "65737e" + let s:gui04 = "a7adba" + let s:gui05 = "c0c5ce" + let s:gui06 = "cdd3de" + let s:gui07 = "d8dee9" + let s:gui08 = "ec5f67" + let s:gui09 = "f99157" + let s:gui0A = "fac863" + let s:gui0B = "99c794" + let s:gui0C = "5fb3b3" + let s:gui0D = "6699cc" + let s:gui0E = "c594c5" + let s:gui0F = "ab7967" + + + let s:cterm00 = "00" + let s:cterm01 = "236" + let s:cterm02 = "239" + let s:cterm03 = "59" + let s:cterm04 = "145" + let s:cterm05 = "152" + let s:cterm06 = "188" + let s:cterm07 = "15" + let s:cterm08 = "203" + let s:cterm09 = "209" + let s:cterm0A = "221" + let s:cterm0B = "114" + let s:cterm0C = "73" + let s:cterm0D = "68" + let s:cterm0E = "176" + let s:cterm0F = "137" +} +elm{ + + + +base04: #A7ADBA +base05: #C0C5CE +base06: #CDD3DE +base07: #D8DEE9 +base08: #EC5f67 +base09: #F99157 +base0A: #FAC863 +base0B: #99C794 +base0C: #5FB3B3 +base0D: #6699CC +base0E: #C594C5 +base0F: #AB7967 +} + +elm { + +gui00: #1b2b34; +gui01: #343d46; +gui02: #4f5b66; +gui03: #65737e; +gui04: #a7adba; +gui05: #c0c5ce; +gui06: #cdd3de; +gui07: #d8dee9; +gui08: #ec5f67; +gui09: #f99157; +gui0A: #fac863; +gui0B: #99c794; +gui0C: #5fb3b3; +gui0D: #6699cc; +gui0E: #c594c5; +gui0F: #ab7967; + +} diff --git a/.config/nvim/colors/oceanic-next/test/test.js b/.config/nvim/colors/oceanic-next/test/test.js new file mode 100755 index 0000000..341245a --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/test.js @@ -0,0 +1,37 @@ +import config from '../config'; +import SoundCloudAudio from 'soundcould-audio'; + +class SoundCloudAudio extends SoundCloudAudio { + constructor(clientId) { + super(clientId); + this._events = {}; + } + + on(e, fn) { + this._events[e] = fn; + this.audio.addEventListener(e, fn, false); + } + + off(e, fn) { + this._events[e] = null; + this.audio.addEventListener(e, fn); + } + + unbindAll() { + for (var e in this._events) { + var fn = this._events[e]; + if (fn) { + this.off(e, fn); + } + } + } + + preload(streamUrl) { + this._track = { + stream_url: streamUrl, + }; + this.audio.src = streamUrl = '?client_id' = +this._clientId; + } +} + +export default new SoundCloud(config.soundcould.clientId); diff --git a/.config/nvim/colors/oceanic-next/test/test.jsx b/.config/nvim/colors/oceanic-next/test/test.jsx new file mode 100755 index 0000000..e11f6d9 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/test.jsx @@ -0,0 +1,42 @@ +const EmailField = function (props) { + return { + propTypes: { + email: React.PropTypes.string, + isEditMode: React.PropTypes.bool + }, + + props, + + onKeyUp (e) { + if (e.keyCode !== ENTER_KEY) return; + setEmail(e.target.value); + }, + + render () { + const isEditMode = this.props.isEditMode; + const email = this.props.email; + + const displayStyle = { + display: isEditMode ? 'none' : 'block' + }; + const editStyle = { + display: isEditMode ? 'block' : 'none' + }; + + return ( +
+

setEditMode(true) } + style = { displayStyle } + >{ email } +

+ +
+ ); + } + }; +}; diff --git a/.config/nvim/colors/oceanic-next/test/test.md b/.config/nvim/colors/oceanic-next/test/test.md new file mode 100755 index 0000000..b904e32 --- /dev/null +++ b/.config/nvim/colors/oceanic-next/test/test.md @@ -0,0 +1,11 @@ +# Here is a H1 +## Here is a H2 +### Here is a H3 + +**Bold** + +_italic_ + +```html +
+``` diff --git a/.config/nvim/colors/onedark b/.config/nvim/colors/onedark deleted file mode 160000 index e86ce93..0000000 --- a/.config/nvim/colors/onedark +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e86ce939d85576fb7ce6c1c45fd49c8a570c24cc diff --git a/.config/nvim/colors/onedark/.eslintrc.json b/.config/nvim/colors/onedark/.eslintrc.json new file mode 100755 index 0000000..eaa63f2 --- /dev/null +++ b/.config/nvim/colors/onedark/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "env": { + "es6": true, + "node": true + }, + "extends": "eslint:recommended", + "rules": { + "no-console": ["off"] + } +} diff --git a/.config/nvim/colors/onedark/.npmrc b/.config/nvim/colors/onedark/.npmrc new file mode 100755 index 0000000..38f11c6 --- /dev/null +++ b/.config/nvim/colors/onedark/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org diff --git a/.config/nvim/colors/onedark/.prettierrc b/.config/nvim/colors/onedark/.prettierrc new file mode 100755 index 0000000..6dd6218 --- /dev/null +++ b/.config/nvim/colors/onedark/.prettierrc @@ -0,0 +1,6 @@ +{ + "arrowParens": "avoid", + "printWidth": 120, + "singleQuote": true, + "trailingComma": "none" +} diff --git a/.config/nvim/colors/onedark/CONTRIBUTING.md b/.config/nvim/colors/onedark/CONTRIBUTING.md new file mode 100755 index 0000000..6dcf8ef --- /dev/null +++ b/.config/nvim/colors/onedark/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# Contributing to onedark.vim + +Please read this document before submitting a Pull Request. + +**Pull Requests containing changes to files in the `autoload/` or `colors/` directories without corresponding changes to files in the `build/templates` directory will _not_ be merged.** + +## Build System + +### Background Information + +onedark.vim's shared color definitions file `autoload/onedark.vim` and its companion Xresources color palette file are built using a rudimentary templating and build system that allows color definitions to live in a single, central file. (Additional terminal color palette files are themselves generated from the template-produced Xresources file.) + +The basic idea is that these files are generated by a build tool that substitutes color values into templates that live in `build/templates`. + +Here are the locations of the files that are generated by the build system, along with the locations of the corresponding templates they are generated from: + +| Theme Location | Template Location | +| --------------------------- | --------------------------------------- | +| `autoload/onedark.vim` | `build/templates/autoload.template.vim` | +| `term/One Dark.Xresources` | `build/templates/One Dark.Xresources` | +| `term/One Dark.itermcolors` | `build/templates/One Dark.itermcolors` | +| `term/One Dark.terminal` | `build/templates/One Dark.terminal` | +| `term/One Dark.alacritty` | `build/templates/One Dark.alacritty` | +| `term/One Dark.colorscheme` | `build/templates/One Dark.colorscheme` | + +### Configure It + +1. Install [Node.js](https://nodejs.org/en/) (Installing via [nvm](https://github.com/creationix/nvm) or [homebrew](https://brew.sh) are both better options than the official Node.js installer.) + +2. Run the following from within the root of this repository. This will install the build system's dependencies and will automatically configure a Git pre-commit hook that runs `npm test` (see below). + +```bash +> npm install +``` + +That's it! + +### Use It + +The build system consists of a single Node.js script, `build/build.js`, which supports two commands: + +- Running `./build/build.js` or `npm run build` generates theme files from the templates, **overwriting changes to the theme files without confirmation.** +- Running `./build/build.js check` or `npm test` checks that the theme files match the template-generated output, **without modifying theme files**. This command ensures that the theme files perfectly match the templates they are generated from, which is useful for detecting changes that were made to generated theme files but that should have been made in the templates. +- In addition to running `./build/build.js check`, `npm test` also runs linting and style checks on certain files to catch and prevent simple problems and stylistic inconsistency. If `npm test` reports any issues, many reported issues can be automatically fixed by running `npm run lint:fix`.) + +The basic development workflow looks like this: + +1. Make changes to the appropriate template files in `build/templates`, then run `npm run build`. + +2. Commit your changes with Git. `npm test` will automatically run before your commit is finalized. If the test fails, fix any inconsistencies between the template files and theme files (or linting/style errors if applicable), then try committing again. + +## Style Guidelines + +Please match the existing comment and whitespace style in all template files. + +For the "Language-Specific Highlighting" portion of onedark.vim, blocks for each language should be organized alphabetically ("Markdown" comes before "PHP"). + +All code changes should pass against the included linting and style checks. These checks are run via [husky](https://www.npmjs.com/package/husky) and [lint-staged](https://www.npmjs.com/package/lint-staged) when you attempt to commit changes. You can manually check for linting and stylistic issues by running `npm test`, and many reported issues can be automatically fixed by running `npm run lint:fix`. + +## Thanks! + +Thanks very much for contributing to onedark.vim! diff --git a/.config/nvim/colors/onedark/LICENSE b/.config/nvim/colors/onedark/LICENSE new file mode 100755 index 0000000..015bbd6 --- /dev/null +++ b/.config/nvim/colors/onedark/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Joshua Dick + +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. diff --git a/.config/nvim/colors/onedark/README.md b/.config/nvim/colors/onedark/README.md new file mode 100755 index 0000000..64b4ba9 --- /dev/null +++ b/.config/nvim/colors/onedark/README.md @@ -0,0 +1,277 @@ +![onedark.vim](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/readme_header.png) + +A dark Vim/Neovim color scheme for the GUI and 16/256/true-color terminals, based on [FlatColor](https://github.com/MaxSt/FlatColor), with colors inspired by the excellent [One Dark syntax theme](https://github.com/atom/atom/tree/master/packages/one-dark-syntax) for the [Atom text editor](https://atom.io). + +## Color Reference + +![Color Reference](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/color_reference.png) + +## Breaking Changes + +[Pull request #271](https://github.com/joshdick/onedark.vim/pull/271), merged July 11, 2021, contained several breaking changes, especially for 16-color users. + +If you are an existing onedark.vim user that is suddenly having issues after this PR was merged, see the [PR description](https://github.com/joshdick/onedark.vim/pull/271) for details. + +## Supported Plugins + +onedark.vim includes support for the following Vim and Neovim plugins: + +- [airblade/vim-gitgutter](https://github.com/airblade/vim-gitgutter) +- [dense-analysis/ale](https://github.com/dense-analysis/ale) +- [easymotion/vim-easymotion](https://github.com/easymotion/vim-easymotion) +- [itchyny/lightline.vim](https://github.com/itchyny/lightline.vim) +- [lewis6991/gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) +- [mhinz/vim-signify](https://github.com/mhinz/vim-signify) +- [neoclide/coc.nvim](https://github.com/neoclide/coc.nvim) +- [neomake/neomake](https://github.com/neomake/neomake) +- [Neovim LSP](https://neovim.io/doc/user/lsp.html) +- [plasticboy/vim-markdown](https://github.com/plasticboy/vim-markdown) +- [prabirshrestha/vim-lsp](https://github.com/prabirshrestha/vim-lsp) +- [tpope/vim-fugitive](https://github.com/tpope/vim-fugitive) +- [vim-airline/vim-airline](https://github.com/vim-airline/vim-airline) + +## Installation + +1. Install the theme using your Vim plug-in manager of choice (or manually, by placing `colors/onedark.vim` in your `~/.vim/colors/` directory and `autoload/onedark.vim` in your `~/.vim/autoload/` directory.) + + The theme also supports being installed as a Vim 8 package. Simply clone this repository into `~/.vim/pack/*/opt/` (so that the local path to this README would end up being `~/.vim/pack/*/opt/onedark.vim/README.md`) and add `packadd! onedark.vim` to your `~/.vimrc`. (The `*` in the path can be any value; see `:help packages` for more information.) + +2. If you use Vim in a terminal, do the following to test whether your terminal emulator supports [24-bit/"true" color](https://gist.github.com/XVilka/8346728), then add relevant `~/.vimrc` configuration if so: + + _Note: GUI (non-terminal) Vim will always display 24-bit color regardless of the configuration done in this step._ + + Run the following snippet in your shell: + + ```shell + printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n" + ``` + + If your terminal emulator **does NOT display the word `TRUECOLOR` in red**, it does not support 24-bit color. If you don't want to switch to a different terminal emulator that [supports 24-bit color](https://gist.github.com/XVilka/8346728), **proceed to step 3**. (After installation, the [`g:onedark_termcolors` option](#options) may interest you.) + + If your terminal emulator displays the word `TRUECOLOR` **in red**, it supports 24-bit color, and you should add the following lines to your `~/.vimrc` to enable 24-bit color terminal support inside Vim. + + (If you use [tmux](https://tmux.github.io/), be sure to view the tmux-related notes in the first few lines.) + + ```vim + "Use 24-bit (true-color) mode in Vim/Neovim when outside tmux. + "If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support + "(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.) + if (empty($TMUX)) + if (has("nvim")) + "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 > + let $NVIM_TUI_ENABLE_TRUE_COLOR=1 + endif + "For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 > + "Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd > + " < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 > + if (has("termguicolors")) + set termguicolors + endif + endif + ``` + +3. Add the following to your `~/.vimrc` (below any lines you may have added in steps 1 and 2): + + ```vim + syntax on + colorscheme onedark + ``` + +4. Installing the [sheerun/vim-polyglot](https://github.com/sheerun/vim-polyglot) plug-in is recommended for improved syntax highlighting for various languages, but is not required. + +## Options + +**Note:** All options should be set **before** the `colorscheme onedark` line in your `~/.vimrc`. + +- `g:onedark_hide_endofbuffer`: Set to `1` if you want to hide end-of-buffer filler lines (~) for a cleaner look; `0` otherwise (the default). + +- `g:onedark_termcolors` **(see [Troubleshooting](#troubleshooting) (below) for more information about this option)**: Set to `256` for 256-color terminals (the default), or set to `16` to use your terminal emulator's native 16 colors. + +- `g:onedark_terminal_italics`: Set to `1` if your terminal emulator supports italics; `0` otherwise (the default). + +## lightline.vim Colorscheme + +![lightline-onedark.vim Preview](https://raw.github.com/joshdick/onedark.vim/main/img/preview_lightline.png) + +This repository includes a companion [lightline.vim](https://github.com/itchyny/lightline.vim) colorscheme for use with onedark.vim. + +The lightline.vim colorscheme: + +- Depends on `autoload/onedark.vim` for its colors, and must therefore be used in conjunction with it. +- Works with both color modes available in onedark.vim (16 or 256 colors), as specified in the configuration for onedark.vim. + +### Installation + +(These instructions assume that lightline.vim and onedark.vim are already installed and configured to your liking.) + +Place `onedark.vim/autoload/lightline/colorscheme/onedark.vim` in your `~/.vim/autoload/lightline/colorscheme/` directory either manually or by using your Vim plug-in manager of choice, then add the following lines to your `~/.vimrc` (or merge them into your existing lightline.vim configuration): + +```vim +let g:lightline = { + \ 'colorscheme': 'onedark', + \ } +``` + +## vim-airline Theme + +![airline-onedark.vim Preview](https://raw.github.com/joshdick/onedark.vim/main/img/preview_airline.png) + +This repository includes a companion [vim-airline](https://github.com/vim-airline/vim-airline) theme for use with onedark.vim. + +The vim-airline theme: + +- Depends on `autoload/onedark.vim` for its colors, and must therefore be used in conjunction with it. +- Works with both color modes available in onedark.vim (16 or 256 colors), as specified in the configuration for onedark.vim. +- Is based on vim-airline's ["tomorrow" theme](https://github.com/vim-airline/vim-airline-themes/blob/master/autoload/airline/themes/tomorrow.vim). + +### Installation + +(These instructions assume that vim-airline and onedark.vim are already installed and configured to your liking.) + +Place `onedark.vim/autoload/airline/themes/onedark.vim` in your `~/.vim/autoload/airline/themes/` directory either manually or by using your Vim plug-in manager of choice, then add the following line to your `~/.vimrc`: + +```vim +let g:airline_theme='onedark' +``` + +## Troubleshooting + +### Why do the colors in terminal Vim look totally crazy? + +![Broken Colors](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/broken_colors.png) + +If Vim looks similar to the screenshot above, you have enabled Vim's 24-bit color terminal support, but your terminal doesn't support 24 bit color. Remove the relevant `~/.vimrc` configuration for enabling 24-bit color support to get things looking better. + +### Why do the colors in terminal Vim look slightly off/not like the preview image at the top of this README? + +If your terminal doesn't support 24-bit color as described in the [Installation](#installation) section of this README, or 24-bit color support is not always available everywhere you use your Vim configuration, colors will not look like they do in the preview image. + +However, you can use the `g:onedark_termcolors` option to control onedark.vim's fallback colors in situations where 24-bit color terminal support is not available. + +`g:onedark_termcolors` can be set to one of two values, `256` for 256-color mode (the default), or `16` for 16-color mode (which uses your terminal emulator's native 16 colors.) + +**When Vim/Neovim are configured to use 24-bit color, the `g:onedark_termcolors` option is ignored. However, `g:onedark_termcolors` can still coexist with 24-bit color configuration.** For instance, when tmux 2.1 or earlier and/or older Vim/Neovim versions that don't support 24-bit color are used, the `g:onedark_termcolors` option will take effect. + +- **256-color mode** is enabled by default with no additional configuration, but colors are less accurate since they are approximated using a 256-color palette. The background color will appear darker than in the preview image, and most other colors will appear brighter than in the preview image. If you don't want to change your terminal's color palette as described in the 16-color mode section below, and your terminal doesn't support 24-bit color, 256-color mode is your only option. + + Although 256-color mode is enabled by default (when not using 24-bit color as described above), you can explicitly enable it by adding the following line to your `~/.vimrc`: + + ```vim + let g:onedark_termcolors=256 + ``` + +- **16-color mode** is the preferred option, since its colors are more accurate than those of 256-color mode. However, you'll need to set your terminal emulator's color palette to this color scheme's custom 16-color palette, since 16-color mode will cause the color scheme to use your terminal emulator's native 16 colors. If you don't use the custom 16-color palette in your terminal emulator when 16-color mode is enabled, onedark.vim's colors will not display correctly in Vim. + + The canonical version of the 16-color palette is an [Xresources](https://en.wikipedia.org/wiki/X_resources) file located in this repository at `term/One Dark.Xresources`. Color schemes for various terminal emulators are also provided in `term/`. (The [iTerm2](https://iterm2.com/) color scheme works with iTerm2 versions 2.9.x and later.) You should be able to easily convert the Xresources color scheme for use with your terminal emulator of choice either by hand, or automatically by using [termcolors](https://github.com/stayradiated/termcolors). + + Assuming your terminal emulator is configured to use the custom 16-color palette as described above, add the following line to your `~/.vimrc` to enable 16-color mode: + + ```vim + let g:onedark_termcolors=16 + ``` + +### Why do all comments look like they're highlighted? + +![Broken Italics](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/broken_italics.png) + +If all comments look like the one in the screenshot above, you have enabled italics in onedark.vim by setting `g:onedark_terminal_italics=1` in your `~/.vimrc`, but your terminal isn't displaying italics correctly. You can either remove the option or [try to fix your terminal](https://github.com/joshdick/onedark.vim/issues/97#issuecomment-299719352). If you're using [iTerm2](http://iterm2.com) on macOS, you might need to [use a special TERMINFO](https://gist.github.com/sos4nt/3187620) to get italics working. + +### Why do colors look washed out when using [iTerm2](https://www.iterm2.com)? + +Make sure that in Preferences, Profiles -> [Active Profile] -> Colors -> Minimum Contrast is turned all the way down. See [#145](https://github.com/joshdick/onedark.vim/issues/145) for more information. + +## Miscellaneous + +### Customizing onedark.vim's look without forking the repository + +onedark.vim exposes `onedark#extend_highlight` and `onedark#set_highlight` functions that you can call from within your `~/.vimrc` in order to customize the look of onedark.vim. + +#### `onedark#extend_highlight` + +`onedark#extend_highlight` allows you to customize individual aspects of onedark.vim's existing highlight groups, overriding only the keys you provide. (To completely redefine/override an existing highlight group, see `onedark#set_highlight` below.) + +`onedark#extend_highlight`'s first argument should be the name of a highlight group, and its second argument should be **partial** style data. + +Place the following lines **before** the `colorscheme onedark` line in your `~/.vimrc`, then change the example overrides to suit your needs: + +```vim +if (has("autocmd")) + augroup colorextend + autocmd! + " Make `Function`s bold in GUI mode + autocmd ColorScheme * call onedark#extend_highlight("Function", { "gui": "bold" }) + " Override the `Statement` foreground color in 256-color mode + autocmd ColorScheme * call onedark#extend_highlight("Statement", { "fg": { "cterm": 128 } }) + " Override the `Identifier` background color in GUI mode + autocmd ColorScheme * call onedark#extend_highlight("Identifier", { "bg": { "gui": "#333333" } }) + augroup END +endif +``` + +#### `onedark#set_highlight` + +`onedark#set_highlight` allows you to completely redefine/override highlight groups of your choosing. + +`onedark#set_highlight`'s first argument should be the name of a highlight group, and its second argument should be **complete** style data. + +For example, to remove the background color only when running in terminals (outside GUI mode and for use in transparent terminals,) place the following lines **before** the `colorscheme onedark` line in your `~/.vimrc`: + +```vim +" onedark.vim override: Don't set a background color when running in a terminal; +" just use the terminal's background color +" `gui` is the hex color code used in GUI mode/nvim true-color mode +" `cterm` is the color code used in 256-color mode +" `cterm16` is the color code used in 16-color mode +if (has("autocmd") && !has("gui_running")) + augroup colorset + autocmd! + let s:white = { "gui": "#ABB2BF", "cterm": "145", "cterm16" : "7" } + autocmd ColorScheme * call onedark#set_highlight("Normal", { "fg": s:white }) " `bg` will not be styled since there is no `bg` setting + augroup END +endif +``` + +#### Global color overrides + +You can override colors across all highlights by adding color definitions to the `g:onedark_color_overrides` dictionary in your `~/.vimrc` like so: + +```vim +let g:onedark_color_overrides = { +\ "background": {"gui": "#2F343F", "cterm": "235", "cterm16": "0" }, +\ "purple": { "gui": "#C678DF", "cterm": "170", "cterm16": "5" } +\} +``` + +This also needs to be done **before** `colorscheme onedark`. + +More examples of highlight group names and style data can be found in onedark.vim's source code (`colors/onedark.vim` inside this repository). + +### tmux theme + +If you'd like a tmux theme that complements onedark.vim, [@odedlaz has you covered](https://github.com/odedlaz/tmux-onedark-theme). + +### Contributing + +If you'd like to contribute to onedark.vim, check out the [contribution guidelines](./CONTRIBUTING.md). + +### Relatives of onedark.vim + +Several other themes and projects have reused code and/or colors from this project, or were otherwise inspired by it. + +If onedark.vim isn't meeting your needs, try one of its relatives! + +- [drewtempelmeyer/palenight.vim](https://github.com/drewtempelmeyer/palenight.vim) +- [KeitaNakamura/neodark.vim](https://github.com/KeitaNakamura/neodark.vim) +- [base16-onedark.vim](https://github.com/chriskempson/base16-vim/blob/master/colors/base16-onedark.vim) + - Associated base16 scheme: [tilal6991/base16-onedark-scheme](https://github.com/tilal6991/base16-onedark-scheme) +- [rakr/vim-one](https://github.com/rakr/vim-one) +- For Neovim >= 0.5 with treesitter support: [navarasu/onedark.nvim](https://github.com/navarasu/onedark.nvim) or [monsonjeremy/onedark.nvim](https://github.com/monsonjeremy/onedark.nvim) +- Neovim-only Lua port: [ii14/onedark.nvim](https://github.com/ii14/onedark.nvim) + +### Preview images + +Preview images were taken using: + +- [iTerm2](https://iterm2.com) terminal emulator on macOS +- 13 pt. [PragmataPro Mono](http://www.fsd.it/fonts/pragmatapro.htm#.VlDa1q6rTOY) font +- [vim-polyglot](https://github.com/sheerun/vim-polyglot) plug-in diff --git a/.config/nvim/colors/onedark/autoload/airline/themes/onedark.vim b/.config/nvim/colors/onedark/autoload/airline/themes/onedark.vim new file mode 100755 index 0000000..65181dd --- /dev/null +++ b/.config/nvim/colors/onedark/autoload/airline/themes/onedark.vim @@ -0,0 +1,130 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +" This is a [vim-airline](https://github.com/vim-airline/vim-airline) theme for use with +" the [onedark.vim](https://github.com/joshdick/onedark.vim) colorscheme. + +" It is based on vim-airline's ["tomorrow" theme](https://github.com/vim-airline/vim-airline-themes/blob/master/autoload/airline/themes/tomorrow.vim). +function! airline#themes#onedark#refresh() + let s:colors = onedark#GetColors() + + if get(g:, 'onedark_termcolors', 256) == 16 + let s:term_red = s:colors.red.cterm16 + let s:term_green = s:colors.green.cterm16 + let s:term_yellow = s:colors.yellow.cterm16 + let s:term_blue = s:colors.blue.cterm16 + let s:term_purple = s:colors.purple.cterm16 + let s:term_white = s:colors.white.cterm16 + let s:term_cursor_grey = s:colors.cursor_grey.cterm16 + let s:term_visual_grey = s:colors.visual_grey.cterm16 + else + let s:term_red = s:colors.red.cterm + let s:term_green = s:colors.green.cterm + let s:term_yellow = s:colors.yellow.cterm + let s:term_blue = s:colors.blue.cterm + let s:term_purple = s:colors.purple.cterm + let s:term_white = s:colors.white.cterm + let s:term_cursor_grey = s:colors.cursor_grey.cterm + let s:term_visual_grey = s:colors.visual_grey.cterm + endif + + let g:airline#themes#onedark#palette = {} + + let g:airline#themes#onedark#palette.accents = { + \ 'red': [ s:colors.red.gui, '', s:term_red, 0 ] + \ } + + let s:N1 = [ s:colors.cursor_grey.gui, s:colors.green.gui, s:term_cursor_grey, s:term_green ] + let s:N2 = [ s:colors.white.gui, s:colors.visual_grey.gui, s:term_white, s:term_visual_grey ] + let s:N3 = [ s:colors.green.gui, s:colors.cursor_grey.gui, s:term_green, s:term_cursor_grey ] + let g:airline#themes#onedark#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + + let group = airline#themes#get_highlight('vimCommand') + let g:airline#themes#onedark#palette.normal_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + let s:I1 = [ s:colors.cursor_grey.gui, s:colors.blue.gui, s:term_cursor_grey, s:term_blue ] + let s:I2 = s:N2 + let s:I3 = [ s:colors.blue.gui, s:colors.cursor_grey.gui, s:term_blue, '' ] + let g:airline#themes#onedark#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) + let g:airline#themes#onedark#palette.insert_modified = g:airline#themes#onedark#palette.normal_modified + + let s:R1 = [ s:colors.cursor_grey.gui, s:colors.red.gui, s:term_cursor_grey, s:term_red ] + let s:R2 = s:N2 + let s:R3 = [ s:colors.red.gui, s:colors.cursor_grey.gui, s:term_red, '' ] + let g:airline#themes#onedark#palette.replace = airline#themes#generate_color_map(s:R1, s:R2, s:R3) + let g:airline#themes#onedark#palette.replace_modified = g:airline#themes#onedark#palette.normal_modified + + let s:V1 = [ s:colors.cursor_grey.gui, s:colors.purple.gui, s:term_cursor_grey, s:term_purple ] + let s:V2 = s:N2 + let s:V3 = [ s:colors.purple.gui, s:colors.cursor_grey.gui, s:term_purple, '' ] + let g:airline#themes#onedark#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) + let g:airline#themes#onedark#palette.visual_modified = g:airline#themes#onedark#palette.normal_modified + + let s:IA1 = [ s:colors.cursor_grey.gui, s:colors.white.gui, s:term_cursor_grey, s:term_white ] + let s:IA2 = [ s:colors.white.gui, s:colors.visual_grey.gui, s:term_white, s:term_visual_grey ] + let s:IA3 = s:N2 + let g:airline#themes#onedark#palette.inactive = airline#themes#generate_color_map(s:IA1, s:IA2, s:IA3) + let g:airline#themes#onedark#palette.inactive_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + " Warning/Error styling code from vim-airline's ["base16" theme](https://github.com/vim-airline/vim-airline-themes/blob/master/autoload/airline/themes/base16.vim) + + " Warnings + let s:WI = [ s:colors.cursor_grey.gui, s:colors.yellow.gui, s:term_cursor_grey, s:term_yellow ] + let g:airline#themes#onedark#palette.normal.airline_warning = [ + \ s:WI[0], s:WI[1], s:WI[2], s:WI[3] + \ ] + + let g:airline#themes#onedark#palette.normal_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.insert.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.insert_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.visual.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.visual_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.replace.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.replace_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + " Errors + let s:ER = [ s:colors.cursor_grey.gui, s:colors.red.gui, s:term_cursor_grey, s:term_red ] + let g:airline#themes#onedark#palette.normal.airline_error = [ + \ s:ER[0], s:ER[1], s:ER[2], s:ER[3] + \ ] + + let g:airline#themes#onedark#palette.normal_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.insert.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.insert_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.visual.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.visual_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.replace.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.replace_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + +endfunction + +call airline#themes#onedark#refresh() diff --git a/.config/nvim/colors/onedark/autoload/lightline/colorscheme/onedark.vim b/.config/nvim/colors/onedark/autoload/lightline/colorscheme/onedark.vim new file mode 100755 index 0000000..d04a501 --- /dev/null +++ b/.config/nvim/colors/onedark/autoload/lightline/colorscheme/onedark.vim @@ -0,0 +1,58 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +" This is a [lightline.vim](https://github.com/itchyny/lightline.vim) colorscheme for use with +" the [onedark.vim](https://github.com/joshdick/onedark.vim) colorscheme. + +let s:colors = onedark#GetColors() + +if get(g:, 'onedark_termcolors', 256) == 16 + let s:term_red = s:colors.red.cterm16 + let s:term_green = s:colors.green.cterm16 + let s:term_yellow = s:colors.yellow.cterm16 + let s:term_blue = s:colors.blue.cterm16 + let s:term_purple = s:colors.purple.cterm16 + let s:term_white = s:colors.white.cterm16 + let s:term_cursor_grey = s:colors.cursor_grey.cterm16 + let s:term_visual_grey = s:colors.visual_grey.cterm16 +else + let s:term_red = s:colors.red.cterm + let s:term_green = s:colors.green.cterm + let s:term_yellow = s:colors.yellow.cterm + let s:term_blue = s:colors.blue.cterm + let s:term_purple = s:colors.purple.cterm + let s:term_white = s:colors.white.cterm + let s:term_cursor_grey = s:colors.cursor_grey.cterm + let s:term_visual_grey = s:colors.visual_grey.cterm +endif + +let s:red = [ s:colors.red.gui, s:term_red ] +let s:green = [ s:colors.green.gui, s:term_green ] +let s:yellow = [ s:colors.yellow.gui, s:term_yellow ] +let s:blue = [ s:colors.blue.gui, s:term_blue ] +let s:purple = [ s:colors.purple.gui, s:term_purple ] +let s:white = [ s:colors.white.gui, s:term_white ] +let s:cursor_grey = [ s:colors.cursor_grey.gui, s:term_cursor_grey ] +let s:visual_grey = [ s:colors.visual_grey.gui, s:term_visual_grey ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:cursor_grey, s:green ], [ s:white, s:visual_grey ] ] +let s:p.normal.right = [ [ s:cursor_grey, s:green ], [ s:white, s:visual_grey ] ] +let s:p.inactive.left = [ [ s:white, s:visual_grey ], [ s:white, s:visual_grey ] ] +let s:p.inactive.right = [ [ s:cursor_grey, s:white ], [ s:cursor_grey, s:white ] ] +let s:p.insert.left = [ [ s:cursor_grey, s:blue ], [ s:white, s:visual_grey ] ] +let s:p.insert.right = [ [ s:cursor_grey, s:blue ], [ s:white, s:visual_grey ] ] +let s:p.replace.left = [ [ s:cursor_grey, s:red ], [ s:white, s:visual_grey ] ] +let s:p.replace.right = [ [ s:cursor_grey, s:red ], [ s:white, s:visual_grey ] ] +let s:p.visual.left = [ [ s:cursor_grey, s:purple ], [ s:white, s:visual_grey ] ] +let s:p.visual.right = [ [ s:cursor_grey, s:purple ], [ s:white, s:visual_grey ] ] +let s:p.normal.middle = [ [ s:white, s:cursor_grey ] ] +let s:p.inactive.middle = [ [ s:white, s:visual_grey ] ] +let s:p.tabline.left = [ [ s:white, s:visual_grey ] ] +let s:p.tabline.tabsel = [ [ s:cursor_grey, s:white ] ] +let s:p.tabline.middle = [ [ s:white, s:cursor_grey ] ] +let s:p.tabline.right = [ [ s:white, s:visual_grey ] ] +let s:p.normal.error = [ [ s:cursor_grey, s:red ] ] +let s:p.normal.warning = [ [ s:cursor_grey, s:yellow ] ] + +let g:lightline#colorscheme#onedark#palette = lightline#colorscheme#flatten(s:p) + diff --git a/.config/nvim/colors/onedark/autoload/onedark.vim b/.config/nvim/colors/onedark/autoload/onedark.vim new file mode 100755 index 0000000..4630ff4 --- /dev/null +++ b/.config/nvim/colors/onedark/autoload/onedark.vim @@ -0,0 +1,29 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +let s:overrides = get(g:, "onedark_color_overrides", {}) + +let s:colors = { + \ "red": get(s:overrides, "red", { "gui": "#E06C75", "cterm": "204", "cterm16": "1" }), + \ "dark_red": get(s:overrides, "dark_red", { "gui": "#BE5046", "cterm": "196", "cterm16": "9" }), + \ "green": get(s:overrides, "green", { "gui": "#98C379", "cterm": "114", "cterm16": "2" }), + \ "yellow": get(s:overrides, "yellow", { "gui": "#E5C07B", "cterm": "180", "cterm16": "3" }), + \ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "#D19A66", "cterm": "173", "cterm16": "11" }), + \ "blue": get(s:overrides, "blue", { "gui": "#61AFEF", "cterm": "39", "cterm16": "4" }), + \ "purple": get(s:overrides, "purple", { "gui": "#C678DD", "cterm": "170", "cterm16": "5" }), + \ "cyan": get(s:overrides, "cyan", { "gui": "#56B6C2", "cterm": "38", "cterm16": "6" }), + \ "white": get(s:overrides, "white", { "gui": "#ABB2BF", "cterm": "145", "cterm16": "15" }), + \ "black": get(s:overrides, "black", { "gui": "#282C34", "cterm": "235", "cterm16": "0" }), + \ "foreground": get(s:overrides, "foreground", { "gui": "#ABB2BF", "cterm": "145", "cterm16": "NONE" }), + \ "background": get(s:overrides, "background", { "gui": "#282C34", "cterm": "235", "cterm16": "NONE" }), + \ "comment_grey": get(s:overrides, "comment_grey", { "gui": "#5C6370", "cterm": "59", "cterm16": "7" }), + \ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "#4B5263", "cterm": "238", "cterm16": "8" }), + \ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "#2C323C", "cterm": "236", "cterm16": "0" }), + \ "visual_grey": get(s:overrides, "visual_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "8" }), + \ "menu_grey": get(s:overrides, "menu_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "7" }), + \ "special_grey": get(s:overrides, "special_grey", { "gui": "#3B4048", "cterm": "238", "cterm16": "7" }), + \ "vertsplit": get(s:overrides, "vertsplit", { "gui": "#3E4452", "cterm": "59", "cterm16": "7" }), + \} + +function! onedark#GetColors() + return s:colors +endfunction diff --git a/.config/nvim/colors/onedark/build/build.js b/.config/nvim/colors/onedark/build/build.js new file mode 100755 index 0000000..e251ccf --- /dev/null +++ b/.config/nvim/colors/onedark/build/build.js @@ -0,0 +1,185 @@ +#!/usr/bin/env node + +const _ = require('lodash'); // ships with termcolors; only used because of termcolors customization +const termcolors = require('termcolors'); +const { readFileSync, writeFileSync } = require('fs'); +const { resolve } = require('path'); + +const baseColors = Object.freeze({ + red: { gui: '#E06C75', cterm: '204', cterm16: '1' }, // alternate cterm: 168 + dark_red: { gui: '#BE5046', cterm: '196', cterm16: '9' }, + green: { gui: '#98C379', cterm: '114', cterm16: '2' }, + yellow: { gui: '#E5C07B', cterm: '180', cterm16: '3' }, + dark_yellow: { gui: '#D19A66', cterm: '173', cterm16: '11' }, + blue: { gui: '#61AFEF', cterm: '39', cterm16: '4' }, // alternate cterm: 75 + purple: { gui: '#C678DD', cterm: '170', cterm16: '5' }, // alternate cterm: 176 + cyan: { gui: '#56B6C2', cterm: '38', cterm16: '6' }, // alternate cterm: 73 + white: { gui: '#ABB2BF', cterm: '145', cterm16: '15' }, + black: { gui: '#282C34', cterm: '235', cterm16: '0' } +}); + +const specialColors = Object.freeze({ + comment_grey: { gui: '#5C6370', cterm: '59', cterm16: '7' }, + gutter_fg_grey: { gui: '#4B5263', cterm: '238', cterm16: '8' }, + cursor_grey: { gui: '#2C323C', cterm: '236', cterm16: '0' }, + visual_grey: { gui: '#3E4452', cterm: '237', cterm16: '8' }, + menu_grey: { cterm16: '7' }, // vim theme handles gui/cterm values + special_grey: { gui: '#3B4048', cterm: '238', cterm16: '7' }, + vertsplit: { gui: '#3E4452', cterm: '59', cterm16: '7' } +}); + +const colors = Object.assign({}, baseColors, specialColors); + +const templateMap = Object.freeze({ + 'templates/autoload.template.vim': '../autoload/onedark.vim', + 'templates/One Dark.Xresources': '../term/One Dark.Xresources' +}); + +const shouldCheck = String(process.argv[2]).toLowerCase() === 'check'; + +const handleError = (message, cause) => { + console.error('Error:', message); + if (cause) console.error('Cause:', cause); + process.exit(-1); +}; + +console.log( + shouldCheck + ? 'Checking for inconsistencies between templates and existing output files...' + : 'Generating output files from templates...' +); + +Object.keys(templateMap).forEach(templateFilename => { + // Read the template + const templatePath = resolve(__dirname, templateFilename); + let templateText; + try { + templateText = readFileSync(templatePath, 'utf8'); + } catch (e) { + handleError(`Error reading template ${templatePath}`, e); + } + + // Compile the template + let template; + try { + template = _.template(templateText); + } catch (e) { + handleError(`Error compiling template ${templatePath}`, e); + } + + // Execute the template (generate the output) + let output; + try { + output = template(colors); + } catch (e) { + handleError(`Error running template ${templatePath}`, e); + } + + let outputPath = resolve(__dirname, templateMap[templateFilename]); + try { + const existingOutput = readFileSync(outputPath, 'utf8'); + // Only need to do something if the generated output differs from what's already on disk + if (output !== existingOutput) { + if (shouldCheck) { + // Check generated output against existing output file + handleError( + `Changes were made to ${templateMap[templateFilename]} that are inconsistent with its template (${templateFilename}).\nDo you need to [re]build?` + ); + } else { + // Overwrite existing output file + try { + writeFileSync(outputPath, output, 'utf8'); + } catch (e) { + handleError(`Error writing to output file ${outputPath}`, e); + } + } + } + } catch (e) { + handleError(`Error reading existing output file ${outputPath}`, e); + } +}); + +try { + // Use the Xresources theme as a color source since it was generated above via templating + const xresources = readFileSync(resolve(__dirname, '../term/One Dark.Xresources'), 'utf8'); + const terminalPalette = termcolors.xresources.import(xresources); + + let alacrittyTemplate, itermTemplate, kittyTemplate, konsoleTemplate, terminalAppTemplate; + + // Compile custom terminal color templates based on ones that ship with termcolors + try { + alacrittyTemplate = termcolors.export( + readFileSync(resolve(__dirname, 'templates/One Dark.alacritty')), + _.partialRight(_.mapValues, function (color) { + return color.toHex().slice(1); + }) + ); + + itermTemplate = termcolors.export( + // From termcolors/lib/formats/iterm.js + readFileSync(resolve(__dirname, 'templates/One Dark.itermcolors')), + _.partialRight(_.mapValues, function (color) { + return color.toAvgRgbArray(); + }) + ); + + kittyTemplate = termcolors.export( + readFileSync(resolve(__dirname, 'templates/One Dark.kitty')), + _.partialRight(_.mapValues, function (color) { + return color.toHex().slice(1); + }) + ); + + konsoleTemplate = termcolors.export( + // From termcolors/lib/formats/konsole.js + readFileSync(resolve(__dirname, 'templates/One Dark.colorscheme')), + _.partialRight(_.mapValues, function (color) { + return color.toRgbArray().join(); + }) + ); + + // From termcolors/lib/formats/terminal-app.js + const code = [ + Buffer.from( + '62706c6973743030d40102030405061516582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a307080f55246e756c6cd3090a0b0c0d0e554e535247425c4e53436f6c6f7253706163655624636c6173734f1027', + 'hex' + ), + Buffer.from( + '0010018002d2101112135a24636c6173736e616d655824636c6173736573574e53436f6c6f72a21214584e534f626a6563745f100f4e534b657965644172636869766572d1171854726f6f74800108111a232d32373b41484e5b628c8e9095a0a9b1b4bdcfd2d700000000000001010000000000000019000000000000000000000000000000d9', + 'hex' + ) + ]; + + terminalAppTemplate = termcolors.export( + readFileSync(resolve(__dirname, 'templates/One Dark.terminal')), + // From termcolors/lib/formats/terminal-app.js + _.partialRight(_.mapValues, function (color) { + var srgb = color.toAvgRgbArray(); + srgb = srgb + .map(function (n) { + return n.toFixed(10).toString(); + }) + .join(' '); + var output = code[0].toString('binary') + srgb + code[1].toString('binary'); + output = Buffer.from(output, 'binary').toString('base64'); + return output.match(/.{1,68}/g).join('\n\t'); + }) + ); + } catch (e) { + handleError('Error compiling terminal color template', e); + } + + try { + writeFileSync(resolve(__dirname, '../term/One Dark.alacritty'), alacrittyTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.itermcolors'), itermTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.kitty'), kittyTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.colorscheme'), konsoleTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.terminal'), terminalAppTemplate(terminalPalette)); + } catch (e) { + handleError('Error writing terminal color file', e); + } +} catch (e) { + handleError('Error reading Xresources terminal color file', e); +} + +console.log('Success!'); diff --git a/.config/nvim/colors/onedark/build/templates/One Dark.Xresources b/.config/nvim/colors/onedark/build/templates/One Dark.Xresources new file mode 100755 index 0000000..632d663 --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/One Dark.Xresources @@ -0,0 +1,37 @@ +! special +*.foreground: <%=white.gui%> +*.background: <%=black.gui%> +*.cursorColor: <%=white.gui%> + +! black +*.color0: <%=cursor_grey.gui%> +*.color8: <%=visual_grey.gui%> + +! red +*.color1: <%=red.gui%> +*.color9: <%=red.gui%> + +! green +*.color2: <%=green.gui%> +*.color10: <%=green.gui%> + +! yellow +*.color3: <%=yellow.gui%> +*.color11: <%=yellow.gui%> + +! blue +*.color4: <%=blue.gui%> +*.color12: <%=blue.gui%> + +! magenta +*.color5: <%=purple.gui%> +*.color13: <%=purple.gui%> + +! cyan +*.color6: <%=cyan.gui%> +*.color14: <%=cyan.gui%> + +! white +*.color7: <%=comment_grey.gui%> +*.color15: <%=white.gui%> + diff --git a/.config/nvim/colors/onedark/build/templates/One Dark.alacritty b/.config/nvim/colors/onedark/build/templates/One Dark.alacritty new file mode 100755 index 0000000..bc64afd --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/One Dark.alacritty @@ -0,0 +1,38 @@ +# Colors (One Dark) +colors: + # Default colors + primary: + foreground: '0x{{=c.foreground}}' + background: '0x{{=c.background}}' + + # Cursor colors + cursor: + text: '0x{{=c[0]}}' + cursor: '0x{{=c[7]}}' + + # Selection colors + selection: + text: CellForeground + background: '0x{{=c[8]}}' + + # Normal colors + normal: + black: '0x{{=c[0]}}' + red: '0x{{=c[1]}}' + green: '0x{{=c[2]}}' + yellow: '0x{{=c[3]}}' + blue: '0x{{=c[4]}}' + magenta: '0x{{=c[5]}}' + cyan: '0x{{=c[6]}}' + white: '0x{{=c[7]}}' + + # Bright colors + bright: + black: '0x{{=c[8]}}' + red: '0x{{=c[9]}}' + green: '0x{{=c[10]}}' + yellow: '0x{{=c[11]}}' + blue: '0x{{=c[12]}}' + magenta: '0x{{=c[13]}}' + cyan: '0x{{=c[14]}}' + white: '0x{{=c[15]}}' diff --git a/.config/nvim/colors/onedark/build/templates/One Dark.colorscheme b/.config/nvim/colors/onedark/build/templates/One Dark.colorscheme new file mode 100755 index 0000000..26cbe0b --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/One Dark.colorscheme @@ -0,0 +1,96 @@ +[Background] +Color={{=c.background}} + +[BackgroundFaint] +Color={{=c.background}} + +[BackgroundIntense] +Color={{=c.background}} + +[Color0] +Color={{=c[0]}} + +[Color0Faint] +Color={{=c[0]}} + +[Color0Intense] +Color={{=c[8]}} + +[Color1] +Color={{=c[1]}} + +[Color1Faint] +Color={{=c[1]}} + +[Color1Intense] +Color={{=c[9]}} + +[Color2] +Color={{=c[2]}} + +[Color2Faint] +Color={{=c[2]}} + +[Color2Intense] +Color={{=c[10]}} + +[Color3] +Color={{=c[3]}} + +[Color3Faint] +Color={{=c[3]}} + +[Color3Intense] +Color={{=c[11]}} + +[Color4] +Color={{=c[4]}} + +[Color4Faint] +Color={{=c[4]}} + +[Color4Intense] +Color={{=c[12]}} + +[Color5] +Color={{=c[5]}} + +[Color5Faint] +Color={{=c[5]}} + +[Color5Intense] +Color={{=c[13]}} + +[Color6] +Color={{=c[6]}} + +[Color6Faint] +Color={{=c[6]}} + +[Color6Intense] +Color={{=c[14]}} + +[Color7] +Color={{=c[7]}} + +[Color7Faint] +Color={{=c[7]}} + +[Color7Intense] +Color={{=c[15]}} + +[Foreground] +Color={{=c.foreground}} + +[ForegroundFaint] +Color={{=c.foreground}} + +[ForegroundIntense] +Color={{=c.foreground}} + +[General] +Blur=false +ColorRandomization=false +Description=One Dark +Opacity=1 +Wallpaper= diff --git a/.config/nvim/colors/onedark/build/templates/One Dark.itermcolors b/.config/nvim/colors/onedark/build/templates/One Dark.itermcolors new file mode 100755 index 0000000..faa4104 --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/One Dark.itermcolors @@ -0,0 +1,259 @@ + + + + + Ansi 0 Color + + Color Space + sRGB + Blue Component + {{=c[0][2]}} + Green Component + {{=c[0][1]}} + Red Component + {{=c[0][0]}} + + Ansi 1 Color + + Color Space + sRGB + Blue Component + {{=c[1][2]}} + Green Component + {{=c[1][1]}} + Red Component + {{=c[1][0]}} + + Ansi 10 Color + + Color Space + sRGB + Blue Component + {{=c[10][2]}} + Green Component + {{=c[10][1]}} + Red Component + {{=c[10][0]}} + + Ansi 11 Color + + Color Space + sRGB + Blue Component + {{=c[11][2]}} + Green Component + {{=c[11][1]}} + Red Component + {{=c[11][0]}} + + Ansi 12 Color + + Color Space + sRGB + Blue Component + {{=c[12][2]}} + Green Component + {{=c[12][1]}} + Red Component + {{=c[12][0]}} + + Ansi 13 Color + + Color Space + sRGB + Blue Component + {{=c[13][2]}} + Green Component + {{=c[13][1]}} + Red Component + {{=c[13][0]}} + + Ansi 14 Color + + Color Space + sRGB + Blue Component + {{=c[14][2]}} + Green Component + {{=c[14][1]}} + Red Component + {{=c[14][0]}} + + Ansi 15 Color + + Color Space + sRGB + Blue Component + {{=c[15][2]}} + Green Component + {{=c[15][1]}} + Red Component + {{=c[15][0]}} + + Ansi 2 Color + + Color Space + sRGB + Blue Component + {{=c[2][2]}} + Green Component + {{=c[2][1]}} + Red Component + {{=c[2][0]}} + + Ansi 3 Color + + Color Space + sRGB + Blue Component + {{=c[3][2]}} + Green Component + {{=c[3][1]}} + Red Component + {{=c[3][0]}} + + Ansi 4 Color + + Color Space + sRGB + Blue Component + {{=c[4][2]}} + Green Component + {{=c[4][1]}} + Red Component + {{=c[4][0]}} + + Ansi 5 Color + + Color Space + sRGB + Blue Component + {{=c[5][2]}} + Green Component + {{=c[5][1]}} + Red Component + {{=c[5][0]}} + + Ansi 6 Color + + Color Space + sRGB + Blue Component + {{=c[6][2]}} + Green Component + {{=c[6][1]}} + Red Component + {{=c[6][0]}} + + Ansi 7 Color + + Color Space + sRGB + Blue Component + {{=c[7][2]}} + Green Component + {{=c[7][1]}} + Red Component + {{=c[7][0]}} + + Ansi 8 Color + + Color Space + sRGB + Blue Component + {{=c[8][2]}} + Green Component + {{=c[8][1]}} + Red Component + {{=c[8][0]}} + + Ansi 9 Color + + Color Space + sRGB + Blue Component + {{=c[9][2]}} + Green Component + {{=c[9][1]}} + Red Component + {{=c[9][0]}} + + Background Color + + Color Space + sRGB + Blue Component + {{=c.background[2]}} + Green Component + {{=c.background[1]}} + Red Component + {{=c.background[0]}} + + Bold Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + Cursor Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + Cursor Text Color + + Color Space + sRGB + Blue Component + {{=c.background[2]}} + Green Component + {{=c.background[1]}} + Red Component + {{=c.background[0]}} + + Foreground Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + Selected Text Color + + Color Space + sRGB + Blue Component + {{=c.background[2]}} + Green Component + {{=c.background[1]}} + Red Component + {{=c.background[0]}} + + Selection Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + + diff --git a/.config/nvim/colors/onedark/build/templates/One Dark.kitty b/.config/nvim/colors/onedark/build/templates/One Dark.kitty new file mode 100755 index 0000000..ceb8ef1 --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/One Dark.kitty @@ -0,0 +1,41 @@ +# Cursor +cursor #{{=c[7]}} +cursor_text_color #{{=c[0]}} + +# Special +foreground #{{=c.foreground}} +background #{{=c.background}} +selection_foreground #{{=c[0]}} +selection_background #{{=c[7]}} + +# Black +color0 #{{=c[0]}} +color8 #{{=c[8]}} + +# Red +color1 #{{=c[1]}} +color9 #{{=c[9]}} + +# Green +color2 #{{=c[2]}} +color10 #{{=c[10]}} + +# Yellow +color3 #{{=c[3]}} +color11 #{{=c[11]}} + +# Blue +color4 #{{=c[4]}} +color12 #{{=c[12]}} + +# Magenta +color5 #{{=c[5]}} +color13 #{{=c[13]}} + +# Cyan +color6 #{{=c[6]}} +color14 #{{=c[14]}} + +# White +color7 #{{=c[7]}} +color15 #{{=c[15]}} diff --git a/.config/nvim/colors/onedark/build/templates/One Dark.terminal b/.config/nvim/colors/onedark/build/templates/One Dark.terminal new file mode 100755 index 0000000..984831c --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/One Dark.terminal @@ -0,0 +1,94 @@ + + + + + ANSIBlackColor + + {{=c[0]}} + + ANSIBlueColor + + {{=c[4]}} + + ANSIBrightBlackColor + + {{=c[8]}} + + ANSIBrightBlueColor + + {{=c[12]}} + + ANSIBrightCyanColor + + {{=c[14]}} + + ANSIBrightGreenColor + + {{=c[10]}} + + ANSIBrightMagentaColor + + {{=c[13]}} + + ANSIBrightRedColor + + {{=c[9]}} + + ANSIBrightWhiteColor + + {{=c[15]}} + + ANSIBrightYellowColor + + {{=c[11]}} + + ANSICyanColor + + {{=c[6]}} + + ANSIGreenColor + + {{=c[2]}} + + ANSIMagentaColor + + {{=c[5]}} + + ANSIRedColor + + {{=c[1]}} + + ANSIWhiteColor + + {{=c[7]}} + + ANSIYellowColor + + {{=c[3]}} + + BackgroundColor + + {{=c.background}} + + CursorColor + + {{=c.foreground}} + + SelectionColor + + {{=c[15]}} + + TextBoldColor + + {{=c.foreground}} + + TextColor + + {{=c.foreground}} + + name + One Dark + type + Window Settings + + diff --git a/.config/nvim/colors/onedark/build/templates/autoload.template.vim b/.config/nvim/colors/onedark/build/templates/autoload.template.vim new file mode 100755 index 0000000..204ecc6 --- /dev/null +++ b/.config/nvim/colors/onedark/build/templates/autoload.template.vim @@ -0,0 +1,29 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +let s:overrides = get(g:, "onedark_color_overrides", {}) + +let s:colors = { + \ "red": get(s:overrides, "red", { "gui": "<%=red.gui%>", "cterm": "<%=red.cterm%>", "cterm16": "<%=red.cterm16%>" }), + \ "dark_red": get(s:overrides, "dark_red", { "gui": "<%=dark_red.gui%>", "cterm": "<%=dark_red.cterm%>", "cterm16": "<%=dark_red.cterm16%>" }), + \ "green": get(s:overrides, "green", { "gui": "<%=green.gui%>", "cterm": "<%=green.cterm%>", "cterm16": "<%=green.cterm16%>" }), + \ "yellow": get(s:overrides, "yellow", { "gui": "<%=yellow.gui%>", "cterm": "<%=yellow.cterm%>", "cterm16": "<%=yellow.cterm16%>" }), + \ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "<%=dark_yellow.gui%>", "cterm": "<%=dark_yellow.cterm%>", "cterm16": "<%=dark_yellow.cterm16%>" }), + \ "blue": get(s:overrides, "blue", { "gui": "<%=blue.gui%>", "cterm": "<%=blue.cterm%>", "cterm16": "<%=blue.cterm16%>" }), + \ "purple": get(s:overrides, "purple", { "gui": "<%=purple.gui%>", "cterm": "<%=purple.cterm%>", "cterm16": "<%=purple.cterm16%>" }), + \ "cyan": get(s:overrides, "cyan", { "gui": "<%=cyan.gui%>", "cterm": "<%=cyan.cterm%>", "cterm16": "<%=cyan.cterm16%>" }), + \ "white": get(s:overrides, "white", { "gui": "<%=white.gui%>", "cterm": "<%=white.cterm%>", "cterm16": "<%=white.cterm16%>" }), + \ "black": get(s:overrides, "black", { "gui": "<%=black.gui%>", "cterm": "<%=black.cterm%>", "cterm16": "<%=black.cterm16%>" }), + \ "foreground": get(s:overrides, "foreground", { "gui": "<%=white.gui%>", "cterm": "<%=white.cterm%>", "cterm16": "NONE" }), + \ "background": get(s:overrides, "background", { "gui": "<%=black.gui%>", "cterm": "<%=black.cterm%>", "cterm16": "NONE" }), + \ "comment_grey": get(s:overrides, "comment_grey", { "gui": "<%=comment_grey.gui%>", "cterm": "<%=comment_grey.cterm%>", "cterm16": "<%=comment_grey.cterm16%>" }), + \ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "<%=gutter_fg_grey.gui%>", "cterm": "<%=gutter_fg_grey.cterm%>", "cterm16": "<%=gutter_fg_grey.cterm16%>" }), + \ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "<%=cursor_grey.gui%>", "cterm": "<%=cursor_grey.cterm%>", "cterm16": "<%=cursor_grey.cterm16%>" }), + \ "visual_grey": get(s:overrides, "visual_grey", { "gui": "<%=visual_grey.gui%>", "cterm": "<%=visual_grey.cterm%>", "cterm16": "<%=visual_grey.cterm16%>" }), + \ "menu_grey": get(s:overrides, "menu_grey", { "gui": "<%=visual_grey.gui%>", "cterm": "<%=visual_grey.cterm%>", "cterm16": "<%=menu_grey.cterm16%>" }), + \ "special_grey": get(s:overrides, "special_grey", { "gui": "<%=special_grey.gui%>", "cterm": "<%=special_grey.cterm%>", "cterm16": "<%=special_grey.cterm16%>" }), + \ "vertsplit": get(s:overrides, "vertsplit", { "gui": "<%=vertsplit.gui%>", "cterm": "<%=vertsplit.cterm%>", "cterm16": "<%=vertsplit.cterm16%>" }), + \} + +function! onedark#GetColors() + return s:colors +endfunction diff --git a/.config/nvim/colors/onedark/colors/onedark.vim b/.config/nvim/colors/onedark/colors/onedark.vim new file mode 100755 index 0000000..2c552b8 --- /dev/null +++ b/.config/nvim/colors/onedark/colors/onedark.vim @@ -0,0 +1,679 @@ +" vim:fdm=marker +" Vim Color File +" Name: onedark.vim +" Maintainer: https://github.com/joshdick/onedark.vim/ +" License: The MIT License (MIT) +" Based On: https://github.com/MaxSt/FlatColor/ + +" Companion statusline plugin and terminal themes are included with onedark.vim: +" * https://github.com/joshdick/onedark.vim#lightlinevim-colorscheme +" * https://github.com/joshdick/onedark.vim#vim-airline-theme +" * https://github.com/joshdick/onedark.vim/tree/main/term + +" Color Reference {{{ + +" The following colors were measured inside Atom using its built-in inspector. + +" +---------------------------------------------+ +" | Color Name | RGB | Hex | +" |--------------+--------------------+---------| +" | Black | rgb(40, 44, 52) | #282c34 | +" |--------------+--------------------+---------| +" | White | rgb(171, 178, 191) | #abb2bf | +" |--------------+--------------------+---------| +" | Light Red | rgb(224, 108, 117) | #e06c75 | +" |--------------+--------------------+---------| +" | Dark Red | rgb(190, 80, 70) | #be5046 | +" |--------------+--------------------+---------| +" | Green | rgb(152, 195, 121) | #98c379 | +" |--------------+--------------------+---------| +" | Light Yellow | rgb(229, 192, 123) | #e5c07b | +" |--------------+--------------------+---------| +" | Dark Yellow | rgb(209, 154, 102) | #d19a66 | +" |--------------+--------------------+---------| +" | Blue | rgb(97, 175, 239) | #61afef | +" |--------------+--------------------+---------| +" | Magenta | rgb(198, 120, 221) | #c678dd | +" |--------------+--------------------+---------| +" | Cyan | rgb(86, 182, 194) | #56b6c2 | +" |--------------+--------------------+---------| +" | Gutter Grey | rgb(76, 82, 99) | #4b5263 | +" |--------------+--------------------+---------| +" | Comment Grey | rgb(92, 99, 112) | #5c6370 | +" +---------------------------------------------+ + +" }}} + +" Initialization {{{ + +highlight clear + +if exists("syntax_on") + syntax reset +endif + +set t_Co=256 + +let g:colors_name="onedark" + +" Set to "256" for 256-color terminals, or +" set to "16" to use your terminal emulator's native colors +" (a 16-color palette for this color scheme is available; see +" < https://github.com/joshdick/onedark.vim/blob/main/README.md > +" for more information.) +if !exists("g:onedark_termcolors") + let g:onedark_termcolors = 256 +endif + +" Not all terminals support italics properly. If yours does, opt-in. +if !exists("g:onedark_terminal_italics") + let g:onedark_terminal_italics = 0 +endif + +" This function is based on one from FlatColor: https://github.com/MaxSt/FlatColor/ +" Which in turn was based on one found in hemisu: https://github.com/noahfrederick/vim-hemisu/ +let s:group_colors = {} " Cache of default highlight group settings, for later reference via `onedark#extend_highlight` +function! s:h(group, style, ...) + if (a:0 > 0) " Will be true if we got here from onedark#extend_highlight + let s:highlight = s:group_colors[a:group] + for style_type in ["fg", "bg", "sp"] + if (has_key(a:style, style_type)) + let l:default_style = (has_key(s:highlight, style_type) ? copy(s:highlight[style_type]) : { "cterm16": "NONE", "cterm": "NONE", "gui": "NONE" }) + let s:highlight[style_type] = extend(l:default_style, a:style[style_type]) + endif + endfor + if (has_key(a:style, "gui")) + let s:highlight.gui = a:style.gui + endif + else + let s:highlight = a:style + let s:group_colors[a:group] = s:highlight " Cache default highlight group settings + endif + + if g:onedark_terminal_italics == 0 + if has_key(s:highlight, "cterm") && s:highlight["cterm"] == "italic" + unlet s:highlight.cterm + endif + if has_key(s:highlight, "gui") && s:highlight["gui"] == "italic" + unlet s:highlight.gui + endif + endif + + if g:onedark_termcolors == 16 + let l:ctermfg = (has_key(s:highlight, "fg") ? s:highlight.fg.cterm16 : "NONE") + let l:ctermbg = (has_key(s:highlight, "bg") ? s:highlight.bg.cterm16 : "NONE") + else + let l:ctermfg = (has_key(s:highlight, "fg") ? s:highlight.fg.cterm : "NONE") + let l:ctermbg = (has_key(s:highlight, "bg") ? s:highlight.bg.cterm : "NONE") + endif + + execute "highlight" a:group + \ "guifg=" (has_key(s:highlight, "fg") ? s:highlight.fg.gui : "NONE") + \ "guibg=" (has_key(s:highlight, "bg") ? s:highlight.bg.gui : "NONE") + \ "guisp=" (has_key(s:highlight, "sp") ? s:highlight.sp.gui : "NONE") + \ "gui=" (has_key(s:highlight, "gui") ? s:highlight.gui : "NONE") + \ "ctermfg=" . l:ctermfg + \ "ctermbg=" . l:ctermbg + \ "cterm=" (has_key(s:highlight, "cterm") ? s:highlight.cterm : "NONE") +endfunction + +" public {{{ + +function! onedark#set_highlight(group, style) + call s:h(a:group, a:style) +endfunction + +function! onedark#extend_highlight(group, style) + call s:h(a:group, a:style, 1) +endfunction + +" }}} + +" }}} + +" Color Variables {{{ + +let s:colors = onedark#GetColors() + +let s:red = s:colors.red +let s:dark_red = s:colors.dark_red +let s:green = s:colors.green +let s:yellow = s:colors.yellow +let s:dark_yellow = s:colors.dark_yellow +let s:blue = s:colors.blue +let s:purple = s:colors.purple +let s:cyan = s:colors.cyan +let s:white = s:colors.white +let s:black = s:colors.black +let s:foreground = s:colors.foreground +let s:background = s:colors.background +let s:comment_grey = s:colors.comment_grey +let s:gutter_fg_grey = s:colors.gutter_fg_grey +let s:cursor_grey = s:colors.cursor_grey +let s:visual_grey = s:colors.visual_grey +let s:menu_grey = s:colors.menu_grey +let s:special_grey = s:colors.special_grey +let s:vertsplit = s:colors.vertsplit + +" }}} + +" Terminal Colors {{{ + +let g:terminal_ansi_colors = [ + \ s:black.gui, s:red.gui, s:green.gui, s:yellow.gui, + \ s:blue.gui, s:purple.gui, s:cyan.gui, s:comment_grey.gui, + \ s:visual_grey.gui, s:red.gui, s:green.gui, s:yellow.gui, + \ s:blue.gui, s:purple.gui, s:cyan.gui, s:white.gui +\] + +" }}} + +" Syntax Groups (descriptions and ordering from `:h w18`) {{{ + +call s:h("Comment", { "fg": s:comment_grey, "gui": "italic", "cterm": "italic" }) " any comment +call s:h("Constant", { "fg": s:cyan }) " any constant +call s:h("String", { "fg": s:green }) " a string constant: "this is a string" +call s:h("Character", { "fg": s:green }) " a character constant: 'c', '\n' +call s:h("Number", { "fg": s:dark_yellow }) " a number constant: 234, 0xff +call s:h("Boolean", { "fg": s:dark_yellow }) " a boolean constant: TRUE, false +call s:h("Float", { "fg": s:dark_yellow }) " a floating point constant: 2.3e10 +call s:h("Identifier", { "fg": s:red }) " any variable name +call s:h("Function", { "fg": s:blue }) " function name (also: methods for classes) +call s:h("Statement", { "fg": s:purple }) " any statement +call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc. +call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc. +call s:h("Label", { "fg": s:purple }) " case, default, etc. +call s:h("Operator", { "fg": s:purple }) " sizeof", "+", "*", etc. +call s:h("Keyword", { "fg": s:red }) " any other keyword +call s:h("Exception", { "fg": s:purple }) " try, catch, throw +call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor +call s:h("Include", { "fg": s:blue }) " preprocessor #include +call s:h("Define", { "fg": s:purple }) " preprocessor #define +call s:h("Macro", { "fg": s:purple }) " same as Define +call s:h("PreCondit", { "fg": s:yellow }) " preprocessor #if, #else, #endif, etc. +call s:h("Type", { "fg": s:yellow }) " int, long, char, etc. +call s:h("StorageClass", { "fg": s:yellow }) " static, register, volatile, etc. +call s:h("Structure", { "fg": s:yellow }) " struct, union, enum, etc. +call s:h("Typedef", { "fg": s:yellow }) " A typedef +call s:h("Special", { "fg": s:blue }) " any special symbol +call s:h("SpecialChar", { "fg": s:dark_yellow }) " special character in a constant +call s:h("Tag", {}) " you can use CTRL-] on this +call s:h("Delimiter", {}) " character that needs attention +call s:h("SpecialComment", { "fg": s:comment_grey }) " special things inside a comment +call s:h("Debug", {}) " debugging statements +call s:h("Underlined", { "gui": "underline", "cterm": "underline" }) " text that stands out, HTML links +call s:h("Ignore", {}) " left blank, hidden +call s:h("Error", { "fg": s:red }) " any erroneous construct +call s:h("Todo", { "fg": s:purple }) " anything that needs extra attention; mostly the keywords TODO FIXME and XXX + +" }}} + +" Highlighting Groups (descriptions and ordering from `:h highlight-groups`) {{{ +call s:h("ColorColumn", { "bg": s:cursor_grey }) " used for the columns set with 'colorcolumn' +call s:h("Conceal", {}) " placeholder characters substituted for concealed text (see 'conceallevel') +call s:h("Cursor", { "fg": s:black, "bg": s:blue }) " the character under the cursor +call s:h("CursorIM", {}) " like Cursor, but used when in IME mode +call s:h("CursorColumn", { "bg": s:cursor_grey }) " the screen column that the cursor is in when 'cursorcolumn' is set +if &diff + " Don't change the background color in diff mode + call s:h("CursorLine", { "gui": "underline" }) " the screen line that the cursor is in when 'cursorline' is set +else + call s:h("CursorLine", { "bg": s:cursor_grey }) " the screen line that the cursor is in when 'cursorline' is set +endif +call s:h("Directory", { "fg": s:blue }) " directory names (and other special names in listings) +call s:h("DiffAdd", { "bg": s:green, "fg": s:black }) " diff mode: Added line +call s:h("DiffChange", { "fg": s:yellow, "gui": "underline", "cterm": "underline" }) " diff mode: Changed line +call s:h("DiffDelete", { "bg": s:red, "fg": s:black }) " diff mode: Deleted line +call s:h("DiffText", { "bg": s:yellow, "fg": s:black }) " diff mode: Changed text within a changed line +if get(g:, 'onedark_hide_endofbuffer', 0) + " If enabled, will style end-of-buffer filler lines (~) to appear to be hidden. + call s:h("EndOfBuffer", { "fg": s:black }) " filler lines (~) after the last line in the buffer +endif +call s:h("ErrorMsg", { "fg": s:red }) " error messages on the command line +call s:h("VertSplit", { "fg": s:vertsplit }) " the column separating vertically split windows +call s:h("Folded", { "fg": s:comment_grey }) " line used for closed folds +call s:h("FoldColumn", {}) " 'foldcolumn' +call s:h("SignColumn", {}) " column where signs are displayed +call s:h("IncSearch", { "fg": s:yellow, "bg": s:comment_grey }) " 'incsearch' highlighting; also used for the text replaced with ":s///c" +call s:h("LineNr", { "fg": s:gutter_fg_grey }) " Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. +call s:h("CursorLineNr", {}) " Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. +call s:h("MatchParen", { "fg": s:blue, "gui": "underline", "cterm": "underline" }) " The character under the cursor or just before it, if it is a paired bracket, and its match. +call s:h("ModeMsg", {}) " 'showmode' message (e.g., "-- INSERT --") +call s:h("MoreMsg", {}) " more-prompt +call s:h("NonText", { "fg": s:special_grey }) " '~' and '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line). +call s:h("Normal", { "fg": s:foreground, "bg": s:background }) " normal text +call s:h("Pmenu", { "fg": s:white, "bg": s:menu_grey }) " Popup menu: normal item. +call s:h("PmenuSel", { "fg": s:cursor_grey, "bg": s:blue }) " Popup menu: selected item. +call s:h("PmenuSbar", { "bg": s:cursor_grey }) " Popup menu: scrollbar. +call s:h("PmenuThumb", { "bg": s:white }) " Popup menu: Thumb of the scrollbar. +call s:h("Question", { "fg": s:purple }) " hit-enter prompt and yes/no questions +call s:h("QuickFixLine", { "fg": s:black, "bg": s:yellow }) " Current quickfix item in the quickfix window. +call s:h("Search", { "fg": s:black, "bg": s:yellow }) " Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. +call s:h("SpecialKey", { "fg": s:special_grey }) " Meta and special keys listed with ":map", also for text used to show unprintable characters in the text, 'listchars'. Generally: text that is displayed differently from what it really is. +call s:h("SpellBad", { "fg": s:red, "gui": "underline", "cterm": "underline" }) " Word that is not recognized by the spellchecker. This will be combined with the highlighting used otherwise. +call s:h("SpellCap", { "fg": s:dark_yellow }) " Word that should start with a capital. This will be combined with the highlighting used otherwise. +call s:h("SpellLocal", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is used in another region. This will be combined with the highlighting used otherwise. +call s:h("SpellRare", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is hardly ever used. spell This will be combined with the highlighting used otherwise. +call s:h("StatusLine", { "fg": s:white, "bg": s:cursor_grey }) " status line of current window +call s:h("StatusLineNC", { "fg": s:comment_grey }) " status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. +call s:h("StatusLineTerm", { "fg": s:white, "bg": s:cursor_grey }) " status line of current :terminal window +call s:h("StatusLineTermNC", { "fg": s:comment_grey }) " status line of non-current :terminal window +call s:h("TabLine", { "fg": s:comment_grey }) " tab pages line, not active tab page label +call s:h("TabLineFill", {}) " tab pages line, where there are no labels +call s:h("TabLineSel", { "fg": s:white }) " tab pages line, active tab page label +call s:h("Terminal", { "fg": s:white, "bg": s:black }) " terminal window (see terminal-size-color) +call s:h("Title", { "fg": s:green }) " titles for output from ":set all", ":autocmd" etc. +call s:h("Visual", { "bg": s:visual_grey }) " Visual mode selection +call s:h("VisualNOS", { "bg": s:visual_grey }) " Visual mode selection when vim is "Not Owning the Selection". Only X11 Gui's gui-x11 and xterm-clipboard supports this. +call s:h("WarningMsg", { "fg": s:yellow }) " warning messages +call s:h("WildMenu", { "fg": s:black, "bg": s:blue }) " current match in 'wildmenu' completion + +" }}} + +" Termdebug highlighting for Vim 8.1+ {{{ + +" See `:h hl-debugPC` and `:h hl-debugBreakpoint`. +call s:h("debugPC", { "bg": s:special_grey }) " the current position +call s:h("debugBreakpoint", { "fg": s:black, "bg": s:red }) " a breakpoint + +" }}} + +" Language-Specific Highlighting {{{ + +" CSS +call s:h("cssAttrComma", { "fg": s:purple }) +call s:h("cssAttributeSelector", { "fg": s:green }) +call s:h("cssBraces", { "fg": s:white }) +call s:h("cssClassName", { "fg": s:dark_yellow }) +call s:h("cssClassNameDot", { "fg": s:dark_yellow }) +call s:h("cssDefinition", { "fg": s:purple }) +call s:h("cssFontAttr", { "fg": s:dark_yellow }) +call s:h("cssFontDescriptor", { "fg": s:purple }) +call s:h("cssFunctionName", { "fg": s:blue }) +call s:h("cssIdentifier", { "fg": s:blue }) +call s:h("cssImportant", { "fg": s:purple }) +call s:h("cssInclude", { "fg": s:white }) +call s:h("cssIncludeKeyword", { "fg": s:purple }) +call s:h("cssMediaType", { "fg": s:dark_yellow }) +call s:h("cssProp", { "fg": s:white }) +call s:h("cssPseudoClassId", { "fg": s:dark_yellow }) +call s:h("cssSelectorOp", { "fg": s:purple }) +call s:h("cssSelectorOp2", { "fg": s:purple }) +call s:h("cssTagName", { "fg": s:red }) + +" Fish Shell +call s:h("fishKeyword", { "fg": s:purple }) +call s:h("fishConditional", { "fg": s:purple }) + +" Go +call s:h("goDeclaration", { "fg": s:purple }) +call s:h("goBuiltins", { "fg": s:cyan }) +call s:h("goFunctionCall", { "fg": s:blue }) +call s:h("goVarDefs", { "fg": s:red }) +call s:h("goVarAssign", { "fg": s:red }) +call s:h("goVar", { "fg": s:purple }) +call s:h("goConst", { "fg": s:purple }) +call s:h("goType", { "fg": s:yellow }) +call s:h("goTypeName", { "fg": s:yellow }) +call s:h("goDeclType", { "fg": s:cyan }) +call s:h("goTypeDecl", { "fg": s:purple }) + +" HTML (keep consistent with Markdown, below) +call s:h("htmlArg", { "fg": s:dark_yellow }) +call s:h("htmlBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" }) +call s:h("htmlEndTag", { "fg": s:white }) +call s:h("htmlH1", { "fg": s:red }) +call s:h("htmlH2", { "fg": s:red }) +call s:h("htmlH3", { "fg": s:red }) +call s:h("htmlH4", { "fg": s:red }) +call s:h("htmlH5", { "fg": s:red }) +call s:h("htmlH6", { "fg": s:red }) +call s:h("htmlItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("htmlLink", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) +call s:h("htmlSpecialChar", { "fg": s:dark_yellow }) +call s:h("htmlSpecialTagName", { "fg": s:red }) +call s:h("htmlTag", { "fg": s:white }) +call s:h("htmlTagN", { "fg": s:red }) +call s:h("htmlTagName", { "fg": s:red }) +call s:h("htmlTitle", { "fg": s:white }) + +" JavaScript +call s:h("javaScriptBraces", { "fg": s:white }) +call s:h("javaScriptFunction", { "fg": s:purple }) +call s:h("javaScriptIdentifier", { "fg": s:purple }) +call s:h("javaScriptNull", { "fg": s:dark_yellow }) +call s:h("javaScriptNumber", { "fg": s:dark_yellow }) +call s:h("javaScriptRequire", { "fg": s:cyan }) +call s:h("javaScriptReserved", { "fg": s:purple }) +" https://github.com/pangloss/vim-javascript +call s:h("jsArrowFunction", { "fg": s:purple }) +call s:h("jsClassKeyword", { "fg": s:purple }) +call s:h("jsClassMethodType", { "fg": s:purple }) +call s:h("jsDocParam", { "fg": s:blue }) +call s:h("jsDocTags", { "fg": s:purple }) +call s:h("jsExport", { "fg": s:purple }) +call s:h("jsExportDefault", { "fg": s:purple }) +call s:h("jsExtendsKeyword", { "fg": s:purple }) +call s:h("jsFrom", { "fg": s:purple }) +call s:h("jsFuncCall", { "fg": s:blue }) +call s:h("jsFunction", { "fg": s:purple }) +call s:h("jsGenerator", { "fg": s:yellow }) +call s:h("jsGlobalObjects", { "fg": s:yellow }) +call s:h("jsImport", { "fg": s:purple }) +call s:h("jsModuleAs", { "fg": s:purple }) +call s:h("jsModuleWords", { "fg": s:purple }) +call s:h("jsModules", { "fg": s:purple }) +call s:h("jsNull", { "fg": s:dark_yellow }) +call s:h("jsOperator", { "fg": s:purple }) +call s:h("jsStorageClass", { "fg": s:purple }) +call s:h("jsSuper", { "fg": s:red }) +call s:h("jsTemplateBraces", { "fg": s:dark_red }) +call s:h("jsTemplateVar", { "fg": s:green }) +call s:h("jsThis", { "fg": s:red }) +call s:h("jsUndefined", { "fg": s:dark_yellow }) +" https://github.com/othree/yajs.vim +call s:h("javascriptArrowFunc", { "fg": s:purple }) +call s:h("javascriptClassExtends", { "fg": s:purple }) +call s:h("javascriptClassKeyword", { "fg": s:purple }) +call s:h("javascriptDocNotation", { "fg": s:purple }) +call s:h("javascriptDocParamName", { "fg": s:blue }) +call s:h("javascriptDocTags", { "fg": s:purple }) +call s:h("javascriptEndColons", { "fg": s:white }) +call s:h("javascriptExport", { "fg": s:purple }) +call s:h("javascriptFuncArg", { "fg": s:white }) +call s:h("javascriptFuncKeyword", { "fg": s:purple }) +call s:h("javascriptIdentifier", { "fg": s:red }) +call s:h("javascriptImport", { "fg": s:purple }) +call s:h("javascriptMethodName", { "fg": s:white }) +call s:h("javascriptObjectLabel", { "fg": s:white }) +call s:h("javascriptOpSymbol", { "fg": s:cyan }) +call s:h("javascriptOpSymbols", { "fg": s:cyan }) +call s:h("javascriptPropertyName", { "fg": s:green }) +call s:h("javascriptTemplateSB", { "fg": s:dark_red }) +call s:h("javascriptVariable", { "fg": s:purple }) + +" JSON +call s:h("jsonCommentError", { "fg": s:white }) +call s:h("jsonKeyword", { "fg": s:red }) +call s:h("jsonBoolean", { "fg": s:dark_yellow }) +call s:h("jsonNumber", { "fg": s:dark_yellow }) +call s:h("jsonQuote", { "fg": s:white }) +call s:h("jsonMissingCommaError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNoQuotesError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNumError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonString", { "fg": s:green }) +call s:h("jsonStringSQError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonSemicolonError", { "fg": s:red, "gui": "reverse" }) + +" LESS +call s:h("lessVariable", { "fg": s:purple }) +call s:h("lessAmpersandChar", { "fg": s:white }) +call s:h("lessClass", { "fg": s:dark_yellow }) + +" Markdown (keep consistent with HTML, above) +call s:h("markdownBlockquote", { "fg": s:comment_grey }) +call s:h("markdownBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" }) +call s:h("markdownCode", { "fg": s:green }) +call s:h("markdownCodeBlock", { "fg": s:green }) +call s:h("markdownCodeDelimiter", { "fg": s:green }) +call s:h("markdownH1", { "fg": s:red }) +call s:h("markdownH2", { "fg": s:red }) +call s:h("markdownH3", { "fg": s:red }) +call s:h("markdownH4", { "fg": s:red }) +call s:h("markdownH5", { "fg": s:red }) +call s:h("markdownH6", { "fg": s:red }) +call s:h("markdownHeadingDelimiter", { "fg": s:red }) +call s:h("markdownHeadingRule", { "fg": s:comment_grey }) +call s:h("markdownId", { "fg": s:purple }) +call s:h("markdownIdDeclaration", { "fg": s:blue }) +call s:h("markdownIdDelimiter", { "fg": s:purple }) +call s:h("markdownItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("markdownLinkDelimiter", { "fg": s:purple }) +call s:h("markdownLinkText", { "fg": s:blue }) +call s:h("markdownListMarker", { "fg": s:red }) +call s:h("markdownOrderedListMarker", { "fg": s:red }) +call s:h("markdownRule", { "fg": s:comment_grey }) +call s:h("markdownUrl", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) + +" Perl +call s:h("perlFiledescRead", { "fg": s:green }) +call s:h("perlFunction", { "fg": s:purple }) +call s:h("perlMatchStartEnd",{ "fg": s:blue }) +call s:h("perlMethod", { "fg": s:purple }) +call s:h("perlPOD", { "fg": s:comment_grey }) +call s:h("perlSharpBang", { "fg": s:comment_grey }) +call s:h("perlSpecialString",{ "fg": s:dark_yellow }) +call s:h("perlStatementFiledesc", { "fg": s:red }) +call s:h("perlStatementFlow",{ "fg": s:red }) +call s:h("perlStatementInclude", { "fg": s:purple }) +call s:h("perlStatementScalar",{ "fg": s:purple }) +call s:h("perlStatementStorage", { "fg": s:purple }) +call s:h("perlSubName",{ "fg": s:yellow }) +call s:h("perlVarPlain",{ "fg": s:blue }) + +" PHP +call s:h("phpVarSelector", { "fg": s:red }) +call s:h("phpOperator", { "fg": s:white }) +call s:h("phpParent", { "fg": s:white }) +call s:h("phpMemberSelector", { "fg": s:white }) +call s:h("phpType", { "fg": s:purple }) +call s:h("phpKeyword", { "fg": s:purple }) +call s:h("phpClass", { "fg": s:yellow }) +call s:h("phpUseClass", { "fg": s:white }) +call s:h("phpUseAlias", { "fg": s:white }) +call s:h("phpInclude", { "fg": s:purple }) +call s:h("phpClassExtends", { "fg": s:green }) +call s:h("phpDocTags", { "fg": s:white }) +call s:h("phpFunction", { "fg": s:blue }) +call s:h("phpFunctions", { "fg": s:cyan }) +call s:h("phpMethodsVar", { "fg": s:dark_yellow }) +call s:h("phpMagicConstants", { "fg": s:dark_yellow }) +call s:h("phpSuperglobals", { "fg": s:red }) +call s:h("phpConstants", { "fg": s:dark_yellow }) + +" Ruby +call s:h("rubyBlockParameter", { "fg": s:red}) +call s:h("rubyBlockParameterList", { "fg": s:red }) +call s:h("rubyClass", { "fg": s:purple}) +call s:h("rubyConstant", { "fg": s:yellow}) +call s:h("rubyControl", { "fg": s:purple }) +call s:h("rubyEscape", { "fg": s:red}) +call s:h("rubyFunction", { "fg": s:blue}) +call s:h("rubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInclude", { "fg": s:blue}) +call s:h("rubyIncluderubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInstanceVariable", { "fg": s:red}) +call s:h("rubyInterpolation", { "fg": s:cyan }) +call s:h("rubyInterpolationDelimiter", { "fg": s:red }) +call s:h("rubyInterpolationDelimiter", { "fg": s:red}) +call s:h("rubyRegexp", { "fg": s:cyan}) +call s:h("rubyRegexpDelimiter", { "fg": s:cyan}) +call s:h("rubyStringDelimiter", { "fg": s:green}) +call s:h("rubySymbol", { "fg": s:cyan}) + +" Sass +" https://github.com/tpope/vim-haml +call s:h("sassAmpersand", { "fg": s:red }) +call s:h("sassClass", { "fg": s:dark_yellow }) +call s:h("sassControl", { "fg": s:purple }) +call s:h("sassExtend", { "fg": s:purple }) +call s:h("sassFor", { "fg": s:white }) +call s:h("sassFunction", { "fg": s:cyan }) +call s:h("sassId", { "fg": s:blue }) +call s:h("sassInclude", { "fg": s:purple }) +call s:h("sassMedia", { "fg": s:purple }) +call s:h("sassMediaOperators", { "fg": s:white }) +call s:h("sassMixin", { "fg": s:purple }) +call s:h("sassMixinName", { "fg": s:blue }) +call s:h("sassMixing", { "fg": s:purple }) +call s:h("sassVariable", { "fg": s:purple }) +" https://github.com/cakebaker/scss-syntax.vim +call s:h("scssExtend", { "fg": s:purple }) +call s:h("scssImport", { "fg": s:purple }) +call s:h("scssInclude", { "fg": s:purple }) +call s:h("scssMixin", { "fg": s:purple }) +call s:h("scssSelectorName", { "fg": s:dark_yellow }) +call s:h("scssVariable", { "fg": s:purple }) + +" TeX +call s:h("texStatement", { "fg": s:purple }) +call s:h("texSubscripts", { "fg": s:dark_yellow }) +call s:h("texSuperscripts", { "fg": s:dark_yellow }) +call s:h("texTodo", { "fg": s:dark_red }) +call s:h("texBeginEnd", { "fg": s:purple }) +call s:h("texBeginEndName", { "fg": s:blue }) +call s:h("texMathMatcher", { "fg": s:blue }) +call s:h("texMathDelim", { "fg": s:blue }) +call s:h("texDelimiter", { "fg": s:dark_yellow }) +call s:h("texSpecialChar", { "fg": s:dark_yellow }) +call s:h("texCite", { "fg": s:blue }) +call s:h("texRefZone", { "fg": s:blue }) + +" TypeScript +call s:h("typescriptReserved", { "fg": s:purple }) +call s:h("typescriptEndColons", { "fg": s:white }) +call s:h("typescriptBraces", { "fg": s:white }) + +" XML +call s:h("xmlAttrib", { "fg": s:dark_yellow }) +call s:h("xmlEndTag", { "fg": s:red }) +call s:h("xmlTag", { "fg": s:red }) +call s:h("xmlTagName", { "fg": s:red }) + +" }}} + +" Plugin Highlighting {{{ + +" airblade/vim-gitgutter +call s:h("GitGutterAdd", { "fg": s:green }) +call s:h("GitGutterChange", { "fg": s:yellow }) +call s:h("GitGutterDelete", { "fg": s:red }) + +" dense-analysis/ale +call s:h("ALEError", { "fg": s:red, "gui": "underline", "cterm": "underline" }) +call s:h("ALEWarning", { "fg": s:yellow, "gui": "underline", "cterm": "underline"}) +call s:h("ALEInfo", { "gui": "underline", "cterm": "underline"}) + +" easymotion/vim-easymotion +call s:h("EasyMotionTarget", { "fg": s:red, "gui": "bold", "cterm": "bold" }) +call s:h("EasyMotionTarget2First", { "fg": s:yellow, "gui": "bold", "cterm": "bold" }) +call s:h("EasyMotionTarget2Second", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" }) +call s:h("EasyMotionShade", { "fg": s:comment_grey }) + +" lewis6991/gitsigns.nvim +hi link GitSignsAdd GitGutterAdd +hi link GitSignsChange GitGutterChange +hi link GitSignsDelete GitGutterDelete + +" mhinz/vim-signify +hi link SignifySignAdd GitGutterAdd +hi link SignifySignChange GitGutterChange +hi link SignifySignDelete GitGutterDelete + +" neoclide/coc.nvim +call s:h("CocErrorSign", { "fg": s:red }) +call s:h("CocWarningSign", { "fg": s:yellow }) +call s:h("CocInfoSign", { "fg": s:blue }) +call s:h("CocHintSign", { "fg": s:cyan }) + +" neomake/neomake +call s:h("NeomakeErrorSign", { "fg": s:red }) +call s:h("NeomakeWarningSign", { "fg": s:yellow }) +call s:h("NeomakeInfoSign", { "fg": s:blue }) + +" plasticboy/vim-markdown (keep consistent with Markdown, above) +call s:h("mkdDelimiter", { "fg": s:purple }) +call s:h("mkdHeading", { "fg": s:red }) +call s:h("mkdLink", { "fg": s:blue }) +call s:h("mkdURL", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) + +" prabirshrestha/vim-lsp +call s:h("LspError", { "fg": s:red }) +call s:h("LspWarning", { "fg": s:yellow }) +call s:h("LspInformation", { "fg": s:blue }) +call s:h("LspHint", { "fg": s:cyan }) + +" tpope/vim-fugitive +call s:h("diffAdded", { "fg": s:green }) +call s:h("diffRemoved", { "fg": s:red }) + +" }}} + +" Git Highlighting {{{ + +call s:h("gitcommitComment", { "fg": s:comment_grey }) +call s:h("gitcommitUnmerged", { "fg": s:green }) +call s:h("gitcommitOnBranch", {}) +call s:h("gitcommitBranch", { "fg": s:purple }) +call s:h("gitcommitDiscardedType", { "fg": s:red }) +call s:h("gitcommitSelectedType", { "fg": s:green }) +call s:h("gitcommitHeader", {}) +call s:h("gitcommitUntrackedFile", { "fg": s:cyan }) +call s:h("gitcommitDiscardedFile", { "fg": s:red }) +call s:h("gitcommitSelectedFile", { "fg": s:green }) +call s:h("gitcommitUnmergedFile", { "fg": s:yellow }) +call s:h("gitcommitFile", {}) +call s:h("gitcommitSummary", { "fg": s:white }) +call s:h("gitcommitOverflow", { "fg": s:red }) +hi link gitcommitNoBranch gitcommitBranch +hi link gitcommitUntracked gitcommitComment +hi link gitcommitDiscarded gitcommitComment +hi link gitcommitSelected gitcommitComment +hi link gitcommitDiscardedArrow gitcommitDiscardedFile +hi link gitcommitSelectedArrow gitcommitSelectedFile +hi link gitcommitUnmergedArrow gitcommitUnmergedFile + +" }}} + +" Neovim-Specific Highlighting {{{ + +if has("nvim") + " Neovim terminal colors {{{ + let g:terminal_color_0 = s:black.gui + let g:terminal_color_1 = s:red.gui + let g:terminal_color_2 = s:green.gui + let g:terminal_color_3 = s:yellow.gui + let g:terminal_color_4 = s:blue.gui + let g:terminal_color_5 = s:purple.gui + let g:terminal_color_6 = s:cyan.gui + let g:terminal_color_7 = s:white.gui + let g:terminal_color_8 = s:visual_grey.gui + let g:terminal_color_9 = s:dark_red.gui + let g:terminal_color_10 = s:green.gui " No dark version + let g:terminal_color_11 = s:dark_yellow.gui + let g:terminal_color_12 = s:blue.gui " No dark version + let g:terminal_color_13 = s:purple.gui " No dark version + let g:terminal_color_14 = s:cyan.gui " No dark version + let g:terminal_color_15 = s:comment_grey.gui + let g:terminal_color_background = s:background.gui + let g:terminal_color_foreground = s:foreground.gui + " }}} + + " Neovim Diagnostics {{{ + call s:h("DiagnosticError", { "fg": s:red }) + call s:h("DiagnosticWarn", { "fg": s:yellow }) + call s:h("DiagnosticInfo", { "fg": s:blue }) + call s:h("DiagnosticHint", { "fg": s:cyan }) + call s:h("DiagnosticUnderlineError", { "fg": s:red, "gui": "underline", "cterm": "underline" }) + call s:h("DiagnosticUnderlineWarn", { "fg": s:yellow, "gui": "underline", "cterm": "underline" }) + call s:h("DiagnosticUnderlineInfo", { "fg": s:blue, "gui": "underline", "cterm": "underline" }) + call s:h("DiagnosticUnderlineHint", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) + " }}} + + " Neovim LSP (for versions < 0.5.1) {{{ + hi link LspDiagnosticsDefaultError DiagnosticError + hi link LspDiagnosticsDefaultWarning DiagnosticWarn + hi link LspDiagnosticsDefaultInformation DiagnosticInfo + hi link LspDiagnosticsDefaultHint DiagnosticHint + hi link LspDiagnosticsUnderlineError DiagnosticUnderlineError + hi link LspDiagnosticsUnderlineWarning DiagnosticUnderlineWarn + hi link LspDiagnosticsUnderlineInformation DiagnosticUnderlineInfo + hi link LspDiagnosticsUnderlineHint DiagnosticUnderlineHint + " }}} +endif + +" }}} + +" Must appear at the end of the file to work around this oddity: +" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark diff --git a/.config/nvim/colors/onedark/img/broken_colors.png b/.config/nvim/colors/onedark/img/broken_colors.png new file mode 100755 index 0000000..27a837b Binary files /dev/null and b/.config/nvim/colors/onedark/img/broken_colors.png differ diff --git a/.config/nvim/colors/onedark/img/broken_italics.png b/.config/nvim/colors/onedark/img/broken_italics.png new file mode 100755 index 0000000..087304a Binary files /dev/null and b/.config/nvim/colors/onedark/img/broken_italics.png differ diff --git a/.config/nvim/colors/onedark/img/color_reference.png b/.config/nvim/colors/onedark/img/color_reference.png new file mode 100755 index 0000000..ef2e3e3 Binary files /dev/null and b/.config/nvim/colors/onedark/img/color_reference.png differ diff --git a/.config/nvim/colors/onedark/img/preview_airline.png b/.config/nvim/colors/onedark/img/preview_airline.png new file mode 100755 index 0000000..379470e Binary files /dev/null and b/.config/nvim/colors/onedark/img/preview_airline.png differ diff --git a/.config/nvim/colors/onedark/img/preview_lightline.png b/.config/nvim/colors/onedark/img/preview_lightline.png new file mode 100755 index 0000000..5087e92 Binary files /dev/null and b/.config/nvim/colors/onedark/img/preview_lightline.png differ diff --git a/.config/nvim/colors/onedark/img/readme_header.png b/.config/nvim/colors/onedark/img/readme_header.png new file mode 100755 index 0000000..f30dc55 Binary files /dev/null and b/.config/nvim/colors/onedark/img/readme_header.png differ diff --git a/.config/nvim/colors/onedark/package-lock.json b/.config/nvim/colors/onedark/package-lock.json new file mode 100755 index 0000000..50f0c55 --- /dev/null +++ b/.config/nvim/colors/onedark/package-lock.json @@ -0,0 +1,4610 @@ +{ + "name": "onedark.vim-builder", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "onedark.vim-builder", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "termcolors": "0.7.3" + }, + "devDependencies": { + "eslint": "^7.30.0", + "husky": "^6.0.0", + "lint-staged": "^11.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.3.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/colr": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "colr-convert": "^1.0.5" + } + }, + "node_modules/colr-convert": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot": { + "version": "1.1.3", + "engines": [ + "node >=0.2.6" + ], + "license": "MIT", + "bin": { + "dottojs": "bin/dot-packer" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.3.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", + "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/termcolors": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/termcolors/-/termcolors-0.7.3.tgz", + "integrity": "sha512-EFZ0oPAVRPkZ4ZuKTcMhHOFg7yb732vmOljUW5zAT6r6egAWO1qnCQSnCvTZwlWuobdWOh/I59ldUOZDwDP20Q==", + "dependencies": { + "colr": "^1.2.2", + "commander": "^4.0.1", + "concat-stream": "^2.0.0", + "dot": "^1.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.1" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "colr": { + "version": "1.2.2", + "requires": { + "colr-convert": "^1.0.5" + } + }, + "colr-convert": { + "version": "1.0.5" + }, + "commander": { + "version": "4.1.1" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "2.0.0", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot": { + "version": "1.1.3" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "readable-stream": { + "version": "3.6.0", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regexpp": { + "version": "3.1.0", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1" + }, + "semver": { + "version": "7.3.4", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "1.3.0", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.padend": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", + "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "termcolors": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/termcolors/-/termcolors-0.7.3.tgz", + "integrity": "sha512-EFZ0oPAVRPkZ4ZuKTcMhHOFg7yb732vmOljUW5zAT6r6egAWO1qnCQSnCvTZwlWuobdWOh/I59ldUOZDwDP20Q==", + "requires": { + "colr": "^1.2.2", + "commander": "^4.0.1", + "concat-stream": "^2.0.0", + "dot": "^1.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19" + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2" + }, + "v8-compile-cache": { + "version": "2.2.0", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/.config/nvim/colors/onedark/package.json b/.config/nvim/colors/onedark/package.json new file mode 100755 index 0000000..1f69c32 --- /dev/null +++ b/.config/nvim/colors/onedark/package.json @@ -0,0 +1,45 @@ +{ + "name": "onedark.vim-builder", + "version": "1.0.0", + "description": "Builds the onedark.vim Vim colorscheme and associated files", + "main": "build.js", + "scripts": { + "build": "node build/build.js", + "test": "npm run lint && node build/build.js check", + "prepare": "husky install", + "lint": "run-p eslint:check prettier:check", + "lint:fix": "run-s eslint:fix prettier:fix", + "eslint:check": "eslint '**/*.js'", + "eslint:fix": "eslint --fix '**/*.js'", + "prettier:check": "prettier --check '**/*.{js,json,md}'", + "prettier:fix": "prettier --write '**/*.{js,json,md}'" + }, + "author": { + "name": "Josh Dick", + "email": "josh@joshdick.net", + "url": "http://joshdick.net" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/joshdick/onedark.vim.git" + }, + "devDependencies": { + "eslint": "^7.30.0", + "husky": "^6.0.0", + "lint-staged": "^11.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.3.2" + }, + "dependencies": { + "termcolors": "0.7.3" + }, + "lint-staged": { + "*.{js,json,md}": [ + "prettier --check" + ], + "*.{js}": [ + "eslint" + ] + } +} diff --git a/.config/nvim/colors/onedark/term/One Dark.Xresources b/.config/nvim/colors/onedark/term/One Dark.Xresources new file mode 100755 index 0000000..37aec79 --- /dev/null +++ b/.config/nvim/colors/onedark/term/One Dark.Xresources @@ -0,0 +1,37 @@ +! special +*.foreground: #ABB2BF +*.background: #282C34 +*.cursorColor: #ABB2BF + +! black +*.color0: #2C323C +*.color8: #3E4452 + +! red +*.color1: #E06C75 +*.color9: #E06C75 + +! green +*.color2: #98C379 +*.color10: #98C379 + +! yellow +*.color3: #E5C07B +*.color11: #E5C07B + +! blue +*.color4: #61AFEF +*.color12: #61AFEF + +! magenta +*.color5: #C678DD +*.color13: #C678DD + +! cyan +*.color6: #56B6C2 +*.color14: #56B6C2 + +! white +*.color7: #5C6370 +*.color15: #ABB2BF + diff --git a/.config/nvim/colors/onedark/term/One Dark.alacritty b/.config/nvim/colors/onedark/term/One Dark.alacritty new file mode 100755 index 0000000..9d06197 --- /dev/null +++ b/.config/nvim/colors/onedark/term/One Dark.alacritty @@ -0,0 +1,38 @@ +# Colors (One Dark) +colors: + # Default colors + primary: + foreground: '0xabb2bf' + background: '0x282c34' + + # Cursor colors + cursor: + text: '0x2c323c' + cursor: '0x5c6370' + + # Selection colors + selection: + text: CellForeground + background: '0x3e4452' + + # Normal colors + normal: + black: '0x2c323c' + red: '0xe06c75' + green: '0x98c379' + yellow: '0xe5c07b' + blue: '0x61afef' + magenta: '0xc678dd' + cyan: '0x56b6c2' + white: '0x5c6370' + + # Bright colors + bright: + black: '0x3e4452' + red: '0xe06c75' + green: '0x98c379' + yellow: '0xe5c07b' + blue: '0x61afef' + magenta: '0xc678dd' + cyan: '0x56b6c2' + white: '0xabb2bf' diff --git a/.config/nvim/colors/onedark/term/One Dark.colorscheme b/.config/nvim/colors/onedark/term/One Dark.colorscheme new file mode 100755 index 0000000..6f4bff5 --- /dev/null +++ b/.config/nvim/colors/onedark/term/One Dark.colorscheme @@ -0,0 +1,96 @@ +[Background] +Color=40,44,52 + +[BackgroundFaint] +Color=40,44,52 + +[BackgroundIntense] +Color=40,44,52 + +[Color0] +Color=44,50,60 + +[Color0Faint] +Color=44,50,60 + +[Color0Intense] +Color=62,68,82 + +[Color1] +Color=224,108,117 + +[Color1Faint] +Color=224,108,117 + +[Color1Intense] +Color=224,108,117 + +[Color2] +Color=152,195,121 + +[Color2Faint] +Color=152,195,121 + +[Color2Intense] +Color=152,195,121 + +[Color3] +Color=229,192,123 + +[Color3Faint] +Color=229,192,123 + +[Color3Intense] +Color=229,192,123 + +[Color4] +Color=97,175,239 + +[Color4Faint] +Color=97,175,239 + +[Color4Intense] +Color=97,175,239 + +[Color5] +Color=198,120,221 + +[Color5Faint] +Color=198,120,221 + +[Color5Intense] +Color=198,120,221 + +[Color6] +Color=86,182,194 + +[Color6Faint] +Color=86,182,194 + +[Color6Intense] +Color=86,182,194 + +[Color7] +Color=92,99,112 + +[Color7Faint] +Color=92,99,112 + +[Color7Intense] +Color=171,178,191 + +[Foreground] +Color=171,178,191 + +[ForegroundFaint] +Color=171,178,191 + +[ForegroundIntense] +Color=171,178,191 + +[General] +Blur=false +ColorRandomization=false +Description=One Dark +Opacity=1 +Wallpaper= diff --git a/.config/nvim/colors/onedark/term/One Dark.itermcolors b/.config/nvim/colors/onedark/term/One Dark.itermcolors new file mode 100755 index 0000000..fa08006 --- /dev/null +++ b/.config/nvim/colors/onedark/term/One Dark.itermcolors @@ -0,0 +1,259 @@ + + + + + Ansi 0 Color + + Color Space + sRGB + Blue Component + 0.23529411764705882 + Green Component + 0.19607843137254902 + Red Component + 0.17254901960784313 + + Ansi 1 Color + + Color Space + sRGB + Blue Component + 0.4588235294117647 + Green Component + 0.4235294117647059 + Red Component + 0.8784313725490196 + + Ansi 10 Color + + Color Space + sRGB + Blue Component + 0.4745098039215686 + Green Component + 0.7647058823529411 + Red Component + 0.596078431372549 + + Ansi 11 Color + + Color Space + sRGB + Blue Component + 0.4823529411764706 + Green Component + 0.7529411764705882 + Red Component + 0.8980392156862745 + + Ansi 12 Color + + Color Space + sRGB + Blue Component + 0.9372549019607843 + Green Component + 0.6862745098039216 + Red Component + 0.3803921568627451 + + Ansi 13 Color + + Color Space + sRGB + Blue Component + 0.8666666666666667 + Green Component + 0.47058823529411764 + Red Component + 0.7764705882352941 + + Ansi 14 Color + + Color Space + sRGB + Blue Component + 0.7607843137254902 + Green Component + 0.7137254901960784 + Red Component + 0.33725490196078434 + + Ansi 15 Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Ansi 2 Color + + Color Space + sRGB + Blue Component + 0.4745098039215686 + Green Component + 0.7647058823529411 + Red Component + 0.596078431372549 + + Ansi 3 Color + + Color Space + sRGB + Blue Component + 0.4823529411764706 + Green Component + 0.7529411764705882 + Red Component + 0.8980392156862745 + + Ansi 4 Color + + Color Space + sRGB + Blue Component + 0.9372549019607843 + Green Component + 0.6862745098039216 + Red Component + 0.3803921568627451 + + Ansi 5 Color + + Color Space + sRGB + Blue Component + 0.8666666666666667 + Green Component + 0.47058823529411764 + Red Component + 0.7764705882352941 + + Ansi 6 Color + + Color Space + sRGB + Blue Component + 0.7607843137254902 + Green Component + 0.7137254901960784 + Red Component + 0.33725490196078434 + + Ansi 7 Color + + Color Space + sRGB + Blue Component + 0.4392156862745098 + Green Component + 0.38823529411764707 + Red Component + 0.3607843137254902 + + Ansi 8 Color + + Color Space + sRGB + Blue Component + 0.3215686274509804 + Green Component + 0.26666666666666666 + Red Component + 0.24313725490196078 + + Ansi 9 Color + + Color Space + sRGB + Blue Component + 0.4588235294117647 + Green Component + 0.4235294117647059 + Red Component + 0.8784313725490196 + + Background Color + + Color Space + sRGB + Blue Component + 0.20392156862745098 + Green Component + 0.17254901960784313 + Red Component + 0.1568627450980392 + + Bold Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Cursor Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Cursor Text Color + + Color Space + sRGB + Blue Component + 0.20392156862745098 + Green Component + 0.17254901960784313 + Red Component + 0.1568627450980392 + + Foreground Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Selected Text Color + + Color Space + sRGB + Blue Component + 0.20392156862745098 + Green Component + 0.17254901960784313 + Red Component + 0.1568627450980392 + + Selection Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + + diff --git a/.config/nvim/colors/onedark/term/One Dark.kitty b/.config/nvim/colors/onedark/term/One Dark.kitty new file mode 100755 index 0000000..a0a1251 --- /dev/null +++ b/.config/nvim/colors/onedark/term/One Dark.kitty @@ -0,0 +1,41 @@ +# Cursor +cursor #5c6370 +cursor_text_color #2c323c + +# Special +foreground #abb2bf +background #282c34 +selection_foreground #2c323c +selection_background #5c6370 + +# Black +color0 #2c323c +color8 #3e4452 + +# Red +color1 #e06c75 +color9 #e06c75 + +# Green +color2 #98c379 +color10 #98c379 + +# Yellow +color3 #e5c07b +color11 #e5c07b + +# Blue +color4 #61afef +color12 #61afef + +# Magenta +color5 #c678dd +color13 #c678dd + +# Cyan +color6 #56b6c2 +color14 #56b6c2 + +# White +color7 #5c6370 +color15 #abb2bf diff --git a/.config/nvim/colors/onedark/term/One Dark.terminal b/.config/nvim/colors/onedark/term/One Dark.terminal new file mode 100755 index 0000000..c5d681f --- /dev/null +++ b/.config/nvim/colors/onedark/term/One Dark.terminal @@ -0,0 +1,199 @@ + + + + + ANSIBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjE3MjU0OTAxOTYgMC4xOTYwNzg0MzE0IDAuMjM1Mjk0MTE3NgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM4MDM5MjE1NjkgMC42ODYyNzQ1MDk4IDAuOTM3MjU0OTAyMAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjI0MzEzNzI1NDkgMC4yNjY2NjY2NjY3IDAuMzIxNTY4NjI3NQAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM4MDM5MjE1NjkgMC42ODYyNzQ1MDk4IDAuOTM3MjU0OTAyMAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightCyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjMzNzI1NDkwMjAgMC43MTM3MjU0OTAyIDAuNzYwNzg0MzEzNwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjU5NjA3ODQzMTQgMC43NjQ3MDU4ODI0IDAuNDc0NTA5ODAzOQAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljc3NjQ3MDU4ODIgMC40NzA1ODgyMzUzIDAuODY2NjY2NjY2NwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightRedColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg3ODQzMTM3MjUgMC40MjM1Mjk0MTE4IDAuNDU4ODIzNTI5NAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightYellowColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg5ODAzOTIxNTcgMC43NTI5NDExNzY1IDAuNDgyMzUyOTQxMgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSICyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjMzNzI1NDkwMjAgMC43MTM3MjU0OTAyIDAuNzYwNzg0MzEzNwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjU5NjA3ODQzMTQgMC43NjQ3MDU4ODI0IDAuNDc0NTA5ODAzOQAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljc3NjQ3MDU4ODIgMC40NzA1ODgyMzUzIDAuODY2NjY2NjY2NwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIRedColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg3ODQzMTM3MjUgMC40MjM1Mjk0MTE4IDAuNDU4ODIzNTI5NAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM2MDc4NDMxMzcgMC4zODgyMzUyOTQxIDAuNDM5MjE1Njg2MwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIYellowColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg5ODAzOTIxNTcgMC43NTI5NDExNzY1IDAuNDgyMzUyOTQxMgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjE1Njg2Mjc0NTEgMC4xNzI1NDkwMTk2IDAuMjAzOTIxNTY4NgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + CursorColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + SelectionColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + TextColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + name + One Dark + type + Window Settings + + diff --git a/.config/nvim/colors/palenight b/.config/nvim/colors/palenight deleted file mode 160000 index 847fcf5..0000000 --- a/.config/nvim/colors/palenight +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 847fcf5b1de2a1f9c28fdcc369d009996c6bf633 diff --git a/.config/nvim/colors/palenight/LICENSE b/.config/nvim/colors/palenight/LICENSE new file mode 100755 index 0000000..de06879 --- /dev/null +++ b/.config/nvim/colors/palenight/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Joshua Dick + +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. + diff --git a/.config/nvim/colors/palenight/README.md b/.config/nvim/colors/palenight/README.md new file mode 100755 index 0000000..96fec72 --- /dev/null +++ b/.config/nvim/colors/palenight/README.md @@ -0,0 +1,82 @@ +![palenight.vim][screenshot] + +A dark color scheme for Vim/Neovim based off the [Material Pale Night][materialLink] color scheme. Much of the work is based on the lovely [onedark.vim][onedark] color scheme. + +## Installation +Using [vim-plug][vimplug] (modify this to work with your Vim package manager of choice): + +```vim +Plug 'drewtempelmeyer/palenight.vim' +``` + +## Usage + +In your wonderfully organized Vim (`~/.vimrc`) or Neovim (`.config/nvim/init.vim`) configuration, place the following two lines: + +```vim +set background=dark +colorscheme palenight +``` + +To configure lightline, add the following line: + +```vim +let g:lightline = { 'colorscheme': 'palenight' } +``` + +To configure airline, add the following line: + +```vim +let g:airline_theme = "palenight" +``` + +### True Colors + +To provide the best user experience possible, I recommend enabling true colors. To experience the blissfulness of your editor's true colors, place this in your `.vimrc` or `~/.config/nvim/init.vim` file: + +```vim +if (has("nvim")) + "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 > + let $NVIM_TUI_ENABLE_TRUE_COLOR=1 +endif + +"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 > +"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd > +" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 > +if (has("termguicolors")) + set termguicolors +endif +``` + +### Italics + +Italics are a fantastic way to improve the appearance of your code. Italics will do what they can, but, as they say, "you can't polish a 💩." (Although MythBusters busted this). Digressing here, so place this into your config: + +```vim +" Italics for my favorite color scheme +let g:palenight_terminal_italics=1 +``` + +### Overriding Colors + +Overriding palenight's colors are supported through setting the +`g:palenight_color_overrides` variable. See [palenight.vim](./autoload/palenight.vim) +for a list of colors that may be overriden. You must provide `gui`, `cterm`, +and `cterm16` values for each. + +Example: Overriding the background color to pure black +```vim +let g:palenight_color_overrides = { +\ 'black': { 'gui': '#000000', "cterm": "0", "cterm16": "0" }, +\} +``` + +## Contributors + +[The lovely people that have contributed to palenight.vim](https://github.com/drewtempelmeyer/palenight.vim/graphs/contributors) + +[screenshot]: images/screenshot.png +[materialLink]: https://github.com/equinusocio/material-theme +[onedark]: https://github.com/joshdick/onedark.vim +[vimplug]: https://github.com/junegunn/vim-plug +[firaCode]: https://github.com/tonsky/FiraCode diff --git a/.config/nvim/colors/palenight/autoload/airline/themes/palenight.vim b/.config/nvim/colors/palenight/autoload/airline/themes/palenight.vim new file mode 100755 index 0000000..e7a6ddc --- /dev/null +++ b/.config/nvim/colors/palenight/autoload/airline/themes/palenight.vim @@ -0,0 +1,127 @@ +scriptencoding utf-8 + +let g:airline#themes#palenight#palette = {} + +let s:colors = palenight#GetColors() + +function! s:wrap_opts(opts) + if g:palenight_terminal_italics == 0 + let i = index(a:opts, 'italic') + if i >= 0 + unlet a:opts[i] + endif + endif + + return join(a:opts, ",") +endfunction + +let s:airline_modified = [s:colors.green.gui, '', s:colors.green.cterm, '', s:wrap_opts(['italic'])] +let s:airline_warning = [s:colors.red.gui, s:colors.black.gui, s:colors.red.cterm, s:colors.black.cterm] +let s:airline_error = [s:colors.black.gui, s:colors.red.gui, s:colors.black.cterm, s:colors.red.cterm, s:wrap_opts(['bold'])] + +" --- +" Normal + +let s:airline_a_normal = [s:colors.black.gui, s:colors.blue_purple.gui, s:colors.black.cterm, s:colors.blue_purple.cterm] +let s:airline_b_normal = [s:colors.white.gui, s:colors.white_mask_3.gui, s:colors.white.cterm, s:colors.white_mask_3.cterm] +let s:airline_c_normal = [s:colors.white.gui, s:colors.white_mask_1.gui, s:colors.white.cterm, s:colors.white_mask_1.cterm, s:wrap_opts(['italic'])] +let g:airline#themes#palenight#palette.normal = airline#themes#generate_color_map(s:airline_a_normal, s:airline_b_normal, s:airline_c_normal) + +let g:airline#themes#palenight#palette.normal_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.normal.airline_warning = s:airline_warning +let g:airline#themes#palenight#palette.normal_modified.airline_warning = s:airline_warning +let g:airline#themes#palenight#palette.normal.airline_error = s:airline_error +let g:airline#themes#palenight#palette.normal_modified.airline_error = s:airline_error + +" --- +" Insert + +let s:airline_a_insert = [s:colors.black.gui, s:colors.green.gui, s:colors.black.cterm, s:colors.green.cterm] +let s:airline_b_insert = s:airline_b_normal +let s:airline_c_insert = s:airline_c_normal +let g:airline#themes#palenight#palette.insert = airline#themes#generate_color_map(s:airline_a_insert, s:airline_b_insert, s:airline_c_insert) + +let g:airline#themes#palenight#palette.insert_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.insert.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.insert_modified.airline_warning = g:airline#themes#palenight#palette.normal_modified.airline_warning +let g:airline#themes#palenight#palette.insert.airline_error = g:airline#themes#palenight#palette.normal.airline_error +let g:airline#themes#palenight#palette.insert_modified.airline_error = g:airline#themes#palenight#palette.normal_modified.airline_error + +" --- +" Replace + +let s:airline_a_replace = [s:colors.black.gui, s:colors.light_red.gui, s:colors.black.cterm, s:colors.light_red.cterm] +let s:airline_b_replace = s:airline_b_normal +let s:airline_c_replace = s:airline_c_normal +let g:airline#themes#palenight#palette.replace = airline#themes#generate_color_map(s:airline_a_replace, s:airline_b_replace, s:airline_c_replace) + +let g:airline#themes#palenight#palette.replace_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.replace.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.replace_modified.airline_warning = g:airline#themes#palenight#palette.normal_modified.airline_warning +let g:airline#themes#palenight#palette.replace.airline_error = g:airline#themes#palenight#palette.normal.airline_error +let g:airline#themes#palenight#palette.replace_modified.airline_error = g:airline#themes#palenight#palette.normal_modified.airline_error + +" --- +" Visual + +let s:airline_a_visual = [s:colors.black.gui, s:colors.yellow.gui, s:colors.black.cterm, s:colors.yellow.cterm] +let s:airline_b_visual = s:airline_b_normal +let s:airline_c_visual = s:airline_c_normal +let g:airline#themes#palenight#palette.visual = airline#themes#generate_color_map(s:airline_a_visual, s:airline_b_visual, s:airline_c_visual) + +let g:airline#themes#palenight#palette.visual_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.visual.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.visual_modified.airline_warning = g:airline#themes#palenight#palette.normal_modified.airline_warning +let g:airline#themes#palenight#palette.visual.airline_error = g:airline#themes#palenight#palette.normal.airline_error +let g:airline#themes#palenight#palette.visual_modified.airline_error = g:airline#themes#palenight#palette.normal_modified.airline_error + +" --- +" Inactive + +let s:airline_inactive = [ s:colors.comment_grey.gui, s:colors.white_mask_1.gui, s:colors.comment_grey.cterm, s:colors.white_mask_1.cterm ] +let g:airline#themes#palenight#palette.inactive = airline#themes#generate_color_map(s:airline_inactive, s:airline_inactive, s:airline_inactive) + +let g:airline#themes#palenight#palette.inactive_modified = { + \ 'airline_c': s:airline_modified, + \ } + +" --- +" Command line + +let s:airline_a_commandline = [s:colors.black.gui, s:colors.white.gui, s:colors.black.cterm, s:colors.white.cterm] +let s:airline_b_commandline = s:airline_b_normal +let s:airline_c_commandline = s:airline_c_normal +let g:airline#themes#palenight#palette.commandline = airline#themes#generate_color_map(s:airline_a_commandline, s:airline_b_commandline, s:airline_c_commandline) + +let g:airline#themes#palenight#palette.commandline.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.commandline.airline_error = g:airline#themes#palenight#palette.normal.airline_error + +" --- + +let g:airline#themes#palenight#palette.accents = { + \ 'red': [s:colors.red.gui, '', s:colors.red.cterm, ''] + \ } + +" --- +" Tabline + +let s:airline_tabsel = [s:colors.black.gui, s:colors.white_mask_11.gui, s:colors.black.cterm, s:colors.white_mask_11.cterm, s:wrap_opts(['bold'])] +let s:airline_tabfill = [s:colors.white.gui, s:colors.black.gui, s:colors.white.cterm, s:colors.black.cterm] +let g:airline#themes#palenight#palette.tabline = { + \ 'airline_tabsel': s:airline_tabsel, + \ 'airline_tabfill': s:airline_tabfill, + \ 'airline_tabmod': [s:colors.black.gui, s:colors.green.gui, s:colors.black.cterm, s:colors.green.cterm, s:wrap_opts(['bold', 'italic'])], + \ 'airline_tabhid': [s:colors.white.gui, s:colors.white_mask_1.gui, s:colors.white.cterm, s:colors.white_mask_1.cterm] + \ } diff --git a/.config/nvim/colors/palenight/autoload/lightline/colorscheme/palenight.vim b/.config/nvim/colors/palenight/autoload/lightline/colorscheme/palenight.vim new file mode 100755 index 0000000..3033861 --- /dev/null +++ b/.config/nvim/colors/palenight/autoload/lightline/colorscheme/palenight.vim @@ -0,0 +1,48 @@ +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} + +let s:p_vertsplit = ["#181A1F", 59, 15] +let s:p_special_grey = ["#3B4048", 238, 15] +let s:p_menu_grey = ["#3E4452", 237, 8] +let s:p_cursor_grey = ["#2C323C", 236, 8] +let s:p_gutter_fg_grey = ["#4B5263", 238, 15] +let s:p_blue = ["#82b1ff", 39, 4] +let s:p_dark_red = ["#BE5046", 196, 9] +let s:p_white = ["#bfc7d5", 145, 7] +let s:p_green = ["#C3E88D", 114, 2] +let s:p_purple = ["#c792ea", 170, 5] +let s:p_yellow = ["#ffcb6b", 180, 3] +let s:p_light_red = ["#ff869a", 204, 1] +let s:p_red = ["#ff5370", 204, 1] +let s:p_dark_yellow = ["#F78C6C", 173, 11] +let s:p_cyan = ["#89DDFF", 38, 6] +let s:p_comment_grey = ["#697098", 59, 15] +let s:p_black = ["#292D3E", 235, 0] + +let s:p.normal.left = [ [ s:p_black, s:p_purple ], [ s:p_purple, s:p_menu_grey ] ] +let s:p.normal.right = copy(s:p.normal.left) +let s:p.normal.middle = [ [ s:p_comment_grey, s:p_black ] ] +let s:p.normal.warning = [ [ s:p_black, s:p_yellow ] ] +let s:p.normal.error = [ [ s:p_black, s:p_red ] ] + +let s:p.insert.left = [ [ s:p_black, s:p_blue ], [ s:p_blue, s:p_menu_grey ] ] +let s:p.insert.right = copy(s:p.insert.left) +let s:p.insert.middle = copy(s:p.normal.middle) + +let s:p.visual.left = [ [ s:p_black, s:p_cyan ], [ s:p_cyan, s:p_menu_grey ] ] +let s:p.visual.right = copy(s:p.visual.left) +let s:p.visual.middle = copy(s:p.normal.middle) + +let s:p.replace.left = [ [ s:p_black, s:p_green ], [ s:p_green, s:p_menu_grey ] ] +let s:p.replace.right = copy(s:p.replace.left) +let s:p.replace.middle = copy(s:p.normal.middle) + +let s:p.tabline.left = [ [ s:p_yellow, s:p_menu_grey ] ] +let s:p.tabline.right = [ [ s:p_black, s:p_yellow ] ] +let s:p.tabline.middle = [ [ s:p_black, s:p_menu_grey ] ] +let s:p.tabline.tabsel = copy(s:p.tabline.right) + +let s:p.inactive.left = [ [ s:p_black, s:p_menu_grey ], [ s:p_black, s:p_menu_grey ] ] +let s:p.inactive.right = copy(s:p.inactive.left) +let s:p.inactive.middle = [ [ s:p_black, s:p_menu_grey ] ] + +let g:lightline#colorscheme#palenight#palette = lightline#colorscheme#flatten(s:p) diff --git a/.config/nvim/colors/palenight/autoload/palenight.vim b/.config/nvim/colors/palenight/autoload/palenight.vim new file mode 100755 index 0000000..8468bac --- /dev/null +++ b/.config/nvim/colors/palenight/autoload/palenight.vim @@ -0,0 +1,34 @@ +let s:overrides = get(g:, "palenight_color_overrides", {}) + +" white_mask_: Color of a white mask overlayed on top of +" `s:colors.black`, where `number * 12` is the alpha value of the white mask + +let s:colors = { + \ "red": get(s:overrides, "red", { "gui": "#ff5370", "cterm": "204", "cterm16": "1" }), + \ "light_red": get(s:overrides, "light_red", { "gui": "#ff869a", "cterm": "204", "cterm16": "1" }), + \ "dark_red": get(s:overrides, "dark_red", { "gui": "#BE5046", "cterm": "196", "cterm16": "9" }), + \ "green": get(s:overrides, "green", { "gui": "#C3E88D", "cterm": "114", "cterm16": "2" }), + \ "yellow": get(s:overrides, "yellow", { "gui": "#ffcb6b", "cterm": "180", "cterm16": "3" }), + \ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "#F78C6C", "cterm": "173", "cterm16": "11" }), + \ "blue": get(s:overrides, "blue", { "gui": "#82b1ff", "cterm": "39", "cterm16": "4" }), + \ "purple": get(s:overrides, "purple", { "gui": "#c792ea", "cterm": "170", "cterm16": "5" }), + \ "blue_purple": get(s:overrides, "blue_purple", { "gui": "#939ede", "cterm": "39", "cterm16": "4"}), + \ "cyan": get(s:overrides, "cyan", { "gui": "#89DDFF", "cterm": "38", "cterm16": "6" }), + \ "white": get(s:overrides, "white", { "gui": "#bfc7d5", "cterm": "145", "cterm16": "7" }), + \ "black": get(s:overrides, "black", { "gui": "#292D3E", "cterm": "235", "cterm16": "0" }), + \ "visual_black": get(s:overrides, "visual_black", { "gui": "NONE", "cterm": "NONE", "cterm16": "0" }), + \ "comment_grey": get(s:overrides, "comment_grey", { "gui": "#697098", "cterm": "59", "cterm16": "15" }), + \ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "#4B5263", "cterm": "238", "cterm16": "15" }), + \ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "#2C323C", "cterm": "236", "cterm16": "8" }), + \ "visual_grey": get(s:overrides, "visual_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "15" }), + \ "menu_grey": get(s:overrides, "menu_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "8" }), + \ "special_grey": get(s:overrides, "special_grey", { "gui": "#3B4048", "cterm": "238", "cterm16": "15" }), + \ "vertsplit": get(s:overrides, "vertsplit", { "gui": "#181A1F", "cterm": "59", "cterm16": "15" }), + \ "white_mask_1": get(s:overrides, "white_mask_1", { "gui": "#333747", "cterm": "237", "cterm16": "15" }), + \ "white_mask_3": get(s:overrides, "white_mask_3", { "gui": "#474b59", "cterm": "238", "cterm16": "15" }), + \ "white_mask_11": get(s:overrides, "white_mask_11", { "gui": "#989aa2", "cterm": "238", "cterm16": "15" }) + \} + +function! palenight#GetColors() + return s:colors +endfunction diff --git a/.config/nvim/colors/palenight/colors/palenight.vim b/.config/nvim/colors/palenight/colors/palenight.vim new file mode 100755 index 0000000..b5b4a0f --- /dev/null +++ b/.config/nvim/colors/palenight/colors/palenight.vim @@ -0,0 +1,585 @@ +" vim:fdm=marker +" Vim Color File +" Name: palenight.vim +" Maintainer: https://github.com/drewtempelmeyer/palenight.vim +" License: The MIT License (MIT) +" Based On: https://github.com/joshdick/onedark.vim + +" Initialization {{{ + +highlight clear + +if exists("syntax_on") + syntax reset +endif + +set t_Co=256 + +let g:colors_name="palenight" + +" Set to "256" for 256-color terminals, or +" set to "16" to use your terminal emulator's native colors +" (a 16-color palette for this color scheme is available; see +" < https://github.com/joshdick/onedark.vim/blob/master/README.md > +" for more information.) +if !exists("g:palenight_termcolors") + let g:palenight_termcolors = 256 +endif + +" Not all terminals support italics properly. If yours does, opt-in. +if !exists("g:palenight_terminal_italics") + let g:palenight_terminal_italics = 0 +endif + +" This function is based on one from FlatColor: https://github.com/MaxSt/FlatColor/ +" Which in turn was based on one found in hemisu: https://github.com/noahfrederick/vim-hemisu/ +function! s:h(group, style) + if g:palenight_terminal_italics == 0 + if has_key(a:style, "cterm") && a:style["cterm"] == "italic" + unlet a:style.cterm + endif + if has_key(a:style, "gui") && a:style["gui"] == "italic" + unlet a:style.gui + endif + endif + if g:palenight_termcolors == 16 + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm16 : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm16 : "NONE") + else + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm : "NONE") + endif + execute "highlight" a:group + \ "guifg=" (has_key(a:style, "fg") ? a:style.fg.gui : "NONE") + \ "guibg=" (has_key(a:style, "bg") ? a:style.bg.gui : "NONE") + \ "guisp=" (has_key(a:style, "sp") ? a:style.sp.gui : "NONE") + \ "gui=" (has_key(a:style, "gui") ? a:style.gui : "NONE") + \ "ctermfg=" . l:ctermfg + \ "ctermbg=" . l:ctermbg + \ "cterm=" (has_key(a:style, "cterm") ? a:style.cterm : "NONE") +endfunction + +" public {{{ + +function! palenight#set_highlight(group, style) + call s:h(a:group, a:style) +endfunction + +" }}} + +" }}} + +" Color Variables {{{ + +let s:colors = palenight#GetColors() + +let s:red = s:colors.red +let s:light_red = s:colors.light_red +let s:dark_red = s:colors.dark_red +let s:green = s:colors.green +let s:yellow = s:colors.yellow +let s:dark_yellow = s:colors.dark_yellow +let s:blue = s:colors.blue +let s:purple = s:colors.purple +let s:blue_purple = s:colors.blue_purple +let s:cyan = s:colors.cyan +let s:white = s:colors.white +let s:black = s:colors.black +let s:visual_black = s:colors.visual_black " Black out selected text in 16-color visual mode +let s:comment_grey = s:colors.comment_grey +let s:gutter_fg_grey = s:colors.gutter_fg_grey +let s:cursor_grey = s:colors.cursor_grey +let s:visual_grey = s:colors.visual_grey +let s:menu_grey = s:colors.menu_grey +let s:special_grey = s:colors.special_grey +let s:vertsplit = s:colors.vertsplit +let s:white_mask_3 = s:colors.white_mask_3 + +" }}} + +" Syntax Groups (descriptions and ordering from `:h w18`) {{{ + +call s:h("Comment", { "fg": s:comment_grey, "gui": "italic", "cterm": "italic" }) " any comment +call s:h("Constant", { "fg": s:cyan }) " any constant +call s:h("String", { "fg": s:green }) " a string constant: "this is a string" +call s:h("Character", { "fg": s:green }) " a character constant: 'c', '\n' +call s:h("Number", { "fg": s:dark_yellow }) " a number constant: 234, 0xff +call s:h("Boolean", { "fg": s:red }) " a boolean constant: TRUE, false +call s:h("Float", { "fg": s:dark_yellow }) " a floating point constant: 2.3e10 +call s:h("Identifier", { "fg": s:red }) " any variable name +call s:h("Function", { "fg": s:blue }) " function name (also: methods for classes) +call s:h("Statement", { "fg": s:purple }) " any statement +call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc. +call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc. +call s:h("Label", { "fg": s:purple }) " case, default, etc. +call s:h("Operator", { "fg": s:cyan }) " sizeof", "+", "*", etc. +call s:h("Keyword", { "fg": s:red }) " any other keyword +call s:h("Exception", { "fg": s:purple }) " try, catch, throw +call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor +call s:h("Include", { "fg": s:blue }) " preprocessor #include +call s:h("Define", { "fg": s:purple }) " preprocessor #define +call s:h("Macro", { "fg": s:purple }) " same as Define +call s:h("PreCondit", { "fg": s:yellow }) " preprocessor #if, #else, #endif, etc. +call s:h("Type", { "fg": s:yellow }) " int, long, char, etc. +call s:h("StorageClass", { "fg": s:yellow }) " static, register, volatile, etc. +call s:h("Structure", { "fg": s:yellow }) " struct, union, enum, etc. +call s:h("Typedef", { "fg": s:yellow }) " A typedef +call s:h("Special", { "fg": s:blue }) " any special symbol +call s:h("SpecialChar", {}) " special character in a constant +call s:h("Tag", {}) " you can use CTRL-] on this +call s:h("Delimiter", {}) " character that needs attention +call s:h("SpecialComment", { "fg": s:comment_grey }) " special things inside a comment +call s:h("Debug", {}) " debugging statements +call s:h("Underlined", { "gui": "underline", "cterm": "underline" }) " text that stands out, HTML links +call s:h("Ignore", {}) " left blank, hidden +call s:h("Error", { "fg": s:red }) " any erroneous construct +call s:h("Todo", { "fg": s:purple }) " anything that needs extra attention; mostly the keywords TODO FIXME and XXX + +" }}} + +" Highlighting Groups (descriptions and ordering from `:h hitest.vim`) {{{ + +call s:h("ColorColumn", { "bg": s:cursor_grey }) " used for the columns set with 'colorcolumn' +call s:h("Conceal", {}) " placeholder characters substituted for concealed text (see 'conceallevel') +call s:h("Cursor", { "fg": s:black, "bg": s:blue }) " the character under the cursor +call s:h("CursorIM", {}) " like Cursor, but used when in IME mode +call s:h("CursorColumn", { "bg": s:cursor_grey }) " the screen column that the cursor is in when 'cursorcolumn' is set +call s:h("CursorLine", { "bg": s:cursor_grey }) " the screen line that the cursor is in when 'cursorline' is set +call s:h("Directory", { "fg": s:blue }) " directory names (and other special names in listings) +call s:h("DiffAdd", { "bg": s:green, "fg": s:black }) " diff mode: Added line +call s:h("DiffChange", { "bg": s:yellow, "fg": s:black }) " diff mode: Changed line +call s:h("DiffDelete", { "bg": s:red, "fg": s:black }) " diff mode: Deleted line +call s:h("DiffText", { "bg": s:black, "fg": s:yellow }) " diff mode: Changed text within a changed line +call s:h("ErrorMsg", { "fg": s:red }) " error messages on the command line +call s:h("VertSplit", { "fg": s:vertsplit }) " the column separating vertically split windows +call s:h("Folded", { "bg": s:cursor_grey, "fg": s:comment_grey }) " line used for closed folds +call s:h("FoldColumn", {}) " 'foldcolumn' +call s:h("SignColumn", {}) " column where signs are displayed +call s:h("IncSearch", { "fg": s:yellow, "bg": s:comment_grey }) " 'incsearch' highlighting; also used for the text replaced with ":s///c" +call s:h("LineNr", { "fg": s:gutter_fg_grey }) " Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. +call s:h("CursorLineNr", {}) " Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. +call s:h("MatchParen", { "fg": s:blue, "gui": "underline" }) " The character under the cursor or just before it, if it is a paired bracket, and its match. +call s:h("ModeMsg", {}) " 'showmode' message (e.g., "-- INSERT --") +call s:h("MoreMsg", {}) " more-prompt +call s:h("NonText", { "fg": s:special_grey }) " '~' and '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line). +call s:h("Normal", { "fg": s:white, "bg": s:black }) " normal text +call s:h("Pmenu", { "bg": s:menu_grey }) " Popup menu: normal item. +call s:h("PmenuSel", { "fg": s:black, "bg": s:blue }) " Popup menu: selected item. +call s:h("PmenuSbar", { "bg": s:special_grey }) " Popup menu: scrollbar. +call s:h("PmenuThumb", { "bg": s:white }) " Popup menu: Thumb of the scrollbar. +call s:h("Question", { "fg": s:purple }) " hit-enter prompt and yes/no questions +call s:h("Search", { "fg": s:black, "bg": s:yellow }) " Last search pattern highlighting (see 'hlsearch'). Also used for highlighting the current line in the quickfix window and similar items that need to stand out. +call s:h("SpecialKey", { "fg": s:special_grey }) " Meta and special keys listed with ":map", also for text used to show unprintable characters in the text, 'listchars'. Generally: text that is displayed differently from what it really is. +call s:h("SpellBad", { "fg": s:red, "gui": "underline", "cterm": "underline" }) " Word that is not recognized by the spellchecker. This will be combined with the highlighting used otherwise. +call s:h("SpellCap", { "fg": s:dark_yellow }) " Word that should start with a capital. This will be combined with the highlighting used otherwise. +call s:h("SpellLocal", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is used in another region. This will be combined with the highlighting used otherwise. +call s:h("SpellRare", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is hardly ever used. spell This will be combined with the highlighting used otherwise. +call s:h("StatusLine", { "fg": s:white, "bg": s:cursor_grey }) " status line of current window +call s:h("StatusLineNC", { "fg": s:comment_grey }) " status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. +call s:h("TabLine", { "fg": s:comment_grey }) " tab pages line, not active tab page label +call s:h("TabLineFill", {}) " tab pages line, where there are no labels +call s:h("TabLineSel", { "fg": s:white }) " tab pages line, active tab page label +call s:h("Title", { "fg": s:green }) " titles for output from ":set all", ":autocmd" etc. +call s:h("Visual", { "fg": s:visual_black, "bg": s:visual_grey }) " Visual mode selection +call s:h("VisualNOS", { "bg": s:visual_grey }) " Visual mode selection when vim is "Not Owning the Selection". Only X11 Gui's gui-x11 and xterm-clipboard supports this. +call s:h("WarningMsg", { "fg": s:yellow }) " warning messages +call s:h("WildMenu", { "fg": s:black, "bg": s:blue }) " current match in 'wildmenu' completion + +" }}} + +" Language-Specific Highlighting {{{ + +" Dockerfile +call s:h("dockerfileKeyword", { "fg": s:purple }) + +" Shell +call s:h("shSet", { "fg": s:cyan }) +call s:h("shSetOption", { "fg": s:white }) +call s:h("shStatement", { "fg": s:cyan }) +call s:h("shFunctionKey", { "fg": s:purple }) + +" CSS +call s:h("cssAttrComma", { "fg": s:purple }) +call s:h("cssAttributeSelector", { "fg": s:green }) +call s:h("cssBraces", { "fg": s:white }) +call s:h("cssClassName", { "fg": s:dark_yellow }) +call s:h("cssClassNameDot", { "fg": s:dark_yellow }) +call s:h("cssDefinition", { "fg": s:purple }) +call s:h("cssFontAttr", { "fg": s:dark_yellow }) +call s:h("cssFontDescriptor", { "fg": s:purple }) +call s:h("cssFunctionName", { "fg": s:blue }) +call s:h("cssIdentifier", { "fg": s:blue }) +call s:h("cssImportant", { "fg": s:purple }) +call s:h("cssInclude", { "fg": s:white }) +call s:h("cssIncludeKeyword", { "fg": s:purple }) +call s:h("cssMediaType", { "fg": s:dark_yellow }) +call s:h("cssProp", { "fg": s:white }) +call s:h("cssPseudoClassId", { "fg": s:dark_yellow }) +call s:h("cssSelectorOp", { "fg": s:purple }) +call s:h("cssSelectorOp2", { "fg": s:purple }) +call s:h("cssTagName", { "fg": s:red }) + +" Go +call s:h("goDeclaration", { "fg": s:purple }) + +" HTML +call s:h("htmlTitle", { "fg": s:white }) +call s:h("htmlArg", { "fg": s:yellow }) +call s:h("htmlEndTag", { "fg": s:cyan }) +call s:h("htmlH1", { "fg": s:white }) +call s:h("htmlLink", { "fg": s:purple }) +call s:h("htmlSpecialChar", { "fg": s:dark_yellow }) +call s:h("htmlSpecialTagName", { "fg": s:red }) +call s:h("htmlTag", { "fg": s:cyan }) +call s:h("htmlTagName", { "fg": s:red }) + +" Coffeescript +call s:h("coffeeExtendedOp", { "fg": s:purple }) + +" JavaScript +call s:h("javaScriptBraces", { "fg": s:white }) +call s:h("javaScriptFunction", { "fg": s:purple }) +call s:h("javaScriptIdentifier", { "fg": s:purple }) +call s:h("javaScriptNull", { "fg": s:dark_yellow }) +call s:h("javaScriptNumber", { "fg": s:dark_yellow }) +call s:h("javaScriptRequire", { "fg": s:cyan }) +call s:h("javaScriptReserved", { "fg": s:purple }) +" https://github.com/pangloss/vim-javascript +call s:h("jsArrowFunction", { "fg": s:purple }) +call s:h("jsClassKeyword", { "fg": s:purple }) +call s:h("jsClassDefinition", { "fg": s:yellow }) +call s:h("jsClassMethodType", { "fg": s:purple }) +call s:h("jsClassFuncName", { "fg": s:blue }) +call s:h("jsDestructuringBlock", { "fg": s:blue }) +call s:h("jsDocParam", { "fg": s:blue }) +call s:h("jsDocTags", { "fg": s:purple }) +call s:h("jsExport", { "fg": s:purple }) +call s:h("jsExportDefault", { "fg": s:red }) +call s:h("jsExtendsKeyword", { "fg": s:purple }) +call s:h("jsConditional", { "fg": s:purple }) +call s:h("jsOperator", { "fg": s:purple }) +call s:h("jsFrom", { "fg": s:purple }) +call s:h("jsFuncArgs", { "fg": s:blue }) +call s:h("jsFuncCall", { "fg": s:blue }) +call s:h("jsFuncName", { "fg": s:blue }) +call s:h("jsObjectProp", { "fg": s:cyan }) +call s:h("jsFunction", { "fg": s:purple }) +call s:h("jsGenerator", { "fg": s:yellow }) +call s:h("jsGlobalObjects", { "fg": s:yellow }) +call s:h("jsImport", { "fg": s:purple }) +call s:h("jsModuleAs", { "fg": s:purple }) +call s:h("jsModuleWords", { "fg": s:purple }) +call s:h("jsModuleKeyword", { "fg": s:blue }) +call s:h("jsModules", { "fg": s:purple }) +call s:h("jsNull", { "fg": s:dark_yellow }) +call s:h("jsStorageClass", { "fg": s:purple }) +call s:h("jsSuper", { "fg": s:red }) +call s:h("jsTemplateBraces", { "fg": s:dark_red }) +call s:h("jsTemplateVar", { "fg": s:green }) +call s:h("jsThis", { "fg": s:red }) +call s:h("jsUndefined", { "fg": s:dark_yellow }) +" call s:h("jsVariableDef", { "fg": s:blue }) +" https://github.com/othree/yajs.vim +call s:h("javascriptArrowFunc", { "fg": s:purple }) +call s:h("javascriptClassExtends", { "fg": s:purple }) +call s:h("javascriptClassKeyword", { "fg": s:purple }) +call s:h("javascriptDocNotation", { "fg": s:purple }) +call s:h("javascriptDocParamName", { "fg": s:blue }) +call s:h("javascriptDocTags", { "fg": s:purple }) +call s:h("javascriptEndColons", { "fg": s:white }) +call s:h("javascriptExport", { "fg": s:purple }) +call s:h("javascriptFuncArg", { "fg": s:white }) +call s:h("javascriptFuncKeyword", { "fg": s:purple }) +call s:h("javascriptIdentifier", { "fg": s:red }) +call s:h("javascriptImport", { "fg": s:purple }) +call s:h("javascriptMethodName", { "fg": s:white }) +call s:h("javascriptObjectLabel", { "fg": s:white }) +call s:h("javascriptOpSymbol", { "fg": s:cyan }) +call s:h("javascriptOpSymbols", { "fg": s:cyan }) +call s:h("javascriptPropertyName", { "fg": s:green }) +call s:h("javascriptTemplateSB", { "fg": s:dark_red }) +call s:h("javascriptVariable", { "fg": s:purple }) + +" JSON +call s:h("jsonCommentError", { "fg": s:white }) +call s:h("jsonKeyword", { "fg": s:blue }) +call s:h("jsonBoolean", { "fg": s:red }) +call s:h("jsonNumber", { "fg": s:dark_yellow }) +call s:h("jsonQuote", { "fg": s:white }) +call s:h("jsonMissingCommaError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNoQuotesError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNumError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonString", { "fg": s:green }) +call s:h("jsonStringSQError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonSemicolonError", { "fg": s:red, "gui": "reverse" }) + +" Markdown +call s:h("markdownCode", { "fg": s:green }) +call s:h("markdownLinkReference", { "fg": s:comment_grey }) +call s:h("markdownJekyllFrontMatter", { "fg": s:comment_grey }) +call s:h("markdownCodeBlock", { "fg": s:green }) +call s:h("markdownCodeDelimiter", { "fg": s:green }) +call s:h("markdownHeadingDelimiter", { "fg": s:red }) +call s:h("markdownRule", { "fg": s:comment_grey }) +call s:h("markdownHeadingRule", { "fg": s:comment_grey }) +call s:h("htmlH1", { "fg": s:blue }) +call s:h("htmlH2", { "fg": s:blue }) +call s:h("htmlH3", { "fg": s:blue }) +call s:h("htmlH4", { "fg": s:blue }) +call s:h("htmlH5", { "fg": s:blue }) +call s:h("htmlH6", { "fg": s:blue }) +call s:h("mkdDelimiter", { "fg": s:cyan }) +call s:h("markdownId", { "fg": s:purple }) +call s:h("markdownBlockquote", { "fg": s:comment_grey }) +call s:h("markdownItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("mkdBold", { "fg": s:yellow, "gui": "bold", "cterm": "bold" }) +call s:h("mkdInlineURL", { "fg": s:light_red }) +call s:h("mkdListItem", { "fg": s:yellow }) +call s:h("markdownOrderedListMarker", { "fg": s:red }) +call s:h("markdownIdDeclaration", { "fg": s:blue }) +call s:h("mkdLink", { "fg": s:white }) +call s:h("markdownLinkDelimiter", { "fg": s:white }) +call s:h("mkdURL", { "fg": s:light_red }) + +" Ruby +call s:h("rubyAccess", { "fg": s:cyan }) +call s:h("rubyBlockParameter", { "fg": s:yellow}) +call s:h("rubyBlockParameterList", { "fg": s:white }) +call s:h("rubyBoolean", { "fg": s:red }) +call s:h("rubyCapitalizedMethod", { "fg": s:blue}) +call s:h("rubyClass", { "fg": s:purple}) +call s:h("rubyClassName", { "fg": s:yellow }) +call s:h("rubyConstant", { "fg": s:yellow }) +call s:h("rubyControl", { "fg": s:purple }) +call s:h("rubyEscape", { "fg": s:red}) +call s:h("rubyFunction", { "fg": s:blue}) +call s:h("rubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInclude", { "fg": s:cyan}) +call s:h("rubyIncluderubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInstanceVariable", { "fg": s:red}) +call s:h("rubyInterpolation", { "fg": s:cyan }) +call s:h("rubyInterpolationDelimiter", { "fg": s:red }) +call s:h("rubyModuleName", { "fg": s:white }) +call s:h("rubyKeyword", { "fg": s:purple }) +call s:h("rubyKeywordAsMethod", { "fg": s:cyan}) +call s:h("rubyOperator", { "fg": s:purple }) +call s:h("rubyPredefinedConstant", { "fg": s:yellow}) +call s:h("rubyPseudoVariable", { "fg": s:blue }) +call s:h("rubyRegexp", { "fg": s:white}) +call s:h("rubyRegexpDelimiter", { "fg": s:cyan}) +call s:h("rubySharpBang", { "fg": s:comment_grey}) +call s:h("rubyStringDelimiter", { "fg": s:green}) +call s:h("rubySymbol", { "fg": s:blue}) + +" ERb +call s:h("erubyDelimiter", { "fg": s:red }) + +" Rails +call s:h("railsAssetPreProc", { "fg": s:comment_grey }) +call s:h("railsAssetInclude", { "fg": s:comment_grey }) +call s:h("railsAssetIncluded", { "fg": s:comment_grey }) +call s:h("rubyRailsMethod", { "fg": s:blue }) +call s:h("rubyRailsFilterMethod", { "fg": s:cyan }) +call s:h("rubyRailsRenderMethod", { "fg": s:cyan }) +call s:h("rubyRailsARAssociationMethod", { "fg": s:cyan }) +call s:h("rubyRailsHelperMethod", { "fg": s:cyan }) + +" RSpec +call s:h("rspecGroupMethods", { "fg": s:white }) +call s:h("rspecBeforeAndAfter", { "fg": s:white }) + +" CSS +call s:h("cssColor", { "fg": s:dark_yellow }) +call s:h("cssCommonAttr", { "fg": s:blue }) +call s:h("cssProp", { "fg": s:cyan }) +call s:h("cssSelectorOp", { "fg": s:white }) +call s:h("cssUnitDecorators", { "fg": s:yellow }) + +" Sass +" https://github.com/tpope/vim-haml +call s:h("sassAmpersand", { "fg": s:red }) +call s:h("sassClass", { "fg": s:dark_yellow }) +call s:h("sassControl", { "fg": s:purple }) +call s:h("sassExtend", { "fg": s:purple }) +call s:h("sassFor", { "fg": s:white }) +call s:h("sassFunction", { "fg": s:cyan }) +call s:h("sassId", { "fg": s:blue }) +call s:h("sassInclude", { "fg": s:purple }) +call s:h("sassMedia", { "fg": s:purple }) +call s:h("sassMediaOperators", { "fg": s:white }) +call s:h("sassMixin", { "fg": s:purple }) +call s:h("sassMixinName", { "fg": s:blue }) +call s:h("sassMixing", { "fg": s:purple }) +call s:h("sassVariable", { "fg": s:dark_yellow }) +" https://github.com/cakebaker/scss-syntax.vim +call s:h("scssExtend", { "fg": s:purple }) +call s:h("scssExtendedSelector", { "fg": s:dark_yellow }) +call s:h("scssFunctionName", { "fg": s:cyan }) +call s:h("scssImport", { "fg": s:purple }) +call s:h("scssInclude", { "fg": s:purple }) +call s:h("scssMixin", { "fg": s:purple }) +call s:h("scssMixinName", { "fg": s:blue }) +call s:h("scssSelectorName", { "fg": s:yellow }) +call s:h("scssVariable", { "fg": s:dark_yellow }) + +" TypeScript +call s:h("typescriptReserved", { "fg": s:purple }) +call s:h("typescriptEndColons", { "fg": s:white }) +call s:h("typescriptBraces", { "fg": s:white }) + +" XML +call s:h("xmlAttrib", { "fg": s:yellow }) +call s:h("xmlEndTag", { "fg": s:red }) +call s:h("xmlTag", { "fg": s:red }) +call s:h("xmlTagName", { "fg": s:red }) + +" PHP +call s:h("phpInclude", { "fg": s:purple }) +call s:h("phpClass", { "fg": s:yellow }) +call s:h("phpClasses", { "fg": s:yellow }) +call s:h("phpFunction", { "fg": s:blue }) +call s:h("phpType", { "fg": s:purple }) +call s:h("phpKeyword", { "fg": s:purple }) +call s:h("phpVarSelector", { "fg": s:white }) +call s:h("phpIdentifier", { "fg": s:white }) +call s:h("phpMethod", { "fg": s:blue }) +call s:h("phpBoolean", { "fg": s:blue }) +call s:h("phpParent", { "fg": s:white }) +call s:h("phpOperator", { "fg": s:purple }) +call s:h("phpRegion", { "fg": s:purple }) +call s:h("phpUseNamespaceSeparator", { "fg": s:white }) +call s:h("phpClassNamespaceSeparator", { "fg": s:white }) +call s:h("phpDocTags", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("phpDocParam", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) + +" Dart +call s:h("dartLibrary", { "fg": s:purple}) +call s:h("dartTypedef", { "fg": s:purple}) +call s:h("dartClassDecl", { "fg": s:purple}) +call s:h("dartCoreType", { "fg": s:purple}) +call s:h("dartStorageClass", { "fg": s:purple}) +call s:h("dartOperator", { "fg": s:purple}) +call s:h("dartMetadata", { "fg": s:purple}) +call s:h("dartKeyword", { "fg": s:purple}) + +" }}} + +" Plugin Highlighting {{{ + +" airblade/vim-gitgutter +hi link GitGutterAdd SignifySignAdd +hi link GitGutterChange SignifySignChange +hi link GitGutterDelete SignifySignDelete + +" mhinz/vim-signify +call s:h("SignifySignAdd", { "fg": s:green }) +call s:h("SignifySignChange", { "fg": s:yellow }) +call s:h("SignifySignDelete", { "fg": s:red }) + +" neomake/neomake +call s:h("NeomakeWarningSign", { "fg": s:yellow }) +call s:h("NeomakeErrorSign", { "fg": s:red }) +call s:h("NeomakeInfoSign", { "fg": s:blue }) + +" tpope/vim-fugitive +call s:h("diffAdded", { "fg": s:green }) +call s:h("diffRemoved", { "fg": s:red }) + +" liuchengxu/vista.vim +call s:h("VistaBracket", { "fg": s:purple }) +call s:h("VistaChildrenNr", { "fg": s:dark_yellow }) +call s:h("VistaScope", { "fg": s:blue_purple }) +call s:h("VistaTag", { "fg": s:purple }) +call s:h("VistaPrefix", { "fg": s:blue_purple }) +call s:h("VistaParenthesis", { "fg": s:purple }) +call s:h("VistaColon", { "fg": s:cyan }) +call s:h("VistaIcon", { "fg": s:cyan }) +call s:h("VistaLineNr", { "fg": s:comment_grey }) +call s:h("VistaArgs", { "fg": s:comment_grey }) +call s:h("VistaKind", { "fg": s:comment_grey }) +call s:h("VistaScopeKind", { "fg": s:yellow }) + +" termdebug +call s:h("debugBreakpoint", { "fg": s:blue_purple }) +call s:h("debugPC", { "bg": s:blue_purple, "fg": s:black }) + +" davidhalter/jedi-vim +call s:h("jediFunction", { "bg": s:white_mask_3, "fg": s:white }) +call s:h("jediFat", { "bg": s:white_mask_3, "fg": s:blue , "gui": "bold,underline" }) + +" }}} + +" Git Highlighting {{{ + +call s:h("gitcommitComment", { "fg": s:comment_grey }) +call s:h("gitcommitUnmerged", { "fg": s:green }) +call s:h("gitcommitOnBranch", {}) +call s:h("gitcommitBranch", { "fg": s:purple }) +call s:h("gitcommitDiscardedType", { "fg": s:red }) +call s:h("gitcommitSelectedType", { "fg": s:green }) +call s:h("gitcommitHeader", {}) +call s:h("gitcommitUntrackedFile", { "fg": s:cyan }) +call s:h("gitcommitDiscardedFile", { "fg": s:red }) +call s:h("gitcommitSelectedFile", { "fg": s:green }) +call s:h("gitcommitUnmergedFile", { "fg": s:yellow }) +call s:h("gitcommitFile", {}) +call s:h("gitcommitSummary", { "fg": s:white }) +call s:h("gitcommitOverflow", { "fg": s:red }) +hi link gitcommitNoBranch gitcommitBranch +hi link gitcommitUntracked gitcommitComment +hi link gitcommitDiscarded gitcommitComment +hi link gitcommitSelected gitcommitComment +hi link gitcommitDiscardedArrow gitcommitDiscardedFile +hi link gitcommitSelectedArrow gitcommitSelectedFile +hi link gitcommitUnmergedArrow gitcommitUnmergedFile + +" }}} + +" Setup Terminal Colors {{{ + +if has("nvim") + let g:terminal_color_0 = s:black.gui + let g:terminal_color_1 = s:red.gui + let g:terminal_color_2 = s:green.gui + let g:terminal_color_3 = s:yellow.gui + let g:terminal_color_4 = s:blue.gui + let g:terminal_color_5 = s:purple.gui + let g:terminal_color_6 = s:cyan.gui + let g:terminal_color_7 = s:white.gui + let g:terminal_color_8 = s:visual_grey.gui + let g:terminal_color_9 = s:dark_red.gui + let g:terminal_color_10 = s:green.gui " No dark version + let g:terminal_color_11 = s:dark_yellow.gui + let g:terminal_color_12 = s:blue.gui " No dark version + let g:terminal_color_13 = s:purple.gui " No dark version + let g:terminal_color_14 = s:cyan.gui " No dark version + let g:terminal_color_15 = s:comment_grey.gui + let g:terminal_color_background = g:terminal_color_0 + let g:terminal_color_foreground = g:terminal_color_7 +elseif has('terminal') + let g:terminal_ansi_colors = [ + \ s:black.gui, + \ s:red.gui, + \ s:green.gui, + \ s:yellow.gui, + \ s:blue.gui, + \ s:purple.gui, + \ s:cyan.gui, + \ s:white.gui, + \ s:visual_grey.gui, + \ s:dark_red.gui, + \ s:green.gui, + \ s:dark_yellow.gui, + \ s:blue.gui, + \ s:purple.gui, + \ s:cyan.gui, + \ s:white.gui + \ ] +endif + +" }}} + +" Must appear at the end of the file to work around this oddity: +" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark + diff --git a/.config/nvim/colors/palenight/images/screenshot.png b/.config/nvim/colors/palenight/images/screenshot.png new file mode 100755 index 0000000..8bbf76d Binary files /dev/null and b/.config/nvim/colors/palenight/images/screenshot.png differ diff --git a/.config/nvim/colors/vim-janah b/.config/nvim/colors/vim-janah deleted file mode 160000 index 3b8ae97..0000000 --- a/.config/nvim/colors/vim-janah +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3b8ae976987b6ade2abeac25f0208e8bc90d7138 diff --git a/.config/nvim/colors/vim-janah/README.md b/.config/nvim/colors/vim-janah/README.md new file mode 100755 index 0000000..376fae1 --- /dev/null +++ b/.config/nvim/colors/vim-janah/README.md @@ -0,0 +1,22 @@ +A dark colorscheme for Vim. + +- works with 256 color terminals and GUI +- supports [Neovim](https://github.com/neovim/neovim)'s new highlight groups +- supports highlighting groups for these plugins: [vim-startify](https://github.com/mhinz/vim-startify) | +[vim-signify](https://github.com/mhinz/vim-signify) | +[vim-rfc](https://github.com/mhinz/vim-rfc) | +[vim-easymotion](https://github.com/easymotion/vim-easymotion) + +![Janah in action](https://raw.githubusercontent.com/mhinz/vim-janah/master/janah.png) + +__NOTE__: No background color will be set if used in a terminal emulator. If +the colorscheme doesn't look good with your terminal's default background +color, put this in your vimrc: + +```vim +autocmd ColorScheme janah highlight Normal ctermbg=235 +colorscheme janah +``` + +If you set `'background'` in your vimrc, make sure to do that before setting +the above, because of a [Vim bug](https://github.com/mhinz/vim-janah/issues/2). diff --git a/.config/nvim/colors/vim-janah/colors/janah.vim b/.config/nvim/colors/vim-janah/colors/janah.vim new file mode 100755 index 0000000..1ba2e47 --- /dev/null +++ b/.config/nvim/colors/vim-janah/colors/janah.vim @@ -0,0 +1,148 @@ +" vim: et sw=2 sts=2 + +" Plugin: https://github.com/mhinz/vim-janah +" Description: A 256 colors colorscheme for Vim. +" Maintainer: Marco Hinz + +highlight clear + +if exists('syntax_on') + syntax reset +endif + +highlight Normal guifg=#dadada ctermfg=253 guibg=#262626 gui=NONE cterm=NONE + +" Misc {{{1 + +highlight Comment guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Constant guifg=#87dfdf ctermfg=116 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Directory guifg=#ffaf87 ctermfg=216 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight EndOfBuffer guifg=#262626 ctermfg=235 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Identifier guifg=#ffaf87 ctermfg=216 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight MatchParen guifg=#df005f ctermfg=161 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight NonText guifg=#ff00af ctermfg=199 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight Number guifg=#87dfdf ctermfg=116 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight PreProc guifg=#ffdfaf ctermfg=223 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Special guifg=#dfafaf ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight SpecialKey guifg=#3a3a3a ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Statement guifg=#afdf87 ctermfg=150 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight String guifg=#87afdf ctermfg=110 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Title guifg=#afff87 ctermfg=156 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Todo guifg=#ffdfaf ctermfg=223 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Type guifg=#87dfaf ctermfg=115 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight VertSplit guifg=#3a3a3a ctermfg=237 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE +highlight WildMenu guifg=#df005f ctermfg=161 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold + +" Cursor lines {{{1 + +highlight CursorColumn ctermfg=NONE guibg=#303030 ctermbg=236 gui=NONE cterm=NONE +highlight CursorLine ctermfg=NONE guibg=#303030 ctermbg=236 gui=NONE cterm=NONE + +" Tabline {{{1 + +highlight TabLine guifg=#808080 ctermfg=244 guibg=#303030 ctermbg=236 gui=NONE cterm=NONE +highlight TabLineFill guifg=#dfdfaf ctermfg=187 guibg=#303030 ctermbg=236 gui=NONE cterm=NONE +highlight TabLineSel guifg=#e4e4e4 ctermfg=254 guibg=#303030 ctermbg=236 gui=bold cterm=bold + +" Statusline {{{1 + +highlight StatusLine guifg=#e4e4e4 ctermfg=254 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE +highlight StatusLineNC guifg=#808080 ctermfg=244 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +" Number column {{{1 + +highlight CursorLineNr guifg=#878787 ctermfg=102 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE +highlight LineNr guifg=#878787 ctermfg=102 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +" Color column {{{1 + +highlight ColorColumn ctermfg=NONE guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +" Diff & Signs {{{1 + +highlight SignColumn ctermfg=NONE guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +highlight DiffAdd guifg=#87ff5f ctermfg=119 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight DiffDelete guifg=#df5f5f ctermfg=167 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight DiffChange guifg=#ffff5f ctermfg=227 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight DiffText guifg=#ff5f5f ctermfg=203 guibg=#5f0000 ctermbg=52 gui=bold cterm=bold + +" Folds {{{1 + +highlight FoldColumn ctermfg=102 ctermbg=237 cterm=NONE guifg=#878787 guibg=#3a3a3a gui=NONE +highlight Folded ctermfg=102 ctermbg=237 cterm=NONE guifg=#878787 guibg=#3a3a3a gui=NONE + +" Search {{{1 + +highlight IncSearch guifg=#c0c0c0 ctermfg=7 guibg=#005fff ctermbg=27 gui=NONE cterm=NONE +highlight Search guifg=#c0c0c0 ctermfg=7 guibg=#df005f ctermbg=161 gui=NONE cterm=NONE + +" Messages {{{1 + +highlight Error guifg=#eeeeee ctermfg=255 guibg=#df0000 ctermbg=160 gui=NONE cterm=NONE +highlight ErrorMsg guifg=#eeeeee ctermfg=255 guibg=#df0000 ctermbg=160 gui=NONE cterm=NONE +highlight ModeMsg guifg=#afff87 ctermfg=156 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight MoreMsg guifg=#c0c0c0 ctermfg=7 guibg=#005fdf ctermbg=26 gui=NONE cterm=NONE +highlight WarningMsg guifg=#c0c0c0 ctermfg=7 guibg=#005fdf ctermbg=26 gui=NONE cterm=NONE + +" Visual {{{1 + +highlight Visual guifg=#c0c0c0 ctermfg=7 guibg=#005f87 ctermbg=24 gui=NONE cterm=NONE +highlight VisualNOS guifg=#c0c0c0 ctermfg=7 guibg=#5f5f87 ctermbg=60 gui=NONE cterm=NONE + +" Pmenu {{{1 + +highlight Pmenu guifg=#e4e4e4 ctermfg=254 guibg=#262626 ctermbg=235 gui=NONE cterm=NONE +highlight PmenuSbar ctermfg=NONE guibg=#444444 ctermbg=238 gui=NONE cterm=NONE +highlight PmenuSel guifg=#df5f5f ctermfg=167 guibg=#444444 ctermbg=238 gui=bold cterm=bold +highlight PmenuThumb ctermfg=NONE guibg=#df5f5f ctermbg=167 gui=NONE cterm=NONE + +" Spell {{{1 +highlight SpellBad guifg=#c0c0c0 ctermfg=7 guibg=#df5f5f ctermbg=167 gui=NONE cterm=NONE +highlight SpellCap guifg=#c0c0c0 ctermfg=7 guibg=#005fdf ctermbg=26 gui=NONE cterm=NONE +highlight SpellLocal guifg=#c0c0c0 ctermfg=7 guibg=#8700af ctermbg=91 gui=NONE cterm=NONE +highlight SpellRare guifg=#c0c0c0 ctermfg=7 guibg=#00875f ctermbg=29 gui=NONE cterm=NONE + +" Quickfix {{{1 +highlight qfLineNr ctermfg=238 ctermbg=NONE cterm=NONE guifg=#444444 guibg=NONE gui=NONE +highlight qfSeparator ctermfg=243 ctermbg=NONE cterm=NONE guifg=#767676 guibg=NONE gui=NONE + +" Plugin: vim-easymotion {{{1 +highlight EasyMotionTarget guifg=#ffff5f ctermfg=227 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight EasyMotionTarget2First guifg=#df005f ctermfg=161 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight EasyMotionTarget2Second guifg=#ffff5f ctermfg=227 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Plugin: vim-rfc {{{1 +highlight RFCType guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight RFCID guifg=#ffaf5f ctermfg=215 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight RFCTitle guifg=#eeeeee ctermfg=255 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight RFCDelim guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Plugin: vim-signify {{{1 +highlight SignifySignAdd guifg=#87ff5f ctermfg=119 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold +highlight SignifySignDelete guifg=#df5f5f ctermfg=167 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold +highlight SignifySignChange guifg=#ffff5f ctermfg=227 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold + +" Plugin: vim-startify {{{1 +highlight StartifyBracket guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyFile guifg=#eeeeee ctermfg=255 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyFooter guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyHeader guifg=#87df87 ctermfg=114 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyNumber guifg=#ffaf5f ctermfg=215 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyPath guifg=#8a8a8a ctermfg=245 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySection guifg=#dfafaf ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySelect guifg=#5fdfff ctermfg=81 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySlash guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySpecial guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Neovim {{{1 + +highlight TermCursor ctermfg=NONE guibg=#ff00af ctermbg=199 gui=NONE cterm=NONE +highlight TermCursorNC ctermfg=NONE guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" HTML {{{1 + +highlight link htmlTagN htmlTagName + + +let g:colors_name = 'janah' diff --git a/.config/nvim/colors/vim-janah/janah.png b/.config/nvim/colors/vim-janah/janah.png new file mode 100755 index 0000000..566a9c4 Binary files /dev/null and b/.config/nvim/colors/vim-janah/janah.png differ diff --git a/.config/nvim/colors/vim-monokai b/.config/nvim/colors/vim-monokai deleted file mode 160000 index ae77538..0000000 --- a/.config/nvim/colors/vim-monokai +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ae7753878f8740fbdb2cef5617911ef83255349b diff --git a/.config/nvim/colors/vim-monokai/LICENSE.txt b/.config/nvim/colors/vim-monokai/LICENSE.txt new file mode 100755 index 0000000..db80871 --- /dev/null +++ b/.config/nvim/colors/vim-monokai/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2009-2016 Marcin Kulik + +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. diff --git a/.config/nvim/colors/vim-monokai/README.md b/.config/nvim/colors/vim-monokai/README.md new file mode 100755 index 0000000..2c15ac7 --- /dev/null +++ b/.config/nvim/colors/vim-monokai/README.md @@ -0,0 +1,15 @@ +# vim-monokai + +Monokai color scheme for Vim converted with [coloration](https://github.com/sickill/coloration) from Textmate theme with the same name. + +## Screenshots + +![Monokai in Vim](https://i.imgur.com/NPX2MXM.png) + + +## Installation + +Put `monokai.vim` file in your `~/.vim/colors/` directory and add the following line to your `~/.vimrc`: + + syntax enable + colorscheme monokai diff --git a/.config/nvim/colors/vim-monokai/colors/monokai.vim b/.config/nvim/colors/vim-monokai/colors/monokai.vim new file mode 100755 index 0000000..1b4f167 --- /dev/null +++ b/.config/nvim/colors/vim-monokai/colors/monokai.vim @@ -0,0 +1,109 @@ +" Vim color file +" Converted from Textmate theme Monokai using Coloration v0.3.2 (http://github.com/sickill/coloration) + +set background=dark +highlight clear + +if exists("syntax_on") + syntax reset +endif + +set t_Co=256 +let g:colors_name = "monokai" + +hi Cursor ctermfg=235 ctermbg=231 cterm=NONE guifg=#272822 guibg=#f8f8f0 gui=NONE +hi Visual ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#49483e gui=NONE +hi CursorLine ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi CursorColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi ColorColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi LineNr ctermfg=102 ctermbg=237 cterm=NONE guifg=#90908a guibg=#3c3d37 gui=NONE +hi VertSplit ctermfg=241 ctermbg=241 cterm=NONE guifg=#64645e guibg=#64645e gui=NONE +hi MatchParen ctermfg=197 ctermbg=NONE cterm=underline guifg=#f92672 guibg=NONE gui=underline +hi StatusLine ctermfg=231 ctermbg=241 cterm=bold guifg=#f8f8f2 guibg=#64645e gui=bold +hi StatusLineNC ctermfg=231 ctermbg=241 cterm=NONE guifg=#f8f8f2 guibg=#64645e gui=NONE +hi Pmenu ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi PmenuSel ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#49483e gui=NONE +hi IncSearch term=reverse cterm=reverse ctermfg=193 ctermbg=16 gui=reverse guifg=#C4BE89 guibg=#000000 +hi Search term=reverse cterm=NONE ctermfg=231 ctermbg=24 gui=NONE guifg=#f8f8f2 guibg=#204a87 +hi Directory ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Folded ctermfg=242 ctermbg=235 cterm=NONE guifg=#75715e guibg=#272822 gui=NONE +hi SignColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi Normal ctermfg=231 ctermbg=235 cterm=NONE guifg=#f8f8f2 guibg=#272822 gui=NONE +hi Boolean ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Character ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Comment ctermfg=242 ctermbg=NONE cterm=NONE guifg=#75715e guibg=NONE gui=NONE +hi Conditional ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Constant ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi Define ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi DiffAdd ctermfg=231 ctermbg=64 cterm=bold guifg=#f8f8f2 guibg=#46830c gui=bold +hi DiffDelete ctermfg=88 ctermbg=NONE cterm=NONE guifg=#8b0807 guibg=NONE gui=NONE +hi DiffChange ctermfg=NONE ctermbg=NONE cterm=NONE guifg=#f8f8f2 guibg=#243955 gui=NONE +hi DiffText ctermfg=231 ctermbg=24 cterm=bold guifg=#f8f8f2 guibg=#204a87 gui=bold +hi ErrorMsg ctermfg=231 ctermbg=197 cterm=NONE guifg=#f8f8f0 guibg=#f92672 gui=NONE +hi WarningMsg ctermfg=231 ctermbg=197 cterm=NONE guifg=#f8f8f0 guibg=#f92672 gui=NONE +hi Float ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Function ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi Identifier ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi Keyword ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Label ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi NonText ctermfg=59 ctermbg=236 cterm=NONE guifg=#49483e guibg=#31322c gui=NONE +hi Number ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Operator ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi PreProc ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Special ctermfg=231 ctermbg=NONE cterm=NONE guifg=#f8f8f2 guibg=NONE gui=NONE +hi SpecialComment ctermfg=242 ctermbg=NONE cterm=NONE guifg=#75715e guibg=NONE gui=NONE +hi SpecialKey ctermfg=59 ctermbg=237 cterm=NONE guifg=#49483e guibg=#3c3d37 gui=NONE +hi Statement ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi StorageClass ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi String ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi Tag ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Title ctermfg=231 ctermbg=NONE cterm=bold guifg=#f8f8f2 guibg=NONE gui=bold +hi Todo ctermfg=95 ctermbg=NONE cterm=inverse,bold guifg=#75715e guibg=NONE gui=inverse,bold +hi Type ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline +hi rubyClass ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyFunction ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi rubyInterpolationDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubySymbol ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi rubyConstant ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi rubyStringDelimiter ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi rubyBlockParameter ctermfg=208 ctermbg=NONE cterm=NONE guifg=#fd971f guibg=NONE gui=italic +hi rubyInstanceVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyInclude ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyGlobalVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyRegexp ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi rubyRegexpDelimiter ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi rubyEscape ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi rubyControl ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyClassVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyOperator ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyException ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyPseudoVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyRailsUserClass ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi rubyRailsARAssociationMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi rubyRailsARMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi rubyRailsRenderMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi rubyRailsMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi erubyDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi erubyComment ctermfg=95 ctermbg=NONE cterm=NONE guifg=#75715e guibg=NONE gui=NONE +hi erubyRailsMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi htmlTag ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi htmlEndTag ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi htmlTagName ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlArg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlSpecialChar ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi javaScriptFunction ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi javaScriptRailsFunction ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi javaScriptBraces ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi yamlKey ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi yamlAnchor ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi yamlAlias ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi yamlDocumentHeader ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi cssURL ctermfg=208 ctermbg=NONE cterm=NONE guifg=#fd971f guibg=NONE gui=italic +hi cssFunctionName ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi cssColor ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi cssPseudoClassId ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi cssClassName ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi cssValueLength ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi cssCommonAttr ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi cssBraces ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE diff --git a/.fzf b/.fzf deleted file mode 160000 index 3715cd3..0000000 --- a/.fzf +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3715cd349dfc791e96b8e12ba31a00809fdb048d diff --git a/.fzf/.goreleaser.yml b/.fzf/.goreleaser.yml new file mode 100644 index 0000000..bab275d --- /dev/null +++ b/.fzf/.goreleaser.yml @@ -0,0 +1,119 @@ +--- +project_name: fzf + +before: + hooks: + - go mod download + +builds: + - id: fzf-macos + binary: fzf + goos: + - darwin + goarch: + - amd64 + ldflags: + - "-s -w -X main.version={{ .Version }} -X main.revision={{ .ShortCommit }}" + hooks: + post: | + sh -c ' + cat > /tmp/fzf-gon-amd64.hcl << EOF + source = ["./dist/fzf-macos_darwin_amd64/fzf"] + bundle_id = "kr.junegunn.fzf" + apple_id { + username = "junegunn.c@gmail.com" + password = "@env:AC_PASSWORD" + } + sign { + application_identity = "Developer ID Application: Junegunn Choi (Y254DRW44Z)" + } + zip { + output_path = "./dist/fzf-{{ .Version }}-darwin_amd64.zip" + } + EOF + gon /tmp/fzf-gon-amd64.hcl + ' + + - id: fzf-macos-arm + binary: fzf + goos: + - darwin + goarch: + - arm64 + ldflags: + - "-s -w -X main.version={{ .Version }} -X main.revision={{ .ShortCommit }}" + hooks: + post: | + sh -c ' + cat > /tmp/fzf-gon-arm64.hcl << EOF + source = ["./dist/fzf-macos-arm_darwin_arm64/fzf"] + bundle_id = "kr.junegunn.fzf" + apple_id { + username = "junegunn.c@gmail.com" + password = "@env:AC_PASSWORD" + } + sign { + application_identity = "Developer ID Application: Junegunn Choi (Y254DRW44Z)" + } + zip { + output_path = "./dist/fzf-{{ .Version }}-darwin_arm64.zip" + } + EOF + gon /tmp/fzf-gon-arm64.hcl + ' + + - id: fzf + goos: + - linux + - windows + - freebsd + - openbsd + goarch: + - amd64 + - arm + - arm64 + goarm: + - 5 + - 6 + - 7 + ldflags: + - "-s -w -X main.version={{ .Version }} -X main.revision={{ .ShortCommit }}" + ignore: + - goos: freebsd + goarch: arm + - goos: openbsd + goarch: arm + - goos: freebsd + goarch: arm64 + - goos: openbsd + goarch: arm64 + +archives: + - name_template: "{{ .ProjectName }}-{{ .Version }}-{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" + builds: + - fzf + format: tar.gz + format_overrides: + - goos: windows + format: zip + files: + - non-existent* + +release: + github: + owner: junegunn + name: fzf + prerelease: auto + name_template: '{{ .Tag }}' + extra_files: + - glob: ./dist/fzf-*darwin*.zip + +snapshot: + name_template: "{{ .Tag }}-devel" + +changelog: + sort: asc + filters: + exclude: + - README + - test diff --git a/.fzf/.rubocop.yml b/.fzf/.rubocop.yml new file mode 100644 index 0000000..c131deb --- /dev/null +++ b/.fzf/.rubocop.yml @@ -0,0 +1,28 @@ +Layout/LineLength: + Enabled: false +Metrics: + Enabled: false +Lint/ShadowingOuterLocalVariable: + Enabled: false +Style/MethodCallWithArgsParentheses: + Enabled: true + IgnoredMethods: + - assert + - exit + - paste + - puts + - raise + - refute + - require + - send_keys + IgnoredPatterns: + - ^assert_ + - ^refute_ +Style/NumericPredicate: + Enabled: false +Style/StringConcatenation: + Enabled: false +Style/OptionalBooleanParameter: + Enabled: false +Style/WordArray: + MinSize: 1 diff --git a/.fzf/ADVANCED.md b/.fzf/ADVANCED.md new file mode 100644 index 0000000..f00be0c --- /dev/null +++ b/.fzf/ADVANCED.md @@ -0,0 +1,565 @@ +Advanced fzf examples +====================== + +*(Last update: 2021/05/22)* + + + +* [Introduction](#introduction) +* [Screen Layout](#screen-layout) + * [`--height`](#--height) + * [`fzf-tmux`](#fzf-tmux) + * [Popup window support](#popup-window-support) +* [Dynamic reloading of the list](#dynamic-reloading-of-the-list) + * [Updating the list of processes by pressing CTRL-R](#updating-the-list-of-processes-by-pressing-ctrl-r) + * [Toggling between data sources](#toggling-between-data-sources) +* [Ripgrep integration](#ripgrep-integration) + * [Using fzf as the secondary filter](#using-fzf-as-the-secondary-filter) + * [Using fzf as interative Ripgrep launcher](#using-fzf-as-interative-ripgrep-launcher) + * [Switching to fzf-only search mode](#switching-to-fzf-only-search-mode) +* [Log tailing](#log-tailing) +* [Key bindings for git objects](#key-bindings-for-git-objects) + * [Files listed in `git status`](#files-listed-in-git-status) + * [Branches](#branches) + * [Commit hashes](#commit-hashes) +* [Color themes](#color-themes) + * [Generating fzf color theme from Vim color schemes](#generating-fzf-color-theme-from-vim-color-schemes) + + + +Introduction +------------ + +fzf is an interactive [Unix filter][filter] program that is designed to be +used with other Unix tools. It reads a list of items from the standard input, +allows you to select a subset of the items, and prints the selected ones to +the standard output. You can think of it as an interactive version of *grep*, +and it's already useful even if you don't know any of its options. + +```sh +# 1. ps: Feed the list of processes to fzf +# 2. fzf: Interactively select a process using fuzzy matching algorithm +# 3. awk: Take the PID from the selected line +# 3. kill: Kill the process with the PID +ps -ef | fzf | awk '{print $2}' | xargs kill -9 +``` + +[filter]: https://en.wikipedia.org/wiki/Filter_(software) + +While the above example succinctly summarizes the fundamental concept of fzf, +you can build much more sophisticated interactive workflows using fzf once you +learn its wide variety of features. + +- To see the full list of options and features, see `man fzf` +- To see the latest additions, see [CHANGELOG.md](CHANGELOG.md) + +This document will guide you through some examples that will familiarize you +with the advanced features of fzf. + +Screen Layout +------------- + +### `--height` + +fzf by default opens in fullscreen mode, but it's not always desirable. +Oftentimes, you want to see the current context of the terminal while using +fzf. `--height` is an option for opening fzf below the cursor in +non-fullscreen mode so you can still see the previous commands and their +results above it. + +```sh +fzf --height=40% +``` + +![image](https://user-images.githubusercontent.com/700826/113379893-c184c680-93b5-11eb-9676-c7c0a2f01748.png) + +You might also want to experiment with other layout options such as +`--layout=reverse`, `--info=inline`, `--border`, `--margin`, etc. + +```sh +fzf --height=40% --layout=reverse +fzf --height=40% --layout=reverse --info=inline +fzf --height=40% --layout=reverse --info=inline --border +fzf --height=40% --layout=reverse --info=inline --border --margin=1 +fzf --height=40% --layout=reverse --info=inline --border --margin=1 --padding=1 +``` + +![image](https://user-images.githubusercontent.com/700826/113379932-dfeac200-93b5-11eb-9e28-df1a2ee71f90.png) + +*(See `Layout` section of the man page to see the full list of options)* + +But you definitely don't want to repeat `--height=40% --layout=reverse +--info=inline --border --margin=1 --padding=1` every time you use fzf. You +could write a wrapper script or shell alias, but there is an easier option. +Define `$FZF_DEFAULT_OPTS` like so: + +```sh +export FZF_DEFAULT_OPTS="--height=40% --layout=reverse --info=inline --border --margin=1 --padding=1" +``` + +### `fzf-tmux` + +Before fzf had `--height` option, we would open fzf in a tmux split pane not +to take up the whole screen. This is done using `fzf-tmux` script. + +```sh +# Open fzf on a tmux split pane below the current pane. +# Takes the same set of options. +fzf-tmux --layout=reverse +``` + +![image](https://user-images.githubusercontent.com/700826/113379973-f1cc6500-93b5-11eb-8860-c9bc4498aadf.png) + +The limitation of `fzf-tmux` is that it only works when you're on tmux unlike +`--height` option. But the advantage of it is that it's more flexible. +(See `man fzf-tmux` for available options.) + +```sh +# On the right (50%) +fzf-tmux -r + +# On the left (30%) +fzf-tmux -l30% + +# Above the cursor +fzf-tmux -u30% +``` + +![image](https://user-images.githubusercontent.com/700826/113379983-fa24a000-93b5-11eb-93eb-8a3d39b2f163.png) + +![image](https://user-images.githubusercontent.com/700826/113380001-0577cb80-93b6-11eb-95d0-2ba453866882.png) + +![image](https://user-images.githubusercontent.com/700826/113380040-1d4f4f80-93b6-11eb-9bef-737fb120aafe.png) + +#### Popup window support + +But here's the really cool part; tmux 3.2 added support for popup windows. So +you can open fzf in a popup window, which is quite useful if you frequently +use split panes. + +```sh +# Open tmux in a tmux popup window (default size: 50% of the screen) +fzf-tmux -p + +# 80% width, 60% height +fzf-tmux -p 80%,60% +``` + +![image](https://user-images.githubusercontent.com/700826/113380106-4a9bfd80-93b6-11eb-8cee-aeb1c4ce1a1f.png) + +> You might also want to check out my tmux plugins which support this popup +> window layout. +> +> - https://github.com/junegunn/tmux-fzf-url +> - https://github.com/junegunn/tmux-fzf-maccy + +Dynamic reloading of the list +----------------------------- + +fzf can dynamically update the candidate list using an arbitrary program with +`reload` bindings (The design document for `reload` can be found +[here][reload]). + +[reload]: https://github.com/junegunn/fzf/issues/1750 + +### Updating the list of processes by pressing CTRL-R + +This example shows how you can set up a binding for dynamically updating the +list without restarting fzf. + +```sh +(date; ps -ef) | + fzf --bind='ctrl-r:reload(date; ps -ef)' \ + --header=$'Press CTRL-R to reload\n\n' --header-lines=2 \ + --preview='echo {}' --preview-window=down,3,wrap \ + --layout=reverse --height=80% | awk '{print $2}' | xargs kill -9 +``` + +![image](https://user-images.githubusercontent.com/700826/113465047-200c7c00-946c-11eb-918c-268f37a900c8.png) + +- The initial command is `(date; ps -ef)`. It prints the current date and + time, and the list of the processes. +- With `--header` option, you can show any message as the fixed header. +- To disallow selecting the first two lines (`date` and `ps` header), we use + `--header-lines=2` option. +- `--bind='ctrl-r:reload(date; ps -ef)'` binds CTRL-R to `reload` action that + runs `date; ps -ef`, so we can update the list of the processes by pressing + CTRL-R. +- We use simple `echo {}` preview option, so we can see the entire line on the + preview window below even if it's too long + +### Toggling between data sources + +You're not limited to just one reload binding. Set up multiple bindings so +you can switch between data sources. + +```sh +find * | fzf --prompt 'All> ' \ + --header 'CTRL-D: Directories / CTRL-F: Files' \ + --bind 'ctrl-d:change-prompt(Directories> )+reload(find * -type d)' \ + --bind 'ctrl-f:change-prompt(Files> )+reload(find * -type f)' +``` + +![image](https://user-images.githubusercontent.com/700826/113465073-4af6d000-946c-11eb-858f-2372c0955f67.png) + +![image](https://user-images.githubusercontent.com/700826/113465072-46321c00-946c-11eb-9b6f-cda3951df579.png) + +Ripgrep integration +------------------- + +### Using fzf as the secondary filter + +* Requires [bat][bat] +* Requires [Ripgrep][rg] + +[bat]: https://github.com/sharkdp/bat +[rg]: https://github.com/BurntSushi/ripgrep + +fzf is pretty fast for filtering a list that you will rarely have to think +about its performance. But it is not the right tool for searching for text +inside many large files, and in that case you should definitely use something +like [Ripgrep][rg]. + +In the next example, Ripgrep is the primary filter that searches for the given +text in files, and fzf is used as the secondary fuzzy filter that adds +interactivity to the workflow. And we use [bat][bat] to show the matching line in +the preview window. + +This is a bash script and it will not run as expected on other non-compliant +shells. To avoid the compatibility issue, let's save this snippet as a script +file called `rfv`. + +```bash +#!/usr/bin/env bash + +# 1. Search for text in files using Ripgrep +# 2. Interactively narrow down the list using fzf +# 3. Open the file in Vim +IFS=: read -ra selected < <( + rg --color=always --line-number --no-heading --smart-case "${*:-}" | + fzf --ansi \ + --color "hl:-1:underline,hl+:-1:underline:reverse" \ + --delimiter : \ + --preview 'bat --color=always {1} --highlight-line {2}' \ + --preview-window 'up,60%,border-bottom,+{2}+3/3,~3' +) +[ -n "${selected[0]}" ] && vim "${selected[0]}" "+${selected[1]}" +``` + +And run it with an initial query string. + +```sh +# Make the script executable +chmod +x rfv + +# Run it with the initial query "algo" +./rfv algo +``` + +> Ripgrep will perform the initial search and list all the lines that contain +`algo`. Then we further narrow down the list on fzf. + +![image](https://user-images.githubusercontent.com/700826/113683873-a42a6200-96ff-11eb-9666-26ce4091b0e4.png) + +I know it's a lot to digest, let's try to break down the code. + +- Ripgrep prints the matching lines in the following format + ``` + man/man1/fzf.1:54:.BI "--algo=" TYPE + man/man1/fzf.1:55:Fuzzy matching algorithm (default: v2) + man/man1/fzf.1:58:.BR v2 " Optimal scoring algorithm (quality)" + src/pattern_test.go:7: "github.com/junegunn/fzf/src/algo" + ``` + The first token delimited by `:` is the file path, and the second token is + the line number of the matching line. They respectively correspond to `{1}` + and `{2}` in the preview command. + - `--preview 'bat --color=always {1} --highlight-line {2}'` +- As we run `rg` with `--color=always` option, we should tell fzf to parse + ANSI color codes in the input by setting `--ansi`. +- We customize how fzf colors various text elements using `--color` option. + `-1` tells fzf to keep the original color from the input. See `man fzf` for + available color options. +- The value of `--preview-window` option consists of 5 components delimited + by `,` + 1. `up` — Position of the preview window + 1. `60%` — Size of the preview window + 1. `border-bottom` — Preview window border only on the bottom side + 1. `+{2}+3/3` — Scroll offset of the preview contents + 1. `~3` — Fixed header +- Let's break down the latter two. We want to display the bat output in the + preview window with a certain scroll offset so that the matching line is + positioned near the center of the preview window. + - `+{2}` — The base offset is extracted from the second token + - `+3` — We add 3 lines to the base offset to compensate for the header + part of `bat` output + - ``` + ───────┬────────────────────────────────────────────────────────── + │ File: CHANGELOG.md + ───────┼────────────────────────────────────────────────────────── + 1 │ CHANGELOG + 2 │ ========= + 3 │ + 4 │ 0.26.0 + 5 │ ------ + ``` + - `/3` adjusts the offset so that the matching line is shown at a third + position in the window + - `~3` makes the top three lines fixed header so that they are always + visible regardless of the scroll offset +- Once we selected a line, we open the file with `vim` (`vim + "${selected[0]}"`) and move the cursor to the line (`+${selected[1]}`). + +### Using fzf as interative Ripgrep launcher + +We have learned that we can bind `reload` action to a key (e.g. +`--bind=ctrl-r:execute(ps -ef)`). In the next example, we are going to **bind +`reload` action to `change` event** so that whenever the user *changes* the +query string on fzf, `reload` action is triggered. + +Here is a variation of the above `rfv` script. fzf will restart Ripgrep every +time the user updates the query string on fzf. Searching and filtering is +completely done by Ripgrep, and fzf merely provides the interactive interface. +So we lose the "fuzziness", but the performance will be better on larger +projects, and it will free up memory as you narrow down the results. + +```bash +#!/usr/bin/env bash + +# 1. Search for text in files using Ripgrep +# 2. Interactively restart Ripgrep with reload action +# 3. Open the file in Vim +RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " +INITIAL_QUERY="${*:-}" +IFS=: read -ra selected < <( + FZF_DEFAULT_COMMAND="$RG_PREFIX $(printf %q "$INITIAL_QUERY")" \ + fzf --ansi \ + --disabled --query "$INITIAL_QUERY" \ + --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ + --delimiter : \ + --preview 'bat --color=always {1} --highlight-line {2}' \ + --preview-window 'up,60%,border-bottom,+{2}+3/3,~3' +) +[ -n "${selected[0]}" ] && vim "${selected[0]}" "+${selected[1]}" +``` + +![image](https://user-images.githubusercontent.com/700826/113684212-f9ff0a00-96ff-11eb-8737-7bb571d320cc.png) + +- Instead of starting fzf in `rg ... | fzf` form, we start fzf without an + explicit input, but with a custom `FZF_DEFAULT_COMMAND` variable. This way + fzf can kill the initial Ripgrep process it starts with the initial query. + Otherwise, the initial Ripgrep process will keep consuming system resources + even after `reload` is triggered. +- Filtering is no longer a responsibility of fzf; hence `--disabled` +- `{q}` in the reload command evaluates to the query string on fzf prompt. +- `sleep 0.1` in the reload command is for "debouncing". This small delay will + reduce the number of intermediate Ripgrep processes while we're typing in + a query. + +### Switching to fzf-only search mode + +*(Requires fzf 0.27.1 or above)* + +In the previous example, we lost fuzzy matching capability as we completely +delegated search functionality to Ripgrep. But we can dynamically switch to +fzf-only search mode by *"unbinding"* `reload` action from `change` event. + +```sh +#!/usr/bin/env bash + +# Two-phase filtering with Ripgrep and fzf +# +# 1. Search for text in files using Ripgrep +# 2. Interactively restart Ripgrep with reload action +# * Press alt-enter to switch to fzf-only filtering +# 3. Open the file in Vim +RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " +INITIAL_QUERY="${*:-}" +IFS=: read -ra selected < <( + FZF_DEFAULT_COMMAND="$RG_PREFIX $(printf %q "$INITIAL_QUERY")" \ + fzf --ansi \ + --color "hl:-1:underline,hl+:-1:underline:reverse" \ + --disabled --query "$INITIAL_QUERY" \ + --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ + --bind "alt-enter:unbind(change,alt-enter)+change-prompt(2. fzf> )+enable-search+clear-query" \ + --prompt '1. ripgrep> ' \ + --delimiter : \ + --preview 'bat --color=always {1} --highlight-line {2}' \ + --preview-window 'up,60%,border-bottom,+{2}+3/3,~3' +) +[ -n "${selected[0]}" ] && vim "${selected[0]}" "+${selected[1]}" +``` + +* Phase 1. Filtering with Ripgrep +![image](https://user-images.githubusercontent.com/700826/119213880-735e8a80-bafd-11eb-8493-123e4be24fbc.png) +* Phase 2. Filtering with fzf +![image](https://user-images.githubusercontent.com/700826/119213887-7e191f80-bafd-11eb-98c9-71a1af9d7aab.png) + +- We added `--prompt` option to show that fzf is initially running in "Ripgrep + launcher mode". +- We added `alt-enter` binding that + 1. unbinds `change` event, so Ripgrep is no longer restarted on key press + 2. changes the prompt to `2. fzf>` + 3. enables search functionality of fzf + 4. clears the current query string that was used to start Ripgrep process + 5. and unbinds `alt-enter` itself as this is a one-off event +- We reverted `--color` option for customizing how the matching chunks are + displayed in the second phase + +Log tailing +----------- + +fzf can run long-running preview commands and render partial results before +completion. And when you specify `follow` flag in `--preview-window` option, +fzf will "`tail -f`" the result, automatically scrolling to the bottom. + +```bash +# With "follow", preview window will automatically scroll to the bottom. +# "\033[2J" is an ANSI escape sequence for clearing the screen. +# When fzf reads this code it clears the previous preview contents. +fzf --preview-window follow --preview 'for i in $(seq 100000); do + echo "$i" + sleep 0.01 + (( i % 300 == 0 )) && printf "\033[2J" +done' +``` + +![image](https://user-images.githubusercontent.com/700826/113473303-dd669600-94a3-11eb-88a9-1f61b996bb0e.png) + +Admittedly, that was a silly example. Here's a practical one for browsing +Kubernetes pods. + +```bash +#!/usr/bin/env bash + +read -ra tokens < <( + kubectl get pods --all-namespaces | + fzf --info=inline --layout=reverse --header-lines=1 --border \ + --prompt "$(kubectl config current-context | sed 's/-context$//')> " \ + --header $'Press CTRL-O to open log in editor\n\n' \ + --bind ctrl-/:toggle-preview \ + --bind 'ctrl-o:execute:${EDITOR:-vim} <(kubectl logs --namespace {1} {2}) > /dev/tty' \ + --preview-window up,follow \ + --preview 'kubectl logs --follow --tail=100000 --namespace {1} {2}' "$@" +) +[ ${#tokens} -gt 1 ] && + kubectl exec -it --namespace "${tokens[0]}" "${tokens[1]}" -- bash +``` + +![image](https://user-images.githubusercontent.com/700826/113473547-1d7a4880-94a5-11eb-98ef-9aa6f0ed215a.png) + +- The preview window will *"log tail"* the pod + - Holding on to a large amount of log will consume a lot of memory. So we + limited the initial log amount with `--tail=100000`. +- With `execute` binding, you can press CTRL-O to open the log in your editor + without leaving fzf +- Select a pod (with an enter key) to `kubectl exec` into it + +Key bindings for git objects +---------------------------- + +I have [blogged](https://junegunn.kr/2016/07/fzf-git) about my fzf+git key +bindings a few years ago. I'm going to show them here again, because they are +seriously useful. + +### Files listed in `git status` + +CTRL-GCTRL-F + +![image](https://user-images.githubusercontent.com/700826/113473779-a9d93b00-94a6-11eb-87b5-f62a8d0a0efc.png) + +### Branches + +CTRL-GCTRL-B + +![image](https://user-images.githubusercontent.com/700826/113473758-87dfb880-94a6-11eb-82f4-9218103f10bd.png) + +### Commit hashes + +CTRL-GCTRL-H + +![image](https://user-images.githubusercontent.com/700826/113473765-91692080-94a6-11eb-8d38-ed4d41f27ac1.png) + + +The full source code can be found [here](https://gist.github.com/junegunn/8b572b8d4b5eddd8b85e5f4d40f17236). + +Color themes +------------ + +You can customize how fzf colors the text elements with `--color` option. Here +are a few color themes. Note that you need a terminal emulator that can +display 24-bit colors. + +```sh +# junegunn/seoul256.vim (dark) +export FZF_DEFAULT_OPTS='--color=bg+:#3F3F3F,bg:#4B4B4B,border:#6B6B6B,spinner:#98BC99,hl:#719872,fg:#D9D9D9,header:#719872,info:#BDBB72,pointer:#E12672,marker:#E17899,fg+:#D9D9D9,preview-bg:#3F3F3F,prompt:#98BEDE,hl+:#98BC99' +``` + +![seoul256](https://user-images.githubusercontent.com/700826/113475011-2c192d80-94ae-11eb-9d17-1e5867bae01f.png) + +```sh +# junegunn/seoul256.vim (light) +export FZF_DEFAULT_OPTS='--color=bg+:#D9D9D9,bg:#E1E1E1,border:#C8C8C8,spinner:#719899,hl:#719872,fg:#616161,header:#719872,info:#727100,pointer:#E12672,marker:#E17899,fg+:#616161,preview-bg:#D9D9D9,prompt:#0099BD,hl+:#719899' +``` + +![seoul256-light](https://user-images.githubusercontent.com/700826/113475022-389d8600-94ae-11eb-905f-0939dd535837.png) + +```sh +# morhetz/gruvbox +export FZF_DEFAULT_OPTS='--color=bg+:#3c3836,bg:#32302f,spinner:#fb4934,hl:#928374,fg:#ebdbb2,header:#928374,info:#8ec07c,pointer:#fb4934,marker:#fb4934,fg+:#ebdbb2,prompt:#fb4934,hl+:#fb4934' +``` + +![gruvbox](https://user-images.githubusercontent.com/700826/113475042-494dfc00-94ae-11eb-9322-cd03a027305a.png) + +```sh +# arcticicestudio/nord-vim +export FZF_DEFAULT_OPTS='--color=bg+:#3B4252,bg:#2E3440,spinner:#81A1C1,hl:#616E88,fg:#D8DEE9,header:#616E88,info:#81A1C1,pointer:#81A1C1,marker:#81A1C1,fg+:#D8DEE9,prompt:#81A1C1,hl+:#81A1C1' +``` + +![nord](https://user-images.githubusercontent.com/700826/113475063-67b3f780-94ae-11eb-9b24-5f0d22b63399.png) + +```sh +# tomasr/molokai +export FZF_DEFAULT_OPTS='--color=bg+:#293739,bg:#1B1D1E,border:#808080,spinner:#E6DB74,hl:#7E8E91,fg:#F8F8F2,header:#7E8E91,info:#A6E22E,pointer:#A6E22E,marker:#F92672,fg+:#F8F8F2,prompt:#F92672,hl+:#F92672' +``` + +![molokai](https://user-images.githubusercontent.com/700826/113475085-8619f300-94ae-11eb-85e4-2766fc3246bf.png) + +### Generating fzf color theme from Vim color schemes + +The Vim plugin of fzf can generate `--color` option from the current color +scheme according to `g:fzf_colors` variable. You can find the detailed +explanation [here](https://github.com/junegunn/fzf/blob/master/README-VIM.md#explanation-of-gfzf_colors). + +Here is an example. Add this to your Vim configuration file. + +```vim +let g:fzf_colors = +\ { 'fg': ['fg', 'Normal'], + \ 'bg': ['bg', 'Normal'], + \ 'preview-bg': ['bg', 'NormalFloat'], + \ 'hl': ['fg', 'Comment'], + \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], + \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], + \ 'hl+': ['fg', 'Statement'], + \ 'info': ['fg', 'PreProc'], + \ 'border': ['fg', 'Ignore'], + \ 'prompt': ['fg', 'Conditional'], + \ 'pointer': ['fg', 'Exception'], + \ 'marker': ['fg', 'Keyword'], + \ 'spinner': ['fg', 'Label'], + \ 'header': ['fg', 'Comment'] } +``` + +Then you can see how the `--color` option is generated by printing the result +of `fzf#wrap()`. + +```vim +:echo fzf#wrap() +``` + +Use this command to append `export FZF_DEFAULT_OPTS="..."` line to the end of +the current file. + +```vim +:call append('$', printf('export FZF_DEFAULT_OPTS="%s"', matchstr(fzf#wrap().options, "--color[^']*"))) +``` diff --git a/.fzf/BUILD.md b/.fzf/BUILD.md new file mode 100644 index 0000000..8c318f4 --- /dev/null +++ b/.fzf/BUILD.md @@ -0,0 +1,49 @@ +Building fzf +============ + +Build instructions +------------------ + +### Prerequisites + +- Go 1.13 or above + +### Using Makefile + +```sh +# Build fzf binary for your platform in target +make + +# Build fzf binary and copy it to bin directory +make install + +# Build fzf binaries and archives for all platforms using goreleaser +make build + +# Publish GitHub release +make release +``` + +> :warning: Makefile uses git commands to determine the version and the +> revision information for `fzf --version`. So if you're building fzf from an +> environment where its git information is not available, you have to manually +> set `$FZF_VERSION` and `$FZF_REVISION`. +> +> e.g. `FZF_VERSION=0.24.0 FZF_REVISION=tarball make` + +Third-party libraries used +-------------------------- + +- [mattn/go-runewidth](https://github.com/mattn/go-runewidth) + - Licensed under [MIT](http://mattn.mit-license.org) +- [mattn/go-shellwords](https://github.com/mattn/go-shellwords) + - Licensed under [MIT](http://mattn.mit-license.org) +- [mattn/go-isatty](https://github.com/mattn/go-isatty) + - Licensed under [MIT](http://mattn.mit-license.org) +- [tcell](https://github.com/gdamore/tcell) + - Licensed under [Apache License 2.0](https://github.com/gdamore/tcell/blob/master/LICENSE) + +License +------- + +[MIT](LICENSE) diff --git a/.fzf/CHANGELOG.md b/.fzf/CHANGELOG.md new file mode 100644 index 0000000..2b2d20c --- /dev/null +++ b/.fzf/CHANGELOG.md @@ -0,0 +1,1193 @@ +CHANGELOG +========= + +0.28.0 +------ +- Added `--header-first` option to print header before the prompt line + ```sh + fzf --header $'Welcome to fzf\n▔▔▔▔▔▔▔▔▔▔▔▔▔▔' --reverse --height 30% --border --header-first + ``` +- Added `--scroll-off=LINES` option (similar to `scrolloff` option of Vim) + - You can set it to a very large number so that the cursor stays in the + middle of the screen while scrolling + ```sh + fzf --scroll-off=5 + fzf --scroll-off=999 + ``` +- Fixed bug where preview window is not updated on `reload` (#2644) +- fzf on Windows will also use `$SHELL` to execute external programs + - See #2638 and #2647 + - Thanks to @rashil2000, @vovcacik, and @janlazo + +0.27.3 +------ +- Preview window is `hidden` by default when there are `preview` bindings but + `--preview` command is not given +- Fixed bug where `{n}` is not properly reset on `reload` +- Fixed bug where spinner is not displayed on `reload` +- Enhancements in tcell renderer for Windows (#2616) +- Vim plugin + - `sinklist` is added as a synonym to `sink*` so that it's easier to add + a function to a spec dictionary + ```vim + let spec = { 'source': 'ls', 'options': ['--multi', '--preview', 'cat {}'] } + function spec.sinklist(matches) + echom string(a:matches) + endfunction + + call fzf#run(fzf#wrap(spec)) + ``` + - Vim 7 compatibility + +0.27.2 +------ +- 16 base ANSI colors can be specified by their names + ```sh + fzf --color fg:3,fg+:11 + fzf --color fg:yellow,fg+:bright-yellow + ``` +- Fix bug where `--read0` not properly displaying long lines + +0.27.1 +------ +- Added `unbind` action. In the following Ripgrep launcher example, you can + use `unbind(reload)` to switch to fzf-only filtering mode. + - See https://github.com/junegunn/fzf/blob/master/ADVANCED.md#switching-to-fzf-only-search-mode +- Vim plugin + - Vim plugin will stop immediately even when the source command hasn't finished + ```vim + " fzf will read the stream file while allowing other processes to append to it + call fzf#run({'source': 'cat /dev/null > /tmp/stream; tail -f /tmp/stream'}) + ``` + - It is now possible to open popup window relative to the current window + ```vim + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true, 'yoffset': 1.0 } } + ``` + +0.27.0 +------ +- More border options for `--preview-window` + ```sh + fzf --preview 'cat {}' --preview-window border-left + fzf --preview 'cat {}' --preview-window border-left --border horizontal + fzf --preview 'cat {}' --preview-window top:border-bottom + fzf --preview 'cat {}' --preview-window top:border-horizontal + ``` +- Automatically set `/dev/tty` as STDIN on execute action + ```sh + # Redirect /dev/tty to suppress "Vim: Warning: Input is not from a terminal" + # ls | fzf --bind "enter:execute(vim {} < /dev/tty)" + + # "< /dev/tty" part is no longer needed + ls | fzf --bind "enter:execute(vim {})" + ``` +- Bug fixes and improvements +- Signed and notarized macOS binaries + (Huge thanks to [BACKERS.md](https://github.com/junegunn/junegunn/blob/main/BACKERS.md)!) + +0.26.0 +------ +- Added support for fixed header in preview window + ```sh + # Display top 3 lines as the fixed header + fzf --preview 'bat --style=header,grid --color=always {}' --preview-window '~3' + ``` +- More advanced preview offset expression to better support the fixed header + ```sh + # Preview with bat, matching line in the middle of the window below + # the fixed header of the top 3 lines + # + # ~3 Top 3 lines as the fixed header + # +{2} Base scroll offset extracted from the second field + # +3 Extra offset to compensate for the 3-line header + # /2 Put in the middle of the preview area + # + git grep --line-number '' | + fzf --delimiter : \ + --preview 'bat --style=full --color=always --highlight-line {2} {1}' \ + --preview-window '~3:+{2}+3/2' + ``` +- Added `select` and `deselect` action for unconditionally selecting or + deselecting a single item in `--multi` mode. Complements `toggle` action. +- Significant performance improvement in ANSI code processing +- Bug fixes and improvements +- Built with Go 1.16 + +0.25.1 +------ +- Added `close` action + - Close preview window if open, abort fzf otherwise +- Bug fixes and improvements + +0.25.0 +------ +- Text attributes set in `--color` are not reset when fzf sees another + `--color` option for the same element. This allows you to put custom text + attributes in your `$FZF_DEFAULT_OPTS` and still have those attributes + even when you override the colors. + + ```sh + # Default colors and attributes + fzf + + # Apply custom text attributes + export FZF_DEFAULT_OPTS='--color fg+:italic,hl:-1:underline,hl+:-1:reverse:underline' + + fzf + + # Different colors but you still have the attributes + fzf --color hl:176,hl+:177 + + # Write "regular" if you want to clear the attributes + fzf --color hl:176:regular,hl+:177:regular + ``` +- Renamed `--phony` to `--disabled` +- You can dynamically enable and disable the search functionality using the + new `enable-search`, `disable-search`, and `toggle-search` actions +- You can assign a different color to the query string for when search is disabled + ```sh + fzf --color query:#ffffff,disabled:#999999 --bind space:toggle-search + ``` +- Added `last` action to move the cursor to the last match + - The opposite action `top` is renamed to `first`, but `top` is still + recognized as a synonym for backward compatibility +- Added `preview-top` and `preview-bottom` actions +- Extended support for alt key chords: alt with any case-sensitive single character + ```sh + fzf --bind alt-,:first,alt-.:last + ``` + +0.24.4 +------ +- Added `--preview-window` option `follow` + ```sh + # Preview window will automatically scroll to the bottom + fzf --preview-window follow --preview 'for i in $(seq 100000); do + echo "$i" + sleep 0.01 + (( i % 300 == 0 )) && printf "\033[2J" + done' + ``` +- Added `change-prompt` action + ```sh + fzf --prompt 'foo> ' --bind $'a:change-prompt:\x1b[31mbar> ' + ``` +- Bug fixes and improvements + +0.24.3 +------ +- Added `--padding` option + ```sh + fzf --margin 5% --padding 5% --border --preview 'cat {}' \ + --color bg:#222222,preview-bg:#333333 + ``` + +0.24.2 +------ +- Bug fixes and improvements + +0.24.1 +------ +- Fixed broken `--color=[bw|no]` option + +0.24.0 +------ +- Real-time rendering of preview window + ```sh + # fzf can render preview window before the command completes + fzf --preview 'sleep 1; for i in $(seq 100); do echo $i; sleep 0.01; done' + + # Preview window can process ANSI escape sequence (CSI 2 J) for clearing the display + fzf --preview 'for i in $(seq 100000); do + (( i % 200 == 0 )) && printf "\033[2J" + echo "$i" + sleep 0.01 + done' + ``` +- Updated `--color` option to support text styles + - `regular` / `bold` / `dim` / `underline` / `italic` / `reverse` / `blink` + ```sh + # * Set -1 to keep the original color + # * Multiple style attributes can be combined + # * Italic style may not be supported by some terminals + rg --line-number --no-heading --color=always "" | + fzf --ansi --prompt "Rg: " \ + --color fg+:italic,hl:underline:-1,hl+:italic:underline:reverse:-1 \ + --color pointer:reverse,prompt:reverse,input:159 \ + --pointer ' ' + ``` +- More `--border` options + - `vertical`, `top`, `bottom`, `left`, `right` + - Updated Vim plugin to use these new `--border` options + ```vim + " Floating popup window in the center of the screen + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } + + " Popup with 100% width + let g:fzf_layout = { 'window': { 'width': 1.0, 'height': 0.5, 'border': 'horizontal' } } + + " Popup with 100% height + let g:fzf_layout = { 'window': { 'width': 0.5, 'height': 1.0, 'border': 'vertical' } } + + " Similar to 'down' layout, but it uses a popup window and doesn't affect the window layout + let g:fzf_layout = { 'window': { 'width': 1.0, 'height': 0.5, 'yoffset': 1.0, 'border': 'top' } } + + " Opens on the right; + " 'highlight' option is still supported but it will only take the foreground color of the group + let g:fzf_layout = { 'window': { 'width': 0.5, 'height': 1.0, 'xoffset': 1.0, 'border': 'left', 'highlight': 'Comment' } } + ``` +- To indicate if `--multi` mode is enabled, fzf will print the number of + selected items even when no item is selected + ```sh + seq 100 | fzf + # 100/100 + seq 100 | fzf --multi + # 100/100 (0) + seq 100 | fzf --multi 5 + # 100/100 (0/5) + ``` +- Since 0.24.0, release binaries will be uploaded to https://github.com/junegunn/fzf/releases + +0.23.1 +------ +- Added `--preview-window` options for disabling flags + - `nocycle` + - `nohidden` + - `nowrap` + - `default` +- Built with Go 1.14.9 due to performance regression + - https://github.com/golang/go/issues/40727 + +0.23.0 +------ +- Support preview scroll offset relative to window height + ```sh + git grep --line-number '' | + fzf --delimiter : \ + --preview 'bat --style=numbers --color=always --highlight-line {2} {1}' \ + --preview-window +{2}-/2 + ``` +- Added `--preview-window` option for sharp edges (`--preview-window sharp`) +- Added `--preview-window` option for cyclic scrolling (`--preview-window cycle`) +- Reduced vertical padding around the preview window when `--preview-window + noborder` is used +- Added actions for preview window + - `preview-half-page-up` + - `preview-half-page-down` +- Vim + - Popup width and height can be given in absolute integer values + - Added `fzf#exec()` function for getting the path of fzf executable + - It also downloads the latest binary if it's not available by running + `./install --bin` +- Built with Go 1.15.2 + - We no longer provide 32-bit binaries + +0.22.0 +------ +- Added more options for `--bind` + - `backward-eof` event + ```sh + # Aborts when you delete backward when the query prompt is already empty + fzf --bind backward-eof:abort + ``` + - `refresh-preview` action + ```sh + # Rerun preview command when you hit '?' + fzf --preview 'echo $RANDOM' --bind '?:refresh-preview' + ``` + - `preview` action + ```sh + # Default preview command with an extra preview binding + fzf --preview 'file {}' --bind '?:preview:cat {}' + + # A preview binding with no default preview command + # (Preview window is initially empty) + fzf --bind '?:preview:cat {}' + + # Preview window hidden by default, it appears when you first hit '?' + fzf --bind '?:preview:cat {}' --preview-window hidden + ``` +- Added preview window option for setting the initial scroll offset + ```sh + # Initial scroll offset is set to the line number of each line of + # git grep output *minus* 5 lines + git grep --line-number '' | + fzf --delimiter : --preview 'nl {1}' --preview-window +{2}-5 + ``` +- Added support for ANSI colors in `--prompt` string +- Smart match of accented characters + - An unaccented character in the query string will match both accented and + unaccented characters, while an accented character will only match + accented characters. This is similar to how "smart-case" match works. +- Vim plugin + - `tmux` layout option for using fzf-tmux + ```vim + let g:fzf_layout = { 'tmux': '-p90%,60%' } + ``` + +0.21.1 +------ +- Shell extension + - CTRL-R will remove duplicate commands +- fzf-tmux + - Supports tmux popup window (require tmux 3.2 or above) + - ```sh + # 50% width and height + fzf-tmux -p + + # 80% width and height + fzf-tmux -p 80% + + # 80% width and 40% height + fzf-tmux -p 80%,40% + fzf-tmux -w 80% -h 40% + + # Window position + fzf-tmux -w 80% -h 40% -x 0 -y 0 + fzf-tmux -w 80% -h 40% -y 1000 + + # Write ordinary fzf options after -- + fzf-tmux -p -- --reverse --info=inline --margin 2,4 --border + ``` + - On macOS, you can build the latest tmux from the source with + `brew install tmux --HEAD` +- Bug fixes + - Fixed Windows file traversal not to include directories + - Fixed ANSI colors with `--keep-right` + - Fixed _fzf_complete for zsh +- Built with Go 1.14.1 + +0.21.0 +------ +- `--height` option is now available on Windows as well (@kelleyma49) +- Added `--pointer` and `--marker` options +- Added `--keep-right` option that keeps the right end of the line visible + when it's too long +- Style changes + - `--border` will now print border with rounded corners around the + finder instead of printing horizontal lines above and below it. + The previous style is available via `--border=horizontal` + - Unicode spinner +- More keys and actions for `--bind` +- Added PowerShell script for downloading Windows binary +- Vim plugin: Built-in floating windows support + ```vim + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } + ``` +- bash: Various improvements in key bindings (CTRL-T, CTRL-R, ALT-C) + - CTRL-R will start with the current command-line as the initial query + - CTRL-R properly supports multi-line commands +- Fuzzy completion API changed + ```sh + # Previous: fzf arguments given as a single string argument + # - This style is still supported, but it's deprecated + _fzf_complete "--multi --reverse --prompt=\"doge> \"" "$@" < <( + echo foo + ) + + # New API: multiple fzf arguments before "--" + # - Easier to write multiple options + _fzf_complete --multi --reverse --prompt="doge> " -- "$@" < <( + echo foo + ) + ``` +- Bug fixes and improvements + +0.20.0 +------ +- Customizable preview window color (`preview-fg` and `preview-bg` for `--color`) + ```sh + fzf --preview 'cat {}' \ + --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899' \ + --border --height 20 --layout reverse --info inline + ``` +- Removed the immediate flicking of the screen on `reload` action. + ```sh + : | fzf --bind 'change:reload:seq {q}' --phony + ``` +- Added `clear-query` and `clear-selection` actions for `--bind` +- It is now possible to split a composite bind action over multiple `--bind` + expressions by prefixing the later ones with `+`. + ```sh + fzf --bind 'ctrl-a:up+up' + + # Can be now written as + fzf --bind 'ctrl-a:up' --bind 'ctrl-a:+up' + + # This is useful when you need to write special execute/reload form (i.e. `execute:...`) + # to avoid parse errors and add more actions to the same key + fzf --multi --bind 'ctrl-l:select-all+execute:less {+f}' --bind 'ctrl-l:+deselect-all' + ``` +- Fixed parse error of `--bind` expression where concatenated execute/reload + action contains `+` character. + ```sh + fzf --multi --bind 'ctrl-l:select-all+execute(less {+f})+deselect-all' + ``` +- Fixed bugs of reload action + - Not triggered when there's no match even when the command doesn't have + any placeholder expressions + - Screen not properly cleared when `--header-lines` not filled on reload + +0.19.0 +------ + +- Added `--phony` option which completely disables search functionality. + Useful when you want to use fzf only as a selector interface. See below. +- Added "reload" action for dynamically updating the input list without + restarting fzf. See https://github.com/junegunn/fzf/issues/1750 to learn + more about it. + ```sh + # Using fzf as the selector interface for ripgrep + RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " + INITIAL_QUERY="foo" + FZF_DEFAULT_COMMAND="$RG_PREFIX '$INITIAL_QUERY' || true" \ + fzf --bind "change:reload:$RG_PREFIX {q} || true" \ + --ansi --phony --query "$INITIAL_QUERY" + ``` +- `--multi` now takes an optional integer argument which indicates the maximum + number of items that can be selected + ```sh + seq 100 | fzf --multi 3 --reverse --height 50% + ``` +- If a placeholder expression for `--preview` and `execute` action (and the + new `reload` action) contains `f` flag, it is replaced to the + path of a temporary file that holds the evaluated list. This is useful + when you multi-select a large number of items and the length of the + evaluated string may exceed [`ARG_MAX`][argmax]. + ```sh + # Press CTRL-A to select 100K items and see the sum of all the numbers + seq 100000 | fzf --multi --bind ctrl-a:select-all \ + --preview "awk '{sum+=\$1} END {print sum}' {+f}" + ``` +- `deselect-all` no longer deselects unmatched items. It is now consistent + with `select-all` and `toggle-all` in that it only affects matched items. +- Due to the limitation of bash, fuzzy completion is enabled by default for + a fixed set of commands. A helper function for easily setting up fuzzy + completion for any command is now provided. + ```sh + # usage: _fzf_setup_completion path|dir COMMANDS... + _fzf_setup_completion path git kubectl + ``` +- Info line style can be changed by `--info=STYLE` + - `--info=default` + - `--info=inline` (same as old `--inline-info`) + - `--info=hidden` +- Preview window border can be disabled by adding `noborder` to + `--preview-window`. +- When you transform the input with `--with-nth`, the trailing white spaces + are removed. +- `ctrl-\`, `ctrl-]`, `ctrl-^`, and `ctrl-/` can now be used with `--bind` +- See https://github.com/junegunn/fzf/milestone/15?closed=1 for more details + +[argmax]: https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument + +0.18.0 +------ + +- Added placeholder expression for zero-based item index: `{n}` and `{+n}` + - `fzf --preview 'echo {n}: {}'` +- Added color option for the gutter: `--color gutter:-1` +- Added `--no-unicode` option for drawing borders in non-Unicode, ASCII + characters +- `FZF_PREVIEW_LINES` and `FZF_PREVIEW_COLUMNS` are exported to preview process + - fzf still overrides `LINES` and `COLUMNS` as before, but they may be + reset by the default shell. +- Bug fixes and improvements + - See https://github.com/junegunn/fzf/milestone/14?closed=1 +- Built with Go 1.12.1 + +0.17.5 +------ + +- Bug fixes and improvements + - See https://github.com/junegunn/fzf/milestone/13?closed=1 +- Search query longer than the screen width is allowed (up to 300 chars) +- Built with Go 1.11.1 + +0.17.4 +------ + +- Added `--layout` option with a new layout called `reverse-list`. + - `--layout=reverse` is a synonym for `--reverse` + - `--layout=default` is a synonym for `--no-reverse` +- Preview window will be updated even when there is no match for the query + if any of the placeholder expressions (e.g. `{q}`, `{+}`) evaluates to + a non-empty string. +- More keys for binding: `shift-{up,down}`, `alt-{up,down,left,right}` +- fzf can now start even when `/dev/tty` is not available by making an + educated guess. +- Updated the default command for Windows. +- Fixes and improvements on bash/zsh completion +- install and uninstall scripts now supports generating files under + `XDG_CONFIG_HOME` on `--xdg` flag. + +See https://github.com/junegunn/fzf/milestone/12?closed=1 for the full list of +changes. + +0.17.3 +------ +- `$LINES` and `$COLUMNS` are exported to preview command so that the command + knows the exact size of the preview window. +- Better error messages when the default command or `$FZF_DEFAULT_COMMAND` + fails. +- Reverted #1061 to avoid having duplicate entries in the list when find + command detected a file system loop (#1120). The default command now + requires that find supports `-fstype` option. +- fzf now distinguishes mouse left click and right click (#1130) + - Right click is now bound to `toggle` action by default + - `--bind` understands `left-click` and `right-click` +- Added `replace-query` action (#1137) + - Replaces query string with the current selection +- Added `accept-non-empty` action (#1162) + - Same as accept, except that it prevents fzf from exiting without any + selection + +0.17.1 +------ + +- Fixed custom background color of preview window (#1046) +- Fixed background color issues of Windows binary +- Fixed Windows binary to execute command using cmd.exe with no parsing and + escaping (#1072) +- Added support for `window` layout on Vim 8 using Vim 8 terminal (#1055) + +0.17.0-2 +-------- + +A maintenance release for auxiliary scripts. fzf binaries are not updated. + +- Experimental support for the builtin terminal of Vim 8 + - fzf can now run inside GVim +- Updated Vim plugin to better handle `&shell` issue on fish +- Fixed a bug of fzf-tmux where invalid output is generated +- Fixed fzf-tmux to work even when `tput` does not work + +0.17.0 +------ +- Performance optimization +- One can match literal spaces in extended-search mode with a space prepended + by a backslash. +- `--expect` is now additive and can be specified multiple times. + +0.16.11 +------- +- Performance optimization +- Fixed missing preview update + +0.16.10 +------- +- Fixed invalid handling of ANSI colors in preview window +- Further improved `--ansi` performance + +0.16.9 +------ +- Memory and performance optimization + - Around 20% performance improvement for general use cases + - Up to 5x faster processing of `--ansi` + - Up to 50% reduction of memory usage +- Bug fixes and usability improvements + - Fixed handling of bracketed paste mode + - [ERROR] on info line when the default command failed + - More efficient rendering of preview window + - `--no-clear` updated for repetitive relaunching scenarios + +0.16.8 +------ +- New `change` event and `top` action for `--bind` + - `fzf --bind change:top` + - Move cursor to the top result whenever the query string is changed + - `fzf --bind 'ctrl-w:unix-word-rubout+top,ctrl-u:unix-line-discard+top'` + - `top` combined with `unix-word-rubout` and `unix-line-discard` +- Fixed inconsistent tiebreak scores when `--nth` is used +- Proper display of tab characters in `--prompt` +- Fixed not to `--cycle` on page-up/page-down to prevent overshoot +- Git revision in `--version` output +- Basic support for Cygwin environment +- Many fixes in Vim plugin on Windows/Cygwin (thanks to @janlazo) + +0.16.7 +------ +- Added support for `ctrl-alt-[a-z]` key chords +- CTRL-Z (SIGSTOP) now works with fzf +- fzf will export `$FZF_PREVIEW_WINDOW` so that the scripts can use it +- Bug fixes and improvements in Vim plugin and shell extensions + +0.16.6 +------ +- Minor bug fixes and improvements +- Added `--no-clear` option for scripting purposes + +0.16.5 +------ +- Minor bug fixes +- Added `toggle-preview-wrap` action +- Built with Go 1.8 + +0.16.4 +------ +- Added `--border` option to draw border above and below the finder +- Bug fixes and improvements + +0.16.3 +------ +- Fixed a bug where fzf incorrectly display the lines when straddling tab + characters are trimmed +- Placeholder expression used in `--preview` and `execute` action can + optionally take `+` flag to be used with multiple selections + - e.g. `git log --oneline | fzf --multi --preview 'git show {+1}'` +- Added `execute-silent` action for executing a command silently without + switching to the alternate screen. This is useful when the process is + short-lived and you're not interested in its output. + - e.g. `fzf --bind 'ctrl-y:execute!(echo -n {} | pbcopy)'` +- `ctrl-space` is allowed in `--bind` + +0.16.2 +------ +- Dropped ncurses dependency +- Binaries for freebsd, openbsd, arm5, arm6, arm7, and arm8 +- Official 24-bit color support +- Added support for composite actions in `--bind`. Multiple actions can be + chained using `+` separator. + - e.g. `fzf --bind 'ctrl-y:execute(echo -n {} | pbcopy)+abort'` +- `--preview-window` with size 0 is allowed. This is used to make fzf execute + preview command in the background without displaying the result. +- Minor bug fixes and improvements + +0.16.1 +------ +- Fixed `--height` option to properly fill the window with the background + color +- Added `half-page-up` and `half-page-down` actions +- Added `-L` flag to the default find command + +0.16.0 +------ +- *Added `--height HEIGHT[%]` option* + - fzf can now display finder without occupying the full screen +- Preview window will truncate long lines by default. Line wrap can be enabled + by `:wrap` flag in `--preview-window`. +- Latin script letters will be normalized before matching so that it's easier + to match against accented letters. e.g. `sodanco` can match `Só Danço Samba`. + - Normalization can be disabled via `--literal` +- Added `--filepath-word` to make word-wise movements/actions (`alt-b`, + `alt-f`, `alt-bs`, `alt-d`) respect path separators + +0.15.9 +------ +- Fixed rendering glitches introduced in 0.15.8 +- The default escape delay is reduced to 50ms and is configurable via + `$ESCDELAY` +- Scroll indicator at the top-right corner of the preview window is always + displayed when there's overflow +- Can now be built with ncurses 6 or tcell to support extra features + - *ncurses 6* + - Supports more than 256 color pairs + - Supports italics + - *tcell* + - 24-bit color support + - See https://github.com/junegunn/fzf/blob/master/BUILD.md + +0.15.8 +------ +- Updated ANSI processor to handle more VT-100 escape sequences +- Added `--no-bold` (and `--bold`) option +- Improved escape sequence processing for WSL +- Added support for `alt-[0-9]`, `f11`, and `f12` for `--bind` and `--expect` + +0.15.7 +------ +- Fixed panic when color is disabled and header lines contain ANSI colors + +0.15.6 +------ +- Windows binaries! (@kelleyma49) +- Fixed the bug where header lines are cleared when preview window is toggled +- Fixed not to display ^N and ^O on screen +- Fixed cursor keys (or any key sequence that starts with ESC) on WSL by + making fzf wait for additional keystrokes after ESC for up to 100ms + +0.15.5 +------ +- Setting foreground color will no longer set background color to black + - e.g. `fzf --color fg:153` +- `--tiebreak=end` will consider relative position instead of absolute distance +- Updated `fzf#wrap` function to respect `g:fzf_colors` + +0.15.4 +------ +- Added support for range expression in preview and execute action + - e.g. `ls -l | fzf --preview="echo user={3} when={-4..-2}; cat {-1}" --header-lines=1` + - `{q}` will be replaced to the single-quoted string of the current query +- Fixed to properly handle unicode whitespace characters +- Display scroll indicator in preview window +- Inverse search term will use exact matcher by default + - This is a breaking change, but I believe it makes much more sense. It is + almost impossible to predict which entries will be filtered out due to + a fuzzy inverse term. You can still perform inverse-fuzzy-match by + prepending `!'` to the term. + +0.15.3 +------ +- Added support for more ANSI attributes: dim, underline, blink, and reverse +- Fixed race condition in `toggle-preview` + +0.15.2 +------ +- Preview window is now scrollable + - With mouse scroll or with bindable actions + - `preview-up` + - `preview-down` + - `preview-page-up` + - `preview-page-down` +- Updated ANSI processor to support high intensity colors and ignore + some VT100-related escape sequences + +0.15.1 +------ +- Fixed panic when the pattern occurs after 2^15-th column +- Fixed rendering delay when displaying extremely long lines + +0.15.0 +------ +- Improved fuzzy search algorithm + - Added `--algo=[v1|v2]` option so one can still choose the old algorithm + which values the search performance over the quality of the result +- Advanced scoring criteria +- `--read0` to read input delimited by ASCII NUL character +- `--print0` to print output delimited by ASCII NUL character + +0.13.5 +------ +- Memory and performance optimization + - Up to 2x performance with half the amount of memory + +0.13.4 +------ +- Performance optimization + - Memory footprint for ascii string is reduced by 60% + - 15 to 20% improvement of query performance + - Up to 45% better performance of `--nth` with non-regex delimiters +- Fixed invalid handling of `hidden` property of `--preview-window` + +0.13.3 +------ +- Fixed duplicate rendering of the last line in preview window + +0.13.2 +------ +- Fixed race condition where preview window is not properly cleared + +0.13.1 +------ +- Fixed UI issue with large `--preview` output with many ANSI codes + +0.13.0 +------ +- Added preview feature + - `--preview CMD` + - `--preview-window POS[:SIZE][:hidden]` +- `{}` in execute action is now replaced to the single-quoted (instead of + double-quoted) string of the current line +- Fixed to ignore control characters for bracketed paste mode + +0.12.2 +------ + +- 256-color capability detection does not require `256` in `$TERM` +- Added `print-query` action +- More named keys for binding; F1 ~ F10, + ALT-/, ALT-space, and ALT-enter +- Added `jump` and `jump-accept` actions that implement [EasyMotion][em]-like + movement + ![][jump] + +[em]: https://github.com/easymotion/vim-easymotion +[jump]: https://cloud.githubusercontent.com/assets/700826/15367574/b3999dc4-1d64-11e6-85da-28ceeb1a9bc2.png + +0.12.1 +------ + +- Ranking algorithm introduced in 0.12.0 is now universally applied +- Fixed invalid cache reference in exact mode +- Fixes and improvements in Vim plugin and shell extensions + +0.12.0 +------ + +- Enhanced ranking algorithm +- Minor bug fixes + +0.11.4 +------ + +- Added `--hscroll-off=COL` option (default: 10) (#513) +- Some fixes in Vim plugin and shell extensions + +0.11.3 +------ + +- Graceful exit on SIGTERM (#482) +- `$SHELL` instead of `sh` for `execute` action and `$FZF_DEFAULT_COMMAND` (#481) +- Changes in fuzzy completion API + - [`_fzf_compgen_{path,dir}`](https://github.com/junegunn/fzf/commit/9617647) + - [`_fzf_complete_COMMAND_post`](https://github.com/junegunn/fzf/commit/8206746) + for post-processing + +0.11.2 +------ + +- `--tiebreak` now accepts comma-separated list of sort criteria + - Each criterion should appear only once in the list + - `index` is only allowed at the end of the list + - `index` is implicitly appended to the list when not specified + - Default is `length` (or equivalently `length,index`) +- `begin` criterion will ignore leading whitespaces when calculating the index +- Added `toggle-in` and `toggle-out` actions + - Switch direction depending on `--reverse`-ness + - `export FZF_DEFAULT_OPTS="--bind tab:toggle-out,shift-tab:toggle-in"` +- Reduced the initial delay when `--tac` is not given + - fzf defers the initial rendering of the screen up to 100ms if the input + stream is ongoing to prevent unnecessary redraw during the initial + phase. However, 100ms delay is quite noticeable and might give the + impression that fzf is not snappy enough. This commit reduces the + maximum delay down to 20ms when `--tac` is not specified, in which case + the input list quickly fills the entire screen. + +0.11.1 +------ + +- Added `--tabstop=SPACES` option + +0.11.0 +------ + +- Added OR operator for extended-search mode +- Added `--execute-multi` action +- Fixed incorrect cursor position when unicode wide characters are used in + `--prompt` +- Fixes and improvements in shell extensions + +0.10.9 +------ + +- Extended-search mode is now enabled by default + - `--extended-exact` is deprecated and instead we have `--exact` for + orthogonally controlling "exactness" of search +- Fixed not to display non-printable characters +- Added `double-click` for `--bind` option +- More robust handling of SIGWINCH + +0.10.8 +------ + +- Fixed panic when trying to set colors after colors are disabled (#370) + +0.10.7 +------ + +- Fixed unserialized interrupt handling during execute action which often + caused invalid memory access and crash +- Changed `--tiebreak=length` (default) to use trimmed length when `--nth` is + used + +0.10.6 +------ + +- Replaced `--header-file` with `--header` option +- `--header` and `--header-lines` can be used together +- Changed exit status + - 0: Okay + - 1: No match + - 2: Error + - 130: Interrupted +- 64-bit linux binary is statically-linked with ncurses to avoid + compatibility issues. + +0.10.5 +------ + +- `'`-prefix to unquote the term in `--extended-exact` mode +- Backward scan when `--tiebreak=end` is set + +0.10.4 +------ + +- Fixed to remove ANSI code from output when `--with-nth` is set + +0.10.3 +------ + +- Fixed slow performance of `--with-nth` when used with `--delimiter` + - Regular expression engine of Golang as of now is very slow, so the fixed + version will treat the given delimiter pattern as a plain string instead + of a regular expression unless it contains special characters and is + a valid regular expression. + - Simpler regular expression for delimiter for better performance + +0.10.2 +------ + +### Fixes and improvements + +- Improvement in perceived response time of queries + - Eager, efficient rune array conversion +- Graceful exit when failed to initialize ncurses (invalid $TERM) +- Improved ranking algorithm when `--nth` option is set +- Changed the default command not to fail when there are files whose names + start with dash + +0.10.1 +------ + +### New features + +- Added `--margin` option +- Added options for sticky header + - `--header-file` + - `--header-lines` +- Added `cancel` action which clears the input or closes the finder when the + input is already empty + - e.g. `export FZF_DEFAULT_OPTS="--bind esc:cancel"` +- Added `delete-char/eof` action to differentiate `CTRL-D` and `DEL` + +### Minor improvements/fixes + +- Fixed to allow binding colon and comma keys +- Fixed ANSI processor to handle color regions spanning multiple lines + +0.10.0 +------ + +### New features + +- More actions for `--bind` + - `select-all` + - `deselect-all` + - `toggle-all` + - `ignore` +- `execute(...)` action for running arbitrary command without leaving fzf + - `fzf --bind "ctrl-m:execute(less {})"` + - `fzf --bind "ctrl-t:execute(tmux new-window -d 'vim {}')"` + - If the command contains parentheses, use any of the follows alternative + notations to avoid parse errors + - `execute[...]` + - `execute~...~` + - `execute!...!` + - `execute@...@` + - `execute#...#` + - `execute$...$` + - `execute%...%` + - `execute^...^` + - `execute&...&` + - `execute*...*` + - `execute;...;` + - `execute/.../` + - `execute|...|` + - `execute:...` + - This is the special form that frees you from parse errors as it + does not expect the closing character + - The catch is that it should be the last one in the + comma-separated list +- Added support for optional search history + - `--history HISTORY_FILE` + - When used, `CTRL-N` and `CTRL-P` are automatically remapped to + `next-history` and `previous-history` + - `--history-size MAX_ENTRIES` (default: 1000) +- Cyclic scrolling can be enabled with `--cycle` +- Fixed the bug where the spinner was not spinning on idle input stream + - e.g. `sleep 100 | fzf` + +### Minor improvements/fixes + +- Added synonyms for key names that can be specified for `--bind`, + `--toggle-sort`, and `--expect` +- Fixed the color of multi-select marker on the current line +- Fixed to allow `^pattern$` in extended-search mode + + +0.9.13 +------ + +### New features + +- Color customization with the extended `--color` option + +### Bug fixes + +- Fixed premature termination of Reader in the presence of a long line which + is longer than 64KB + +0.9.12 +------ + +### New features + +- Added `--bind` option for custom key bindings + +### Bug fixes + +- Fixed to update "inline-info" immediately after terminal resize +- Fixed ANSI code offset calculation + +0.9.11 +------ + +### New features + +- Added `--inline-info` option for saving screen estate (#202) + - Useful inside Neovim + - e.g. `let $FZF_DEFAULT_OPTS = $FZF_DEFAULT_OPTS.' --inline-info'` + +### Bug fixes + +- Invalid mutation of input on case conversion (#209) +- Smart-case for each term in extended-search mode (#208) +- Fixed double-click result when scroll offset is positive + +0.9.10 +------ + +### Improvements + +- Performance optimization +- Less aggressive memoization to limit memory usage + +### New features + +- Added color scheme for light background: `--color=light` + +0.9.9 +----- + +### New features + +- Added `--tiebreak` option (#191) +- Added `--no-hscroll` option (#193) +- Visual indication of `--toggle-sort` (#194) + +0.9.8 +----- + +### Bug fixes + +- Fixed Unicode case handling (#186) +- Fixed to terminate on RuneError (#185) + +0.9.7 +----- + +### New features + +- Added `--toggle-sort` option (#173) + - `--toggle-sort=ctrl-r` is applied to `CTRL-R` shell extension + +### Bug fixes + +- Fixed to print empty line if `--expect` is set and fzf is completed by + `--select-1` or `--exit-0` (#172) +- Fixed to allow comma character as an argument to `--expect` option + +0.9.6 +----- + +### New features + +#### Added `--expect` option (#163) + +If you provide a comma-separated list of keys with `--expect` option, fzf will +allow you to select the match and complete the finder when any of the keys is +pressed. Additionally, fzf will print the name of the key pressed as the first +line of the output so that your script can decide what to do next based on the +information. + +```sh +fzf --expect=ctrl-v,ctrl-t,alt-s,f1,f2,~,@ +``` + +The updated vim plugin uses this option to implement +[ctrlp](https://github.com/kien/ctrlp.vim)-compatible key bindings. + +### Bug fixes + +- Fixed to ignore ANSI escape code `\e[K` (#162) + +0.9.5 +----- + +### New features + +#### Added `--ansi` option (#150) + +If you give `--ansi` option to fzf, fzf will interpret ANSI color codes from +the input, display the item with the ANSI colors (true colors are not +supported), and strips the codes from the output. This option is off by +default as it entails some overhead. + +### Improvements + +#### Reduced initial memory footprint (#151) + +By removing unnecessary copy of pointers, fzf will use significantly smaller +amount of memory when it's started. The difference is hugely noticeable when +the input is extremely large. (e.g. `locate / | fzf`) + +### Bug fixes + +- Fixed panic on `--no-sort --filter ''` (#149) + +0.9.4 +----- + +### New features + +#### Added `--tac` option to reverse the order of the input. + +One might argue that this option is unnecessary since we can already put `tac` +or `tail -r` in the command pipeline to achieve the same result. However, the +advantage of `--tac` is that it does not block until the input is complete. + +### *Backward incompatible changes* + +#### Changed behavior on `--no-sort` + +`--no-sort` option will no longer reverse the display order within finder. You +may want to use the new `--tac` option with `--no-sort`. + +``` +history | fzf +s --tac +``` + +### Improvements + +#### `--filter` will not block when sort is disabled + +When fzf works in filtering mode (`--filter`) and sort is disabled +(`--no-sort`), there's no need to block until input is complete. The new +version of fzf will print the matches on-the-fly when the following condition +is met: + + --filter TERM --no-sort [--no-tac --no-sync] + +or simply: + + -f TERM +s + +This change removes unnecessary delay in the use cases like the following: + + fzf -f xxx +s | head -5 + +However, in this case, fzf processes the lines sequentially, so it cannot +utilize multiple cores, and fzf will run slightly slower than the previous +mode of execution where filtering is done in parallel after the entire input +is loaded. If the user is concerned about this performance problem, one can +add `--sync` option to re-enable buffering. + +0.9.3 +----- + +### New features +- Added `--sync` option for multi-staged filtering + +### Improvements +- `--select-1` and `--exit-0` will start finder immediately when the condition + cannot be met diff --git a/.fzf/Dockerfile b/.fzf/Dockerfile new file mode 100644 index 0000000..45fa5ee --- /dev/null +++ b/.fzf/Dockerfile @@ -0,0 +1,11 @@ +FROM archlinux/base:latest +RUN pacman -Sy && pacman --noconfirm -S awk git tmux zsh fish ruby procps go make gcc +RUN gem install --no-document -v 5.14.2 minitest +RUN echo '. /usr/share/bash-completion/completions/git' >> ~/.bashrc +RUN echo '. ~/.bashrc' >> ~/.bash_profile + +# Do not set default PS1 +RUN rm -f /etc/bash.bashrc +COPY . /fzf +RUN cd /fzf && make install && ./install --all +CMD tmux new 'set -o pipefail; ruby /fzf/test/test_go.rb | tee out && touch ok' && cat out && [ -e ok ] diff --git a/.fzf/LICENSE b/.fzf/LICENSE new file mode 100644 index 0000000..50aa5d9 --- /dev/null +++ b/.fzf/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi + +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. diff --git a/.fzf/Makefile b/.fzf/Makefile new file mode 100644 index 0000000..91c5711 --- /dev/null +++ b/.fzf/Makefile @@ -0,0 +1,166 @@ +SHELL := bash +GO ?= go +GOOS ?= $(word 1, $(subst /, " ", $(word 4, $(shell go version)))) + +MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST))) +ROOT_DIR := $(shell dirname $(MAKEFILE)) +SOURCES := $(wildcard *.go src/*.go src/*/*.go) $(MAKEFILE) + +ifdef FZF_VERSION +VERSION := $(FZF_VERSION) +else +VERSION := $(shell git describe --abbrev=0 2> /dev/null) +endif +ifeq ($(VERSION),) +$(error Not on git repository; cannot determine $$FZF_VERSION) +endif +VERSION_TRIM := $(shell sed "s/-.*//" <<< $(VERSION)) +VERSION_REGEX := $(subst .,\.,$(VERSION_TRIM)) + +ifdef FZF_REVISION +REVISION := $(FZF_REVISION) +else +REVISION := $(shell git log -n 1 --pretty=format:%h -- $(SOURCES) 2> /dev/null) +endif +ifeq ($(REVISION),) +$(error Not on git repository; cannot determine $$FZF_REVISION) +endif +BUILD_FLAGS := -a -ldflags "-s -w -X main.version=$(VERSION) -X main.revision=$(REVISION)" -tags "$(TAGS)" + +BINARY32 := fzf-$(GOOS)_386 +BINARY64 := fzf-$(GOOS)_amd64 +BINARYARM5 := fzf-$(GOOS)_arm5 +BINARYARM6 := fzf-$(GOOS)_arm6 +BINARYARM7 := fzf-$(GOOS)_arm7 +BINARYARM8 := fzf-$(GOOS)_arm8 +BINARYPPC64LE := fzf-$(GOOS)_ppc64le +BINARYRISCV64 := fzf-$(GOOS)_riscv64 + +# https://en.wikipedia.org/wiki/Uname +UNAME_M := $(shell uname -m) +ifeq ($(UNAME_M),x86_64) + BINARY := $(BINARY64) +else ifeq ($(UNAME_M),amd64) + BINARY := $(BINARY64) +else ifeq ($(UNAME_M),i686) + BINARY := $(BINARY32) +else ifeq ($(UNAME_M),i386) + BINARY := $(BINARY32) +else ifeq ($(UNAME_M),armv5l) + BINARY := $(BINARYARM5) +else ifeq ($(UNAME_M),armv6l) + BINARY := $(BINARYARM6) +else ifeq ($(UNAME_M),armv7l) + BINARY := $(BINARYARM7) +else ifeq ($(UNAME_M),armv8l) + BINARY := $(BINARYARM8) +else ifeq ($(UNAME_M),arm64) + BINARY := $(BINARYARM8) +else ifeq ($(UNAME_M),aarch64) + BINARY := $(BINARYARM8) +else ifeq ($(UNAME_M),ppc64le) + BINARY := $(BINARYPPC64LE) +else ifeq ($(UNAME_M),riscv64) + BINARY := $(BINARYRISCV64) +else +$(error Build on $(UNAME_M) is not supported, yet.) +endif + +all: target/$(BINARY) + +test: $(SOURCES) + [ -z "$$(gofmt -s -d src)" ] || (gofmt -s -d src; exit 1) + SHELL=/bin/sh GOOS= $(GO) test -v -tags "$(TAGS)" \ + github.com/junegunn/fzf/src \ + github.com/junegunn/fzf/src/algo \ + github.com/junegunn/fzf/src/tui \ + github.com/junegunn/fzf/src/util + +bench: + cd src && SHELL=/bin/sh GOOS= $(GO) test -v -tags "$(TAGS)" -run=Bench -bench=. -benchmem + +install: bin/fzf + +build: + goreleaser --rm-dist --snapshot + +release: +ifndef GITHUB_TOKEN + $(error GITHUB_TOKEN is not defined) +endif + + # Check if we are on master branch +ifneq ($(shell git symbolic-ref --short HEAD),master) + $(error Not on master branch) +endif + + # Check if version numbers are properly updated + grep -q ^$(VERSION_REGEX)$$ CHANGELOG.md + grep -qF '"fzf $(VERSION_TRIM)"' man/man1/fzf.1 + grep -qF '"fzf $(VERSION_TRIM)"' man/man1/fzf-tmux.1 + grep -qF $(VERSION) install + grep -qF $(VERSION) install.ps1 + + # Make release note out of CHANGELOG.md + mkdir -p tmp + sed -n '/^$(VERSION_REGEX)$$/,/^[0-9]/p' CHANGELOG.md | tail -r | \ + sed '1,/^ *$$/d' | tail -r | sed 1,2d | tee tmp/release-note + + # Push to temp branch first so that install scripts always works on master branch + git checkout -B temp master + git push origin temp --follow-tags --force + + # Make a GitHub release + goreleaser --rm-dist --release-notes tmp/release-note + + # Push to master + git checkout master + git push origin master + + # Delete temp branch + git push origin --delete temp + +clean: + $(RM) -r dist target + +target/$(BINARY32): $(SOURCES) + GOARCH=386 $(GO) build $(BUILD_FLAGS) -o $@ + +target/$(BINARY64): $(SOURCES) + GOARCH=amd64 $(GO) build $(BUILD_FLAGS) -o $@ + +# https://github.com/golang/go/wiki/GoArm +target/$(BINARYARM5): $(SOURCES) + GOARCH=arm GOARM=5 $(GO) build $(BUILD_FLAGS) -o $@ + +target/$(BINARYARM6): $(SOURCES) + GOARCH=arm GOARM=6 $(GO) build $(BUILD_FLAGS) -o $@ + +target/$(BINARYARM7): $(SOURCES) + GOARCH=arm GOARM=7 $(GO) build $(BUILD_FLAGS) -o $@ + +target/$(BINARYARM8): $(SOURCES) + GOARCH=arm64 $(GO) build $(BUILD_FLAGS) -o $@ + +target/$(BINARYPPC64LE): $(SOURCES) + GOARCH=ppc64le $(GO) build $(BUILD_FLAGS) -o $@ + +target/$(BINARYRISCV64): $(SOURCES) + GOARCH=riscv64 $(GO) build $(BUILD_FLAGS) -o $@ + +bin/fzf: target/$(BINARY) | bin + cp -f target/$(BINARY) bin/fzf + +docker: + docker build -t fzf-arch . + docker run -it fzf-arch tmux + +docker-test: + docker build -t fzf-arch . + docker run -it fzf-arch + +update: + $(GO) get -u + $(GO) mod tidy + +.PHONY: all build release test bench install clean docker docker-test update diff --git a/.fzf/README-VIM.md b/.fzf/README-VIM.md new file mode 100644 index 0000000..425bf67 --- /dev/null +++ b/.fzf/README-VIM.md @@ -0,0 +1,486 @@ +FZF Vim integration +=================== + +Installation +------------ + +Once you have fzf installed, you can enable it inside Vim simply by adding the +directory to `&runtimepath` in your Vim configuration file. The path may +differ depending on the package manager. + +```vim +" If installed using Homebrew +set rtp+=/usr/local/opt/fzf + +" If installed using git +set rtp+=~/.fzf +``` + +If you use [vim-plug](https://github.com/junegunn/vim-plug), the same can be +written as: + +```vim +" If installed using Homebrew +Plug '/usr/local/opt/fzf' + +" If installed using git +Plug '~/.fzf' +``` + +But if you want the latest Vim plugin file from GitHub rather than the one +included in the package, write: + +```vim +Plug 'junegunn/fzf' +``` + +The Vim plugin will pick up fzf binary available on the system. If fzf is not +found on `$PATH`, it will ask you if it should download the latest binary for +you. + +To make sure that you have the latest version of the binary, set up +post-update hook like so: + +```vim +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +``` + +Summary +------- + +The Vim plugin of fzf provides two core functions, and `:FZF` command which is +the basic file selector command built on top of them. + +1. **`fzf#run([spec dict])`** + - Starts fzf inside Vim with the given spec + - `:call fzf#run({'source': 'ls'})` +2. **`fzf#wrap([spec dict]) -> (dict)`** + - Takes a spec for `fzf#run` and returns an extended version of it with + additional options for addressing global preferences (`g:fzf_xxx`) + - `:echo fzf#wrap({'source': 'ls'})` + - We usually *wrap* a spec with `fzf#wrap` before passing it to `fzf#run` + - `:call fzf#run(fzf#wrap({'source': 'ls'}))` +3. **`:FZF [fzf_options string] [path string]`** + - Basic fuzzy file selector + - A reference implementation for those who don't want to write VimScript + to implement custom commands + - If you're looking for more such commands, check out [fzf.vim](https://github.com/junegunn/fzf.vim) project. + +The most important of all is `fzf#run`, but it would be easier to understand +the whole if we start off with `:FZF` command. + +`:FZF[!]` +--------- + +```vim +" Look for files under current directory +:FZF + +" Look for files under your home directory +:FZF ~ + +" With fzf command-line options +:FZF --reverse --info=inline /tmp + +" Bang version starts fzf in fullscreen mode +:FZF! +``` + +Similarly to [ctrlp.vim](https://github.com/kien/ctrlp.vim), use enter key, +`CTRL-T`, `CTRL-X` or `CTRL-V` to open selected files in the current window, +in new tabs, in horizontal splits, or in vertical splits respectively. + +Note that the environment variables `FZF_DEFAULT_COMMAND` and +`FZF_DEFAULT_OPTS` also apply here. + +### Configuration + +- `g:fzf_action` + - Customizable extra key bindings for opening selected files in different ways +- `g:fzf_layout` + - Determines the size and position of fzf window +- `g:fzf_colors` + - Customizes fzf colors to match the current color scheme +- `g:fzf_history_dir` + - Enables history feature + +#### Examples + +```vim +" This is the default extra key bindings +let g:fzf_action = { + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + +" An action can be a reference to a function that processes selected lines +function! s:build_quickfix_list(lines) + call setqflist(map(copy(a:lines), '{ "filename": v:val }')) + copen + cc +endfunction + +let g:fzf_action = { + \ 'ctrl-q': function('s:build_quickfix_list'), + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + +" Default fzf layout +" - Popup window (center of the screen) +let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } + +" - Popup window (center of the current window) +let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true } } + +" - Popup window (anchored to the bottom of the current window) +let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true, 'yoffset': 1.0 } } + +" - down / up / left / right +let g:fzf_layout = { 'down': '40%' } + +" - Window using a Vim command +let g:fzf_layout = { 'window': 'enew' } +let g:fzf_layout = { 'window': '-tabnew' } +let g:fzf_layout = { 'window': '10new' } + +" Customize fzf colors to match your color scheme +" - fzf#wrap translates this to a set of `--color` options +let g:fzf_colors = +\ { 'fg': ['fg', 'Normal'], + \ 'bg': ['bg', 'Normal'], + \ 'hl': ['fg', 'Comment'], + \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], + \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], + \ 'hl+': ['fg', 'Statement'], + \ 'info': ['fg', 'PreProc'], + \ 'border': ['fg', 'Ignore'], + \ 'prompt': ['fg', 'Conditional'], + \ 'pointer': ['fg', 'Exception'], + \ 'marker': ['fg', 'Keyword'], + \ 'spinner': ['fg', 'Label'], + \ 'header': ['fg', 'Comment'] } + +" Enable per-command history +" - History files will be stored in the specified directory +" - When set, CTRL-N and CTRL-P will be bound to 'next-history' and +" 'previous-history' instead of 'down' and 'up'. +let g:fzf_history_dir = '~/.local/share/fzf-history' +``` + +##### Explanation of `g:fzf_colors` + +`g:fzf_colors` is a dictionary mapping fzf elements to a color specification +list: + + element: [ component, group1 [, group2, ...] ] + +- `element` is an fzf element to apply a color to: + + | Element | Description | + | --- | --- | + | `fg` / `bg` / `hl` | Item (foreground / background / highlight) | + | `fg+` / `bg+` / `hl+` | Current item (foreground / background / highlight) | + | `preview-fg` / `preview-bg` | Preview window text and background | + | `hl` / `hl+` | Highlighted substrings (normal / current) | + | `gutter` | Background of the gutter on the left | + | `pointer` | Pointer to the current line (`>`) | + | `marker` | Multi-select marker (`>`) | + | `border` | Border around the window (`--border` and `--preview`) | + | `header` | Header (`--header` or `--header-lines`) | + | `info` | Info line (match counters) | + | `spinner` | Streaming input indicator | + | `query` | Query string | + | `disabled` | Query string when search is disabled | + | `prompt` | Prompt before query (`> `) | + | `pointer` | Pointer to the current line (`>`) | + +- `component` specifies the component (`fg` / `bg`) from which to extract the + color when considering each of the following highlight groups + +- `group1 [, group2, ...]` is a list of highlight groups that are searched (in + order) for a matching color definition + +For example, consider the following specification: + +```vim + 'prompt': ['fg', 'Conditional', 'Comment'], +``` + +This means we color the **prompt** +- using the `fg` attribute of the `Conditional` if it exists, +- otherwise use the `fg` attribute of the `Comment` highlight group if it exists, +- otherwise fall back to the default color settings for the **prompt**. + +You can examine the color option generated according the setting by printing +the result of `fzf#wrap()` function like so: + +```vim +:echo fzf#wrap() +``` + +`fzf#run` +--------- + +`fzf#run()` function is the core of Vim integration. It takes a single +dictionary argument, *a spec*, and starts fzf process accordingly. At the very +least, specify `sink` option to tell what it should do with the selected +entry. + +```vim +call fzf#run({'sink': 'e'}) +``` + +We haven't specified the `source`, so this is equivalent to starting fzf on +command line without standard input pipe; fzf will use find command (or +`$FZF_DEFAULT_COMMAND` if defined) to list the files under the current +directory. When you select one, it will open it with the sink, `:e` command. +If you want to open it in a new tab, you can pass `:tabedit` command instead +as the sink. + +```vim +call fzf#run({'sink': 'tabedit'}) +``` + +Instead of using the default find command, you can use any shell command as +the source. The following example will list the files managed by git. It's +equivalent to running `git ls-files | fzf` on shell. + +```vim +call fzf#run({'source': 'git ls-files', 'sink': 'e'}) +``` + +fzf options can be specified as `options` entry in spec dictionary. + +```vim +call fzf#run({'sink': 'tabedit', 'options': '--multi --reverse'}) +``` + +You can also pass a layout option if you don't want fzf window to take up the +entire screen. + +```vim +" up / down / left / right / window are allowed +call fzf#run({'source': 'git ls-files', 'sink': 'e', 'left': '40%'}) +call fzf#run({'source': 'git ls-files', 'sink': 'e', 'window': '30vnew'}) +``` + +`source` doesn't have to be an external shell command, you can pass a Vim +array as the source. In the next example, we pass the names of color +schemes as the source to implement a color scheme selector. + +```vim +call fzf#run({'source': map(split(globpath(&rtp, 'colors/*.vim')), + \ 'fnamemodify(v:val, ":t:r")'), + \ 'sink': 'colo', 'left': '25%'}) +``` + +The following table summarizes the available options. + +| Option name | Type | Description | +| -------------------------- | ------------- | ---------------------------------------------------------------- | +| `source` | string | External command to generate input to fzf (e.g. `find .`) | +| `source` | list | Vim list as input to fzf | +| `sink` | string | Vim command to handle the selected item (e.g. `e`, `tabe`) | +| `sink` | funcref | Reference to function to process each selected item | +| `sinklist` (or `sink*`) | funcref | Similar to `sink`, but takes the list of output lines at once | +| `options` | string/list | Options to fzf | +| `dir` | string | Working directory | +| `up`/`down`/`left`/`right` | number/string | (Layout) Window position and size (e.g. `20`, `50%`) | +| `tmux` | string | (Layout) fzf-tmux options (e.g. `-p90%,60%`) | +| `window` (Vim 8 / Neovim) | string | (Layout) Command to open fzf window (e.g. `vertical aboveleft 30new`) | +| `window` (Vim 8 / Neovim) | dict | (Layout) Popup window settings (e.g. `{'width': 0.9, 'height': 0.6}`) | + +`options` entry can be either a string or a list. For simple cases, string +should suffice, but prefer to use list type to avoid escaping issues. + +```vim +call fzf#run({'options': '--reverse --prompt "C:\\Program Files\\"'}) +call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']}) +``` + +When `window` entry is a dictionary, fzf will start in a popup window. The +following options are allowed: + +- Required: + - `width` [float range [0 ~ 1]] or [integer range [8 ~ ]] + - `height` [float range [0 ~ 1]] or [integer range [4 ~ ]] +- Optional: + - `yoffset` [float default 0.5 range [0 ~ 1]] + - `xoffset` [float default 0.5 range [0 ~ 1]] + - `relative` [boolean default v:false] + - `border` [string default `rounded`]: Border style + - `rounded` / `sharp` / `horizontal` / `vertical` / `top` / `bottom` / `left` / `right` / `no[ne]` + +`fzf#wrap` +---------- + +We have seen that several aspects of `:FZF` command can be configured with +a set of global option variables; different ways to open files +(`g:fzf_action`), window position and size (`g:fzf_layout`), color palette +(`g:fzf_colors`), etc. + +So how can we make our custom `fzf#run` calls also respect those variables? +Simply by *"wrapping"* the spec dictionary with `fzf#wrap` before passing it +to `fzf#run`. + +- **`fzf#wrap([name string], [spec dict], [fullscreen bool]) -> (dict)`** + - All arguments are optional. Usually we only need to pass a spec dictionary. + - `name` is for managing history files. It is ignored if + `g:fzf_history_dir` is not defined. + - `fullscreen` can be either `0` or `1` (default: 0). + +`fzf#wrap` takes a spec and returns an extended version of it (also +a dictionary) with additional options for addressing global preferences. You +can examine the return value of it like so: + +```vim +echo fzf#wrap({'source': 'ls'}) +``` + +After we *"wrap"* our spec, we pass it to `fzf#run`. + +```vim +call fzf#run(fzf#wrap({'source': 'ls'})) +``` + +Now it supports `CTRL-T`, `CTRL-V`, and `CTRL-X` key bindings (configurable +via `g:fzf_action`) and it opens fzf window according to `g:fzf_layout` +setting. + +To make it easier to use, let's define `LS` command. + +```vim +command! LS call fzf#run(fzf#wrap({'source': 'ls'})) +``` + +Type `:LS` and see how it works. + +We would like to make `:LS!` (bang version) open fzf in fullscreen, just like +`:FZF!`. Add `-bang` to command definition, and use `` value to set +the last `fullscreen` argument of `fzf#wrap` (see `:help `). + +```vim +" On :LS!, evaluates to '!', and '!0' becomes 1 +command! -bang LS call fzf#run(fzf#wrap({'source': 'ls'}, 0)) +``` + +Our `:LS` command will be much more useful if we can pass a directory argument +to it, so that something like `:LS /tmp` is possible. + +```vim +command! -bang -complete=dir -nargs=? LS + \ call fzf#run(fzf#wrap({'source': 'ls', 'dir': }, 0)) +``` + +Lastly, if you have enabled `g:fzf_history_dir`, you might want to assign +a unique name to our command and pass it as the first argument to `fzf#wrap`. + +```vim +" The query history for this command will be stored as 'ls' inside g:fzf_history_dir. +" The name is ignored if g:fzf_history_dir is not defined. +command! -bang -complete=dir -nargs=? LS + \ call fzf#run(fzf#wrap('ls', {'source': 'ls', 'dir': }, 0)) +``` + +### Global options supported by `fzf#wrap` + +- `g:fzf_layout` +- `g:fzf_action` + - **Works only when no custom `sink` (or `sinklist`) is provided** + - Having custom sink usually means that each entry is not an ordinary + file path (e.g. name of color scheme), so we can't blindly apply the + same strategy (i.e. `tabedit some-color-scheme` doesn't make sense) +- `g:fzf_colors` +- `g:fzf_history_dir` + +Tips +---- + +### fzf inside terminal buffer + +On the latest versions of Vim and Neovim, fzf will start in a terminal buffer. +If you find the default ANSI colors to be different, consider configuring the +colors using `g:terminal_ansi_colors` in regular Vim or `g:terminal_color_x` +in Neovim. + +```vim +" Terminal colors for seoul256 color scheme +if has('nvim') + let g:terminal_color_0 = '#4e4e4e' + let g:terminal_color_1 = '#d68787' + let g:terminal_color_2 = '#5f865f' + let g:terminal_color_3 = '#d8af5f' + let g:terminal_color_4 = '#85add4' + let g:terminal_color_5 = '#d7afaf' + let g:terminal_color_6 = '#87afaf' + let g:terminal_color_7 = '#d0d0d0' + let g:terminal_color_8 = '#626262' + let g:terminal_color_9 = '#d75f87' + let g:terminal_color_10 = '#87af87' + let g:terminal_color_11 = '#ffd787' + let g:terminal_color_12 = '#add4fb' + let g:terminal_color_13 = '#ffafaf' + let g:terminal_color_14 = '#87d7d7' + let g:terminal_color_15 = '#e4e4e4' +else + let g:terminal_ansi_colors = [ + \ '#4e4e4e', '#d68787', '#5f865f', '#d8af5f', + \ '#85add4', '#d7afaf', '#87afaf', '#d0d0d0', + \ '#626262', '#d75f87', '#87af87', '#ffd787', + \ '#add4fb', '#ffafaf', '#87d7d7', '#e4e4e4' + \ ] +endif +``` + +### Starting fzf in a popup window + +```vim +" Required: +" - width [float range [0 ~ 1]] or [integer range [8 ~ ]] +" - height [float range [0 ~ 1]] or [integer range [4 ~ ]] +" +" Optional: +" - xoffset [float default 0.5 range [0 ~ 1]] +" - yoffset [float default 0.5 range [0 ~ 1]] +" - relative [boolean default v:false] +" - border [string default 'rounded']: Border style +" - 'rounded' / 'sharp' / 'horizontal' / 'vertical' / 'top' / 'bottom' / 'left' / 'right' +let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } +``` + +Alternatively, you can make fzf open in a tmux popup window (requires tmux 3.2 +or above) by putting fzf-tmux options in `tmux` key. + +```vim +" See `man fzf-tmux` for available options +if exists('$TMUX') + let g:fzf_layout = { 'tmux': '-p90%,60%' } +else + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } +endif +``` + +### Hide statusline + +When fzf starts in a terminal buffer, the file type of the buffer is set to +`fzf`. So you can set up `FileType fzf` autocmd to customize the settings of +the window. + +For example, if you open fzf on the bottom on the screen (e.g. `{'down': +'40%'}`), you might want to temporarily disable the statusline for a cleaner +look. + +```vim +let g:fzf_layout = { 'down': '30%' } +autocmd! FileType fzf +autocmd FileType fzf set laststatus=0 noshowmode noruler + \| autocmd BufLeave set laststatus=2 showmode ruler +``` + +[License](LICENSE) +------------------ + +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi diff --git a/.fzf/README.md b/.fzf/README.md new file mode 100644 index 0000000..aaa7454 --- /dev/null +++ b/.fzf/README.md @@ -0,0 +1,712 @@ +fzf - a command-line fuzzy finder [![github-actions](https://github.com/junegunn/fzf/workflows/Test%20fzf%20on%20Linux/badge.svg)](https://github.com/junegunn/fzf/actions) +=== + +fzf is a general-purpose command-line fuzzy finder. + + + +It's an interactive Unix filter for command-line that can be used with any +list; files, command history, processes, hostnames, bookmarks, git commits, +etc. + +Pros +---- + +- Portable, no dependencies +- Blazingly fast +- The most comprehensive feature set +- Flexible layout +- Batteries included + - Vim/Neovim plugin, key bindings, and fuzzy auto-completion + +Table of Contents +----------------- + + + +* [Installation](#installation) + * [Using Homebrew](#using-homebrew) + * [Using git](#using-git) + * [Using Linux package managers](#using-linux-package-managers) + * [Windows](#windows) + * [As Vim plugin](#as-vim-plugin) +* [Upgrading fzf](#upgrading-fzf) +* [Building fzf](#building-fzf) +* [Usage](#usage) + * [Using the finder](#using-the-finder) + * [Layout](#layout) + * [Search syntax](#search-syntax) + * [Environment variables](#environment-variables) + * [Options](#options) + * [Demo](#demo) +* [Examples](#examples) +* [`fzf-tmux` script](#fzf-tmux-script) +* [Key bindings for command-line](#key-bindings-for-command-line) +* [Fuzzy completion for bash and zsh](#fuzzy-completion-for-bash-and-zsh) + * [Files and directories](#files-and-directories) + * [Process IDs](#process-ids) + * [Host names](#host-names) + * [Environment variables / Aliases](#environment-variables--aliases) + * [Settings](#settings) + * [Supported commands](#supported-commands) + * [Custom fuzzy completion](#custom-fuzzy-completion) +* [Vim plugin](#vim-plugin) +* [Advanced topics](#advanced-topics) + * [Performance](#performance) + * [Executing external programs](#executing-external-programs) + * [Reloading the candidate list](#reloading-the-candidate-list) + * [1. Update the list of processes by pressing CTRL-R](#1-update-the-list-of-processes-by-pressing-ctrl-r) + * [2. Switch between sources by pressing CTRL-D or CTRL-F](#2-switch-between-sources-by-pressing-ctrl-d-or-ctrl-f) + * [3. Interactive ripgrep integration](#3-interactive-ripgrep-integration) + * [Preview window](#preview-window) +* [Tips](#tips) + * [Respecting `.gitignore`](#respecting-gitignore) + * [Fish shell](#fish-shell) +* [Related projects](#related-projects) +* [License](#license) + + + +Installation +------------ + +fzf project consists of the following components: + +- `fzf` executable +- `fzf-tmux` script for launching fzf in a tmux pane +- Shell extensions + - Key bindings (`CTRL-T`, `CTRL-R`, and `ALT-C`) (bash, zsh, fish) + - Fuzzy auto-completion (bash, zsh) +- Vim/Neovim plugin + +You can [download fzf executable][bin] alone if you don't need the extra +stuff. + +[bin]: https://github.com/junegunn/fzf/releases + +### Using Homebrew + +You can use [Homebrew](http://brew.sh/) (on macOS or Linux) +to install fzf. + +```sh +brew install fzf + +# To install useful key bindings and fuzzy completion: +$(brew --prefix)/opt/fzf/install +``` + +fzf is also available [via MacPorts][portfile]: `sudo port install fzf` + +[portfile]: https://github.com/macports/macports-ports/blob/master/sysutils/fzf/Portfile + +### Using git + +Alternatively, you can "git clone" this repository to any directory and run +[install](https://github.com/junegunn/fzf/blob/master/install) script. + +```sh +git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf +~/.fzf/install +``` + +### Using Linux package managers + +| Package Manager | Linux Distribution | Command | +| --- | --- | --- | +| APK | Alpine Linux | `sudo apk add fzf` | +| APT | Debian 9+/Ubuntu 19.10+ | `sudo apt-get install fzf` | +| Conda | | `conda install -c conda-forge fzf` | +| DNF | Fedora | `sudo dnf install fzf` | +| Nix | NixOS, etc. | `nix-env -iA nixpkgs.fzf` | +| Pacman | Arch Linux | `sudo pacman -S fzf` | +| pkg | FreeBSD | `pkg install fzf` | +| pkgin | NetBSD | `pkgin install fzf` | +| pkg_add | OpenBSD | `pkg_add fzf` | +| XBPS | Void Linux | `sudo xbps-install -S fzf` | +| Zypper | openSUSE | `sudo zypper install fzf` | + +> :warning: **Key bindings (CTRL-T / CTRL-R / ALT-C) and fuzzy auto-completion +> may not be enabled by default.** +> +> Refer to the package documentation for more information. (e.g. `apt-cache show fzf`) + +[![Packaging status](https://repology.org/badge/vertical-allrepos/fzf.svg)](https://repology.org/project/fzf/versions) + +### Windows + +Pre-built binaries for Windows can be downloaded [here][bin]. fzf is also +available via [Chocolatey][choco] and [Scoop][scoop]: + +| Package manager | Command | +| --- | --- | +| Chocolatey | `choco install fzf` | +| Scoop | `scoop install fzf` | + +[choco]: https://chocolatey.org/packages/fzf +[scoop]: https://github.com/ScoopInstaller/Main/blob/master/bucket/fzf.json + +Known issues and limitations on Windows can be found on [the wiki +page][windows-wiki]. + +[windows-wiki]: https://github.com/junegunn/fzf/wiki/Windows + +### As Vim plugin + +If you use +[vim-plug](https://github.com/junegunn/vim-plug), add this line to your Vim +configuration file: + +```vim +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +``` + +`fzf#install()` makes sure that you have the latest binary, but it's optional, +so you can omit it if you use a plugin manager that doesn't support hooks. + +For more installation options, see [README-VIM.md](README-VIM.md). + +Upgrading fzf +------------- + +fzf is being actively developed, and you might want to upgrade it once in a +while. Please follow the instruction below depending on the installation +method used. + +- git: `cd ~/.fzf && git pull && ./install` +- brew: `brew update; brew upgrade fzf` +- macports: `sudo port upgrade fzf` +- chocolatey: `choco upgrade fzf` +- vim-plug: `:PlugUpdate fzf` + +Building fzf +------------ + +See [BUILD.md](BUILD.md). + +Usage +----- + +fzf will launch interactive finder, read the list from STDIN, and write the +selected item to STDOUT. + +```sh +find * -type f | fzf > selected +``` + +Without STDIN pipe, fzf will use find command to fetch the list of +files excluding hidden ones. (You can override the default command with +`FZF_DEFAULT_COMMAND`) + +```sh +vim $(fzf) +``` + +#### Using the finder + +- `CTRL-K` / `CTRL-J` (or `CTRL-P` / `CTRL-N`) to move cursor up and down +- `Enter` key to select the item, `CTRL-C` / `CTRL-G` / `ESC` to exit +- On multi-select mode (`-m`), `TAB` and `Shift-TAB` to mark multiple items +- Emacs style key bindings +- Mouse: scroll, click, double-click; shift-click and shift-scroll on + multi-select mode + +#### Layout + +fzf by default starts in fullscreen mode, but you can make it start below the +cursor with `--height` option. + +```sh +vim $(fzf --height 40%) +``` + +Also, check out `--reverse` and `--layout` options if you prefer +"top-down" layout instead of the default "bottom-up" layout. + +```sh +vim $(fzf --height 40% --reverse) +``` + +You can add these options to `$FZF_DEFAULT_OPTS` so that they're applied by +default. For example, + +```sh +export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border' +``` + +#### Search syntax + +Unless otherwise specified, fzf starts in "extended-search mode" where you can +type in multiple search terms delimited by spaces. e.g. `^music .mp3$ sbtrkt +!fire` + +| Token | Match type | Description | +| --------- | -------------------------- | ------------------------------------ | +| `sbtrkt` | fuzzy-match | Items that match `sbtrkt` | +| `'wild` | exact-match (quoted) | Items that include `wild` | +| `^music` | prefix-exact-match | Items that start with `music` | +| `.mp3$` | suffix-exact-match | Items that end with `.mp3` | +| `!fire` | inverse-exact-match | Items that do not include `fire` | +| `!^music` | inverse-prefix-exact-match | Items that do not start with `music` | +| `!.mp3$` | inverse-suffix-exact-match | Items that do not end with `.mp3` | + +If you don't prefer fuzzy matching and do not wish to "quote" every word, +start fzf with `-e` or `--exact` option. Note that when `--exact` is set, +`'`-prefix "unquotes" the term. + +A single bar character term acts as an OR operator. For example, the following +query matches entries that start with `core` and end with either `go`, `rb`, +or `py`. + +``` +^core go$ | rb$ | py$ +``` + +#### Environment variables + +- `FZF_DEFAULT_COMMAND` + - Default command to use when input is tty + - e.g. `export FZF_DEFAULT_COMMAND='fd --type f'` + - > :warning: This variable is not used by shell extensions due to the + > slight difference in requirements. + > + > (e.g. `CTRL-T` runs `$FZF_CTRL_T_COMMAND` instead, `vim **` runs + > `_fzf_compgen_path()`, and `cd **` runs `_fzf_compgen_dir()`) + > + > The available options are described later in this document. +- `FZF_DEFAULT_OPTS` + - Default options + - e.g. `export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"` + +#### Options + +See the man page (`man fzf`) for the full list of options. + +#### Demo +If you learn by watching videos, check out this screencast by [@samoshkin](https://github.com/samoshkin) to explore `fzf` features. + + + + + +Examples +-------- + +* [Wiki page of examples](https://github.com/junegunn/fzf/wiki/examples) + * *Disclaimer: The examples on this page are maintained by the community + and are not thoroughly tested* +* [Advanced fzf examples](https://github.com/junegunn/fzf/blob/master/ADVANCED.md) + +`fzf-tmux` script +----------------- + +[fzf-tmux](bin/fzf-tmux) is a bash script that opens fzf in a tmux pane. + +```sh +# usage: fzf-tmux [LAYOUT OPTIONS] [--] [FZF OPTIONS] + +# See available options +fzf-tmux --help + +# select git branches in horizontal split below (15 lines) +git branch | fzf-tmux -d 15 + +# select multiple words in vertical split on the left (20% of screen width) +cat /usr/share/dict/words | fzf-tmux -l 20% --multi --reverse +``` + +It will still work even when you're not on tmux, silently ignoring `-[pudlr]` +options, so you can invariably use `fzf-tmux` in your scripts. + +Alternatively, you can use `--height HEIGHT[%]` option not to start fzf in +fullscreen mode. + +```sh +fzf --height 40% +``` + +Key bindings for command-line +----------------------------- + +The install script will setup the following key bindings for bash, zsh, and +fish. + +- `CTRL-T` - Paste the selected files and directories onto the command-line + - Set `FZF_CTRL_T_COMMAND` to override the default command + - Set `FZF_CTRL_T_OPTS` to pass additional options +- `CTRL-R` - Paste the selected command from history onto the command-line + - If you want to see the commands in chronological order, press `CTRL-R` + again which toggles sorting by relevance + - Set `FZF_CTRL_R_OPTS` to pass additional options +- `ALT-C` - cd into the selected directory + - Set `FZF_ALT_C_COMMAND` to override the default command + - Set `FZF_ALT_C_OPTS` to pass additional options + +If you're on a tmux session, you can start fzf in a tmux split-pane or in +a tmux popup window by setting `FZF_TMUX_OPTS` (e.g. `-d 40%`). +See `fzf-tmux --help` for available options. + +More tips can be found on [the wiki page](https://github.com/junegunn/fzf/wiki/Configuring-shell-key-bindings). + +Fuzzy completion for bash and zsh +--------------------------------- + +#### Files and directories + +Fuzzy completion for files and directories can be triggered if the word before +the cursor ends with the trigger sequence, which is by default `**`. + +- `COMMAND [DIRECTORY/][FUZZY_PATTERN]**` + +```sh +# Files under the current directory +# - You can select multiple items with TAB key +vim ** + +# Files under parent directory +vim ../** + +# Files under parent directory that match `fzf` +vim ../fzf** + +# Files under your home directory +vim ~/** + + +# Directories under current directory (single-selection) +cd ** + +# Directories under ~/github that match `fzf` +cd ~/github/fzf** +``` + +#### Process IDs + +Fuzzy completion for PIDs is provided for kill command. In this case, +there is no trigger sequence; just press the tab key after the kill command. + +```sh +# Can select multiple processes with or keys +kill -9 +``` + +#### Host names + +For ssh and telnet commands, fuzzy completion for hostnames is provided. The +names are extracted from /etc/hosts and ~/.ssh/config. + +```sh +ssh ** +telnet ** +``` + +#### Environment variables / Aliases + +```sh +unset ** +export ** +unalias ** +``` + +#### Settings + +```sh +# Use ~~ as the trigger sequence instead of the default ** +export FZF_COMPLETION_TRIGGER='~~' + +# Options to fzf command +export FZF_COMPLETION_OPTS='--border --info=inline' + +# Use fd (https://github.com/sharkdp/fd) instead of the default find +# command for listing path candidates. +# - The first argument to the function ($1) is the base path to start traversal +# - See the source code (completion.{bash,zsh}) for the details. +_fzf_compgen_path() { + fd --hidden --follow --exclude ".git" . "$1" +} + +# Use fd to generate the list for directory completion +_fzf_compgen_dir() { + fd --type d --hidden --follow --exclude ".git" . "$1" +} + +# (EXPERIMENTAL) Advanced customization of fzf options via _fzf_comprun function +# - The first argument to the function is the name of the command. +# - You should make sure to pass the rest of the arguments to fzf. +_fzf_comprun() { + local command=$1 + shift + + case "$command" in + cd) fzf "$@" --preview 'tree -C {} | head -200' ;; + export|unset) fzf "$@" --preview "eval 'echo \$'{}" ;; + ssh) fzf "$@" --preview 'dig {}' ;; + *) fzf "$@" ;; + esac +} +``` + +#### Supported commands + +On bash, fuzzy completion is enabled only for a predefined set of commands +(`complete | grep _fzf` to see the list). But you can enable it for other +commands as well by using `_fzf_setup_completion` helper function. + +```sh +# usage: _fzf_setup_completion path|dir|var|alias|host COMMANDS... +_fzf_setup_completion path ag git kubectl +_fzf_setup_completion dir tree +``` + +#### Custom fuzzy completion + +_**(Custom completion API is experimental and subject to change)**_ + +For a command named _"COMMAND"_, define `_fzf_complete_COMMAND` function using +`_fzf_complete` helper. + +```sh +# Custom fuzzy completion for "doge" command +# e.g. doge ** +_fzf_complete_doge() { + _fzf_complete --multi --reverse --prompt="doge> " -- "$@" < <( + echo very + echo wow + echo such + echo doge + ) +} +``` + +- The arguments before `--` are the options to fzf. +- After `--`, simply pass the original completion arguments unchanged (`"$@"`). +- Then, write a set of commands that generates the completion candidates and + feed its output to the function using process substitution (`< <(...)`). + +zsh will automatically pick up the function using the naming convention but in +bash you have to manually associate the function with the command using the +`complete` command. + +```sh +[ -n "$BASH" ] && complete -F _fzf_complete_doge -o default -o bashdefault doge +``` + +If you need to post-process the output from fzf, define +`_fzf_complete_COMMAND_post` as follows. + +```sh +_fzf_complete_foo() { + _fzf_complete --multi --reverse --header-lines=3 -- "$@" < <( + ls -al + ) +} + +_fzf_complete_foo_post() { + awk '{print $NF}' +} + +[ -n "$BASH" ] && complete -F _fzf_complete_foo -o default -o bashdefault foo +``` + +Vim plugin +---------- + +See [README-VIM.md](README-VIM.md). + +Advanced topics +--------------- + +### Performance + +fzf is fast and is [getting even faster][perf]. Performance should not be +a problem in most use cases. However, you might want to be aware of the +options that affect performance. + +- `--ansi` tells fzf to extract and parse ANSI color codes in the input, and it + makes the initial scanning slower. So it's not recommended that you add it + to your `$FZF_DEFAULT_OPTS`. +- `--nth` makes fzf slower because it has to tokenize each line. +- `--with-nth` makes fzf slower as fzf has to tokenize and reassemble each + line. +- If you absolutely need better performance, you can consider using + `--algo=v1` (the default being `v2`) to make fzf use a faster greedy + algorithm. However, this algorithm is not guaranteed to find the optimal + ordering of the matches and is not recommended. + +[perf]: https://junegunn.kr/images/fzf-0.17.0.png + +### Executing external programs + +You can set up key bindings for starting external processes without leaving +fzf (`execute`, `execute-silent`). + +```bash +# Press F1 to open the file with less without leaving fzf +# Press CTRL-Y to copy the line to clipboard and aborts fzf (requires pbcopy) +fzf --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort' +``` + +See *KEY BINDINGS* section of the man page for details. + +### Reloading the candidate list + +By binding `reload` action to a key or an event, you can make fzf dynamically +reload the candidate list. See https://github.com/junegunn/fzf/issues/1750 for +more details. + +#### 1. Update the list of processes by pressing CTRL-R + +```sh +FZF_DEFAULT_COMMAND='ps -ef' \ + fzf --bind 'ctrl-r:reload($FZF_DEFAULT_COMMAND)' \ + --header 'Press CTRL-R to reload' --header-lines=1 \ + --height=50% --layout=reverse +``` + +#### 2. Switch between sources by pressing CTRL-D or CTRL-F + +```sh +FZF_DEFAULT_COMMAND='find . -type f' \ + fzf --bind 'ctrl-d:reload(find . -type d),ctrl-f:reload($FZF_DEFAULT_COMMAND)' \ + --height=50% --layout=reverse +``` + +#### 3. Interactive ripgrep integration + +The following example uses fzf as the selector interface for ripgrep. We bound +`reload` action to `change` event, so every time you type on fzf, the ripgrep +process will restart with the updated query string denoted by the placeholder +expression `{q}`. Also, note that we used `--disabled` option so that fzf +doesn't perform any secondary filtering. + +```sh +INITIAL_QUERY="" +RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " +FZF_DEFAULT_COMMAND="$RG_PREFIX '$INITIAL_QUERY'" \ + fzf --bind "change:reload:$RG_PREFIX {q} || true" \ + --ansi --disabled --query "$INITIAL_QUERY" \ + --height=50% --layout=reverse +``` + +If ripgrep doesn't find any matches, it will exit with a non-zero exit status, +and fzf will warn you about it. To suppress the warning message, we added +`|| true` to the command, so that it always exits with 0. + +### Preview window + +When the `--preview` option is set, fzf automatically starts an external process +with the current line as the argument and shows the result in the split window. +Your `$SHELL` is used to execute the command with `$SHELL -c COMMAND`. +The window can be scrolled using the mouse or custom key bindings. + +```bash +# {} is replaced with the single-quoted string of the focused line +fzf --preview 'cat {}' +``` + +Preview window supports ANSI colors, so you can use any program that +syntax-highlights the content of a file, such as +[Bat](https://github.com/sharkdp/bat) or +[Highlight](http://www.andre-simon.de/doku/highlight/en/highlight.php): + +```bash +fzf --preview 'bat --style=numbers --color=always --line-range :500 {}' +``` + +You can customize the size, position, and border of the preview window using +`--preview-window` option, and the foreground and background color of it with +`--color` option. For example, + +```bash +fzf --height 40% --layout reverse --info inline --border \ + --preview 'file {}' --preview-window up,1,border-horizontal \ + --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899' +``` + +See the man page (`man fzf`) for the full list of options. + +For more advanced examples, see [Key bindings for git with fzf][fzf-git] +([code](https://gist.github.com/junegunn/8b572b8d4b5eddd8b85e5f4d40f17236)). + +[fzf-git]: https://junegunn.kr/2016/07/fzf-git/ + +---- + +Since fzf is a general-purpose text filter rather than a file finder, **it is +not a good idea to add `--preview` option to your `$FZF_DEFAULT_OPTS`**. + +```sh +# ********************* +# ** DO NOT DO THIS! ** +# ********************* +export FZF_DEFAULT_OPTS='--preview "bat --style=numbers --color=always --line-range :500 {}"' + +# bat doesn't work with any input other than the list of files +ps -ef | fzf +seq 100 | fzf +history | fzf +``` + +Tips +---- + +#### Respecting `.gitignore` + +You can use [fd](https://github.com/sharkdp/fd), +[ripgrep](https://github.com/BurntSushi/ripgrep), or [the silver +searcher](https://github.com/ggreer/the_silver_searcher) instead of the +default find command to traverse the file system while respecting +`.gitignore`. + +```sh +# Feed the output of fd into fzf +fd --type f | fzf + +# Setting fd as the default source for fzf +export FZF_DEFAULT_COMMAND='fd --type f' + +# Now fzf (w/o pipe) will use fd instead of find +fzf + +# To apply the command to CTRL-T as well +export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" +``` + +If you want the command to follow symbolic links and don't want it to exclude +hidden files, use the following command: + +```sh +export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git' +``` + +#### Fish shell + +`CTRL-T` key binding of fish, unlike those of bash and zsh, will use the last +token on the command-line as the root directory for the recursive search. For +instance, hitting `CTRL-T` at the end of the following command-line + +```sh +ls /var/ +``` + +will list all files and directories under `/var/`. + +When using a custom `FZF_CTRL_T_COMMAND`, use the unexpanded `$dir` variable to +make use of this feature. `$dir` defaults to `.` when the last token is not a +valid directory. Example: + +```sh +set -g FZF_CTRL_T_COMMAND "command find -L \$dir -type f 2> /dev/null | sed '1d; s#^\./##'" +``` + +Related projects +---------------- + +https://github.com/junegunn/fzf/wiki/Related-projects + +[License](LICENSE) +------------------ + +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi diff --git a/.fzf/bin/fzf-tmux b/.fzf/bin/fzf-tmux new file mode 100755 index 0000000..6a18cf8 --- /dev/null +++ b/.fzf/bin/fzf-tmux @@ -0,0 +1,233 @@ +#!/usr/bin/env bash +# fzf-tmux: starts fzf in a tmux pane +# usage: fzf-tmux [LAYOUT OPTIONS] [--] [FZF OPTIONS] + +fail() { + >&2 echo "$1" + exit 2 +} + +fzf="$(command -v fzf 2> /dev/null)" || fzf="$(dirname "$0")/fzf" +[[ -x "$fzf" ]] || fail 'fzf executable not found' + +tmux_args=() +args=() +opt="" +skip="" +swap="" +close="" +term="" +[[ -n "$LINES" ]] && lines=$LINES || lines=$(tput lines) || lines=$(tmux display-message -p "#{pane_height}") +[[ -n "$COLUMNS" ]] && columns=$COLUMNS || columns=$(tput cols) || columns=$(tmux display-message -p "#{pane_width}") + +help() { + >&2 echo 'usage: fzf-tmux [LAYOUT OPTIONS] [--] [FZF OPTIONS] + + LAYOUT OPTIONS: + (default layout: -d 50%) + + Popup window (requires tmux 3.2 or above): + -p [WIDTH[%][,HEIGHT[%]]] (default: 50%) + -w WIDTH[%] + -h HEIGHT[%] + -x COL + -y ROW + + Split pane: + -u [HEIGHT[%]] Split above (up) + -d [HEIGHT[%]] Split below (down) + -l [WIDTH[%]] Split left + -r [WIDTH[%]] Split right +' + exit +} + +while [[ $# -gt 0 ]]; do + arg="$1" + shift + [[ -z "$skip" ]] && case "$arg" in + -) + term=1 + ;; + --help) + help + ;; + --version) + echo "fzf-tmux (with fzf $("$fzf" --version))" + exit + ;; + -p*|-w*|-h*|-x*|-y*|-d*|-u*|-r*|-l*) + if [[ "$arg" =~ ^-[pwhxy] ]]; then + [[ "$opt" =~ "-K -E" ]] || opt="-K -E" + elif [[ "$arg" =~ ^.[lr] ]]; then + opt="-h" + if [[ "$arg" =~ ^.l ]]; then + opt="$opt -d" + swap="; swap-pane -D ; select-pane -L" + close="; tmux swap-pane -D" + fi + else + opt="" + if [[ "$arg" =~ ^.u ]]; then + opt="$opt -d" + swap="; swap-pane -D ; select-pane -U" + close="; tmux swap-pane -D" + fi + fi + if [[ ${#arg} -gt 2 ]]; then + size="${arg:2}" + else + if [[ "$1" =~ ^[0-9%,]+$ ]] || [[ "$1" =~ ^[A-Z]$ ]]; then + size="$1" + shift + else + continue + fi + fi + + if [[ "$arg" =~ ^-p ]]; then + if [[ -n "$size" ]]; then + w=${size%%,*} + h=${size##*,} + opt="$opt -w$w -h$h" + fi + elif [[ "$arg" =~ ^-[whxy] ]]; then + opt="$opt ${arg:0:2}$size" + elif [[ "$size" =~ %$ ]]; then + size=${size:0:((${#size}-1))} + if [[ -n "$swap" ]]; then + opt="$opt -p $(( 100 - size ))" + else + opt="$opt -p $size" + fi + else + if [[ -n "$swap" ]]; then + if [[ "$arg" =~ ^.l ]]; then + max=$columns + else + max=$lines + fi + size=$(( max - size )) + [[ $size -lt 0 ]] && size=0 + opt="$opt -l $size" + else + opt="$opt -l $size" + fi + fi + ;; + --) + # "--" can be used to separate fzf-tmux options from fzf options to + # avoid conflicts + skip=1 + tmux_args=("${args[@]}") + args=() + continue + ;; + *) + args+=("$arg") + ;; + esac + [[ -n "$skip" ]] && args+=("$arg") +done + +if [[ -z "$TMUX" ]]; then + "$fzf" "${args[@]}" + exit $? +fi + +# --height option is not allowed. CTRL-Z is also disabled. +args=("${args[@]}" "--no-height" "--bind=ctrl-z:ignore") + +# Handle zoomed tmux pane without popup options by moving it to a temp window +if [[ ! "$opt" =~ "-K -E" ]] && tmux list-panes -F '#F' | grep -q Z; then + zoomed_without_popup=1 + original_window=$(tmux display-message -p "#{window_id}") + tmp_window=$(tmux new-window -d -P -F "#{window_id}" "bash -c 'while :; do for c in \\| / - '\\;' do sleep 0.2; printf \"\\r\$c fzf-tmux is running\\r\"; done; done'") + tmux swap-pane -t $tmp_window \; select-window -t $tmp_window +fi + +set -e + +# Clean up named pipes on exit +id=$RANDOM +argsf="${TMPDIR:-/tmp}/fzf-args-$id" +fifo1="${TMPDIR:-/tmp}/fzf-fifo1-$id" +fifo2="${TMPDIR:-/tmp}/fzf-fifo2-$id" +fifo3="${TMPDIR:-/tmp}/fzf-fifo3-$id" +tmux_win_opts=( $(tmux show-window-options remain-on-exit \; show-window-options synchronize-panes | sed '/ off/d; s/^/set-window-option /; s/$/ \\;/') ) +cleanup() { + \rm -f $argsf $fifo1 $fifo2 $fifo3 + + # Restore tmux window options + if [[ "${#tmux_win_opts[@]}" -gt 0 ]]; then + eval "tmux ${tmux_win_opts[*]}" + fi + + # Remove temp window if we were zoomed without popup options + if [[ -n "$zoomed_without_popup" ]]; then + tmux display-message -p "#{window_id}" > /dev/null + tmux swap-pane -t $original_window \; \ + select-window -t $original_window \; \ + kill-window -t $tmp_window \; \ + resize-pane -Z + fi + + if [[ $# -gt 0 ]]; then + trap - EXIT + exit 130 + fi +} +trap 'cleanup 1' SIGUSR1 +trap 'cleanup' EXIT + +envs="export TERM=$TERM " +[[ "$opt" =~ "-K -E" ]] && FZF_DEFAULT_OPTS="--margin 0,1 $FZF_DEFAULT_OPTS" +[[ -n "$FZF_DEFAULT_OPTS" ]] && envs="$envs FZF_DEFAULT_OPTS=$(printf %q "$FZF_DEFAULT_OPTS")" +[[ -n "$FZF_DEFAULT_COMMAND" ]] && envs="$envs FZF_DEFAULT_COMMAND=$(printf %q "$FZF_DEFAULT_COMMAND")" +echo "$envs;" > "$argsf" + +# Build arguments to fzf +opts=$(printf "%q " "${args[@]}") + +pppid=$$ +echo -n "trap 'kill -SIGUSR1 -$pppid' EXIT SIGINT SIGTERM;" >> $argsf +close="; trap - EXIT SIGINT SIGTERM $close" + +export TMUX=$(cut -d , -f 1,2 <<< "$TMUX") +mkfifo -m o+w $fifo2 +if [[ "$opt" =~ "-K -E" ]]; then + cat $fifo2 & + if [[ -n "$term" ]] || [[ -t 0 ]]; then + cat <<< "\"$fzf\" $opts > $fifo2; out=\$? $close; exit \$out" >> $argsf + else + mkfifo $fifo1 + cat <<< "\"$fzf\" $opts < $fifo1 > $fifo2; out=\$? $close; exit \$out" >> $argsf + cat <&0 > $fifo1 & + fi + + # tmux dropped the support for `-K`, `-R` to popup command + # TODO: We can remove this once tmux 3.2 is released + if [[ ! "$(tmux popup --help 2>&1)" =~ '-R shell-command' ]]; then + opt="${opt/-K/}" + else + opt="${opt} -R" + fi + + tmux popup -d "$PWD" "${tmux_args[@]}" $opt "bash $argsf" > /dev/null 2>&1 + exit $? +fi + +mkfifo -m o+w $fifo3 +if [[ -n "$term" ]] || [[ -t 0 ]]; then + cat <<< "\"$fzf\" $opts > $fifo2; echo \$? > $fifo3 $close" >> $argsf +else + mkfifo $fifo1 + cat <<< "\"$fzf\" $opts < $fifo1 > $fifo2; echo \$? > $fifo3 $close" >> $argsf + cat <&0 > $fifo1 & +fi +tmux set-window-option synchronize-panes off \;\ + set-window-option remain-on-exit off \;\ + split-window -c "$PWD" $opt "${tmux_args[@]}" "bash -c 'exec -a fzf bash $argsf'" $swap \ + > /dev/null 2>&1 || { "$fzf" "${args[@]}"; exit $?; } +cat $fifo2 +exit "$(cat $fifo3)" diff --git a/.fzf/doc/fzf.txt b/.fzf/doc/fzf.txt new file mode 100644 index 0000000..9485723 --- /dev/null +++ b/.fzf/doc/fzf.txt @@ -0,0 +1,512 @@ +fzf.txt fzf Last change: May 19 2021 +FZF - TABLE OF CONTENTS *fzf* *fzf-toc* +============================================================================== + + FZF Vim integration |fzf-vim-integration| + Installation |fzf-installation| + Summary |fzf-summary| + :FZF[!] |:FZF| + Configuration |fzf-configuration| + Examples |fzf-examples| + Explanation of g:fzf_colors |fzf-explanation-of-gfzfcolors| + fzf#run |fzf#run| + fzf#wrap |fzf#wrap| + Global options supported by fzf#wrap |fzf-global-options-supported-by-fzf#wrap| + Tips |fzf-tips| + fzf inside terminal buffer |fzf-inside-terminal-buffer| + Starting fzf in a popup window |fzf-starting-fzf-in-a-popup-window| + Hide statusline |fzf-hide-statusline| + License |fzf-license| + +FZF VIM INTEGRATION *fzf-vim-integration* +============================================================================== + + +INSTALLATION *fzf-installation* +============================================================================== + +Once you have fzf installed, you can enable it inside Vim simply by adding the +directory to 'runtimepath' in your Vim configuration file. The path may differ +depending on the package manager. +> + " If installed using Homebrew + set rtp+=/usr/local/opt/fzf + + " If installed using git + set rtp+=~/.fzf +< +If you use {vim-plug}{1}, the same can be written as: +> + " If installed using Homebrew + Plug '/usr/local/opt/fzf' + + " If installed using git + Plug '~/.fzf' +< +But if you want the latest Vim plugin file from GitHub rather than the one +included in the package, write: +> + Plug 'junegunn/fzf' +< +The Vim plugin will pick up fzf binary available on the system. If fzf is not +found on `$PATH`, it will ask you if it should download the latest binary for +you. + +To make sure that you have the latest version of the binary, set up +post-update hook like so: + + *fzf#install* +> + Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +< + {1} https://github.com/junegunn/vim-plug + + +SUMMARY *fzf-summary* +============================================================================== + +The Vim plugin of fzf provides two core functions, and `:FZF` command which is +the basic file selector command built on top of them. + + 1. `fzf#run([spec dict])` + - Starts fzf inside Vim with the given spec + - `:call fzf#run({'source': 'ls'})` + 2. `fzf#wrap([spec dict]) -> (dict)` + - Takes a spec for `fzf#run` and returns an extended version of it with + additional options for addressing global preferences (`g:fzf_xxx`) + - `:echo fzf#wrap({'source': 'ls'})` + - We usually wrap a spec with `fzf#wrap` before passing it to `fzf#run` + - `:call fzf#run(fzf#wrap({'source': 'ls'}))` + 3. `:FZF [fzf_options string] [path string]` + - Basic fuzzy file selector + - A reference implementation for those who don't want to write VimScript to + implement custom commands + - If you're looking for more such commands, check out {fzf.vim}{2} project. + +The most important of all is `fzf#run`, but it would be easier to understand +the whole if we start off with `:FZF` command. + + {2} https://github.com/junegunn/fzf.vim + + +:FZF[!] +============================================================================== + + *:FZF* +> + " Look for files under current directory + :FZF + + " Look for files under your home directory + :FZF ~ + + " With fzf command-line options + :FZF --reverse --info=inline /tmp + + " Bang version starts fzf in fullscreen mode + :FZF! +< +Similarly to {ctrlp.vim}{3}, use enter key, CTRL-T, CTRL-X or CTRL-V to open +selected files in the current window, in new tabs, in horizontal splits, or in +vertical splits respectively. + +Note that the environment variables `FZF_DEFAULT_COMMAND` and +`FZF_DEFAULT_OPTS` also apply here. + + {3} https://github.com/kien/ctrlp.vim + + +< Configuration >_____________________________________________________________~ + *fzf-configuration* + + *g:fzf_action* *g:fzf_layout* *g:fzf_colors* *g:fzf_history_dir* + + - `g:fzf_action` + - Customizable extra key bindings for opening selected files in different + ways + - `g:fzf_layout` + - Determines the size and position of fzf window + - `g:fzf_colors` + - Customizes fzf colors to match the current color scheme + - `g:fzf_history_dir` + - Enables history feature + + +Examples~ + *fzf-examples* +> + " This is the default extra key bindings + let g:fzf_action = { + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + + " An action can be a reference to a function that processes selected lines + function! s:build_quickfix_list(lines) + call setqflist(map(copy(a:lines), '{ "filename": v:val }')) + copen + cc + endfunction + + let g:fzf_action = { + \ 'ctrl-q': function('s:build_quickfix_list'), + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + + " Default fzf layout + " - Popup window (center of the screen) + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } + + " - Popup window (center of the current window) + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true } } + + " - Popup window (anchored to the bottom of the current window) + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6, 'relative': v:true, 'yoffset': 1.0 } } + + " - down / up / left / right + let g:fzf_layout = { 'down': '40%' } + + " - Window using a Vim command + let g:fzf_layout = { 'window': 'enew' } + let g:fzf_layout = { 'window': '-tabnew' } + let g:fzf_layout = { 'window': '10new' } + + " Customize fzf colors to match your color scheme + " - fzf#wrap translates this to a set of `--color` options + let g:fzf_colors = + \ { 'fg': ['fg', 'Normal'], + \ 'bg': ['bg', 'Normal'], + \ 'hl': ['fg', 'Comment'], + \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], + \ 'bg+': ['bg', 'CursorLine', 'CursorColumn'], + \ 'hl+': ['fg', 'Statement'], + \ 'info': ['fg', 'PreProc'], + \ 'border': ['fg', 'Ignore'], + \ 'prompt': ['fg', 'Conditional'], + \ 'pointer': ['fg', 'Exception'], + \ 'marker': ['fg', 'Keyword'], + \ 'spinner': ['fg', 'Label'], + \ 'header': ['fg', 'Comment'] } + + " Enable per-command history + " - History files will be stored in the specified directory + " - When set, CTRL-N and CTRL-P will be bound to 'next-history' and + " 'previous-history' instead of 'down' and 'up'. + let g:fzf_history_dir = '~/.local/share/fzf-history' +< + +Explanation of g:fzf_colors~ + *fzf-explanation-of-gfzfcolors* + +`g:fzf_colors` is a dictionary mapping fzf elements to a color specification +list: +> + element: [ component, group1 [, group2, ...] ] +< + - `element` is an fzf element to apply a color to: + + ----------------------------+------------------------------------------------------ + Element | Description ~ + ----------------------------+------------------------------------------------------ + `fg` / `bg` / `hl` | Item (foreground / background / highlight) + `fg+` / `bg+` / `hl+` | Current item (foreground / background / highlight) + `preview-fg` / `preview-bg` | Preview window text and background + `hl` / `hl+` | Highlighted substrings (normal / current) + `gutter` | Background of the gutter on the left + `pointer` | Pointer to the current line ( `>` ) + `marker` | Multi-select marker ( `>` ) + `border` | Border around the window ( `--border` and `--preview` ) + `header` | Header ( `--header` or `--header-lines` ) + `info` | Info line (match counters) + `spinner` | Streaming input indicator + `query` | Query string + `disabled` | Query string when search is disabled + `prompt` | Prompt before query ( `> ` ) + `pointer` | Pointer to the current line ( `>` ) + ----------------------------+------------------------------------------------------ + - `component` specifies the component (`fg` / `bg`) from which to extract the + color when considering each of the following highlight groups + - `group1 [, group2, ...]` is a list of highlight groups that are searched (in + order) for a matching color definition + +For example, consider the following specification: +> + 'prompt': ['fg', 'Conditional', 'Comment'], +< +This means we color the prompt - using the `fg` attribute of the `Conditional` +if it exists, - otherwise use the `fg` attribute of the `Comment` highlight +group if it exists, - otherwise fall back to the default color settings for +the prompt. + +You can examine the color option generated according the setting by printing +the result of `fzf#wrap()` function like so: +> + :echo fzf#wrap() +< + +FZF#RUN +============================================================================== + + *fzf#run* + +`fzf#run()` function is the core of Vim integration. It takes a single +dictionary argument, a spec, and starts fzf process accordingly. At the very +least, specify `sink` option to tell what it should do with the selected +entry. +> + call fzf#run({'sink': 'e'}) +< +We haven't specified the `source`, so this is equivalent to starting fzf on +command line without standard input pipe; fzf will use find command (or +`$FZF_DEFAULT_COMMAND` if defined) to list the files under the current +directory. When you select one, it will open it with the sink, `:e` command. +If you want to open it in a new tab, you can pass `:tabedit` command instead +as the sink. +> + call fzf#run({'sink': 'tabedit'}) +< +Instead of using the default find command, you can use any shell command as +the source. The following example will list the files managed by git. It's +equivalent to running `git ls-files | fzf` on shell. +> + call fzf#run({'source': 'git ls-files', 'sink': 'e'}) +< +fzf options can be specified as `options` entry in spec dictionary. +> + call fzf#run({'sink': 'tabedit', 'options': '--multi --reverse'}) +< +You can also pass a layout option if you don't want fzf window to take up the +entire screen. +> + " up / down / left / right / window are allowed + call fzf#run({'source': 'git ls-files', 'sink': 'e', 'left': '40%'}) + call fzf#run({'source': 'git ls-files', 'sink': 'e', 'window': '30vnew'}) +< +`source` doesn't have to be an external shell command, you can pass a Vim +array as the source. In the next example, we pass the names of color schemes +as the source to implement a color scheme selector. +> + call fzf#run({'source': map(split(globpath(&rtp, 'colors/*.vim')), + \ 'fnamemodify(v:val, ":t:r")'), + \ 'sink': 'colo', 'left': '25%'}) +< +The following table summarizes the available options. + + ---------------------------+---------------+---------------------------------------------------------------------- + Option name | Type | Description ~ + ---------------------------+---------------+---------------------------------------------------------------------- + `source` | string | External command to generate input to fzf (e.g. `find .` ) + `source` | list | Vim list as input to fzf + `sink` | string | Vim command to handle the selected item (e.g. `e` , `tabe` ) + `sink` | funcref | Reference to function to process each selected item + `sinklist` (or `sink*` ) | funcref | Similar to `sink` , but takes the list of output lines at once + `options` | string/list | Options to fzf + `dir` | string | Working directory + `up` / `down` / `left` / `right` | number/string | (Layout) Window position and size (e.g. `20` , `50%` ) + `tmux` | string | (Layout) fzf-tmux options (e.g. `-p90%,60%` ) + `window` (Vim 8 / Neovim) | string | (Layout) Command to open fzf window (e.g. `vertical aboveleft 30new` ) + `window` (Vim 8 / Neovim) | dict | (Layout) Popup window settings (e.g. `{'width': 0.9, 'height': 0.6}` ) + ---------------------------+---------------+---------------------------------------------------------------------- + +`options` entry can be either a string or a list. For simple cases, string +should suffice, but prefer to use list type to avoid escaping issues. +> + call fzf#run({'options': '--reverse --prompt "C:\\Program Files\\"'}) + call fzf#run({'options': ['--reverse', '--prompt', 'C:\Program Files\']}) +< +When `window` entry is a dictionary, fzf will start in a popup window. The +following options are allowed: + + - Required: + - `width` [float range [0 ~ 1]] or [integer range [8 ~ ]] + - `height` [float range [0 ~ 1]] or [integer range [4 ~ ]] + - Optional: + - `yoffset` [float default 0.5 range [0 ~ 1]] + - `xoffset` [float default 0.5 range [0 ~ 1]] + - `relative` [boolean default v:false] + - `border` [string default `rounded`]: Border style + - `rounded` / `sharp` / `horizontal` / `vertical` / `top` / `bottom` / `left` / `right` / `no[ne]` + + +FZF#WRAP +============================================================================== + + *fzf#wrap* + +We have seen that several aspects of `:FZF` command can be configured with a +set of global option variables; different ways to open files (`g:fzf_action`), +window position and size (`g:fzf_layout`), color palette (`g:fzf_colors`), +etc. + +So how can we make our custom `fzf#run` calls also respect those variables? +Simply by "wrapping" the spec dictionary with `fzf#wrap` before passing it to +`fzf#run`. + + - `fzf#wrap([name string], [spec dict], [fullscreen bool]) -> (dict)` + - All arguments are optional. Usually we only need to pass a spec + dictionary. + - `name` is for managing history files. It is ignored if `g:fzf_history_dir` + is not defined. + - `fullscreen` can be either `0` or `1` (default: 0). + +`fzf#wrap` takes a spec and returns an extended version of it (also a +dictionary) with additional options for addressing global preferences. You can +examine the return value of it like so: +> + echo fzf#wrap({'source': 'ls'}) +< +After we "wrap" our spec, we pass it to `fzf#run`. +> + call fzf#run(fzf#wrap({'source': 'ls'})) +< +Now it supports CTRL-T, CTRL-V, and CTRL-X key bindings (configurable via +`g:fzf_action`) and it opens fzf window according to `g:fzf_layout` setting. + +To make it easier to use, let's define `LS` command. +> + command! LS call fzf#run(fzf#wrap({'source': 'ls'})) +< +Type `:LS` and see how it works. + +We would like to make `:LS!` (bang version) open fzf in fullscreen, just like +`:FZF!`. Add `-bang` to command definition, and use value to set the +last `fullscreen` argument of `fzf#wrap` (see :help ). +> + " On :LS!, evaluates to '!', and '!0' becomes 1 + command! -bang LS call fzf#run(fzf#wrap({'source': 'ls'}, 0)) +< +Our `:LS` command will be much more useful if we can pass a directory argument +to it, so that something like `:LS /tmp` is possible. +> + command! -bang -complete=dir -nargs=? LS + \ call fzf#run(fzf#wrap({'source': 'ls', 'dir': }, 0)) +< +Lastly, if you have enabled `g:fzf_history_dir`, you might want to assign a +unique name to our command and pass it as the first argument to `fzf#wrap`. +> + " The query history for this command will be stored as 'ls' inside g:fzf_history_dir. + " The name is ignored if g:fzf_history_dir is not defined. + command! -bang -complete=dir -nargs=? LS + \ call fzf#run(fzf#wrap('ls', {'source': 'ls', 'dir': }, 0)) +< + +< Global options supported by fzf#wrap >______________________________________~ + *fzf-global-options-supported-by-fzf#wrap* + + - `g:fzf_layout` + - `g:fzf_action` + - Works only when no custom `sink` (or `sink*`) is provided + - Having custom sink usually means that each entry is not an ordinary + file path (e.g. name of color scheme), so we can't blindly apply the + same strategy (i.e. `tabedit some-color-scheme` doesn't make sense) + - `g:fzf_colors` + - `g:fzf_history_dir` + + +TIPS *fzf-tips* +============================================================================== + + +< fzf inside terminal buffer >________________________________________________~ + *fzf-inside-terminal-buffer* + +The latest versions of Vim and Neovim include builtin terminal emulator +(`:terminal`) and fzf will start in a terminal buffer in the following cases: + + - On Neovim + - On GVim + - On Terminal Vim with a non-default layout + - `call fzf#run({'left': '30%'})` or `let g:fzf_layout = {'left': '30%'}` + +On the latest versions of Vim and Neovim, fzf will start in a terminal buffer. +If you find the default ANSI colors to be different, consider configuring the +colors using `g:terminal_ansi_colors` in regular Vim or `g:terminal_color_x` +in Neovim. + + *g:terminal_color_15* *g:terminal_color_14* *g:terminal_color_13* +*g:terminal_color_12* *g:terminal_color_11* *g:terminal_color_10* *g:terminal_color_9* + *g:terminal_color_8* *g:terminal_color_7* *g:terminal_color_6* *g:terminal_color_5* + *g:terminal_color_4* *g:terminal_color_3* *g:terminal_color_2* *g:terminal_color_1* + *g:terminal_color_0* +> + " Terminal colors for seoul256 color scheme + if has('nvim') + let g:terminal_color_0 = '#4e4e4e' + let g:terminal_color_1 = '#d68787' + let g:terminal_color_2 = '#5f865f' + let g:terminal_color_3 = '#d8af5f' + let g:terminal_color_4 = '#85add4' + let g:terminal_color_5 = '#d7afaf' + let g:terminal_color_6 = '#87afaf' + let g:terminal_color_7 = '#d0d0d0' + let g:terminal_color_8 = '#626262' + let g:terminal_color_9 = '#d75f87' + let g:terminal_color_10 = '#87af87' + let g:terminal_color_11 = '#ffd787' + let g:terminal_color_12 = '#add4fb' + let g:terminal_color_13 = '#ffafaf' + let g:terminal_color_14 = '#87d7d7' + let g:terminal_color_15 = '#e4e4e4' + else + let g:terminal_ansi_colors = [ + \ '#4e4e4e', '#d68787', '#5f865f', '#d8af5f', + \ '#85add4', '#d7afaf', '#87afaf', '#d0d0d0', + \ '#626262', '#d75f87', '#87af87', '#ffd787', + \ '#add4fb', '#ffafaf', '#87d7d7', '#e4e4e4' + \ ] + endif +< + +< Starting fzf in a popup window >____________________________________________~ + *fzf-starting-fzf-in-a-popup-window* +> + " Required: + " - width [float range [0 ~ 1]] or [integer range [8 ~ ]] + " - height [float range [0 ~ 1]] or [integer range [4 ~ ]] + " + " Optional: + " - xoffset [float default 0.5 range [0 ~ 1]] + " - yoffset [float default 0.5 range [0 ~ 1]] + " - relative [boolean default v:false] + " - border [string default 'rounded']: Border style + " - 'rounded' / 'sharp' / 'horizontal' / 'vertical' / 'top' / 'bottom' / 'left' / 'right' + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } +< +Alternatively, you can make fzf open in a tmux popup window (requires tmux 3.2 +or above) by putting fzf-tmux options in `tmux` key. +> + " See `man fzf-tmux` for available options + if exists('$TMUX') + let g:fzf_layout = { 'tmux': '-p90%,60%' } + else + let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } } + endif +< + +< Hide statusline >___________________________________________________________~ + *fzf-hide-statusline* + +When fzf starts in a terminal buffer, the file type of the buffer is set to +`fzf`. So you can set up `FileType fzf` autocmd to customize the settings of +the window. + +For example, if you open fzf on the bottom on the screen (e.g. `{'down': +'40%'}`), you might want to temporarily disable the statusline for a cleaner +look. +> + let g:fzf_layout = { 'down': '30%' } + autocmd! FileType fzf + autocmd FileType fzf set laststatus=0 noshowmode noruler + \| autocmd BufLeave set laststatus=2 showmode ruler +< + +LICENSE *fzf-license* +============================================================================== + +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi + +============================================================================== +vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap: diff --git a/.fzf/go.mod b/.fzf/go.mod new file mode 100644 index 0000000..d7c3b3c --- /dev/null +++ b/.fzf/go.mod @@ -0,0 +1,17 @@ +module github.com/junegunn/fzf + +require ( + github.com/gdamore/tcell v1.4.0 + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.14 + github.com/mattn/go-runewidth v0.0.13 + github.com/mattn/go-shellwords v1.0.12 + github.com/rivo/uniseg v0.2.0 + github.com/saracen/walker v0.1.2 + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c + golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 + golang.org/x/text v0.3.6 // indirect +) + +go 1.13 diff --git a/.fzf/go.sum b/.fzf/go.sum new file mode 100644 index 0000000..f1bb671 --- /dev/null +++ b/.fzf/go.sum @@ -0,0 +1,31 @@ +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU= +github.com/gdamore/tcell v1.4.0/go.mod h1:vxEiSDZdW3L+Uhjii9c3375IlDmR05bzxY404ZVSMo0= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/saracen/walker v0.1.2 h1:/o1TxP82n8thLvmL4GpJXduYaRmJ7qXp8u9dSlV0zmo= +github.com/saracen/walker v0.1.2/go.mod h1:0oKYMsKVhSJ+ful4p/XbjvXbMgLEkLITZaxozsl4CGE= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210317153231-de623e64d2a6 h1:EC6+IGYTjPpRfv9a2b/6Puw0W+hLtAhkV1tPsXhutqs= +golang.org/x/term v0.0.0-20210317153231-de623e64d2a6/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/.fzf/install b/.fzf/install new file mode 100755 index 0000000..f604dcf --- /dev/null +++ b/.fzf/install @@ -0,0 +1,382 @@ +#!/usr/bin/env bash + +set -u + +version=0.28.0 +auto_completion= +key_bindings= +update_config=2 +shells="bash zsh fish" +prefix='~/.fzf' +prefix_expand=~/.fzf +fish_dir=${XDG_CONFIG_HOME:-$HOME/.config}/fish + +help() { + cat << EOF +usage: $0 [OPTIONS] + + --help Show this message + --bin Download fzf binary only; Do not generate ~/.fzf.{bash,zsh} + --all Download fzf binary and update configuration files + to enable key bindings and fuzzy completion + --xdg Generate files under \$XDG_CONFIG_HOME/fzf + --[no-]key-bindings Enable/disable key bindings (CTRL-T, CTRL-R, ALT-C) + --[no-]completion Enable/disable fuzzy completion (bash & zsh) + --[no-]update-rc Whether or not to update shell configuration files + + --no-bash Do not set up bash configuration + --no-zsh Do not set up zsh configuration + --no-fish Do not set up fish configuration +EOF +} + +for opt in "$@"; do + case $opt in + --help) + help + exit 0 + ;; + --all) + auto_completion=1 + key_bindings=1 + update_config=1 + ;; + --xdg) + prefix='"${XDG_CONFIG_HOME:-$HOME/.config}"/fzf/fzf' + prefix_expand=${XDG_CONFIG_HOME:-$HOME/.config}/fzf/fzf + mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/fzf" + ;; + --key-bindings) key_bindings=1 ;; + --no-key-bindings) key_bindings=0 ;; + --completion) auto_completion=1 ;; + --no-completion) auto_completion=0 ;; + --update-rc) update_config=1 ;; + --no-update-rc) update_config=0 ;; + --bin) ;; + --no-bash) shells=${shells/bash/} ;; + --no-zsh) shells=${shells/zsh/} ;; + --no-fish) shells=${shells/fish/} ;; + *) + echo "unknown option: $opt" + help + exit 1 + ;; + esac +done + +cd "$(dirname "${BASH_SOURCE[0]}")" +fzf_base=$(pwd) +fzf_base_esc=$(printf %q "$fzf_base") + +ask() { + while true; do + read -p "$1 ([y]/n) " -r + REPLY=${REPLY:-"y"} + if [[ $REPLY =~ ^[Yy]$ ]]; then + return 1 + elif [[ $REPLY =~ ^[Nn]$ ]]; then + return 0 + fi + done +} + +check_binary() { + echo -n " - Checking fzf executable ... " + local output + output=$("$fzf_base"/bin/fzf --version 2>&1) + if [ $? -ne 0 ]; then + echo "Error: $output" + binary_error="Invalid binary" + else + output=${output/ */} + if [ "$version" != "$output" ]; then + echo "$output != $version" + binary_error="Invalid version" + else + echo "$output" + binary_error="" + return 0 + fi + fi + rm -f "$fzf_base"/bin/fzf + return 1 +} + +link_fzf_in_path() { + if which_fzf="$(command -v fzf)"; then + echo " - Found in \$PATH" + echo " - Creating symlink: bin/fzf -> $which_fzf" + (cd "$fzf_base"/bin && rm -f fzf && ln -sf "$which_fzf" fzf) + check_binary && return + fi + return 1 +} + +try_curl() { + command -v curl > /dev/null && + if [[ $1 =~ tar.gz$ ]]; then + curl -fL $1 | tar -xzf - + else + local temp=${TMPDIR:-/tmp}/fzf.zip + curl -fLo "$temp" $1 && unzip -o "$temp" && rm -f "$temp" + fi +} + +try_wget() { + command -v wget > /dev/null && + if [[ $1 =~ tar.gz$ ]]; then + wget -O - $1 | tar -xzf - + else + local temp=${TMPDIR:-/tmp}/fzf.zip + wget -O "$temp" $1 && unzip -o "$temp" && rm -f "$temp" + fi +} + +download() { + echo "Downloading bin/fzf ..." + if [ -x "$fzf_base"/bin/fzf ]; then + echo " - Already exists" + check_binary && return + fi + link_fzf_in_path && return + mkdir -p "$fzf_base"/bin && cd "$fzf_base"/bin + if [ $? -ne 0 ]; then + binary_error="Failed to create bin directory" + return + fi + + local url + url=https://github.com/junegunn/fzf/releases/download/$version/${1} + set -o pipefail + if ! (try_curl $url || try_wget $url); then + set +o pipefail + binary_error="Failed to download with curl and wget" + return + fi + set +o pipefail + + if [ ! -f fzf ]; then + binary_error="Failed to download ${1}" + return + fi + + chmod +x fzf && check_binary +} + +# Try to download binary executable +archi=$(uname -sm) +binary_available=1 +binary_error="" +case "$archi" in + Darwin\ arm64) download fzf-$version-darwin_arm64.zip ;; + Darwin\ x86_64) download fzf-$version-darwin_amd64.zip ;; + Linux\ armv5*) download fzf-$version-linux_armv5.tar.gz ;; + Linux\ armv6*) download fzf-$version-linux_armv6.tar.gz ;; + Linux\ armv7*) download fzf-$version-linux_armv7.tar.gz ;; + Linux\ armv8*) download fzf-$version-linux_arm64.tar.gz ;; + Linux\ aarch64*) download fzf-$version-linux_arm64.tar.gz ;; + Linux\ *64) download fzf-$version-linux_amd64.tar.gz ;; + FreeBSD\ *64) download fzf-$version-freebsd_amd64.tar.gz ;; + OpenBSD\ *64) download fzf-$version-openbsd_amd64.tar.gz ;; + CYGWIN*\ *64) download fzf-$version-windows_amd64.zip ;; + MINGW*\ *64) download fzf-$version-windows_amd64.zip ;; + MSYS*\ *64) download fzf-$version-windows_amd64.zip ;; + Windows*\ *64) download fzf-$version-windows_amd64.zip ;; + *) binary_available=0 binary_error=1 ;; +esac + +cd "$fzf_base" +if [ -n "$binary_error" ]; then + if [ $binary_available -eq 0 ]; then + echo "No prebuilt binary for $archi ..." + else + echo " - $binary_error !!!" + fi + if command -v go > /dev/null; then + echo -n "Building binary (go get -u github.com/junegunn/fzf) ... " + if [ -z "${GOPATH-}" ]; then + export GOPATH="${TMPDIR:-/tmp}/fzf-gopath" + mkdir -p "$GOPATH" + fi + if go get -ldflags "-s -w -X main.version=$version -X main.revision=go-get" github.com/junegunn/fzf; then + echo "OK" + cp "$GOPATH/bin/fzf" "$fzf_base/bin/" + else + echo "Failed to build binary. Installation failed." + exit 1 + fi + else + echo "go executable not found. Installation failed." + exit 1 + fi +fi + +[[ "$*" =~ "--bin" ]] && exit 0 + +for s in $shells; do + if ! command -v "$s" > /dev/null; then + shells=${shells/$s/} + fi +done + +if [[ ${#shells} -lt 3 ]]; then + echo "No shell configuration to be updated." + exit 0 +fi + +# Auto-completion +if [ -z "$auto_completion" ]; then + ask "Do you want to enable fuzzy auto-completion?" + auto_completion=$? +fi + +# Key-bindings +if [ -z "$key_bindings" ]; then + ask "Do you want to enable key bindings?" + key_bindings=$? +fi + +echo +for shell in $shells; do + [[ "$shell" = fish ]] && continue + src=${prefix_expand}.${shell} + echo -n "Generate $src ... " + + fzf_completion="[[ \$- == *i* ]] && source \"$fzf_base/shell/completion.${shell}\" 2> /dev/null" + if [ $auto_completion -eq 0 ]; then + fzf_completion="# $fzf_completion" + fi + + fzf_key_bindings="source \"$fzf_base/shell/key-bindings.${shell}\"" + if [ $key_bindings -eq 0 ]; then + fzf_key_bindings="# $fzf_key_bindings" + fi + + cat > "$src" << EOF +# Setup fzf +# --------- +if [[ ! "\$PATH" == *$fzf_base_esc/bin* ]]; then + export PATH="\${PATH:+\${PATH}:}$fzf_base/bin" +fi + +# Auto-completion +# --------------- +$fzf_completion + +# Key bindings +# ------------ +$fzf_key_bindings +EOF + echo "OK" +done + +# fish +if [[ "$shells" =~ fish ]]; then + echo -n "Update fish_user_paths ... " + fish << EOF + echo \$fish_user_paths | \grep "$fzf_base"/bin > /dev/null + or set --universal fish_user_paths \$fish_user_paths "$fzf_base"/bin +EOF + [ $? -eq 0 ] && echo "OK" || echo "Failed" + + mkdir -p "${fish_dir}/functions" + if [ -e "${fish_dir}/functions/fzf.fish" ]; then + echo -n "Remove unnecessary ${fish_dir}/functions/fzf.fish ... " + rm -f "${fish_dir}/functions/fzf.fish" && echo "OK" || echo "Failed" + fi + + fish_binding="${fish_dir}/functions/fzf_key_bindings.fish" + if [ $key_bindings -ne 0 ]; then + echo -n "Symlink $fish_binding ... " + ln -sf "$fzf_base/shell/key-bindings.fish" \ + "$fish_binding" && echo "OK" || echo "Failed" + else + echo -n "Removing $fish_binding ... " + rm -f "$fish_binding" + echo "OK" + fi +fi + +append_line() { + set -e + + local update line file pat lno + update="$1" + line="$2" + file="$3" + pat="${4:-}" + lno="" + + echo "Update $file:" + echo " - $line" + if [ -f "$file" ]; then + if [ $# -lt 4 ]; then + lno=$(\grep -nF "$line" "$file" | sed 's/:.*//' | tr '\n' ' ') + else + lno=$(\grep -nF "$pat" "$file" | sed 's/:.*//' | tr '\n' ' ') + fi + fi + if [ -n "$lno" ]; then + echo " - Already exists: line #$lno" + else + if [ $update -eq 1 ]; then + [ -f "$file" ] && echo >> "$file" + echo "$line" >> "$file" + echo " + Added" + else + echo " ~ Skipped" + fi + fi + echo + set +e +} + +create_file() { + local file="$1" + shift + echo "Create $file:" + for line in "$@"; do + echo " $line" + echo "$line" >> "$file" + done + echo +} + +if [ $update_config -eq 2 ]; then + echo + ask "Do you want to update your shell configuration files?" + update_config=$? +fi +echo +for shell in $shells; do + [[ "$shell" = fish ]] && continue + [ $shell = zsh ] && dest=${ZDOTDIR:-~}/.zshrc || dest=~/.bashrc + append_line $update_config "[ -f ${prefix}.${shell} ] && source ${prefix}.${shell}" "$dest" "${prefix}.${shell}" +done + +if [ $key_bindings -eq 1 ] && [[ "$shells" =~ fish ]]; then + bind_file="${fish_dir}/functions/fish_user_key_bindings.fish" + if [ ! -e "$bind_file" ]; then + create_file "$bind_file" \ + 'function fish_user_key_bindings' \ + ' fzf_key_bindings' \ + 'end' + else + append_line $update_config "fzf_key_bindings" "$bind_file" + fi +fi + +if [ $update_config -eq 1 ]; then + echo 'Finished. Restart your shell or reload config file.' + if [[ "$shells" =~ bash ]]; then + echo -n ' source ~/.bashrc # bash' + [[ "$archi" =~ Darwin ]] && echo -n ' (.bashrc should be loaded from .bash_profile)' + echo + fi + [[ "$shells" =~ zsh ]] && echo " source ${ZDOTDIR:-~}/.zshrc # zsh" + [[ "$shells" =~ fish ]] && [ $key_bindings -eq 1 ] && echo ' fzf_key_bindings # fish' + echo + echo 'Use uninstall script to remove fzf.' + echo +fi +echo 'For more information, see: https://github.com/junegunn/fzf' diff --git a/.fzf/install.ps1 b/.fzf/install.ps1 new file mode 100644 index 0000000..77af997 --- /dev/null +++ b/.fzf/install.ps1 @@ -0,0 +1,65 @@ +$version="0.28.0" + +$fzf_base=Split-Path -Parent $MyInvocation.MyCommand.Definition + +function check_binary () { + Write-Host " - Checking fzf executable ... " -NoNewline + $output=cmd /c $fzf_base\bin\fzf.exe --version 2>&1 + if (-not $?) { + Write-Host "Error: $output" + $binary_error="Invalid binary" + } else { + $output=(-Split $output)[0] + if ($version -ne $output) { + Write-Host "$output != $version" + $binary_error="Invalid version" + } else { + Write-Host "$output" + $binary_error="" + return 1 + } + } + Remove-Item "$fzf_base\bin\fzf.exe" + return 0 +} + +function download { + param($file) + Write-Host "Downloading bin/fzf ..." + if (Test-Path "$fzf_base\bin\fzf.exe") { + Write-Host " - Already exists" + if (check_binary) { + return + } + } + if (-not (Test-Path "$fzf_base\bin")) { + md "$fzf_base\bin" + } + if (-not $?) { + $binary_error="Failed to create bin directory" + return + } + cd "$fzf_base\bin" + $url="https://github.com/junegunn/fzf/releases/download/$version/$file" + $temp=$env:TMP + "\fzf.zip" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + if ($PSVersionTable.PSVersion.Major -ge 3) { + Invoke-WebRequest -Uri $url -OutFile $temp + } else { + (New-Object Net.WebClient).DownloadFile($url, $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$temp")) + } + if ($?) { + (Microsoft.PowerShell.Archive\Expand-Archive -Path $temp -DestinationPath .); (Remove-Item $temp) + } else { + $binary_error="Failed to download with powershell" + } + if (-not (Test-Path fzf.exe)) { + $binary_error="Failed to download $file" + return + } + echo y | icacls $fzf_base\bin\fzf.exe /grant Administrator:F ; check_binary >$null +} + +download "fzf-$version-windows_amd64.zip" + +Write-Host 'For more information, see: https://github.com/junegunn/fzf' diff --git a/.fzf/main.go b/.fzf/main.go new file mode 100644 index 0000000..83a9d58 --- /dev/null +++ b/.fzf/main.go @@ -0,0 +1,14 @@ +package main + +import ( + fzf "github.com/junegunn/fzf/src" + "github.com/junegunn/fzf/src/protector" +) + +var version string = "0.28" +var revision string = "devel" + +func main() { + protector.Protect() + fzf.Run(fzf.ParseOptions(), version, revision) +} diff --git a/.fzf/man/man1/fzf-tmux.1 b/.fzf/man/man1/fzf-tmux.1 new file mode 100644 index 0000000..7f1b36d --- /dev/null +++ b/.fzf/man/man1/fzf-tmux.1 @@ -0,0 +1,68 @@ +.ig +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi + +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. +.. +.TH fzf-tmux 1 "Nov 2021" "fzf 0.28.0" "fzf-tmux - open fzf in tmux split pane" + +.SH NAME +fzf-tmux - open fzf in tmux split pane + +.SH SYNOPSIS +.B fzf-tmux [LAYOUT OPTIONS] [--] [FZF OPTIONS] + +.SH DESCRIPTION +fzf-tmux is a wrapper script for fzf that opens fzf in a tmux split pane or in +a tmux popup window. It is designed to work just like fzf except that it does +not take up the whole screen. You can safely use fzf-tmux instead of fzf in +your scripts as the extra options will be silently ignored if you're not on +tmux. + +.SH LAYOUT OPTIONS + +(default layout: \fB-d 50%\fR) + +.SS Popup window +(requires tmux 3.2 or above) +.TP +.B "-p [WIDTH[%][,HEIGHT[%]]]" +.TP +.B "-w WIDTH[%]" +.TP +.B "-h WIDTH[%]" +.TP +.B "-x COL" +.TP +.B "-y ROW" + +.SS Split pane +.TP +.B "-u [height[%]]" +Split above (up) +.TP +.B "-d [height[%]]" +Split below (down) +.TP +.B "-l [width[%]]" +Split left +.TP +.B "-r [width[%]]" +Split right diff --git a/.fzf/man/man1/fzf.1 b/.fzf/man/man1/fzf.1 new file mode 100644 index 0000000..5f5eb91 --- /dev/null +++ b/.fzf/man/man1/fzf.1 @@ -0,0 +1,1001 @@ +.ig +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi + +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. +.. +.TH fzf 1 "Nov 2021" "fzf 0.28.0" "fzf - a command-line fuzzy finder" + +.SH NAME +fzf - a command-line fuzzy finder + +.SH SYNOPSIS +fzf [options] + +.SH DESCRIPTION +fzf is a general-purpose command-line fuzzy finder. + +.SH OPTIONS +.SS Search mode +.TP +.B "-x, --extended" +Extended-search mode. Since 0.10.9, this is enabled by default. You can disable +it with \fB+x\fR or \fB--no-extended\fR. +.TP +.B "-e, --exact" +Enable exact-match +.TP +.B "-i" +Case-insensitive match (default: smart-case match) +.TP +.B "+i" +Case-sensitive match +.TP +.B "--literal" +Do not normalize latin script letters for matching. +.TP +.BI "--algo=" TYPE +Fuzzy matching algorithm (default: v2) + +.br +.BR v2 " Optimal scoring algorithm (quality)" +.br +.BR v1 " Faster but not guaranteed to find the optimal result (performance)" +.br + +.TP +.BI "-n, --nth=" "N[,..]" +Comma-separated list of field index expressions for limiting search scope. +See \fBFIELD INDEX EXPRESSION\fR for the details. +.TP +.BI "--with-nth=" "N[,..]" +Transform the presentation of each line using field index expressions +.TP +.BI "-d, --delimiter=" "STR" +Field delimiter regex for \fB--nth\fR and \fB--with-nth\fR (default: AWK-style) +.TP +.BI "--disabled" +Do not perform search. With this option, fzf becomes a simple selector +interface rather than a "fuzzy finder". You can later enable the search using +\fBenable-search\fR or \fBtoggle-search\fR action. +.SS Search result +.TP +.B "+s, --no-sort" +Do not sort the result +.TP +.B "--tac" +Reverse the order of the input + +.RS +e.g. + \fBhistory | fzf --tac --no-sort\fR +.RE +.TP +.BI "--tiebreak=" "CRI[,..]" +Comma-separated list of sort criteria to apply when the scores are tied. +.br + +.br +.BR length " Prefers line with shorter length" +.br +.BR begin " Prefers line with matched substring closer to the beginning" +.br +.BR end " Prefers line with matched substring closer to the end" +.br +.BR index " Prefers line that appeared earlier in the input stream" +.br + +.br +- Each criterion should appear only once in the list +.br +- \fBindex\fR is only allowed at the end of the list +.br +- \fBindex\fR is implicitly appended to the list when not specified +.br +- Default is \fBlength\fR (or equivalently \fBlength\fR,index) +.br +- If \fBend\fR is found in the list, fzf will scan each line backwards +.SS Interface +.TP +.B "-m, --multi" +Enable multi-select with tab/shift-tab. It optionally takes an integer argument +which denotes the maximum number of items that can be selected. +.TP +.B "+m, --no-multi" +Disable multi-select +.TP +.B "--no-mouse" +Disable mouse +.TP +.BI "--bind=" "KEYBINDS" +Comma-separated list of custom key bindings. See \fBKEY/EVENT BINDINGS\fR for +the details. +.TP +.B "--cycle" +Enable cyclic scroll +.TP +.B "--keep-right" +Keep the right end of the line visible when it's too long. Effective only when +the query string is empty. +.TP +.BI "--scroll-off=" "LINES" +Number of screen lines to keep above or below when scrolling to the top or to +the bottom (default: 0). +.TP +.B "--no-hscroll" +Disable horizontal scroll +.TP +.BI "--hscroll-off=" "COLS" +Number of screen columns to keep to the right of the highlighted substring +(default: 10). Setting it to a large value will cause the text to be positioned +on the center of the screen. +.TP +.B "--filepath-word" +Make word-wise movements and actions respect path separators. The following +actions are affected: + +\fBbackward-kill-word\fR +.br +\fBbackward-word\fR +.br +\fBforward-word\fR +.br +\fBkill-word\fR +.TP +.BI "--jump-labels=" "CHARS" +Label characters for \fBjump\fR and \fBjump-accept\fR +.SS Layout +.TP +.BI "--height=" "HEIGHT[%]" +Display fzf window below the cursor with the given height instead of using +the full screen. +.TP +.BI "--min-height=" "HEIGHT" +Minimum height when \fB--height\fR is given in percent (default: 10). +Ignored when \fB--height\fR is not specified. +.TP +.BI "--layout=" "LAYOUT" +Choose the layout (default: default) + +.br +.BR default " Display from the bottom of the screen" +.br +.BR reverse " Display from the top of the screen" +.br +.BR reverse-list " Display from the top of the screen, prompt at the bottom" +.br + +.TP +.B "--reverse" +A synonym for \fB--layout=reverse\fB + +.TP +.BI "--border" [=STYLE] +Draw border around the finder + +.br +.BR rounded " Border with rounded corners (default)" +.br +.BR sharp " Border with sharp corners" +.br +.BR horizontal " Horizontal lines above and below the finder" +.br +.BR vertical " Vertical lines on each side of the finder" +.br +.BR top +.br +.BR bottom +.br +.BR left +.br +.BR right +.br +.BR none +.br + +.TP +.B "--no-unicode" +Use ASCII characters instead of Unicode box drawing characters to draw border + +.TP +.BI "--margin=" MARGIN +Comma-separated expression for margins around the finder. +.br + +.br +.RS +.BR TRBL " Same margin for top, right, bottom, and left" +.br +.BR TB,RL " Vertical, horizontal margin" +.br +.BR T,RL,B " Top, horizontal, bottom margin" +.br +.BR T,R,B,L " Top, right, bottom, left margin" +.br + +.br +Each part can be given in absolute number or in percentage relative to the +terminal size with \fB%\fR suffix. +.br + +.br +e.g. + \fBfzf --margin 10% + fzf --margin 1,5%\fR +.RE +.TP +.BI "--padding=" PADDING +Comma-separated expression for padding inside the border. Padding is +distinguishable from margin only when \fB--border\fR option is used. +.br + +.br +e.g. + \fBfzf --margin 5% --padding 5% --border --preview 'cat {}' \\ + --color bg:#222222,preview-bg:#333333\fR + +.br +.RS +.BR TRBL " Same padding for top, right, bottom, and left" +.br +.BR TB,RL " Vertical, horizontal padding" +.br +.BR T,RL,B " Top, horizontal, bottom padding" +.br +.BR T,R,B,L " Top, right, bottom, left padding" +.br +.RE + +.TP +.BI "--info=" "STYLE" +Determines the display style of finder info. + +.br +.BR default " Display on the next line to the prompt" +.br +.BR inline " Display on the same line" +.br +.BR hidden " Do not display finder info" +.br + +.TP +.B "--no-info" +A synonym for \fB--info=hidden\fB + +.TP +.BI "--prompt=" "STR" +Input prompt (default: '> ') +.TP +.BI "--pointer=" "STR" +Pointer to the current line (default: '>') +.TP +.BI "--marker=" "STR" +Multi-select marker (default: '>') +.TP +.BI "--header=" "STR" +The given string will be printed as the sticky header. The lines are displayed +in the given order from top to bottom regardless of \fB--layout\fR option, and +are not affected by \fB--with-nth\fR. ANSI color codes are processed even when +\fB--ansi\fR is not set. +.TP +.BI "--header-lines=" "N" +The first N lines of the input are treated as the sticky header. When +\fB--with-nth\fR is set, the lines are transformed just like the other +lines that follow. +.TP +.B "--header-first" +Print header before the prompt line +.SS Display +.TP +.B "--ansi" +Enable processing of ANSI color codes +.TP +.BI "--tabstop=" SPACES +Number of spaces for a tab character (default: 8) +.TP +.BI "--color=" "[BASE_SCHEME][,COLOR_NAME[:ANSI_COLOR][:ANSI_ATTRIBUTES]]..." +Color configuration. The name of the base color scheme is followed by custom +color mappings. + +.RS +.B BASE SCHEME: + (default: dark on 256-color terminal, otherwise 16) + + \fBdark \fRColor scheme for dark 256-color terminal + \fBlight \fRColor scheme for light 256-color terminal + \fB16 \fRColor scheme for 16-color terminal + \fBbw \fRNo colors (equivalent to \fB--no-color\fR) + +.B COLOR NAMES: + \fBfg \fRText + \fBbg \fRBackground + \fBpreview-fg \fRPreview window text + \fBpreview-bg \fRPreview window background + \fBhl \fRHighlighted substrings + \fBfg+ \fRText (current line) + \fBbg+ \fRBackground (current line) + \fBgutter \fRGutter on the left (defaults to \fBbg+\fR) + \fBhl+ \fRHighlighted substrings (current line) + \fBquery \fRQuery string + \fBdisabled \fRQuery string when search is disabled + \fBinfo \fRInfo line (match counters) + \fBborder \fRBorder around the window (\fB--border\fR and \fB--preview\fR) + \fBprompt \fRPrompt + \fBpointer \fRPointer to the current line + \fBmarker \fRMulti-select marker + \fBspinner \fRStreaming input indicator + \fBheader \fRHeader + +.B ANSI COLORS: + \fB-1 \fRDefault terminal foreground/background color + \fB \fR(or the original color of the text) + \fB0 ~ 15 \fR16 base colors + \fBblack\fR + \fBred\fR + \fBgreen\fR + \fByellow\fR + \fBblue\fR + \fBmagenta\fR + \fBcyan\fR + \fBwhite\fR + \fBbright-black\fR (gray | grey) + \fBbright-red\fR + \fBbright-green\fR + \fBbright-yellow\fR + \fBbright-blue\fR + \fBbright-magenta\fR + \fBbright-cyan\fR + \fBbright-white\fR + \fB16 ~ 255 \fRANSI 256 colors + \fB#rrggbb \fR24-bit colors + +.B ANSI ATTRIBUTES: (Only applies to foreground colors) + \fBregular \fRClears previously set attributes; should precede the other ones + \fBbold\fR + \fBunderline\fR + \fBreverse\fR + \fBdim\fR + \fBitalic\fR + +.B EXAMPLES: + + \fB# Seoul256 theme with 8-bit colors + # (https://github.com/junegunn/seoul256.vim) + fzf --color='bg:237,bg+:236,info:143,border:240,spinner:108' \\ + --color='hl:65,fg:252,header:65,fg+:252' \\ + --color='pointer:161,marker:168,prompt:110,hl+:108' + + # Seoul256 theme with 24-bit colors + fzf --color='bg:#4B4B4B,bg+:#3F3F3F,info:#BDBB72,border:#6B6B6B,spinner:#98BC99' \\ + --color='hl:#719872,fg:#D9D9D9,header:#719872,fg+:#D9D9D9' \\ + --color='pointer:#E12672,marker:#E17899,prompt:#98BEDE,hl+:#98BC99'\fR +.RE +.TP +.B "--no-bold" +Do not use bold text +.TP +.B "--black" +Use black background +.SS History +.TP +.BI "--history=" "HISTORY_FILE" +Load search history from the specified file and update the file on completion. +When enabled, \fBCTRL-N\fR and \fBCTRL-P\fR are automatically remapped to +\fBnext-history\fR and \fBprevious-history\fR. +.TP +.BI "--history-size=" "N" +Maximum number of entries in the history file (default: 1000). The file is +automatically truncated when the number of the lines exceeds the value. +.SS Preview +.TP +.BI "--preview=" "COMMAND" +Execute the given command for the current line and display the result on the +preview window. \fB{}\fR in the command is the placeholder that is replaced to +the single-quoted string of the current line. To transform the replacement +string, specify field index expressions between the braces (See \fBFIELD INDEX +EXPRESSION\fR for the details). + +.RS +e.g. + \fBfzf --preview='head -$LINES {}' + ls -l | fzf --preview="echo user={3} when={-4..-2}; cat {-1}" --header-lines=1\fR + +fzf exports \fB$FZF_PREVIEW_LINES\fR and \fB$FZF_PREVIEW_COLUMNS\fR so that +they represent the exact size of the preview window. (It also overrides +\fB$LINES\fR and \fB$COLUMNS\fR with the same values but they can be reset +by the default shell, so prefer to refer to the ones with \fBFZF_PREVIEW_\fR +prefix.) + +A placeholder expression starting with \fB+\fR flag will be replaced to the +space-separated list of the selected lines (or the current line if no selection +was made) individually quoted. + +e.g. + \fBfzf --multi --preview='head -10 {+}' + git log --oneline | fzf --multi --preview 'git show {+1}'\fR + +When using a field index expression, leading and trailing whitespace is stripped +from the replacement string. To preserve the whitespace, use the \fBs\fR flag. + +Also, \fB{q}\fR is replaced to the current query string, and \fB{n}\fR is +replaced to zero-based ordinal index of the line. Use \fB{+n}\fR if you want +all index numbers when multiple lines are selected. + +A placeholder expression with \fBf\fR flag is replaced to the path of +a temporary file that holds the evaluated list. This is useful when you +multi-select a large number of items and the length of the evaluated string may +exceed \fBARG_MAX\fR. + +e.g. + \fB# Press CTRL-A to select 100K items and see the sum of all the numbers. + # This won't work properly without 'f' flag due to ARG_MAX limit. + seq 100000 | fzf --multi --bind ctrl-a:select-all \\ + --preview "awk '{sum+=\$1} END {print sum}' {+f}"\fR + +Note that you can escape a placeholder pattern by prepending a backslash. + +Preview window will be updated even when there is no match for the current +query if any of the placeholder expressions evaluates to a non-empty string. + +Since 0.24.0, fzf can render partial preview content before the preview command +completes. ANSI escape sequence for clearing the display (\fBCSI 2 J\fR) is +supported, so you can use it to implement preview window that is constantly +updating. + +e.g. + \fBfzf --preview 'for i in $(seq 100000); do + (( i % 200 == 0 )) && printf "\\033[2J" + echo "$i" + sleep 0.01 + done'\fR +.RE +.TP +.BI "--preview-window=" "[POSITION][,SIZE[%]][,border-BORDER_OPT][,[no]wrap][,[no]follow][,[no]cycle][,[no]hidden][,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES][,default]" + +.RS +.B POSITION: (default: right) + \fBup + \fBdown + \fBleft + \fBright + +\fRDetermines the layout of the preview window. + +* If the argument contains \fB:hidden\fR, the preview window will be hidden by +default until \fBtoggle-preview\fR action is triggered. + +* If size is given as 0, preview window will not be visible, but fzf will still +execute the command in the background. + +* Long lines are truncated by default. Line wrap can be enabled with +\fB:wrap\fR flag. + +* Preview window will automatically scroll to the bottom when \fB:follow\fR +flag is set, similarly to how \fBtail -f\fR works. + +.RS +e.g. + \fBfzf --preview-window follow --preview 'for i in $(seq 100000); do + echo "$i" + sleep 0.01 + (( i % 300 == 0 )) && printf "\\033[2J" + done'\fR +.RE + +* Cyclic scrolling is enabled with \fB:cycle\fR flag. + +* To change the style of the border of the preview window, specify one of +the options for \fB--border\fR with \fBborder-\fR prefix. +e.g. \fBborder-rounded\fR (border with rounded edges, default), +\fBborder-sharp\fR (border with sharp edges), \fBborder-left\fR, +\fBborder-none\fR, etc. + +* \fB[:+SCROLL[OFFSETS][/DENOM]]\fR determines the initial scroll offset of the +preview window. + + - \fBSCROLL\fR can be either a numeric integer or a single-field index expression that refers to a numeric integer. + + - The optional \fBOFFSETS\fR part is for adjusting the base offset. It should be given as a series of signed integers (\fB-INTEGER\fR or \fB+INTEGER\fR). + + - The final \fB/DENOM\fR part is for specifying a fraction of the preview window height. + +* \fB~HEADER_LINES\fR keeps the top N lines as the fixed header so that they +are always visible. + +* \fBdefault\fR resets all options previously set to the default. + +.RS +e.g. + \fB# Non-default scroll window positions and sizes + fzf --preview="head {}" --preview-window=up,30% + fzf --preview="file {}" --preview-window=down,1 + + # Initial scroll offset is set to the line number of each line of + # git grep output *minus* 5 lines (-5) + git grep --line-number '' | + fzf --delimiter : --preview 'nl {1}' --preview-window '+{2}-5' + + # Preview with bat, matching line in the middle of the window below + # the fixed header of the top 3 lines + # + # ~3 Top 3 lines as the fixed header + # +{2} Base scroll offset extracted from the second field + # +3 Extra offset to compensate for the 3-line header + # /2 Put in the middle of the preview area + # + git grep --line-number '' | + fzf --delimiter : \\ + --preview 'bat --style=full --color=always --highlight-line {2} {1}' \\ + --preview-window '~3,+{2}+3/2' + + # Display top 3 lines as the fixed header + fzf --preview 'bat --style=full --color=always {}' --preview-window '~3'\fR +.RE + +.SS Scripting +.TP +.BI "-q, --query=" "STR" +Start the finder with the given query +.TP +.B "-1, --select-1" +If there is only one match for the initial query (\fB--query\fR), do not start +interactive finder and automatically select the only match +.TP +.B "-0, --exit-0" +If there is no match for the initial query (\fB--query\fR), do not start +interactive finder and exit immediately +.TP +.BI "-f, --filter=" "STR" +Filter mode. Do not start interactive finder. When used with \fB--no-sort\fR, +fzf becomes a fuzzy-version of grep. +.TP +.B "--print-query" +Print query as the first line +.TP +.BI "--expect=" "KEY[,..]" +Comma-separated list of keys that can be used to complete fzf in addition to +the default enter key. When this option is set, fzf will print the name of the +key pressed as the first line of its output (or as the second line if +\fB--print-query\fR is also used). The line will be empty if fzf is completed +with the default enter key. If \fB--expect\fR option is specified multiple +times, fzf will expect the union of the keys. \fB--no-expect\fR will clear the +list. + +.RS +e.g. + \fBfzf --expect=ctrl-v,ctrl-t,alt-s --expect=f1,f2,~,@\fR +.RE +.TP +.B "--read0" +Read input delimited by ASCII NUL characters instead of newline characters +.TP +.B "--print0" +Print output delimited by ASCII NUL characters instead of newline characters +.TP +.B "--no-clear" +Do not clear finder interface on exit. If fzf was started in full screen mode, +it will not switch back to the original screen, so you'll have to manually run +\fBtput rmcup\fR to return. This option can be used to avoid flickering of the +screen when your application needs to start fzf multiple times in order. +.TP +.B "--sync" +Synchronous search for multi-staged filtering. If specified, fzf will launch +ncurses finder only after the input stream is complete. + +.RS +e.g. \fBfzf --multi | fzf --sync\fR +.RE +.TP +.B "--version" +Display version information and exit + +.TP +Note that most options have the opposite versions with \fB--no-\fR prefix. + +.SH ENVIRONMENT VARIABLES +.TP +.B FZF_DEFAULT_COMMAND +Default command to use when input is tty. On *nix systems, fzf runs the command +with \fB$SHELL -c\fR if \fBSHELL\fR is set, otherwise with \fBsh -c\fR, so in +this case make sure that the command is POSIX-compliant. +.TP +.B FZF_DEFAULT_OPTS +Default options. e.g. \fBexport FZF_DEFAULT_OPTS="--extended --cycle"\fR + +.SH EXIT STATUS +.BR 0 " Normal exit" +.br +.BR 1 " No match" +.br +.BR 2 " Error" +.br +.BR 130 " Interrupted with \fBCTRL-C\fR or \fBESC\fR" + +.SH FIELD INDEX EXPRESSION + +A field index expression can be a non-zero integer or a range expression +([BEGIN]..[END]). \fB--nth\fR and \fB--with-nth\fR take a comma-separated list +of field index expressions. + +.SS Examples +.BR 1 " The 1st field" +.br +.BR 2 " The 2nd field" +.br +.BR -1 " The last field" +.br +.BR -2 " The 2nd to last field" +.br +.BR 3..5 " From the 3rd field to the 5th field" +.br +.BR 2.. " From the 2nd field to the last field" +.br +.BR ..-3 " From the 1st field to the 3rd to the last field" +.br +.BR .. " All the fields" +.br + +.SH EXTENDED SEARCH MODE + +Unless specified otherwise, fzf will start in "extended-search mode". In this +mode, you can specify multiple patterns delimited by spaces, such as: \fB'wild +^music .mp3$ sbtrkt !rmx\fR + +You can prepend a backslash to a space (\fB\\ \fR) to match a literal space +character. + +.SS Exact-match (quoted) +A term that is prefixed by a single-quote character (\fB'\fR) is interpreted as +an "exact-match" (or "non-fuzzy") term. fzf will search for the exact +occurrences of the string. + +.SS Anchored-match +A term can be prefixed by \fB^\fR, or suffixed by \fB$\fR to become an +anchored-match term. Then fzf will search for the lines that start with or end +with the given string. An anchored-match term is also an exact-match term. + +.SS Negation +If a term is prefixed by \fB!\fR, fzf will exclude the lines that satisfy the +term from the result. In this case, fzf performs exact match by default. + +.SS Exact-match by default +If you don't prefer fuzzy matching and do not wish to "quote" (prefixing with +\fB'\fR) every word, start fzf with \fB-e\fR or \fB--exact\fR option. Note that +when \fB--exact\fR is set, \fB'\fR-prefix "unquotes" the term. + +.SS OR operator +A single bar character term acts as an OR operator. For example, the following +query matches entries that start with \fBcore\fR and end with either \fBgo\fR, +\fBrb\fR, or \fBpy\fR. + +e.g. \fB^core go$ | rb$ | py$\fR + +.SH KEY/EVENT BINDINGS +\fB--bind\fR option allows you to bind \fBa key\fR or \fBan event\fR to one or +more \fBactions\fR. You can use it to customize key bindings or implement +dynamic behaviors. + +\fB--bind\fR takes a comma-separated list of binding expressions. Each binding +expression is \fBKEY:ACTION\fR or \fBEVENT:ACTION\fR. + +e.g. + \fBfzf --bind=ctrl-j:accept,ctrl-k:kill-line\fR + +.SS AVAILABLE KEYS: (SYNONYMS) +\fIctrl-[a-z]\fR +.br +\fIctrl-space\fR +.br +\fIctrl-\\\fR +.br +\fIctrl-]\fR +.br +\fIctrl-^\fR (\fIctrl-6\fR) +.br +\fIctrl-/\fR (\fIctrl-_\fR) +.br +\fIctrl-alt-[a-z]\fR +.br +\fIalt-[*]\fR (Any case-sensitive single character is allowed) +.br +\fIf[1-12]\fR +.br +\fIenter\fR (\fIreturn\fR \fIctrl-m\fR) +.br +\fIspace\fR +.br +\fIbspace\fR (\fIbs\fR) +.br +\fIalt-up\fR +.br +\fIalt-down\fR +.br +\fIalt-left\fR +.br +\fIalt-right\fR +.br +\fIalt-enter\fR +.br +\fIalt-space\fR +.br +\fIalt-bspace\fR (\fIalt-bs\fR) +.br +\fItab\fR +.br +\fIbtab\fR (\fIshift-tab\fR) +.br +\fIesc\fR +.br +\fIdel\fR +.br +\fIup\fR +.br +\fIdown\fR +.br +\fIleft\fR +.br +\fIright\fR +.br +\fIhome\fR +.br +\fIend\fR +.br +\fIinsert\fR +.br +\fIpgup\fR (\fIpage-up\fR) +.br +\fIpgdn\fR (\fIpage-down\fR) +.br +\fIshift-up\fR +.br +\fIshift-down\fR +.br +\fIshift-left\fR +.br +\fIshift-right\fR +.br +\fIalt-shift-up\fR +.br +\fIalt-shift-down\fR +.br +\fIalt-shift-left\fR +.br +\fIalt-shift-right\fR +.br +\fIleft-click\fR +.br +\fIright-click\fR +.br +\fIdouble-click\fR +.br +or any single character + +.SS AVAILABLE EVENTS: +\fIchange\fR +.RS +Triggered whenever the query string is changed + +e.g. + \fB# Move cursor to the first entry whenever the query is changed + fzf --bind change:first\fR +.RE + +\fIbackward-eof\fR +.RS +Triggered when the query string is already empty and you try to delete it +backward. + +e.g. + \fBfzf --bind backward-eof:abort\fR +.RE + +.SS AVAILABLE ACTIONS: +A key or an event can be bound to one or more of the following actions. + + \fBACTION: DEFAULT BINDINGS (NOTES): + \fBabort\fR \fIctrl-c ctrl-g ctrl-q esc\fR + \fBaccept\fR \fIenter double-click\fR + \fBaccept-non-empty\fR (same as \fBaccept\fR except that it prevents fzf from exiting without selection) + \fBbackward-char\fR \fIctrl-b left\fR + \fBbackward-delete-char\fR \fIctrl-h bspace\fR + \fBbackward-delete-char/eof\fR (same as \fBbackward-delete-char\fR except aborts fzf if query is empty) + \fBbackward-kill-word\fR \fIalt-bs\fR + \fBbackward-word\fR \fIalt-b shift-left\fR + \fBbeginning-of-line\fR \fIctrl-a home\fR + \fBcancel\fR (clear query string if not empty, abort fzf otherwise) + \fBchange-prompt(...)\fR (change prompt to the given string) + \fBclear-screen\fR \fIctrl-l\fR + \fBclear-selection\fR (clear multi-selection) + \fBclose\fR (close preview window if open, abort fzf otherwise) + \fBclear-query\fR (clear query string) + \fBdelete-char\fR \fIdel\fR + \fBdelete-char/eof\fR \fIctrl-d\fR (same as \fBdelete-char\fR except aborts fzf if query is empty) + \fBdeselect\fR + \fBdeselect-all\fR (deselect all matches) + \fBdisable-search\fR (disable search functionality) + \fBdown\fR \fIctrl-j ctrl-n down\fR + \fBenable-search\fR (enable search functionality) + \fBend-of-line\fR \fIctrl-e end\fR + \fBexecute(...)\fR (see below for the details) + \fBexecute-silent(...)\fR (see below for the details) + \fBfirst\fR (move to the first match) + \fBforward-char\fR \fIctrl-f right\fR + \fBforward-word\fR \fIalt-f shift-right\fR + \fBignore\fR + \fBjump\fR (EasyMotion-like 2-keystroke movement) + \fBjump-accept\fR (jump and accept) + \fBkill-line\fR + \fBkill-word\fR \fIalt-d\fR + \fBlast\fR (move to the last match) + \fBnext-history\fR (\fIctrl-n\fR on \fB--history\fR) + \fBpage-down\fR \fIpgdn\fR + \fBpage-up\fR \fIpgup\fR + \fBhalf-page-down\fR + \fBhalf-page-up\fR + \fBpreview(...)\fR (see below for the details) + \fBpreview-down\fR \fIshift-down\fR + \fBpreview-up\fR \fIshift-up\fR + \fBpreview-page-down\fR + \fBpreview-page-up\fR + \fBpreview-half-page-down\fR + \fBpreview-half-page-up\fR + \fBpreview-bottom\fR + \fBpreview-top\fR + \fBprevious-history\fR (\fIctrl-p\fR on \fB--history\fR) + \fBprint-query\fR (print query and exit) + \fBput\fR (put the character to the prompt) + \fBrefresh-preview\fR + \fBreload(...)\fR (see below for the details) + \fBreplace-query\fR (replace query string with the current selection) + \fBselect\fR + \fBselect-all\fR (select all matches) + \fBtoggle\fR (\fIright-click\fR) + \fBtoggle-all\fR (toggle all matches) + \fBtoggle+down\fR \fIctrl-i (tab)\fR + \fBtoggle-in\fR (\fB--layout=reverse*\fR ? \fBtoggle+up\fR : \fBtoggle+down\fR) + \fBtoggle-out\fR (\fB--layout=reverse*\fR ? \fBtoggle+down\fR : \fBtoggle+up\fR) + \fBtoggle-preview\fR + \fBtoggle-preview-wrap\fR + \fBtoggle-search\fR (toggle search functionality) + \fBtoggle-sort\fR + \fBtoggle+up\fR \fIbtab (shift-tab)\fR + \fBunbind(...)\fR (unbind bindings) + \fBunix-line-discard\fR \fIctrl-u\fR + \fBunix-word-rubout\fR \fIctrl-w\fR + \fBup\fR \fIctrl-k ctrl-p up\fR + \fByank\fR \fIctrl-y\fR + +.SS ACTION COMPOSITION + +Multiple actions can be chained using \fB+\fR separator. + +e.g. + \fBfzf --multi --bind 'ctrl-a:select-all+accept'\fR + \fBfzf --multi --bind 'ctrl-a:select-all' --bind 'ctrl-a:+accept'\fR + +.SS ACTION ARGUMENT + +An action denoted with \fB(...)\fR suffix takes an argument. + +e.g. + \fBfzf --bind 'ctrl-a:change-prompt(NewPrompt> )'\fR + \fBfzf --bind 'ctrl-v:preview(cat {})' --preview-window hidden\fR + +If the argument contains parentheses, fzf may fail to parse the expression. In +that case, you can use any of the following alternative notations to avoid +parse errors. + + \fBaction-name[...]\fR + \fBaction-name~...~\fR + \fBaction-name!...!\fR + \fBaction-name@...@\fR + \fBaction-name#...#\fR + \fBaction-name$...$\fR + \fBaction-name%...%\fR + \fBaction-name^...^\fR + \fBaction-name&...&\fR + \fBaction-name*...*\fR + \fBaction-name;...;\fR + \fBaction-name/.../\fR + \fBaction-name|...|\fR + \fBaction-name:...\fR +.RS +The last one is the special form that frees you from parse errors as it does +not expect the closing character. The catch is that it should be the last one +in the comma-separated list of key-action pairs. +.RE + +.SS COMMAND EXECUTION + +With \fBexecute(...)\fR action, you can execute arbitrary commands without +leaving fzf. For example, you can turn fzf into a simple file browser by +binding \fBenter\fR key to \fBless\fR command like follows. + + \fBfzf --bind "enter:execute(less {})"\fR + +You can use the same placeholder expressions as in \fB--preview\fR. + +fzf switches to the alternate screen when executing a command. However, if the +command is expected to complete quickly, and you are not interested in its +output, you might want to use \fBexecute-silent\fR instead, which silently +executes the command without the switching. Note that fzf will not be +responsive until the command is complete. For asynchronous execution, start +your command as a background process (i.e. appending \fB&\fR). + +On *nix systems, fzf runs the command with \fB$SHELL -c\fR if \fBSHELL\fR is +set, otherwise with \fBsh -c\fR, so in this case make sure that the command is +POSIX-compliant. + +.SS RELOAD INPUT + +\fBreload(...)\fR action is used to dynamically update the input list +without restarting fzf. It takes the same command template with placeholder +expressions as \fBexecute(...)\fR. + +See \fIhttps://github.com/junegunn/fzf/issues/1750\fR for more info. + +e.g. + \fB# Update the list of processes by pressing CTRL-R + ps -ef | fzf --bind 'ctrl-r:reload(ps -ef)' --header 'Press CTRL-R to reload' \\ + --header-lines=1 --layout=reverse + + # Integration with ripgrep + RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " + INITIAL_QUERY="foobar" + FZF_DEFAULT_COMMAND="$RG_PREFIX '$INITIAL_QUERY'" \\ + fzf --bind "change:reload:$RG_PREFIX {q} || true" \\ + --ansi --disabled --query "$INITIAL_QUERY"\fR + +.SS PREVIEW BINDING + +With \fBpreview(...)\fR action, you can specify multiple different preview +commands in addition to the default preview command given by \fB--preview\fR +option. + +e.g. + + # Default preview command with an extra preview binding + fzf --preview 'file {}' --bind '?:preview:cat {}' + + # A preview binding with no default preview command + # (Preview window is initially empty) + fzf --bind '?:preview:cat {}' + + # Preview window hidden by default, it appears when you first hit '?' + fzf --bind '?:preview:cat {}' --preview-window hidden + +.SH AUTHOR +Junegunn Choi (\fIjunegunn.c@gmail.com\fR) + +.SH SEE ALSO +.B Project homepage: +.RS +.I https://github.com/junegunn/fzf +.RE +.br + +.br +.B Extra Vim plugin: +.RS +.I https://github.com/junegunn/fzf.vim +.RE + +.SH LICENSE +MIT diff --git a/.fzf/plugin/fzf.vim b/.fzf/plugin/fzf.vim new file mode 100644 index 0000000..b17361d --- /dev/null +++ b/.fzf/plugin/fzf.vim @@ -0,0 +1,1048 @@ +" 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_fzf') + finish +endif +let g:loaded_fzf = 1 + +let s:is_win = has('win32') || has('win64') +if s:is_win && &shellslash + set noshellslash + let s:base_dir = expand(':h:h') + set shellslash +else + let s:base_dir = expand(':h:h') +endif +if s:is_win + let s:term_marker = '&::FZF' + + function! s:fzf_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction + + " Use utf-8 for fzf.vim commands + " Return array of shell commands for cmd.exe + function! s:enc_to_cp(str) + if !has('iconv') + return a:str + endif + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return iconv(a:str, &encoding, 'cp'.s:codepage) + endfunction + function! s:wrap_cmds(cmds) + return map([ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (has('gui_running') ? ['set TERM= > nul'] : []) + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'], + \ 'enc_to_cp(v:val."\r")') + endfunction +else + let s:term_marker = ";#FZF" + + function! s:fzf_call(fn, ...) + return call(a:fn, a:000) + endfunction + + function! s:wrap_cmds(cmds) + return a:cmds + endfunction + + function! s:enc_to_cp(str) + return a:str + endfunction +endif + +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! fzf#shellescape(arg, ...) + let shell = get(a:000, 0, s:is_win ? 'cmd.exe' : 'sh') + if shell =~# 'cmd.exe$' + return s:shellesc_cmd(a:arg) + endif + return s:fzf_call('shellescape', a:arg) +endfunction + +function! s:fzf_getcwd() + return s:fzf_call('getcwd') +endfunction + +function! s:fzf_fnamemodify(fname, mods) + return s:fzf_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:fzf_expand(fmt) + return s:fzf_call('expand', a:fmt, 1) +endfunction + +function! s:fzf_tempname() + return s:fzf_call('tempname') +endfunction + +let s:layout_keys = ['window', 'tmux', 'up', 'down', 'left', 'right'] +let s:fzf_go = s:base_dir.'/bin/fzf' +let s:fzf_tmux = s:base_dir.'/bin/fzf-tmux' + +let s:cpo_save = &cpo +set cpo&vim + +function! s:popup_support() + return has('nvim') ? has('nvim-0.4') : has('popupwin') && has('patch-8.2.191') +endfunction + +function! s:default_layout() + return s:popup_support() + \ ? { 'window' : { 'width': 0.9, 'height': 0.6 } } + \ : { 'down': '~40%' } +endfunction + +function! fzf#install() + if s:is_win && !has('win32unix') + let script = s:base_dir.'/install.ps1' + if !filereadable(script) + throw script.' not found' + endif + let script = 'powershell -ExecutionPolicy Bypass -file ' . script + else + let script = s:base_dir.'/install' + if !executable(script) + throw script.' not found' + endif + let script .= ' --bin' + endif + + call s:warn('Running fzf installer ...') + call system(script) + if v:shell_error + throw 'Failed to download fzf: '.script + endif +endfunction + +let s:versions = {} +function s:get_version(bin) + if has_key(s:versions, a:bin) + return s:versions[a:bin] + end + let command = a:bin . ' --version --no-height' + let output = systemlist(command) + if v:shell_error || empty(output) + return '' + endif + let ver = matchstr(output[-1], '[0-9.]\+') + let s:versions[a:bin] = ver + return ver +endfunction + +function! s:compare_versions(a, b) + let a = split(a:a, '\.') + let b = split(a:b, '\.') + for idx in range(0, max([len(a), len(b)]) - 1) + let v1 = str2nr(get(a, idx, 0)) + let v2 = str2nr(get(b, idx, 0)) + if v1 < v2 | return -1 + elseif v1 > v2 | return 1 + endif + endfor + return 0 +endfunction + +function! s:compare_binary_versions(a, b) + return s:compare_versions(s:get_version(a:a), s:get_version(a:b)) +endfunction + +let s:checked = {} +function! fzf#exec(...) + if !exists('s:exec') + let binaries = [] + if executable('fzf') + call add(binaries, 'fzf') + endif + if executable(s:fzf_go) + call add(binaries, s:fzf_go) + endif + + if empty(binaries) + if input('fzf executable not found. Download binary? (y/n) ') =~? '^y' + redraw + call fzf#install() + return fzf#exec() + else + redraw + throw 'fzf executable not found' + endif + elseif len(binaries) > 1 + call sort(binaries, 's:compare_binary_versions') + endif + + let s:exec = binaries[-1] + endif + + if a:0 && !has_key(s:checked, a:1) + let fzf_version = s:get_version(s:exec) + if empty(fzf_version) + let message = printf('Failed to run "%s --version"', s:exec) + unlet s:exec + throw message + end + + if s:compare_versions(fzf_version, a:1) >= 0 + let s:checked[a:1] = 1 + return s:exec + elseif a:0 < 2 && input(printf('You need fzf %s or above. Found: %s. Download binary? (y/n) ', a:1, fzf_version)) =~? '^y' + let s:versions = {} + unlet s:exec + redraw + call fzf#install() + return fzf#exec(a:1, 1) + else + throw printf('You need to upgrade fzf (required: %s or above)', a:1) + endif + endif + + return s:exec +endfunction + +function! s:tmux_enabled() + if has('gui_running') || !exists('$TMUX') + return 0 + endif + + if exists('s:tmux') + return s:tmux + endif + + let s:tmux = 0 + if !executable(s:fzf_tmux) + if executable('fzf-tmux') + let s:fzf_tmux = 'fzf-tmux' + else + return 0 + endif + endif + + let output = system('tmux -V') + let s:tmux = !v:shell_error && output >= 'tmux 1.7' + return s:tmux +endfunction + +function! s:escape(path) + let path = fnameescape(a:path) + return s:is_win ? escape(path, '$') : path +endfunction + +function! s:error(msg) + echohl ErrorMsg + echom a:msg + echohl None +endfunction + +function! s:warn(msg) + echohl WarningMsg + echom a:msg + echohl None +endfunction + +function! s:has_any(dict, keys) + for key in a:keys + if has_key(a:dict, key) + return 1 + endif + endfor + return 0 +endfunction + +function! s:open(cmd, target) + if stridx('edit', a:cmd) == 0 && s:fzf_fnamemodify(a:target, ':p') ==# s:fzf_expand('%:p') + return + endif + execute a:cmd s:escape(a:target) +endfunction + +function! s:common_sink(action, lines) abort + if len(a:lines) < 2 + return + endif + let key = remove(a:lines, 0) + let Cmd = get(a:action, key, 'e') + if type(Cmd) == type(function('call')) + return Cmd(a:lines) + endif + if len(a:lines) > 1 + augroup fzf_swap + autocmd SwapExists * let v:swapchoice='o' + \| call s:warn('fzf: E325: swap file exists: '.s:fzf_expand('')) + augroup END + endif + try + let empty = empty(s:fzf_expand('%')) && line('$') == 1 && empty(getline(1)) && !&modified + " Preserve the current working directory in case it's changed during + " the execution (e.g. `set autochdir` or `autocmd BufEnter * lcd ...`) + let cwd = exists('w:fzf_pushd') ? w:fzf_pushd.dir : expand('%:p:h') + for item in a:lines + if item[0] != '~' && item !~ (s:is_win ? '^[A-Z]:\' : '^/') + let sep = s:is_win ? '\' : '/' + let item = join([cwd, item], cwd[len(cwd)-1] == sep ? '' : sep) + endif + if empty + execute 'e' s:escape(item) + let empty = 0 + else + call s:open(Cmd, item) + endif + if !has('patch-8.0.0177') && !has('nvim-0.2') && exists('#BufEnter') + \ && isdirectory(item) + doautocmd BufEnter + endif + endfor + catch /^Vim:Interrupt$/ + finally + silent! autocmd! fzf_swap + endtry +endfunction + +function! s:get_color(attr, ...) + let gui = !s:is_win && !has('win32unix') && has('termguicolors') && &termguicolors + let fam = gui ? 'gui' : 'cterm' + let pat = gui ? '^#[a-f0-9]\+' : '^[0-9]\+$' + for group in a:000 + let code = synIDattr(synIDtrans(hlID(group)), a:attr, fam) + if code =~? pat + return code + endif + endfor + return '' +endfunction + +function! s:defaults() + let rules = copy(get(g:, 'fzf_colors', {})) + let colors = join(map(items(filter(map(rules, 'call("s:get_color", v:val)'), '!empty(v:val)')), 'join(v:val, ":")'), ',') + return empty(colors) ? '' : fzf#shellescape('--color='.colors) +endfunction + +function! s:validate_layout(layout) + for key in keys(a:layout) + if index(s:layout_keys, key) < 0 + throw printf('Invalid entry in g:fzf_layout: %s (allowed: %s)%s', + \ key, join(s:layout_keys, ', '), key == 'options' ? '. Use $FZF_DEFAULT_OPTS.' : '') + endif + endfor + return a:layout +endfunction + +function! s:evaluate_opts(options) + return type(a:options) == type([]) ? + \ join(map(copy(a:options), 'fzf#shellescape(v:val)')) : a:options +endfunction + +" [name string,] [opts dict,] [fullscreen boolean] +function! fzf#wrap(...) + let args = ['', {}, 0] + let expects = map(copy(args), 'type(v:val)') + let tidx = 0 + for arg in copy(a:000) + let tidx = index(expects, type(arg) == 6 ? type(0) : type(arg), tidx) + if tidx < 0 + throw 'Invalid arguments (expected: [name string] [opts dict] [fullscreen boolean])' + endif + let args[tidx] = arg + let tidx += 1 + unlet arg + endfor + let [name, opts, bang] = args + + if len(name) + let opts.name = name + end + + " Layout: g:fzf_layout (and deprecated g:fzf_height) + if bang + for key in s:layout_keys + if has_key(opts, key) + call remove(opts, key) + endif + endfor + elseif !s:has_any(opts, s:layout_keys) + if !exists('g:fzf_layout') && exists('g:fzf_height') + let opts.down = g:fzf_height + else + let opts = extend(opts, s:validate_layout(get(g:, 'fzf_layout', s:default_layout()))) + endif + endif + + " Colors: g:fzf_colors + let opts.options = s:defaults() .' '. s:evaluate_opts(get(opts, 'options', '')) + + " History: g:fzf_history_dir + if len(name) && len(get(g:, 'fzf_history_dir', '')) + let dir = s:fzf_expand(g:fzf_history_dir) + if !isdirectory(dir) + call mkdir(dir, 'p') + endif + let history = fzf#shellescape(dir.'/'.name) + let opts.options = join(['--history', history, opts.options]) + endif + + " Action: g:fzf_action + if !s:has_any(opts, ['sink', 'sinklist', 'sink*']) + let opts._action = get(g:, 'fzf_action', s:default_action) + let opts.options .= ' --expect='.join(keys(opts._action), ',') + function! opts.sinklist(lines) abort + return s:common_sink(self._action, a:lines) + endfunction + let opts['sink*'] = opts.sinklist " For backward compatibility + endif + + return opts +endfunction + +function! s:use_sh() + let [shell, shellslash, shellcmdflag, shellxquote] = [&shell, &shellslash, &shellcmdflag, &shellxquote] + if s:is_win + set shell=cmd.exe + set noshellslash + let &shellcmdflag = has('nvim') ? '/s /c' : '/c' + let &shellxquote = has('nvim') ? '"' : '(' + else + set shell=sh + endif + return [shell, shellslash, shellcmdflag, shellxquote] +endfunction + +function! fzf#run(...) abort +try + let [shell, shellslash, shellcmdflag, shellxquote] = s:use_sh() + + let dict = exists('a:1') ? copy(a:1) : {} + let temps = { 'result': s:fzf_tempname() } + let optstr = s:evaluate_opts(get(dict, 'options', '')) + try + let fzf_exec = fzf#shellescape(fzf#exec()) + catch + throw v:exception + endtry + + if !s:present(dict, 'dir') + let dict.dir = s:fzf_getcwd() + endif + if has('win32unix') && s:present(dict, 'dir') + let dict.dir = fnamemodify(dict.dir, ':p') + endif + + if has_key(dict, 'source') + let source = remove(dict, 'source') + let type = type(source) + if type == 1 + let source_command = source + elseif type == 3 + let temps.input = s:fzf_tempname() + call writefile(source, temps.input) + let source_command = (s:is_win ? 'type ' : 'cat ').fzf#shellescape(temps.input) + else + throw 'Invalid source type' + endif + else + let source_command = '' + endif + + let prefer_tmux = get(g:, 'fzf_prefer_tmux', 0) || has_key(dict, 'tmux') + let use_height = has_key(dict, 'down') && !has('gui_running') && + \ !(has('nvim') || s:is_win || has('win32unix') || s:present(dict, 'up', 'left', 'right', 'window')) && + \ executable('tput') && filereadable('/dev/tty') + let has_vim8_term = has('terminal') && has('patch-8.0.995') + let has_nvim_term = has('nvim-0.2.1') || has('nvim') && !s:is_win + let use_term = has_nvim_term || + \ has_vim8_term && !has('win32unix') && (has('gui_running') || s:is_win || s:present(dict, 'down', 'up', 'left', 'right', 'window')) + let use_tmux = (has_key(dict, 'tmux') || (!use_height && !use_term || prefer_tmux) && !has('win32unix') && s:splittable(dict)) && s:tmux_enabled() + if prefer_tmux && use_tmux + let use_height = 0 + let use_term = 0 + endif + if use_term + let optstr .= ' --no-height' + elseif use_height + let height = s:calc_size(&lines, dict.down, dict) + let optstr .= ' --height='.height + endif + let optstr .= s:border_opt(get(dict, 'window', 0)) + let prev_default_command = $FZF_DEFAULT_COMMAND + if len(source_command) + let $FZF_DEFAULT_COMMAND = source_command + endif + let command = (use_tmux ? s:fzf_tmux(dict) : fzf_exec).' '.optstr.' > '.temps.result + + if use_term + return s:execute_term(dict, command, temps) + endif + + let lines = use_tmux ? s:execute_tmux(dict, command, temps) + \ : s:execute(dict, command, use_height, temps) + call s:callback(dict, lines) + return lines +finally + if len(source_command) + if len(prev_default_command) + let $FZF_DEFAULT_COMMAND = prev_default_command + else + let $FZF_DEFAULT_COMMAND = '' + silent! execute 'unlet $FZF_DEFAULT_COMMAND' + endif + endif + let [&shell, &shellslash, &shellcmdflag, &shellxquote] = [shell, shellslash, shellcmdflag, shellxquote] +endtry +endfunction + +function! s:present(dict, ...) + for key in a:000 + if !empty(get(a:dict, key, '')) + return 1 + endif + endfor + return 0 +endfunction + +function! s:fzf_tmux(dict) + let size = get(a:dict, 'tmux', '') + if empty(size) + for o in ['up', 'down', 'left', 'right'] + if s:present(a:dict, o) + let spec = a:dict[o] + if (o == 'up' || o == 'down') && spec[0] == '~' + let size = '-'.o[0].s:calc_size(&lines, spec, a:dict) + else + " Legacy boolean option + let size = '-'.o[0].(spec == 1 ? '' : substitute(spec, '^\~', '', '')) + endif + break + endif + endfor + endif + return printf('LINES=%d COLUMNS=%d %s %s - --', + \ &lines, &columns, fzf#shellescape(s:fzf_tmux), size) +endfunction + +function! s:splittable(dict) + return s:present(a:dict, 'up', 'down') && &lines > 15 || + \ s:present(a:dict, 'left', 'right') && &columns > 40 +endfunction + +function! s:pushd(dict) + if s:present(a:dict, 'dir') + let cwd = s:fzf_getcwd() + let w:fzf_pushd = { + \ 'command': haslocaldir() ? 'lcd' : (exists(':tcd') && haslocaldir(-1) ? 'tcd' : 'cd'), + \ 'origin': cwd, + \ 'bufname': bufname('') + \ } + execute 'lcd' s:escape(a:dict.dir) + let cwd = s:fzf_getcwd() + let w:fzf_pushd.dir = cwd + let a:dict.pushd = w:fzf_pushd + return cwd + endif + return '' +endfunction + +augroup fzf_popd + autocmd! + autocmd WinEnter * call s:dopopd() +augroup END + +function! s:dopopd() + if !exists('w:fzf_pushd') + return + endif + + " FIXME: We temporarily change the working directory to 'dir' entry + " of options dictionary (set to the current working directory if not given) + " before running fzf. + " + " e.g. call fzf#run({'dir': '/tmp', 'source': 'ls', 'sink': 'e'}) + " + " After processing the sink function, we have to restore the current working + " directory. But doing so may not be desirable if the function changed the + " working directory on purpose. + " + " So how can we tell if we should do it or not? A simple heuristic we use + " here is that we change directory only if the current working directory + " matches 'dir' entry. However, it is possible that the sink function did + " change the directory to 'dir'. In that case, the user will have an + " unexpected result. + if s:fzf_getcwd() ==# w:fzf_pushd.dir && (!&autochdir || w:fzf_pushd.bufname ==# bufname('')) + execute w:fzf_pushd.command s:escape(w:fzf_pushd.origin) + endif + unlet! w:fzf_pushd +endfunction + +function! s:xterm_launcher() + let fmt = 'xterm -T "[fzf]" -bg "%s" -fg "%s" -geometry %dx%d+%d+%d -e bash -ic %%s' + if has('gui_macvim') + let fmt .= '&& osascript -e "tell application \"MacVim\" to activate"' + endif + return printf(fmt, + \ escape(synIDattr(hlID("Normal"), "bg"), '#'), escape(synIDattr(hlID("Normal"), "fg"), '#'), + \ &columns, &lines/2, getwinposx(), getwinposy()) +endfunction +unlet! s:launcher +if s:is_win || has('win32unix') + let s:launcher = '%s' +else + let s:launcher = function('s:xterm_launcher') +endif + +function! s:exit_handler(code, command, ...) + if a:code == 130 + return 0 + elseif has('nvim') && a:code == 129 + " When deleting the terminal buffer while fzf is still running, + " Nvim sends SIGHUP. + return 0 + elseif a:code > 1 + call s:error('Error running ' . a:command) + if !empty(a:000) + sleep + endif + return 0 + endif + return 1 +endfunction + +function! s:execute(dict, command, use_height, temps) abort + call s:pushd(a:dict) + if has('unix') && !a:use_height + silent! !clear 2> /dev/null + endif + let escaped = (a:use_height || s:is_win) ? a:command : escape(substitute(a:command, '\n', '\\n', 'g'), '%#!') + if has('gui_running') + let Launcher = get(a:dict, 'launcher', get(g:, 'Fzf_launcher', get(g:, 'fzf_launcher', s:launcher))) + let fmt = type(Launcher) == 2 ? call(Launcher, []) : Launcher + if has('unix') + let escaped = "'".substitute(escaped, "'", "'\"'\"'", 'g')."'" + endif + let command = printf(fmt, escaped) + else + let command = escaped + endif + if s:is_win + let batchfile = s:fzf_tempname().'.bat' + call writefile(s:wrap_cmds(command), batchfile) + let command = batchfile + let a:temps.batchfile = batchfile + if has('nvim') + let fzf = {} + let fzf.dict = a:dict + let fzf.temps = a:temps + function! fzf.on_exit(job_id, exit_status, event) dict + call s:pushd(self.dict) + let lines = s:collect(self.temps) + call s:callback(self.dict, lines) + endfunction + let cmd = 'start /wait cmd /c '.command + call jobstart(cmd, fzf) + return [] + endif + elseif has('win32unix') && $TERM !=# 'cygwin' + let shellscript = s:fzf_tempname() + call writefile([command], shellscript) + let command = 'cmd.exe /C '.fzf#shellescape('set "TERM=" & start /WAIT sh -c '.shellscript) + let a:temps.shellscript = shellscript + endif + if a:use_height + call system(printf('tput cup %d > /dev/tty; tput cnorm > /dev/tty; %s < /dev/tty 2> /dev/tty', &lines, command)) + else + execute 'silent !'.command + endif + let exit_status = v:shell_error + redraw! + let lines = s:collect(a:temps) + return s:exit_handler(exit_status, command) ? lines : [] +endfunction + +function! s:execute_tmux(dict, command, temps) abort + let command = a:command + let cwd = s:pushd(a:dict) + if len(cwd) + " -c '#{pane_current_path}' is only available on tmux 1.9 or above + let command = join(['cd', fzf#shellescape(cwd), '&&', command]) + endif + + call system(command) + let exit_status = v:shell_error + redraw! + let lines = s:collect(a:temps) + return s:exit_handler(exit_status, command) ? lines : [] +endfunction + +function! s:calc_size(max, val, dict) + let val = substitute(a:val, '^\~', '', '') + if val =~ '%$' + let size = a:max * str2nr(val[:-2]) / 100 + else + let size = min([a:max, str2nr(val)]) + endif + + let srcsz = -1 + if type(get(a:dict, 'source', 0)) == type([]) + let srcsz = len(a:dict.source) + endif + + let opts = $FZF_DEFAULT_OPTS.' '.s:evaluate_opts(get(a:dict, 'options', '')) + if opts =~ 'preview' + return size + endif + let margin = match(opts, '--inline-info\|--info[^-]\{-}inline') > match(opts, '--no-inline-info\|--info[^-]\{-}\(default\|hidden\)') ? 1 : 2 + let margin += stridx(opts, '--border') > stridx(opts, '--no-border') ? 2 : 0 + if stridx(opts, '--header') > stridx(opts, '--no-header') + let margin += len(split(opts, "\n")) + endif + return srcsz >= 0 ? min([srcsz + margin, size]) : size +endfunction + +function! s:getpos() + return {'tab': tabpagenr(), 'win': winnr(), 'winid': win_getid(), 'cnt': winnr('$'), 'tcnt': tabpagenr('$')} +endfunction + +function! s:border_opt(window) + if type(a:window) != type({}) + return '' + endif + + " Border style + let style = tolower(get(a:window, 'border', 'rounded')) + if !has_key(a:window, 'border') && !get(a:window, 'rounded', 1) + let style = 'sharp' + endif + if style == 'none' || style == 'no' + return '' + endif + + " For --border styles, we need fzf 0.24.0 or above + call fzf#exec('0.24.0') + let opt = ' --border=' . style + if has_key(a:window, 'highlight') + let color = s:get_color('fg', a:window.highlight) + if len(color) + let opt .= ' --color=border:' . color + endif + endif + return opt +endfunction + +function! s:split(dict) + let directions = { + \ 'up': ['topleft', 'resize', &lines], + \ 'down': ['botright', 'resize', &lines], + \ 'left': ['vertical topleft', 'vertical resize', &columns], + \ 'right': ['vertical botright', 'vertical resize', &columns] } + let ppos = s:getpos() + let is_popup = 0 + try + if s:present(a:dict, 'window') + if type(a:dict.window) == type({}) + if !s:popup_support() + throw 'Nvim 0.4+ or Vim 8.2.191+ with popupwin feature is required for pop-up window' + end + call s:popup(a:dict.window) + let is_popup = 1 + else + execute 'keepalt' a:dict.window + endif + elseif !s:splittable(a:dict) + execute (tabpagenr()-1).'tabnew' + else + for [dir, triple] in items(directions) + let val = get(a:dict, dir, '') + if !empty(val) + let [cmd, resz, max] = triple + if (dir == 'up' || dir == 'down') && val[0] == '~' + let sz = s:calc_size(max, val, a:dict) + else + let sz = s:calc_size(max, val, {}) + endif + execute cmd sz.'new' + execute resz sz + return [ppos, {}, is_popup] + endif + endfor + endif + return [ppos, is_popup ? {} : { '&l:wfw': &l:wfw, '&l:wfh': &l:wfh }, is_popup] + finally + if !is_popup + setlocal winfixwidth winfixheight + endif + endtry +endfunction + +nnoremap (fzf-insert) i +nnoremap (fzf-normal) +if exists(':tnoremap') + tnoremap (fzf-insert) i + tnoremap (fzf-normal) +endif + +function! s:execute_term(dict, command, temps) abort + let winrest = winrestcmd() + let pbuf = bufnr('') + let [ppos, winopts, is_popup] = s:split(a:dict) + call s:use_sh() + let b:fzf = a:dict + let fzf = { 'buf': bufnr(''), 'pbuf': pbuf, 'ppos': ppos, 'dict': a:dict, 'temps': a:temps, + \ 'winopts': winopts, 'winrest': winrest, 'lines': &lines, + \ 'columns': &columns, 'command': a:command } + function! fzf.switch_back(inplace) + if a:inplace && bufnr('') == self.buf + if bufexists(self.pbuf) + execute 'keepalt keepjumps b' self.pbuf + endif + " No other listed buffer + if bufnr('') == self.buf + enew + endif + endif + endfunction + function! fzf.on_exit(id, code, ...) + if s:getpos() == self.ppos " {'window': 'enew'} + for [opt, val] in items(self.winopts) + execute 'let' opt '=' val + endfor + call self.switch_back(1) + else + if bufnr('') == self.buf + " We use close instead of bd! since Vim does not close the split when + " there's no other listed buffer (nvim +'set nobuflisted') + close + endif + silent! execute 'tabnext' self.ppos.tab + silent! execute self.ppos.win.'wincmd w' + endif + + if bufexists(self.buf) + execute 'bd!' self.buf + endif + + if &lines == self.lines && &columns == self.columns && s:getpos() == self.ppos + execute self.winrest + endif + + let lines = s:collect(self.temps) + if !s:exit_handler(a:code, self.command, 1) + return + endif + + call s:pushd(self.dict) + call s:callback(self.dict, lines) + call self.switch_back(s:getpos() == self.ppos) + + if &buftype == 'terminal' + call feedkeys(&filetype == 'fzf' ? "\(fzf-insert)" : "\(fzf-normal)") + endif + endfunction + + try + call s:pushd(a:dict) + if s:is_win + let fzf.temps.batchfile = s:fzf_tempname().'.bat' + call writefile(s:wrap_cmds(a:command), fzf.temps.batchfile) + let command = fzf.temps.batchfile + else + let command = a:command + endif + let command .= s:term_marker + if has('nvim') + call termopen(command, fzf) + else + let term_opts = {'exit_cb': function(fzf.on_exit)} + if v:version >= 802 + let term_opts.term_kill = 'term' + endif + if is_popup + let term_opts.hidden = 1 + else + let term_opts.curwin = 1 + endif + let fzf.buf = term_start([&shell, &shellcmdflag, command], term_opts) + if is_popup && exists('#TerminalWinOpen') + doautocmd TerminalWinOpen + endif + if !has('patch-8.0.1261') && !s:is_win + call term_wait(fzf.buf, 20) + endif + endif + tnoremap + if exists('&termwinkey') && (empty(&termwinkey) || &termwinkey =~? '') + tnoremap . + endif + finally + call s:dopopd() + endtry + setlocal nospell bufhidden=wipe nobuflisted nonumber + setf fzf + startinsert + return [] +endfunction + +function! s:collect(temps) abort + try + return filereadable(a:temps.result) ? readfile(a:temps.result) : [] + finally + for tf in values(a:temps) + silent! call delete(tf) + endfor + endtry +endfunction + +function! s:callback(dict, lines) abort + let popd = has_key(a:dict, 'pushd') + if popd + let w:fzf_pushd = a:dict.pushd + endif + + try + if has_key(a:dict, 'sink') + for line in a:lines + if type(a:dict.sink) == 2 + call a:dict.sink(line) + else + execute a:dict.sink s:escape(line) + endif + endfor + endif + if has_key(a:dict, 'sink*') + call a:dict['sink*'](a:lines) + elseif has_key(a:dict, 'sinklist') + call a:dict['sinklist'](a:lines) + endif + catch + if stridx(v:exception, ':E325:') < 0 + echoerr v:exception + endif + endtry + + " We may have opened a new window or tab + if popd + let w:fzf_pushd = a:dict.pushd + call s:dopopd() + endif +endfunction + +if has('nvim') + function s:create_popup(hl, opts) abort + let buf = nvim_create_buf(v:false, v:true) + let opts = extend({'relative': 'editor', 'style': 'minimal'}, a:opts) + let win = nvim_open_win(buf, v:true, opts) + call setwinvar(win, '&winhighlight', 'NormalFloat:'..a:hl) + call setwinvar(win, '&colorcolumn', '') + return buf + endfunction +else + function! s:create_popup(hl, opts) abort + let s:popup_create = {buf -> popup_create(buf, #{ + \ line: a:opts.row, + \ col: a:opts.col, + \ minwidth: a:opts.width, + \ maxwidth: a:opts.width, + \ minheight: a:opts.height, + \ maxheight: a:opts.height, + \ zindex: 1000, + \ })} + autocmd TerminalOpen * ++once call s:popup_create(str2nr(expand(''))) + endfunction +endif + +function! s:popup(opts) abort + let xoffset = get(a:opts, 'xoffset', 0.5) + let yoffset = get(a:opts, 'yoffset', 0.5) + let relative = get(a:opts, 'relative', 0) + + " Use current window size for positioning relatively positioned popups + let columns = relative ? winwidth(0) : &columns + let lines = relative ? winheight(0) : (&lines - has('nvim')) + + " Size and position + let width = min([max([8, a:opts.width > 1 ? a:opts.width : float2nr(columns * a:opts.width)]), columns]) + let height = min([max([4, a:opts.height > 1 ? a:opts.height : float2nr(lines * a:opts.height)]), lines]) + let row = float2nr(yoffset * (lines - height)) + (relative ? win_screenpos(0)[0] - 1 : 0) + let col = float2nr(xoffset * (columns - width)) + (relative ? win_screenpos(0)[1] - 1 : 0) + + " Managing the differences + let row = min([max([0, row]), &lines - has('nvim') - height]) + let col = min([max([0, col]), &columns - width]) + let row += !has('nvim') + let col += !has('nvim') + + call s:create_popup('Normal', { + \ 'row': row, 'col': col, 'width': width, 'height': height + \ }) +endfunction + +let s:default_action = { + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + +function! s:shortpath() + let short = fnamemodify(getcwd(), ':~:.') + if !has('win32unix') + let short = pathshorten(short) + endif + let slash = (s:is_win && !&shellslash) ? '\' : '/' + return empty(short) ? '~'.slash : short . (short =~ escape(slash, '\').'$' ? '' : slash) +endfunction + +function! s:cmd(bang, ...) abort + let args = copy(a:000) + let opts = { 'options': ['--multi'] } + if len(args) && isdirectory(expand(args[-1])) + let opts.dir = substitute(substitute(remove(args, -1), '\\\(["'']\)', '\1', 'g'), '[/\\]*$', '/', '') + if s:is_win && !&shellslash + let opts.dir = substitute(opts.dir, '/', '\\', 'g') + endif + let prompt = opts.dir + else + let prompt = s:shortpath() + endif + let prompt = strwidth(prompt) < &columns - 20 ? prompt : '> ' + call extend(opts.options, ['--prompt', prompt]) + call extend(opts.options, args) + call fzf#run(fzf#wrap('FZF', opts, a:bang)) +endfunction + +command! -nargs=* -complete=dir -bang FZF call s:cmd(0, ) + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/.fzf/shell/completion.bash b/.fzf/shell/completion.bash new file mode 100644 index 0000000..21aa450 --- /dev/null +++ b/.fzf/shell/completion.bash @@ -0,0 +1,381 @@ +# ____ ____ +# / __/___ / __/ +# / /_/_ / / /_ +# / __/ / /_/ __/ +# /_/ /___/_/ completion.bash +# +# - $FZF_TMUX (default: 0) +# - $FZF_TMUX_OPTS (default: empty) +# - $FZF_COMPLETION_TRIGGER (default: '**') +# - $FZF_COMPLETION_OPTS (default: empty) + +if [[ $- =~ i ]]; then + +# To use custom commands instead of find, override _fzf_compgen_{path,dir} +if ! declare -f _fzf_compgen_path > /dev/null; then + _fzf_compgen_path() { + echo "$1" + command find -L "$1" \ + -name .git -prune -o -name .hg -prune -o -name .svn -prune -o \( -type d -o -type f -o -type l \) \ + -a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@' + } +fi + +if ! declare -f _fzf_compgen_dir > /dev/null; then + _fzf_compgen_dir() { + command find -L "$1" \ + -name .git -prune -o -name .hg -prune -o -name .svn -prune -o -type d \ + -a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@' + } +fi + +########################################################### + +# To redraw line after fzf closes (printf '\e[5n') +bind '"\e[0n": redraw-current-line' 2> /dev/null + +__fzf_comprun() { + if [[ "$(type -t _fzf_comprun 2>&1)" = function ]]; then + _fzf_comprun "$@" + elif [[ -n "$TMUX_PANE" ]] && { [[ "${FZF_TMUX:-0}" != 0 ]] || [[ -n "$FZF_TMUX_OPTS" ]]; }; then + shift + fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- "$@" + else + shift + fzf "$@" + fi +} + +__fzf_orig_completion() { + local l comp f cmd + while read -r l; do + if [[ "$l" =~ ^(.*\ -F)\ *([^ ]*).*\ ([^ ]*)$ ]]; then + comp="${BASH_REMATCH[1]}" + f="${BASH_REMATCH[2]}" + cmd="${BASH_REMATCH[3]}" + [[ "$f" = _fzf_* ]] && continue + printf -v "_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" "%s" "${comp} %s ${cmd} #${f}" + if [[ "$l" = *" -o nospace "* ]] && [[ ! "$__fzf_nospace_commands" = *" $cmd "* ]]; then + __fzf_nospace_commands="$__fzf_nospace_commands $cmd " + fi + fi + done +} + +_fzf_opts_completion() { + local cur prev opts + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + opts=" + -x --extended + -e --exact + --algo + -i +i + -n --nth + --with-nth + -d --delimiter + +s --no-sort + --tac + --tiebreak + -m --multi + --no-mouse + --bind + --cycle + --no-hscroll + --jump-labels + --height + --literal + --reverse + --margin + --inline-info + --prompt + --pointer + --marker + --header + --header-lines + --ansi + --tabstop + --color + --no-bold + --history + --history-size + --preview + --preview-window + -q --query + -1 --select-1 + -0 --exit-0 + -f --filter + --print-query + --expect + --sync" + + case "${prev}" in + --tiebreak) + COMPREPLY=( $(compgen -W "length begin end index" -- "$cur") ) + return 0 + ;; + --color) + COMPREPLY=( $(compgen -W "dark light 16 bw" -- "$cur") ) + return 0 + ;; + --history) + COMPREPLY=() + return 0 + ;; + esac + + if [[ "$cur" =~ ^-|\+ ]]; then + COMPREPLY=( $(compgen -W "${opts}" -- "$cur") ) + return 0 + fi + + return 0 +} + +_fzf_handle_dynamic_completion() { + local cmd orig_var orig ret orig_cmd orig_complete + cmd="$1" + shift + orig_cmd="$1" + orig_var="_fzf_orig_completion_$cmd" + orig="${!orig_var##*#}" + if [[ -n "$orig" ]] && type "$orig" > /dev/null 2>&1; then + $orig "$@" + elif [[ -n "$_fzf_completion_loader" ]]; then + orig_complete=$(complete -p "$orig_cmd" 2> /dev/null) + _completion_loader "$@" + ret=$? + # _completion_loader may not have updated completion for the command + if [[ "$(complete -p "$orig_cmd" 2> /dev/null)" != "$orig_complete" ]]; then + __fzf_orig_completion < <(complete -p "$orig_cmd" 2> /dev/null) + if [[ "$__fzf_nospace_commands" = *" $orig_cmd "* ]]; then + eval "${orig_complete/ -F / -o nospace -F }" + else + eval "$orig_complete" + fi + fi + return $ret + fi +} + +__fzf_generic_path_completion() { + local cur base dir leftover matches trigger cmd + cmd="${COMP_WORDS[0]//[^A-Za-z0-9_=]/_}" + COMPREPLY=() + trigger=${FZF_COMPLETION_TRIGGER-'**'} + cur="${COMP_WORDS[COMP_CWORD]}" + if [[ "$cur" == *"$trigger" ]]; then + base=${cur:0:${#cur}-${#trigger}} + eval "base=$base" + + [[ $base = *"/"* ]] && dir="$base" + while true; do + if [[ -z "$dir" ]] || [[ -d "$dir" ]]; then + leftover=${base/#"$dir"} + leftover=${leftover/#\/} + [[ -z "$dir" ]] && dir='.' + [[ "$dir" != "/" ]] && dir="${dir/%\//}" + matches=$(eval "$1 $(printf %q "$dir")" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS $2" __fzf_comprun "$4" -q "$leftover" | while read -r item; do + printf "%q$3 " "$item" + done) + matches=${matches% } + [[ -z "$3" ]] && [[ "$__fzf_nospace_commands" = *" ${COMP_WORDS[0]} "* ]] && matches="$matches " + if [[ -n "$matches" ]]; then + COMPREPLY=( "$matches" ) + else + COMPREPLY=( "$cur" ) + fi + printf '\e[5n' + return 0 + fi + dir=$(dirname "$dir") + [[ "$dir" =~ /$ ]] || dir="$dir"/ + done + else + shift + shift + shift + _fzf_handle_dynamic_completion "$cmd" "$@" + fi +} + +_fzf_complete() { + # Split arguments around -- + local args rest str_arg i sep + args=("$@") + sep= + for i in "${!args[@]}"; do + if [[ "${args[$i]}" = -- ]]; then + sep=$i + break + fi + done + if [[ -n "$sep" ]]; then + str_arg= + rest=("${args[@]:$((sep + 1)):${#args[@]}}") + args=("${args[@]:0:$sep}") + else + str_arg=$1 + args=() + shift + rest=("$@") + fi + + local cur selected trigger cmd post + post="$(caller 0 | awk '{print $2}')_post" + type -t "$post" > /dev/null 2>&1 || post=cat + + cmd="${COMP_WORDS[0]//[^A-Za-z0-9_=]/_}" + trigger=${FZF_COMPLETION_TRIGGER-'**'} + cur="${COMP_WORDS[COMP_CWORD]}" + if [[ "$cur" == *"$trigger" ]]; then + cur=${cur:0:${#cur}-${#trigger}} + + selected=$(FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS $str_arg" __fzf_comprun "${rest[0]}" "${args[@]}" -q "$cur" | $post | tr '\n' ' ') + selected=${selected% } # Strip trailing space not to repeat "-o nospace" + if [[ -n "$selected" ]]; then + COMPREPLY=("$selected") + else + COMPREPLY=("$cur") + fi + printf '\e[5n' + return 0 + else + _fzf_handle_dynamic_completion "$cmd" "${rest[@]}" + fi +} + +_fzf_path_completion() { + __fzf_generic_path_completion _fzf_compgen_path "-m" "" "$@" +} + +# Deprecated. No file only completion. +_fzf_file_completion() { + _fzf_path_completion "$@" +} + +_fzf_dir_completion() { + __fzf_generic_path_completion _fzf_compgen_dir "" "/" "$@" +} + +_fzf_complete_kill() { + local trigger=${FZF_COMPLETION_TRIGGER-'**'} + local cur="${COMP_WORDS[COMP_CWORD]}" + if [[ -z "$cur" ]]; then + COMP_WORDS[$COMP_CWORD]=$trigger + elif [[ "$cur" != *"$trigger" ]]; then + return 1 + fi + + _fzf_proc_completion "$@" +} + +_fzf_proc_completion() { + _fzf_complete -m --preview 'echo {}' --preview-window down:3:wrap --min-height 15 -- "$@" < <( + command ps -ef | sed 1d + ) +} + +_fzf_proc_completion_post() { + awk '{print $2}' +} + +_fzf_host_completion() { + _fzf_complete +m -- "$@" < <( + command cat <(command tail -n +1 ~/.ssh/config ~/.ssh/config.d/* /etc/ssh/ssh_config 2> /dev/null | command grep -i '^\s*host\(name\)\? ' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}' | command grep -v '[*?]') \ + <(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | tr -d '[' | awk '{ print $1 " " $1 }') \ + <(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') | + awk '{if (length($2) > 0) {print $2}}' | sort -u + ) +} + +_fzf_var_completion() { + _fzf_complete -m -- "$@" < <( + declare -xp | sed 's/=.*//' | sed 's/.* //' + ) +} + +_fzf_alias_completion() { + _fzf_complete -m -- "$@" < <( + alias | sed 's/=.*//' | sed 's/.* //' + ) +} + +# fzf options +complete -o default -F _fzf_opts_completion fzf + +d_cmds="${FZF_COMPLETION_DIR_COMMANDS:-cd pushd rmdir}" +a_cmds=" + awk cat diff diff3 + emacs emacsclient ex file ftp g++ gcc gvim head hg java + javac ld less more mvim nvim patch perl python ruby + sed sftp sort source tail tee uniq vi view vim wc xdg-open + basename bunzip2 bzip2 chmod chown curl cp dirname du + find git grep gunzip gzip hg jar + ln ls mv open rm rsync scp + svn tar unzip zip" + +# Preserve existing completion +__fzf_orig_completion < <(complete -p $d_cmds $a_cmds 2> /dev/null) + +if type _completion_loader > /dev/null 2>&1; then + _fzf_completion_loader=1 +fi + +__fzf_defc() { + local cmd func opts orig_var orig def + cmd="$1" + func="$2" + opts="$3" + orig_var="_fzf_orig_completion_${cmd//[^A-Za-z0-9_]/_}" + orig="${!orig_var}" + if [[ -n "$orig" ]]; then + printf -v def "$orig" "$func" + eval "$def" + else + complete -F "$func" $opts "$cmd" + fi +} + +# Anything +for cmd in $a_cmds; do + __fzf_defc "$cmd" _fzf_path_completion "-o default -o bashdefault" +done + +# Directory +for cmd in $d_cmds; do + __fzf_defc "$cmd" _fzf_dir_completion "-o nospace -o dirnames" +done + +# Kill completion (supports empty completion trigger) +complete -F _fzf_complete_kill -o default -o bashdefault kill + +unset cmd d_cmds a_cmds + +_fzf_setup_completion() { + local kind fn cmd + kind=$1 + fn=_fzf_${1}_completion + if [[ $# -lt 2 ]] || ! type -t "$fn" > /dev/null; then + echo "usage: ${FUNCNAME[0]} path|dir|var|alias|host|proc COMMANDS..." + return 1 + fi + shift + __fzf_orig_completion < <(complete -p "$@" 2> /dev/null) + for cmd in "$@"; do + case "$kind" in + dir) __fzf_defc "$cmd" "$fn" "-o nospace -o dirnames" ;; + var) __fzf_defc "$cmd" "$fn" "-o default -o nospace -v" ;; + alias) __fzf_defc "$cmd" "$fn" "-a" ;; + *) __fzf_defc "$cmd" "$fn" "-o default -o bashdefault" ;; + esac + done +} + +# Environment variables / Aliases / Hosts +_fzf_setup_completion 'var' export unset +_fzf_setup_completion 'alias' unalias +_fzf_setup_completion 'host' ssh telnet + +fi diff --git a/.fzf/shell/completion.zsh b/.fzf/shell/completion.zsh new file mode 100644 index 0000000..f12afca --- /dev/null +++ b/.fzf/shell/completion.zsh @@ -0,0 +1,329 @@ +# ____ ____ +# / __/___ / __/ +# / /_/_ / / /_ +# / __/ / /_/ __/ +# /_/ /___/_/ completion.zsh +# +# - $FZF_TMUX (default: 0) +# - $FZF_TMUX_OPTS (default: '-d 40%') +# - $FZF_COMPLETION_TRIGGER (default: '**') +# - $FZF_COMPLETION_OPTS (default: empty) + +# Both branches of the following `if` do the same thing -- define +# __fzf_completion_options such that `eval $__fzf_completion_options` sets +# all options to the same values they currently have. We'll do just that at +# the bottom of the file after changing options to what we prefer. +# +# IMPORTANT: Until we get to the `emulate` line, all words that *can* be quoted +# *must* be quoted in order to prevent alias expansion. In addition, code must +# be written in a way works with any set of zsh options. This is very tricky, so +# careful when you change it. +# +# Start by loading the builtin zsh/parameter module. It provides `options` +# associative array that stores current shell options. +if 'zmodload' 'zsh/parameter' 2>'/dev/null' && (( ${+options} )); then + # This is the fast branch and it gets taken on virtually all Zsh installations. + # + # ${(kv)options[@]} expands to array of keys (option names) and values ("on" + # or "off"). The subsequent expansion# with (j: :) flag joins all elements + # together separated by spaces. __fzf_completion_options ends up with a value + # like this: "options=(shwordsplit off aliases on ...)". + __fzf_completion_options="options=(${(j: :)${(kv)options[@]}})" +else + # This branch is much slower because it forks to get the names of all + # zsh options. It's possible to eliminate this fork but it's not worth the + # trouble because this branch gets taken only on very ancient or broken + # zsh installations. + () { + # That `()` above defines an anonymous function. This is essentially a scope + # for local parameters. We use it to avoid polluting global scope. + 'local' '__fzf_opt' + __fzf_completion_options="setopt" + # `set -o` prints one line for every zsh option. Each line contains option + # name, some spaces, and then either "on" or "off". We just want option names. + # Expansion with (@f) flag splits a string into lines. The outer expansion + # removes spaces and everything that follow them on every line. __fzf_opt + # ends up iterating over option names: shwordsplit, aliases, etc. + for __fzf_opt in "${(@)${(@f)$(set -o)}%% *}"; do + if [[ -o "$__fzf_opt" ]]; then + # Option $__fzf_opt is currently on, so remember to set it back on. + __fzf_completion_options+=" -o $__fzf_opt" + else + # Option $__fzf_opt is currently off, so remember to set it back off. + __fzf_completion_options+=" +o $__fzf_opt" + fi + done + # The value of __fzf_completion_options here looks like this: + # "setopt +o shwordsplit -o aliases ..." + } +fi + +# Enable the default zsh options (those marked with in `man zshoptions`) +# but without `aliases`. Aliases in functions are expanded when functions are +# defined, so if we disable aliases here, we'll be sure to have no pesky +# aliases in any of our functions. This way we won't need prefix every +# command with `command` or to quote every word to defend against global +# aliases. Note that `aliases` is not the only option that's important to +# control. There are several others that could wreck havoc if they are set +# to values we don't expect. With the following `emulate` command we +# sidestep this issue entirely. +'emulate' 'zsh' '-o' 'no_aliases' + +# This brace is the start of try-always block. The `always` part is like +# `finally` in lesser languages. We use it to *always* restore user options. +{ + +# Bail out if not interactive shell. +[[ -o interactive ]] || return 0 + +# To use custom commands instead of find, override _fzf_compgen_{path,dir} +if ! declare -f _fzf_compgen_path > /dev/null; then + _fzf_compgen_path() { + echo "$1" + command find -L "$1" \ + -name .git -prune -o -name .hg -prune -o -name .svn -prune -o \( -type d -o -type f -o -type l \) \ + -a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@' + } +fi + +if ! declare -f _fzf_compgen_dir > /dev/null; then + _fzf_compgen_dir() { + command find -L "$1" \ + -name .git -prune -o -name .hg -prune -o -name .svn -prune -o -type d \ + -a -not -path "$1" -print 2> /dev/null | sed 's@^\./@@' + } +fi + +########################################################### + +__fzf_comprun() { + if [[ "$(type _fzf_comprun 2>&1)" =~ function ]]; then + _fzf_comprun "$@" + elif [ -n "$TMUX_PANE" ] && { [ "${FZF_TMUX:-0}" != 0 ] || [ -n "$FZF_TMUX_OPTS" ]; }; then + shift + if [ -n "$FZF_TMUX_OPTS" ]; then + fzf-tmux ${(Q)${(Z+n+)FZF_TMUX_OPTS}} -- "$@" + else + fzf-tmux -d ${FZF_TMUX_HEIGHT:-40%} -- "$@" + fi + else + shift + fzf "$@" + fi +} + +# Extract the name of the command. e.g. foo=1 bar baz** +__fzf_extract_command() { + local token tokens + tokens=(${(z)1}) + for token in $tokens; do + token=${(Q)token} + if [[ "$token" =~ [[:alnum:]] && ! "$token" =~ "=" ]]; then + echo "$token" + return + fi + done + echo "${tokens[1]}" +} + +__fzf_generic_path_completion() { + local base lbuf cmd compgen fzf_opts suffix tail dir leftover matches + base=$1 + lbuf=$2 + cmd=$(__fzf_extract_command "$lbuf") + compgen=$3 + fzf_opts=$4 + suffix=$5 + tail=$6 + + setopt localoptions nonomatch + eval "base=$base" + [[ $base = *"/"* ]] && dir="$base" + while [ 1 ]; do + if [[ -z "$dir" || -d ${dir} ]]; then + leftover=${base/#"$dir"} + leftover=${leftover/#\/} + [ -z "$dir" ] && dir='.' + [ "$dir" != "/" ] && dir="${dir/%\//}" + matches=$(eval "$compgen $(printf %q "$dir")" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS" __fzf_comprun "$cmd" ${(Q)${(Z+n+)fzf_opts}} -q "$leftover" | while read item; do + echo -n "${(q)item}$suffix " + done) + matches=${matches% } + if [ -n "$matches" ]; then + LBUFFER="$lbuf$matches$tail" + fi + zle reset-prompt + break + fi + dir=$(dirname "$dir") + dir=${dir%/}/ + done +} + +_fzf_path_completion() { + __fzf_generic_path_completion "$1" "$2" _fzf_compgen_path \ + "-m" "" " " +} + +_fzf_dir_completion() { + __fzf_generic_path_completion "$1" "$2" _fzf_compgen_dir \ + "" "/" "" +} + +_fzf_feed_fifo() ( + command rm -f "$1" + mkfifo "$1" + cat <&0 > "$1" & +) + +_fzf_complete() { + setopt localoptions ksh_arrays + # Split arguments around -- + local args rest str_arg i sep + args=("$@") + sep= + for i in {0..${#args[@]}}; do + if [[ "${args[$i]}" = -- ]]; then + sep=$i + break + fi + done + if [[ -n "$sep" ]]; then + str_arg= + rest=("${args[@]:$((sep + 1)):${#args[@]}}") + args=("${args[@]:0:$sep}") + else + str_arg=$1 + args=() + shift + rest=("$@") + fi + + local fifo lbuf cmd matches post + fifo="${TMPDIR:-/tmp}/fzf-complete-fifo-$$" + lbuf=${rest[0]} + cmd=$(__fzf_extract_command "$lbuf") + post="${funcstack[1]}_post" + type $post > /dev/null 2>&1 || post=cat + + _fzf_feed_fifo "$fifo" + matches=$(FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS $str_arg" __fzf_comprun "$cmd" "${args[@]}" -q "${(Q)prefix}" < "$fifo" | $post | tr '\n' ' ') + if [ -n "$matches" ]; then + LBUFFER="$lbuf$matches" + fi + command rm -f "$fifo" +} + +_fzf_complete_telnet() { + _fzf_complete +m -- "$@" < <( + command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0' | + awk '{if (length($2) > 0) {print $2}}' | sort -u + ) +} + +_fzf_complete_ssh() { + _fzf_complete +m -- "$@" < <( + setopt localoptions nonomatch + command cat <(command tail -n +1 ~/.ssh/config ~/.ssh/config.d/* /etc/ssh/ssh_config 2> /dev/null | command grep -i '^\s*host\(name\)\? ' | awk '{for (i = 2; i <= NF; i++) print $1 " " $i}' | command grep -v '[*?]') \ + <(command grep -oE '^[[a-z0-9.,:-]+' ~/.ssh/known_hosts | tr ',' '\n' | tr -d '[' | awk '{ print $1 " " $1 }') \ + <(command grep -v '^\s*\(#\|$\)' /etc/hosts | command grep -Fv '0.0.0.0') | + awk '{if (length($2) > 0) {print $2}}' | sort -u + ) +} + +_fzf_complete_export() { + _fzf_complete -m -- "$@" < <( + declare -xp | sed 's/=.*//' | sed 's/.* //' + ) +} + +_fzf_complete_unset() { + _fzf_complete -m -- "$@" < <( + declare -xp | sed 's/=.*//' | sed 's/.* //' + ) +} + +_fzf_complete_unalias() { + _fzf_complete +m -- "$@" < <( + alias | sed 's/=.*//' + ) +} + +_fzf_complete_kill() { + _fzf_complete -m --preview 'echo {}' --preview-window down:3:wrap --min-height 15 -- "$@" < <( + command ps -ef | sed 1d + ) +} + +_fzf_complete_kill_post() { + awk '{print $2}' +} + +fzf-completion() { + local tokens cmd prefix trigger tail matches lbuf d_cmds + setopt localoptions noshwordsplit noksh_arrays noposixbuiltins + + # http://zsh.sourceforge.net/FAQ/zshfaq03.html + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags + tokens=(${(z)LBUFFER}) + if [ ${#tokens} -lt 1 ]; then + zle ${fzf_default_completion:-expand-or-complete} + return + fi + + cmd=$(__fzf_extract_command "$LBUFFER") + + # Explicitly allow for empty trigger. + trigger=${FZF_COMPLETION_TRIGGER-'**'} + [ -z "$trigger" -a ${LBUFFER[-1]} = ' ' ] && tokens+=("") + + # When the trigger starts with ';', it becomes a separate token + if [[ ${LBUFFER} = *"${tokens[-2]}${tokens[-1]}" ]]; then + tokens[-2]="${tokens[-2]}${tokens[-1]}" + tokens=(${tokens[0,-2]}) + fi + + lbuf=$LBUFFER + tail=${LBUFFER:$(( ${#LBUFFER} - ${#trigger} ))} + # Kill completion (do not require trigger sequence) + if [ "$cmd" = kill -a ${LBUFFER[-1]} = ' ' ]; then + tail=$trigger + tokens+=$trigger + lbuf="$lbuf$trigger" + fi + + # Trigger sequence given + if [ ${#tokens} -gt 1 -a "$tail" = "$trigger" ]; then + d_cmds=(${=FZF_COMPLETION_DIR_COMMANDS:-cd pushd rmdir}) + + [ -z "$trigger" ] && prefix=${tokens[-1]} || prefix=${tokens[-1]:0:-${#trigger}} + [ -n "${tokens[-1]}" ] && lbuf=${lbuf:0:-${#tokens[-1]}} + + if eval "type _fzf_complete_${cmd} > /dev/null"; then + prefix="$prefix" eval _fzf_complete_${cmd} ${(q)lbuf} + zle reset-prompt + elif [ ${d_cmds[(i)$cmd]} -le ${#d_cmds} ]; then + _fzf_dir_completion "$prefix" "$lbuf" + else + _fzf_path_completion "$prefix" "$lbuf" + fi + # Fall back to default completion + else + zle ${fzf_default_completion:-expand-or-complete} + fi +} + +[ -z "$fzf_default_completion" ] && { + binding=$(bindkey '^I') + [[ $binding =~ 'undefined-key' ]] || fzf_default_completion=$binding[(s: :w)2] + unset binding +} + +zle -N fzf-completion +bindkey '^I' fzf-completion + +} always { + # Restore the original options. + eval $__fzf_completion_options + 'unset' '__fzf_completion_options' +} diff --git a/.fzf/shell/key-bindings.bash b/.fzf/shell/key-bindings.bash new file mode 100644 index 0000000..3ea8e76 --- /dev/null +++ b/.fzf/shell/key-bindings.bash @@ -0,0 +1,96 @@ +# ____ ____ +# / __/___ / __/ +# / /_/_ / / /_ +# / __/ / /_/ __/ +# /_/ /___/_/ key-bindings.bash +# +# - $FZF_TMUX_OPTS +# - $FZF_CTRL_T_COMMAND +# - $FZF_CTRL_T_OPTS +# - $FZF_CTRL_R_OPTS +# - $FZF_ALT_C_COMMAND +# - $FZF_ALT_C_OPTS + +# Key bindings +# ------------ +__fzf_select__() { + local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ + -o -type f -print \ + -o -type d -print \ + -o -type l -print 2> /dev/null | cut -b3-"}" + eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" $(__fzfcmd) -m "$@" | while read -r item; do + printf '%q ' "$item" + done + echo +} + +if [[ $- =~ i ]]; then + +__fzfcmd() { + [[ -n "$TMUX_PANE" ]] && { [[ "${FZF_TMUX:-0}" != 0 ]] || [[ -n "$FZF_TMUX_OPTS" ]]; } && + echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf" +} + +fzf-file-widget() { + local selected="$(__fzf_select__)" + READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}" + READLINE_POINT=$(( READLINE_POINT + ${#selected} )) +} + +__fzf_cd__() { + local cmd dir + cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ + -o -type d -print 2> /dev/null | cut -b3-"}" + dir=$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m) && printf 'cd %q' "$dir" +} + +__fzf_history__() { + local output + output=$( + builtin fc -lnr -2147483648 | + last_hist=$(HISTTIMEFORMAT='' builtin history 1) perl -n -l0 -e 'BEGIN { getc; $/ = "\n\t"; $HISTCMD = $ENV{last_hist} + 1 } s/^[ *]//; print $HISTCMD - $. . "\t$_" if !$seen{$_}++' | + FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort,ctrl-z:ignore $FZF_CTRL_R_OPTS +m --read0" $(__fzfcmd) --query "$READLINE_LINE" + ) || return + READLINE_LINE=${output#*$'\t'} + if [[ -z "$READLINE_POINT" ]]; then + echo "$READLINE_LINE" + else + READLINE_POINT=0x7fffffff + fi +} + +# Required to refresh the prompt after fzf +bind -m emacs-standard '"\er": redraw-current-line' + +bind -m vi-command '"\C-z": emacs-editing-mode' +bind -m vi-insert '"\C-z": emacs-editing-mode' +bind -m emacs-standard '"\C-z": vi-editing-mode' + +if (( BASH_VERSINFO[0] < 4 )); then + # CTRL-T - Paste the selected file path into the command line + bind -m emacs-standard '"\C-t": " \C-b\C-k \C-u`__fzf_select__`\e\C-e\er\C-a\C-y\C-h\C-e\e \C-y\ey\C-x\C-x\C-f"' + bind -m vi-command '"\C-t": "\C-z\C-t\C-z"' + bind -m vi-insert '"\C-t": "\C-z\C-t\C-z"' + + # CTRL-R - Paste the selected command from history into the command line + bind -m emacs-standard '"\C-r": "\C-e \C-u\C-y\ey\C-u"$(__fzf_history__)"\e\C-e\er"' + bind -m vi-command '"\C-r": "\C-z\C-r\C-z"' + bind -m vi-insert '"\C-r": "\C-z\C-r\C-z"' +else + # CTRL-T - Paste the selected file path into the command line + bind -m emacs-standard -x '"\C-t": fzf-file-widget' + bind -m vi-command -x '"\C-t": fzf-file-widget' + bind -m vi-insert -x '"\C-t": fzf-file-widget' + + # CTRL-R - Paste the selected command from history into the command line + bind -m emacs-standard -x '"\C-r": __fzf_history__' + bind -m vi-command -x '"\C-r": __fzf_history__' + bind -m vi-insert -x '"\C-r": __fzf_history__' +fi + +# ALT-C - cd into the selected directory +bind -m emacs-standard '"\ec": " \C-b\C-k \C-u`__fzf_cd__`\e\C-e\er\C-m\C-y\C-h\e \C-y\ey\C-x\C-x\C-d"' +bind -m vi-command '"\ec": "\C-z\ec\C-z"' +bind -m vi-insert '"\ec": "\C-z\ec\C-z"' + +fi diff --git a/.fzf/shell/key-bindings.fish b/.fzf/shell/key-bindings.fish new file mode 100644 index 0000000..6f73903 --- /dev/null +++ b/.fzf/shell/key-bindings.fish @@ -0,0 +1,172 @@ +# ____ ____ +# / __/___ / __/ +# / /_/_ / / /_ +# / __/ / /_/ __/ +# /_/ /___/_/ key-bindings.fish +# +# - $FZF_TMUX_OPTS +# - $FZF_CTRL_T_COMMAND +# - $FZF_CTRL_T_OPTS +# - $FZF_CTRL_R_OPTS +# - $FZF_ALT_C_COMMAND +# - $FZF_ALT_C_OPTS + +# Key bindings +# ------------ +function fzf_key_bindings + + # Store current token in $dir as root for the 'find' command + function fzf-file-widget -d "List files and folders" + set -l commandline (__fzf_parse_commandline) + set -l dir $commandline[1] + set -l fzf_query $commandline[2] + set -l prefix $commandline[3] + + # "-path \$dir'*/\\.*'" matches hidden files/folders inside $dir but not + # $dir itself, even if hidden. + test -n "$FZF_CTRL_T_COMMAND"; or set -l FZF_CTRL_T_COMMAND " + command find -L \$dir -mindepth 1 \\( -path \$dir'*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' \\) -prune \ + -o -type f -print \ + -o -type d -print \ + -o -type l -print 2> /dev/null | sed 's@^\./@@'" + + test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40% + begin + set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" + eval "$FZF_CTRL_T_COMMAND | "(__fzfcmd)' -m --query "'$fzf_query'"' | while read -l r; set result $result $r; end + end + if [ -z "$result" ] + commandline -f repaint + return + else + # Remove last token from commandline. + commandline -t "" + end + for i in $result + commandline -it -- $prefix + commandline -it -- (string escape $i) + commandline -it -- ' ' + end + commandline -f repaint + end + + function fzf-history-widget -d "Show command history" + test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40% + begin + set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT $FZF_DEFAULT_OPTS --tiebreak=index --bind=ctrl-r:toggle-sort,ctrl-z:ignore $FZF_CTRL_R_OPTS +m" + + set -l FISH_MAJOR (echo $version | cut -f1 -d.) + set -l FISH_MINOR (echo $version | cut -f2 -d.) + + # history's -z flag is needed for multi-line support. + # history's -z flag was added in fish 2.4.0, so don't use it for versions + # before 2.4.0. + if [ "$FISH_MAJOR" -gt 2 -o \( "$FISH_MAJOR" -eq 2 -a "$FISH_MINOR" -ge 4 \) ]; + history -z | eval (__fzfcmd) --read0 --print0 -q '(commandline)' | read -lz result + and commandline -- $result + else + history | eval (__fzfcmd) -q '(commandline)' | read -l result + and commandline -- $result + end + end + commandline -f repaint + end + + function fzf-cd-widget -d "Change directory" + set -l commandline (__fzf_parse_commandline) + set -l dir $commandline[1] + set -l fzf_query $commandline[2] + set -l prefix $commandline[3] + + test -n "$FZF_ALT_C_COMMAND"; or set -l FZF_ALT_C_COMMAND " + command find -L \$dir -mindepth 1 \\( -path \$dir'*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' \\) -prune \ + -o -type d -print 2> /dev/null | sed 's@^\./@@'" + test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40% + begin + set -lx FZF_DEFAULT_OPTS "--height $FZF_TMUX_HEIGHT --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" + eval "$FZF_ALT_C_COMMAND | "(__fzfcmd)' +m --query "'$fzf_query'"' | read -l result + + if [ -n "$result" ] + cd $result + + # Remove last token from commandline. + commandline -t "" + commandline -it -- $prefix + end + end + + commandline -f repaint + end + + function __fzfcmd + test -n "$FZF_TMUX"; or set FZF_TMUX 0 + test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40% + if [ -n "$FZF_TMUX_OPTS" ] + echo "fzf-tmux $FZF_TMUX_OPTS -- " + else if [ $FZF_TMUX -eq 1 ] + echo "fzf-tmux -d$FZF_TMUX_HEIGHT -- " + else + echo "fzf" + end + end + + bind \ct fzf-file-widget + bind \cr fzf-history-widget + bind \ec fzf-cd-widget + + if bind -M insert > /dev/null 2>&1 + bind -M insert \ct fzf-file-widget + bind -M insert \cr fzf-history-widget + bind -M insert \ec fzf-cd-widget + end + + function __fzf_parse_commandline -d 'Parse the current command line token and return split of existing filepath, fzf query, and optional -option= prefix' + set -l commandline (commandline -t) + + # strip -option= from token if present + set -l prefix (string match -r -- '^-[^\s=]+=' $commandline) + set commandline (string replace -- "$prefix" '' $commandline) + + # eval is used to do shell expansion on paths + eval set commandline $commandline + + if [ -z $commandline ] + # Default to current directory with no --query + set dir '.' + set fzf_query '' + else + set dir (__fzf_get_dir $commandline) + + if [ "$dir" = "." -a (string sub -l 1 -- $commandline) != '.' ] + # if $dir is "." but commandline is not a relative path, this means no file path found + set fzf_query $commandline + else + # Also remove trailing slash after dir, to "split" input properly + set fzf_query (string replace -r "^$dir/?" -- '' "$commandline") + end + end + + echo $dir + echo $fzf_query + echo $prefix + end + + function __fzf_get_dir -d 'Find the longest existing filepath from input string' + set dir $argv + + # Strip all trailing slashes. Ignore if $dir is root dir (/) + if [ (string length -- $dir) -gt 1 ] + set dir (string replace -r '/*$' -- '' $dir) + end + + # Iteratively check if dir exists and strip tail end of path + while [ ! -d "$dir" ] + # If path is absolute, this can keep going until ends up at / + # If path is relative, this can keep going until entire input is consumed, dirname returns "." + set dir (dirname -- "$dir") + end + + echo $dir + end + +end diff --git a/.fzf/shell/key-bindings.zsh b/.fzf/shell/key-bindings.zsh new file mode 100644 index 0000000..8efa6af --- /dev/null +++ b/.fzf/shell/key-bindings.zsh @@ -0,0 +1,114 @@ +# ____ ____ +# / __/___ / __/ +# / /_/_ / / /_ +# / __/ / /_/ __/ +# /_/ /___/_/ key-bindings.zsh +# +# - $FZF_TMUX_OPTS +# - $FZF_CTRL_T_COMMAND +# - $FZF_CTRL_T_OPTS +# - $FZF_CTRL_R_OPTS +# - $FZF_ALT_C_COMMAND +# - $FZF_ALT_C_OPTS + +# Key bindings +# ------------ + +# The code at the top and the bottom of this file is the same as in completion.zsh. +# Refer to that file for explanation. +if 'zmodload' 'zsh/parameter' 2>'/dev/null' && (( ${+options} )); then + __fzf_key_bindings_options="options=(${(j: :)${(kv)options[@]}})" +else + () { + __fzf_key_bindings_options="setopt" + 'local' '__fzf_opt' + for __fzf_opt in "${(@)${(@f)$(set -o)}%% *}"; do + if [[ -o "$__fzf_opt" ]]; then + __fzf_key_bindings_options+=" -o $__fzf_opt" + else + __fzf_key_bindings_options+=" +o $__fzf_opt" + fi + done + } +fi + +'emulate' 'zsh' '-o' 'no_aliases' + +{ + +[[ -o interactive ]] || return 0 + +# CTRL-T - Paste the selected file path(s) into the command line +__fsel() { + local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ + -o -type f -print \ + -o -type d -print \ + -o -type l -print 2> /dev/null | cut -b3-"}" + setopt localoptions pipefail no_aliases 2> /dev/null + local item + eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" $(__fzfcmd) -m "$@" | while read item; do + echo -n "${(q)item} " + done + local ret=$? + echo + return $ret +} + +__fzfcmd() { + [ -n "$TMUX_PANE" ] && { [ "${FZF_TMUX:-0}" != 0 ] || [ -n "$FZF_TMUX_OPTS" ]; } && + echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf" +} + +fzf-file-widget() { + LBUFFER="${LBUFFER}$(__fsel)" + local ret=$? + zle reset-prompt + return $ret +} +zle -N fzf-file-widget +bindkey '^T' fzf-file-widget + +# ALT-C - cd into the selected directory +fzf-cd-widget() { + local cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ + -o -type d -print 2> /dev/null | cut -b3-"}" + setopt localoptions pipefail no_aliases 2> /dev/null + local dir="$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m)" + if [[ -z "$dir" ]]; then + zle redisplay + return 0 + fi + zle push-line # Clear buffer. Auto-restored on next prompt. + BUFFER="cd ${(q)dir}" + zle accept-line + local ret=$? + unset dir # ensure this doesn't end up appearing in prompt expansion + zle reset-prompt + return $ret +} +zle -N fzf-cd-widget +bindkey '\ec' fzf-cd-widget + +# CTRL-R - Paste the selected command from history into the command line +fzf-history-widget() { + local selected num + setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null + selected=( $(fc -rl 1 | perl -ne 'print if !$seen{(/^\s*[0-9]+\**\s+(.*)/, $1)}++' | + FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort,ctrl-z:ignore $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) ) + local ret=$? + if [ -n "$selected" ]; then + num=$selected[1] + if [ -n "$num" ]; then + zle vi-fetch-history -n $num + fi + fi + zle reset-prompt + return $ret +} +zle -N fzf-history-widget +bindkey '^R' fzf-history-widget + +} always { + eval $__fzf_key_bindings_options + 'unset' '__fzf_key_bindings_options' +} diff --git a/.fzf/src/LICENSE b/.fzf/src/LICENSE new file mode 100644 index 0000000..50aa5d9 --- /dev/null +++ b/.fzf/src/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi + +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. diff --git a/.fzf/src/algo/algo.go b/.fzf/src/algo/algo.go new file mode 100644 index 0000000..40fb2af --- /dev/null +++ b/.fzf/src/algo/algo.go @@ -0,0 +1,884 @@ +package algo + +/* + +Algorithm +--------- + +FuzzyMatchV1 finds the first "fuzzy" occurrence of the pattern within the given +text in O(n) time where n is the length of the text. Once the position of the +last character is located, it traverses backwards to see if there's a shorter +substring that matches the pattern. + + a_____b___abc__ To find "abc" + *-----*-----*> 1. Forward scan + <*** 2. Backward scan + +The algorithm is simple and fast, but as it only sees the first occurrence, +it is not guaranteed to find the occurrence with the highest score. + + a_____b__c__abc + *-----*--* *** + +FuzzyMatchV2 implements a modified version of Smith-Waterman algorithm to find +the optimal solution (highest score) according to the scoring criteria. Unlike +the original algorithm, omission or mismatch of a character in the pattern is +not allowed. + +Performance +----------- + +The new V2 algorithm is slower than V1 as it examines all occurrences of the +pattern instead of stopping immediately after finding the first one. The time +complexity of the algorithm is O(nm) if a match is found and O(n) otherwise +where n is the length of the item and m is the length of the pattern. Thus, the +performance overhead may not be noticeable for a query with high selectivity. +However, if the performance is more important than the quality of the result, +you can still choose v1 algorithm with --algo=v1. + +Scoring criteria +---------------- + +- We prefer matches at special positions, such as the start of a word, or + uppercase character in camelCase words. + +- That is, we prefer an occurrence of the pattern with more characters + matching at special positions, even if the total match length is longer. + e.g. "fuzzyfinder" vs. "fuzzy-finder" on "ff" + ```````````` +- Also, if the first character in the pattern appears at one of the special + positions, the bonus point for the position is multiplied by a constant + as it is extremely likely that the first character in the typed pattern + has more significance than the rest. + e.g. "fo-bar" vs. "foob-r" on "br" + `````` +- But since fzf is still a fuzzy finder, not an acronym finder, we should also + consider the total length of the matched substring. This is why we have the + gap penalty. The gap penalty increases as the length of the gap (distance + between the matching characters) increases, so the effect of the bonus is + eventually cancelled at some point. + e.g. "fuzzyfinder" vs. "fuzzy-blurry-finder" on "ff" + ``````````` +- Consequently, it is crucial to find the right balance between the bonus + and the gap penalty. The parameters were chosen that the bonus is cancelled + when the gap size increases beyond 8 characters. + +- The bonus mechanism can have the undesirable side effect where consecutive + matches are ranked lower than the ones with gaps. + e.g. "foobar" vs. "foo-bar" on "foob" + ``````` +- To correct this anomaly, we also give extra bonus point to each character + in a consecutive matching chunk. + e.g. "foobar" vs. "foo-bar" on "foob" + `````` +- The amount of consecutive bonus is primarily determined by the bonus of the + first character in the chunk. + e.g. "foobar" vs. "out-of-bound" on "oob" + ```````````` +*/ + +import ( + "bytes" + "fmt" + "strings" + "unicode" + "unicode/utf8" + + "github.com/junegunn/fzf/src/util" +) + +var DEBUG bool + +func indexAt(index int, max int, forward bool) int { + if forward { + return index + } + return max - index - 1 +} + +// Result contains the results of running a match function. +type Result struct { + // TODO int32 should suffice + Start int + End int + Score int +} + +const ( + scoreMatch = 16 + scoreGapStart = -3 + scoreGapExtension = -1 + + // We prefer matches at the beginning of a word, but the bonus should not be + // too great to prevent the longer acronym matches from always winning over + // shorter fuzzy matches. The bonus point here was specifically chosen that + // the bonus is cancelled when the gap between the acronyms grows over + // 8 characters, which is approximately the average length of the words found + // in web2 dictionary and my file system. + bonusBoundary = scoreMatch / 2 + + // Although bonus point for non-word characters is non-contextual, we need it + // for computing bonus points for consecutive chunks starting with a non-word + // character. + bonusNonWord = scoreMatch / 2 + + // Edge-triggered bonus for matches in camelCase words. + // Compared to word-boundary case, they don't accompany single-character gaps + // (e.g. FooBar vs. foo-bar), so we deduct bonus point accordingly. + bonusCamel123 = bonusBoundary + scoreGapExtension + + // Minimum bonus point given to characters in consecutive chunks. + // Note that bonus points for consecutive matches shouldn't have needed if we + // used fixed match score as in the original algorithm. + bonusConsecutive = -(scoreGapStart + scoreGapExtension) + + // The first character in the typed pattern usually has more significance + // than the rest so it's important that it appears at special positions where + // bonus points are given, e.g. "to-go" vs. "ongoing" on "og" or on "ogo". + // The amount of the extra bonus should be limited so that the gap penalty is + // still respected. + bonusFirstCharMultiplier = 2 +) + +type charClass int + +const ( + charNonWord charClass = iota + charLower + charUpper + charLetter + charNumber +) + +func posArray(withPos bool, len int) *[]int { + if withPos { + pos := make([]int, 0, len) + return &pos + } + return nil +} + +func alloc16(offset int, slab *util.Slab, size int) (int, []int16) { + if slab != nil && cap(slab.I16) > offset+size { + slice := slab.I16[offset : offset+size] + return offset + size, slice + } + return offset, make([]int16, size) +} + +func alloc32(offset int, slab *util.Slab, size int) (int, []int32) { + if slab != nil && cap(slab.I32) > offset+size { + slice := slab.I32[offset : offset+size] + return offset + size, slice + } + return offset, make([]int32, size) +} + +func charClassOfAscii(char rune) charClass { + if char >= 'a' && char <= 'z' { + return charLower + } else if char >= 'A' && char <= 'Z' { + return charUpper + } else if char >= '0' && char <= '9' { + return charNumber + } + return charNonWord +} + +func charClassOfNonAscii(char rune) charClass { + if unicode.IsLower(char) { + return charLower + } else if unicode.IsUpper(char) { + return charUpper + } else if unicode.IsNumber(char) { + return charNumber + } else if unicode.IsLetter(char) { + return charLetter + } + return charNonWord +} + +func charClassOf(char rune) charClass { + if char <= unicode.MaxASCII { + return charClassOfAscii(char) + } + return charClassOfNonAscii(char) +} + +func bonusFor(prevClass charClass, class charClass) int16 { + if prevClass == charNonWord && class != charNonWord { + // Word boundary + return bonusBoundary + } else if prevClass == charLower && class == charUpper || + prevClass != charNumber && class == charNumber { + // camelCase letter123 + return bonusCamel123 + } else if class == charNonWord { + return bonusNonWord + } + return 0 +} + +func bonusAt(input *util.Chars, idx int) int16 { + if idx == 0 { + return bonusBoundary + } + return bonusFor(charClassOf(input.Get(idx-1)), charClassOf(input.Get(idx))) +} + +func normalizeRune(r rune) rune { + if r < 0x00C0 || r > 0x2184 { + return r + } + + n := normalized[r] + if n > 0 { + return n + } + return r +} + +// Algo functions make two assumptions +// 1. "pattern" is given in lowercase if "caseSensitive" is false +// 2. "pattern" is already normalized if "normalize" is true +type Algo func(caseSensitive bool, normalize bool, forward bool, input *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) + +func trySkip(input *util.Chars, caseSensitive bool, b byte, from int) int { + byteArray := input.Bytes()[from:] + idx := bytes.IndexByte(byteArray, b) + if idx == 0 { + // Can't skip any further + return from + } + // We may need to search for the uppercase letter again. We don't have to + // consider normalization as we can be sure that this is an ASCII string. + if !caseSensitive && b >= 'a' && b <= 'z' { + if idx > 0 { + byteArray = byteArray[:idx] + } + uidx := bytes.IndexByte(byteArray, b-32) + if uidx >= 0 { + idx = uidx + } + } + if idx < 0 { + return -1 + } + return from + idx +} + +func isAscii(runes []rune) bool { + for _, r := range runes { + if r >= utf8.RuneSelf { + return false + } + } + return true +} + +func asciiFuzzyIndex(input *util.Chars, pattern []rune, caseSensitive bool) int { + // Can't determine + if !input.IsBytes() { + return 0 + } + + // Not possible + if !isAscii(pattern) { + return -1 + } + + firstIdx, idx := 0, 0 + for pidx := 0; pidx < len(pattern); pidx++ { + idx = trySkip(input, caseSensitive, byte(pattern[pidx]), idx) + if idx < 0 { + return -1 + } + if pidx == 0 && idx > 0 { + // Step back to find the right bonus point + firstIdx = idx - 1 + } + idx++ + } + return firstIdx +} + +func debugV2(T []rune, pattern []rune, F []int32, lastIdx int, H []int16, C []int16) { + width := lastIdx - int(F[0]) + 1 + + for i, f := range F { + I := i * width + if i == 0 { + fmt.Print(" ") + for j := int(f); j <= lastIdx; j++ { + fmt.Printf(" " + string(T[j]) + " ") + } + fmt.Println() + } + fmt.Print(string(pattern[i]) + " ") + for idx := int(F[0]); idx < int(f); idx++ { + fmt.Print(" 0 ") + } + for idx := int(f); idx <= lastIdx; idx++ { + fmt.Printf("%2d ", H[i*width+idx-int(F[0])]) + } + fmt.Println() + + fmt.Print(" ") + for idx, p := range C[I : I+width] { + if idx+int(F[0]) < int(F[i]) { + p = 0 + } + if p > 0 { + fmt.Printf("%2d ", p) + } else { + fmt.Print(" ") + } + } + fmt.Println() + } +} + +func FuzzyMatchV2(caseSensitive bool, normalize bool, forward bool, input *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + // Assume that pattern is given in lowercase if case-insensitive. + // First check if there's a match and calculate bonus for each position. + // If the input string is too long, consider finding the matching chars in + // this phase as well (non-optimal alignment). + M := len(pattern) + if M == 0 { + return Result{0, 0, 0}, posArray(withPos, M) + } + N := input.Length() + + // Since O(nm) algorithm can be prohibitively expensive for large input, + // we fall back to the greedy algorithm. + if slab != nil && N*M > cap(slab.I16) { + return FuzzyMatchV1(caseSensitive, normalize, forward, input, pattern, withPos, slab) + } + + // Phase 1. Optimized search for ASCII string + idx := asciiFuzzyIndex(input, pattern, caseSensitive) + if idx < 0 { + return Result{-1, -1, 0}, nil + } + + // Reuse pre-allocated integer slice to avoid unnecessary sweeping of garbages + offset16 := 0 + offset32 := 0 + offset16, H0 := alloc16(offset16, slab, N) + offset16, C0 := alloc16(offset16, slab, N) + // Bonus point for each position + offset16, B := alloc16(offset16, slab, N) + // The first occurrence of each character in the pattern + offset32, F := alloc32(offset32, slab, M) + // Rune array + _, T := alloc32(offset32, slab, N) + input.CopyRunes(T) + + // Phase 2. Calculate bonus for each point + maxScore, maxScorePos := int16(0), 0 + pidx, lastIdx := 0, 0 + pchar0, pchar, prevH0, prevClass, inGap := pattern[0], pattern[0], int16(0), charNonWord, false + Tsub := T[idx:] + H0sub, C0sub, Bsub := H0[idx:][:len(Tsub)], C0[idx:][:len(Tsub)], B[idx:][:len(Tsub)] + for off, char := range Tsub { + var class charClass + if char <= unicode.MaxASCII { + class = charClassOfAscii(char) + if !caseSensitive && class == charUpper { + char += 32 + } + } else { + class = charClassOfNonAscii(char) + if !caseSensitive && class == charUpper { + char = unicode.To(unicode.LowerCase, char) + } + if normalize { + char = normalizeRune(char) + } + } + + Tsub[off] = char + bonus := bonusFor(prevClass, class) + Bsub[off] = bonus + prevClass = class + + if char == pchar { + if pidx < M { + F[pidx] = int32(idx + off) + pidx++ + pchar = pattern[util.Min(pidx, M-1)] + } + lastIdx = idx + off + } + + if char == pchar0 { + score := scoreMatch + bonus*bonusFirstCharMultiplier + H0sub[off] = score + C0sub[off] = 1 + if M == 1 && (forward && score > maxScore || !forward && score >= maxScore) { + maxScore, maxScorePos = score, idx+off + if forward && bonus == bonusBoundary { + break + } + } + inGap = false + } else { + if inGap { + H0sub[off] = util.Max16(prevH0+scoreGapExtension, 0) + } else { + H0sub[off] = util.Max16(prevH0+scoreGapStart, 0) + } + C0sub[off] = 0 + inGap = true + } + prevH0 = H0sub[off] + } + if pidx != M { + return Result{-1, -1, 0}, nil + } + if M == 1 { + result := Result{maxScorePos, maxScorePos + 1, int(maxScore)} + if !withPos { + return result, nil + } + pos := []int{maxScorePos} + return result, &pos + } + + // Phase 3. Fill in score matrix (H) + // Unlike the original algorithm, we do not allow omission. + f0 := int(F[0]) + width := lastIdx - f0 + 1 + offset16, H := alloc16(offset16, slab, width*M) + copy(H, H0[f0:lastIdx+1]) + + // Possible length of consecutive chunk at each position. + _, C := alloc16(offset16, slab, width*M) + copy(C, C0[f0:lastIdx+1]) + + Fsub := F[1:] + Psub := pattern[1:][:len(Fsub)] + for off, f := range Fsub { + f := int(f) + pchar := Psub[off] + pidx := off + 1 + row := pidx * width + inGap := false + Tsub := T[f : lastIdx+1] + Bsub := B[f:][:len(Tsub)] + Csub := C[row+f-f0:][:len(Tsub)] + Cdiag := C[row+f-f0-1-width:][:len(Tsub)] + Hsub := H[row+f-f0:][:len(Tsub)] + Hdiag := H[row+f-f0-1-width:][:len(Tsub)] + Hleft := H[row+f-f0-1:][:len(Tsub)] + Hleft[0] = 0 + for off, char := range Tsub { + col := off + f + var s1, s2, consecutive int16 + + if inGap { + s2 = Hleft[off] + scoreGapExtension + } else { + s2 = Hleft[off] + scoreGapStart + } + + if pchar == char { + s1 = Hdiag[off] + scoreMatch + b := Bsub[off] + consecutive = Cdiag[off] + 1 + // Break consecutive chunk + if b == bonusBoundary { + consecutive = 1 + } else if consecutive > 1 { + b = util.Max16(b, util.Max16(bonusConsecutive, B[col-int(consecutive)+1])) + } + if s1+b < s2 { + s1 += Bsub[off] + consecutive = 0 + } else { + s1 += b + } + } + Csub[off] = consecutive + + inGap = s1 < s2 + score := util.Max16(util.Max16(s1, s2), 0) + if pidx == M-1 && (forward && score > maxScore || !forward && score >= maxScore) { + maxScore, maxScorePos = score, col + } + Hsub[off] = score + } + } + + if DEBUG { + debugV2(T, pattern, F, lastIdx, H, C) + } + + // Phase 4. (Optional) Backtrace to find character positions + pos := posArray(withPos, M) + j := f0 + if withPos { + i := M - 1 + j = maxScorePos + preferMatch := true + for { + I := i * width + j0 := j - f0 + s := H[I+j0] + + var s1, s2 int16 + if i > 0 && j >= int(F[i]) { + s1 = H[I-width+j0-1] + } + if j > int(F[i]) { + s2 = H[I+j0-1] + } + + if s > s1 && (s > s2 || s == s2 && preferMatch) { + *pos = append(*pos, j) + if i == 0 { + break + } + i-- + } + preferMatch = C[I+j0] > 1 || I+width+j0+1 < len(C) && C[I+width+j0+1] > 0 + j-- + } + } + // Start offset we return here is only relevant when begin tiebreak is used. + // However finding the accurate offset requires backtracking, and we don't + // want to pay extra cost for the option that has lost its importance. + return Result{j, maxScorePos + 1, int(maxScore)}, pos +} + +// Implement the same sorting criteria as V2 +func calculateScore(caseSensitive bool, normalize bool, text *util.Chars, pattern []rune, sidx int, eidx int, withPos bool) (int, *[]int) { + pidx, score, inGap, consecutive, firstBonus := 0, 0, false, 0, int16(0) + pos := posArray(withPos, len(pattern)) + prevClass := charNonWord + if sidx > 0 { + prevClass = charClassOf(text.Get(sidx - 1)) + } + for idx := sidx; idx < eidx; idx++ { + char := text.Get(idx) + class := charClassOf(char) + if !caseSensitive { + if char >= 'A' && char <= 'Z' { + char += 32 + } else if char > unicode.MaxASCII { + char = unicode.To(unicode.LowerCase, char) + } + } + // pattern is already normalized + if normalize { + char = normalizeRune(char) + } + if char == pattern[pidx] { + if withPos { + *pos = append(*pos, idx) + } + score += scoreMatch + bonus := bonusFor(prevClass, class) + if consecutive == 0 { + firstBonus = bonus + } else { + // Break consecutive chunk + if bonus == bonusBoundary { + firstBonus = bonus + } + bonus = util.Max16(util.Max16(bonus, firstBonus), bonusConsecutive) + } + if pidx == 0 { + score += int(bonus * bonusFirstCharMultiplier) + } else { + score += int(bonus) + } + inGap = false + consecutive++ + pidx++ + } else { + if inGap { + score += scoreGapExtension + } else { + score += scoreGapStart + } + inGap = true + consecutive = 0 + firstBonus = 0 + } + prevClass = class + } + return score, pos +} + +// FuzzyMatchV1 performs fuzzy-match +func FuzzyMatchV1(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + if len(pattern) == 0 { + return Result{0, 0, 0}, nil + } + if asciiFuzzyIndex(text, pattern, caseSensitive) < 0 { + return Result{-1, -1, 0}, nil + } + + pidx := 0 + sidx := -1 + eidx := -1 + + lenRunes := text.Length() + lenPattern := len(pattern) + + for index := 0; index < lenRunes; index++ { + char := text.Get(indexAt(index, lenRunes, forward)) + // This is considerably faster than blindly applying strings.ToLower to the + // whole string + if !caseSensitive { + // Partially inlining `unicode.ToLower`. Ugly, but makes a noticeable + // difference in CPU cost. (Measured on Go 1.4.1. Also note that the Go + // compiler as of now does not inline non-leaf functions.) + if char >= 'A' && char <= 'Z' { + char += 32 + } else if char > unicode.MaxASCII { + char = unicode.To(unicode.LowerCase, char) + } + } + if normalize { + char = normalizeRune(char) + } + pchar := pattern[indexAt(pidx, lenPattern, forward)] + if char == pchar { + if sidx < 0 { + sidx = index + } + if pidx++; pidx == lenPattern { + eidx = index + 1 + break + } + } + } + + if sidx >= 0 && eidx >= 0 { + pidx-- + for index := eidx - 1; index >= sidx; index-- { + tidx := indexAt(index, lenRunes, forward) + char := text.Get(tidx) + if !caseSensitive { + if char >= 'A' && char <= 'Z' { + char += 32 + } else if char > unicode.MaxASCII { + char = unicode.To(unicode.LowerCase, char) + } + } + + pidx_ := indexAt(pidx, lenPattern, forward) + pchar := pattern[pidx_] + if char == pchar { + if pidx--; pidx < 0 { + sidx = index + break + } + } + } + + if !forward { + sidx, eidx = lenRunes-eidx, lenRunes-sidx + } + + score, pos := calculateScore(caseSensitive, normalize, text, pattern, sidx, eidx, withPos) + return Result{sidx, eidx, score}, pos + } + return Result{-1, -1, 0}, nil +} + +// ExactMatchNaive is a basic string searching algorithm that handles case +// sensitivity. Although naive, it still performs better than the combination +// of strings.ToLower + strings.Index for typical fzf use cases where input +// strings and patterns are not very long. +// +// Since 0.15.0, this function searches for the match with the highest +// bonus point, instead of stopping immediately after finding the first match. +// The solution is much cheaper since there is only one possible alignment of +// the pattern. +func ExactMatchNaive(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + if len(pattern) == 0 { + return Result{0, 0, 0}, nil + } + + lenRunes := text.Length() + lenPattern := len(pattern) + + if lenRunes < lenPattern { + return Result{-1, -1, 0}, nil + } + + if asciiFuzzyIndex(text, pattern, caseSensitive) < 0 { + return Result{-1, -1, 0}, nil + } + + // For simplicity, only look at the bonus at the first character position + pidx := 0 + bestPos, bonus, bestBonus := -1, int16(0), int16(-1) + for index := 0; index < lenRunes; index++ { + index_ := indexAt(index, lenRunes, forward) + char := text.Get(index_) + if !caseSensitive { + if char >= 'A' && char <= 'Z' { + char += 32 + } else if char > unicode.MaxASCII { + char = unicode.To(unicode.LowerCase, char) + } + } + if normalize { + char = normalizeRune(char) + } + pidx_ := indexAt(pidx, lenPattern, forward) + pchar := pattern[pidx_] + if pchar == char { + if pidx_ == 0 { + bonus = bonusAt(text, index_) + } + pidx++ + if pidx == lenPattern { + if bonus > bestBonus { + bestPos, bestBonus = index, bonus + } + if bonus == bonusBoundary { + break + } + index -= pidx - 1 + pidx, bonus = 0, 0 + } + } else { + index -= pidx + pidx, bonus = 0, 0 + } + } + if bestPos >= 0 { + var sidx, eidx int + if forward { + sidx = bestPos - lenPattern + 1 + eidx = bestPos + 1 + } else { + sidx = lenRunes - (bestPos + 1) + eidx = lenRunes - (bestPos - lenPattern + 1) + } + score, _ := calculateScore(caseSensitive, normalize, text, pattern, sidx, eidx, false) + return Result{sidx, eidx, score}, nil + } + return Result{-1, -1, 0}, nil +} + +// PrefixMatch performs prefix-match +func PrefixMatch(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + if len(pattern) == 0 { + return Result{0, 0, 0}, nil + } + + trimmedLen := 0 + if !unicode.IsSpace(pattern[0]) { + trimmedLen = text.LeadingWhitespaces() + } + + if text.Length()-trimmedLen < len(pattern) { + return Result{-1, -1, 0}, nil + } + + for index, r := range pattern { + char := text.Get(trimmedLen + index) + if !caseSensitive { + char = unicode.ToLower(char) + } + if normalize { + char = normalizeRune(char) + } + if char != r { + return Result{-1, -1, 0}, nil + } + } + lenPattern := len(pattern) + score, _ := calculateScore(caseSensitive, normalize, text, pattern, trimmedLen, trimmedLen+lenPattern, false) + return Result{trimmedLen, trimmedLen + lenPattern, score}, nil +} + +// SuffixMatch performs suffix-match +func SuffixMatch(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + lenRunes := text.Length() + trimmedLen := lenRunes + if len(pattern) == 0 || !unicode.IsSpace(pattern[len(pattern)-1]) { + trimmedLen -= text.TrailingWhitespaces() + } + if len(pattern) == 0 { + return Result{trimmedLen, trimmedLen, 0}, nil + } + diff := trimmedLen - len(pattern) + if diff < 0 { + return Result{-1, -1, 0}, nil + } + + for index, r := range pattern { + char := text.Get(index + diff) + if !caseSensitive { + char = unicode.ToLower(char) + } + if normalize { + char = normalizeRune(char) + } + if char != r { + return Result{-1, -1, 0}, nil + } + } + lenPattern := len(pattern) + sidx := trimmedLen - lenPattern + eidx := trimmedLen + score, _ := calculateScore(caseSensitive, normalize, text, pattern, sidx, eidx, false) + return Result{sidx, eidx, score}, nil +} + +// EqualMatch performs equal-match +func EqualMatch(caseSensitive bool, normalize bool, forward bool, text *util.Chars, pattern []rune, withPos bool, slab *util.Slab) (Result, *[]int) { + lenPattern := len(pattern) + if lenPattern == 0 { + return Result{-1, -1, 0}, nil + } + + // Strip leading whitespaces + trimmedLen := 0 + if !unicode.IsSpace(pattern[0]) { + trimmedLen = text.LeadingWhitespaces() + } + + // Strip trailing whitespaces + trimmedEndLen := 0 + if !unicode.IsSpace(pattern[lenPattern-1]) { + trimmedEndLen = text.TrailingWhitespaces() + } + + if text.Length()-trimmedLen-trimmedEndLen != lenPattern { + return Result{-1, -1, 0}, nil + } + match := true + if normalize { + runes := text.ToRunes() + for idx, pchar := range pattern { + char := runes[trimmedLen+idx] + if !caseSensitive { + char = unicode.To(unicode.LowerCase, char) + } + if normalizeRune(pchar) != normalizeRune(char) { + match = false + break + } + } + } else { + runes := text.ToRunes() + runesStr := string(runes[trimmedLen : len(runes)-trimmedEndLen]) + if !caseSensitive { + runesStr = strings.ToLower(runesStr) + } + match = runesStr == string(pattern) + } + if match { + return Result{trimmedLen, trimmedLen + lenPattern, (scoreMatch+bonusBoundary)*lenPattern + + (bonusFirstCharMultiplier-1)*bonusBoundary}, nil + } + return Result{-1, -1, 0}, nil +} diff --git a/.fzf/src/algo/algo_test.go b/.fzf/src/algo/algo_test.go new file mode 100644 index 0000000..218ca1f --- /dev/null +++ b/.fzf/src/algo/algo_test.go @@ -0,0 +1,197 @@ +package algo + +import ( + "math" + "sort" + "strings" + "testing" + + "github.com/junegunn/fzf/src/util" +) + +func assertMatch(t *testing.T, fun Algo, caseSensitive, forward bool, input, pattern string, sidx int, eidx int, score int) { + assertMatch2(t, fun, caseSensitive, false, forward, input, pattern, sidx, eidx, score) +} + +func assertMatch2(t *testing.T, fun Algo, caseSensitive, normalize, forward bool, input, pattern string, sidx int, eidx int, score int) { + if !caseSensitive { + pattern = strings.ToLower(pattern) + } + chars := util.ToChars([]byte(input)) + res, pos := fun(caseSensitive, normalize, forward, &chars, []rune(pattern), true, nil) + var start, end int + if pos == nil || len(*pos) == 0 { + start = res.Start + end = res.End + } else { + sort.Ints(*pos) + start = (*pos)[0] + end = (*pos)[len(*pos)-1] + 1 + } + if start != sidx { + t.Errorf("Invalid start index: %d (expected: %d, %s / %s)", start, sidx, input, pattern) + } + if end != eidx { + t.Errorf("Invalid end index: %d (expected: %d, %s / %s)", end, eidx, input, pattern) + } + if res.Score != score { + t.Errorf("Invalid score: %d (expected: %d, %s / %s)", res.Score, score, input, pattern) + } +} + +func TestFuzzyMatch(t *testing.T) { + for _, fn := range []Algo{FuzzyMatchV1, FuzzyMatchV2} { + for _, forward := range []bool{true, false} { + assertMatch(t, fn, false, forward, "fooBarbaz1", "oBZ", 2, 9, + scoreMatch*3+bonusCamel123+scoreGapStart+scoreGapExtension*3) + assertMatch(t, fn, false, forward, "foo bar baz", "fbb", 0, 9, + scoreMatch*3+bonusBoundary*bonusFirstCharMultiplier+ + bonusBoundary*2+2*scoreGapStart+4*scoreGapExtension) + assertMatch(t, fn, false, forward, "/AutomatorDocument.icns", "rdoc", 9, 13, + scoreMatch*4+bonusCamel123+bonusConsecutive*2) + assertMatch(t, fn, false, forward, "/man1/zshcompctl.1", "zshc", 6, 10, + scoreMatch*4+bonusBoundary*bonusFirstCharMultiplier+bonusBoundary*3) + assertMatch(t, fn, false, forward, "/.oh-my-zsh/cache", "zshc", 8, 13, + scoreMatch*4+bonusBoundary*bonusFirstCharMultiplier+bonusBoundary*3+scoreGapStart) + assertMatch(t, fn, false, forward, "ab0123 456", "12356", 3, 10, + scoreMatch*5+bonusConsecutive*3+scoreGapStart+scoreGapExtension) + assertMatch(t, fn, false, forward, "abc123 456", "12356", 3, 10, + scoreMatch*5+bonusCamel123*bonusFirstCharMultiplier+bonusCamel123*2+bonusConsecutive+scoreGapStart+scoreGapExtension) + assertMatch(t, fn, false, forward, "foo/bar/baz", "fbb", 0, 9, + scoreMatch*3+bonusBoundary*bonusFirstCharMultiplier+ + bonusBoundary*2+2*scoreGapStart+4*scoreGapExtension) + assertMatch(t, fn, false, forward, "fooBarBaz", "fbb", 0, 7, + scoreMatch*3+bonusBoundary*bonusFirstCharMultiplier+ + bonusCamel123*2+2*scoreGapStart+2*scoreGapExtension) + assertMatch(t, fn, false, forward, "foo barbaz", "fbb", 0, 8, + scoreMatch*3+bonusBoundary*bonusFirstCharMultiplier+bonusBoundary+ + scoreGapStart*2+scoreGapExtension*3) + assertMatch(t, fn, false, forward, "fooBar Baz", "foob", 0, 4, + scoreMatch*4+bonusBoundary*bonusFirstCharMultiplier+bonusBoundary*3) + assertMatch(t, fn, false, forward, "xFoo-Bar Baz", "foo-b", 1, 6, + scoreMatch*5+bonusCamel123*bonusFirstCharMultiplier+bonusCamel123*2+ + bonusNonWord+bonusBoundary) + + assertMatch(t, fn, true, forward, "fooBarbaz", "oBz", 2, 9, + scoreMatch*3+bonusCamel123+scoreGapStart+scoreGapExtension*3) + assertMatch(t, fn, true, forward, "Foo/Bar/Baz", "FBB", 0, 9, + scoreMatch*3+bonusBoundary*(bonusFirstCharMultiplier+2)+ + scoreGapStart*2+scoreGapExtension*4) + assertMatch(t, fn, true, forward, "FooBarBaz", "FBB", 0, 7, + scoreMatch*3+bonusBoundary*bonusFirstCharMultiplier+bonusCamel123*2+ + scoreGapStart*2+scoreGapExtension*2) + assertMatch(t, fn, true, forward, "FooBar Baz", "FooB", 0, 4, + scoreMatch*4+bonusBoundary*bonusFirstCharMultiplier+bonusBoundary*2+ + util.Max(bonusCamel123, bonusBoundary)) + + // Consecutive bonus updated + assertMatch(t, fn, true, forward, "foo-bar", "o-ba", 2, 6, + scoreMatch*4+bonusBoundary*3) + + // Non-match + assertMatch(t, fn, true, forward, "fooBarbaz", "oBZ", -1, -1, 0) + assertMatch(t, fn, true, forward, "Foo Bar Baz", "fbb", -1, -1, 0) + assertMatch(t, fn, true, forward, "fooBarbaz", "fooBarbazz", -1, -1, 0) + } + } +} + +func TestFuzzyMatchBackward(t *testing.T) { + assertMatch(t, FuzzyMatchV1, false, true, "foobar fb", "fb", 0, 4, + scoreMatch*2+bonusBoundary*bonusFirstCharMultiplier+ + scoreGapStart+scoreGapExtension) + assertMatch(t, FuzzyMatchV1, false, false, "foobar fb", "fb", 7, 9, + scoreMatch*2+bonusBoundary*bonusFirstCharMultiplier+bonusBoundary) +} + +func TestExactMatchNaive(t *testing.T) { + for _, dir := range []bool{true, false} { + assertMatch(t, ExactMatchNaive, true, dir, "fooBarbaz", "oBA", -1, -1, 0) + assertMatch(t, ExactMatchNaive, true, dir, "fooBarbaz", "fooBarbazz", -1, -1, 0) + + assertMatch(t, ExactMatchNaive, false, dir, "fooBarbaz", "oBA", 2, 5, + scoreMatch*3+bonusCamel123+bonusConsecutive) + assertMatch(t, ExactMatchNaive, false, dir, "/AutomatorDocument.icns", "rdoc", 9, 13, + scoreMatch*4+bonusCamel123+bonusConsecutive*2) + assertMatch(t, ExactMatchNaive, false, dir, "/man1/zshcompctl.1", "zshc", 6, 10, + scoreMatch*4+bonusBoundary*(bonusFirstCharMultiplier+3)) + assertMatch(t, ExactMatchNaive, false, dir, "/.oh-my-zsh/cache", "zsh/c", 8, 13, + scoreMatch*5+bonusBoundary*(bonusFirstCharMultiplier+4)) + } +} + +func TestExactMatchNaiveBackward(t *testing.T) { + assertMatch(t, ExactMatchNaive, false, true, "foobar foob", "oo", 1, 3, + scoreMatch*2+bonusConsecutive) + assertMatch(t, ExactMatchNaive, false, false, "foobar foob", "oo", 8, 10, + scoreMatch*2+bonusConsecutive) +} + +func TestPrefixMatch(t *testing.T) { + score := (scoreMatch+bonusBoundary)*3 + bonusBoundary*(bonusFirstCharMultiplier-1) + + for _, dir := range []bool{true, false} { + assertMatch(t, PrefixMatch, true, dir, "fooBarbaz", "Foo", -1, -1, 0) + assertMatch(t, PrefixMatch, false, dir, "fooBarBaz", "baz", -1, -1, 0) + assertMatch(t, PrefixMatch, false, dir, "fooBarbaz", "Foo", 0, 3, score) + assertMatch(t, PrefixMatch, false, dir, "foOBarBaZ", "foo", 0, 3, score) + assertMatch(t, PrefixMatch, false, dir, "f-oBarbaz", "f-o", 0, 3, score) + + assertMatch(t, PrefixMatch, false, dir, " fooBar", "foo", 1, 4, score) + assertMatch(t, PrefixMatch, false, dir, " fooBar", " fo", 0, 3, score) + assertMatch(t, PrefixMatch, false, dir, " fo", "foo", -1, -1, 0) + } +} + +func TestSuffixMatch(t *testing.T) { + for _, dir := range []bool{true, false} { + assertMatch(t, SuffixMatch, true, dir, "fooBarbaz", "Baz", -1, -1, 0) + assertMatch(t, SuffixMatch, false, dir, "fooBarbaz", "Foo", -1, -1, 0) + + assertMatch(t, SuffixMatch, false, dir, "fooBarbaz", "baz", 6, 9, + scoreMatch*3+bonusConsecutive*2) + assertMatch(t, SuffixMatch, false, dir, "fooBarBaZ", "baz", 6, 9, + (scoreMatch+bonusCamel123)*3+bonusCamel123*(bonusFirstCharMultiplier-1)) + + // Strip trailing white space from the string + assertMatch(t, SuffixMatch, false, dir, "fooBarbaz ", "baz", 6, 9, + scoreMatch*3+bonusConsecutive*2) + // Only when the pattern doesn't end with a space + assertMatch(t, SuffixMatch, false, dir, "fooBarbaz ", "baz ", 6, 10, + scoreMatch*4+bonusConsecutive*2+bonusNonWord) + } +} + +func TestEmptyPattern(t *testing.T) { + for _, dir := range []bool{true, false} { + assertMatch(t, FuzzyMatchV1, true, dir, "foobar", "", 0, 0, 0) + assertMatch(t, FuzzyMatchV2, true, dir, "foobar", "", 0, 0, 0) + assertMatch(t, ExactMatchNaive, true, dir, "foobar", "", 0, 0, 0) + assertMatch(t, PrefixMatch, true, dir, "foobar", "", 0, 0, 0) + assertMatch(t, SuffixMatch, true, dir, "foobar", "", 6, 6, 0) + } +} + +func TestNormalize(t *testing.T) { + caseSensitive := false + normalize := true + forward := true + test := func(input, pattern string, sidx, eidx, score int, funs ...Algo) { + for _, fun := range funs { + assertMatch2(t, fun, caseSensitive, normalize, forward, + input, pattern, sidx, eidx, score) + } + } + test("Só Danço Samba", "So", 0, 2, 56, FuzzyMatchV1, FuzzyMatchV2, PrefixMatch, ExactMatchNaive) + test("Só Danço Samba", "sodc", 0, 7, 89, FuzzyMatchV1, FuzzyMatchV2) + test("Danço", "danco", 0, 5, 128, FuzzyMatchV1, FuzzyMatchV2, PrefixMatch, SuffixMatch, ExactMatchNaive, EqualMatch) +} + +func TestLongString(t *testing.T) { + bytes := make([]byte, math.MaxUint16*2) + for i := range bytes { + bytes[i] = 'x' + } + bytes[math.MaxUint16] = 'z' + assertMatch(t, FuzzyMatchV2, true, true, string(bytes), "zx", math.MaxUint16, math.MaxUint16+2, scoreMatch*2+bonusConsecutive) +} diff --git a/.fzf/src/algo/normalize.go b/.fzf/src/algo/normalize.go new file mode 100644 index 0000000..9324790 --- /dev/null +++ b/.fzf/src/algo/normalize.go @@ -0,0 +1,492 @@ +// Normalization of latin script letters +// Reference: http://www.unicode.org/Public/UCD/latest/ucd/Index.txt + +package algo + +var normalized map[rune]rune = map[rune]rune{ + 0x00E1: 'a', // WITH ACUTE, LATIN SMALL LETTER + 0x0103: 'a', // WITH BREVE, LATIN SMALL LETTER + 0x01CE: 'a', // WITH CARON, LATIN SMALL LETTER + 0x00E2: 'a', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x00E4: 'a', // WITH DIAERESIS, LATIN SMALL LETTER + 0x0227: 'a', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1EA1: 'a', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0201: 'a', // WITH DOUBLE GRAVE, LATIN SMALL LETTER + 0x00E0: 'a', // WITH GRAVE, LATIN SMALL LETTER + 0x1EA3: 'a', // WITH HOOK ABOVE, LATIN SMALL LETTER + 0x0203: 'a', // WITH INVERTED BREVE, LATIN SMALL LETTER + 0x0101: 'a', // WITH MACRON, LATIN SMALL LETTER + 0x0105: 'a', // WITH OGONEK, LATIN SMALL LETTER + 0x1E9A: 'a', // WITH RIGHT HALF RING, LATIN SMALL LETTER + 0x00E5: 'a', // WITH RING ABOVE, LATIN SMALL LETTER + 0x1E01: 'a', // WITH RING BELOW, LATIN SMALL LETTER + 0x00E3: 'a', // WITH TILDE, LATIN SMALL LETTER + 0x0363: 'a', // , COMBINING LATIN SMALL LETTER + 0x0250: 'a', // , LATIN SMALL LETTER TURNED + 0x1E03: 'b', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E05: 'b', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0253: 'b', // WITH HOOK, LATIN SMALL LETTER + 0x1E07: 'b', // WITH LINE BELOW, LATIN SMALL LETTER + 0x0180: 'b', // WITH STROKE, LATIN SMALL LETTER + 0x0183: 'b', // WITH TOPBAR, LATIN SMALL LETTER + 0x0107: 'c', // WITH ACUTE, LATIN SMALL LETTER + 0x010D: 'c', // WITH CARON, LATIN SMALL LETTER + 0x00E7: 'c', // WITH CEDILLA, LATIN SMALL LETTER + 0x0109: 'c', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x0255: 'c', // WITH CURL, LATIN SMALL LETTER + 0x010B: 'c', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x0188: 'c', // WITH HOOK, LATIN SMALL LETTER + 0x023C: 'c', // WITH STROKE, LATIN SMALL LETTER + 0x0368: 'c', // , COMBINING LATIN SMALL LETTER + 0x0297: 'c', // , LATIN LETTER STRETCHED + 0x2184: 'c', // , LATIN SMALL LETTER REVERSED + 0x010F: 'd', // WITH CARON, LATIN SMALL LETTER + 0x1E11: 'd', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E13: 'd', // WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER + 0x0221: 'd', // WITH CURL, LATIN SMALL LETTER + 0x1E0B: 'd', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E0D: 'd', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0257: 'd', // WITH HOOK, LATIN SMALL LETTER + 0x1E0F: 'd', // WITH LINE BELOW, LATIN SMALL LETTER + 0x0111: 'd', // WITH STROKE, LATIN SMALL LETTER + 0x0256: 'd', // WITH TAIL, LATIN SMALL LETTER + 0x018C: 'd', // WITH TOPBAR, LATIN SMALL LETTER + 0x0369: 'd', // , COMBINING LATIN SMALL LETTER + 0x00E9: 'e', // WITH ACUTE, LATIN SMALL LETTER + 0x0115: 'e', // WITH BREVE, LATIN SMALL LETTER + 0x011B: 'e', // WITH CARON, LATIN SMALL LETTER + 0x0229: 'e', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E19: 'e', // WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER + 0x00EA: 'e', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x00EB: 'e', // WITH DIAERESIS, LATIN SMALL LETTER + 0x0117: 'e', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1EB9: 'e', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0205: 'e', // WITH DOUBLE GRAVE, LATIN SMALL LETTER + 0x00E8: 'e', // WITH GRAVE, LATIN SMALL LETTER + 0x1EBB: 'e', // WITH HOOK ABOVE, LATIN SMALL LETTER + 0x025D: 'e', // WITH HOOK, LATIN SMALL LETTER REVERSED OPEN + 0x0207: 'e', // WITH INVERTED BREVE, LATIN SMALL LETTER + 0x0113: 'e', // WITH MACRON, LATIN SMALL LETTER + 0x0119: 'e', // WITH OGONEK, LATIN SMALL LETTER + 0x0247: 'e', // WITH STROKE, LATIN SMALL LETTER + 0x1E1B: 'e', // WITH TILDE BELOW, LATIN SMALL LETTER + 0x1EBD: 'e', // WITH TILDE, LATIN SMALL LETTER + 0x0364: 'e', // , COMBINING LATIN SMALL LETTER + 0x029A: 'e', // , LATIN SMALL LETTER CLOSED OPEN + 0x025E: 'e', // , LATIN SMALL LETTER CLOSED REVERSED OPEN + 0x025B: 'e', // , LATIN SMALL LETTER OPEN + 0x0258: 'e', // , LATIN SMALL LETTER REVERSED + 0x025C: 'e', // , LATIN SMALL LETTER REVERSED OPEN + 0x01DD: 'e', // , LATIN SMALL LETTER TURNED + 0x1D08: 'e', // , LATIN SMALL LETTER TURNED OPEN + 0x1E1F: 'f', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x0192: 'f', // WITH HOOK, LATIN SMALL LETTER + 0x01F5: 'g', // WITH ACUTE, LATIN SMALL LETTER + 0x011F: 'g', // WITH BREVE, LATIN SMALL LETTER + 0x01E7: 'g', // WITH CARON, LATIN SMALL LETTER + 0x0123: 'g', // WITH CEDILLA, LATIN SMALL LETTER + 0x011D: 'g', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x0121: 'g', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x0260: 'g', // WITH HOOK, LATIN SMALL LETTER + 0x1E21: 'g', // WITH MACRON, LATIN SMALL LETTER + 0x01E5: 'g', // WITH STROKE, LATIN SMALL LETTER + 0x0261: 'g', // , LATIN SMALL LETTER SCRIPT + 0x1E2B: 'h', // WITH BREVE BELOW, LATIN SMALL LETTER + 0x021F: 'h', // WITH CARON, LATIN SMALL LETTER + 0x1E29: 'h', // WITH CEDILLA, LATIN SMALL LETTER + 0x0125: 'h', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x1E27: 'h', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1E23: 'h', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E25: 'h', // WITH DOT BELOW, LATIN SMALL LETTER + 0x02AE: 'h', // WITH FISHHOOK, LATIN SMALL LETTER TURNED + 0x0266: 'h', // WITH HOOK, LATIN SMALL LETTER + 0x1E96: 'h', // WITH LINE BELOW, LATIN SMALL LETTER + 0x0127: 'h', // WITH STROKE, LATIN SMALL LETTER + 0x036A: 'h', // , COMBINING LATIN SMALL LETTER + 0x0265: 'h', // , LATIN SMALL LETTER TURNED + 0x2095: 'h', // , LATIN SUBSCRIPT SMALL LETTER + 0x00ED: 'i', // WITH ACUTE, LATIN SMALL LETTER + 0x012D: 'i', // WITH BREVE, LATIN SMALL LETTER + 0x01D0: 'i', // WITH CARON, LATIN SMALL LETTER + 0x00EE: 'i', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x00EF: 'i', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1ECB: 'i', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0209: 'i', // WITH DOUBLE GRAVE, LATIN SMALL LETTER + 0x00EC: 'i', // WITH GRAVE, LATIN SMALL LETTER + 0x1EC9: 'i', // WITH HOOK ABOVE, LATIN SMALL LETTER + 0x020B: 'i', // WITH INVERTED BREVE, LATIN SMALL LETTER + 0x012B: 'i', // WITH MACRON, LATIN SMALL LETTER + 0x012F: 'i', // WITH OGONEK, LATIN SMALL LETTER + 0x0268: 'i', // WITH STROKE, LATIN SMALL LETTER + 0x1E2D: 'i', // WITH TILDE BELOW, LATIN SMALL LETTER + 0x0129: 'i', // WITH TILDE, LATIN SMALL LETTER + 0x0365: 'i', // , COMBINING LATIN SMALL LETTER + 0x0131: 'i', // , LATIN SMALL LETTER DOTLESS + 0x1D09: 'i', // , LATIN SMALL LETTER TURNED + 0x1D62: 'i', // , LATIN SUBSCRIPT SMALL LETTER + 0x2071: 'i', // , SUPERSCRIPT LATIN SMALL LETTER + 0x01F0: 'j', // WITH CARON, LATIN SMALL LETTER + 0x0135: 'j', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x029D: 'j', // WITH CROSSED-TAIL, LATIN SMALL LETTER + 0x0249: 'j', // WITH STROKE, LATIN SMALL LETTER + 0x025F: 'j', // WITH STROKE, LATIN SMALL LETTER DOTLESS + 0x0237: 'j', // , LATIN SMALL LETTER DOTLESS + 0x1E31: 'k', // WITH ACUTE, LATIN SMALL LETTER + 0x01E9: 'k', // WITH CARON, LATIN SMALL LETTER + 0x0137: 'k', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E33: 'k', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0199: 'k', // WITH HOOK, LATIN SMALL LETTER + 0x1E35: 'k', // WITH LINE BELOW, LATIN SMALL LETTER + 0x029E: 'k', // , LATIN SMALL LETTER TURNED + 0x2096: 'k', // , LATIN SUBSCRIPT SMALL LETTER + 0x013A: 'l', // WITH ACUTE, LATIN SMALL LETTER + 0x019A: 'l', // WITH BAR, LATIN SMALL LETTER + 0x026C: 'l', // WITH BELT, LATIN SMALL LETTER + 0x013E: 'l', // WITH CARON, LATIN SMALL LETTER + 0x013C: 'l', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E3D: 'l', // WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER + 0x0234: 'l', // WITH CURL, LATIN SMALL LETTER + 0x1E37: 'l', // WITH DOT BELOW, LATIN SMALL LETTER + 0x1E3B: 'l', // WITH LINE BELOW, LATIN SMALL LETTER + 0x0140: 'l', // WITH MIDDLE DOT, LATIN SMALL LETTER + 0x026B: 'l', // WITH MIDDLE TILDE, LATIN SMALL LETTER + 0x026D: 'l', // WITH RETROFLEX HOOK, LATIN SMALL LETTER + 0x0142: 'l', // WITH STROKE, LATIN SMALL LETTER + 0x2097: 'l', // , LATIN SUBSCRIPT SMALL LETTER + 0x1E3F: 'm', // WITH ACUTE, LATIN SMALL LETTER + 0x1E41: 'm', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E43: 'm', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0271: 'm', // WITH HOOK, LATIN SMALL LETTER + 0x0270: 'm', // WITH LONG LEG, LATIN SMALL LETTER TURNED + 0x036B: 'm', // , COMBINING LATIN SMALL LETTER + 0x1D1F: 'm', // , LATIN SMALL LETTER SIDEWAYS TURNED + 0x026F: 'm', // , LATIN SMALL LETTER TURNED + 0x2098: 'm', // , LATIN SUBSCRIPT SMALL LETTER + 0x0144: 'n', // WITH ACUTE, LATIN SMALL LETTER + 0x0148: 'n', // WITH CARON, LATIN SMALL LETTER + 0x0146: 'n', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E4B: 'n', // WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER + 0x0235: 'n', // WITH CURL, LATIN SMALL LETTER + 0x1E45: 'n', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E47: 'n', // WITH DOT BELOW, LATIN SMALL LETTER + 0x01F9: 'n', // WITH GRAVE, LATIN SMALL LETTER + 0x0272: 'n', // WITH LEFT HOOK, LATIN SMALL LETTER + 0x1E49: 'n', // WITH LINE BELOW, LATIN SMALL LETTER + 0x019E: 'n', // WITH LONG RIGHT LEG, LATIN SMALL LETTER + 0x0273: 'n', // WITH RETROFLEX HOOK, LATIN SMALL LETTER + 0x00F1: 'n', // WITH TILDE, LATIN SMALL LETTER + 0x2099: 'n', // , LATIN SUBSCRIPT SMALL LETTER + 0x00F3: 'o', // WITH ACUTE, LATIN SMALL LETTER + 0x014F: 'o', // WITH BREVE, LATIN SMALL LETTER + 0x01D2: 'o', // WITH CARON, LATIN SMALL LETTER + 0x00F4: 'o', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x00F6: 'o', // WITH DIAERESIS, LATIN SMALL LETTER + 0x022F: 'o', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1ECD: 'o', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0151: 'o', // WITH DOUBLE ACUTE, LATIN SMALL LETTER + 0x020D: 'o', // WITH DOUBLE GRAVE, LATIN SMALL LETTER + 0x00F2: 'o', // WITH GRAVE, LATIN SMALL LETTER + 0x1ECF: 'o', // WITH HOOK ABOVE, LATIN SMALL LETTER + 0x01A1: 'o', // WITH HORN, LATIN SMALL LETTER + 0x020F: 'o', // WITH INVERTED BREVE, LATIN SMALL LETTER + 0x014D: 'o', // WITH MACRON, LATIN SMALL LETTER + 0x01EB: 'o', // WITH OGONEK, LATIN SMALL LETTER + 0x00F8: 'o', // WITH STROKE, LATIN SMALL LETTER + 0x1D13: 'o', // WITH STROKE, LATIN SMALL LETTER SIDEWAYS + 0x00F5: 'o', // WITH TILDE, LATIN SMALL LETTER + 0x0366: 'o', // , COMBINING LATIN SMALL LETTER + 0x0275: 'o', // , LATIN SMALL LETTER BARRED + 0x1D17: 'o', // , LATIN SMALL LETTER BOTTOM HALF + 0x0254: 'o', // , LATIN SMALL LETTER OPEN + 0x1D11: 'o', // , LATIN SMALL LETTER SIDEWAYS + 0x1D12: 'o', // , LATIN SMALL LETTER SIDEWAYS OPEN + 0x1D16: 'o', // , LATIN SMALL LETTER TOP HALF + 0x1E55: 'p', // WITH ACUTE, LATIN SMALL LETTER + 0x1E57: 'p', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x01A5: 'p', // WITH HOOK, LATIN SMALL LETTER + 0x209A: 'p', // , LATIN SUBSCRIPT SMALL LETTER + 0x024B: 'q', // WITH HOOK TAIL, LATIN SMALL LETTER + 0x02A0: 'q', // WITH HOOK, LATIN SMALL LETTER + 0x0155: 'r', // WITH ACUTE, LATIN SMALL LETTER + 0x0159: 'r', // WITH CARON, LATIN SMALL LETTER + 0x0157: 'r', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E59: 'r', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E5B: 'r', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0211: 'r', // WITH DOUBLE GRAVE, LATIN SMALL LETTER + 0x027E: 'r', // WITH FISHHOOK, LATIN SMALL LETTER + 0x027F: 'r', // WITH FISHHOOK, LATIN SMALL LETTER REVERSED + 0x027B: 'r', // WITH HOOK, LATIN SMALL LETTER TURNED + 0x0213: 'r', // WITH INVERTED BREVE, LATIN SMALL LETTER + 0x1E5F: 'r', // WITH LINE BELOW, LATIN SMALL LETTER + 0x027C: 'r', // WITH LONG LEG, LATIN SMALL LETTER + 0x027A: 'r', // WITH LONG LEG, LATIN SMALL LETTER TURNED + 0x024D: 'r', // WITH STROKE, LATIN SMALL LETTER + 0x027D: 'r', // WITH TAIL, LATIN SMALL LETTER + 0x036C: 'r', // , COMBINING LATIN SMALL LETTER + 0x0279: 'r', // , LATIN SMALL LETTER TURNED + 0x1D63: 'r', // , LATIN SUBSCRIPT SMALL LETTER + 0x015B: 's', // WITH ACUTE, LATIN SMALL LETTER + 0x0161: 's', // WITH CARON, LATIN SMALL LETTER + 0x015F: 's', // WITH CEDILLA, LATIN SMALL LETTER + 0x015D: 's', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x0219: 's', // WITH COMMA BELOW, LATIN SMALL LETTER + 0x1E61: 's', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E9B: 's', // WITH DOT ABOVE, LATIN SMALL LETTER LONG + 0x1E63: 's', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0282: 's', // WITH HOOK, LATIN SMALL LETTER + 0x023F: 's', // WITH SWASH TAIL, LATIN SMALL LETTER + 0x017F: 's', // , LATIN SMALL LETTER LONG + 0x00DF: 's', // , LATIN SMALL LETTER SHARP + 0x209B: 's', // , LATIN SUBSCRIPT SMALL LETTER + 0x0165: 't', // WITH CARON, LATIN SMALL LETTER + 0x0163: 't', // WITH CEDILLA, LATIN SMALL LETTER + 0x1E71: 't', // WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER + 0x021B: 't', // WITH COMMA BELOW, LATIN SMALL LETTER + 0x0236: 't', // WITH CURL, LATIN SMALL LETTER + 0x1E97: 't', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1E6B: 't', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E6D: 't', // WITH DOT BELOW, LATIN SMALL LETTER + 0x01AD: 't', // WITH HOOK, LATIN SMALL LETTER + 0x1E6F: 't', // WITH LINE BELOW, LATIN SMALL LETTER + 0x01AB: 't', // WITH PALATAL HOOK, LATIN SMALL LETTER + 0x0288: 't', // WITH RETROFLEX HOOK, LATIN SMALL LETTER + 0x0167: 't', // WITH STROKE, LATIN SMALL LETTER + 0x036D: 't', // , COMBINING LATIN SMALL LETTER + 0x0287: 't', // , LATIN SMALL LETTER TURNED + 0x209C: 't', // , LATIN SUBSCRIPT SMALL LETTER + 0x0289: 'u', // BAR, LATIN SMALL LETTER + 0x00FA: 'u', // WITH ACUTE, LATIN SMALL LETTER + 0x016D: 'u', // WITH BREVE, LATIN SMALL LETTER + 0x01D4: 'u', // WITH CARON, LATIN SMALL LETTER + 0x1E77: 'u', // WITH CIRCUMFLEX BELOW, LATIN SMALL LETTER + 0x00FB: 'u', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x1E73: 'u', // WITH DIAERESIS BELOW, LATIN SMALL LETTER + 0x00FC: 'u', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1EE5: 'u', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0171: 'u', // WITH DOUBLE ACUTE, LATIN SMALL LETTER + 0x0215: 'u', // WITH DOUBLE GRAVE, LATIN SMALL LETTER + 0x00F9: 'u', // WITH GRAVE, LATIN SMALL LETTER + 0x1EE7: 'u', // WITH HOOK ABOVE, LATIN SMALL LETTER + 0x01B0: 'u', // WITH HORN, LATIN SMALL LETTER + 0x0217: 'u', // WITH INVERTED BREVE, LATIN SMALL LETTER + 0x016B: 'u', // WITH MACRON, LATIN SMALL LETTER + 0x0173: 'u', // WITH OGONEK, LATIN SMALL LETTER + 0x016F: 'u', // WITH RING ABOVE, LATIN SMALL LETTER + 0x1E75: 'u', // WITH TILDE BELOW, LATIN SMALL LETTER + 0x0169: 'u', // WITH TILDE, LATIN SMALL LETTER + 0x0367: 'u', // , COMBINING LATIN SMALL LETTER + 0x1D1D: 'u', // , LATIN SMALL LETTER SIDEWAYS + 0x1D1E: 'u', // , LATIN SMALL LETTER SIDEWAYS DIAERESIZED + 0x1D64: 'u', // , LATIN SUBSCRIPT SMALL LETTER + 0x1E7F: 'v', // WITH DOT BELOW, LATIN SMALL LETTER + 0x028B: 'v', // WITH HOOK, LATIN SMALL LETTER + 0x1E7D: 'v', // WITH TILDE, LATIN SMALL LETTER + 0x036E: 'v', // , COMBINING LATIN SMALL LETTER + 0x028C: 'v', // , LATIN SMALL LETTER TURNED + 0x1D65: 'v', // , LATIN SUBSCRIPT SMALL LETTER + 0x1E83: 'w', // WITH ACUTE, LATIN SMALL LETTER + 0x0175: 'w', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x1E85: 'w', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1E87: 'w', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E89: 'w', // WITH DOT BELOW, LATIN SMALL LETTER + 0x1E81: 'w', // WITH GRAVE, LATIN SMALL LETTER + 0x1E98: 'w', // WITH RING ABOVE, LATIN SMALL LETTER + 0x028D: 'w', // , LATIN SMALL LETTER TURNED + 0x1E8D: 'x', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1E8B: 'x', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x036F: 'x', // , COMBINING LATIN SMALL LETTER + 0x00FD: 'y', // WITH ACUTE, LATIN SMALL LETTER + 0x0177: 'y', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x00FF: 'y', // WITH DIAERESIS, LATIN SMALL LETTER + 0x1E8F: 'y', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1EF5: 'y', // WITH DOT BELOW, LATIN SMALL LETTER + 0x1EF3: 'y', // WITH GRAVE, LATIN SMALL LETTER + 0x1EF7: 'y', // WITH HOOK ABOVE, LATIN SMALL LETTER + 0x01B4: 'y', // WITH HOOK, LATIN SMALL LETTER + 0x0233: 'y', // WITH MACRON, LATIN SMALL LETTER + 0x1E99: 'y', // WITH RING ABOVE, LATIN SMALL LETTER + 0x024F: 'y', // WITH STROKE, LATIN SMALL LETTER + 0x1EF9: 'y', // WITH TILDE, LATIN SMALL LETTER + 0x028E: 'y', // , LATIN SMALL LETTER TURNED + 0x017A: 'z', // WITH ACUTE, LATIN SMALL LETTER + 0x017E: 'z', // WITH CARON, LATIN SMALL LETTER + 0x1E91: 'z', // WITH CIRCUMFLEX, LATIN SMALL LETTER + 0x0291: 'z', // WITH CURL, LATIN SMALL LETTER + 0x017C: 'z', // WITH DOT ABOVE, LATIN SMALL LETTER + 0x1E93: 'z', // WITH DOT BELOW, LATIN SMALL LETTER + 0x0225: 'z', // WITH HOOK, LATIN SMALL LETTER + 0x1E95: 'z', // WITH LINE BELOW, LATIN SMALL LETTER + 0x0290: 'z', // WITH RETROFLEX HOOK, LATIN SMALL LETTER + 0x01B6: 'z', // WITH STROKE, LATIN SMALL LETTER + 0x0240: 'z', // WITH SWASH TAIL, LATIN SMALL LETTER + 0x0251: 'a', // , latin small letter script + 0x00C1: 'A', // WITH ACUTE, LATIN CAPITAL LETTER + 0x00C2: 'A', // WITH CIRCUMFLEX, LATIN CAPITAL LETTER + 0x00C4: 'A', // WITH DIAERESIS, LATIN CAPITAL LETTER + 0x00C0: 'A', // WITH GRAVE, LATIN CAPITAL LETTER + 0x00C5: 'A', // WITH RING ABOVE, LATIN CAPITAL LETTER + 0x023A: 'A', // WITH STROKE, LATIN CAPITAL LETTER + 0x00C3: 'A', // WITH TILDE, LATIN CAPITAL LETTER + 0x1D00: 'A', // , LATIN LETTER SMALL CAPITAL + 0x0181: 'B', // WITH HOOK, LATIN CAPITAL LETTER + 0x0243: 'B', // WITH STROKE, LATIN CAPITAL LETTER + 0x0299: 'B', // , LATIN LETTER SMALL CAPITAL + 0x1D03: 'B', // , LATIN LETTER SMALL CAPITAL BARRED + 0x00C7: 'C', // WITH CEDILLA, LATIN CAPITAL LETTER + 0x023B: 'C', // WITH STROKE, LATIN CAPITAL LETTER + 0x1D04: 'C', // , LATIN LETTER SMALL CAPITAL + 0x018A: 'D', // WITH HOOK, LATIN CAPITAL LETTER + 0x0189: 'D', // , LATIN CAPITAL LETTER AFRICAN + 0x1D05: 'D', // , LATIN LETTER SMALL CAPITAL + 0x00C9: 'E', // WITH ACUTE, LATIN CAPITAL LETTER + 0x00CA: 'E', // WITH CIRCUMFLEX, LATIN CAPITAL LETTER + 0x00CB: 'E', // WITH DIAERESIS, LATIN CAPITAL LETTER + 0x00C8: 'E', // WITH GRAVE, LATIN CAPITAL LETTER + 0x0246: 'E', // WITH STROKE, LATIN CAPITAL LETTER + 0x0190: 'E', // , LATIN CAPITAL LETTER OPEN + 0x018E: 'E', // , LATIN CAPITAL LETTER REVERSED + 0x1D07: 'E', // , LATIN LETTER SMALL CAPITAL + 0x0193: 'G', // WITH HOOK, LATIN CAPITAL LETTER + 0x029B: 'G', // WITH HOOK, LATIN LETTER SMALL CAPITAL + 0x0262: 'G', // , LATIN LETTER SMALL CAPITAL + 0x029C: 'H', // , LATIN LETTER SMALL CAPITAL + 0x00CD: 'I', // WITH ACUTE, LATIN CAPITAL LETTER + 0x00CE: 'I', // WITH CIRCUMFLEX, LATIN CAPITAL LETTER + 0x00CF: 'I', // WITH DIAERESIS, LATIN CAPITAL LETTER + 0x0130: 'I', // WITH DOT ABOVE, LATIN CAPITAL LETTER + 0x00CC: 'I', // WITH GRAVE, LATIN CAPITAL LETTER + 0x0197: 'I', // WITH STROKE, LATIN CAPITAL LETTER + 0x026A: 'I', // , LATIN LETTER SMALL CAPITAL + 0x0248: 'J', // WITH STROKE, LATIN CAPITAL LETTER + 0x1D0A: 'J', // , LATIN LETTER SMALL CAPITAL + 0x1D0B: 'K', // , LATIN LETTER SMALL CAPITAL + 0x023D: 'L', // WITH BAR, LATIN CAPITAL LETTER + 0x1D0C: 'L', // WITH STROKE, LATIN LETTER SMALL CAPITAL + 0x029F: 'L', // , LATIN LETTER SMALL CAPITAL + 0x019C: 'M', // , LATIN CAPITAL LETTER TURNED + 0x1D0D: 'M', // , LATIN LETTER SMALL CAPITAL + 0x019D: 'N', // WITH LEFT HOOK, LATIN CAPITAL LETTER + 0x0220: 'N', // WITH LONG RIGHT LEG, LATIN CAPITAL LETTER + 0x00D1: 'N', // WITH TILDE, LATIN CAPITAL LETTER + 0x0274: 'N', // , LATIN LETTER SMALL CAPITAL + 0x1D0E: 'N', // , LATIN LETTER SMALL CAPITAL REVERSED + 0x00D3: 'O', // WITH ACUTE, LATIN CAPITAL LETTER + 0x00D4: 'O', // WITH CIRCUMFLEX, LATIN CAPITAL LETTER + 0x00D6: 'O', // WITH DIAERESIS, LATIN CAPITAL LETTER + 0x00D2: 'O', // WITH GRAVE, LATIN CAPITAL LETTER + 0x019F: 'O', // WITH MIDDLE TILDE, LATIN CAPITAL LETTER + 0x00D8: 'O', // WITH STROKE, LATIN CAPITAL LETTER + 0x00D5: 'O', // WITH TILDE, LATIN CAPITAL LETTER + 0x0186: 'O', // , LATIN CAPITAL LETTER OPEN + 0x1D0F: 'O', // , LATIN LETTER SMALL CAPITAL + 0x1D10: 'O', // , LATIN LETTER SMALL CAPITAL OPEN + 0x1D18: 'P', // , LATIN LETTER SMALL CAPITAL + 0x024A: 'Q', // WITH HOOK TAIL, LATIN CAPITAL LETTER SMALL + 0x024C: 'R', // WITH STROKE, LATIN CAPITAL LETTER + 0x0280: 'R', // , LATIN LETTER SMALL CAPITAL + 0x0281: 'R', // , LATIN LETTER SMALL CAPITAL INVERTED + 0x1D19: 'R', // , LATIN LETTER SMALL CAPITAL REVERSED + 0x1D1A: 'R', // , LATIN LETTER SMALL CAPITAL TURNED + 0x023E: 'T', // WITH DIAGONAL STROKE, LATIN CAPITAL LETTER + 0x01AE: 'T', // WITH RETROFLEX HOOK, LATIN CAPITAL LETTER + 0x1D1B: 'T', // , LATIN LETTER SMALL CAPITAL + 0x0244: 'U', // BAR, LATIN CAPITAL LETTER + 0x00DA: 'U', // WITH ACUTE, LATIN CAPITAL LETTER + 0x00DB: 'U', // WITH CIRCUMFLEX, LATIN CAPITAL LETTER + 0x00DC: 'U', // WITH DIAERESIS, LATIN CAPITAL LETTER + 0x00D9: 'U', // WITH GRAVE, LATIN CAPITAL LETTER + 0x1D1C: 'U', // , LATIN LETTER SMALL CAPITAL + 0x01B2: 'V', // WITH HOOK, LATIN CAPITAL LETTER + 0x0245: 'V', // , LATIN CAPITAL LETTER TURNED + 0x1D20: 'V', // , LATIN LETTER SMALL CAPITAL + 0x1D21: 'W', // , LATIN LETTER SMALL CAPITAL + 0x00DD: 'Y', // WITH ACUTE, LATIN CAPITAL LETTER + 0x0178: 'Y', // WITH DIAERESIS, LATIN CAPITAL LETTER + 0x024E: 'Y', // WITH STROKE, LATIN CAPITAL LETTER + 0x028F: 'Y', // , LATIN LETTER SMALL CAPITAL + 0x1D22: 'Z', // , LATIN LETTER SMALL CAPITAL + + 'Ắ': 'A', + 'Ấ': 'A', + 'Ằ': 'A', + 'Ầ': 'A', + 'Ẳ': 'A', + 'Ẩ': 'A', + 'Ẵ': 'A', + 'Ẫ': 'A', + 'Ặ': 'A', + 'Ậ': 'A', + + 'ắ': 'a', + 'ấ': 'a', + 'ằ': 'a', + 'ầ': 'a', + 'ẳ': 'a', + 'ẩ': 'a', + 'ẵ': 'a', + 'ẫ': 'a', + 'ặ': 'a', + 'ậ': 'a', + + 'Ế': 'E', + 'Ề': 'E', + 'Ể': 'E', + 'Ễ': 'E', + 'Ệ': 'E', + + 'ế': 'e', + 'ề': 'e', + 'ể': 'e', + 'ễ': 'e', + 'ệ': 'e', + + 'Ố': 'O', + 'Ớ': 'O', + 'Ồ': 'O', + 'Ờ': 'O', + 'Ổ': 'O', + 'Ở': 'O', + 'Ỗ': 'O', + 'Ỡ': 'O', + 'Ộ': 'O', + 'Ợ': 'O', + + 'ố': 'o', + 'ớ': 'o', + 'ồ': 'o', + 'ờ': 'o', + 'ổ': 'o', + 'ở': 'o', + 'ỗ': 'o', + 'ỡ': 'o', + 'ộ': 'o', + 'ợ': 'o', + + 'Ứ': 'U', + 'Ừ': 'U', + 'Ử': 'U', + 'Ữ': 'U', + 'Ự': 'U', + + 'ứ': 'u', + 'ừ': 'u', + 'ử': 'u', + 'ữ': 'u', + 'ự': 'u', +} + +// NormalizeRunes normalizes latin script letters +func NormalizeRunes(runes []rune) []rune { + ret := make([]rune, len(runes)) + copy(ret, runes) + for idx, r := range runes { + if r < 0x00C0 || r > 0x2184 { + continue + } + n := normalized[r] + if n > 0 { + ret[idx] = normalized[r] + } + } + return ret +} diff --git a/.fzf/src/ansi.go b/.fzf/src/ansi.go new file mode 100644 index 0000000..698bf89 --- /dev/null +++ b/.fzf/src/ansi.go @@ -0,0 +1,409 @@ +package fzf + +import ( + "strconv" + "strings" + "unicode/utf8" + + "github.com/junegunn/fzf/src/tui" +) + +type ansiOffset struct { + offset [2]int32 + color ansiState +} + +type ansiState struct { + fg tui.Color + bg tui.Color + attr tui.Attr + lbg tui.Color +} + +func (s *ansiState) colored() bool { + return s.fg != -1 || s.bg != -1 || s.attr > 0 || s.lbg >= 0 +} + +func (s *ansiState) equals(t *ansiState) bool { + if t == nil { + return !s.colored() + } + return s.fg == t.fg && s.bg == t.bg && s.attr == t.attr && s.lbg == t.lbg +} + +func (s *ansiState) ToString() string { + if !s.colored() { + return "" + } + + ret := "" + if s.attr&tui.Bold > 0 { + ret += "1;" + } + if s.attr&tui.Dim > 0 { + ret += "2;" + } + if s.attr&tui.Italic > 0 { + ret += "3;" + } + if s.attr&tui.Underline > 0 { + ret += "4;" + } + if s.attr&tui.Blink > 0 { + ret += "5;" + } + if s.attr&tui.Reverse > 0 { + ret += "7;" + } + ret += toAnsiString(s.fg, 30) + toAnsiString(s.bg, 40) + + return "\x1b[" + strings.TrimSuffix(ret, ";") + "m" +} + +func toAnsiString(color tui.Color, offset int) string { + col := int(color) + ret := "" + if col == -1 { + ret += strconv.Itoa(offset + 9) + } else if col < 8 { + ret += strconv.Itoa(offset + col) + } else if col < 16 { + ret += strconv.Itoa(offset - 30 + 90 + col - 8) + } else if col < 256 { + ret += strconv.Itoa(offset+8) + ";5;" + strconv.Itoa(col) + } else if col >= (1 << 24) { + r := strconv.Itoa((col >> 16) & 0xff) + g := strconv.Itoa((col >> 8) & 0xff) + b := strconv.Itoa(col & 0xff) + ret += strconv.Itoa(offset+8) + ";2;" + r + ";" + g + ";" + b + } + return ret + ";" +} + +func isPrint(c uint8) bool { + return '\x20' <= c && c <= '\x7e' +} + +func matchOperatingSystemCommand(s string) int { + // `\x1b][0-9];[[:print:]]+(?:\x1b\\\\|\x07)` + // ^ match starting here + // + i := 5 // prefix matched in nextAnsiEscapeSequence() + for ; i < len(s) && isPrint(s[i]); i++ { + } + if i < len(s) { + if s[i] == '\x07' { + return i + 1 + } + if s[i] == '\x1b' && i < len(s)-1 && s[i+1] == '\\' { + return i + 2 + } + } + return -1 +} + +func matchControlSequence(s string) int { + // `\x1b[\\[()][0-9;?]*[a-zA-Z@]` + // ^ match starting here + // + i := 2 // prefix matched in nextAnsiEscapeSequence() + for ; i < len(s) && (isNumeric(s[i]) || s[i] == ';' || s[i] == '?'); i++ { + } + if i < len(s) { + c := s[i] + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '@' { + return i + 1 + } + } + return -1 +} + +func isCtrlSeqStart(c uint8) bool { + return c == '\\' || c == '[' || c == '(' || c == ')' +} + +// nextAnsiEscapeSequence returns the ANSI escape sequence and is equivalent to +// calling FindStringIndex() on the below regex (which was originally used): +// +// "(?:\x1b[\\[()][0-9;?]*[a-zA-Z@]|\x1b][0-9];[[:print:]]+(?:\x1b\\\\|\x07)|\x1b.|[\x0e\x0f]|.\x08)" +// +func nextAnsiEscapeSequence(s string) (int, int) { + // fast check for ANSI escape sequences + i := 0 + for ; i < len(s); i++ { + switch s[i] { + case '\x0e', '\x0f', '\x1b', '\x08': + // We ignore the fact that '\x08' cannot be the first char + // in the string and be an escape sequence for the sake of + // speed and simplicity. + goto Loop + } + } + return -1, -1 + +Loop: + for ; i < len(s); i++ { + switch s[i] { + case '\x08': + // backtrack to match: `.\x08` + if i > 0 && s[i-1] != '\n' { + if s[i-1] < utf8.RuneSelf { + return i - 1, i + 1 + } + _, n := utf8.DecodeLastRuneInString(s[:i]) + return i - n, i + 1 + } + case '\x1b': + // match: `\x1b[\\[()][0-9;?]*[a-zA-Z@]` + if i+2 < len(s) && isCtrlSeqStart(s[i+1]) { + if j := matchControlSequence(s[i:]); j != -1 { + return i, i + j + } + } + + // match: `\x1b][0-9];[[:print:]]+(?:\x1b\\\\|\x07)` + if i+5 < len(s) && s[i+1] == ']' && isNumeric(s[i+2]) && + s[i+3] == ';' && isPrint(s[i+4]) { + + if j := matchOperatingSystemCommand(s[i:]); j != -1 { + return i, i + j + } + } + + // match: `\x1b.` + if i+1 < len(s) && s[i+1] != '\n' { + if s[i+1] < utf8.RuneSelf { + return i, i + 2 + } + _, n := utf8.DecodeRuneInString(s[i+1:]) + return i, i + n + 1 + } + case '\x0e', '\x0f': + // match: `[\x0e\x0f]` + return i, i + 1 + } + } + return -1, -1 +} + +func extractColor(str string, state *ansiState, proc func(string, *ansiState) bool) (string, *[]ansiOffset, *ansiState) { + // We append to a stack allocated variable that we'll + // later copy and return, to save on allocations. + offsets := make([]ansiOffset, 0, 32) + + if state != nil { + offsets = append(offsets, ansiOffset{[2]int32{0, 0}, *state}) + } + + var ( + pstate *ansiState // lazily allocated + output strings.Builder + prevIdx int + runeCount int + ) + for idx := 0; idx < len(str); { + // Make sure that we found an ANSI code + start, end := nextAnsiEscapeSequence(str[idx:]) + if start == -1 { + break + } + start += idx + idx += end + + // Check if we should continue + prev := str[prevIdx:start] + if proc != nil && !proc(prev, state) { + return "", nil, nil + } + prevIdx = idx + + if len(prev) != 0 { + runeCount += utf8.RuneCountInString(prev) + // Grow the buffer size to the maximum possible length (string length + // containing ansi codes) to avoid repetitive allocation + if output.Cap() == 0 { + output.Grow(len(str)) + } + output.WriteString(prev) + } + + newState := interpretCode(str[start:idx], state) + if !newState.equals(state) { + if state != nil { + // Update last offset + (&offsets[len(offsets)-1]).offset[1] = int32(runeCount) + } + + if newState.colored() { + // Append new offset + if pstate == nil { + pstate = &ansiState{} + } + *pstate = newState + state = pstate + offsets = append(offsets, ansiOffset{ + [2]int32{int32(runeCount), int32(runeCount)}, + newState, + }) + } else { + // Discard state + state = nil + } + } + } + + var rest string + var trimmed string + if prevIdx == 0 { + // No ANSI code found + rest = str + trimmed = str + } else { + rest = str[prevIdx:] + output.WriteString(rest) + trimmed = output.String() + } + if proc != nil { + proc(rest, state) + } + if len(offsets) > 0 { + if len(rest) > 0 && state != nil { + // Update last offset + runeCount += utf8.RuneCountInString(rest) + (&offsets[len(offsets)-1]).offset[1] = int32(runeCount) + } + // Return a copy of the offsets slice + a := make([]ansiOffset, len(offsets)) + copy(a, offsets) + return trimmed, &a, state + } + return trimmed, nil, state +} + +func parseAnsiCode(s string) (int, string) { + var remaining string + if i := strings.IndexByte(s, ';'); i >= 0 { + remaining = s[i+1:] + s = s[:i] + } + + if len(s) > 0 { + // Inlined version of strconv.Atoi() that only handles positive + // integers and does not allocate on error. + code := 0 + for _, ch := range []byte(s) { + ch -= '0' + if ch > 9 { + return -1, remaining + } + code = code*10 + int(ch) + } + return code, remaining + } + + return -1, remaining +} + +func interpretCode(ansiCode string, prevState *ansiState) ansiState { + var state ansiState + if prevState == nil { + state = ansiState{-1, -1, 0, -1} + } else { + state = ansiState{prevState.fg, prevState.bg, prevState.attr, prevState.lbg} + } + if ansiCode[0] != '\x1b' || ansiCode[1] != '[' || ansiCode[len(ansiCode)-1] != 'm' { + if prevState != nil && strings.HasSuffix(ansiCode, "0K") { + state.lbg = prevState.bg + } + return state + } + + if len(ansiCode) <= 3 { + state.fg = -1 + state.bg = -1 + state.attr = 0 + return state + } + ansiCode = ansiCode[2 : len(ansiCode)-1] + + state256 := 0 + ptr := &state.fg + + for len(ansiCode) != 0 { + var num int + if num, ansiCode = parseAnsiCode(ansiCode); num != -1 { + switch state256 { + case 0: + switch num { + case 38: + ptr = &state.fg + state256++ + case 48: + ptr = &state.bg + state256++ + case 39: + state.fg = -1 + case 49: + state.bg = -1 + case 1: + state.attr = state.attr | tui.Bold + case 2: + state.attr = state.attr | tui.Dim + case 3: + state.attr = state.attr | tui.Italic + case 4: + state.attr = state.attr | tui.Underline + case 5: + state.attr = state.attr | tui.Blink + case 7: + state.attr = state.attr | tui.Reverse + case 23: // tput rmso + state.attr = state.attr &^ tui.Italic + case 24: // tput rmul + state.attr = state.attr &^ tui.Underline + case 0: + state.fg = -1 + state.bg = -1 + state.attr = 0 + state256 = 0 + default: + if num >= 30 && num <= 37 { + state.fg = tui.Color(num - 30) + } else if num >= 40 && num <= 47 { + state.bg = tui.Color(num - 40) + } else if num >= 90 && num <= 97 { + state.fg = tui.Color(num - 90 + 8) + } else if num >= 100 && num <= 107 { + state.bg = tui.Color(num - 100 + 8) + } + } + case 1: + switch num { + case 2: + state256 = 10 // MAGIC + case 5: + state256++ + default: + state256 = 0 + } + case 2: + *ptr = tui.Color(num) + state256 = 0 + case 10: + *ptr = tui.Color(1<<24) | tui.Color(num<<16) + state256++ + case 11: + *ptr = *ptr | tui.Color(num<<8) + state256++ + case 12: + *ptr = *ptr | tui.Color(num) + state256 = 0 + } + } + } + + if state256 > 0 { + *ptr = -1 + } + return state +} diff --git a/.fzf/src/ansi_test.go b/.fzf/src/ansi_test.go new file mode 100644 index 0000000..cdccc10 --- /dev/null +++ b/.fzf/src/ansi_test.go @@ -0,0 +1,427 @@ +package fzf + +import ( + "math/rand" + "regexp" + "strings" + "testing" + "unicode/utf8" + + "github.com/junegunn/fzf/src/tui" +) + +// The following regular expression will include not all but most of the +// frequently used ANSI sequences. This regex is used as a reference for +// testing nextAnsiEscapeSequence(). +// +// References: +// - https://github.com/gnachman/iTerm2 +// - https://web.archive.org/web/20090204053813/http://ascii-table.com/ansi-escape-sequences.php +// (archived from http://ascii-table.com/ansi-escape-sequences.php) +// - https://web.archive.org/web/20090227051140/http://ascii-table.com/ansi-escape-sequences-vt-100.php +// (archived from http://ascii-table.com/ansi-escape-sequences-vt-100.php) +// - http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html +// - https://invisible-island.net/xterm/ctlseqs/ctlseqs.html +var ansiRegexReference = regexp.MustCompile("(?:\x1b[\\[()][0-9;]*[a-zA-Z@]|\x1b][0-9];[[:print:]]+(?:\x1b\\\\|\x07)|\x1b.|[\x0e\x0f]|.\x08)") + +func testParserReference(t testing.TB, str string) { + t.Helper() + + toSlice := func(start, end int) []int { + if start == -1 { + return nil + } + return []int{start, end} + } + + s := str + for i := 0; ; i++ { + got := toSlice(nextAnsiEscapeSequence(s)) + exp := ansiRegexReference.FindStringIndex(s) + + equal := len(got) == len(exp) + if equal { + for i := 0; i < len(got); i++ { + if got[i] != exp[i] { + equal = false + break + } + } + } + if !equal { + var exps, gots []rune + if len(got) == 2 { + gots = []rune(s[got[0]:got[1]]) + } + if len(exp) == 2 { + exps = []rune(s[exp[0]:exp[1]]) + } + t.Errorf("%d: %q: got: %v (%q) want: %v (%q)", i, s, got, gots, exp, exps) + return + } + if len(exp) == 0 { + return + } + s = s[exp[1]:] + } +} + +func TestNextAnsiEscapeSequence(t *testing.T) { + testStrs := []string{ + "\x1b[0mhello world", + "\x1b[1mhello world", + "椙\x1b[1m椙", + "椙\x1b[1椙m椙", + "\x1b[1mhello \x1b[mw\x1b7o\x1b8r\x1b(Bl\x1b[2@d", + "\x1b[1mhello \x1b[Kworld", + "hello \x1b[34;45;1mworld", + "hello \x1b[34;45;1mwor\x1b[34;45;1mld", + "hello \x1b[34;45;1mwor\x1b[0mld", + "hello \x1b[34;48;5;233;1mwo\x1b[38;5;161mr\x1b[0ml\x1b[38;5;161md", + "hello \x1b[38;5;38;48;5;48;1mwor\x1b[38;5;48;48;5;38ml\x1b[0md", + "hello \x1b[32;1mworld", + "hello world", + "hello \x1b[0;38;5;200;48;5;100mworld", + "\x1b椙", + "椙\x08", + "\n\x08", + "X\x08", + "", + "\x1b]4;3;rgb:aa/bb/cc\x07 ", + "\x1b]4;3;rgb:aa/bb/cc\x1b\\ ", + ansiBenchmarkString, + } + + for _, s := range testStrs { + testParserReference(t, s) + } +} + +func TestNextAnsiEscapeSequence_Fuzz_Modified(t *testing.T) { + t.Parallel() + if testing.Short() { + t.Skip("short test") + } + + testStrs := []string{ + "\x1b[0mhello world", + "\x1b[1mhello world", + "椙\x1b[1m椙", + "椙\x1b[1椙m椙", + "\x1b[1mhello \x1b[mw\x1b7o\x1b8r\x1b(Bl\x1b[2@d", + "\x1b[1mhello \x1b[Kworld", + "hello \x1b[34;45;1mworld", + "hello \x1b[34;45;1mwor\x1b[34;45;1mld", + "hello \x1b[34;45;1mwor\x1b[0mld", + "hello \x1b[34;48;5;233;1mwo\x1b[38;5;161mr\x1b[0ml\x1b[38;5;161md", + "hello \x1b[38;5;38;48;5;48;1mwor\x1b[38;5;48;48;5;38ml\x1b[0md", + "hello \x1b[32;1mworld", + "hello world", + "hello \x1b[0;38;5;200;48;5;100mworld", + ansiBenchmarkString, + } + + replacementBytes := [...]rune{'\x0e', '\x0f', '\x1b', '\x08'} + + modifyString := func(s string, rr *rand.Rand) string { + n := rr.Intn(len(s)) + b := []rune(s) + for ; n >= 0 && len(b) != 0; n-- { + i := rr.Intn(len(b)) + switch x := rr.Intn(4); x { + case 0: + b = append(b[:i], b[i+1:]...) + case 1: + j := rr.Intn(len(replacementBytes) - 1) + b[i] = replacementBytes[j] + case 2: + x := rune(rr.Intn(utf8.MaxRune)) + for !utf8.ValidRune(x) { + x = rune(rr.Intn(utf8.MaxRune)) + } + b[i] = x + case 3: + b[i] = rune(rr.Intn(utf8.MaxRune)) // potentially invalid + default: + t.Fatalf("unsupported value: %d", x) + } + } + return string(b) + } + + rr := rand.New(rand.NewSource(1)) + for _, s := range testStrs { + for i := 1_000; i >= 0; i-- { + testParserReference(t, modifyString(s, rr)) + } + } +} + +func TestNextAnsiEscapeSequence_Fuzz_Random(t *testing.T) { + t.Parallel() + + if testing.Short() { + t.Skip("short test") + } + + randomString := func(rr *rand.Rand) string { + numChars := rand.Intn(50) + codePoints := make([]rune, numChars) + for i := 0; i < len(codePoints); i++ { + var r rune + for n := 0; n < 1000; n++ { + r = rune(rr.Intn(utf8.MaxRune)) + // Allow 10% of runes to be invalid + if utf8.ValidRune(r) || rr.Float64() < 0.10 { + break + } + } + codePoints[i] = r + } + return string(codePoints) + } + + rr := rand.New(rand.NewSource(1)) + for i := 0; i < 100_000; i++ { + testParserReference(t, randomString(rr)) + } +} + +func TestExtractColor(t *testing.T) { + assert := func(offset ansiOffset, b int32, e int32, fg tui.Color, bg tui.Color, bold bool) { + var attr tui.Attr + if bold { + attr = tui.Bold + } + if offset.offset[0] != b || offset.offset[1] != e || + offset.color.fg != fg || offset.color.bg != bg || offset.color.attr != attr { + t.Error(offset, b, e, fg, bg, attr) + } + } + + src := "hello world" + var state *ansiState + clean := "\x1b[0m" + check := func(assertion func(ansiOffsets *[]ansiOffset, state *ansiState)) { + output, ansiOffsets, newState := extractColor(src, state, nil) + state = newState + if output != "hello world" { + t.Errorf("Invalid output: %s %v", output, []rune(output)) + } + t.Log(src, ansiOffsets, clean) + assertion(ansiOffsets, state) + } + + check(func(offsets *[]ansiOffset, state *ansiState) { + if offsets != nil { + t.Fail() + } + }) + + state = nil + src = "\x1b[0mhello world" + check(func(offsets *[]ansiOffset, state *ansiState) { + if offsets != nil { + t.Fail() + } + }) + + state = nil + src = "\x1b[1mhello world" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + assert((*offsets)[0], 0, 11, -1, -1, true) + }) + + state = nil + src = "\x1b[1mhello \x1b[mw\x1b7o\x1b8r\x1b(Bl\x1b[2@d" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + assert((*offsets)[0], 0, 6, -1, -1, true) + }) + + state = nil + src = "\x1b[1mhello \x1b[Kworld" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + assert((*offsets)[0], 0, 11, -1, -1, true) + }) + + state = nil + src = "hello \x1b[34;45;1mworld" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + assert((*offsets)[0], 6, 11, 4, 5, true) + }) + + state = nil + src = "hello \x1b[34;45;1mwor\x1b[34;45;1mld" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + assert((*offsets)[0], 6, 11, 4, 5, true) + }) + + state = nil + src = "hello \x1b[34;45;1mwor\x1b[0mld" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + assert((*offsets)[0], 6, 9, 4, 5, true) + }) + + state = nil + src = "hello \x1b[34;48;5;233;1mwo\x1b[38;5;161mr\x1b[0ml\x1b[38;5;161md" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 3 { + t.Fail() + } + assert((*offsets)[0], 6, 8, 4, 233, true) + assert((*offsets)[1], 8, 9, 161, 233, true) + assert((*offsets)[2], 10, 11, 161, -1, false) + }) + + // {38,48};5;{38,48} + state = nil + src = "hello \x1b[38;5;38;48;5;48;1mwor\x1b[38;5;48;48;5;38ml\x1b[0md" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 2 { + t.Fail() + } + assert((*offsets)[0], 6, 9, 38, 48, true) + assert((*offsets)[1], 9, 10, 48, 38, true) + }) + + src = "hello \x1b[32;1mworld" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + if state.fg != 2 || state.bg != -1 || state.attr == 0 { + t.Fail() + } + assert((*offsets)[0], 6, 11, 2, -1, true) + }) + + src = "hello world" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 1 { + t.Fail() + } + if state.fg != 2 || state.bg != -1 || state.attr == 0 { + t.Fail() + } + assert((*offsets)[0], 0, 11, 2, -1, true) + }) + + src = "hello \x1b[0;38;5;200;48;5;100mworld" + check(func(offsets *[]ansiOffset, state *ansiState) { + if len(*offsets) != 2 { + t.Fail() + } + if state.fg != 200 || state.bg != 100 || state.attr > 0 { + t.Fail() + } + assert((*offsets)[0], 0, 6, 2, -1, true) + assert((*offsets)[1], 6, 11, 200, 100, false) + }) +} + +func TestAnsiCodeStringConversion(t *testing.T) { + assert := func(code string, prevState *ansiState, expected string) { + state := interpretCode(code, prevState) + if expected != state.ToString() { + t.Errorf("expected: %s, actual: %s", + strings.Replace(expected, "\x1b[", "\\x1b[", -1), + strings.Replace(state.ToString(), "\x1b[", "\\x1b[", -1)) + } + } + assert("\x1b[m", nil, "") + assert("\x1b[m", &ansiState{attr: tui.Blink, lbg: -1}, "") + + assert("\x1b[31m", nil, "\x1b[31;49m") + assert("\x1b[41m", nil, "\x1b[39;41m") + + assert("\x1b[92m", nil, "\x1b[92;49m") + assert("\x1b[102m", nil, "\x1b[39;102m") + + assert("\x1b[31m", &ansiState{fg: 4, bg: 4, lbg: -1}, "\x1b[31;44m") + assert("\x1b[1;2;31m", &ansiState{fg: 2, bg: -1, attr: tui.Reverse, lbg: -1}, "\x1b[1;2;7;31;49m") + assert("\x1b[38;5;100;48;5;200m", nil, "\x1b[38;5;100;48;5;200m") + assert("\x1b[48;5;100;38;5;200m", nil, "\x1b[38;5;200;48;5;100m") + assert("\x1b[48;5;100;38;2;10;20;30;1m", nil, "\x1b[1;38;2;10;20;30;48;5;100m") + assert("\x1b[48;5;100;38;2;10;20;30;7m", + &ansiState{attr: tui.Dim | tui.Italic, fg: 1, bg: 1}, + "\x1b[2;3;7;38;2;10;20;30;48;5;100m") +} + +func TestParseAnsiCode(t *testing.T) { + tests := []struct { + In, Exp string + N int + }{ + {"123", "", 123}, + {"1a", "", -1}, + {"1a;12", "12", -1}, + {"12;a", "a", 12}, + {"-2", "", -1}, + } + for _, x := range tests { + n, s := parseAnsiCode(x.In) + if n != x.N || s != x.Exp { + t.Fatalf("%q: got: (%d %q) want: (%d %q)", x.In, n, s, x.N, x.Exp) + } + } +} + +// kernel/bpf/preload/iterators/README +const ansiBenchmarkString = "\x1b[38;5;81m\x1b[01;31m\x1b[Kkernel/\x1b[0m\x1b[38;5;81mbpf/" + + "\x1b[0m\x1b[38;5;81mpreload/\x1b[0m\x1b[38;5;81miterators/" + + "\x1b[0m\x1b[38;5;149mMakefile\x1b[m\x1b[K\x1b[0m" + +func BenchmarkNextAnsiEscapeSequence(b *testing.B) { + b.SetBytes(int64(len(ansiBenchmarkString))) + for i := 0; i < b.N; i++ { + s := ansiBenchmarkString + for { + _, o := nextAnsiEscapeSequence(s) + if o == -1 { + break + } + s = s[o:] + } + } +} + +// Baseline test to compare the speed of nextAnsiEscapeSequence() to the +// previously used regex based implementation. +func BenchmarkNextAnsiEscapeSequence_Regex(b *testing.B) { + b.SetBytes(int64(len(ansiBenchmarkString))) + for i := 0; i < b.N; i++ { + s := ansiBenchmarkString + for { + a := ansiRegexReference.FindStringIndex(s) + if len(a) == 0 { + break + } + s = s[a[1]:] + } + } +} + +func BenchmarkExtractColor(b *testing.B) { + b.SetBytes(int64(len(ansiBenchmarkString))) + for i := 0; i < b.N; i++ { + extractColor(ansiBenchmarkString, nil, nil) + } +} diff --git a/.fzf/src/cache.go b/.fzf/src/cache.go new file mode 100644 index 0000000..df1a6ab --- /dev/null +++ b/.fzf/src/cache.go @@ -0,0 +1,81 @@ +package fzf + +import "sync" + +// queryCache associates strings to lists of items +type queryCache map[string][]Result + +// ChunkCache associates Chunk and query string to lists of items +type ChunkCache struct { + mutex sync.Mutex + cache map[*Chunk]*queryCache +} + +// NewChunkCache returns a new ChunkCache +func NewChunkCache() ChunkCache { + return ChunkCache{sync.Mutex{}, make(map[*Chunk]*queryCache)} +} + +// Add adds the list to the cache +func (cc *ChunkCache) Add(chunk *Chunk, key string, list []Result) { + if len(key) == 0 || !chunk.IsFull() || len(list) > queryCacheMax { + return + } + + cc.mutex.Lock() + defer cc.mutex.Unlock() + + qc, ok := cc.cache[chunk] + if !ok { + cc.cache[chunk] = &queryCache{} + qc = cc.cache[chunk] + } + (*qc)[key] = list +} + +// Lookup is called to lookup ChunkCache +func (cc *ChunkCache) Lookup(chunk *Chunk, key string) []Result { + if len(key) == 0 || !chunk.IsFull() { + return nil + } + + cc.mutex.Lock() + defer cc.mutex.Unlock() + + qc, ok := cc.cache[chunk] + if ok { + list, ok := (*qc)[key] + if ok { + return list + } + } + return nil +} + +func (cc *ChunkCache) Search(chunk *Chunk, key string) []Result { + if len(key) == 0 || !chunk.IsFull() { + return nil + } + + cc.mutex.Lock() + defer cc.mutex.Unlock() + + qc, ok := cc.cache[chunk] + if !ok { + return nil + } + + for idx := 1; idx < len(key); idx++ { + // [---------| ] | [ |---------] + // [--------| ] | [ |--------] + // [-------| ] | [ |-------] + prefix := key[:len(key)-idx] + suffix := key[idx:] + for _, substr := range [2]string{prefix, suffix} { + if cached, found := (*qc)[substr]; found { + return cached + } + } + } + return nil +} diff --git a/.fzf/src/cache_test.go b/.fzf/src/cache_test.go new file mode 100644 index 0000000..0242534 --- /dev/null +++ b/.fzf/src/cache_test.go @@ -0,0 +1,39 @@ +package fzf + +import "testing" + +func TestChunkCache(t *testing.T) { + cache := NewChunkCache() + chunk1p := &Chunk{} + chunk2p := &Chunk{count: chunkSize} + items1 := []Result{{}} + items2 := []Result{{}, {}} + cache.Add(chunk1p, "foo", items1) + cache.Add(chunk2p, "foo", items1) + cache.Add(chunk2p, "bar", items2) + + { // chunk1 is not full + cached := cache.Lookup(chunk1p, "foo") + if cached != nil { + t.Error("Cached disabled for non-empty chunks", cached) + } + } + { + cached := cache.Lookup(chunk2p, "foo") + if cached == nil || len(cached) != 1 { + t.Error("Expected 1 item cached", cached) + } + } + { + cached := cache.Lookup(chunk2p, "bar") + if cached == nil || len(cached) != 2 { + t.Error("Expected 2 items cached", cached) + } + } + { + cached := cache.Lookup(chunk1p, "foobar") + if cached != nil { + t.Error("Expected 0 item cached", cached) + } + } +} diff --git a/.fzf/src/chunklist.go b/.fzf/src/chunklist.go new file mode 100644 index 0000000..cd635c2 --- /dev/null +++ b/.fzf/src/chunklist.go @@ -0,0 +1,89 @@ +package fzf + +import "sync" + +// Chunk is a list of Items whose size has the upper limit of chunkSize +type Chunk struct { + items [chunkSize]Item + count int +} + +// ItemBuilder is a closure type that builds Item object from byte array +type ItemBuilder func(*Item, []byte) bool + +// ChunkList is a list of Chunks +type ChunkList struct { + chunks []*Chunk + mutex sync.Mutex + trans ItemBuilder +} + +// NewChunkList returns a new ChunkList +func NewChunkList(trans ItemBuilder) *ChunkList { + return &ChunkList{ + chunks: []*Chunk{}, + mutex: sync.Mutex{}, + trans: trans} +} + +func (c *Chunk) push(trans ItemBuilder, data []byte) bool { + if trans(&c.items[c.count], data) { + c.count++ + return true + } + return false +} + +// IsFull returns true if the Chunk is full +func (c *Chunk) IsFull() bool { + return c.count == chunkSize +} + +func (cl *ChunkList) lastChunk() *Chunk { + return cl.chunks[len(cl.chunks)-1] +} + +// CountItems returns the total number of Items +func CountItems(cs []*Chunk) int { + if len(cs) == 0 { + return 0 + } + return chunkSize*(len(cs)-1) + cs[len(cs)-1].count +} + +// Push adds the item to the list +func (cl *ChunkList) Push(data []byte) bool { + cl.mutex.Lock() + + if len(cl.chunks) == 0 || cl.lastChunk().IsFull() { + cl.chunks = append(cl.chunks, &Chunk{}) + } + + ret := cl.lastChunk().push(cl.trans, data) + cl.mutex.Unlock() + return ret +} + +// Clear clears the data +func (cl *ChunkList) Clear() { + cl.mutex.Lock() + cl.chunks = nil + cl.mutex.Unlock() +} + +// Snapshot returns immutable snapshot of the ChunkList +func (cl *ChunkList) Snapshot() ([]*Chunk, int) { + cl.mutex.Lock() + + ret := make([]*Chunk, len(cl.chunks)) + copy(ret, cl.chunks) + + // Duplicate the last chunk + if cnt := len(ret); cnt > 0 { + newChunk := *ret[cnt-1] + ret[cnt-1] = &newChunk + } + + cl.mutex.Unlock() + return ret, CountItems(ret) +} diff --git a/.fzf/src/chunklist_test.go b/.fzf/src/chunklist_test.go new file mode 100644 index 0000000..6c1d09e --- /dev/null +++ b/.fzf/src/chunklist_test.go @@ -0,0 +1,80 @@ +package fzf + +import ( + "fmt" + "testing" + + "github.com/junegunn/fzf/src/util" +) + +func TestChunkList(t *testing.T) { + // FIXME global + sortCriteria = []criterion{byScore, byLength} + + cl := NewChunkList(func(item *Item, s []byte) bool { + item.text = util.ToChars(s) + return true + }) + + // Snapshot + snapshot, count := cl.Snapshot() + if len(snapshot) > 0 || count > 0 { + t.Error("Snapshot should be empty now") + } + + // Add some data + cl.Push([]byte("hello")) + cl.Push([]byte("world")) + + // Previously created snapshot should remain the same + if len(snapshot) > 0 { + t.Error("Snapshot should not have changed") + } + + // But the new snapshot should contain the added items + snapshot, count = cl.Snapshot() + if len(snapshot) != 1 && count != 2 { + t.Error("Snapshot should not be empty now") + } + + // Check the content of the ChunkList + chunk1 := snapshot[0] + if chunk1.count != 2 { + t.Error("Snapshot should contain only two items") + } + if chunk1.items[0].text.ToString() != "hello" || + chunk1.items[1].text.ToString() != "world" { + t.Error("Invalid data") + } + if chunk1.IsFull() { + t.Error("Chunk should not have been marked full yet") + } + + // Add more data + for i := 0; i < chunkSize*2; i++ { + cl.Push([]byte(fmt.Sprintf("item %d", i))) + } + + // Previous snapshot should remain the same + if len(snapshot) != 1 { + t.Error("Snapshot should stay the same") + } + + // New snapshot + snapshot, count = cl.Snapshot() + if len(snapshot) != 3 || !snapshot[0].IsFull() || + !snapshot[1].IsFull() || snapshot[2].IsFull() || count != chunkSize*2+2 { + t.Error("Expected two full chunks and one more chunk") + } + if snapshot[2].count != 2 { + t.Error("Unexpected number of items") + } + + cl.Push([]byte("hello")) + cl.Push([]byte("world")) + + lastChunkCount := snapshot[len(snapshot)-1].count + if lastChunkCount != 2 { + t.Error("Unexpected number of items:", lastChunkCount) + } +} diff --git a/.fzf/src/constants.go b/.fzf/src/constants.go new file mode 100644 index 0000000..96d9821 --- /dev/null +++ b/.fzf/src/constants.go @@ -0,0 +1,85 @@ +package fzf + +import ( + "math" + "os" + "time" + + "github.com/junegunn/fzf/src/util" +) + +const ( + // Core + coordinatorDelayMax time.Duration = 100 * time.Millisecond + coordinatorDelayStep time.Duration = 10 * time.Millisecond + + // Reader + readerBufferSize = 64 * 1024 + readerPollIntervalMin = 10 * time.Millisecond + readerPollIntervalStep = 5 * time.Millisecond + readerPollIntervalMax = 50 * time.Millisecond + + // Terminal + initialDelay = 20 * time.Millisecond + initialDelayTac = 100 * time.Millisecond + spinnerDuration = 100 * time.Millisecond + previewCancelWait = 500 * time.Millisecond + previewChunkDelay = 100 * time.Millisecond + previewDelayed = 500 * time.Millisecond + maxPatternLength = 300 + maxMulti = math.MaxInt32 + + // Matcher + numPartitionsMultiplier = 8 + maxPartitions = 32 + progressMinDuration = 200 * time.Millisecond + + // Capacity of each chunk + chunkSize int = 100 + + // Pre-allocated memory slices to minimize GC + slab16Size int = 100 * 1024 // 200KB * 32 = 12.8MB + slab32Size int = 2048 // 8KB * 32 = 256KB + + // Do not cache results of low selectivity queries + queryCacheMax int = chunkSize / 5 + + // Not to cache mergers with large lists + mergerCacheMax int = 100000 + + // History + defaultHistoryMax int = 1000 + + // Jump labels + defaultJumpLabels string = "asdfghjklqwertyuiopzxcvbnm1234567890ASDFGHJKLQWERTYUIOPZXCVBNM`~;:,<.>/?'\"!@#$%^&*()[{]}-_=+" +) + +var defaultCommand string + +func init() { + if !util.IsWindows() { + defaultCommand = `set -o pipefail; command find -L . -mindepth 1 \( -path '*/\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \) -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-` + } else if os.Getenv("TERM") == "cygwin" { + defaultCommand = `sh -c "command find -L . -mindepth 1 -path '*/\.*' -prune -o -type f -print -o -type l -print 2> /dev/null | cut -b3-"` + } +} + +// fzf events +const ( + EvtReadNew util.EventType = iota + EvtReadFin + EvtSearchNew + EvtSearchProgress + EvtSearchFin + EvtHeader + EvtReady + EvtQuit +) + +const ( + exitCancel = -1 + exitOk = 0 + exitNoMatch = 1 + exitError = 2 + exitInterrupt = 130 +) diff --git a/.fzf/src/core.go b/.fzf/src/core.go new file mode 100644 index 0000000..6244c99 --- /dev/null +++ b/.fzf/src/core.go @@ -0,0 +1,351 @@ +/* +Package fzf implements fzf, a command-line fuzzy finder. + +The MIT License (MIT) + +Copyright (c) 2013-2021 Junegunn Choi + +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. +*/ +package fzf + +import ( + "fmt" + "os" + "time" + + "github.com/junegunn/fzf/src/util" +) + +/* +Reader -> EvtReadFin +Reader -> EvtReadNew -> Matcher (restart) +Terminal -> EvtSearchNew:bool -> Matcher (restart) +Matcher -> EvtSearchProgress -> Terminal (update info) +Matcher -> EvtSearchFin -> Terminal (update list) +Matcher -> EvtHeader -> Terminal (update header) +*/ + +// Run starts fzf +func Run(opts *Options, version string, revision string) { + sort := opts.Sort > 0 + sortCriteria = opts.Criteria + + if opts.Version { + if len(revision) > 0 { + fmt.Printf("%s (%s)\n", version, revision) + } else { + fmt.Println(version) + } + os.Exit(exitOk) + } + + // Event channel + eventBox := util.NewEventBox() + + // ANSI code processor + ansiProcessor := func(data []byte) (util.Chars, *[]ansiOffset) { + return util.ToChars(data), nil + } + + var lineAnsiState, prevLineAnsiState *ansiState + if opts.Ansi { + if opts.Theme.Colored { + ansiProcessor = func(data []byte) (util.Chars, *[]ansiOffset) { + prevLineAnsiState = lineAnsiState + trimmed, offsets, newState := extractColor(string(data), lineAnsiState, nil) + lineAnsiState = newState + return util.ToChars([]byte(trimmed)), offsets + } + } else { + // When color is disabled but ansi option is given, + // we simply strip out ANSI codes from the input + ansiProcessor = func(data []byte) (util.Chars, *[]ansiOffset) { + trimmed, _, _ := extractColor(string(data), nil, nil) + return util.ToChars([]byte(trimmed)), nil + } + } + } + + // Chunk list + var chunkList *ChunkList + var itemIndex int32 + header := make([]string, 0, opts.HeaderLines) + if len(opts.WithNth) == 0 { + chunkList = NewChunkList(func(item *Item, data []byte) bool { + if len(header) < opts.HeaderLines { + header = append(header, string(data)) + eventBox.Set(EvtHeader, header) + return false + } + item.text, item.colors = ansiProcessor(data) + item.text.Index = itemIndex + itemIndex++ + return true + }) + } else { + chunkList = NewChunkList(func(item *Item, data []byte) bool { + tokens := Tokenize(string(data), opts.Delimiter) + if opts.Ansi && opts.Theme.Colored && len(tokens) > 1 { + var ansiState *ansiState + if prevLineAnsiState != nil { + ansiStateDup := *prevLineAnsiState + ansiState = &ansiStateDup + } + for _, token := range tokens { + prevAnsiState := ansiState + _, _, ansiState = extractColor(token.text.ToString(), ansiState, nil) + if prevAnsiState != nil { + token.text.Prepend("\x1b[m" + prevAnsiState.ToString()) + } else { + token.text.Prepend("\x1b[m") + } + } + } + trans := Transform(tokens, opts.WithNth) + transformed := joinTokens(trans) + if len(header) < opts.HeaderLines { + header = append(header, transformed) + eventBox.Set(EvtHeader, header) + return false + } + item.text, item.colors = ansiProcessor([]byte(transformed)) + item.text.TrimTrailingWhitespaces() + item.text.Index = itemIndex + item.origText = &data + itemIndex++ + return true + }) + } + + // Reader + streamingFilter := opts.Filter != nil && !sort && !opts.Tac && !opts.Sync + var reader *Reader + if !streamingFilter { + reader = NewReader(func(data []byte) bool { + return chunkList.Push(data) + }, eventBox, opts.ReadZero, opts.Filter == nil) + go reader.ReadSource() + } + + // Matcher + forward := true + for _, cri := range opts.Criteria[1:] { + if cri == byEnd { + forward = false + break + } + if cri == byBegin { + break + } + } + patternBuilder := func(runes []rune) *Pattern { + return BuildPattern( + opts.Fuzzy, opts.FuzzyAlgo, opts.Extended, opts.Case, opts.Normalize, forward, + opts.Filter == nil, opts.Nth, opts.Delimiter, runes) + } + matcher := NewMatcher(patternBuilder, sort, opts.Tac, eventBox) + + // Filtering mode + if opts.Filter != nil { + if opts.PrintQuery { + opts.Printer(*opts.Filter) + } + + pattern := patternBuilder([]rune(*opts.Filter)) + matcher.sort = pattern.sortable + + found := false + if streamingFilter { + slab := util.MakeSlab(slab16Size, slab32Size) + reader := NewReader( + func(runes []byte) bool { + item := Item{} + if chunkList.trans(&item, runes) { + if result, _, _ := pattern.MatchItem(&item, false, slab); result != nil { + opts.Printer(item.text.ToString()) + found = true + } + } + return false + }, eventBox, opts.ReadZero, false) + reader.ReadSource() + } else { + eventBox.Unwatch(EvtReadNew) + eventBox.WaitFor(EvtReadFin) + + snapshot, _ := chunkList.Snapshot() + merger, _ := matcher.scan(MatchRequest{ + chunks: snapshot, + pattern: pattern}) + for i := 0; i < merger.Length(); i++ { + opts.Printer(merger.Get(i).item.AsString(opts.Ansi)) + found = true + } + } + if found { + os.Exit(exitOk) + } + os.Exit(exitNoMatch) + } + + // Synchronous search + if opts.Sync { + eventBox.Unwatch(EvtReadNew) + eventBox.WaitFor(EvtReadFin) + } + + // Go interactive + go matcher.Loop() + + // Terminal I/O + terminal := NewTerminal(opts, eventBox) + deferred := opts.Select1 || opts.Exit0 + go terminal.Loop() + if !deferred { + terminal.startChan <- true + } + + // Event coordination + reading := true + clearCache := util.Once(false) + clearSelection := util.Once(false) + ticks := 0 + var nextCommand *string + restart := func(command string) { + reading = true + clearCache = util.Once(true) + clearSelection = util.Once(true) + chunkList.Clear() + itemIndex = 0 + header = make([]string, 0, opts.HeaderLines) + go reader.restart(command) + } + eventBox.Watch(EvtReadNew) + query := []rune{} + for { + delay := true + ticks++ + input := func() []rune { + paused, input := terminal.Input() + if !paused { + query = input + } + return query + } + eventBox.Wait(func(events *util.Events) { + if _, fin := (*events)[EvtReadFin]; fin { + delete(*events, EvtReadNew) + } + for evt, value := range *events { + switch evt { + case EvtQuit: + if reading { + reader.terminate() + } + os.Exit(value.(int)) + case EvtReadNew, EvtReadFin: + if evt == EvtReadFin && nextCommand != nil { + restart(*nextCommand) + nextCommand = nil + break + } else { + reading = reading && evt == EvtReadNew + } + snapshot, count := chunkList.Snapshot() + terminal.UpdateCount(count, !reading, value.(*string)) + if opts.Sync { + opts.Sync = false + terminal.UpdateList(PassMerger(&snapshot, opts.Tac), false) + } + matcher.Reset(snapshot, input(), false, !reading, sort, clearCache()) + + case EvtSearchNew: + var command *string + switch val := value.(type) { + case searchRequest: + sort = val.sort + command = val.command + } + if command != nil { + if reading { + reader.terminate() + nextCommand = command + } else { + restart(*command) + } + break + } + snapshot, _ := chunkList.Snapshot() + matcher.Reset(snapshot, input(), true, !reading, sort, clearCache()) + delay = false + + case EvtSearchProgress: + switch val := value.(type) { + case float32: + terminal.UpdateProgress(val) + } + + case EvtHeader: + headerPadded := make([]string, opts.HeaderLines) + copy(headerPadded, value.([]string)) + terminal.UpdateHeader(headerPadded) + + case EvtSearchFin: + switch val := value.(type) { + case *Merger: + if deferred { + count := val.Length() + if opts.Select1 && count > 1 || opts.Exit0 && !opts.Select1 && count > 0 { + deferred = false + terminal.startChan <- true + } else if val.final { + if opts.Exit0 && count == 0 || opts.Select1 && count == 1 { + if opts.PrintQuery { + opts.Printer(opts.Query) + } + if len(opts.Expect) > 0 { + opts.Printer("") + } + for i := 0; i < count; i++ { + opts.Printer(val.Get(i).item.AsString(opts.Ansi)) + } + if count > 0 { + os.Exit(exitOk) + } + os.Exit(exitNoMatch) + } + deferred = false + terminal.startChan <- true + } + } + terminal.UpdateList(val, clearSelection()) + } + } + } + events.Clear() + }) + if delay && reading { + dur := util.DurWithin( + time.Duration(ticks)*coordinatorDelayStep, + 0, coordinatorDelayMax) + time.Sleep(dur) + } + } +} diff --git a/.fzf/src/history.go b/.fzf/src/history.go new file mode 100644 index 0000000..45728d4 --- /dev/null +++ b/.fzf/src/history.go @@ -0,0 +1,96 @@ +package fzf + +import ( + "errors" + "io/ioutil" + "os" + "strings" +) + +// History struct represents input history +type History struct { + path string + lines []string + modified map[int]string + maxSize int + cursor int +} + +// NewHistory returns the pointer to a new History struct +func NewHistory(path string, maxSize int) (*History, error) { + fmtError := func(e error) error { + if os.IsPermission(e) { + return errors.New("permission denied: " + path) + } + return errors.New("invalid history file: " + e.Error()) + } + + // Read history file + data, err := ioutil.ReadFile(path) + if err != nil { + // If it doesn't exist, check if we can create a file with the name + if os.IsNotExist(err) { + data = []byte{} + if err := ioutil.WriteFile(path, data, 0600); err != nil { + return nil, fmtError(err) + } + } else { + return nil, fmtError(err) + } + } + // Split lines and limit the maximum number of lines + lines := strings.Split(strings.Trim(string(data), "\n"), "\n") + if len(lines[len(lines)-1]) > 0 { + lines = append(lines, "") + } + return &History{ + path: path, + maxSize: maxSize, + lines: lines, + modified: make(map[int]string), + cursor: len(lines) - 1}, nil +} + +func (h *History) append(line string) error { + // We don't append empty lines + if len(line) == 0 { + return nil + } + + lines := append(h.lines[:len(h.lines)-1], line) + if len(lines) > h.maxSize { + lines = lines[len(lines)-h.maxSize:] + } + h.lines = append(lines, "") + return ioutil.WriteFile(h.path, []byte(strings.Join(h.lines, "\n")), 0600) +} + +func (h *History) override(str string) { + // You can update the history but they're not written to the file + if h.cursor == len(h.lines)-1 { + h.lines[h.cursor] = str + } else if h.cursor < len(h.lines)-1 { + h.modified[h.cursor] = str + } +} + +func (h *History) current() string { + if str, prs := h.modified[h.cursor]; prs { + return str + } + return h.lines[h.cursor] +} + +func (h *History) previous() string { + if h.cursor > 0 { + h.cursor-- + } + return h.current() +} + +func (h *History) next() string { + if h.cursor < len(h.lines)-1 { + h.cursor++ + } + return h.current() +} diff --git a/.fzf/src/history_test.go b/.fzf/src/history_test.go new file mode 100644 index 0000000..6294bde --- /dev/null +++ b/.fzf/src/history_test.go @@ -0,0 +1,68 @@ +package fzf + +import ( + "io/ioutil" + "os" + "runtime" + "testing" +) + +func TestHistory(t *testing.T) { + maxHistory := 50 + + // Invalid arguments + var paths []string + if runtime.GOOS == "windows" { + // GOPATH should exist, so we shouldn't be able to override it + paths = []string{os.Getenv("GOPATH")} + } else { + paths = []string{"/etc", "/proc"} + } + + for _, path := range paths { + if _, e := NewHistory(path, maxHistory); e == nil { + t.Error("Error expected for: " + path) + } + } + + f, _ := ioutil.TempFile("", "fzf-history") + f.Close() + + { // Append lines + h, _ := NewHistory(f.Name(), maxHistory) + for i := 0; i < maxHistory+10; i++ { + h.append("foobar") + } + } + { // Read lines + h, _ := NewHistory(f.Name(), maxHistory) + if len(h.lines) != maxHistory+1 { + t.Errorf("Expected: %d, actual: %d\n", maxHistory+1, len(h.lines)) + } + for i := 0; i < maxHistory; i++ { + if h.lines[i] != "foobar" { + t.Error("Expected: foobar, actual: " + h.lines[i]) + } + } + } + { // Append lines + h, _ := NewHistory(f.Name(), maxHistory) + h.append("barfoo") + h.append("") + h.append("foobarbaz") + } + { // Read lines again + h, _ := NewHistory(f.Name(), maxHistory) + if len(h.lines) != maxHistory+1 { + t.Errorf("Expected: %d, actual: %d\n", maxHistory+1, len(h.lines)) + } + compare := func(idx int, exp string) { + if h.lines[idx] != exp { + t.Errorf("Expected: %s, actual: %s\n", exp, h.lines[idx]) + } + } + compare(maxHistory-3, "foobar") + compare(maxHistory-2, "barfoo") + compare(maxHistory-1, "foobarbaz") + } +} diff --git a/.fzf/src/item.go b/.fzf/src/item.go new file mode 100644 index 0000000..cb778cb --- /dev/null +++ b/.fzf/src/item.go @@ -0,0 +1,44 @@ +package fzf + +import ( + "github.com/junegunn/fzf/src/util" +) + +// Item represents each input line. 56 bytes. +type Item struct { + text util.Chars // 32 = 24 + 1 + 1 + 2 + 4 + transformed *[]Token // 8 + origText *[]byte // 8 + colors *[]ansiOffset // 8 +} + +// Index returns ordinal index of the Item +func (item *Item) Index() int32 { + return item.text.Index +} + +var minItem = Item{text: util.Chars{Index: -1}} + +func (item *Item) TrimLength() uint16 { + return item.text.TrimLength() +} + +// Colors returns ansiOffsets of the Item +func (item *Item) Colors() []ansiOffset { + if item.colors == nil { + return []ansiOffset{} + } + return *item.colors +} + +// AsString returns the original string +func (item *Item) AsString(stripAnsi bool) string { + if item.origText != nil { + if stripAnsi { + trimmed, _, _ := extractColor(string(*item.origText), nil, nil) + return trimmed + } + return string(*item.origText) + } + return item.text.ToString() +} diff --git a/.fzf/src/item_test.go b/.fzf/src/item_test.go new file mode 100644 index 0000000..1efb5f1 --- /dev/null +++ b/.fzf/src/item_test.go @@ -0,0 +1,23 @@ +package fzf + +import ( + "testing" + + "github.com/junegunn/fzf/src/util" +) + +func TestStringPtr(t *testing.T) { + orig := []byte("\x1b[34mfoo") + text := []byte("\x1b[34mbar") + item := Item{origText: &orig, text: util.ToChars(text)} + if item.AsString(true) != "foo" || item.AsString(false) != string(orig) { + t.Fail() + } + if item.AsString(true) != "foo" { + t.Fail() + } + item.origText = nil + if item.AsString(true) != string(text) || item.AsString(false) != string(text) { + t.Fail() + } +} diff --git a/.fzf/src/matcher.go b/.fzf/src/matcher.go new file mode 100644 index 0000000..22aa819 --- /dev/null +++ b/.fzf/src/matcher.go @@ -0,0 +1,235 @@ +package fzf + +import ( + "fmt" + "runtime" + "sort" + "sync" + "time" + + "github.com/junegunn/fzf/src/util" +) + +// MatchRequest represents a search request +type MatchRequest struct { + chunks []*Chunk + pattern *Pattern + final bool + sort bool + clearCache bool +} + +// Matcher is responsible for performing search +type Matcher struct { + patternBuilder func([]rune) *Pattern + sort bool + tac bool + eventBox *util.EventBox + reqBox *util.EventBox + partitions int + slab []*util.Slab + mergerCache map[string]*Merger +} + +const ( + reqRetry util.EventType = iota + reqReset +) + +// NewMatcher returns a new Matcher +func NewMatcher(patternBuilder func([]rune) *Pattern, + sort bool, tac bool, eventBox *util.EventBox) *Matcher { + partitions := util.Min(numPartitionsMultiplier*runtime.NumCPU(), maxPartitions) + return &Matcher{ + patternBuilder: patternBuilder, + sort: sort, + tac: tac, + eventBox: eventBox, + reqBox: util.NewEventBox(), + partitions: partitions, + slab: make([]*util.Slab, partitions), + mergerCache: make(map[string]*Merger)} +} + +// Loop puts Matcher in action +func (m *Matcher) Loop() { + prevCount := 0 + + for { + var request MatchRequest + + m.reqBox.Wait(func(events *util.Events) { + for _, val := range *events { + switch val := val.(type) { + case MatchRequest: + request = val + default: + panic(fmt.Sprintf("Unexpected type: %T", val)) + } + } + events.Clear() + }) + + if request.sort != m.sort || request.clearCache { + m.sort = request.sort + m.mergerCache = make(map[string]*Merger) + clearChunkCache() + } + + // Restart search + patternString := request.pattern.AsString() + var merger *Merger + cancelled := false + count := CountItems(request.chunks) + + foundCache := false + if count == prevCount { + // Look up mergerCache + if cached, found := m.mergerCache[patternString]; found { + foundCache = true + merger = cached + } + } else { + // Invalidate mergerCache + prevCount = count + m.mergerCache = make(map[string]*Merger) + } + + if !foundCache { + merger, cancelled = m.scan(request) + } + + if !cancelled { + if merger.cacheable() { + m.mergerCache[patternString] = merger + } + merger.final = request.final + m.eventBox.Set(EvtSearchFin, merger) + } + } +} + +func (m *Matcher) sliceChunks(chunks []*Chunk) [][]*Chunk { + partitions := m.partitions + perSlice := len(chunks) / partitions + + if perSlice == 0 { + partitions = len(chunks) + perSlice = 1 + } + + slices := make([][]*Chunk, partitions) + for i := 0; i < partitions; i++ { + start := i * perSlice + end := start + perSlice + if i == partitions-1 { + end = len(chunks) + } + slices[i] = chunks[start:end] + } + return slices +} + +type partialResult struct { + index int + matches []Result +} + +func (m *Matcher) scan(request MatchRequest) (*Merger, bool) { + startedAt := time.Now() + + numChunks := len(request.chunks) + if numChunks == 0 { + return EmptyMerger, false + } + pattern := request.pattern + if pattern.IsEmpty() { + return PassMerger(&request.chunks, m.tac), false + } + + cancelled := util.NewAtomicBool(false) + + slices := m.sliceChunks(request.chunks) + numSlices := len(slices) + resultChan := make(chan partialResult, numSlices) + countChan := make(chan int, numChunks) + waitGroup := sync.WaitGroup{} + + for idx, chunks := range slices { + waitGroup.Add(1) + if m.slab[idx] == nil { + m.slab[idx] = util.MakeSlab(slab16Size, slab32Size) + } + go func(idx int, slab *util.Slab, chunks []*Chunk) { + defer func() { waitGroup.Done() }() + count := 0 + allMatches := make([][]Result, len(chunks)) + for idx, chunk := range chunks { + matches := request.pattern.Match(chunk, slab) + allMatches[idx] = matches + count += len(matches) + if cancelled.Get() { + return + } + countChan <- len(matches) + } + sliceMatches := make([]Result, 0, count) + for _, matches := range allMatches { + sliceMatches = append(sliceMatches, matches...) + } + if m.sort { + if m.tac { + sort.Sort(ByRelevanceTac(sliceMatches)) + } else { + sort.Sort(ByRelevance(sliceMatches)) + } + } + resultChan <- partialResult{idx, sliceMatches} + }(idx, m.slab[idx], chunks) + } + + wait := func() bool { + cancelled.Set(true) + waitGroup.Wait() + return true + } + + count := 0 + matchCount := 0 + for matchesInChunk := range countChan { + count++ + matchCount += matchesInChunk + + if count == numChunks { + break + } + + if m.reqBox.Peek(reqReset) { + return nil, wait() + } + + if time.Since(startedAt) > progressMinDuration { + m.eventBox.Set(EvtSearchProgress, float32(count)/float32(numChunks)) + } + } + + partialResults := make([][]Result, numSlices) + for range slices { + partialResult := <-resultChan + partialResults[partialResult.index] = partialResult.matches + } + return NewMerger(pattern, partialResults, m.sort, m.tac), false +} + +// Reset is called to interrupt/signal the ongoing search +func (m *Matcher) Reset(chunks []*Chunk, patternRunes []rune, cancel bool, final bool, sort bool, clearCache bool) { + pattern := m.patternBuilder(patternRunes) + + var event util.EventType + if cancel { + event = reqReset + } else { + event = reqRetry + } + m.reqBox.Set(event, MatchRequest{chunks, pattern, final, sort && pattern.sortable, clearCache}) +} diff --git a/.fzf/src/merger.go b/.fzf/src/merger.go new file mode 100644 index 0000000..8e6a884 --- /dev/null +++ b/.fzf/src/merger.go @@ -0,0 +1,120 @@ +package fzf + +import "fmt" + +// EmptyMerger is a Merger with no data +var EmptyMerger = NewMerger(nil, [][]Result{}, false, false) + +// Merger holds a set of locally sorted lists of items and provides the view of +// a single, globally-sorted list +type Merger struct { + pattern *Pattern + lists [][]Result + merged []Result + chunks *[]*Chunk + cursors []int + sorted bool + tac bool + final bool + count int +} + +// PassMerger returns a new Merger that simply returns the items in the +// original order +func PassMerger(chunks *[]*Chunk, tac bool) *Merger { + mg := Merger{ + pattern: nil, + chunks: chunks, + tac: tac, + count: 0} + + for _, chunk := range *mg.chunks { + mg.count += chunk.count + } + return &mg +} + +// NewMerger returns a new Merger +func NewMerger(pattern *Pattern, lists [][]Result, sorted bool, tac bool) *Merger { + mg := Merger{ + pattern: pattern, + lists: lists, + merged: []Result{}, + chunks: nil, + cursors: make([]int, len(lists)), + sorted: sorted, + tac: tac, + final: false, + count: 0} + + for _, list := range mg.lists { + mg.count += len(list) + } + return &mg +} + +// Length returns the number of items +func (mg *Merger) Length() int { + return mg.count +} + +// Get returns the pointer to the Result object indexed by the given integer +func (mg *Merger) Get(idx int) Result { + if mg.chunks != nil { + if mg.tac { + idx = mg.count - idx - 1 + } + chunk := (*mg.chunks)[idx/chunkSize] + return Result{item: &chunk.items[idx%chunkSize]} + } + + if mg.sorted { + return mg.mergedGet(idx) + } + + if mg.tac { + idx = mg.count - idx - 1 + } + for _, list := range mg.lists { + numItems := len(list) + if idx < numItems { + return list[idx] + } + idx -= numItems + } + panic(fmt.Sprintf("Index out of bounds (unsorted, %d/%d)", idx, mg.count)) +} + +func (mg *Merger) cacheable() bool { + return mg.count < mergerCacheMax +} + +func (mg *Merger) mergedGet(idx int) Result { + for i := len(mg.merged); i <= idx; i++ { + minRank := minRank() + minIdx := -1 + for listIdx, list := range mg.lists { + cursor := mg.cursors[listIdx] + if cursor < 0 || cursor == len(list) { + mg.cursors[listIdx] = -1 + continue + } + if cursor >= 0 { + rank := list[cursor] + if minIdx < 0 || compareRanks(rank, minRank, mg.tac) { + minRank = rank + minIdx = listIdx + } + } + } + + if minIdx >= 0 { + chosen := mg.lists[minIdx] + mg.merged = append(mg.merged, chosen[mg.cursors[minIdx]]) + mg.cursors[minIdx]++ + } else { + panic(fmt.Sprintf("Index out of bounds (sorted, %d/%d)", i, mg.count)) + } + } + return mg.merged[idx] +} diff --git a/.fzf/src/merger_test.go b/.fzf/src/merger_test.go new file mode 100644 index 0000000..c6af4f6 --- /dev/null +++ b/.fzf/src/merger_test.go @@ -0,0 +1,88 @@ +package fzf + +import ( + "fmt" + "math/rand" + "sort" + "testing" + + "github.com/junegunn/fzf/src/util" +) + +func assert(t *testing.T, cond bool, msg ...string) { + if !cond { + t.Error(msg) + } +} + +func randResult() Result { + str := fmt.Sprintf("%d", rand.Uint32()) + chars := util.ToChars([]byte(str)) + chars.Index = rand.Int31() + return Result{item: &Item{text: chars}} +} + +func TestEmptyMerger(t *testing.T) { + assert(t, EmptyMerger.Length() == 0, "Not empty") + assert(t, EmptyMerger.count == 0, "Invalid count") + assert(t, len(EmptyMerger.lists) == 0, "Invalid lists") + assert(t, len(EmptyMerger.merged) == 0, "Invalid merged list") +} + +func buildLists(partiallySorted bool) ([][]Result, []Result) { + numLists := 4 + lists := make([][]Result, numLists) + cnt := 0 + for i := 0; i < numLists; i++ { + numResults := rand.Int() % 20 + cnt += numResults + lists[i] = make([]Result, numResults) + for j := 0; j < numResults; j++ { + item := randResult() + lists[i][j] = item + } + if partiallySorted { + sort.Sort(ByRelevance(lists[i])) + } + } + items := []Result{} + for _, list := range lists { + items = append(items, list...) + } + return lists, items +} + +func TestMergerUnsorted(t *testing.T) { + lists, items := buildLists(false) + cnt := len(items) + + // Not sorted: same order + mg := NewMerger(nil, lists, false, false) + assert(t, cnt == mg.Length(), "Invalid Length") + for i := 0; i < cnt; i++ { + assert(t, items[i] == mg.Get(i), "Invalid Get") + } +} + +func TestMergerSorted(t *testing.T) { + lists, items := buildLists(true) + cnt := len(items) + + // Sorted sorted order + mg := NewMerger(nil, lists, true, false) + assert(t, cnt == mg.Length(), "Invalid Length") + sort.Sort(ByRelevance(items)) + for i := 0; i < cnt; i++ { + if items[i] != mg.Get(i) { + t.Error("Not sorted", items[i], mg.Get(i)) + } + } + + // Inverse order + mg2 := NewMerger(nil, lists, true, false) + for i := cnt - 1; i >= 0; i-- { + if items[i] != mg2.Get(i) { + t.Error("Not sorted", items[i], mg2.Get(i)) + } + } +} diff --git a/.fzf/src/options.go b/.fzf/src/options.go new file mode 100644 index 0000000..b93fd97 --- /dev/null +++ b/.fzf/src/options.go @@ -0,0 +1,1691 @@ +package fzf + +import ( + "fmt" + "os" + "regexp" + "strconv" + "strings" + "unicode" + + "github.com/junegunn/fzf/src/algo" + "github.com/junegunn/fzf/src/tui" + + "github.com/mattn/go-runewidth" + "github.com/mattn/go-shellwords" +) + +const usage = `usage: fzf [options] + + Search + -x, --extended Extended-search mode + (enabled by default; +x or --no-extended to disable) + -e, --exact Enable Exact-match + --algo=TYPE Fuzzy matching algorithm: [v1|v2] (default: v2) + -i Case-insensitive match (default: smart-case match) + +i Case-sensitive match + --literal Do not normalize latin script letters before matching + -n, --nth=N[,..] Comma-separated list of field index expressions + for limiting search scope. Each can be a non-zero + integer or a range expression ([BEGIN]..[END]). + --with-nth=N[,..] Transform the presentation of each line using + field index expressions + -d, --delimiter=STR Field delimiter regex (default: AWK-style) + +s, --no-sort Do not sort the result + --tac Reverse the order of the input + --disabled Do not perform search + --tiebreak=CRI[,..] Comma-separated list of sort criteria to apply + when the scores are tied [length|begin|end|index] + (default: length) + + Interface + -m, --multi[=MAX] Enable multi-select with tab/shift-tab + --no-mouse Disable mouse + --bind=KEYBINDS Custom key bindings. Refer to the man page. + --cycle Enable cyclic scroll + --keep-right Keep the right end of the line visible on overflow + --scroll-off=LINES Number of screen lines to keep above or below when + scrolling to the top or to the bottom (default: 0) + --no-hscroll Disable horizontal scroll + --hscroll-off=COLS Number of screen columns to keep to the right of the + highlighted substring (default: 10) + --filepath-word Make word-wise movements respect path separators + --jump-labels=CHARS Label characters for jump and jump-accept + + Layout + --height=HEIGHT[%] Display fzf window below the cursor with the given + height instead of using fullscreen + --min-height=HEIGHT Minimum height when --height is given in percent + (default: 10) + --layout=LAYOUT Choose layout: [default|reverse|reverse-list] + --border[=STYLE] Draw border around the finder + [rounded|sharp|horizontal|vertical| + top|bottom|left|right|none] (default: rounded) + --margin=MARGIN Screen margin (TRBL | TB,RL | T,RL,B | T,R,B,L) + --padding=PADDING Padding inside border (TRBL | TB,RL | T,RL,B | T,R,B,L) + --info=STYLE Finder info style [default|inline|hidden] + --prompt=STR Input prompt (default: '> ') + --pointer=STR Pointer to the current line (default: '>') + --marker=STR Multi-select marker (default: '>') + --header=STR String to print as header + --header-lines=N The first N lines of the input are treated as header + --header-first Print header before the prompt line + + Display + --ansi Enable processing of ANSI color codes + --tabstop=SPACES Number of spaces for a tab character (default: 8) + --color=COLSPEC Base scheme (dark|light|16|bw) and/or custom colors + --no-bold Do not use bold text + + History + --history=FILE History file + --history-size=N Maximum number of history entries (default: 1000) + + Preview + --preview=COMMAND Command to preview highlighted line ({}) + --preview-window=OPT Preview window layout (default: right:50%) + [up|down|left|right][,SIZE[%]] + [,[no]wrap][,[no]cycle][,[no]follow][,[no]hidden] + [,border-BORDER_OPT] + [,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES] + [,default] + + Scripting + -q, --query=STR Start the finder with the given query + -1, --select-1 Automatically select the only match + -0, --exit-0 Exit immediately when there's no match + -f, --filter=STR Filter mode. Do not start interactive finder. + --print-query Print query as the first line + --expect=KEYS Comma-separated list of keys to complete fzf + --read0 Read input delimited by ASCII NUL characters + --print0 Print output delimited by ASCII NUL characters + --sync Synchronous search for multi-staged filtering + --version Display version information and exit + + Environment variables + FZF_DEFAULT_COMMAND Default command to use when input is tty + FZF_DEFAULT_OPTS Default options + (e.g. '--layout=reverse --inline-info') + +` + +// Case denotes case-sensitivity of search +type Case int + +// Case-sensitivities +const ( + CaseSmart Case = iota + CaseIgnore + CaseRespect +) + +// Sort criteria +type criterion int + +const ( + byScore criterion = iota + byLength + byBegin + byEnd +) + +type sizeSpec struct { + size float64 + percent bool +} + +func defaultMargin() [4]sizeSpec { + return [4]sizeSpec{} +} + +type windowPosition int + +const ( + posUp windowPosition = iota + posDown + posLeft + posRight +) + +type layoutType int + +const ( + layoutDefault layoutType = iota + layoutReverse + layoutReverseList +) + +type infoStyle int + +const ( + infoDefault infoStyle = iota + infoInline + infoHidden +) + +type previewOpts struct { + command string + position windowPosition + size sizeSpec + scroll string + hidden bool + wrap bool + cycle bool + follow bool + border tui.BorderShape + headerLines int +} + +// Options stores the values of command-line options +type Options struct { + Fuzzy bool + FuzzyAlgo algo.Algo + Extended bool + Phony bool + Case Case + Normalize bool + Nth []Range + WithNth []Range + Delimiter Delimiter + Sort int + Tac bool + Criteria []criterion + Multi int + Ansi bool + Mouse bool + Theme *tui.ColorTheme + Black bool + Bold bool + Height sizeSpec + MinHeight int + Layout layoutType + Cycle bool + KeepRight bool + Hscroll bool + HscrollOff int + ScrollOff int + FileWord bool + InfoStyle infoStyle + JumpLabels string + Prompt string + Pointer string + Marker string + Query string + Select1 bool + Exit0 bool + Filter *string + ToggleSort bool + Expect map[tui.Event]string + Keymap map[tui.Event][]action + Preview previewOpts + PrintQuery bool + ReadZero bool + Printer func(string) + PrintSep string + Sync bool + History *History + Header []string + HeaderLines int + HeaderFirst bool + Margin [4]sizeSpec + Padding [4]sizeSpec + BorderShape tui.BorderShape + Unicode bool + Tabstop int + ClearOnExit bool + Version bool +} + +func defaultPreviewOpts(command string) previewOpts { + return previewOpts{command, posRight, sizeSpec{50, true}, "", false, false, false, false, tui.BorderRounded, 0} +} + +func defaultOptions() *Options { + return &Options{ + Fuzzy: true, + FuzzyAlgo: algo.FuzzyMatchV2, + Extended: true, + Phony: false, + Case: CaseSmart, + Normalize: true, + Nth: make([]Range, 0), + WithNth: make([]Range, 0), + Delimiter: Delimiter{}, + Sort: 1000, + Tac: false, + Criteria: []criterion{byScore, byLength}, + Multi: 0, + Ansi: false, + Mouse: true, + Theme: tui.EmptyTheme(), + Black: false, + Bold: true, + MinHeight: 10, + Layout: layoutDefault, + Cycle: false, + KeepRight: false, + Hscroll: true, + HscrollOff: 10, + ScrollOff: 0, + FileWord: false, + InfoStyle: infoDefault, + JumpLabels: defaultJumpLabels, + Prompt: "> ", + Pointer: ">", + Marker: ">", + Query: "", + Select1: false, + Exit0: false, + Filter: nil, + ToggleSort: false, + Expect: make(map[tui.Event]string), + Keymap: make(map[tui.Event][]action), + Preview: defaultPreviewOpts(""), + PrintQuery: false, + ReadZero: false, + Printer: func(str string) { fmt.Println(str) }, + PrintSep: "\n", + Sync: false, + History: nil, + Header: make([]string, 0), + HeaderLines: 0, + HeaderFirst: false, + Margin: defaultMargin(), + Padding: defaultMargin(), + Unicode: true, + Tabstop: 8, + ClearOnExit: true, + Version: false} +} + +func help(code int) { + os.Stdout.WriteString(usage) + os.Exit(code) +} + +func errorExit(msg string) { + os.Stderr.WriteString(msg + "\n") + os.Exit(exitError) +} + +func optString(arg string, prefixes ...string) (bool, string) { + for _, prefix := range prefixes { + if strings.HasPrefix(arg, prefix) { + return true, arg[len(prefix):] + } + } + return false, "" +} + +func nextString(args []string, i *int, message string) string { + if len(args) > *i+1 { + *i++ + } else { + errorExit(message) + } + return args[*i] +} + +func optionalNextString(args []string, i *int) (bool, string) { + if len(args) > *i+1 && !strings.HasPrefix(args[*i+1], "-") && !strings.HasPrefix(args[*i+1], "+") { + *i++ + return true, args[*i] + } + return false, "" +} + +func atoi(str string) int { + num, err := strconv.Atoi(str) + if err != nil { + errorExit("not a valid integer: " + str) + } + return num +} + +func atof(str string) float64 { + num, err := strconv.ParseFloat(str, 64) + if err != nil { + errorExit("not a valid number: " + str) + } + return num +} + +func nextInt(args []string, i *int, message string) int { + if len(args) > *i+1 { + *i++ + } else { + errorExit(message) + } + return atoi(args[*i]) +} + +func optionalNumeric(args []string, i *int, defaultValue int) int { + if len(args) > *i+1 { + if strings.IndexAny(args[*i+1], "0123456789") == 0 { + *i++ + return atoi(args[*i]) + } + } + return defaultValue +} + +func splitNth(str string) []Range { + if match, _ := regexp.MatchString("^[0-9,-.]+$", str); !match { + errorExit("invalid format: " + str) + } + + tokens := strings.Split(str, ",") + ranges := make([]Range, len(tokens)) + for idx, s := range tokens { + r, ok := ParseRange(&s) + if !ok { + errorExit("invalid format: " + str) + } + ranges[idx] = r + } + return ranges +} + +func delimiterRegexp(str string) Delimiter { + // Special handling of \t + str = strings.Replace(str, "\\t", "\t", -1) + + // 1. Pattern does not contain any special character + if regexp.QuoteMeta(str) == str { + return Delimiter{str: &str} + } + + rx, e := regexp.Compile(str) + // 2. Pattern is not a valid regular expression + if e != nil { + return Delimiter{str: &str} + } + + // 3. Pattern as regular expression. Slow. + return Delimiter{regex: rx} +} + +func isAlphabet(char uint8) bool { + return char >= 'a' && char <= 'z' +} + +func isNumeric(char uint8) bool { + return char >= '0' && char <= '9' +} + +func parseAlgo(str string) algo.Algo { + switch str { + case "v1": + return algo.FuzzyMatchV1 + case "v2": + return algo.FuzzyMatchV2 + default: + errorExit("invalid algorithm (expected: v1 or v2)") + } + return algo.FuzzyMatchV2 +} + +func parseBorder(str string, optional bool) tui.BorderShape { + switch str { + case "rounded": + return tui.BorderRounded + case "sharp": + return tui.BorderSharp + case "horizontal": + return tui.BorderHorizontal + case "vertical": + return tui.BorderVertical + case "top": + return tui.BorderTop + case "bottom": + return tui.BorderBottom + case "left": + return tui.BorderLeft + case "right": + return tui.BorderRight + case "none": + return tui.BorderNone + default: + if optional && str == "" { + return tui.BorderRounded + } + errorExit("invalid border style (expected: rounded|sharp|horizontal|vertical|top|bottom|left|right|none)") + } + return tui.BorderNone +} + +func parseKeyChords(str string, message string) map[tui.Event]string { + if len(str) == 0 { + errorExit(message) + } + + str = regexp.MustCompile("(?i)(alt-),").ReplaceAllString(str, "$1"+string([]rune{escapedComma})) + tokens := strings.Split(str, ",") + if str == "," || strings.HasPrefix(str, ",,") || strings.HasSuffix(str, ",,") || strings.Contains(str, ",,,") { + tokens = append(tokens, ",") + } + + chords := make(map[tui.Event]string) + for _, key := range tokens { + if len(key) == 0 { + continue // ignore + } + key = strings.ReplaceAll(key, string([]rune{escapedComma}), ",") + lkey := strings.ToLower(key) + add := func(e tui.EventType) { + chords[e.AsEvent()] = key + } + switch lkey { + case "up": + add(tui.Up) + case "down": + add(tui.Down) + case "left": + add(tui.Left) + case "right": + add(tui.Right) + case "enter", "return": + add(tui.CtrlM) + case "space": + chords[tui.Key(' ')] = key + case "bspace", "bs": + add(tui.BSpace) + case "ctrl-space": + add(tui.CtrlSpace) + case "ctrl-^", "ctrl-6": + add(tui.CtrlCaret) + case "ctrl-/", "ctrl-_": + add(tui.CtrlSlash) + case "ctrl-\\": + add(tui.CtrlBackSlash) + case "ctrl-]": + add(tui.CtrlRightBracket) + case "change": + add(tui.Change) + case "backward-eof": + add(tui.BackwardEOF) + case "alt-enter", "alt-return": + chords[tui.CtrlAltKey('m')] = key + case "alt-space": + chords[tui.AltKey(' ')] = key + case "alt-bs", "alt-bspace": + add(tui.AltBS) + case "alt-up": + add(tui.AltUp) + case "alt-down": + add(tui.AltDown) + case "alt-left": + add(tui.AltLeft) + case "alt-right": + add(tui.AltRight) + case "tab": + add(tui.Tab) + case "btab", "shift-tab": + add(tui.BTab) + case "esc": + add(tui.ESC) + case "del": + add(tui.Del) + case "home": + add(tui.Home) + case "end": + add(tui.End) + case "insert": + add(tui.Insert) + case "pgup", "page-up": + add(tui.PgUp) + case "pgdn", "page-down": + add(tui.PgDn) + case "alt-shift-up", "shift-alt-up": + add(tui.AltSUp) + case "alt-shift-down", "shift-alt-down": + add(tui.AltSDown) + case "alt-shift-left", "shift-alt-left": + add(tui.AltSLeft) + case "alt-shift-right", "shift-alt-right": + add(tui.AltSRight) + case "shift-up": + add(tui.SUp) + case "shift-down": + add(tui.SDown) + case "shift-left": + add(tui.SLeft) + case "shift-right": + add(tui.SRight) + case "left-click": + add(tui.LeftClick) + case "right-click": + add(tui.RightClick) + case "double-click": + add(tui.DoubleClick) + case "f10": + add(tui.F10) + case "f11": + add(tui.F11) + case "f12": + add(tui.F12) + default: + runes := []rune(key) + if len(key) == 10 && strings.HasPrefix(lkey, "ctrl-alt-") && isAlphabet(lkey[9]) { + chords[tui.CtrlAltKey(rune(key[9]))] = key + } else if len(key) == 6 && strings.HasPrefix(lkey, "ctrl-") && isAlphabet(lkey[5]) { + add(tui.EventType(tui.CtrlA.Int() + int(lkey[5]) - 'a')) + } else if len(runes) == 5 && strings.HasPrefix(lkey, "alt-") { + r := runes[4] + switch r { + case escapedColon: + r = ':' + case escapedComma: + r = ',' + case escapedPlus: + r = '+' + } + chords[tui.AltKey(r)] = key + } else if len(key) == 2 && strings.HasPrefix(lkey, "f") && key[1] >= '1' && key[1] <= '9' { + add(tui.EventType(tui.F1.Int() + int(key[1]) - '1')) + } else if len(runes) == 1 { + chords[tui.Key(runes[0])] = key + } else { + errorExit("unsupported key: " + key) + } + } + } + return chords +} + +func parseTiebreak(str string) []criterion { + criteria := []criterion{byScore} + hasIndex := false + hasLength := false + hasBegin := false + hasEnd := false + check := func(notExpected *bool, name string) { + if *notExpected { + errorExit("duplicate sort criteria: " + name) + } + if hasIndex { + errorExit("index should be the last criterion") + } + *notExpected = true + } + for _, str := range strings.Split(strings.ToLower(str), ",") { + switch str { + case "index": + check(&hasIndex, "index") + case "length": + check(&hasLength, "length") + criteria = append(criteria, byLength) + case "begin": + check(&hasBegin, "begin") + criteria = append(criteria, byBegin) + case "end": + check(&hasEnd, "end") + criteria = append(criteria, byEnd) + default: + errorExit("invalid sort criterion: " + str) + } + } + return criteria +} + +func dupeTheme(theme *tui.ColorTheme) *tui.ColorTheme { + dupe := *theme + return &dupe +} + +func parseTheme(defaultTheme *tui.ColorTheme, str string) *tui.ColorTheme { + theme := dupeTheme(defaultTheme) + rrggbb := regexp.MustCompile("^#[0-9a-fA-F]{6}$") + for _, str := range strings.Split(strings.ToLower(str), ",") { + switch str { + case "dark": + theme = dupeTheme(tui.Dark256) + case "light": + theme = dupeTheme(tui.Light256) + case "16": + theme = dupeTheme(tui.Default16) + case "bw", "no": + theme = tui.NoColorTheme() + default: + fail := func() { + errorExit("invalid color specification: " + str) + } + // Color is disabled + if theme == nil { + continue + } + + components := strings.Split(str, ":") + if len(components) < 2 { + fail() + } + + mergeAttr := func(cattr *tui.ColorAttr) { + for _, component := range components[1:] { + switch component { + case "regular": + cattr.Attr = tui.AttrRegular + case "bold", "strong": + cattr.Attr |= tui.Bold + case "dim": + cattr.Attr |= tui.Dim + case "italic": + cattr.Attr |= tui.Italic + case "underline": + cattr.Attr |= tui.Underline + case "blink": + cattr.Attr |= tui.Blink + case "reverse": + cattr.Attr |= tui.Reverse + case "black": + cattr.Color = tui.Color(0) + case "red": + cattr.Color = tui.Color(1) + case "green": + cattr.Color = tui.Color(2) + case "yellow": + cattr.Color = tui.Color(3) + case "blue": + cattr.Color = tui.Color(4) + case "magenta": + cattr.Color = tui.Color(5) + case "cyan": + cattr.Color = tui.Color(6) + case "white": + cattr.Color = tui.Color(7) + case "bright-black", "gray", "grey": + cattr.Color = tui.Color(8) + case "bright-red": + cattr.Color = tui.Color(9) + case "bright-green": + cattr.Color = tui.Color(10) + case "bright-yellow": + cattr.Color = tui.Color(11) + case "bright-blue": + cattr.Color = tui.Color(12) + case "bright-magenta": + cattr.Color = tui.Color(13) + case "bright-cyan": + cattr.Color = tui.Color(14) + case "bright-white": + cattr.Color = tui.Color(15) + case "": + default: + if rrggbb.MatchString(component) { + cattr.Color = tui.HexToColor(component) + } else { + ansi32, err := strconv.Atoi(component) + if err != nil || ansi32 < -1 || ansi32 > 255 { + fail() + } + cattr.Color = tui.Color(ansi32) + } + } + } + } + switch components[0] { + case "query", "input": + mergeAttr(&theme.Input) + case "disabled": + mergeAttr(&theme.Disabled) + case "fg": + mergeAttr(&theme.Fg) + case "bg": + mergeAttr(&theme.Bg) + case "preview-fg": + mergeAttr(&theme.PreviewFg) + case "preview-bg": + mergeAttr(&theme.PreviewBg) + case "fg+": + mergeAttr(&theme.Current) + case "bg+": + mergeAttr(&theme.DarkBg) + case "gutter": + mergeAttr(&theme.Gutter) + case "hl": + mergeAttr(&theme.Match) + case "hl+": + mergeAttr(&theme.CurrentMatch) + case "border": + mergeAttr(&theme.Border) + case "prompt": + mergeAttr(&theme.Prompt) + case "spinner": + mergeAttr(&theme.Spinner) + case "info": + mergeAttr(&theme.Info) + case "pointer": + mergeAttr(&theme.Cursor) + case "marker": + mergeAttr(&theme.Selected) + case "header": + mergeAttr(&theme.Header) + default: + fail() + } + } + } + return theme +} + +var executeRegexp *regexp.Regexp + +func firstKey(keymap map[tui.Event]string) tui.Event { + for k := range keymap { + return k + } + return tui.EventType(0).AsEvent() +} + +const ( + escapedColon = 0 + escapedComma = 1 + escapedPlus = 2 +) + +func init() { + // Backreferences are not supported. + // "~!@#$%^&*;/|".each_char.map { |c| Regexp.escape(c) }.map { |c| "#{c}[^#{c}]*#{c}" }.join('|') + executeRegexp = regexp.MustCompile( + `(?si)[:+](execute(?:-multi|-silent)?|reload|preview|change-prompt|unbind):.+|[:+](execute(?:-multi|-silent)?|reload|preview|change-prompt|unbind)(\([^)]*\)|\[[^\]]*\]|~[^~]*~|![^!]*!|@[^@]*@|\#[^\#]*\#|\$[^\$]*\$|%[^%]*%|\^[^\^]*\^|&[^&]*&|\*[^\*]*\*|;[^;]*;|/[^/]*/|\|[^\|]*\|)`) +} + +func parseKeymap(keymap map[tui.Event][]action, str string) { + masked := executeRegexp.ReplaceAllStringFunc(str, func(src string) string { + symbol := ":" + if strings.HasPrefix(src, "+") { + symbol = "+" + } + prefix := symbol + "execute" + if strings.HasPrefix(src[1:], "reload") { + prefix = symbol + "reload" + } else if strings.HasPrefix(src[1:], "preview") { + prefix = symbol + "preview" + } else if strings.HasPrefix(src[1:], "unbind") { + prefix = symbol + "unbind" + } else if strings.HasPrefix(src[1:], "change-prompt") { + prefix = symbol + "change-prompt" + } else if src[len(prefix)] == '-' { + c := src[len(prefix)+1] + if c == 's' || c == 'S' { + prefix += "-silent" + } else { + prefix += "-multi" + } + } + return prefix + "(" + strings.Repeat(" ", len(src)-len(prefix)-2) + ")" + }) + masked = strings.Replace(masked, "::", string([]rune{escapedColon, ':'}), -1) + masked = strings.Replace(masked, ",:", string([]rune{escapedComma, ':'}), -1) + masked = strings.Replace(masked, "+:", string([]rune{escapedPlus, ':'}), -1) + + idx := 0 + for _, pairStr := range strings.Split(masked, ",") { + origPairStr := str[idx : idx+len(pairStr)] + idx += len(pairStr) + 1 + + pair := strings.SplitN(pairStr, ":", 2) + if len(pair) < 2 { + errorExit("bind action not specified: " + origPairStr) + } + var key tui.Event + if len(pair[0]) == 1 && pair[0][0] == escapedColon { + key = tui.Key(':') + } else if len(pair[0]) == 1 && pair[0][0] == escapedComma { + key = tui.Key(',') + } else if len(pair[0]) == 1 && pair[0][0] == escapedPlus { + key = tui.Key('+') + } else { + keys := parseKeyChords(pair[0], "key name required") + key = firstKey(keys) + } + + idx2 := len(pair[0]) + 1 + specs := strings.Split(pair[1], "+") + actions := make([]action, 0, len(specs)) + appendAction := func(types ...actionType) { + actions = append(actions, toActions(types...)...) + } + prevSpec := "" + for specIndex, maskedSpec := range specs { + spec := origPairStr[idx2 : idx2+len(maskedSpec)] + idx2 += len(maskedSpec) + 1 + spec = prevSpec + spec + specLower := strings.ToLower(spec) + switch specLower { + case "ignore": + appendAction(actIgnore) + case "beginning-of-line": + appendAction(actBeginningOfLine) + case "abort": + appendAction(actAbort) + case "accept": + appendAction(actAccept) + case "accept-non-empty": + appendAction(actAcceptNonEmpty) + case "print-query": + appendAction(actPrintQuery) + case "refresh-preview": + appendAction(actRefreshPreview) + case "replace-query": + appendAction(actReplaceQuery) + case "backward-char": + appendAction(actBackwardChar) + case "backward-delete-char": + appendAction(actBackwardDeleteChar) + case "backward-delete-char/eof": + appendAction(actBackwardDeleteCharEOF) + case "backward-word": + appendAction(actBackwardWord) + case "clear-screen": + appendAction(actClearScreen) + case "delete-char": + appendAction(actDeleteChar) + case "delete-char/eof": + appendAction(actDeleteCharEOF) + case "deselect": + appendAction(actDeselect) + case "end-of-line": + appendAction(actEndOfLine) + case "cancel": + appendAction(actCancel) + case "clear-query": + appendAction(actClearQuery) + case "clear-selection": + appendAction(actClearSelection) + case "forward-char": + appendAction(actForwardChar) + case "forward-word": + appendAction(actForwardWord) + case "jump": + appendAction(actJump) + case "jump-accept": + appendAction(actJumpAccept) + case "kill-line": + appendAction(actKillLine) + case "kill-word": + appendAction(actKillWord) + case "unix-line-discard", "line-discard": + appendAction(actUnixLineDiscard) + case "unix-word-rubout", "word-rubout": + appendAction(actUnixWordRubout) + case "yank": + appendAction(actYank) + case "backward-kill-word": + appendAction(actBackwardKillWord) + case "toggle-down": + appendAction(actToggle, actDown) + case "toggle-up": + appendAction(actToggle, actUp) + case "toggle-in": + appendAction(actToggleIn) + case "toggle-out": + appendAction(actToggleOut) + case "toggle-all": + appendAction(actToggleAll) + case "toggle-search": + appendAction(actToggleSearch) + case "select": + appendAction(actSelect) + case "select-all": + appendAction(actSelectAll) + case "deselect-all": + appendAction(actDeselectAll) + case "close": + appendAction(actClose) + case "toggle": + appendAction(actToggle) + case "down": + appendAction(actDown) + case "up": + appendAction(actUp) + case "first", "top": + appendAction(actFirst) + case "last": + appendAction(actLast) + case "page-up": + appendAction(actPageUp) + case "page-down": + appendAction(actPageDown) + case "half-page-up": + appendAction(actHalfPageUp) + case "half-page-down": + appendAction(actHalfPageDown) + case "previous-history": + appendAction(actPreviousHistory) + case "next-history": + appendAction(actNextHistory) + case "toggle-preview": + appendAction(actTogglePreview) + case "toggle-preview-wrap": + appendAction(actTogglePreviewWrap) + case "toggle-sort": + appendAction(actToggleSort) + case "preview-top": + appendAction(actPreviewTop) + case "preview-bottom": + appendAction(actPreviewBottom) + case "preview-up": + appendAction(actPreviewUp) + case "preview-down": + appendAction(actPreviewDown) + case "preview-page-up": + appendAction(actPreviewPageUp) + case "preview-page-down": + appendAction(actPreviewPageDown) + case "preview-half-page-up": + appendAction(actPreviewHalfPageUp) + case "preview-half-page-down": + appendAction(actPreviewHalfPageDown) + case "enable-search": + appendAction(actEnableSearch) + case "disable-search": + appendAction(actDisableSearch) + case "put": + if key.Type == tui.Rune && unicode.IsGraphic(key.Char) { + appendAction(actRune) + } else { + errorExit("unable to put non-printable character: " + pair[0]) + } + default: + t := isExecuteAction(specLower) + if t == actIgnore { + if specIndex == 0 && specLower == "" { + actions = append(keymap[key], actions...) + } else { + errorExit("unknown action: " + spec) + } + } else { + var offset int + switch t { + case actReload: + offset = len("reload") + case actPreview: + offset = len("preview") + case actChangePrompt: + offset = len("change-prompt") + case actUnbind: + offset = len("unbind") + case actExecuteSilent: + offset = len("execute-silent") + case actExecuteMulti: + offset = len("execute-multi") + default: + offset = len("execute") + } + var actionArg string + if spec[offset] == ':' { + if specIndex == len(specs)-1 { + actionArg = spec[offset+1:] + actions = append(actions, action{t: t, a: actionArg}) + } else { + prevSpec = spec + "+" + continue + } + } else { + actionArg = spec[offset+1 : len(spec)-1] + actions = append(actions, action{t: t, a: actionArg}) + } + if t == actUnbind { + parseKeyChords(actionArg, "unbind target required") + } + } + } + prevSpec = "" + } + keymap[key] = actions + } +} + +func isExecuteAction(str string) actionType { + matches := executeRegexp.FindAllStringSubmatch(":"+str, -1) + if matches == nil || len(matches) != 1 { + return actIgnore + } + prefix := matches[0][1] + if len(prefix) == 0 { + prefix = matches[0][2] + } + switch prefix { + case "reload": + return actReload + case "unbind": + return actUnbind + case "preview": + return actPreview + case "change-prompt": + return actChangePrompt + case "execute": + return actExecute + case "execute-silent": + return actExecuteSilent + case "execute-multi": + return actExecuteMulti + } + return actIgnore +} + +func parseToggleSort(keymap map[tui.Event][]action, str string) { + keys := parseKeyChords(str, "key name required") + if len(keys) != 1 { + errorExit("multiple keys specified") + } + keymap[firstKey(keys)] = toActions(actToggleSort) +} + +func strLines(str string) []string { + return strings.Split(strings.TrimSuffix(str, "\n"), "\n") +} + +func parseSize(str string, maxPercent float64, label string) sizeSpec { + var val float64 + percent := strings.HasSuffix(str, "%") + if percent { + val = atof(str[:len(str)-1]) + if val < 0 { + errorExit(label + " must be non-negative") + } + if val > maxPercent { + errorExit(fmt.Sprintf("%s too large (max: %d%%)", label, int(maxPercent))) + } + } else { + if strings.Contains(str, ".") { + errorExit(label + " (without %) must be a non-negative integer") + } + + val = float64(atoi(str)) + if val < 0 { + errorExit(label + " must be non-negative") + } + } + return sizeSpec{val, percent} +} + +func parseHeight(str string) sizeSpec { + size := parseSize(str, 100, "height") + return size +} + +func parseLayout(str string) layoutType { + switch str { + case "default": + return layoutDefault + case "reverse": + return layoutReverse + case "reverse-list": + return layoutReverseList + default: + errorExit("invalid layout (expected: default / reverse / reverse-list)") + } + return layoutDefault +} + +func parseInfoStyle(str string) infoStyle { + switch str { + case "default": + return infoDefault + case "inline": + return infoInline + case "hidden": + return infoHidden + default: + errorExit("invalid info style (expected: default / inline / hidden)") + } + return infoDefault +} + +func parsePreviewWindow(opts *previewOpts, input string) { + delimRegex := regexp.MustCompile("[:,]") // : for backward compatibility + sizeRegex := regexp.MustCompile("^[0-9]+%?$") + offsetRegex := regexp.MustCompile(`^(\+{-?[0-9]+})?([+-][0-9]+)*(-?/[1-9][0-9]*)?$`) + headerRegex := regexp.MustCompile("^~(0|[1-9][0-9]*)$") + tokens := delimRegex.Split(input, -1) + for _, token := range tokens { + switch token { + case "": + case "default": + *opts = defaultPreviewOpts(opts.command) + case "hidden": + opts.hidden = true + case "nohidden": + opts.hidden = false + case "wrap": + opts.wrap = true + case "nowrap": + opts.wrap = false + case "cycle": + opts.cycle = true + case "nocycle": + opts.cycle = false + case "up", "top": + opts.position = posUp + case "down", "bottom": + opts.position = posDown + case "left": + opts.position = posLeft + case "right": + opts.position = posRight + case "rounded", "border", "border-rounded": + opts.border = tui.BorderRounded + case "sharp", "border-sharp": + opts.border = tui.BorderSharp + case "noborder", "border-none": + opts.border = tui.BorderNone + case "border-horizontal": + opts.border = tui.BorderHorizontal + case "border-vertical": + opts.border = tui.BorderVertical + case "border-top": + opts.border = tui.BorderTop + case "border-bottom": + opts.border = tui.BorderBottom + case "border-left": + opts.border = tui.BorderLeft + case "border-right": + opts.border = tui.BorderRight + case "follow": + opts.follow = true + case "nofollow": + opts.follow = false + default: + if headerRegex.MatchString(token) { + opts.headerLines = atoi(token[1:]) + } else if sizeRegex.MatchString(token) { + opts.size = parseSize(token, 99, "window size") + } else if offsetRegex.MatchString(token) { + opts.scroll = token + } else { + errorExit("invalid preview window option: " + token) + } + } + } +} + +func parseMargin(opt string, margin string) [4]sizeSpec { + margins := strings.Split(margin, ",") + checked := func(str string) sizeSpec { + return parseSize(str, 49, opt) + } + switch len(margins) { + case 1: + m := checked(margins[0]) + return [4]sizeSpec{m, m, m, m} + case 2: + tb := checked(margins[0]) + rl := checked(margins[1]) + return [4]sizeSpec{tb, rl, tb, rl} + case 3: + t := checked(margins[0]) + rl := checked(margins[1]) + b := checked(margins[2]) + return [4]sizeSpec{t, rl, b, rl} + case 4: + return [4]sizeSpec{ + checked(margins[0]), checked(margins[1]), + checked(margins[2]), checked(margins[3])} + default: + errorExit("invalid " + opt + ": " + margin) + } + return defaultMargin() +} + +func parseOptions(opts *Options, allArgs []string) { + var historyMax int + if opts.History == nil { + historyMax = defaultHistoryMax + } else { + historyMax = opts.History.maxSize + } + setHistory := func(path string) { + h, e := NewHistory(path, historyMax) + if e != nil { + errorExit(e.Error()) + } + opts.History = h + } + setHistoryMax := func(max int) { + historyMax = max + if historyMax < 1 { + errorExit("history max must be a positive integer") + } + if opts.History != nil { + opts.History.maxSize = historyMax + } + } + validateJumpLabels := false + validatePointer := false + validateMarker := false + for i := 0; i < len(allArgs); i++ { + arg := allArgs[i] + switch arg { + case "-h", "--help": + help(exitOk) + case "-x", "--extended": + opts.Extended = true + case "-e", "--exact": + opts.Fuzzy = false + case "--extended-exact": + // Note that we now don't have --no-extended-exact + opts.Fuzzy = false + opts.Extended = true + case "+x", "--no-extended": + opts.Extended = false + case "+e", "--no-exact": + opts.Fuzzy = true + case "-q", "--query": + opts.Query = nextString(allArgs, &i, "query string required") + case "-f", "--filter": + filter := nextString(allArgs, &i, "query string required") + opts.Filter = &filter + case "--literal": + opts.Normalize = false + case "--no-literal": + opts.Normalize = true + case "--algo": + opts.FuzzyAlgo = parseAlgo(nextString(allArgs, &i, "algorithm required (v1|v2)")) + case "--expect": + for k, v := range parseKeyChords(nextString(allArgs, &i, "key names required"), "key names required") { + opts.Expect[k] = v + } + case "--no-expect": + opts.Expect = make(map[tui.Event]string) + case "--enabled", "--no-phony": + opts.Phony = false + case "--disabled", "--phony": + opts.Phony = true + case "--tiebreak": + opts.Criteria = parseTiebreak(nextString(allArgs, &i, "sort criterion required")) + case "--bind": + parseKeymap(opts.Keymap, nextString(allArgs, &i, "bind expression required")) + case "--color": + _, spec := optionalNextString(allArgs, &i) + if len(spec) == 0 { + opts.Theme = tui.EmptyTheme() + } else { + opts.Theme = parseTheme(opts.Theme, spec) + } + case "--toggle-sort": + parseToggleSort(opts.Keymap, nextString(allArgs, &i, "key name required")) + case "-d", "--delimiter": + opts.Delimiter = delimiterRegexp(nextString(allArgs, &i, "delimiter required")) + case "-n", "--nth": + opts.Nth = splitNth(nextString(allArgs, &i, "nth expression required")) + case "--with-nth": + opts.WithNth = splitNth(nextString(allArgs, &i, "nth expression required")) + case "-s", "--sort": + opts.Sort = optionalNumeric(allArgs, &i, 1) + case "+s", "--no-sort": + opts.Sort = 0 + case "--tac": + opts.Tac = true + case "--no-tac": + opts.Tac = false + case "-i": + opts.Case = CaseIgnore + case "+i": + opts.Case = CaseRespect + case "-m", "--multi": + opts.Multi = optionalNumeric(allArgs, &i, maxMulti) + case "+m", "--no-multi": + opts.Multi = 0 + case "--ansi": + opts.Ansi = true + case "--no-ansi": + opts.Ansi = false + case "--no-mouse": + opts.Mouse = false + case "+c", "--no-color": + opts.Theme = tui.NoColorTheme() + case "+2", "--no-256": + opts.Theme = tui.Default16 + case "--black": + opts.Black = true + case "--no-black": + opts.Black = false + case "--bold": + opts.Bold = true + case "--no-bold": + opts.Bold = false + case "--layout": + opts.Layout = parseLayout( + nextString(allArgs, &i, "layout required (default / reverse / reverse-list)")) + case "--reverse": + opts.Layout = layoutReverse + case "--no-reverse": + opts.Layout = layoutDefault + case "--cycle": + opts.Cycle = true + case "--no-cycle": + opts.Cycle = false + case "--keep-right": + opts.KeepRight = true + case "--no-keep-right": + opts.KeepRight = false + case "--hscroll": + opts.Hscroll = true + case "--no-hscroll": + opts.Hscroll = false + case "--hscroll-off": + opts.HscrollOff = nextInt(allArgs, &i, "hscroll offset required") + case "--scroll-off": + opts.ScrollOff = nextInt(allArgs, &i, "scroll offset required") + case "--filepath-word": + opts.FileWord = true + case "--no-filepath-word": + opts.FileWord = false + case "--info": + opts.InfoStyle = parseInfoStyle( + nextString(allArgs, &i, "info style required")) + case "--no-info": + opts.InfoStyle = infoHidden + case "--inline-info": + opts.InfoStyle = infoInline + case "--no-inline-info": + opts.InfoStyle = infoDefault + case "--jump-labels": + opts.JumpLabels = nextString(allArgs, &i, "label characters required") + validateJumpLabels = true + case "-1", "--select-1": + opts.Select1 = true + case "+1", "--no-select-1": + opts.Select1 = false + case "-0", "--exit-0": + opts.Exit0 = true + case "+0", "--no-exit-0": + opts.Exit0 = false + case "--read0": + opts.ReadZero = true + case "--no-read0": + opts.ReadZero = false + case "--print0": + opts.Printer = func(str string) { fmt.Print(str, "\x00") } + opts.PrintSep = "\x00" + case "--no-print0": + opts.Printer = func(str string) { fmt.Println(str) } + opts.PrintSep = "\n" + case "--print-query": + opts.PrintQuery = true + case "--no-print-query": + opts.PrintQuery = false + case "--prompt": + opts.Prompt = nextString(allArgs, &i, "prompt string required") + case "--pointer": + opts.Pointer = nextString(allArgs, &i, "pointer sign string required") + validatePointer = true + case "--marker": + opts.Marker = nextString(allArgs, &i, "selected sign string required") + validateMarker = true + case "--sync": + opts.Sync = true + case "--no-sync": + opts.Sync = false + case "--async": + opts.Sync = false + case "--no-history": + opts.History = nil + case "--history": + setHistory(nextString(allArgs, &i, "history file path required")) + case "--history-size": + setHistoryMax(nextInt(allArgs, &i, "history max size required")) + case "--no-header": + opts.Header = []string{} + case "--no-header-lines": + opts.HeaderLines = 0 + case "--header": + opts.Header = strLines(nextString(allArgs, &i, "header string required")) + case "--header-lines": + opts.HeaderLines = atoi( + nextString(allArgs, &i, "number of header lines required")) + case "--header-first": + opts.HeaderFirst = true + case "--no-header-first": + opts.HeaderFirst = false + case "--preview": + opts.Preview.command = nextString(allArgs, &i, "preview command required") + case "--no-preview": + opts.Preview.command = "" + case "--preview-window": + parsePreviewWindow(&opts.Preview, + nextString(allArgs, &i, "preview window layout required: [up|down|left|right][,SIZE[%]][,border-BORDER_OPT][,wrap][,cycle][,hidden][,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES][,default]")) + case "--height": + opts.Height = parseHeight(nextString(allArgs, &i, "height required: HEIGHT[%]")) + case "--min-height": + opts.MinHeight = nextInt(allArgs, &i, "height required: HEIGHT") + case "--no-height": + opts.Height = sizeSpec{} + case "--no-margin": + opts.Margin = defaultMargin() + case "--no-padding": + opts.Padding = defaultMargin() + case "--no-border": + opts.BorderShape = tui.BorderNone + case "--border": + hasArg, arg := optionalNextString(allArgs, &i) + opts.BorderShape = parseBorder(arg, !hasArg) + case "--no-unicode": + opts.Unicode = false + case "--unicode": + opts.Unicode = true + case "--margin": + opts.Margin = parseMargin( + "margin", + nextString(allArgs, &i, "margin required (TRBL / TB,RL / T,RL,B / T,R,B,L)")) + case "--padding": + opts.Padding = parseMargin( + "padding", + nextString(allArgs, &i, "padding required (TRBL / TB,RL / T,RL,B / T,R,B,L)")) + case "--tabstop": + opts.Tabstop = nextInt(allArgs, &i, "tab stop required") + case "--clear": + opts.ClearOnExit = true + case "--no-clear": + opts.ClearOnExit = false + case "--version": + opts.Version = true + default: + if match, value := optString(arg, "--algo="); match { + opts.FuzzyAlgo = parseAlgo(value) + } else if match, value := optString(arg, "-q", "--query="); match { + opts.Query = value + } else if match, value := optString(arg, "-f", "--filter="); match { + opts.Filter = &value + } else if match, value := optString(arg, "-d", "--delimiter="); match { + opts.Delimiter = delimiterRegexp(value) + } else if match, value := optString(arg, "--border="); match { + opts.BorderShape = parseBorder(value, false) + } else if match, value := optString(arg, "--prompt="); match { + opts.Prompt = value + } else if match, value := optString(arg, "--pointer="); match { + opts.Pointer = value + validatePointer = true + } else if match, value := optString(arg, "--marker="); match { + opts.Marker = value + validateMarker = true + } else if match, value := optString(arg, "-n", "--nth="); match { + opts.Nth = splitNth(value) + } else if match, value := optString(arg, "--with-nth="); match { + opts.WithNth = splitNth(value) + } else if match, _ := optString(arg, "-s", "--sort="); match { + opts.Sort = 1 // Don't care + } else if match, value := optString(arg, "-m", "--multi="); match { + opts.Multi = atoi(value) + } else if match, value := optString(arg, "--height="); match { + opts.Height = parseHeight(value) + } else if match, value := optString(arg, "--min-height="); match { + opts.MinHeight = atoi(value) + } else if match, value := optString(arg, "--layout="); match { + opts.Layout = parseLayout(value) + } else if match, value := optString(arg, "--info="); match { + opts.InfoStyle = parseInfoStyle(value) + } else if match, value := optString(arg, "--toggle-sort="); match { + parseToggleSort(opts.Keymap, value) + } else if match, value := optString(arg, "--expect="); match { + for k, v := range parseKeyChords(value, "key names required") { + opts.Expect[k] = v + } + } else if match, value := optString(arg, "--tiebreak="); match { + opts.Criteria = parseTiebreak(value) + } else if match, value := optString(arg, "--color="); match { + opts.Theme = parseTheme(opts.Theme, value) + } else if match, value := optString(arg, "--bind="); match { + parseKeymap(opts.Keymap, value) + } else if match, value := optString(arg, "--history="); match { + setHistory(value) + } else if match, value := optString(arg, "--history-size="); match { + setHistoryMax(atoi(value)) + } else if match, value := optString(arg, "--header="); match { + opts.Header = strLines(value) + } else if match, value := optString(arg, "--header-lines="); match { + opts.HeaderLines = atoi(value) + } else if match, value := optString(arg, "--preview="); match { + opts.Preview.command = value + } else if match, value := optString(arg, "--preview-window="); match { + parsePreviewWindow(&opts.Preview, value) + } else if match, value := optString(arg, "--margin="); match { + opts.Margin = parseMargin("margin", value) + } else if match, value := optString(arg, "--padding="); match { + opts.Padding = parseMargin("padding", value) + } else if match, value := optString(arg, "--tabstop="); match { + opts.Tabstop = atoi(value) + } else if match, value := optString(arg, "--hscroll-off="); match { + opts.HscrollOff = atoi(value) + } else if match, value := optString(arg, "--scroll-off="); match { + opts.ScrollOff = atoi(value) + } else if match, value := optString(arg, "--jump-labels="); match { + opts.JumpLabels = value + validateJumpLabels = true + } else { + errorExit("unknown option: " + arg) + } + } + } + + if opts.HeaderLines < 0 { + errorExit("header lines must be a non-negative integer") + } + + if opts.HscrollOff < 0 { + errorExit("hscroll offset must be a non-negative integer") + } + + if opts.ScrollOff < 0 { + errorExit("scroll offset must be a non-negative integer") + } + + if opts.Tabstop < 1 { + errorExit("tab stop must be a positive integer") + } + + if len(opts.JumpLabels) == 0 { + errorExit("empty jump labels") + } + + if validateJumpLabels { + for _, r := range opts.JumpLabels { + if r < 32 || r > 126 { + errorExit("non-ascii jump labels are not allowed") + } + } + } + + if validatePointer { + if err := validateSign(opts.Pointer, "pointer"); err != nil { + errorExit(err.Error()) + } + } + + if validateMarker { + if err := validateSign(opts.Marker, "marker"); err != nil { + errorExit(err.Error()) + } + } +} + +func validateSign(sign string, signOptName string) error { + if sign == "" { + return fmt.Errorf("%v cannot be empty", signOptName) + } + for _, r := range sign { + if !unicode.IsGraphic(r) { + return fmt.Errorf("invalid character in %v", signOptName) + } + } + if runewidth.StringWidth(sign) > 2 { + return fmt.Errorf("%v display width should be up to 2", signOptName) + } + return nil +} + +func postProcessOptions(opts *Options) { + if !opts.Version && !tui.IsLightRendererSupported() && opts.Height.size > 0 { + errorExit("--height option is currently not supported on this platform") + } + // Default actions for CTRL-N / CTRL-P when --history is set + if opts.History != nil { + if _, prs := opts.Keymap[tui.CtrlP.AsEvent()]; !prs { + opts.Keymap[tui.CtrlP.AsEvent()] = toActions(actPreviousHistory) + } + if _, prs := opts.Keymap[tui.CtrlN.AsEvent()]; !prs { + opts.Keymap[tui.CtrlN.AsEvent()] = toActions(actNextHistory) + } + } + + // Extend the default key map + keymap := defaultKeymap() + for key, actions := range opts.Keymap { + for _, act := range actions { + if act.t == actToggleSort { + opts.ToggleSort = true + } + } + keymap[key] = actions + } + opts.Keymap = keymap + + // If we're not using extended search mode, --nth option becomes irrelevant + // if it contains the whole range + if !opts.Extended || len(opts.Nth) == 1 { + for _, r := range opts.Nth { + if r.begin == rangeEllipsis && r.end == rangeEllipsis { + opts.Nth = make([]Range, 0) + return + } + } + } + + if opts.Bold { + theme := opts.Theme + boldify := func(c tui.ColorAttr) tui.ColorAttr { + dup := c + if !theme.Colored { + dup.Attr |= tui.Bold + } else if (c.Attr & tui.AttrRegular) == 0 { + dup.Attr |= tui.Bold + } + return dup + } + theme.Current = boldify(theme.Current) + theme.CurrentMatch = boldify(theme.CurrentMatch) + theme.Prompt = boldify(theme.Prompt) + theme.Input = boldify(theme.Input) + theme.Cursor = boldify(theme.Cursor) + theme.Spinner = boldify(theme.Spinner) + } +} + +// ParseOptions parses command-line options +func ParseOptions() *Options { + opts := defaultOptions() + + // Options from Env var + words, _ := shellwords.Parse(os.Getenv("FZF_DEFAULT_OPTS")) + if len(words) > 0 { + parseOptions(opts, words) + } + + // Options from command-line arguments + parseOptions(opts, os.Args[1:]) + + postProcessOptions(opts) + return opts +} diff --git a/.fzf/src/options_test.go b/.fzf/src/options_test.go new file mode 100644 index 0000000..bb94623 --- /dev/null +++ b/.fzf/src/options_test.go @@ -0,0 +1,457 @@ +package fzf + +import ( + "fmt" + "io/ioutil" + "testing" + + "github.com/junegunn/fzf/src/tui" +) + +func TestDelimiterRegex(t *testing.T) { + // Valid regex + delim := delimiterRegexp(".") + if delim.regex == nil || delim.str != nil { + t.Error(delim) + } + // Broken regex -> string + delim = delimiterRegexp("[0-9") + if delim.regex != nil || *delim.str != "[0-9" { + t.Error(delim) + } + // Valid regex + delim = delimiterRegexp("[0-9]") + if delim.regex.String() != "[0-9]" || delim.str != nil { + t.Error(delim) + } + // Tab character + delim = delimiterRegexp("\t") + if delim.regex != nil || *delim.str != "\t" { + t.Error(delim) + } + // Tab expression + delim = delimiterRegexp("\\t") + if delim.regex != nil || *delim.str != "\t" { + t.Error(delim) + } + // Tabs -> regex + delim = delimiterRegexp("\t+") + if delim.regex == nil || delim.str != nil { + t.Error(delim) + } +} + +func TestDelimiterRegexString(t *testing.T) { + delim := delimiterRegexp("*") + tokens := Tokenize("-*--*---**---", delim) + if delim.regex != nil || + tokens[0].text.ToString() != "-*" || + tokens[1].text.ToString() != "--*" || + tokens[2].text.ToString() != "---*" || + tokens[3].text.ToString() != "*" || + tokens[4].text.ToString() != "---" { + t.Errorf("%s %v %d", delim, tokens, len(tokens)) + } +} + +func TestDelimiterRegexRegex(t *testing.T) { + delim := delimiterRegexp("--\\*") + tokens := Tokenize("-*--*---**---", delim) + if delim.str != nil || + tokens[0].text.ToString() != "-*--*" || + tokens[1].text.ToString() != "---*" || + tokens[2].text.ToString() != "*---" { + t.Errorf("%s %d", tokens, len(tokens)) + } +} + +func TestSplitNth(t *testing.T) { + { + ranges := splitNth("..") + if len(ranges) != 1 || + ranges[0].begin != rangeEllipsis || + ranges[0].end != rangeEllipsis { + t.Errorf("%v", ranges) + } + } + { + ranges := splitNth("..3,1..,2..3,4..-1,-3..-2,..,2,-2,2..-2,1..-1") + if len(ranges) != 10 || + ranges[0].begin != rangeEllipsis || ranges[0].end != 3 || + ranges[1].begin != rangeEllipsis || ranges[1].end != rangeEllipsis || + ranges[2].begin != 2 || ranges[2].end != 3 || + ranges[3].begin != 4 || ranges[3].end != rangeEllipsis || + ranges[4].begin != -3 || ranges[4].end != -2 || + ranges[5].begin != rangeEllipsis || ranges[5].end != rangeEllipsis || + ranges[6].begin != 2 || ranges[6].end != 2 || + ranges[7].begin != -2 || ranges[7].end != -2 || + ranges[8].begin != 2 || ranges[8].end != -2 || + ranges[9].begin != rangeEllipsis || ranges[9].end != rangeEllipsis { + t.Errorf("%v", ranges) + } + } +} + +func TestIrrelevantNth(t *testing.T) { + { + opts := defaultOptions() + words := []string{"--nth", "..", "-x"} + parseOptions(opts, words) + postProcessOptions(opts) + if len(opts.Nth) != 0 { + t.Errorf("nth should be empty: %v", opts.Nth) + } + } + for _, words := range [][]string{{"--nth", "..,3", "+x"}, {"--nth", "3,1..", "+x"}, {"--nth", "..-1,1", "+x"}} { + { + opts := defaultOptions() + parseOptions(opts, words) + postProcessOptions(opts) + if len(opts.Nth) != 0 { + t.Errorf("nth should be empty: %v", opts.Nth) + } + } + { + opts := defaultOptions() + words = append(words, "-x") + parseOptions(opts, words) + postProcessOptions(opts) + if len(opts.Nth) != 2 { + t.Errorf("nth should not be empty: %v", opts.Nth) + } + } + } +} + +func TestParseKeys(t *testing.T) { + pairs := parseKeyChords("ctrl-z,alt-z,f2,@,Alt-a,!,ctrl-G,J,g,ctrl-alt-a,ALT-enter,alt-SPACE", "") + checkEvent := func(e tui.Event, s string) { + if pairs[e] != s { + t.Errorf("%s != %s", pairs[e], s) + } + } + check := func(et tui.EventType, s string) { + checkEvent(et.AsEvent(), s) + } + if len(pairs) != 12 { + t.Error(12) + } + check(tui.CtrlZ, "ctrl-z") + check(tui.F2, "f2") + check(tui.CtrlG, "ctrl-G") + checkEvent(tui.AltKey('z'), "alt-z") + checkEvent(tui.Key('@'), "@") + checkEvent(tui.AltKey('a'), "Alt-a") + checkEvent(tui.Key('!'), "!") + checkEvent(tui.Key('J'), "J") + checkEvent(tui.Key('g'), "g") + checkEvent(tui.CtrlAltKey('a'), "ctrl-alt-a") + checkEvent(tui.CtrlAltKey('m'), "ALT-enter") + checkEvent(tui.AltKey(' '), "alt-SPACE") + + // Synonyms + pairs = parseKeyChords("enter,Return,space,tab,btab,esc,up,down,left,right", "") + if len(pairs) != 9 { + t.Error(9) + } + check(tui.CtrlM, "Return") + checkEvent(tui.Key(' '), "space") + check(tui.Tab, "tab") + check(tui.BTab, "btab") + check(tui.ESC, "esc") + check(tui.Up, "up") + check(tui.Down, "down") + check(tui.Left, "left") + check(tui.Right, "right") + + pairs = parseKeyChords("Tab,Ctrl-I,PgUp,page-up,pgdn,Page-Down,Home,End,Alt-BS,Alt-BSpace,shift-left,shift-right,btab,shift-tab,return,Enter,bspace", "") + if len(pairs) != 11 { + t.Error(11) + } + check(tui.Tab, "Ctrl-I") + check(tui.PgUp, "page-up") + check(tui.PgDn, "Page-Down") + check(tui.Home, "Home") + check(tui.End, "End") + check(tui.AltBS, "Alt-BSpace") + check(tui.SLeft, "shift-left") + check(tui.SRight, "shift-right") + check(tui.BTab, "shift-tab") + check(tui.CtrlM, "Enter") + check(tui.BSpace, "bspace") +} + +func TestParseKeysWithComma(t *testing.T) { + checkN := func(a int, b int) { + if a != b { + t.Errorf("%d != %d", a, b) + } + } + check := func(pairs map[tui.Event]string, e tui.Event, s string) { + if pairs[e] != s { + t.Errorf("%s != %s", pairs[e], s) + } + } + + pairs := parseKeyChords(",", "") + checkN(len(pairs), 1) + check(pairs, tui.Key(','), ",") + + pairs = parseKeyChords(",,a,b", "") + checkN(len(pairs), 3) + check(pairs, tui.Key('a'), "a") + check(pairs, tui.Key('b'), "b") + check(pairs, tui.Key(','), ",") + + pairs = parseKeyChords("a,b,,", "") + checkN(len(pairs), 3) + check(pairs, tui.Key('a'), "a") + check(pairs, tui.Key('b'), "b") + check(pairs, tui.Key(','), ",") + + pairs = parseKeyChords("a,,,b", "") + checkN(len(pairs), 3) + check(pairs, tui.Key('a'), "a") + check(pairs, tui.Key('b'), "b") + check(pairs, tui.Key(','), ",") + + pairs = parseKeyChords("a,,,b,c", "") + checkN(len(pairs), 4) + check(pairs, tui.Key('a'), "a") + check(pairs, tui.Key('b'), "b") + check(pairs, tui.Key('c'), "c") + check(pairs, tui.Key(','), ",") + + pairs = parseKeyChords(",,,", "") + checkN(len(pairs), 1) + check(pairs, tui.Key(','), ",") + + pairs = parseKeyChords(",ALT-,,", "") + checkN(len(pairs), 1) + check(pairs, tui.AltKey(','), "ALT-,") +} + +func TestBind(t *testing.T) { + keymap := defaultKeymap() + check := func(event tui.Event, arg1 string, types ...actionType) { + if len(keymap[event]) != len(types) { + t.Errorf("invalid number of actions for %v (%d != %d)", + event, len(types), len(keymap[event])) + return + } + for idx, action := range keymap[event] { + if types[idx] != action.t { + t.Errorf("invalid action type (%d != %d)", types[idx], action.t) + } + } + if len(arg1) > 0 && keymap[event][0].a != arg1 { + t.Errorf("invalid action argument: (%s != %s)", arg1, keymap[event][0].a) + } + } + check(tui.CtrlA.AsEvent(), "", actBeginningOfLine) + parseKeymap(keymap, + "ctrl-a:kill-line,ctrl-b:toggle-sort+up+down,c:page-up,alt-z:page-down,"+ + "f1:execute(ls {+})+abort+execute(echo {+})+select-all,f2:execute/echo {}, {}, {}/,f3:execute[echo '({})'],f4:execute;less {};,"+ + "alt-a:execute-Multi@echo (,),[,],/,:,;,%,{}@,alt-b:execute;echo (,),[,],/,:,@,%,{};,"+ + "x:Execute(foo+bar),X:execute/bar+baz/"+ + ",f1:+first,f1:+top"+ + ",,:abort,::accept,+:execute:++\nfoobar,Y:execute(baz)+up") + check(tui.CtrlA.AsEvent(), "", actKillLine) + check(tui.CtrlB.AsEvent(), "", actToggleSort, actUp, actDown) + check(tui.Key('c'), "", actPageUp) + check(tui.Key(','), "", actAbort) + check(tui.Key(':'), "", actAccept) + check(tui.AltKey('z'), "", actPageDown) + check(tui.F1.AsEvent(), "ls {+}", actExecute, actAbort, actExecute, actSelectAll, actFirst, actFirst) + check(tui.F2.AsEvent(), "echo {}, {}, {}", actExecute) + check(tui.F3.AsEvent(), "echo '({})'", actExecute) + check(tui.F4.AsEvent(), "less {}", actExecute) + check(tui.Key('x'), "foo+bar", actExecute) + check(tui.Key('X'), "bar+baz", actExecute) + check(tui.AltKey('a'), "echo (,),[,],/,:,;,%,{}", actExecuteMulti) + check(tui.AltKey('b'), "echo (,),[,],/,:,@,%,{}", actExecute) + check(tui.Key('+'), "++\nfoobar,Y:execute(baz)+up", actExecute) + + for idx, char := range []rune{'~', '!', '@', '#', '$', '%', '^', '&', '*', '|', ';', '/'} { + parseKeymap(keymap, fmt.Sprintf("%d:execute%cfoobar%c", idx%10, char, char)) + check(tui.Key([]rune(fmt.Sprintf("%d", idx%10))[0]), "foobar", actExecute) + } + + parseKeymap(keymap, "f1:abort") + check(tui.F1.AsEvent(), "", actAbort) +} + +func TestColorSpec(t *testing.T) { + theme := tui.Dark256 + dark := parseTheme(theme, "dark") + if *dark != *theme { + t.Errorf("colors should be equivalent") + } + if dark == theme { + t.Errorf("point should not be equivalent") + } + + light := parseTheme(theme, "dark,light") + if *light == *theme { + t.Errorf("should not be equivalent") + } + if *light != *tui.Light256 { + t.Errorf("colors should be equivalent") + } + if light == theme { + t.Errorf("point should not be equivalent") + } + + customized := parseTheme(theme, "fg:231,bg:232") + if customized.Fg.Color != 231 || customized.Bg.Color != 232 { + t.Errorf("color not customized") + } + if *tui.Dark256 == *customized { + t.Errorf("colors should not be equivalent") + } + customized.Fg = tui.Dark256.Fg + customized.Bg = tui.Dark256.Bg + if *tui.Dark256 != *customized { + t.Errorf("colors should now be equivalent: %v, %v", tui.Dark256, customized) + } + + customized = parseTheme(theme, "fg:231,dark,bg:232") + if customized.Fg != tui.Dark256.Fg || customized.Bg == tui.Dark256.Bg { + t.Errorf("color not customized") + } +} + +func TestDefaultCtrlNP(t *testing.T) { + check := func(words []string, et tui.EventType, expected actionType) { + e := et.AsEvent() + opts := defaultOptions() + parseOptions(opts, words) + postProcessOptions(opts) + if opts.Keymap[e][0].t != expected { + t.Error() + } + } + check([]string{}, tui.CtrlN, actDown) + check([]string{}, tui.CtrlP, actUp) + + check([]string{"--bind=ctrl-n:accept"}, tui.CtrlN, actAccept) + check([]string{"--bind=ctrl-p:accept"}, tui.CtrlP, actAccept) + + f, _ := ioutil.TempFile("", "fzf-history") + f.Close() + hist := "--history=" + f.Name() + check([]string{hist}, tui.CtrlN, actNextHistory) + check([]string{hist}, tui.CtrlP, actPreviousHistory) + + check([]string{hist, "--bind=ctrl-n:accept"}, tui.CtrlN, actAccept) + check([]string{hist, "--bind=ctrl-n:accept"}, tui.CtrlP, actPreviousHistory) + + check([]string{hist, "--bind=ctrl-p:accept"}, tui.CtrlN, actNextHistory) + check([]string{hist, "--bind=ctrl-p:accept"}, tui.CtrlP, actAccept) +} + +func optsFor(words ...string) *Options { + opts := defaultOptions() + parseOptions(opts, words) + postProcessOptions(opts) + return opts +} + +func TestToggle(t *testing.T) { + opts := optsFor() + if opts.ToggleSort { + t.Error() + } + + opts = optsFor("--bind=a:toggle-sort") + if !opts.ToggleSort { + t.Error() + } + + opts = optsFor("--bind=a:toggle-sort", "--bind=a:up") + if opts.ToggleSort { + t.Error() + } +} + +func TestPreviewOpts(t *testing.T) { + opts := optsFor() + if !(opts.Preview.command == "" && + opts.Preview.hidden == false && + opts.Preview.wrap == false && + opts.Preview.position == posRight && + opts.Preview.size.percent == true && + opts.Preview.size.size == 50) { + t.Error() + } + opts = optsFor("--preview", "cat {}", "--preview-window=left:15,hidden,wrap:+{1}-/2") + if !(opts.Preview.command == "cat {}" && + opts.Preview.hidden == true && + opts.Preview.wrap == true && + opts.Preview.position == posLeft && + opts.Preview.scroll == "+{1}-/2" && + opts.Preview.size.percent == false && + opts.Preview.size.size == 15) { + t.Error(opts.Preview) + } + opts = optsFor("--preview-window=up,15,wrap,hidden,+{1}+3-1-2/2", "--preview-window=down", "--preview-window=cycle") + if !(opts.Preview.command == "" && + opts.Preview.hidden == true && + opts.Preview.wrap == true && + opts.Preview.cycle == true && + opts.Preview.position == posDown && + opts.Preview.scroll == "+{1}+3-1-2/2" && + opts.Preview.size.percent == false && + opts.Preview.size.size == 15) { + t.Error(opts.Preview.size.size) + } + opts = optsFor("--preview-window=up:15:wrap:hidden") + if !(opts.Preview.command == "" && + opts.Preview.hidden == true && + opts.Preview.wrap == true && + opts.Preview.position == posUp && + opts.Preview.size.percent == false && + opts.Preview.size.size == 15) { + t.Error(opts.Preview) + } + opts = optsFor("--preview=foo", "--preview-window=up", "--preview-window=default:70%") + if !(opts.Preview.command == "foo" && + opts.Preview.position == posRight && + opts.Preview.size.percent == true && + opts.Preview.size.size == 70) { + t.Error(opts.Preview) + } +} + +func TestAdditiveExpect(t *testing.T) { + opts := optsFor("--expect=a", "--expect", "b", "--expect=c") + if len(opts.Expect) != 3 { + t.Error(opts.Expect) + } +} + +func TestValidateSign(t *testing.T) { + testCases := []struct { + inputSign string + isValid bool + }{ + {"> ", true}, + {"아", true}, + {"😀", true}, + {"", false}, + {">>>", false}, + {"\n", false}, + {"\t", false}, + } + + for _, testCase := range testCases { + err := validateSign(testCase.inputSign, "") + if testCase.isValid && err != nil { + t.Errorf("Input sign `%s` caused error", testCase.inputSign) + } + + if !testCase.isValid && err == nil { + t.Errorf("Input sign `%s` did not cause error", testCase.inputSign) + } + } +} diff --git a/.fzf/src/pattern.go b/.fzf/src/pattern.go new file mode 100644 index 0000000..4a7a87a --- /dev/null +++ b/.fzf/src/pattern.go @@ -0,0 +1,425 @@ +package fzf + +import ( + "fmt" + "regexp" + "strings" + + "github.com/junegunn/fzf/src/algo" + "github.com/junegunn/fzf/src/util" +) + +// fuzzy +// 'exact +// ^prefix-exact +// suffix-exact$ +// !inverse-exact +// !'inverse-fuzzy +// !^inverse-prefix-exact +// !inverse-suffix-exact$ + +type termType int + +const ( + termFuzzy termType = iota + termExact + termPrefix + termSuffix + termEqual +) + +type term struct { + typ termType + inv bool + text []rune + caseSensitive bool + normalize bool +} + +// String returns the string representation of a term. +func (t term) String() string { + return fmt.Sprintf("term{typ: %d, inv: %v, text: []rune(%q), caseSensitive: %v}", t.typ, t.inv, string(t.text), t.caseSensitive) +} + +type termSet []term + +// Pattern represents search pattern +type Pattern struct { + fuzzy bool + fuzzyAlgo algo.Algo + extended bool + caseSensitive bool + normalize bool + forward bool + text []rune + termSets []termSet + sortable bool + cacheable bool + cacheKey string + delimiter Delimiter + nth []Range + procFun map[termType]algo.Algo +} + +var ( + _patternCache map[string]*Pattern + _splitRegex *regexp.Regexp + _cache ChunkCache +) + +func init() { + _splitRegex = regexp.MustCompile(" +") + clearPatternCache() + clearChunkCache() +} + +func clearPatternCache() { + // We can uniquely identify the pattern for a given string since + // search mode and caseMode do not change while the program is running + _patternCache = make(map[string]*Pattern) +} + +func clearChunkCache() { + _cache = NewChunkCache() +} + +// BuildPattern builds Pattern object from the given arguments +func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case, normalize bool, forward bool, + cacheable bool, nth []Range, delimiter Delimiter, runes []rune) *Pattern { + + var asString string + if extended { + asString = strings.TrimLeft(string(runes), " ") + for strings.HasSuffix(asString, " ") && !strings.HasSuffix(asString, "\\ ") { + asString = asString[:len(asString)-1] + } + } else { + asString = string(runes) + } + + cached, found := _patternCache[asString] + if found { + return cached + } + + caseSensitive := true + sortable := true + termSets := []termSet{} + + if extended { + termSets = parseTerms(fuzzy, caseMode, normalize, asString) + // We should not sort the result if there are only inverse search terms + sortable = false + Loop: + for _, termSet := range termSets { + for idx, term := range termSet { + if !term.inv { + sortable = true + } + // If the query contains inverse search terms or OR operators, + // we cannot cache the search scope + if !cacheable || idx > 0 || term.inv || fuzzy && term.typ != termFuzzy || !fuzzy && term.typ != termExact { + cacheable = false + if sortable { + // Can't break until we see at least one non-inverse term + break Loop + } + } + } + } + } else { + lowerString := strings.ToLower(asString) + normalize = normalize && + lowerString == string(algo.NormalizeRunes([]rune(lowerString))) + caseSensitive = caseMode == CaseRespect || + caseMode == CaseSmart && lowerString != asString + if !caseSensitive { + asString = lowerString + } + } + + ptr := &Pattern{ + fuzzy: fuzzy, + fuzzyAlgo: fuzzyAlgo, + extended: extended, + caseSensitive: caseSensitive, + normalize: normalize, + forward: forward, + text: []rune(asString), + termSets: termSets, + sortable: sortable, + cacheable: cacheable, + nth: nth, + delimiter: delimiter, + procFun: make(map[termType]algo.Algo)} + + ptr.cacheKey = ptr.buildCacheKey() + ptr.procFun[termFuzzy] = fuzzyAlgo + ptr.procFun[termEqual] = algo.EqualMatch + ptr.procFun[termExact] = algo.ExactMatchNaive + ptr.procFun[termPrefix] = algo.PrefixMatch + ptr.procFun[termSuffix] = algo.SuffixMatch + + _patternCache[asString] = ptr + return ptr +} + +func parseTerms(fuzzy bool, caseMode Case, normalize bool, str string) []termSet { + str = strings.Replace(str, "\\ ", "\t", -1) + tokens := _splitRegex.Split(str, -1) + sets := []termSet{} + set := termSet{} + switchSet := false + afterBar := false + for _, token := range tokens { + typ, inv, text := termFuzzy, false, strings.Replace(token, "\t", " ", -1) + lowerText := strings.ToLower(text) + caseSensitive := caseMode == CaseRespect || + caseMode == CaseSmart && text != lowerText + normalizeTerm := normalize && + lowerText == string(algo.NormalizeRunes([]rune(lowerText))) + if !caseSensitive { + text = lowerText + } + if !fuzzy { + typ = termExact + } + + if len(set) > 0 && !afterBar && text == "|" { + switchSet = false + afterBar = true + continue + } + afterBar = false + + if strings.HasPrefix(text, "!") { + inv = true + typ = termExact + text = text[1:] + } + + if text != "$" && strings.HasSuffix(text, "$") { + typ = termSuffix + text = text[:len(text)-1] + } + + if strings.HasPrefix(text, "'") { + // Flip exactness + if fuzzy && !inv { + typ = termExact + text = text[1:] + } else { + typ = termFuzzy + text = text[1:] + } + } else if strings.HasPrefix(text, "^") { + if typ == termSuffix { + typ = termEqual + } else { + typ = termPrefix + } + text = text[1:] + } + + if len(text) > 0 { + if switchSet { + sets = append(sets, set) + set = termSet{} + } + textRunes := []rune(text) + if normalizeTerm { + textRunes = algo.NormalizeRunes(textRunes) + } + set = append(set, term{ + typ: typ, + inv: inv, + text: textRunes, + caseSensitive: caseSensitive, + normalize: normalizeTerm}) + switchSet = true + } + } + if len(set) > 0 { + sets = append(sets, set) + } + return sets +} + +// IsEmpty returns true if the pattern is effectively empty +func (p *Pattern) IsEmpty() bool { + if !p.extended { + return len(p.text) == 0 + } + return len(p.termSets) == 0 +} + +// AsString returns the search query in string type +func (p *Pattern) AsString() string { + return string(p.text) +} + +func (p *Pattern) buildCacheKey() string { + if !p.extended { + return p.AsString() + } + cacheableTerms := []string{} + for _, termSet := range p.termSets { + if len(termSet) == 1 && !termSet[0].inv && (p.fuzzy || termSet[0].typ == termExact) { + cacheableTerms = append(cacheableTerms, string(termSet[0].text)) + } + } + return strings.Join(cacheableTerms, "\t") +} + +// CacheKey is used to build string to be used as the key of result cache +func (p *Pattern) CacheKey() string { + return p.cacheKey +} + +// Match returns the list of matches Items in the given Chunk +func (p *Pattern) Match(chunk *Chunk, slab *util.Slab) []Result { + // ChunkCache: Exact match + cacheKey := p.CacheKey() + if p.cacheable { + if cached := _cache.Lookup(chunk, cacheKey); cached != nil { + return cached + } + } + + // Prefix/suffix cache + space := _cache.Search(chunk, cacheKey) + + matches := p.matchChunk(chunk, space, slab) + + if p.cacheable { + _cache.Add(chunk, cacheKey, matches) + } + return matches +} + +func (p *Pattern) matchChunk(chunk *Chunk, space []Result, slab *util.Slab) []Result { + matches := []Result{} + + if space == nil { + for idx := 0; idx < chunk.count; idx++ { + if match, _, _ := p.MatchItem(&chunk.items[idx], false, slab); match != nil { + matches = append(matches, *match) + } + } + } else { + for _, result := range space { + if match, _, _ := p.MatchItem(result.item, false, slab); match != nil { + matches = append(matches, *match) + } + } + } + return matches +} + +// MatchItem returns true if the Item is a match +func (p *Pattern) MatchItem(item *Item, withPos bool, slab *util.Slab) (*Result, []Offset, *[]int) { + if p.extended { + if offsets, bonus, pos := p.extendedMatch(item, withPos, slab); len(offsets) == len(p.termSets) { + result := buildResult(item, offsets, bonus) + return &result, offsets, pos + } + return nil, nil, nil + } + offset, bonus, pos := p.basicMatch(item, withPos, slab) + if sidx := offset[0]; sidx >= 0 { + offsets := []Offset{offset} + result := buildResult(item, offsets, bonus) + return &result, offsets, pos + } + return nil, nil, nil +} + +func (p *Pattern) basicMatch(item *Item, withPos bool, slab *util.Slab) (Offset, int, *[]int) { + var input []Token + if len(p.nth) == 0 { + input = []Token{{text: &item.text, prefixLength: 0}} + } else { + input = p.transformInput(item) + } + if p.fuzzy { + return p.iter(p.fuzzyAlgo, input, p.caseSensitive, p.normalize, p.forward, p.text, withPos, slab) + } + return p.iter(algo.ExactMatchNaive, input, p.caseSensitive, p.normalize, p.forward, p.text, withPos, slab) +} + +func (p *Pattern) extendedMatch(item *Item, withPos bool, slab *util.Slab) ([]Offset, int, *[]int) { + var input []Token + if len(p.nth) == 0 { + input = []Token{{text: &item.text, prefixLength: 0}} + } else { + input = p.transformInput(item) + } + offsets := []Offset{} + var totalScore int + var allPos *[]int + if withPos { + allPos = &[]int{} + } + for _, termSet := range p.termSets { + var offset Offset + var currentScore int + matched := false + for _, term := range termSet { + pfun := p.procFun[term.typ] + off, score, pos := p.iter(pfun, input, term.caseSensitive, term.normalize, p.forward, term.text, withPos, slab) + if sidx := off[0]; sidx >= 0 { + if term.inv { + continue + } + offset, currentScore = off, score + matched = true + if withPos { + if pos != nil { + *allPos = append(*allPos, *pos...) + } else { + for idx := off[0]; idx < off[1]; idx++ { + *allPos = append(*allPos, int(idx)) + } + } + } + break + } else if term.inv { + offset, currentScore = Offset{0, 0}, 0 + matched = true + continue + } + } + if matched { + offsets = append(offsets, offset) + totalScore += currentScore + } + } + return offsets, totalScore, allPos +} + +func (p *Pattern) transformInput(item *Item) []Token { + if item.transformed != nil { + return *item.transformed + } + + tokens := Tokenize(item.text.ToString(), p.delimiter) + ret := Transform(tokens, p.nth) + item.transformed = &ret + return ret +} + +func (p *Pattern) iter(pfun algo.Algo, tokens []Token, caseSensitive bool, normalize bool, forward bool, pattern []rune, withPos bool, slab *util.Slab) (Offset, int, *[]int) { + for _, part := range tokens { + if res, pos := pfun(caseSensitive, normalize, forward, part.text, pattern, withPos, slab); res.Start >= 0 { + sidx := int32(res.Start) + part.prefixLength + eidx := int32(res.End) + part.prefixLength + if pos != nil { + for idx := range *pos { + (*pos)[idx] += int(part.prefixLength) + } + } + return Offset{sidx, eidx}, res.Score, pos + } + } + return Offset{-1, -1}, 0, nil +} diff --git a/.fzf/src/pattern_test.go b/.fzf/src/pattern_test.go new file mode 100644 index 0000000..b95d151 --- /dev/null +++ b/.fzf/src/pattern_test.go @@ -0,0 +1,209 @@ +package fzf + +import ( + "reflect" + "testing" + + "github.com/junegunn/fzf/src/algo" + "github.com/junegunn/fzf/src/util" +) + +var slab *util.Slab + +func init() { + slab = util.MakeSlab(slab16Size, slab32Size) +} + +func TestParseTermsExtended(t *testing.T) { + terms := parseTerms(true, CaseSmart, false, + "aaa 'bbb ^ccc ddd$ !eee !'fff !^ggg !hhh$ | ^iii$ ^xxx | 'yyy | zzz$ | !ZZZ |") + if len(terms) != 9 || + terms[0][0].typ != termFuzzy || terms[0][0].inv || + terms[1][0].typ != termExact || terms[1][0].inv || + terms[2][0].typ != termPrefix || terms[2][0].inv || + terms[3][0].typ != termSuffix || terms[3][0].inv || + terms[4][0].typ != termExact || !terms[4][0].inv || + terms[5][0].typ != termFuzzy || !terms[5][0].inv || + terms[6][0].typ != termPrefix || !terms[6][0].inv || + terms[7][0].typ != termSuffix || !terms[7][0].inv || + terms[7][1].typ != termEqual || terms[7][1].inv || + terms[8][0].typ != termPrefix || terms[8][0].inv || + terms[8][1].typ != termExact || terms[8][1].inv || + terms[8][2].typ != termSuffix || terms[8][2].inv || + terms[8][3].typ != termExact || !terms[8][3].inv { + t.Errorf("%v", terms) + } + for _, termSet := range terms[:8] { + term := termSet[0] + if len(term.text) != 3 { + t.Errorf("%v", term) + } + } +} + +func TestParseTermsExtendedExact(t *testing.T) { + terms := parseTerms(false, CaseSmart, false, + "aaa 'bbb ^ccc ddd$ !eee !'fff !^ggg !hhh$") + if len(terms) != 8 || + terms[0][0].typ != termExact || terms[0][0].inv || len(terms[0][0].text) != 3 || + terms[1][0].typ != termFuzzy || terms[1][0].inv || len(terms[1][0].text) != 3 || + terms[2][0].typ != termPrefix || terms[2][0].inv || len(terms[2][0].text) != 3 || + terms[3][0].typ != termSuffix || terms[3][0].inv || len(terms[3][0].text) != 3 || + terms[4][0].typ != termExact || !terms[4][0].inv || len(terms[4][0].text) != 3 || + terms[5][0].typ != termFuzzy || !terms[5][0].inv || len(terms[5][0].text) != 3 || + terms[6][0].typ != termPrefix || !terms[6][0].inv || len(terms[6][0].text) != 3 || + terms[7][0].typ != termSuffix || !terms[7][0].inv || len(terms[7][0].text) != 3 { + t.Errorf("%v", terms) + } +} + +func TestParseTermsEmpty(t *testing.T) { + terms := parseTerms(true, CaseSmart, false, "' ^ !' !^") + if len(terms) != 0 { + t.Errorf("%v", terms) + } +} + +func TestExact(t *testing.T) { + defer clearPatternCache() + clearPatternCache() + pattern := BuildPattern(true, algo.FuzzyMatchV2, true, CaseSmart, false, true, true, + []Range{}, Delimiter{}, []rune("'abc")) + chars := util.ToChars([]byte("aabbcc abc")) + res, pos := algo.ExactMatchNaive( + pattern.caseSensitive, pattern.normalize, pattern.forward, &chars, pattern.termSets[0][0].text, true, nil) + if res.Start != 7 || res.End != 10 { + t.Errorf("%v / %d / %d", pattern.termSets, res.Start, res.End) + } + if pos != nil { + t.Errorf("pos is expected to be nil") + } +} + +func TestEqual(t *testing.T) { + defer clearPatternCache() + clearPatternCache() + pattern := BuildPattern(true, algo.FuzzyMatchV2, true, CaseSmart, false, true, true, []Range{}, Delimiter{}, []rune("^AbC$")) + + match := func(str string, sidxExpected int, eidxExpected int) { + chars := util.ToChars([]byte(str)) + res, pos := algo.EqualMatch( + pattern.caseSensitive, pattern.normalize, pattern.forward, &chars, pattern.termSets[0][0].text, true, nil) + if res.Start != sidxExpected || res.End != eidxExpected { + t.Errorf("%v / %d / %d", pattern.termSets, res.Start, res.End) + } + if pos != nil { + t.Errorf("pos is expected to be nil") + } + } + match("ABC", -1, -1) + match("AbC", 0, 3) + match("AbC ", 0, 3) + match(" AbC ", 1, 4) + match(" AbC", 2, 5) +} + +func TestCaseSensitivity(t *testing.T) { + defer clearPatternCache() + clearPatternCache() + pat1 := BuildPattern(true, algo.FuzzyMatchV2, false, CaseSmart, false, true, true, []Range{}, Delimiter{}, []rune("abc")) + clearPatternCache() + pat2 := BuildPattern(true, algo.FuzzyMatchV2, false, CaseSmart, false, true, true, []Range{}, Delimiter{}, []rune("Abc")) + clearPatternCache() + pat3 := BuildPattern(true, algo.FuzzyMatchV2, false, CaseIgnore, false, true, true, []Range{}, Delimiter{}, []rune("abc")) + clearPatternCache() + pat4 := BuildPattern(true, algo.FuzzyMatchV2, false, CaseIgnore, false, true, true, []Range{}, Delimiter{}, []rune("Abc")) + clearPatternCache() + pat5 := BuildPattern(true, algo.FuzzyMatchV2, false, CaseRespect, false, true, true, []Range{}, Delimiter{}, []rune("abc")) + clearPatternCache() + pat6 := BuildPattern(true, algo.FuzzyMatchV2, false, CaseRespect, false, true, true, []Range{}, Delimiter{}, []rune("Abc")) + + if string(pat1.text) != "abc" || pat1.caseSensitive != false || + string(pat2.text) != "Abc" || pat2.caseSensitive != true || + string(pat3.text) != "abc" || pat3.caseSensitive != false || + string(pat4.text) != "abc" || pat4.caseSensitive != false || + string(pat5.text) != "abc" || pat5.caseSensitive != true || + string(pat6.text) != "Abc" || pat6.caseSensitive != true { + t.Error("Invalid case conversion") + } +} + +func TestOrigTextAndTransformed(t *testing.T) { + pattern := BuildPattern(true, algo.FuzzyMatchV2, true, CaseSmart, false, true, true, []Range{}, Delimiter{}, []rune("jg")) + tokens := Tokenize("junegunn", Delimiter{}) + trans := Transform(tokens, []Range{{1, 1}}) + + origBytes := []byte("junegunn.choi") + for _, extended := range []bool{false, true} { + chunk := Chunk{count: 1} + chunk.items[0] = Item{ + text: util.ToChars([]byte("junegunn")), + origText: &origBytes, + transformed: &trans} + pattern.extended = extended + matches := pattern.matchChunk(&chunk, nil, slab) // No cache + if !(matches[0].item.text.ToString() == "junegunn" && + string(*matches[0].item.origText) == "junegunn.choi" && + reflect.DeepEqual(*matches[0].item.transformed, trans)) { + t.Error("Invalid match result", matches) + } + + match, offsets, pos := pattern.MatchItem(&chunk.items[0], true, slab) + if !(match.item.text.ToString() == "junegunn" && + string(*match.item.origText) == "junegunn.choi" && + offsets[0][0] == 0 && offsets[0][1] == 5 && + reflect.DeepEqual(*match.item.transformed, trans)) { + t.Error("Invalid match result", match, offsets, extended) + } + if !((*pos)[0] == 4 && (*pos)[1] == 0) { + t.Error("Invalid pos array", *pos) + } + } +} + +func TestCacheKey(t *testing.T) { + test := func(extended bool, patStr string, expected string, cacheable bool) { + clearPatternCache() + pat := BuildPattern(true, algo.FuzzyMatchV2, extended, CaseSmart, false, true, true, []Range{}, Delimiter{}, []rune(patStr)) + if pat.CacheKey() != expected { + t.Errorf("Expected: %s, actual: %s", expected, pat.CacheKey()) + } + if pat.cacheable != cacheable { + t.Errorf("Expected: %t, actual: %t (%s)", cacheable, pat.cacheable, patStr) + } + clearPatternCache() + } + test(false, "foo !bar", "foo !bar", true) + test(false, "foo | bar !baz", "foo | bar !baz", true) + test(true, "foo bar baz", "foo\tbar\tbaz", true) + test(true, "foo !bar", "foo", false) + test(true, "foo !bar baz", "foo\tbaz", false) + test(true, "foo | bar baz", "baz", false) + test(true, "foo | bar | baz", "", false) + test(true, "foo | bar !baz", "", false) + test(true, "| | foo", "", false) + test(true, "| | | foo", "foo", false) +} + +func TestCacheable(t *testing.T) { + test := func(fuzzy bool, str string, expected string, cacheable bool) { + clearPatternCache() + pat := BuildPattern(fuzzy, algo.FuzzyMatchV2, true, CaseSmart, true, true, true, []Range{}, Delimiter{}, []rune(str)) + if pat.CacheKey() != expected { + t.Errorf("Expected: %s, actual: %s", expected, pat.CacheKey()) + } + if cacheable != pat.cacheable { + t.Errorf("Invalid Pattern.cacheable for \"%s\": %v (expected: %v)", str, pat.cacheable, cacheable) + } + clearPatternCache() + } + test(true, "foo bar", "foo\tbar", true) + test(true, "foo 'bar", "foo\tbar", false) + test(true, "foo !bar", "foo", false) + + test(false, "foo bar", "foo\tbar", true) + test(false, "foo 'bar", "foo", false) + test(false, "foo '", "foo", true) + test(false, "foo 'bar", "foo", false) + test(false, "foo !bar", "foo", false) +} diff --git a/.fzf/src/protector/protector.go b/.fzf/src/protector/protector.go new file mode 100644 index 0000000..2739c01 --- /dev/null +++ b/.fzf/src/protector/protector.go @@ -0,0 +1,8 @@ +// +build !openbsd + +package protector + +// Protect calls OS specific protections like pledge on OpenBSD +func Protect() { + return +} diff --git a/.fzf/src/protector/protector_openbsd.go b/.fzf/src/protector/protector_openbsd.go new file mode 100644 index 0000000..84a5ded --- /dev/null +++ b/.fzf/src/protector/protector_openbsd.go @@ -0,0 +1,10 @@ +// +build openbsd + +package protector + +import "golang.org/x/sys/unix" + +// Protect calls OS specific protections like pledge on OpenBSD +func Protect() { + unix.PledgePromises("stdio rpath tty proc exec") +} diff --git a/.fzf/src/reader.go b/.fzf/src/reader.go new file mode 100644 index 0000000..06e9b73 --- /dev/null +++ b/.fzf/src/reader.go @@ -0,0 +1,201 @@ +package fzf + +import ( + "bufio" + "context" + "io" + "os" + "os/exec" + "path/filepath" + "sync" + "sync/atomic" + "time" + + "github.com/junegunn/fzf/src/util" + "github.com/saracen/walker" +) + +// Reader reads from command or standard input +type Reader struct { + pusher func([]byte) bool + eventBox *util.EventBox + delimNil bool + event int32 + finChan chan bool + mutex sync.Mutex + exec *exec.Cmd + command *string + killed bool + wait bool +} + +// NewReader returns new Reader object +func NewReader(pusher func([]byte) bool, eventBox *util.EventBox, delimNil bool, wait bool) *Reader { + return &Reader{pusher, eventBox, delimNil, int32(EvtReady), make(chan bool, 1), sync.Mutex{}, nil, nil, false, wait} +} + +func (r *Reader) startEventPoller() { + go func() { + ptr := &r.event + pollInterval := readerPollIntervalMin + for { + if atomic.CompareAndSwapInt32(ptr, int32(EvtReadNew), int32(EvtReady)) { + r.eventBox.Set(EvtReadNew, (*string)(nil)) + pollInterval = readerPollIntervalMin + } else if atomic.LoadInt32(ptr) == int32(EvtReadFin) { + if r.wait { + r.finChan <- true + } + return + } else { + pollInterval += readerPollIntervalStep + if pollInterval > readerPollIntervalMax { + pollInterval = readerPollIntervalMax + } + } + time.Sleep(pollInterval) + } + }() +} + +func (r *Reader) fin(success bool) { + atomic.StoreInt32(&r.event, int32(EvtReadFin)) + if r.wait { + <-r.finChan + } + + r.mutex.Lock() + ret := r.command + if success || r.killed { + ret = nil + } + r.mutex.Unlock() + + r.eventBox.Set(EvtReadFin, ret) +} + +func (r *Reader) terminate() { + r.mutex.Lock() + defer func() { r.mutex.Unlock() }() + + r.killed = true + if r.exec != nil && r.exec.Process != nil { + util.KillCommand(r.exec) + } else if defaultCommand != "" { + os.Stdin.Close() + } +} + +func (r *Reader) restart(command string) { + r.event = int32(EvtReady) + r.startEventPoller() + success := r.readFromCommand(nil, command) + r.fin(success) +} + +// ReadSource reads data from the default command or from standard input +func (r *Reader) ReadSource() { + r.startEventPoller() + var success bool + if util.IsTty() { + // The default command for *nix requires bash + shell := "bash" + cmd := os.Getenv("FZF_DEFAULT_COMMAND") + if len(cmd) == 0 { + if defaultCommand != "" { + success = r.readFromCommand(&shell, defaultCommand) + } else { + success = r.readFiles() + } + } else { + success = r.readFromCommand(nil, cmd) + } + } else { + success = r.readFromStdin() + } + r.fin(success) +} + +func (r *Reader) feed(src io.Reader) { + delim := byte('\n') + if r.delimNil { + delim = '\000' + } + reader := bufio.NewReaderSize(src, readerBufferSize) + for { + // ReadBytes returns err != nil if and only if the returned data does not + // end in delim. + bytea, err := reader.ReadBytes(delim) + byteaLen := len(bytea) + if byteaLen > 0 { + if err == nil { + // get rid of carriage return if under Windows: + if util.IsWindows() && byteaLen >= 2 && bytea[byteaLen-2] == byte('\r') { + bytea = bytea[:byteaLen-2] + } else { + bytea = bytea[:byteaLen-1] + } + } + if r.pusher(bytea) { + atomic.StoreInt32(&r.event, int32(EvtReadNew)) + } + } + if err != nil { + break + } + } +} + +func (r *Reader) readFromStdin() bool { + r.feed(os.Stdin) + return true +} + +func (r *Reader) readFiles() bool { + r.killed = false + fn := func(path string, mode os.FileInfo) error { + path = filepath.Clean(path) + if path != "." { + isDir := mode.Mode().IsDir() + if isDir && filepath.Base(path)[0] == '.' { + return filepath.SkipDir + } + if !isDir && r.pusher([]byte(path)) { + atomic.StoreInt32(&r.event, int32(EvtReadNew)) + } + } + r.mutex.Lock() + defer r.mutex.Unlock() + if r.killed { + return context.Canceled + } + return nil + } + cb := walker.WithErrorCallback(func(pathname string, err error) error { + return nil + }) + return walker.Walk(".", fn, cb) == nil +} + +func (r *Reader) readFromCommand(shell *string, command string) bool { + r.mutex.Lock() + r.killed = false + r.command = &command + if shell != nil { + r.exec = util.ExecCommandWith(*shell, command, true) + } else { + r.exec = util.ExecCommand(command, true) + } + out, err := r.exec.StdoutPipe() + if err != nil { + r.mutex.Unlock() + return false + } + err = r.exec.Start() + r.mutex.Unlock() + if err != nil { + return false + } + r.feed(out) + return r.exec.Wait() == nil +} diff --git a/.fzf/src/reader_test.go b/.fzf/src/reader_test.go new file mode 100644 index 0000000..feb45fc --- /dev/null +++ b/.fzf/src/reader_test.go @@ -0,0 +1,63 @@ +package fzf + +import ( + "testing" + "time" + + "github.com/junegunn/fzf/src/util" +) + +func TestReadFromCommand(t *testing.T) { + strs := []string{} + eb := util.NewEventBox() + reader := NewReader( + func(s []byte) bool { strs = append(strs, string(s)); return true }, + eb, false, true) + + reader.startEventPoller() + + // Check EventBox + if eb.Peek(EvtReadNew) { + t.Error("EvtReadNew should not be set yet") + } + + // Normal command + reader.fin(reader.readFromCommand(nil, `echo abc&&echo def`)) + if len(strs) != 2 || strs[0] != "abc" || strs[1] != "def" { + t.Errorf("%s", strs) + } + + // Check EventBox again + eb.WaitFor(EvtReadFin) + + // Wait should return immediately + eb.Wait(func(events *util.Events) { + events.Clear() + }) + + // EventBox is cleared + if eb.Peek(EvtReadNew) { + t.Error("EvtReadNew should not be set yet") + } + + // Make sure that event poller is finished + time.Sleep(readerPollIntervalMax) + + // Restart event poller + reader.startEventPoller() + + // Failing command + reader.fin(reader.readFromCommand(nil, `no-such-command`)) + strs = []string{} + if len(strs) > 0 { + t.Errorf("%s", strs) + } + + // Check EventBox again + if eb.Peek(EvtReadNew) { + t.Error("Command failed. EvtReadNew should not be set") + } + if !eb.Peek(EvtReadFin) { + t.Error("EvtReadFin should be set") + } +} diff --git a/.fzf/src/result.go b/.fzf/src/result.go new file mode 100644 index 0000000..8abe0d3 --- /dev/null +++ b/.fzf/src/result.go @@ -0,0 +1,243 @@ +package fzf + +import ( + "math" + "sort" + "unicode" + + "github.com/junegunn/fzf/src/tui" + "github.com/junegunn/fzf/src/util" +) + +// Offset holds two 32-bit integers denoting the offsets of a matched substring +type Offset [2]int32 + +type colorOffset struct { + offset [2]int32 + color tui.ColorPair +} + +type Result struct { + item *Item + points [4]uint16 +} + +func buildResult(item *Item, offsets []Offset, score int) Result { + if len(offsets) > 1 { + sort.Sort(ByOrder(offsets)) + } + + result := Result{item: item} + numChars := item.text.Length() + minBegin := math.MaxUint16 + minEnd := math.MaxUint16 + maxEnd := 0 + validOffsetFound := false + for _, offset := range offsets { + b, e := int(offset[0]), int(offset[1]) + if b < e { + minBegin = util.Min(b, minBegin) + minEnd = util.Min(e, minEnd) + maxEnd = util.Max(e, maxEnd) + validOffsetFound = true + } + } + + for idx, criterion := range sortCriteria { + val := uint16(math.MaxUint16) + switch criterion { + case byScore: + // Higher is better + val = math.MaxUint16 - util.AsUint16(score) + case byLength: + val = item.TrimLength() + case byBegin, byEnd: + if validOffsetFound { + whitePrefixLen := 0 + for idx := 0; idx < numChars; idx++ { + r := item.text.Get(idx) + whitePrefixLen = idx + if idx == minBegin || !unicode.IsSpace(r) { + break + } + } + if criterion == byBegin { + val = util.AsUint16(minEnd - whitePrefixLen) + } else { + val = util.AsUint16(math.MaxUint16 - math.MaxUint16*(maxEnd-whitePrefixLen)/int(item.TrimLength())) + } + } + } + result.points[3-idx] = val + } + + return result +} + +// Sort criteria to use. Never changes once fzf is started. +var sortCriteria []criterion + +// Index returns ordinal index of the Item +func (result *Result) Index() int32 { + return result.item.Index() +} + +func minRank() Result { + return Result{item: &minItem, points: [4]uint16{math.MaxUint16, 0, 0, 0}} +} + +func (result *Result) colorOffsets(matchOffsets []Offset, theme *tui.ColorTheme, colBase tui.ColorPair, colMatch tui.ColorPair, current bool) []colorOffset { + itemColors := result.item.Colors() + + // No ANSI codes + if len(itemColors) == 0 { + var offsets []colorOffset + for _, off := range matchOffsets { + offsets = append(offsets, colorOffset{offset: [2]int32{off[0], off[1]}, color: colMatch}) + } + return offsets + } + + // Find max column + var maxCol int32 + for _, off := range matchOffsets { + if off[1] > maxCol { + maxCol = off[1] + } + } + for _, ansi := range itemColors { + if ansi.offset[1] > maxCol { + maxCol = ansi.offset[1] + } + } + + cols := make([]int, maxCol) + for colorIndex, ansi := range itemColors { + for i := ansi.offset[0]; i < ansi.offset[1]; i++ { + cols[i] = colorIndex + 1 // 1-based index of itemColors + } + } + + for _, off := range matchOffsets { + for i := off[0]; i < off[1]; i++ { + // Negative of 1-based index of itemColors + // - The extra -1 means highlighted + cols[i] = cols[i]*-1 - 1 + } + } + + // sort.Sort(ByOrder(offsets)) + + // Merge offsets + // ------------ ---- -- ---- + // ++++++++ ++++++++++ + // --++++++++-- --++++++++++--- + curr := 0 + start := 0 + ansiToColorPair := func(ansi ansiOffset, base tui.ColorPair) tui.ColorPair { + fg := ansi.color.fg + bg := ansi.color.bg + if fg == -1 { + if current { + fg = theme.Current.Color + } else { + fg = theme.Fg.Color + } + } + if bg == -1 { + if current { + bg = theme.DarkBg.Color + } else { + bg = theme.Bg.Color + } + } + return tui.NewColorPair(fg, bg, ansi.color.attr).MergeAttr(base) + } + var colors []colorOffset + add := func(idx int) { + if curr != 0 && idx > start { + if curr < 0 { + color := colMatch + if curr < -1 && theme.Colored { + origColor := ansiToColorPair(itemColors[-curr-2], colMatch) + // hl or hl+ only sets the foreground color, so colMatch is the + // combination of either [hl and bg] or [hl+ and bg+]. + // + // If the original text already has background color, and the + // foreground color of colMatch is -1, we shouldn't only apply the + // background color of colMatch. + // e.g. echo -e "\x1b[32;7mfoo\x1b[mbar" | fzf --ansi --color bg+:1,hl+:-1:underline + // echo -e "\x1b[42mfoo\x1b[mbar" | fzf --ansi --color bg+:1,hl+:-1:underline + if color.Fg().IsDefault() && origColor.HasBg() { + color = origColor + } else { + color = origColor.MergeNonDefault(color) + } + } + colors = append(colors, colorOffset{ + offset: [2]int32{int32(start), int32(idx)}, color: color}) + } else { + ansi := itemColors[curr-1] + colors = append(colors, colorOffset{ + offset: [2]int32{int32(start), int32(idx)}, + color: ansiToColorPair(ansi, colBase)}) + } + } + } + for idx, col := range cols { + if col != curr { + add(idx) + start = idx + curr = col + } + } + add(int(maxCol)) + return colors +} + +// ByOrder is for sorting substring offsets +type ByOrder []Offset + +func (a ByOrder) Len() int { + return len(a) +} + +func (a ByOrder) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func (a ByOrder) Less(i, j int) bool { + ioff := a[i] + joff := a[j] + return (ioff[0] < joff[0]) || (ioff[0] == joff[0]) && (ioff[1] <= joff[1]) +} + +// ByRelevance is for sorting Items +type ByRelevance []Result + +func (a ByRelevance) Len() int { + return len(a) +} + +func (a ByRelevance) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func (a ByRelevance) Less(i, j int) bool { + return compareRanks(a[i], a[j], false) +} + +// ByRelevanceTac is for sorting Items +type ByRelevanceTac []Result + +func (a ByRelevanceTac) Len() int { + return len(a) +} + +func (a ByRelevanceTac) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func (a ByRelevanceTac) Less(i, j int) bool { + return compareRanks(a[i], a[j], true) +} diff --git a/.fzf/src/result_others.go b/.fzf/src/result_others.go new file mode 100644 index 0000000..e3363a8 --- /dev/null +++ b/.fzf/src/result_others.go @@ -0,0 +1,16 @@ +// +build !386,!amd64 + +package fzf + +func compareRanks(irank Result, jrank Result, tac bool) bool { + for idx := 3; idx >= 0; idx-- { + left := irank.points[idx] + right := jrank.points[idx] + if left < right { + return true + } else if left > right { + return false + } + } + return (irank.item.Index() <= jrank.item.Index()) != tac +} diff --git a/.fzf/src/result_test.go b/.fzf/src/result_test.go new file mode 100644 index 0000000..4084fdb --- /dev/null +++ b/.fzf/src/result_test.go @@ -0,0 +1,159 @@ +// +build !tcell + +package fzf + +import ( + "math" + "sort" + "testing" + + "github.com/junegunn/fzf/src/tui" + "github.com/junegunn/fzf/src/util" +) + +func withIndex(i *Item, index int) *Item { + (*i).text.Index = int32(index) + return i +} + +func TestOffsetSort(t *testing.T) { + offsets := []Offset{ + {3, 5}, {2, 7}, + {1, 3}, {2, 9}} + sort.Sort(ByOrder(offsets)) + + if offsets[0][0] != 1 || offsets[0][1] != 3 || + offsets[1][0] != 2 || offsets[1][1] != 7 || + offsets[2][0] != 2 || offsets[2][1] != 9 || + offsets[3][0] != 3 || offsets[3][1] != 5 { + t.Error("Invalid order:", offsets) + } +} + +func TestRankComparison(t *testing.T) { + rank := func(vals ...uint16) Result { + return Result{ + points: [4]uint16{vals[0], vals[1], vals[2], vals[3]}, + item: &Item{text: util.Chars{Index: int32(vals[4])}}} + } + if compareRanks(rank(3, 0, 0, 0, 5), rank(2, 0, 0, 0, 7), false) || + !compareRanks(rank(3, 0, 0, 0, 5), rank(3, 0, 0, 0, 6), false) || + !compareRanks(rank(1, 2, 0, 0, 3), rank(1, 3, 0, 0, 2), false) || + !compareRanks(rank(0, 0, 0, 0, 0), rank(0, 0, 0, 0, 0), false) { + t.Error("Invalid order") + } + + if compareRanks(rank(3, 0, 0, 0, 5), rank(2, 0, 0, 0, 7), true) || + !compareRanks(rank(3, 0, 0, 0, 5), rank(3, 0, 0, 0, 6), false) || + !compareRanks(rank(1, 2, 0, 0, 3), rank(1, 3, 0, 0, 2), true) || + !compareRanks(rank(0, 0, 0, 0, 0), rank(0, 0, 0, 0, 0), false) { + t.Error("Invalid order (tac)") + } +} + +// Match length, string length, index +func TestResultRank(t *testing.T) { + // FIXME global + sortCriteria = []criterion{byScore, byLength} + + strs := [][]rune{[]rune("foo"), []rune("foobar"), []rune("bar"), []rune("baz")} + item1 := buildResult( + withIndex(&Item{text: util.RunesToChars(strs[0])}, 1), []Offset{}, 2) + if item1.points[3] != math.MaxUint16-2 || // Bonus + item1.points[2] != 3 || // Length + item1.points[1] != 0 || // Unused + item1.points[0] != 0 || // Unused + item1.item.Index() != 1 { + t.Error(item1) + } + // Only differ in index + item2 := buildResult(&Item{text: util.RunesToChars(strs[0])}, []Offset{}, 2) + + items := []Result{item1, item2} + sort.Sort(ByRelevance(items)) + if items[0] != item2 || items[1] != item1 { + t.Error(items) + } + + items = []Result{item2, item1, item1, item2} + sort.Sort(ByRelevance(items)) + if items[0] != item2 || items[1] != item2 || + items[2] != item1 || items[3] != item1 { + t.Error(items, item1, item1.item.Index(), item2, item2.item.Index()) + } + + // Sort by relevance + item3 := buildResult( + withIndex(&Item{}, 2), []Offset{{1, 3}, {5, 7}}, 3) + item4 := buildResult( + withIndex(&Item{}, 2), []Offset{{1, 2}, {6, 7}}, 4) + item5 := buildResult( + withIndex(&Item{}, 2), []Offset{{1, 3}, {5, 7}}, 5) + item6 := buildResult( + withIndex(&Item{}, 2), []Offset{{1, 2}, {6, 7}}, 6) + items = []Result{item1, item2, item3, item4, item5, item6} + sort.Sort(ByRelevance(items)) + if !(items[0] == item6 && items[1] == item5 && + items[2] == item4 && items[3] == item3 && + items[4] == item2 && items[5] == item1) { + t.Error(items, item1, item2, item3, item4, item5, item6) + } +} + +func TestColorOffset(t *testing.T) { + // ------------ 20 ---- -- ---- + // ++++++++ ++++++++++ + // --++++++++-- --++++++++++--- + + offsets := []Offset{{5, 15}, {25, 35}} + item := Result{ + item: &Item{ + colors: &[]ansiOffset{ + {[2]int32{0, 20}, ansiState{1, 5, 0, -1}}, + {[2]int32{22, 27}, ansiState{2, 6, tui.Bold, -1}}, + {[2]int32{30, 32}, ansiState{3, 7, 0, -1}}, + {[2]int32{33, 40}, ansiState{4, 8, tui.Bold, -1}}}}} + + colBase := tui.NewColorPair(89, 189, tui.AttrUndefined) + colMatch := tui.NewColorPair(99, 199, tui.AttrUndefined) + colors := item.colorOffsets(offsets, tui.Dark256, colBase, colMatch, true) + assert := func(idx int, b int32, e int32, c tui.ColorPair) { + o := colors[idx] + if o.offset[0] != b || o.offset[1] != e || o.color != c { + t.Error(o, b, e, c) + } + } + // [{[0 5] {1 5 0}} {[5 15] {99 199 0}} {[15 20] {1 5 0}} + // {[22 25] {2 6 1}} {[25 27] {99 199 1}} {[27 30] {99 199 0}} + // {[30 32] {99 199 0}} {[32 33] {99 199 0}} {[33 35] {99 199 1}} + // {[35 40] {4 8 1}}] + assert(0, 0, 5, tui.NewColorPair(1, 5, tui.AttrUndefined)) + assert(1, 5, 15, colMatch) + assert(2, 15, 20, tui.NewColorPair(1, 5, tui.AttrUndefined)) + assert(3, 22, 25, tui.NewColorPair(2, 6, tui.Bold)) + assert(4, 25, 27, colMatch.WithAttr(tui.Bold)) + assert(5, 27, 30, colMatch) + assert(6, 30, 32, colMatch) + assert(7, 32, 33, colMatch) // TODO: Should we merge consecutive blocks? + assert(8, 33, 35, colMatch.WithAttr(tui.Bold)) + assert(9, 35, 40, tui.NewColorPair(4, 8, tui.Bold)) + + colRegular := tui.NewColorPair(-1, -1, tui.AttrUndefined) + colUnderline := tui.NewColorPair(-1, -1, tui.Underline) + colors = item.colorOffsets(offsets, tui.Dark256, colRegular, colUnderline, true) + + // [{[0 5] {1 5 0}} {[5 15] {1 5 8}} {[15 20] {1 5 0}} + // {[22 25] {2 6 1}} {[25 27] {2 6 9}} {[27 30] {-1 -1 8}} + // {[30 32] {3 7 8}} {[32 33] {-1 -1 8}} {[33 35] {4 8 9}} + // {[35 40] {4 8 1}}] + assert(0, 0, 5, tui.NewColorPair(1, 5, tui.AttrUndefined)) + assert(1, 5, 15, tui.NewColorPair(1, 5, tui.Underline)) + assert(2, 15, 20, tui.NewColorPair(1, 5, tui.AttrUndefined)) + assert(3, 22, 25, tui.NewColorPair(2, 6, tui.Bold)) + assert(4, 25, 27, tui.NewColorPair(2, 6, tui.Bold|tui.Underline)) + assert(5, 27, 30, colUnderline) + assert(6, 30, 32, tui.NewColorPair(3, 7, tui.Underline)) + assert(7, 32, 33, colUnderline) + assert(8, 33, 35, tui.NewColorPair(4, 8, tui.Bold|tui.Underline)) + assert(9, 35, 40, tui.NewColorPair(4, 8, tui.Bold)) +} diff --git a/.fzf/src/result_x86.go b/.fzf/src/result_x86.go new file mode 100644 index 0000000..60e26e9 --- /dev/null +++ b/.fzf/src/result_x86.go @@ -0,0 +1,16 @@ +// +build 386 amd64 + +package fzf + +import "unsafe" + +func compareRanks(irank Result, jrank Result, tac bool) bool { + left := *(*uint64)(unsafe.Pointer(&irank.points[0])) + right := *(*uint64)(unsafe.Pointer(&jrank.points[0])) + if left < right { + return true + } else if left > right { + return false + } + return (irank.item.Index() <= jrank.item.Index()) != tac +} diff --git a/.fzf/src/terminal.go b/.fzf/src/terminal.go new file mode 100644 index 0000000..2bad5d7 --- /dev/null +++ b/.fzf/src/terminal.go @@ -0,0 +1,2832 @@ +package fzf + +import ( + "bufio" + "fmt" + "io/ioutil" + "os" + "os/signal" + "regexp" + "sort" + "strconv" + "strings" + "sync" + "syscall" + "time" + + "github.com/mattn/go-runewidth" + "github.com/rivo/uniseg" + + "github.com/junegunn/fzf/src/tui" + "github.com/junegunn/fzf/src/util" +) + +// import "github.com/pkg/profile" + +/* + Placeholder regex is used to extract placeholders from fzf's template + strings. Acts as input validation for parsePlaceholder function. + Describes the syntax, but it is fairly lenient. + + The following pseudo regex has been reverse engineered from the + implementation. It is overly strict, but better describes whats possible. + As such it is not useful for validation, but rather to generate test + cases for example. + + \\?(?: # escaped type + {\+?s?f?RANGE(?:,RANGE)*} # token type + |{q} # query type + |{\+?n?f?} # item type (notice no mandatory element inside brackets) + ) + RANGE = (?: + (?:-?[0-9]+)?\.\.(?:-?[0-9]+)? # ellipsis syntax for token range (x..y) + |-?[0-9]+ # shorthand syntax (x..x) + ) +*/ +var placeholder *regexp.Regexp +var whiteSuffix *regexp.Regexp +var offsetComponentRegex *regexp.Regexp +var offsetTrimCharsRegex *regexp.Regexp +var activeTempFiles []string + +const ellipsis string = ".." +const clearCode string = "\x1b[2J" + +func init() { + placeholder = regexp.MustCompile(`\\?(?:{[+sf]*[0-9,-.]*}|{q}|{\+?f?nf?})`) + whiteSuffix = regexp.MustCompile(`\s*$`) + offsetComponentRegex = regexp.MustCompile(`([+-][0-9]+)|(-?/[1-9][0-9]*)`) + offsetTrimCharsRegex = regexp.MustCompile(`[^0-9/+-]`) + activeTempFiles = []string{} +} + +type jumpMode int + +const ( + jumpDisabled jumpMode = iota + jumpEnabled + jumpAcceptEnabled +) + +type previewer struct { + version int64 + lines []string + offset int + enabled bool + scrollable bool + final bool + following bool + spinner string +} + +type previewed struct { + version int64 + numLines int + offset int + filled bool +} + +type eachLine struct { + line string + err error +} + +type itemLine struct { + current bool + selected bool + label string + queryLen int + width int + result Result +} + +var emptyLine = itemLine{} + +// Terminal represents terminal input/output +type Terminal struct { + initDelay time.Duration + infoStyle infoStyle + spinner []string + prompt func() + promptLen int + pointer string + pointerLen int + pointerEmpty string + marker string + markerLen int + markerEmpty string + queryLen [2]int + layout layoutType + fullscreen bool + keepRight bool + hscroll bool + hscrollOff int + scrollOff int + wordRubout string + wordNext string + cx int + cy int + offset int + xoffset int + yanked []rune + input []rune + multi int + sort bool + toggleSort bool + delimiter Delimiter + expect map[tui.Event]string + keymap map[tui.Event][]action + pressed string + printQuery bool + history *History + cycle bool + headerFirst bool + headerLines int + header []string + header0 []string + ansi bool + tabstop int + margin [4]sizeSpec + padding [4]sizeSpec + strong tui.Attr + unicode bool + borderShape tui.BorderShape + cleanExit bool + paused bool + border tui.Window + window tui.Window + pborder tui.Window + pwindow tui.Window + count int + progress int + reading bool + running bool + failed *string + jumping jumpMode + jumpLabels string + printer func(string) + printsep string + merger *Merger + selected map[int32]selectedItem + version int64 + reqBox *util.EventBox + previewOpts previewOpts + previewer previewer + previewed previewed + previewBox *util.EventBox + eventBox *util.EventBox + mutex sync.Mutex + initFunc func() + prevLines []itemLine + suppress bool + sigstop bool + startChan chan bool + killChan chan int + slab *util.Slab + theme *tui.ColorTheme + tui tui.Renderer + executing *util.AtomicBool +} + +type selectedItem struct { + at time.Time + item *Item +} + +type byTimeOrder []selectedItem + +func (a byTimeOrder) Len() int { + return len(a) +} + +func (a byTimeOrder) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func (a byTimeOrder) Less(i, j int) bool { + return a[i].at.Before(a[j].at) +} + +const ( + reqPrompt util.EventType = iota + reqInfo + reqHeader + reqList + reqJump + reqRefresh + reqReinit + reqRedraw + reqClose + reqPrintQuery + reqPreviewEnqueue + reqPreviewDisplay + reqPreviewRefresh + reqPreviewDelayed + reqQuit +) + +type action struct { + t actionType + a string +} + +type actionType int + +const ( + actIgnore actionType = iota + actInvalid + actRune + actMouse + actBeginningOfLine + actAbort + actAccept + actAcceptNonEmpty + actBackwardChar + actBackwardDeleteChar + actBackwardDeleteCharEOF + actBackwardWord + actCancel + actChangePrompt + actClearScreen + actClearQuery + actClearSelection + actClose + actDeleteChar + actDeleteCharEOF + actEndOfLine + actForwardChar + actForwardWord + actKillLine + actKillWord + actUnixLineDiscard + actUnixWordRubout + actYank + actBackwardKillWord + actSelectAll + actDeselectAll + actToggle + actToggleSearch + actToggleAll + actToggleDown + actToggleUp + actToggleIn + actToggleOut + actDown + actUp + actPageUp + actPageDown + actHalfPageUp + actHalfPageDown + actJump + actJumpAccept + actPrintQuery + actRefreshPreview + actReplaceQuery + actToggleSort + actTogglePreview + actTogglePreviewWrap + actPreview + actPreviewTop + actPreviewBottom + actPreviewUp + actPreviewDown + actPreviewPageUp + actPreviewPageDown + actPreviewHalfPageUp + actPreviewHalfPageDown + actPreviousHistory + actNextHistory + actExecute + actExecuteSilent + actExecuteMulti // Deprecated + actSigStop + actFirst + actLast + actReload + actDisableSearch + actEnableSearch + actSelect + actDeselect + actUnbind +) + +type placeholderFlags struct { + plus bool + preserveSpace bool + number bool + query bool + file bool +} + +type searchRequest struct { + sort bool + command *string +} + +type previewRequest struct { + template string + pwindow tui.Window + list []*Item +} + +type previewResult struct { + version int64 + lines []string + offset int + spinner string +} + +func toActions(types ...actionType) []action { + actions := make([]action, len(types)) + for idx, t := range types { + actions[idx] = action{t: t, a: ""} + } + return actions +} + +func defaultKeymap() map[tui.Event][]action { + keymap := make(map[tui.Event][]action) + add := func(e tui.EventType, a actionType) { + keymap[e.AsEvent()] = toActions(a) + } + addEvent := func(e tui.Event, a actionType) { + keymap[e] = toActions(a) + } + + add(tui.Invalid, actInvalid) + add(tui.Resize, actClearScreen) + add(tui.CtrlA, actBeginningOfLine) + add(tui.CtrlB, actBackwardChar) + add(tui.CtrlC, actAbort) + add(tui.CtrlG, actAbort) + add(tui.CtrlQ, actAbort) + add(tui.ESC, actAbort) + add(tui.CtrlD, actDeleteCharEOF) + add(tui.CtrlE, actEndOfLine) + add(tui.CtrlF, actForwardChar) + add(tui.CtrlH, actBackwardDeleteChar) + add(tui.BSpace, actBackwardDeleteChar) + add(tui.Tab, actToggleDown) + add(tui.BTab, actToggleUp) + add(tui.CtrlJ, actDown) + add(tui.CtrlK, actUp) + add(tui.CtrlL, actClearScreen) + add(tui.CtrlM, actAccept) + add(tui.CtrlN, actDown) + add(tui.CtrlP, actUp) + add(tui.CtrlU, actUnixLineDiscard) + add(tui.CtrlW, actUnixWordRubout) + add(tui.CtrlY, actYank) + if !util.IsWindows() { + add(tui.CtrlZ, actSigStop) + } + + addEvent(tui.AltKey('b'), actBackwardWord) + add(tui.SLeft, actBackwardWord) + addEvent(tui.AltKey('f'), actForwardWord) + add(tui.SRight, actForwardWord) + addEvent(tui.AltKey('d'), actKillWord) + add(tui.AltBS, actBackwardKillWord) + + add(tui.Up, actUp) + add(tui.Down, actDown) + add(tui.Left, actBackwardChar) + add(tui.Right, actForwardChar) + + add(tui.Home, actBeginningOfLine) + add(tui.End, actEndOfLine) + add(tui.Del, actDeleteChar) + add(tui.PgUp, actPageUp) + add(tui.PgDn, actPageDown) + + add(tui.SUp, actPreviewUp) + add(tui.SDown, actPreviewDown) + + add(tui.Mouse, actMouse) + add(tui.DoubleClick, actAccept) + add(tui.LeftClick, actIgnore) + add(tui.RightClick, actToggle) + return keymap +} + +func trimQuery(query string) []rune { + return []rune(strings.Replace(query, "\t", " ", -1)) +} + +func hasPreviewAction(opts *Options) bool { + for _, actions := range opts.Keymap { + for _, action := range actions { + if action.t == actPreview { + return true + } + } + } + return false +} + +func makeSpinner(unicode bool) []string { + if unicode { + return []string{`⠋`, `⠙`, `⠹`, `⠸`, `⠼`, `⠴`, `⠦`, `⠧`, `⠇`, `⠏`} + } + return []string{`-`, `\`, `|`, `/`, `-`, `\`, `|`, `/`} +} + +// NewTerminal returns new Terminal object +func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { + input := trimQuery(opts.Query) + var header []string + switch opts.Layout { + case layoutDefault, layoutReverseList: + header = reverseStringArray(opts.Header) + default: + header = opts.Header + } + var delay time.Duration + if opts.Tac { + delay = initialDelayTac + } else { + delay = initialDelay + } + var previewBox *util.EventBox + showPreviewWindow := len(opts.Preview.command) > 0 && !opts.Preview.hidden + if len(opts.Preview.command) > 0 || hasPreviewAction(opts) { + previewBox = util.NewEventBox() + } + strongAttr := tui.Bold + if !opts.Bold { + strongAttr = tui.AttrRegular + } + var renderer tui.Renderer + fullscreen := opts.Height.size == 0 || opts.Height.percent && opts.Height.size == 100 + if fullscreen { + if tui.HasFullscreenRenderer() { + renderer = tui.NewFullscreenRenderer(opts.Theme, opts.Black, opts.Mouse) + } else { + renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, opts.ClearOnExit, + true, func(h int) int { return h }) + } + } else { + maxHeightFunc := func(termHeight int) int { + var maxHeight int + if opts.Height.percent { + maxHeight = util.Max(int(opts.Height.size*float64(termHeight)/100.0), opts.MinHeight) + } else { + maxHeight = int(opts.Height.size) + } + + effectiveMinHeight := minHeight + if previewBox != nil && (opts.Preview.position == posUp || opts.Preview.position == posDown) { + effectiveMinHeight *= 2 + } + if opts.InfoStyle != infoDefault { + effectiveMinHeight-- + } + if opts.BorderShape != tui.BorderNone { + effectiveMinHeight += 2 + } + return util.Min(termHeight, util.Max(maxHeight, effectiveMinHeight)) + } + renderer = tui.NewLightRenderer(opts.Theme, opts.Black, opts.Mouse, opts.Tabstop, opts.ClearOnExit, false, maxHeightFunc) + } + wordRubout := "[^\\pL\\pN][\\pL\\pN]" + wordNext := "[\\pL\\pN][^\\pL\\pN]|(.$)" + if opts.FileWord { + sep := regexp.QuoteMeta(string(os.PathSeparator)) + wordRubout = fmt.Sprintf("%s[^%s]", sep, sep) + wordNext = fmt.Sprintf("[^%s]%s|(.$)", sep, sep) + } + t := Terminal{ + initDelay: delay, + infoStyle: opts.InfoStyle, + spinner: makeSpinner(opts.Unicode), + queryLen: [2]int{0, 0}, + layout: opts.Layout, + fullscreen: fullscreen, + keepRight: opts.KeepRight, + hscroll: opts.Hscroll, + hscrollOff: opts.HscrollOff, + scrollOff: opts.ScrollOff, + wordRubout: wordRubout, + wordNext: wordNext, + cx: len(input), + cy: 0, + offset: 0, + xoffset: 0, + yanked: []rune{}, + input: input, + multi: opts.Multi, + sort: opts.Sort > 0, + toggleSort: opts.ToggleSort, + delimiter: opts.Delimiter, + expect: opts.Expect, + keymap: opts.Keymap, + pressed: "", + printQuery: opts.PrintQuery, + history: opts.History, + margin: opts.Margin, + padding: opts.Padding, + unicode: opts.Unicode, + borderShape: opts.BorderShape, + cleanExit: opts.ClearOnExit, + paused: opts.Phony, + strong: strongAttr, + cycle: opts.Cycle, + headerFirst: opts.HeaderFirst, + headerLines: opts.HeaderLines, + header: header, + header0: header, + ansi: opts.Ansi, + tabstop: opts.Tabstop, + reading: true, + running: true, + failed: nil, + jumping: jumpDisabled, + jumpLabels: opts.JumpLabels, + printer: opts.Printer, + printsep: opts.PrintSep, + merger: EmptyMerger, + selected: make(map[int32]selectedItem), + reqBox: util.NewEventBox(), + previewOpts: opts.Preview, + previewer: previewer{0, []string{}, 0, showPreviewWindow, false, true, false, ""}, + previewed: previewed{0, 0, 0, false}, + previewBox: previewBox, + eventBox: eventBox, + mutex: sync.Mutex{}, + suppress: true, + sigstop: false, + slab: util.MakeSlab(slab16Size, slab32Size), + theme: opts.Theme, + startChan: make(chan bool, 1), + killChan: make(chan int), + tui: renderer, + initFunc: func() { renderer.Init() }, + executing: util.NewAtomicBool(false)} + t.prompt, t.promptLen = t.parsePrompt(opts.Prompt) + t.pointer, t.pointerLen = t.processTabs([]rune(opts.Pointer), 0) + t.marker, t.markerLen = t.processTabs([]rune(opts.Marker), 0) + // Pre-calculated empty pointer and marker signs + t.pointerEmpty = strings.Repeat(" ", t.pointerLen) + t.markerEmpty = strings.Repeat(" ", t.markerLen) + + return &t +} + +func (t *Terminal) parsePrompt(prompt string) (func(), int) { + var state *ansiState + trimmed, colors, _ := extractColor(prompt, state, nil) + item := &Item{text: util.ToChars([]byte(trimmed)), colors: colors} + + // "Prompt> " + // ------- // Do not apply ANSI attributes to the trailing whitespaces + // // unless the part has a non-default ANSI state + loc := whiteSuffix.FindStringIndex(trimmed) + if loc != nil { + blankState := ansiOffset{[2]int32{int32(loc[0]), int32(loc[1])}, ansiState{-1, -1, tui.AttrClear, -1}} + if item.colors != nil { + lastColor := (*item.colors)[len(*item.colors)-1] + if lastColor.offset[1] < int32(loc[1]) { + blankState.offset[0] = lastColor.offset[1] + colors := append(*item.colors, blankState) + item.colors = &colors + } + } else { + colors := []ansiOffset{blankState} + item.colors = &colors + } + } + output := func() { + t.printHighlighted( + Result{item: item}, tui.ColPrompt, tui.ColPrompt, false, false) + } + _, promptLen := t.processTabs([]rune(trimmed), 0) + + return output, promptLen +} + +func (t *Terminal) noInfoLine() bool { + return t.infoStyle != infoDefault +} + +// Input returns current query string +func (t *Terminal) Input() (bool, []rune) { + t.mutex.Lock() + defer t.mutex.Unlock() + return t.paused, copySlice(t.input) +} + +// UpdateCount updates the count information +func (t *Terminal) UpdateCount(cnt int, final bool, failedCommand *string) { + t.mutex.Lock() + t.count = cnt + t.reading = !final + t.failed = failedCommand + t.mutex.Unlock() + t.reqBox.Set(reqInfo, nil) + if final { + t.reqBox.Set(reqRefresh, nil) + } +} + +func reverseStringArray(input []string) []string { + size := len(input) + reversed := make([]string, size) + for idx, str := range input { + reversed[size-idx-1] = str + } + return reversed +} + +// UpdateHeader updates the header +func (t *Terminal) UpdateHeader(header []string) { + t.mutex.Lock() + t.header = append(append([]string{}, t.header0...), header...) + t.mutex.Unlock() + t.reqBox.Set(reqHeader, nil) +} + +// UpdateProgress updates the search progress +func (t *Terminal) UpdateProgress(progress float32) { + t.mutex.Lock() + newProgress := int(progress * 100) + changed := t.progress != newProgress + t.progress = newProgress + t.mutex.Unlock() + + if changed { + t.reqBox.Set(reqInfo, nil) + } +} + +// UpdateList updates Merger to display the list +func (t *Terminal) UpdateList(merger *Merger, reset bool) { + t.mutex.Lock() + t.progress = 100 + t.merger = merger + if reset { + t.selected = make(map[int32]selectedItem) + } + t.mutex.Unlock() + t.reqBox.Set(reqInfo, nil) + t.reqBox.Set(reqList, nil) +} + +func (t *Terminal) output() bool { + if t.printQuery { + t.printer(string(t.input)) + } + if len(t.expect) > 0 { + t.printer(t.pressed) + } + found := len(t.selected) > 0 + if !found { + current := t.currentItem() + if current != nil { + t.printer(current.AsString(t.ansi)) + found = true + } + } else { + for _, sel := range t.sortSelected() { + t.printer(sel.item.AsString(t.ansi)) + } + } + return found +} + +func (t *Terminal) sortSelected() []selectedItem { + sels := make([]selectedItem, 0, len(t.selected)) + for _, sel := range t.selected { + sels = append(sels, sel) + } + sort.Sort(byTimeOrder(sels)) + return sels +} + +func (t *Terminal) displayWidth(runes []rune) int { + width, _ := util.RunesWidth(runes, 0, t.tabstop, 0) + return width +} + +const ( + minWidth = 4 + minHeight = 4 +) + +func calculateSize(base int, size sizeSpec, occupied int, minSize int, pad int) int { + max := base - occupied + if size.percent { + return util.Constrain(int(float64(base)*0.01*size.size), minSize, max) + } + return util.Constrain(int(size.size)+pad, minSize, max) +} + +func (t *Terminal) resizeWindows() { + screenWidth := t.tui.MaxX() + screenHeight := t.tui.MaxY() + t.prevLines = make([]itemLine, screenHeight) + + marginInt := [4]int{} // TRBL + paddingInt := [4]int{} // TRBL + sizeSpecToInt := func(index int, spec sizeSpec) int { + if spec.percent { + var max float64 + if index%2 == 0 { + max = float64(screenHeight) + } else { + max = float64(screenWidth) + } + return int(max * spec.size * 0.01) + } + return int(spec.size) + } + for idx, sizeSpec := range t.padding { + paddingInt[idx] = sizeSpecToInt(idx, sizeSpec) + } + + extraMargin := [4]int{} // TRBL + for idx, sizeSpec := range t.margin { + switch t.borderShape { + case tui.BorderHorizontal: + extraMargin[idx] += 1 - idx%2 + case tui.BorderVertical: + extraMargin[idx] += 2 * (idx % 2) + case tui.BorderTop: + if idx == 0 { + extraMargin[idx]++ + } + case tui.BorderRight: + if idx == 1 { + extraMargin[idx] += 2 + } + case tui.BorderBottom: + if idx == 2 { + extraMargin[idx]++ + } + case tui.BorderLeft: + if idx == 3 { + extraMargin[idx] += 2 + } + case tui.BorderRounded, tui.BorderSharp: + extraMargin[idx] += 1 + idx%2 + } + marginInt[idx] = sizeSpecToInt(idx, sizeSpec) + extraMargin[idx] + } + + adjust := func(idx1 int, idx2 int, max int, min int) { + if max >= min { + margin := marginInt[idx1] + marginInt[idx2] + paddingInt[idx1] + paddingInt[idx2] + if max-margin < min { + desired := max - min + paddingInt[idx1] = desired * paddingInt[idx1] / margin + paddingInt[idx2] = desired * paddingInt[idx2] / margin + marginInt[idx1] = util.Max(extraMargin[idx1], desired*marginInt[idx1]/margin) + marginInt[idx2] = util.Max(extraMargin[idx2], desired*marginInt[idx2]/margin) + } + } + } + + previewVisible := t.isPreviewEnabled() && t.previewOpts.size.size > 0 + minAreaWidth := minWidth + minAreaHeight := minHeight + if previewVisible { + switch t.previewOpts.position { + case posUp, posDown: + minAreaHeight *= 2 + case posLeft, posRight: + minAreaWidth *= 2 + } + } + adjust(1, 3, screenWidth, minAreaWidth) + adjust(0, 2, screenHeight, minAreaHeight) + if t.border != nil { + t.border.Close() + } + if t.window != nil { + t.window.Close() + } + if t.pborder != nil { + t.pborder.Close() + } + if t.pwindow != nil { + t.pwindow.Close() + } + // Reset preview version so that full redraw occurs + t.previewed.version = 0 + + width := screenWidth - marginInt[1] - marginInt[3] + height := screenHeight - marginInt[0] - marginInt[2] + switch t.borderShape { + case tui.BorderHorizontal: + t.border = t.tui.NewWindow( + marginInt[0]-1, marginInt[3], width, height+2, + false, tui.MakeBorderStyle(tui.BorderHorizontal, t.unicode)) + case tui.BorderVertical: + t.border = t.tui.NewWindow( + marginInt[0], marginInt[3]-2, width+4, height, + false, tui.MakeBorderStyle(tui.BorderVertical, t.unicode)) + case tui.BorderTop: + t.border = t.tui.NewWindow( + marginInt[0]-1, marginInt[3], width, height+1, + false, tui.MakeBorderStyle(tui.BorderTop, t.unicode)) + case tui.BorderBottom: + t.border = t.tui.NewWindow( + marginInt[0], marginInt[3], width, height+1, + false, tui.MakeBorderStyle(tui.BorderBottom, t.unicode)) + case tui.BorderLeft: + t.border = t.tui.NewWindow( + marginInt[0], marginInt[3]-2, width+2, height, + false, tui.MakeBorderStyle(tui.BorderLeft, t.unicode)) + case tui.BorderRight: + t.border = t.tui.NewWindow( + marginInt[0], marginInt[3], width+2, height, + false, tui.MakeBorderStyle(tui.BorderRight, t.unicode)) + case tui.BorderRounded, tui.BorderSharp: + t.border = t.tui.NewWindow( + marginInt[0]-1, marginInt[3]-2, width+4, height+2, + false, tui.MakeBorderStyle(t.borderShape, t.unicode)) + } + + // Add padding + for idx, val := range paddingInt { + marginInt[idx] += val + } + width = screenWidth - marginInt[1] - marginInt[3] + height = screenHeight - marginInt[0] - marginInt[2] + + noBorder := tui.MakeBorderStyle(tui.BorderNone, t.unicode) + if previewVisible { + createPreviewWindow := func(y int, x int, w int, h int) { + pwidth := w + pheight := h + var previewBorder tui.BorderStyle + if t.previewOpts.border == tui.BorderNone { + previewBorder = tui.MakeTransparentBorder() + } else { + previewBorder = tui.MakeBorderStyle(t.previewOpts.border, t.unicode) + } + t.pborder = t.tui.NewWindow(y, x, w, h, true, previewBorder) + switch t.previewOpts.border { + case tui.BorderSharp, tui.BorderRounded: + pwidth -= 4 + pheight -= 2 + x += 2 + y += 1 + case tui.BorderLeft: + pwidth -= 2 + x += 2 + case tui.BorderRight: + pwidth -= 2 + case tui.BorderTop: + pheight -= 1 + y += 1 + case tui.BorderBottom: + pheight -= 1 + case tui.BorderHorizontal: + pheight -= 2 + y += 1 + case tui.BorderVertical: + pwidth -= 4 + x += 2 + } + t.pwindow = t.tui.NewWindow(y, x, pwidth, pheight, true, noBorder) + } + verticalPad := 2 + minPreviewHeight := 3 + switch t.previewOpts.border { + case tui.BorderNone, tui.BorderVertical, tui.BorderLeft, tui.BorderRight: + verticalPad = 0 + minPreviewHeight = 1 + case tui.BorderTop, tui.BorderBottom: + verticalPad = 1 + minPreviewHeight = 2 + } + switch t.previewOpts.position { + case posUp: + pheight := calculateSize(height, t.previewOpts.size, minHeight, minPreviewHeight, verticalPad) + t.window = t.tui.NewWindow( + marginInt[0]+pheight, marginInt[3], width, height-pheight, false, noBorder) + createPreviewWindow(marginInt[0], marginInt[3], width, pheight) + case posDown: + pheight := calculateSize(height, t.previewOpts.size, minHeight, minPreviewHeight, verticalPad) + t.window = t.tui.NewWindow( + marginInt[0], marginInt[3], width, height-pheight, false, noBorder) + createPreviewWindow(marginInt[0]+height-pheight, marginInt[3], width, pheight) + case posLeft: + pwidth := calculateSize(width, t.previewOpts.size, minWidth, 5, 4) + t.window = t.tui.NewWindow( + marginInt[0], marginInt[3]+pwidth, width-pwidth, height, false, noBorder) + createPreviewWindow(marginInt[0], marginInt[3], pwidth, height) + case posRight: + pwidth := calculateSize(width, t.previewOpts.size, minWidth, 5, 4) + t.window = t.tui.NewWindow( + marginInt[0], marginInt[3], width-pwidth, height, false, noBorder) + createPreviewWindow(marginInt[0], marginInt[3]+width-pwidth, pwidth, height) + } + } else { + t.window = t.tui.NewWindow( + marginInt[0], + marginInt[3], + width, + height, false, noBorder) + } + for i := 0; i < t.window.Height(); i++ { + t.window.MoveAndClear(i, 0) + } +} + +func (t *Terminal) move(y int, x int, clear bool) { + h := t.window.Height() + + switch t.layout { + case layoutDefault: + y = h - y - 1 + case layoutReverseList: + n := 2 + len(t.header) + if t.noInfoLine() { + n-- + } + if y < n { + y = h - y - 1 + } else { + y -= n + } + } + + if clear { + t.window.MoveAndClear(y, x) + } else { + t.window.Move(y, x) + } +} + +func (t *Terminal) truncateQuery() { + t.input, _ = t.trimRight(t.input, maxPatternLength) + t.cx = util.Constrain(t.cx, 0, len(t.input)) +} + +func (t *Terminal) updatePromptOffset() ([]rune, []rune) { + maxWidth := util.Max(1, t.window.Width()-t.promptLen-1) + + _, overflow := t.trimLeft(t.input[:t.cx], maxWidth) + minOffset := int(overflow) + maxOffset := util.Min(util.Min(len(t.input), minOffset+maxWidth), t.cx) + + t.xoffset = util.Constrain(t.xoffset, minOffset, maxOffset) + before, _ := t.trimLeft(t.input[t.xoffset:t.cx], maxWidth) + beforeLen := t.displayWidth(before) + after, _ := t.trimRight(t.input[t.cx:], maxWidth-beforeLen) + afterLen := t.displayWidth(after) + t.queryLen = [2]int{beforeLen, afterLen} + return before, after +} + +func (t *Terminal) promptLine() int { + if t.headerFirst { + max := t.window.Height() - 1 + if !t.noInfoLine() { + max-- + } + return util.Min(len(t.header0)+t.headerLines, max) + } + return 0 +} + +func (t *Terminal) placeCursor() { + t.move(t.promptLine(), t.promptLen+t.queryLen[0], false) +} + +func (t *Terminal) printPrompt() { + t.move(t.promptLine(), 0, true) + t.prompt() + + before, after := t.updatePromptOffset() + color := tui.ColInput + if t.paused { + color = tui.ColDisabled + } + t.window.CPrint(color, string(before)) + t.window.CPrint(color, string(after)) +} + +func (t *Terminal) trimMessage(message string, maxWidth int) string { + if len(message) <= maxWidth { + return message + } + runes, _ := t.trimRight([]rune(message), maxWidth-2) + return string(runes) + strings.Repeat(".", util.Constrain(maxWidth, 0, 2)) +} + +func (t *Terminal) printInfo() { + pos := 0 + line := t.promptLine() + switch t.infoStyle { + case infoDefault: + t.move(line+1, 0, true) + if t.reading { + duration := int64(spinnerDuration) + idx := (time.Now().UnixNano() % (duration * int64(len(t.spinner)))) / duration + t.window.CPrint(tui.ColSpinner, t.spinner[idx]) + } + t.move(line+1, 2, false) + pos = 2 + case infoInline: + pos = t.promptLen + t.queryLen[0] + t.queryLen[1] + 1 + if pos+len(" < ") > t.window.Width() { + return + } + t.move(line, pos, true) + if t.reading { + t.window.CPrint(tui.ColSpinner, " < ") + } else { + t.window.CPrint(tui.ColPrompt, " < ") + } + pos += len(" < ") + case infoHidden: + return + } + + found := t.merger.Length() + total := util.Max(found, t.count) + output := fmt.Sprintf("%d/%d", found, total) + if t.toggleSort { + if t.sort { + output += " +S" + } else { + output += " -S" + } + } + if t.multi > 0 { + if t.multi == maxMulti { + output += fmt.Sprintf(" (%d)", len(t.selected)) + } else { + output += fmt.Sprintf(" (%d/%d)", len(t.selected), t.multi) + } + } + if t.progress > 0 && t.progress < 100 { + output += fmt.Sprintf(" (%d%%)", t.progress) + } + if t.failed != nil && t.count == 0 { + output = fmt.Sprintf("[Command failed: %s]", *t.failed) + } + output = t.trimMessage(output, t.window.Width()-pos) + t.window.CPrint(tui.ColInfo, output) +} + +func (t *Terminal) printHeader() { + if len(t.header) == 0 { + return + } + max := t.window.Height() + if t.headerFirst { + max-- + if !t.noInfoLine() { + max-- + } + } + var state *ansiState + for idx, lineStr := range t.header { + line := idx + if !t.headerFirst { + line++ + if !t.noInfoLine() { + line++ + } + } + if line >= max { + continue + } + trimmed, colors, newState := extractColor(lineStr, state, nil) + state = newState + item := &Item{ + text: util.ToChars([]byte(trimmed)), + colors: colors} + + t.move(line, 2, true) + t.printHighlighted(Result{item: item}, + tui.ColHeader, tui.ColHeader, false, false) + } +} + +func (t *Terminal) printList() { + t.constrain() + + maxy := t.maxItems() + count := t.merger.Length() - t.offset + for j := 0; j < maxy; j++ { + i := j + if t.layout == layoutDefault { + i = maxy - 1 - j + } + line := i + 2 + len(t.header) + if t.noInfoLine() { + line-- + } + if i < count { + t.printItem(t.merger.Get(i+t.offset), line, i, i == t.cy-t.offset) + } else if t.prevLines[i] != emptyLine { + t.prevLines[i] = emptyLine + t.move(line, 0, true) + } + } +} + +func (t *Terminal) printItem(result Result, line int, i int, current bool) { + item := result.item + _, selected := t.selected[item.Index()] + label := "" + if t.jumping != jumpDisabled { + if i < len(t.jumpLabels) { + // Striped + current = i%2 == 0 + label = t.jumpLabels[i:i+1] + strings.Repeat(" ", t.pointerLen-1) + } + } else if current { + label = t.pointer + } + + // Avoid unnecessary redraw + newLine := itemLine{current: current, selected: selected, label: label, + result: result, queryLen: len(t.input), width: 0} + prevLine := t.prevLines[i] + if prevLine.current == newLine.current && + prevLine.selected == newLine.selected && + prevLine.label == newLine.label && + prevLine.queryLen == newLine.queryLen && + prevLine.result == newLine.result { + return + } + + t.move(line, 0, false) + if current { + if len(label) == 0 { + t.window.CPrint(tui.ColCurrentCursorEmpty, t.pointerEmpty) + } else { + t.window.CPrint(tui.ColCurrentCursor, label) + } + if selected { + t.window.CPrint(tui.ColCurrentSelected, t.marker) + } else { + t.window.CPrint(tui.ColCurrentSelectedEmpty, t.markerEmpty) + } + newLine.width = t.printHighlighted(result, tui.ColCurrent, tui.ColCurrentMatch, true, true) + } else { + if len(label) == 0 { + t.window.CPrint(tui.ColCursorEmpty, t.pointerEmpty) + } else { + t.window.CPrint(tui.ColCursor, label) + } + if selected { + t.window.CPrint(tui.ColSelected, t.marker) + } else { + t.window.Print(t.markerEmpty) + } + newLine.width = t.printHighlighted(result, tui.ColNormal, tui.ColMatch, false, true) + } + fillSpaces := prevLine.width - newLine.width + if fillSpaces > 0 { + t.window.Print(strings.Repeat(" ", fillSpaces)) + } + t.prevLines[i] = newLine +} + +func (t *Terminal) trimRight(runes []rune, width int) ([]rune, bool) { + // We start from the beginning to handle tab characters + width, overflowIdx := util.RunesWidth(runes, 0, t.tabstop, width) + if overflowIdx >= 0 { + return runes[:overflowIdx], true + } + return runes, false +} + +func (t *Terminal) displayWidthWithLimit(runes []rune, prefixWidth int, limit int) int { + width, _ := util.RunesWidth(runes, prefixWidth, t.tabstop, limit) + return width +} + +func (t *Terminal) trimLeft(runes []rune, width int) ([]rune, int32) { + width = util.Max(0, width) + var trimmed int32 + // Assume that each rune takes at least one column on screen + if len(runes) > width+2 { + diff := len(runes) - width - 2 + trimmed = int32(diff) + runes = runes[diff:] + } + + currentWidth := t.displayWidth(runes) + + for currentWidth > width && len(runes) > 0 { + runes = runes[1:] + trimmed++ + currentWidth = t.displayWidthWithLimit(runes, 2, width) + } + return runes, trimmed +} + +func (t *Terminal) overflow(runes []rune, max int) bool { + return t.displayWidthWithLimit(runes, 0, max) > max +} + +func (t *Terminal) printHighlighted(result Result, colBase tui.ColorPair, colMatch tui.ColorPair, current bool, match bool) int { + item := result.item + + // Overflow + text := make([]rune, item.text.Length()) + copy(text, item.text.ToRunes()) + matchOffsets := []Offset{} + var pos *[]int + if match && t.merger.pattern != nil { + _, matchOffsets, pos = t.merger.pattern.MatchItem(item, true, t.slab) + } + charOffsets := matchOffsets + if pos != nil { + charOffsets = make([]Offset, len(*pos)) + for idx, p := range *pos { + offset := Offset{int32(p), int32(p + 1)} + charOffsets[idx] = offset + } + sort.Sort(ByOrder(charOffsets)) + } + var maxe int + for _, offset := range charOffsets { + maxe = util.Max(maxe, int(offset[1])) + } + + offsets := result.colorOffsets(charOffsets, t.theme, colBase, colMatch, current) + maxWidth := t.window.Width() - (t.pointerLen + t.markerLen + 1) + maxe = util.Constrain(maxe+util.Min(maxWidth/2-2, t.hscrollOff), 0, len(text)) + displayWidth := t.displayWidthWithLimit(text, 0, maxWidth) + if displayWidth > maxWidth { + transformOffsets := func(diff int32) { + for idx, offset := range offsets { + b, e := offset.offset[0], offset.offset[1] + b += 2 - diff + e += 2 - diff + b = util.Max32(b, 2) + offsets[idx].offset[0] = b + offsets[idx].offset[1] = util.Max32(b, e) + } + } + if t.hscroll { + if t.keepRight && pos == nil { + trimmed, diff := t.trimLeft(text, maxWidth-2) + transformOffsets(diff) + text = append([]rune(ellipsis), trimmed...) + } else if !t.overflow(text[:maxe], maxWidth-2) { + // Stri.. + text, _ = t.trimRight(text, maxWidth-2) + text = append(text, []rune(ellipsis)...) + } else { + // Stri.. + if t.overflow(text[maxe:], 2) { + text = append(text[:maxe], []rune(ellipsis)...) + } + // ..ri.. + var diff int32 + text, diff = t.trimLeft(text, maxWidth-2) + + // Transform offsets + transformOffsets(diff) + text = append([]rune(ellipsis), text...) + } + } else { + text, _ = t.trimRight(text, maxWidth-2) + text = append(text, []rune(ellipsis)...) + + for idx, offset := range offsets { + offsets[idx].offset[0] = util.Min32(offset.offset[0], int32(maxWidth-2)) + offsets[idx].offset[1] = util.Min32(offset.offset[1], int32(maxWidth)) + } + } + displayWidth = t.displayWidthWithLimit(text, 0, displayWidth) + } + + var index int32 + var substr string + var prefixWidth int + maxOffset := int32(len(text)) + for _, offset := range offsets { + b := util.Constrain32(offset.offset[0], index, maxOffset) + e := util.Constrain32(offset.offset[1], index, maxOffset) + + substr, prefixWidth = t.processTabs(text[index:b], prefixWidth) + t.window.CPrint(colBase, substr) + + if b < e { + substr, prefixWidth = t.processTabs(text[b:e], prefixWidth) + t.window.CPrint(offset.color, substr) + } + + index = e + if index >= maxOffset { + break + } + } + if index < maxOffset { + substr, _ = t.processTabs(text[index:], prefixWidth) + t.window.CPrint(colBase, substr) + } + return displayWidth +} + +func (t *Terminal) renderPreviewSpinner() { + numLines := len(t.previewer.lines) + spin := t.previewer.spinner + if len(spin) > 0 || t.previewer.scrollable { + maxWidth := t.pwindow.Width() + if !t.previewer.scrollable { + if maxWidth > 0 { + t.pwindow.Move(0, maxWidth-1) + t.pwindow.CPrint(tui.ColSpinner, spin) + } + } else { + offsetString := fmt.Sprintf("%d/%d", t.previewer.offset+1, numLines) + if len(spin) > 0 { + spin += " " + maxWidth -= 2 + } + offsetRunes, _ := t.trimRight([]rune(offsetString), maxWidth) + pos := maxWidth - t.displayWidth(offsetRunes) + t.pwindow.Move(0, pos) + if maxWidth > 0 { + t.pwindow.CPrint(tui.ColSpinner, spin) + t.pwindow.CPrint(tui.ColInfo.WithAttr(tui.Reverse), string(offsetRunes)) + } + } + } +} + +func (t *Terminal) renderPreviewArea(unchanged bool) { + if unchanged { + t.pwindow.MoveAndClear(0, 0) // Clear scroll offset display + } else { + t.previewed.filled = false + t.pwindow.Erase() + } + + height := t.pwindow.Height() + header := []string{} + body := t.previewer.lines + headerLines := t.previewOpts.headerLines + // Do not enable preview header lines if it's value is too large + if headerLines > 0 && headerLines < util.Min(len(body), height) { + header = t.previewer.lines[0:headerLines] + body = t.previewer.lines[headerLines:] + // Always redraw header + t.renderPreviewText(height, header, 0, false) + t.pwindow.MoveAndClear(t.pwindow.Y(), 0) + } + t.renderPreviewText(height, body, -t.previewer.offset+headerLines, unchanged) + + if !unchanged { + t.pwindow.FinishFill() + } +} + +func (t *Terminal) renderPreviewText(height int, lines []string, lineNo int, unchanged bool) { + maxWidth := t.pwindow.Width() + var ansi *ansiState + for _, line := range lines { + var lbg tui.Color = -1 + if ansi != nil { + ansi.lbg = -1 + } + line = strings.TrimSuffix(line, "\n") + if lineNo >= height || t.pwindow.Y() == height-1 && t.pwindow.X() > 0 { + t.previewed.filled = true + break + } else if lineNo >= 0 { + var fillRet tui.FillReturn + prefixWidth := 0 + _, _, ansi = extractColor(line, ansi, func(str string, ansi *ansiState) bool { + trimmed := []rune(str) + isTrimmed := false + if !t.previewOpts.wrap { + trimmed, isTrimmed = t.trimRight(trimmed, maxWidth-t.pwindow.X()) + } + str, width := t.processTabs(trimmed, prefixWidth) + prefixWidth += width + if t.theme.Colored && ansi != nil && ansi.colored() { + lbg = ansi.lbg + fillRet = t.pwindow.CFill(ansi.fg, ansi.bg, ansi.attr, str) + } else { + fillRet = t.pwindow.CFill(tui.ColPreview.Fg(), tui.ColPreview.Bg(), tui.AttrRegular, str) + } + return !isTrimmed && + (fillRet == tui.FillContinue || t.previewOpts.wrap && fillRet == tui.FillNextLine) + }) + t.previewer.scrollable = t.previewer.scrollable || t.pwindow.Y() == height-1 && t.pwindow.X() == t.pwindow.Width() + if fillRet == tui.FillNextLine { + continue + } else if fillRet == tui.FillSuspend { + t.previewed.filled = true + break + } + if unchanged && lineNo == 0 { + break + } + if lbg >= 0 { + t.pwindow.CFill(-1, lbg, tui.AttrRegular, + strings.Repeat(" ", t.pwindow.Width()-t.pwindow.X())+"\n") + } else { + t.pwindow.Fill("\n") + } + } + lineNo++ + } +} + +func (t *Terminal) printPreview() { + if !t.hasPreviewWindow() { + return + } + numLines := len(t.previewer.lines) + height := t.pwindow.Height() + unchanged := (t.previewed.filled || numLines == t.previewed.numLines) && + t.previewer.version == t.previewed.version && + t.previewer.offset == t.previewed.offset + t.previewer.scrollable = t.previewer.offset > 0 || numLines > height + t.renderPreviewArea(unchanged) + t.renderPreviewSpinner() + t.previewed.numLines = numLines + t.previewed.version = t.previewer.version + t.previewed.offset = t.previewer.offset +} + +func (t *Terminal) printPreviewDelayed() { + if !t.hasPreviewWindow() || len(t.previewer.lines) > 0 && t.previewed.version == t.previewer.version { + return + } + + t.previewer.scrollable = false + t.renderPreviewArea(true) + + message := t.trimMessage("Loading ..", t.pwindow.Width()) + pos := t.pwindow.Width() - len(message) + t.pwindow.Move(0, pos) + t.pwindow.CPrint(tui.ColInfo.WithAttr(tui.Reverse), message) +} + +func (t *Terminal) processTabs(runes []rune, prefixWidth int) (string, int) { + var strbuf strings.Builder + l := prefixWidth + gr := uniseg.NewGraphemes(string(runes)) + for gr.Next() { + rs := gr.Runes() + str := string(rs) + var w int + if len(rs) == 1 && rs[0] == '\t' { + w = t.tabstop - l%t.tabstop + strbuf.WriteString(strings.Repeat(" ", w)) + } else { + w = runewidth.StringWidth(str) + strbuf.WriteString(str) + } + l += w + } + return strbuf.String(), l +} + +func (t *Terminal) printAll() { + t.resizeWindows() + t.printList() + t.printPrompt() + t.printInfo() + t.printHeader() + t.printPreview() +} + +func (t *Terminal) refresh() { + t.placeCursor() + if !t.suppress { + windows := make([]tui.Window, 0, 4) + if t.borderShape != tui.BorderNone { + windows = append(windows, t.border) + } + if t.hasPreviewWindow() { + if t.pborder != nil { + windows = append(windows, t.pborder) + } + windows = append(windows, t.pwindow) + } + windows = append(windows, t.window) + t.tui.RefreshWindows(windows) + } +} + +func (t *Terminal) delChar() bool { + if len(t.input) > 0 && t.cx < len(t.input) { + t.input = append(t.input[:t.cx], t.input[t.cx+1:]...) + return true + } + return false +} + +func findLastMatch(pattern string, str string) int { + rx, err := regexp.Compile(pattern) + if err != nil { + return -1 + } + locs := rx.FindAllStringIndex(str, -1) + if locs == nil { + return -1 + } + prefix := []rune(str[:locs[len(locs)-1][0]]) + return len(prefix) +} + +func findFirstMatch(pattern string, str string) int { + rx, err := regexp.Compile(pattern) + if err != nil { + return -1 + } + loc := rx.FindStringIndex(str) + if loc == nil { + return -1 + } + prefix := []rune(str[:loc[0]]) + return len(prefix) +} + +func copySlice(slice []rune) []rune { + ret := make([]rune, len(slice)) + copy(ret, slice) + return ret +} + +func (t *Terminal) rubout(pattern string) { + pcx := t.cx + after := t.input[t.cx:] + t.cx = findLastMatch(pattern, string(t.input[:t.cx])) + 1 + t.yanked = copySlice(t.input[t.cx:pcx]) + t.input = append(t.input[:t.cx], after...) +} + +func keyMatch(key tui.Event, event tui.Event) bool { + return event.Type == key.Type && event.Char == key.Char || + key.Type == tui.DoubleClick && event.Type == tui.Mouse && event.MouseEvent.Double +} + +func parsePlaceholder(match string) (bool, string, placeholderFlags) { + flags := placeholderFlags{} + + if match[0] == '\\' { + // Escaped placeholder pattern + return true, match[1:], flags + } + + skipChars := 1 + for _, char := range match[1:] { + switch char { + case '+': + flags.plus = true + skipChars++ + case 's': + flags.preserveSpace = true + skipChars++ + case 'n': + flags.number = true + skipChars++ + case 'f': + flags.file = true + skipChars++ + case 'q': + flags.query = true + // query flag is not skipped + default: + break + } + } + + matchWithoutFlags := "{" + match[skipChars:] + + return false, matchWithoutFlags, flags +} + +func hasPreviewFlags(template string) (slot bool, plus bool, query bool) { + for _, match := range placeholder.FindAllString(template, -1) { + _, _, flags := parsePlaceholder(match) + if flags.plus { + plus = true + } + if flags.query { + query = true + } + slot = true + } + return +} + +func writeTemporaryFile(data []string, printSep string) string { + f, err := ioutil.TempFile("", "fzf-preview-*") + if err != nil { + errorExit("Unable to create temporary file") + } + defer f.Close() + + f.WriteString(strings.Join(data, printSep)) + f.WriteString(printSep) + activeTempFiles = append(activeTempFiles, f.Name()) + return f.Name() +} + +func cleanTemporaryFiles() { + for _, filename := range activeTempFiles { + os.Remove(filename) + } + activeTempFiles = []string{} +} + +func (t *Terminal) replacePlaceholder(template string, forcePlus bool, input string, list []*Item) string { + return replacePlaceholder( + template, t.ansi, t.delimiter, t.printsep, forcePlus, input, list) +} + +func (t *Terminal) evaluateScrollOffset(list []*Item, height int) int { + offsetExpr := offsetTrimCharsRegex.ReplaceAllString( + t.replacePlaceholder(t.previewOpts.scroll, false, "", list), "") + + atoi := func(s string) int { + n, e := strconv.Atoi(s) + if e != nil { + return 0 + } + return n + } + + base := -1 + for _, component := range offsetComponentRegex.FindAllString(offsetExpr, -1) { + if strings.HasPrefix(component, "-/") { + component = component[1:] + } + if component[0] == '/' { + denom := atoi(component[1:]) + if denom == 0 { + return base + } + return base - height/denom + } + base += atoi(component) + } + return base +} + +func replacePlaceholder(template string, stripAnsi bool, delimiter Delimiter, printsep string, forcePlus bool, query string, allItems []*Item) string { + current := allItems[:1] + selected := allItems[1:] + if current[0] == nil { + current = []*Item{} + } + if selected[0] == nil { + selected = []*Item{} + } + + // replace placeholders one by one + return placeholder.ReplaceAllStringFunc(template, func(match string) string { + escaped, match, flags := parsePlaceholder(match) + + // this function implements the effects a placeholder has on items + var replace func(*Item) string + + // placeholder types (escaped, query type, item type, token type) + switch { + case escaped: + return match + case match == "{q}": + return quoteEntry(query) + case match == "{}": + replace = func(item *Item) string { + switch { + case flags.number: + n := int(item.text.Index) + if n < 0 { + return "" + } + return strconv.Itoa(n) + case flags.file: + return item.AsString(stripAnsi) + default: + return quoteEntry(item.AsString(stripAnsi)) + } + } + default: + // token type and also failover (below) + rangeExpressions := strings.Split(match[1:len(match)-1], ",") + ranges := make([]Range, len(rangeExpressions)) + for idx, s := range rangeExpressions { + r, ok := ParseRange(&s) // ellipsis (x..y) and shorthand (x..x) range syntax + if !ok { + // Invalid expression, just return the original string in the template + return match + } + ranges[idx] = r + } + + replace = func(item *Item) string { + tokens := Tokenize(item.AsString(stripAnsi), delimiter) + trans := Transform(tokens, ranges) + str := joinTokens(trans) + + // trim the last delimiter + if delimiter.str != nil { + str = strings.TrimSuffix(str, *delimiter.str) + } else if delimiter.regex != nil { + delims := delimiter.regex.FindAllStringIndex(str, -1) + // make sure the delimiter is at the very end of the string + if len(delims) > 0 && delims[len(delims)-1][1] == len(str) { + str = str[:delims[len(delims)-1][0]] + } + } + + if !flags.preserveSpace { + str = strings.TrimSpace(str) + } + if !flags.file { + str = quoteEntry(str) + } + return str + } + } + + // apply 'replace' function over proper set of items and return result + + items := current + if flags.plus || forcePlus { + items = selected + } + replacements := make([]string, len(items)) + + for idx, item := range items { + replacements[idx] = replace(item) + } + + if flags.file { + return writeTemporaryFile(replacements, printsep) + } + return strings.Join(replacements, " ") + }) +} + +func (t *Terminal) redraw() { + t.tui.Clear() + t.tui.Refresh() + t.printAll() +} + +func (t *Terminal) executeCommand(template string, forcePlus bool, background bool) { + valid, list := t.buildPlusList(template, forcePlus) + if !valid { + return + } + command := t.replacePlaceholder(template, forcePlus, string(t.input), list) + cmd := util.ExecCommand(command, false) + t.executing.Set(true) + if !background { + cmd.Stdin = tui.TtyIn() + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + t.tui.Pause(true) + cmd.Run() + t.tui.Resume(true, false) + t.redraw() + t.refresh() + } else { + t.tui.Pause(false) + cmd.Run() + t.tui.Resume(false, false) + } + t.executing.Set(false) + cleanTemporaryFiles() +} + +func (t *Terminal) hasPreviewer() bool { + return t.previewBox != nil +} + +func (t *Terminal) isPreviewEnabled() bool { + return t.hasPreviewer() && t.previewer.enabled +} + +func (t *Terminal) hasPreviewWindow() bool { + return t.pwindow != nil && t.isPreviewEnabled() +} + +func (t *Terminal) currentItem() *Item { + cnt := t.merger.Length() + if t.cy >= 0 && cnt > 0 && cnt > t.cy { + return t.merger.Get(t.cy).item + } + return nil +} + +func (t *Terminal) buildPlusList(template string, forcePlus bool) (bool, []*Item) { + current := t.currentItem() + slot, plus, query := hasPreviewFlags(template) + if !(!slot || query && len(t.input) > 0 || (forcePlus || plus) && len(t.selected) > 0) { + return current != nil, []*Item{current, current} + } + + // We would still want to update preview window even if there is no match if + // 1. command template contains {q} and the query string is not empty + // 2. or it contains {+} and we have more than one item already selected. + // To do so, we pass an empty Item instead of nil to trigger an update. + if current == nil { + current = &minItem + } + + var sels []*Item + if len(t.selected) == 0 { + sels = []*Item{current, current} + } else { + sels = make([]*Item, len(t.selected)+1) + sels[0] = current + for i, sel := range t.sortSelected() { + sels[i+1] = sel.item + } + } + return true, sels +} + +func (t *Terminal) selectItem(item *Item) bool { + if len(t.selected) >= t.multi { + return false + } + if _, found := t.selected[item.Index()]; found { + return true + } + + t.selected[item.Index()] = selectedItem{time.Now(), item} + t.version++ + + return true +} + +func (t *Terminal) selectItemChanged(item *Item) bool { + if _, found := t.selected[item.Index()]; found { + return false + } + return t.selectItem(item) +} + +func (t *Terminal) deselectItem(item *Item) { + delete(t.selected, item.Index()) + t.version++ +} + +func (t *Terminal) deselectItemChanged(item *Item) bool { + if _, found := t.selected[item.Index()]; found { + t.deselectItem(item) + return true + } + return false +} + +func (t *Terminal) toggleItem(item *Item) bool { + if _, found := t.selected[item.Index()]; !found { + return t.selectItem(item) + } + t.deselectItem(item) + return true +} + +func (t *Terminal) killPreview(code int) { + select { + case t.killChan <- code: + default: + if code != exitCancel { + t.eventBox.Set(EvtQuit, code) + } + } +} + +func (t *Terminal) cancelPreview() { + t.killPreview(exitCancel) +} + +// Loop is called to start Terminal I/O +func (t *Terminal) Loop() { + // prof := profile.Start(profile.ProfilePath("/tmp/")) + <-t.startChan + { // Late initialization + intChan := make(chan os.Signal, 1) + signal.Notify(intChan, os.Interrupt, syscall.SIGTERM) + go func() { + for s := range intChan { + // Don't quit by SIGINT while executing because it should be for the executing command and not for fzf itself + if !(s == os.Interrupt && t.executing.Get()) { + t.reqBox.Set(reqQuit, nil) + } + } + }() + + contChan := make(chan os.Signal, 1) + notifyOnCont(contChan) + go func() { + for { + <-contChan + t.reqBox.Set(reqReinit, nil) + } + }() + + resizeChan := make(chan os.Signal, 1) + notifyOnResize(resizeChan) // Non-portable + go func() { + for { + <-resizeChan + t.reqBox.Set(reqRedraw, nil) + } + }() + + t.mutex.Lock() + t.initFunc() + t.resizeWindows() + t.printPrompt() + t.printInfo() + t.printHeader() + t.refresh() + t.mutex.Unlock() + go func() { + timer := time.NewTimer(t.initDelay) + <-timer.C + t.reqBox.Set(reqRefresh, nil) + }() + + // Keep the spinner spinning + go func() { + for { + t.mutex.Lock() + reading := t.reading + t.mutex.Unlock() + time.Sleep(spinnerDuration) + if reading { + t.reqBox.Set(reqInfo, nil) + } + } + }() + } + + if t.hasPreviewer() { + go func() { + var version int64 + for { + var items []*Item + var commandTemplate string + var pwindow tui.Window + t.previewBox.Wait(func(events *util.Events) { + for req, value := range *events { + switch req { + case reqPreviewEnqueue: + request := value.(previewRequest) + commandTemplate = request.template + items = request.list + pwindow = request.pwindow + } + } + events.Clear() + }) + version++ + // We don't display preview window if no match + if items[0] != nil { + _, query := t.Input() + command := t.replacePlaceholder(commandTemplate, false, string(query), items) + initialOffset := 0 + cmd := util.ExecCommand(command, true) + if pwindow != nil { + height := pwindow.Height() + initialOffset = util.Max(0, t.evaluateScrollOffset(items, util.Max(0, height-t.previewOpts.headerLines))) + env := os.Environ() + lines := fmt.Sprintf("LINES=%d", height) + columns := fmt.Sprintf("COLUMNS=%d", pwindow.Width()) + env = append(env, lines) + env = append(env, "FZF_PREVIEW_"+lines) + env = append(env, columns) + env = append(env, "FZF_PREVIEW_"+columns) + cmd.Env = env + } + + out, _ := cmd.StdoutPipe() + cmd.Stderr = cmd.Stdout + reader := bufio.NewReader(out) + eofChan := make(chan bool) + finishChan := make(chan bool, 1) + err := cmd.Start() + if err == nil { + reapChan := make(chan bool) + lineChan := make(chan eachLine) + // Goroutine 1 reads process output + go func() { + for { + line, err := reader.ReadString('\n') + lineChan <- eachLine{line, err} + if err != nil { + break + } + } + eofChan <- true + }() + + // Goroutine 2 periodically requests rendering + rendered := util.NewAtomicBool(false) + go func(version int64) { + lines := []string{} + spinner := makeSpinner(t.unicode) + spinnerIndex := -1 // Delay initial rendering by an extra tick + ticker := time.NewTicker(previewChunkDelay) + offset := initialOffset + Loop: + for { + select { + case <-ticker.C: + if len(lines) > 0 && len(lines) >= initialOffset { + if spinnerIndex >= 0 { + spin := spinner[spinnerIndex%len(spinner)] + t.reqBox.Set(reqPreviewDisplay, previewResult{version, lines, offset, spin}) + rendered.Set(true) + offset = -1 + } + spinnerIndex++ + } + case eachLine := <-lineChan: + line := eachLine.line + err := eachLine.err + if len(line) > 0 { + clearIndex := strings.Index(line, clearCode) + if clearIndex >= 0 { + lines = []string{} + line = line[clearIndex+len(clearCode):] + version-- + offset = 0 + } + lines = append(lines, line) + } + if err != nil { + t.reqBox.Set(reqPreviewDisplay, previewResult{version, lines, offset, ""}) + rendered.Set(true) + break Loop + } + } + } + ticker.Stop() + reapChan <- true + }(version) + + // Goroutine 3 is responsible for cancelling running preview command + go func(version int64) { + timer := time.NewTimer(previewDelayed) + Loop: + for { + select { + case <-timer.C: + t.reqBox.Set(reqPreviewDelayed, version) + case code := <-t.killChan: + if code != exitCancel { + util.KillCommand(cmd) + t.eventBox.Set(EvtQuit, code) + } else { + // We can immediately kill a long-running preview program + // once we started rendering its partial output + delay := previewCancelWait + if rendered.Get() { + delay = 0 + } + timer := time.NewTimer(delay) + select { + case <-timer.C: + util.KillCommand(cmd) + case <-finishChan: + } + timer.Stop() + } + break Loop + case <-finishChan: + break Loop + } + } + timer.Stop() + reapChan <- true + }(version) + + <-eofChan // Goroutine 1 finished + cmd.Wait() // NOTE: We should not call Wait before EOF + finishChan <- true // Tell Goroutine 3 to stop + <-reapChan // Goroutine 2 and 3 finished + <-reapChan + } else { + // Failed to start the command. Report the error immediately. + t.reqBox.Set(reqPreviewDisplay, previewResult{version, []string{err.Error()}, 0, ""}) + } + + cleanTemporaryFiles() + } else { + t.reqBox.Set(reqPreviewDisplay, previewResult{version, nil, 0, ""}) + } + } + }() + } + + refreshPreview := func(command string) { + if len(command) > 0 && t.isPreviewEnabled() { + _, list := t.buildPlusList(command, false) + t.cancelPreview() + t.previewBox.Set(reqPreviewEnqueue, previewRequest{command, t.pwindow, list}) + } + } + + go func() { + var focusedIndex int32 = minItem.Index() + var version int64 = -1 + running := true + code := exitError + exit := func(getCode func() int) { + t.tui.Close() + code = getCode() + if code <= exitNoMatch && t.history != nil { + t.history.append(string(t.input)) + } + running = false + t.mutex.Unlock() + } + + for running { + t.reqBox.Wait(func(events *util.Events) { + defer events.Clear() + t.mutex.Lock() + for req, value := range *events { + switch req { + case reqPrompt: + t.printPrompt() + if t.noInfoLine() { + t.printInfo() + } + case reqInfo: + t.printInfo() + case reqList: + t.printList() + var currentIndex int32 = minItem.Index() + currentItem := t.currentItem() + if currentItem != nil { + currentIndex = currentItem.Index() + } + if focusedIndex != currentIndex || version != t.version { + version = t.version + focusedIndex = currentIndex + refreshPreview(t.previewOpts.command) + } + case reqJump: + if t.merger.Length() == 0 { + t.jumping = jumpDisabled + } + t.printList() + case reqHeader: + t.printHeader() + case reqRefresh: + t.suppress = false + case reqReinit: + t.tui.Resume(t.fullscreen, t.sigstop) + t.redraw() + case reqRedraw: + t.redraw() + case reqClose: + exit(func() int { + if t.output() { + return exitOk + } + return exitNoMatch + }) + return + case reqPreviewDisplay: + result := value.(previewResult) + if t.previewer.version != result.version { + t.previewer.version = result.version + t.previewer.following = t.previewOpts.follow + } + t.previewer.lines = result.lines + t.previewer.spinner = result.spinner + if t.previewer.following { + t.previewer.offset = len(t.previewer.lines) - t.pwindow.Height() + } else if result.offset >= 0 { + t.previewer.offset = util.Constrain(result.offset, t.previewOpts.headerLines, len(t.previewer.lines)-1) + } + t.printPreview() + case reqPreviewRefresh: + t.printPreview() + case reqPreviewDelayed: + t.previewer.version = value.(int64) + t.printPreviewDelayed() + case reqPrintQuery: + exit(func() int { + t.printer(string(t.input)) + return exitOk + }) + return + case reqQuit: + exit(func() int { return exitInterrupt }) + return + } + } + t.refresh() + t.mutex.Unlock() + }) + } + // prof.Stop() + t.killPreview(code) + }() + + looping := true + for looping { + var newCommand *string + changed := false + beof := false + queryChanged := false + + event := t.tui.GetChar() + + t.mutex.Lock() + previousInput := t.input + previousCx := t.cx + events := []util.EventType{} + req := func(evts ...util.EventType) { + for _, event := range evts { + events = append(events, event) + if event == reqClose || event == reqQuit { + looping = false + } + } + } + togglePreview := func(enabled bool) { + if t.previewer.enabled != enabled { + t.previewer.enabled = enabled + t.tui.Clear() + t.resizeWindows() + req(reqPrompt, reqList, reqInfo, reqHeader) + } + } + toggle := func() bool { + current := t.currentItem() + if current != nil && t.toggleItem(current) { + req(reqInfo) + return true + } + return false + } + scrollPreviewTo := func(newOffset int) { + if !t.previewer.scrollable { + return + } + t.previewer.following = false + numLines := len(t.previewer.lines) + if t.previewOpts.cycle { + newOffset = (newOffset + numLines) % numLines + } + newOffset = util.Constrain(newOffset, t.previewOpts.headerLines, numLines-1) + if t.previewer.offset != newOffset { + t.previewer.offset = newOffset + req(reqPreviewRefresh) + } + } + scrollPreviewBy := func(amount int) { + scrollPreviewTo(t.previewer.offset + amount) + } + for key, ret := range t.expect { + if keyMatch(key, event) { + t.pressed = ret + t.reqBox.Set(reqClose, nil) + t.mutex.Unlock() + return + } + } + + actionsFor := func(eventType tui.EventType) []action { + return t.keymap[eventType.AsEvent()] + } + + var doAction func(action) bool + doActions := func(actions []action) bool { + for _, action := range actions { + if !doAction(action) { + return false + } + } + return true + } + doAction = func(a action) bool { + switch a.t { + case actIgnore: + case actExecute, actExecuteSilent: + t.executeCommand(a.a, false, a.t == actExecuteSilent) + case actExecuteMulti: + t.executeCommand(a.a, true, false) + case actInvalid: + t.mutex.Unlock() + return false + case actTogglePreview: + if t.hasPreviewer() { + togglePreview(!t.previewer.enabled) + if t.previewer.enabled { + valid, list := t.buildPlusList(t.previewOpts.command, false) + if valid { + t.cancelPreview() + t.previewBox.Set(reqPreviewEnqueue, + previewRequest{t.previewOpts.command, t.pwindow, list}) + } + } + } + case actTogglePreviewWrap: + if t.hasPreviewWindow() { + t.previewOpts.wrap = !t.previewOpts.wrap + // Reset preview version so that full redraw occurs + t.previewed.version = 0 + req(reqPreviewRefresh) + } + case actToggleSort: + t.sort = !t.sort + changed = true + case actPreviewTop: + if t.hasPreviewWindow() { + scrollPreviewTo(0) + } + case actPreviewBottom: + if t.hasPreviewWindow() { + scrollPreviewTo(len(t.previewer.lines) - t.pwindow.Height()) + } + case actPreviewUp: + if t.hasPreviewWindow() { + scrollPreviewBy(-1) + } + case actPreviewDown: + if t.hasPreviewWindow() { + scrollPreviewBy(1) + } + case actPreviewPageUp: + if t.hasPreviewWindow() { + scrollPreviewBy(-t.pwindow.Height()) + } + case actPreviewPageDown: + if t.hasPreviewWindow() { + scrollPreviewBy(t.pwindow.Height()) + } + case actPreviewHalfPageUp: + if t.hasPreviewWindow() { + scrollPreviewBy(-t.pwindow.Height() / 2) + } + case actPreviewHalfPageDown: + if t.hasPreviewWindow() { + scrollPreviewBy(t.pwindow.Height() / 2) + } + case actBeginningOfLine: + t.cx = 0 + case actBackwardChar: + if t.cx > 0 { + t.cx-- + } + case actPrintQuery: + req(reqPrintQuery) + case actChangePrompt: + t.prompt, t.promptLen = t.parsePrompt(a.a) + req(reqPrompt) + case actPreview: + togglePreview(true) + refreshPreview(a.a) + case actRefreshPreview: + refreshPreview(t.previewOpts.command) + case actReplaceQuery: + current := t.currentItem() + if current != nil { + t.input = current.text.ToRunes() + t.cx = len(t.input) + } + case actAbort: + req(reqQuit) + case actDeleteChar: + t.delChar() + case actDeleteCharEOF: + if !t.delChar() && t.cx == 0 { + req(reqQuit) + } + case actEndOfLine: + t.cx = len(t.input) + case actCancel: + if len(t.input) == 0 { + req(reqQuit) + } else { + t.yanked = t.input + t.input = []rune{} + t.cx = 0 + } + case actBackwardDeleteCharEOF: + if len(t.input) == 0 { + req(reqQuit) + } else if t.cx > 0 { + t.input = append(t.input[:t.cx-1], t.input[t.cx:]...) + t.cx-- + } + case actForwardChar: + if t.cx < len(t.input) { + t.cx++ + } + case actBackwardDeleteChar: + beof = len(t.input) == 0 + if t.cx > 0 { + t.input = append(t.input[:t.cx-1], t.input[t.cx:]...) + t.cx-- + } + case actSelectAll: + if t.multi > 0 { + for i := 0; i < t.merger.Length(); i++ { + if !t.selectItem(t.merger.Get(i).item) { + break + } + } + req(reqList, reqInfo) + } + case actDeselectAll: + if t.multi > 0 { + for i := 0; i < t.merger.Length() && len(t.selected) > 0; i++ { + t.deselectItem(t.merger.Get(i).item) + } + req(reqList, reqInfo) + } + case actClose: + if t.isPreviewEnabled() { + togglePreview(false) + } else { + req(reqQuit) + } + case actSelect: + current := t.currentItem() + if t.multi > 0 && current != nil && t.selectItemChanged(current) { + req(reqList, reqInfo) + } + case actDeselect: + current := t.currentItem() + if t.multi > 0 && current != nil && t.deselectItemChanged(current) { + req(reqList, reqInfo) + } + case actToggle: + if t.multi > 0 && t.merger.Length() > 0 && toggle() { + req(reqList) + } + case actToggleAll: + if t.multi > 0 { + prevIndexes := make(map[int]struct{}) + for i := 0; i < t.merger.Length() && len(t.selected) > 0; i++ { + item := t.merger.Get(i).item + if _, found := t.selected[item.Index()]; found { + prevIndexes[i] = struct{}{} + t.deselectItem(item) + } + } + + for i := 0; i < t.merger.Length(); i++ { + if _, found := prevIndexes[i]; !found { + item := t.merger.Get(i).item + if !t.selectItem(item) { + break + } + } + } + req(reqList, reqInfo) + } + case actToggleIn: + if t.layout != layoutDefault { + return doAction(action{t: actToggleUp}) + } + return doAction(action{t: actToggleDown}) + case actToggleOut: + if t.layout != layoutDefault { + return doAction(action{t: actToggleDown}) + } + return doAction(action{t: actToggleUp}) + case actToggleDown: + if t.multi > 0 && t.merger.Length() > 0 && toggle() { + t.vmove(-1, true) + req(reqList) + } + case actToggleUp: + if t.multi > 0 && t.merger.Length() > 0 && toggle() { + t.vmove(1, true) + req(reqList) + } + case actDown: + t.vmove(-1, true) + req(reqList) + case actUp: + t.vmove(1, true) + req(reqList) + case actAccept: + req(reqClose) + case actAcceptNonEmpty: + if len(t.selected) > 0 || t.merger.Length() > 0 || !t.reading && t.count == 0 { + req(reqClose) + } + case actClearScreen: + req(reqRedraw) + case actClearQuery: + t.input = []rune{} + t.cx = 0 + case actClearSelection: + if t.multi > 0 { + t.selected = make(map[int32]selectedItem) + t.version++ + req(reqList, reqInfo) + } + case actFirst: + t.vset(0) + req(reqList) + case actLast: + t.vset(t.merger.Length() - 1) + req(reqList) + case actUnixLineDiscard: + beof = len(t.input) == 0 + if t.cx > 0 { + t.yanked = copySlice(t.input[:t.cx]) + t.input = t.input[t.cx:] + t.cx = 0 + } + case actUnixWordRubout: + beof = len(t.input) == 0 + if t.cx > 0 { + t.rubout("\\s\\S") + } + case actBackwardKillWord: + beof = len(t.input) == 0 + if t.cx > 0 { + t.rubout(t.wordRubout) + } + case actYank: + suffix := copySlice(t.input[t.cx:]) + t.input = append(append(t.input[:t.cx], t.yanked...), suffix...) + t.cx += len(t.yanked) + case actPageUp: + t.vmove(t.maxItems()-1, false) + req(reqList) + case actPageDown: + t.vmove(-(t.maxItems() - 1), false) + req(reqList) + case actHalfPageUp: + t.vmove(t.maxItems()/2, false) + req(reqList) + case actHalfPageDown: + t.vmove(-(t.maxItems() / 2), false) + req(reqList) + case actJump: + t.jumping = jumpEnabled + req(reqJump) + case actJumpAccept: + t.jumping = jumpAcceptEnabled + req(reqJump) + case actBackwardWord: + t.cx = findLastMatch(t.wordRubout, string(t.input[:t.cx])) + 1 + case actForwardWord: + t.cx += findFirstMatch(t.wordNext, string(t.input[t.cx:])) + 1 + case actKillWord: + ncx := t.cx + + findFirstMatch(t.wordNext, string(t.input[t.cx:])) + 1 + if ncx > t.cx { + t.yanked = copySlice(t.input[t.cx:ncx]) + t.input = append(t.input[:t.cx], t.input[ncx:]...) + } + case actKillLine: + if t.cx < len(t.input) { + t.yanked = copySlice(t.input[t.cx:]) + t.input = t.input[:t.cx] + } + case actRune: + prefix := copySlice(t.input[:t.cx]) + t.input = append(append(prefix, event.Char), t.input[t.cx:]...) + t.cx++ + case actPreviousHistory: + if t.history != nil { + t.history.override(string(t.input)) + t.input = trimQuery(t.history.previous()) + t.cx = len(t.input) + } + case actNextHistory: + if t.history != nil { + t.history.override(string(t.input)) + t.input = trimQuery(t.history.next()) + t.cx = len(t.input) + } + case actToggleSearch: + t.paused = !t.paused + changed = !t.paused + req(reqPrompt) + case actEnableSearch: + t.paused = false + changed = true + req(reqPrompt) + case actDisableSearch: + t.paused = true + req(reqPrompt) + case actSigStop: + p, err := os.FindProcess(os.Getpid()) + if err == nil { + t.sigstop = true + t.tui.Clear() + t.tui.Pause(t.fullscreen) + notifyStop(p) + t.mutex.Unlock() + return false + } + case actMouse: + me := event.MouseEvent + mx, my := me.X, me.Y + if me.S != 0 { + // Scroll + if t.window.Enclose(my, mx) && t.merger.Length() > 0 { + if t.multi > 0 && me.Mod { + toggle() + } + t.vmove(me.S, true) + req(reqList) + } else if t.hasPreviewWindow() && t.pwindow.Enclose(my, mx) { + scrollPreviewBy(-me.S) + } + } else if t.window.Enclose(my, mx) { + mx -= t.window.Left() + my -= t.window.Top() + mx = util.Constrain(mx-t.promptLen, 0, len(t.input)) + min := 2 + len(t.header) + if t.noInfoLine() { + min-- + } + h := t.window.Height() + switch t.layout { + case layoutDefault: + my = h - my - 1 + case layoutReverseList: + if my < h-min { + my += min + } else { + my = h - my - 1 + } + } + if me.Double { + // Double-click + if my >= min { + if t.vset(t.offset+my-min) && t.cy < t.merger.Length() { + return doActions(actionsFor(tui.DoubleClick)) + } + } + } else if me.Down { + if my == t.promptLine() && mx >= 0 { + // Prompt + t.cx = mx + t.xoffset + } else if my >= min { + // List + if t.vset(t.offset+my-min) && t.multi > 0 && me.Mod { + toggle() + } + req(reqList) + if me.Left { + return doActions(actionsFor(tui.LeftClick)) + } + return doActions(actionsFor(tui.RightClick)) + } + } + } + case actReload: + t.failed = nil + + valid, list := t.buildPlusList(a.a, false) + if !valid { + // We run the command even when there's no match + // 1. If the template doesn't have any slots + // 2. If the template has {q} + slot, _, query := hasPreviewFlags(a.a) + valid = !slot || query + } + if valid { + command := t.replacePlaceholder(a.a, false, string(t.input), list) + newCommand = &command + t.reading = true + t.version++ + } + case actUnbind: + keys := parseKeyChords(a.a, "PANIC") + for key := range keys { + delete(t.keymap, key) + } + } + return true + } + + if t.jumping == jumpDisabled { + actions := t.keymap[event.Comparable()] + if len(actions) == 0 && event.Type == tui.Rune { + doAction(action{t: actRune}) + } else if !doActions(actions) { + continue + } + t.truncateQuery() + queryChanged = string(previousInput) != string(t.input) + changed = changed || queryChanged + if onChanges, prs := t.keymap[tui.Change.AsEvent()]; queryChanged && prs { + if !doActions(onChanges) { + continue + } + } + if onEOFs, prs := t.keymap[tui.BackwardEOF.AsEvent()]; beof && prs { + if !doActions(onEOFs) { + continue + } + } + } else { + if event.Type == tui.Rune { + if idx := strings.IndexRune(t.jumpLabels, event.Char); idx >= 0 && idx < t.maxItems() && idx < t.merger.Length() { + t.cy = idx + t.offset + if t.jumping == jumpAcceptEnabled { + req(reqClose) + } + } + } + t.jumping = jumpDisabled + req(reqList) + } + + if queryChanged { + if t.isPreviewEnabled() { + _, _, q := hasPreviewFlags(t.previewOpts.command) + if q { + t.version++ + } + } + } + + if queryChanged || t.cx != previousCx { + req(reqPrompt) + } + + t.mutex.Unlock() // Must be unlocked before touching reqBox + + if changed || newCommand != nil { + t.eventBox.Set(EvtSearchNew, searchRequest{sort: t.sort, command: newCommand}) + } + for _, event := range events { + t.reqBox.Set(event, nil) + } + } +} + +func (t *Terminal) constrain() { + // count of items to display allowed by filtering + count := t.merger.Length() + // count of lines can be displayed + height := t.maxItems() + + t.cy = util.Constrain(t.cy, 0, count-1) + + minOffset := util.Max(t.cy-height+1, 0) + maxOffset := util.Max(util.Min(count-height, t.cy), 0) + t.offset = util.Constrain(t.offset, minOffset, maxOffset) + if t.scrollOff == 0 { + return + } + + scrollOff := util.Min(height/2, t.scrollOff) + for { + prevOffset := t.offset + if t.cy-t.offset < scrollOff { + t.offset = util.Max(minOffset, t.offset-1) + } + if t.cy-t.offset >= height-scrollOff { + t.offset = util.Min(maxOffset, t.offset+1) + } + if t.offset == prevOffset { + break + } + } +} + +func (t *Terminal) vmove(o int, allowCycle bool) { + if t.layout != layoutDefault { + o *= -1 + } + dest := t.cy + o + if t.cycle && allowCycle { + max := t.merger.Length() - 1 + if dest > max { + if t.cy == max { + dest = 0 + } + } else if dest < 0 { + if t.cy == 0 { + dest = max + } + } + } + t.vset(dest) +} + +func (t *Terminal) vset(o int) bool { + t.cy = util.Constrain(o, 0, t.merger.Length()-1) + return t.cy == o +} + +func (t *Terminal) maxItems() int { + max := t.window.Height() - 2 - len(t.header) + if t.noInfoLine() { + max++ + } + return util.Max(max, 0) +} diff --git a/.fzf/src/terminal_test.go b/.fzf/src/terminal_test.go new file mode 100644 index 0000000..ee19b67 --- /dev/null +++ b/.fzf/src/terminal_test.go @@ -0,0 +1,638 @@ +package fzf + +import ( + "bytes" + "io" + "os" + "regexp" + "strings" + "testing" + "text/template" + + "github.com/junegunn/fzf/src/util" +) + +func TestReplacePlaceholder(t *testing.T) { + item1 := newItem(" foo'bar \x1b[31mbaz\x1b[m") + items1 := []*Item{item1, item1} + items2 := []*Item{ + newItem("foo'bar \x1b[31mbaz\x1b[m"), + newItem("foo'bar \x1b[31mbaz\x1b[m"), + newItem("FOO'BAR \x1b[31mBAZ\x1b[m")} + + delim := "'" + var regex *regexp.Regexp + + var result string + check := func(expected string) { + if result != expected { + t.Errorf("expected: %s, actual: %s", expected, result) + } + } + // helper function that converts template format into string and carries out the check() + checkFormat := func(format string) { + type quotes struct{ O, I, S string } // outer, inner quotes, print separator + unixStyle := quotes{`'`, `'\''`, "\n"} + windowsStyle := quotes{`^"`, `'`, "\n"} + var effectiveStyle quotes + + if util.IsWindows() { + effectiveStyle = windowsStyle + } else { + effectiveStyle = unixStyle + } + + expected := templateToString(format, effectiveStyle) + check(expected) + } + printsep := "\n" + + /* + Test multiple placeholders and the function parameters. + */ + + // {}, preserve ansi + result = replacePlaceholder("echo {}", false, Delimiter{}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar \x1b[31mbaz\x1b[m{{.O}}") + + // {}, strip ansi + result = replacePlaceholder("echo {}", true, Delimiter{}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar baz{{.O}}") + + // {}, with multiple items + result = replacePlaceholder("echo {}", true, Delimiter{}, printsep, false, "query", items2) + checkFormat("echo {{.O}}foo{{.I}}bar baz{{.O}}") + + // {..}, strip leading whitespaces, preserve ansi + result = replacePlaceholder("echo {..}", false, Delimiter{}, printsep, false, "query", items1) + checkFormat("echo {{.O}}foo{{.I}}bar \x1b[31mbaz\x1b[m{{.O}}") + + // {..}, strip leading whitespaces, strip ansi + result = replacePlaceholder("echo {..}", true, Delimiter{}, printsep, false, "query", items1) + checkFormat("echo {{.O}}foo{{.I}}bar baz{{.O}}") + + // {q} + result = replacePlaceholder("echo {} {q}", true, Delimiter{}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar baz{{.O}} {{.O}}query{{.O}}") + + // {q}, multiple items + result = replacePlaceholder("echo {+}{q}{+}", true, Delimiter{}, printsep, false, "query 'string'", items2) + checkFormat("echo {{.O}}foo{{.I}}bar baz{{.O}} {{.O}}FOO{{.I}}BAR BAZ{{.O}}{{.O}}query {{.I}}string{{.I}}{{.O}}{{.O}}foo{{.I}}bar baz{{.O}} {{.O}}FOO{{.I}}BAR BAZ{{.O}}") + + result = replacePlaceholder("echo {}{q}{}", true, Delimiter{}, printsep, false, "query 'string'", items2) + checkFormat("echo {{.O}}foo{{.I}}bar baz{{.O}}{{.O}}query {{.I}}string{{.I}}{{.O}}{{.O}}foo{{.I}}bar baz{{.O}}") + + result = replacePlaceholder("echo {1}/{2}/{2,1}/{-1}/{-2}/{}/{..}/{n.t}/\\{}/\\{1}/\\{q}/{3}", true, Delimiter{}, printsep, false, "query", items1) + checkFormat("echo {{.O}}foo{{.I}}bar{{.O}}/{{.O}}baz{{.O}}/{{.O}}bazfoo{{.I}}bar{{.O}}/{{.O}}baz{{.O}}/{{.O}}foo{{.I}}bar{{.O}}/{{.O}} foo{{.I}}bar baz{{.O}}/{{.O}}foo{{.I}}bar baz{{.O}}/{n.t}/{}/{1}/{q}/{{.O}}{{.O}}") + + result = replacePlaceholder("echo {1}/{2}/{-1}/{-2}/{..}/{n.t}/\\{}/\\{1}/\\{q}/{3}", true, Delimiter{}, printsep, false, "query", items2) + checkFormat("echo {{.O}}foo{{.I}}bar{{.O}}/{{.O}}baz{{.O}}/{{.O}}baz{{.O}}/{{.O}}foo{{.I}}bar{{.O}}/{{.O}}foo{{.I}}bar baz{{.O}}/{n.t}/{}/{1}/{q}/{{.O}}{{.O}}") + + result = replacePlaceholder("echo {+1}/{+2}/{+-1}/{+-2}/{+..}/{n.t}/\\{}/\\{1}/\\{q}/{+3}", true, Delimiter{}, printsep, false, "query", items2) + checkFormat("echo {{.O}}foo{{.I}}bar{{.O}} {{.O}}FOO{{.I}}BAR{{.O}}/{{.O}}baz{{.O}} {{.O}}BAZ{{.O}}/{{.O}}baz{{.O}} {{.O}}BAZ{{.O}}/{{.O}}foo{{.I}}bar{{.O}} {{.O}}FOO{{.I}}BAR{{.O}}/{{.O}}foo{{.I}}bar baz{{.O}} {{.O}}FOO{{.I}}BAR BAZ{{.O}}/{n.t}/{}/{1}/{q}/{{.O}}{{.O}} {{.O}}{{.O}}") + + // forcePlus + result = replacePlaceholder("echo {1}/{2}/{-1}/{-2}/{..}/{n.t}/\\{}/\\{1}/\\{q}/{3}", true, Delimiter{}, printsep, true, "query", items2) + checkFormat("echo {{.O}}foo{{.I}}bar{{.O}} {{.O}}FOO{{.I}}BAR{{.O}}/{{.O}}baz{{.O}} {{.O}}BAZ{{.O}}/{{.O}}baz{{.O}} {{.O}}BAZ{{.O}}/{{.O}}foo{{.I}}bar{{.O}} {{.O}}FOO{{.I}}BAR{{.O}}/{{.O}}foo{{.I}}bar baz{{.O}} {{.O}}FOO{{.I}}BAR BAZ{{.O}}/{n.t}/{}/{1}/{q}/{{.O}}{{.O}} {{.O}}{{.O}}") + + // Whitespace preserving flag with "'" delimiter + result = replacePlaceholder("echo {s1}", true, Delimiter{str: &delim}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.O}}") + + result = replacePlaceholder("echo {s2}", true, Delimiter{str: &delim}, printsep, false, "query", items1) + checkFormat("echo {{.O}}bar baz{{.O}}") + + result = replacePlaceholder("echo {s}", true, Delimiter{str: &delim}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar baz{{.O}}") + + result = replacePlaceholder("echo {s..}", true, Delimiter{str: &delim}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar baz{{.O}}") + + // Whitespace preserving flag with regex delimiter + regex = regexp.MustCompile(`\w+`) + + result = replacePlaceholder("echo {s1}", true, Delimiter{regex: regex}, printsep, false, "query", items1) + checkFormat("echo {{.O}} {{.O}}") + + result = replacePlaceholder("echo {s2}", true, Delimiter{regex: regex}, printsep, false, "query", items1) + checkFormat("echo {{.O}}{{.I}}{{.O}}") + + result = replacePlaceholder("echo {s3}", true, Delimiter{regex: regex}, printsep, false, "query", items1) + checkFormat("echo {{.O}} {{.O}}") + + // No match + result = replacePlaceholder("echo {}/{+}", true, Delimiter{}, printsep, false, "query", []*Item{nil, nil}) + check("echo /") + + // No match, but with selections + result = replacePlaceholder("echo {}/{+}", true, Delimiter{}, printsep, false, "query", []*Item{nil, item1}) + checkFormat("echo /{{.O}} foo{{.I}}bar baz{{.O}}") + + // String delimiter + result = replacePlaceholder("echo {}/{1}/{2}", true, Delimiter{str: &delim}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar baz{{.O}}/{{.O}}foo{{.O}}/{{.O}}bar baz{{.O}}") + + // Regex delimiter + regex = regexp.MustCompile("[oa]+") + // foo'bar baz + result = replacePlaceholder("echo {}/{1}/{3}/{2..3}", true, Delimiter{regex: regex}, printsep, false, "query", items1) + checkFormat("echo {{.O}} foo{{.I}}bar baz{{.O}}/{{.O}}f{{.O}}/{{.O}}r b{{.O}}/{{.O}}{{.I}}bar b{{.O}}") + + /* + Test single placeholders, but focus on the placeholders' parameters (e.g. flags). + see: TestParsePlaceholder + */ + items3 := []*Item{ + // single line + newItem("1a 1b 1c 1d 1e 1f"), + // multi line + newItem("1a 1b 1c 1d 1e 1f"), + newItem("2a 2b 2c 2d 2e 2f"), + newItem("3a 3b 3c 3d 3e 3f"), + newItem("4a 4b 4c 4d 4e 4f"), + newItem("5a 5b 5c 5d 5e 5f"), + newItem("6a 6b 6c 6d 6e 6f"), + newItem("7a 7b 7c 7d 7e 7f"), + } + stripAnsi := false + printsep = "\n" + forcePlus := false + query := "sample query" + + templateToOutput := make(map[string]string) + templateToFile := make(map[string]string) // same as above, but the file contents will be matched + // I. item type placeholder + templateToOutput[`{}`] = `{{.O}}1a 1b 1c 1d 1e 1f{{.O}}` + templateToOutput[`{+}`] = `{{.O}}1a 1b 1c 1d 1e 1f{{.O}} {{.O}}2a 2b 2c 2d 2e 2f{{.O}} {{.O}}3a 3b 3c 3d 3e 3f{{.O}} {{.O}}4a 4b 4c 4d 4e 4f{{.O}} {{.O}}5a 5b 5c 5d 5e 5f{{.O}} {{.O}}6a 6b 6c 6d 6e 6f{{.O}} {{.O}}7a 7b 7c 7d 7e 7f{{.O}}` + templateToOutput[`{n}`] = `0` + templateToOutput[`{+n}`] = `0 0 0 0 0 0 0` + templateToFile[`{f}`] = `1a 1b 1c 1d 1e 1f{{.S}}` + templateToFile[`{+f}`] = `1a 1b 1c 1d 1e 1f{{.S}}2a 2b 2c 2d 2e 2f{{.S}}3a 3b 3c 3d 3e 3f{{.S}}4a 4b 4c 4d 4e 4f{{.S}}5a 5b 5c 5d 5e 5f{{.S}}6a 6b 6c 6d 6e 6f{{.S}}7a 7b 7c 7d 7e 7f{{.S}}` + templateToFile[`{nf}`] = `0{{.S}}` + templateToFile[`{+nf}`] = `0{{.S}}0{{.S}}0{{.S}}0{{.S}}0{{.S}}0{{.S}}0{{.S}}` + + // II. token type placeholders + templateToOutput[`{..}`] = templateToOutput[`{}`] + templateToOutput[`{1..}`] = templateToOutput[`{}`] + templateToOutput[`{..2}`] = `{{.O}}1a 1b{{.O}}` + templateToOutput[`{1..2}`] = templateToOutput[`{..2}`] + templateToOutput[`{-2..-1}`] = `{{.O}}1e 1f{{.O}}` + // shorthand for x..x range + templateToOutput[`{1}`] = `{{.O}}1a{{.O}}` + templateToOutput[`{1..1}`] = templateToOutput[`{1}`] + templateToOutput[`{-6}`] = templateToOutput[`{1}`] + // multiple ranges + templateToOutput[`{1,2}`] = templateToOutput[`{1..2}`] + templateToOutput[`{1,2,4}`] = `{{.O}}1a 1b 1d{{.O}}` + templateToOutput[`{1,2..4}`] = `{{.O}}1a 1b 1c 1d{{.O}}` + templateToOutput[`{1..2,-4..-3}`] = `{{.O}}1a 1b 1c 1d{{.O}}` + // flags + templateToOutput[`{+1}`] = `{{.O}}1a{{.O}} {{.O}}2a{{.O}} {{.O}}3a{{.O}} {{.O}}4a{{.O}} {{.O}}5a{{.O}} {{.O}}6a{{.O}} {{.O}}7a{{.O}}` + templateToOutput[`{+-1}`] = `{{.O}}1f{{.O}} {{.O}}2f{{.O}} {{.O}}3f{{.O}} {{.O}}4f{{.O}} {{.O}}5f{{.O}} {{.O}}6f{{.O}} {{.O}}7f{{.O}}` + templateToOutput[`{s1}`] = `{{.O}}1a {{.O}}` + templateToFile[`{f1}`] = `1a{{.S}}` + templateToOutput[`{+s1..2}`] = `{{.O}}1a 1b {{.O}} {{.O}}2a 2b {{.O}} {{.O}}3a 3b {{.O}} {{.O}}4a 4b {{.O}} {{.O}}5a 5b {{.O}} {{.O}}6a 6b {{.O}} {{.O}}7a 7b {{.O}}` + templateToFile[`{+sf1..2}`] = `1a 1b {{.S}}2a 2b {{.S}}3a 3b {{.S}}4a 4b {{.S}}5a 5b {{.S}}6a 6b {{.S}}7a 7b {{.S}}` + + // III. query type placeholder + // query flag is not removed after parsing, so it gets doubled + // while the double q is invalid, it is useful here for testing purposes + templateToOutput[`{q}`] = "{{.O}}" + query + "{{.O}}" + + // IV. escaping placeholder + templateToOutput[`\{}`] = `{}` + templateToOutput[`\{++}`] = `{++}` + templateToOutput[`{++}`] = templateToOutput[`{+}`] + + for giveTemplate, wantOutput := range templateToOutput { + result = replacePlaceholder(giveTemplate, stripAnsi, Delimiter{}, printsep, forcePlus, query, items3) + checkFormat(wantOutput) + } + for giveTemplate, wantOutput := range templateToFile { + path := replacePlaceholder(giveTemplate, stripAnsi, Delimiter{}, printsep, forcePlus, query, items3) + + data, err := readFile(path) + if err != nil { + t.Errorf("Cannot read the content of the temp file %s.", path) + } + result = string(data) + + checkFormat(wantOutput) + } +} + +func TestQuoteEntry(t *testing.T) { + type quotes struct{ E, O, SQ, DQ, BS string } // standalone escape, outer, single and double quotes, backslash + unixStyle := quotes{``, `'`, `'\''`, `"`, `\`} + windowsStyle := quotes{`^`, `^"`, `'`, `\^"`, `\\`} + var effectiveStyle quotes + + if util.IsWindows() { + effectiveStyle = windowsStyle + } else { + effectiveStyle = unixStyle + } + + tests := map[string]string{ + `'`: `{{.O}}{{.SQ}}{{.O}}`, + `"`: `{{.O}}{{.DQ}}{{.O}}`, + `\`: `{{.O}}{{.BS}}{{.O}}`, + `\"`: `{{.O}}{{.BS}}{{.DQ}}{{.O}}`, + `"\\\"`: `{{.O}}{{.DQ}}{{.BS}}{{.BS}}{{.BS}}{{.DQ}}{{.O}}`, + + `$`: `{{.O}}${{.O}}`, + `$HOME`: `{{.O}}$HOME{{.O}}`, + `'$HOME'`: `{{.O}}{{.SQ}}$HOME{{.SQ}}{{.O}}`, + + `&`: `{{.O}}{{.E}}&{{.O}}`, + `|`: `{{.O}}{{.E}}|{{.O}}`, + `<`: `{{.O}}{{.E}}<{{.O}}`, + `>`: `{{.O}}{{.E}}>{{.O}}`, + `(`: `{{.O}}{{.E}}({{.O}}`, + `)`: `{{.O}}{{.E}}){{.O}}`, + `@`: `{{.O}}{{.E}}@{{.O}}`, + `^`: `{{.O}}{{.E}}^{{.O}}`, + `%`: `{{.O}}{{.E}}%{{.O}}`, + `!`: `{{.O}}{{.E}}!{{.O}}`, + `%USERPROFILE%`: `{{.O}}{{.E}}%USERPROFILE{{.E}}%{{.O}}`, + `C:\Program Files (x86)\`: `{{.O}}C:{{.BS}}Program Files {{.E}}(x86{{.E}}){{.BS}}{{.O}}`, + `"C:\Program Files"`: `{{.O}}{{.DQ}}C:{{.BS}}Program Files{{.DQ}}{{.O}}`, + } + + for input, expected := range tests { + escaped := quoteEntry(input) + expected = templateToString(expected, effectiveStyle) + if escaped != expected { + t.Errorf("Input: %s, expected: %s, actual %s", input, expected, escaped) + } + } +} + +// purpose of this test is to demonstrate some shortcomings of fzf's templating system on Unix +func TestUnixCommands(t *testing.T) { + if util.IsWindows() { + t.SkipNow() + } + tests := []testCase{ + // reference: give{template, query, items}, want{output OR match} + + // 1) working examples + + // paths that does not have to evaluated will work fine, when quoted + {give{`grep foo {}`, ``, newItems(`test`)}, want{output: `grep foo 'test'`}}, + {give{`grep foo {}`, ``, newItems(`/home/user/test`)}, want{output: `grep foo '/home/user/test'`}}, + {give{`grep foo {}`, ``, newItems(`./test`)}, want{output: `grep foo './test'`}}, + + // only placeholders are escaped as data, this will lookup tilde character in a test file in your home directory + // quoting the tilde is required (to be treated as string) + {give{`grep {} ~/test`, ``, newItems(`~`)}, want{output: `grep '~' ~/test`}}, + + // 2) problematic examples + // (not necessarily unexpected) + + // paths that need to expand some part of it won't work (special characters and variables) + {give{`cat {}`, ``, newItems(`~/test`)}, want{output: `cat '~/test'`}}, + {give{`cat {}`, ``, newItems(`$HOME/test`)}, want{output: `cat '$HOME/test'`}}, + } + testCommands(t, tests) +} + +// purpose of this test is to demonstrate some shortcomings of fzf's templating system on Windows +func TestWindowsCommands(t *testing.T) { + if !util.IsWindows() { + t.SkipNow() + } + tests := []testCase{ + // reference: give{template, query, items}, want{output OR match} + + // 1) working examples + + // example of redundantly escaped backslash in the output, besides looking bit ugly, it won't cause any issue + {give{`type {}`, ``, newItems(`C:\test.txt`)}, want{output: `type ^"C:\\test.txt^"`}}, + {give{`rg -- "package" {}`, ``, newItems(`.\test.go`)}, want{output: `rg -- "package" ^".\\test.go^"`}}, + // example of mandatorily escaped backslash in the output, otherwise `rg -- "C:\test.txt"` is matching for tabulator + {give{`rg -- {}`, ``, newItems(`C:\test.txt`)}, want{output: `rg -- ^"C:\\test.txt^"`}}, + // example of mandatorily escaped double quote in the output, otherwise `rg -- ""C:\\test.txt""` is not matching for the double quotes around the path + {give{`rg -- {}`, ``, newItems(`"C:\test.txt"`)}, want{output: `rg -- ^"\^"C:\\test.txt\^"^"`}}, + + // 2) problematic examples + // (not necessarily unexpected) + + // notepad++'s parser can't handle `-n"12"` generate by fzf, expects `-n12` + {give{`notepad++ -n{1} {2}`, ``, newItems(`12 C:\Work\Test Folder\File.txt`)}, want{output: `notepad++ -n^"12^" ^"C:\\Work\\Test Folder\\File.txt^"`}}, + + // cat is parsing `\"` as a part of the file path, double quote is illegal character for paths on Windows + // cat: "C:\\test.txt: Invalid argument + {give{`cat {}`, ``, newItems(`"C:\test.txt"`)}, want{output: `cat ^"\^"C:\\test.txt\^"^"`}}, + // cat: "C:\\test.txt": Invalid argument + {give{`cmd /c {}`, ``, newItems(`cat "C:\test.txt"`)}, want{output: `cmd /c ^"cat \^"C:\\test.txt\^"^"`}}, + + // the "file" flag in the pattern won't create *.bat or *.cmd file so the command in the output tries to edit the file, instead of executing it + // the temp file contains: `cat "C:\test.txt"` + // TODO this should actually work + {give{`cmd /c {f}`, ``, newItems(`cat "C:\test.txt"`)}, want{match: `^cmd /c .*\fzf-preview-[0-9]{9}$`}}, + } + testCommands(t, tests) +} + +// purpose of this test is to demonstrate some shortcomings of fzf's templating system on Windows in Powershell +func TestPowershellCommands(t *testing.T) { + if !util.IsWindows() { + t.SkipNow() + } + + tests := []testCase{ + // reference: give{template, query, items}, want{output OR match} + + /* + You can read each line in the following table as a pipeline that + consist of series of parsers that act upon your input (col. 1) and + each cell represents the output value. + + For example: + - exec.Command("program.exe", `\''`) + - goes to win32 api which will process it transparently as it contains no special characters, see [CommandLineToArgvW][]. + - powershell command will receive it as is, that is two arguments: a literal backslash and empty string in single quotes + - native command run via/from powershell will receive only one argument: a literal backslash. Because extra parsing rules apply, see [NativeCallsFromPowershell][]. + - some¹ apps have internal parser, that requires one more level of escaping (yes, this is completely application-specific, but see terminal_test.go#TestWindowsCommands) + + Character⁰ CommandLineToArgvW Powershell commands Native commands from Powershell Apps requiring escapes¹ | Being tested below + ---------- ------------------ ------------------------------ ------------------------------- -------------------------- | ------------------ + " empty string² missing argument error ... ... | + \" literal " unbalanced quote error ... ... | + '\"' literal '"' literal " empty string empty string (match all) | yes + '\\\"' literal '\"' literal \" literal " literal " | + ---------- ------------------ ------------------------------ ------------------------------- -------------------------- | ------------------ + \ transparent transparent transparent regex error | + '\' transparent literal \ literal \ regex error | yes + \\ transparent transparent transparent literal \ | + '\\' transparent literal \\ literal \\ literal \ | + ---------- ------------------ ------------------------------ ------------------------------- -------------------------- | ------------------ + ' transparent unbalanced quote error ... ... | + \' transparent literal \ and unb. quote error ... ... | + \'' transparent literal \ and empty string literal \ regex error | no, but given as example above + ''' transparent unbalanced quote error ... ... | + '''' transparent literal ' literal ' literal ' | yes + ---------- ------------------ ------------------------------ ------------------------------- -------------------------- | ------------------ + + ⁰: charatecter or characters 'x' as an argument to a program in go's call: exec.Command("program.exe", `x`) + ¹: native commands like grep, git grep, ripgrep + ²: interpreted as a grouping quote, affects argument parser and gets removed from the result + + [CommandLineToArgvW]: https://docs.microsoft.com/en-gb/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw#remarks + [NativeCallsFromPowershell]: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-7.1#passing-arguments-that-contain-quote-characters + */ + + // 1) working examples + + {give{`Get-Content {}`, ``, newItems(`C:\test.txt`)}, want{output: `Get-Content 'C:\test.txt'`}}, + {give{`rg -- "package" {}`, ``, newItems(`.\test.go`)}, want{output: `rg -- "package" '.\test.go'`}}, + + // example of escaping single quotes + {give{`rg -- {}`, ``, newItems(`'foobar'`)}, want{output: `rg -- '''foobar'''`}}, + + // chaining powershells + {give{`powershell -NoProfile -Command {}`, ``, newItems(`cat "C:\test.txt"`)}, want{output: `powershell -NoProfile -Command 'cat \"C:\test.txt\"'`}}, + + // 2) problematic examples + // (not necessarily unexpected) + + // looking for a path string will only work with escaped backslashes + {give{`rg -- {}`, ``, newItems(`C:\test.txt`)}, want{output: `rg -- 'C:\test.txt'`}}, + // looking for a literal double quote will only work with triple escaped double quotes + {give{`rg -- {}`, ``, newItems(`"C:\test.txt"`)}, want{output: `rg -- '\"C:\test.txt\"'`}}, + + // Get-Content (i.e. cat alias) is parsing `"` as a part of the file path, returns an error: + // Get-Content : Cannot find drive. A drive with the name '"C:' does not exist. + {give{`cat {}`, ``, newItems(`"C:\test.txt"`)}, want{output: `cat '\"C:\test.txt\"'`}}, + + // the "file" flag in the pattern won't create *.ps1 file so the powershell will offload this "unknown" filetype + // to explorer, which will prompt user to pick editing program for the fzf-preview file + // the temp file contains: `cat "C:\test.txt"` + // TODO this should actually work + {give{`powershell -NoProfile -Command {f}`, ``, newItems(`cat "C:\test.txt"`)}, want{match: `^powershell -NoProfile -Command .*\fzf-preview-[0-9]{9}$`}}, + } + + // to force powershell-style escaping we temporarily set environment variable that fzf honors + shellBackup := os.Getenv("SHELL") + os.Setenv("SHELL", "powershell") + testCommands(t, tests) + os.Setenv("SHELL", shellBackup) +} + +/* + Test typical valid placeholders and parsing of them. + + Also since the parser assumes the input is matched with `placeholder` regex, + the regex is tested here as well. +*/ +func TestParsePlaceholder(t *testing.T) { + // give, want pairs + templates := map[string]string{ + // I. item type placeholder + `{}`: `{}`, + `{+}`: `{+}`, + `{n}`: `{n}`, + `{+n}`: `{+n}`, + `{f}`: `{f}`, + `{+nf}`: `{+nf}`, + + // II. token type placeholders + `{..}`: `{..}`, + `{1..}`: `{1..}`, + `{..2}`: `{..2}`, + `{1..2}`: `{1..2}`, + `{-2..-1}`: `{-2..-1}`, + // shorthand for x..x range + `{1}`: `{1}`, + `{1..1}`: `{1..1}`, + `{-6}`: `{-6}`, + // multiple ranges + `{1,2}`: `{1,2}`, + `{1,2,4}`: `{1,2,4}`, + `{1,2..4}`: `{1,2..4}`, + `{1..2,-4..-3}`: `{1..2,-4..-3}`, + // flags + `{+1}`: `{+1}`, + `{+-1}`: `{+-1}`, + `{s1}`: `{s1}`, + `{f1}`: `{f1}`, + `{+s1..2}`: `{+s1..2}`, + `{+sf1..2}`: `{+sf1..2}`, + + // III. query type placeholder + // query flag is not removed after parsing, so it gets doubled + // while the double q is invalid, it is useful here for testing purposes + `{q}`: `{qq}`, + + // IV. escaping placeholder + `\{}`: `{}`, + `\{++}`: `{++}`, + `{++}`: `{+}`, + } + + for giveTemplate, wantTemplate := range templates { + if !placeholder.MatchString(giveTemplate) { + t.Errorf(`given placeholder %s does not match placeholder regex, so attempt to parse it is unexpected`, giveTemplate) + continue + } + + _, placeholderWithoutFlags, flags := parsePlaceholder(giveTemplate) + gotTemplate := placeholderWithoutFlags[:1] + flags.encodePlaceholder() + placeholderWithoutFlags[1:] + + if gotTemplate != wantTemplate { + t.Errorf(`parsed placeholder "%s" into "%s", but want "%s"`, giveTemplate, gotTemplate, wantTemplate) + } + } +} + +/* utilities section */ + +// Item represents one line in fzf UI. Usually it is relative path to files and folders. +func newItem(str string) *Item { + bytes := []byte(str) + trimmed, _, _ := extractColor(str, nil, nil) + return &Item{origText: &bytes, text: util.ToChars([]byte(trimmed))} +} + +// Functions tested in this file require array of items (allItems). The array needs +// to consist of at least two nils. This is helper function. +func newItems(str ...string) []*Item { + result := make([]*Item, util.Max(len(str), 2)) + for i, s := range str { + result[i] = newItem(s) + } + return result +} + +// (for logging purposes) +func (item *Item) String() string { + return item.AsString(true) +} + +// Helper function to parse, execute and convert "text/template" to string. Panics on error. +func templateToString(format string, data interface{}) string { + bb := &bytes.Buffer{} + + err := template.Must(template.New("").Parse(format)).Execute(bb, data) + if err != nil { + panic(err) + } + + return bb.String() +} + +// ad hoc types for test cases +type give struct { + template string + query string + allItems []*Item +} +type want struct { + /* + Unix: + The `want.output` string is supposed to be formatted for evaluation by + `sh -c command` system call. + + Windows: + The `want.output` string is supposed to be formatted for evaluation by + `cmd.exe /s /c "command"` system call. The `/s` switch enables so called old + behaviour, which is more favourable for nesting (possibly escaped) + special characters. This is the relevant section of `help cmd`: + + ...old behavior is to see if the first character is + a quote character and if so, strip the leading character and + remove the last quote character on the command line, preserving + any text after the last quote character. + */ + output string // literal output + match string // output is matched against this regex (when output is empty string) +} +type testCase struct { + give + want +} + +func testCommands(t *testing.T, tests []testCase) { + // common test parameters + delim := "\t" + delimiter := Delimiter{str: &delim} + printsep := "" + stripAnsi := false + forcePlus := false + + // evaluate the test cases + for idx, test := range tests { + gotOutput := replacePlaceholder( + test.give.template, stripAnsi, delimiter, printsep, forcePlus, + test.give.query, + test.give.allItems) + switch { + case test.want.output != "": + if gotOutput != test.want.output { + t.Errorf("tests[%v]:\ngave{\n\ttemplate: '%s',\n\tquery: '%s',\n\tallItems: %s}\nand got '%s',\nbut want '%s'", + idx, + test.give.template, test.give.query, test.give.allItems, + gotOutput, test.want.output) + } + case test.want.match != "": + wantMatch := strings.ReplaceAll(test.want.match, `\`, `\\`) + wantRegex := regexp.MustCompile(wantMatch) + if !wantRegex.MatchString(gotOutput) { + t.Errorf("tests[%v]:\ngave{\n\ttemplate: '%s',\n\tquery: '%s',\n\tallItems: %s}\nand got '%s',\nbut want '%s'", + idx, + test.give.template, test.give.query, test.give.allItems, + gotOutput, test.want.match) + } + default: + t.Errorf("tests[%v]: test case does not describe 'want' property", idx) + } + } +} + +// naive encoder of placeholder flags +func (flags placeholderFlags) encodePlaceholder() string { + encoded := "" + if flags.plus { + encoded += "+" + } + if flags.preserveSpace { + encoded += "s" + } + if flags.number { + encoded += "n" + } + if flags.file { + encoded += "f" + } + if flags.query { + encoded += "q" + } + return encoded +} + +// can be replaced with os.ReadFile() in go 1.16+ +func readFile(path string) ([]byte, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + data := make([]byte, 0, 128) + for { + if len(data) >= cap(data) { + d := append(data[:cap(data)], 0) + data = d[:len(data)] + } + + n, err := file.Read(data[len(data):cap(data)]) + data = data[:len(data)+n] + if err != nil { + if err == io.EOF { + err = nil + } + return data, err + } + } +} diff --git a/.fzf/src/terminal_unix.go b/.fzf/src/terminal_unix.go new file mode 100644 index 0000000..b14cd68 --- /dev/null +++ b/.fzf/src/terminal_unix.go @@ -0,0 +1,26 @@ +// +build !windows + +package fzf + +import ( + "os" + "os/signal" + "strings" + "syscall" +) + +func notifyOnResize(resizeChan chan<- os.Signal) { + signal.Notify(resizeChan, syscall.SIGWINCH) +} + +func notifyStop(p *os.Process) { + p.Signal(syscall.SIGSTOP) +} + +func notifyOnCont(resizeChan chan<- os.Signal) { + signal.Notify(resizeChan, syscall.SIGCONT) +} + +func quoteEntry(entry string) string { + return "'" + strings.Replace(entry, "'", "'\\''", -1) + "'" +} diff --git a/.fzf/src/terminal_windows.go b/.fzf/src/terminal_windows.go new file mode 100644 index 0000000..5e74873 --- /dev/null +++ b/.fzf/src/terminal_windows.go @@ -0,0 +1,45 @@ +// +build windows + +package fzf + +import ( + "os" + "regexp" + "strings" +) + +func notifyOnResize(resizeChan chan<- os.Signal) { + // TODO +} + +func notifyStop(p *os.Process) { + // NOOP +} + +func notifyOnCont(resizeChan chan<- os.Signal) { + // NOOP +} + +func quoteEntry(entry string) string { + shell := os.Getenv("SHELL") + if len(shell) == 0 { + shell = "cmd" + } + + if strings.Contains(shell, "cmd") { + // backslash escaping is done here for applications + // (see ripgrep test case in terminal_test.go#TestWindowsCommands) + escaped := strings.Replace(entry, `\`, `\\`, -1) + escaped = `"` + strings.Replace(escaped, `"`, `\"`, -1) + `"` + // caret is the escape character for cmd shell + r, _ := regexp.Compile(`[&|<>()@^%!"]`) + return r.ReplaceAllStringFunc(escaped, func(match string) string { + return "^" + match + }) + } else if strings.Contains(shell, "pwsh") || strings.Contains(shell, "powershell") { + escaped := strings.Replace(entry, `"`, `\"`, -1) + return "'" + strings.Replace(escaped, "'", "''", -1) + "'" + } else { + return "'" + strings.Replace(entry, "'", "'\\''", -1) + "'" + } +} diff --git a/.fzf/src/tokenizer.go b/.fzf/src/tokenizer.go new file mode 100644 index 0000000..26f42d2 --- /dev/null +++ b/.fzf/src/tokenizer.go @@ -0,0 +1,253 @@ +package fzf + +import ( + "bytes" + "fmt" + "regexp" + "strconv" + "strings" + + "github.com/junegunn/fzf/src/util" +) + +const rangeEllipsis = 0 + +// Range represents nth-expression +type Range struct { + begin int + end int +} + +// Token contains the tokenized part of the strings and its prefix length +type Token struct { + text *util.Chars + prefixLength int32 +} + +// String returns the string representation of a Token. +func (t Token) String() string { + return fmt.Sprintf("Token{text: %s, prefixLength: %d}", t.text, t.prefixLength) +} + +// Delimiter for tokenizing the input +type Delimiter struct { + regex *regexp.Regexp + str *string +} + +// String returns the string representation of a Delimiter. +func (d Delimiter) String() string { + return fmt.Sprintf("Delimiter{regex: %v, str: &%q}", d.regex, *d.str) +} + +func newRange(begin int, end int) Range { + if begin == 1 { + begin = rangeEllipsis + } + if end == -1 { + end = rangeEllipsis + } + return Range{begin, end} +} + +// ParseRange parses nth-expression and returns the corresponding Range object +func ParseRange(str *string) (Range, bool) { + if (*str) == ".." { + return newRange(rangeEllipsis, rangeEllipsis), true + } else if strings.HasPrefix(*str, "..") { + end, err := strconv.Atoi((*str)[2:]) + if err != nil || end == 0 { + return Range{}, false + } + return newRange(rangeEllipsis, end), true + } else if strings.HasSuffix(*str, "..") { + begin, err := strconv.Atoi((*str)[:len(*str)-2]) + if err != nil || begin == 0 { + return Range{}, false + } + return newRange(begin, rangeEllipsis), true + } else if strings.Contains(*str, "..") { + ns := strings.Split(*str, "..") + if len(ns) != 2 { + return Range{}, false + } + begin, err1 := strconv.Atoi(ns[0]) + end, err2 := strconv.Atoi(ns[1]) + if err1 != nil || err2 != nil || begin == 0 || end == 0 { + return Range{}, false + } + return newRange(begin, end), true + } + + n, err := strconv.Atoi(*str) + if err != nil || n == 0 { + return Range{}, false + } + return newRange(n, n), true +} + +func withPrefixLengths(tokens []string, begin int) []Token { + ret := make([]Token, len(tokens)) + + prefixLength := begin + for idx := range tokens { + chars := util.ToChars([]byte(tokens[idx])) + ret[idx] = Token{&chars, int32(prefixLength)} + prefixLength += chars.Length() + } + return ret +} + +const ( + awkNil = iota + awkBlack + awkWhite +) + +func awkTokenizer(input string) ([]string, int) { + // 9, 32 + ret := []string{} + prefixLength := 0 + state := awkNil + begin := 0 + end := 0 + for idx := 0; idx < len(input); idx++ { + r := input[idx] + white := r == 9 || r == 32 + switch state { + case awkNil: + if white { + prefixLength++ + } else { + state, begin, end = awkBlack, idx, idx+1 + } + case awkBlack: + end = idx + 1 + if white { + state = awkWhite + } + case awkWhite: + if white { + end = idx + 1 + } else { + ret = append(ret, input[begin:end]) + state, begin, end = awkBlack, idx, idx+1 + } + } + } + if begin < end { + ret = append(ret, input[begin:end]) + } + return ret, prefixLength +} + +// Tokenize tokenizes the given string with the delimiter +func Tokenize(text string, delimiter Delimiter) []Token { + if delimiter.str == nil && delimiter.regex == nil { + // AWK-style (\S+\s*) + tokens, prefixLength := awkTokenizer(text) + return withPrefixLengths(tokens, prefixLength) + } + + if delimiter.str != nil { + return withPrefixLengths(strings.SplitAfter(text, *delimiter.str), 0) + } + + // FIXME performance + var tokens []string + if delimiter.regex != nil { + for len(text) > 0 { + loc := delimiter.regex.FindStringIndex(text) + if len(loc) < 2 { + loc = []int{0, len(text)} + } + last := util.Max(loc[1], 1) + tokens = append(tokens, text[:last]) + text = text[last:] + } + } + return withPrefixLengths(tokens, 0) +} + +func joinTokens(tokens []Token) string { + var output bytes.Buffer + for _, token := range tokens { + output.WriteString(token.text.ToString()) + } + return output.String() +} + +// Transform is used to transform the input when --with-nth option is given +func Transform(tokens []Token, withNth []Range) []Token { + transTokens := make([]Token, len(withNth)) + numTokens := len(tokens) + for idx, r := range withNth { + parts := []*util.Chars{} + minIdx := 0 + if r.begin == r.end { + idx := r.begin + if idx == rangeEllipsis { + chars := util.ToChars([]byte(joinTokens(tokens))) + parts = append(parts, &chars) + } else { + if idx < 0 { + idx += numTokens + 1 + } + if idx >= 1 && idx <= numTokens { + minIdx = idx - 1 + parts = append(parts, tokens[idx-1].text) + } + } + } else { + var begin, end int + if r.begin == rangeEllipsis { // ..N + begin, end = 1, r.end + if end < 0 { + end += numTokens + 1 + } + } else if r.end == rangeEllipsis { // N.. + begin, end = r.begin, numTokens + if begin < 0 { + begin += numTokens + 1 + } + } else { + begin, end = r.begin, r.end + if begin < 0 { + begin += numTokens + 1 + } + if end < 0 { + end += numTokens + 1 + } + } + minIdx = util.Max(0, begin-1) + for idx := begin; idx <= end; idx++ { + if idx >= 1 && idx <= numTokens { + parts = append(parts, tokens[idx-1].text) + } + } + } + // Merge multiple parts + var merged util.Chars + switch len(parts) { + case 0: + merged = util.ToChars([]byte{}) + case 1: + merged = *parts[0] + default: + var output bytes.Buffer + for _, part := range parts { + output.WriteString(part.ToString()) + } + merged = util.ToChars(output.Bytes()) + } + + var prefixLength int32 + if minIdx < numTokens { + prefixLength = tokens[minIdx].prefixLength + } else { + prefixLength = 0 + } + transTokens[idx] = Token{&merged, prefixLength} + } + return transTokens +} diff --git a/.fzf/src/tokenizer_test.go b/.fzf/src/tokenizer_test.go new file mode 100644 index 0000000..985cef9 --- /dev/null +++ b/.fzf/src/tokenizer_test.go @@ -0,0 +1,112 @@ +package fzf + +import ( + "testing" +) + +func TestParseRange(t *testing.T) { + { + i := ".." + r, _ := ParseRange(&i) + if r.begin != rangeEllipsis || r.end != rangeEllipsis { + t.Errorf("%v", r) + } + } + { + i := "3.." + r, _ := ParseRange(&i) + if r.begin != 3 || r.end != rangeEllipsis { + t.Errorf("%v", r) + } + } + { + i := "3..5" + r, _ := ParseRange(&i) + if r.begin != 3 || r.end != 5 { + t.Errorf("%v", r) + } + } + { + i := "-3..-5" + r, _ := ParseRange(&i) + if r.begin != -3 || r.end != -5 { + t.Errorf("%v", r) + } + } + { + i := "3" + r, _ := ParseRange(&i) + if r.begin != 3 || r.end != 3 { + t.Errorf("%v", r) + } + } +} + +func TestTokenize(t *testing.T) { + // AWK-style + input := " abc: def: ghi " + tokens := Tokenize(input, Delimiter{}) + if tokens[0].text.ToString() != "abc: " || tokens[0].prefixLength != 2 { + t.Errorf("%s", tokens) + } + + // With delimiter + tokens = Tokenize(input, delimiterRegexp(":")) + if tokens[0].text.ToString() != " abc:" || tokens[0].prefixLength != 0 { + t.Error(tokens[0].text.ToString(), tokens[0].prefixLength) + } + + // With delimiter regex + tokens = Tokenize(input, delimiterRegexp("\\s+")) + if tokens[0].text.ToString() != " " || tokens[0].prefixLength != 0 || + tokens[1].text.ToString() != "abc: " || tokens[1].prefixLength != 2 || + tokens[2].text.ToString() != "def: " || tokens[2].prefixLength != 8 || + tokens[3].text.ToString() != "ghi " || tokens[3].prefixLength != 14 { + t.Errorf("%s", tokens) + } +} + +func TestTransform(t *testing.T) { + input := " abc: def: ghi: jkl" + { + tokens := Tokenize(input, Delimiter{}) + { + ranges := splitNth("1,2,3") + tx := Transform(tokens, ranges) + if joinTokens(tx) != "abc: def: ghi: " { + t.Errorf("%s", tx) + } + } + { + ranges := splitNth("1..2,3,2..,1") + tx := Transform(tokens, ranges) + if string(joinTokens(tx)) != "abc: def: ghi: def: ghi: jklabc: " || + len(tx) != 4 || + tx[0].text.ToString() != "abc: def: " || tx[0].prefixLength != 2 || + tx[1].text.ToString() != "ghi: " || tx[1].prefixLength != 14 || + tx[2].text.ToString() != "def: ghi: jkl" || tx[2].prefixLength != 8 || + tx[3].text.ToString() != "abc: " || tx[3].prefixLength != 2 { + t.Errorf("%s", tx) + } + } + } + { + tokens := Tokenize(input, delimiterRegexp(":")) + { + ranges := splitNth("1..2,3,2..,1") + tx := Transform(tokens, ranges) + if joinTokens(tx) != " abc: def: ghi: def: ghi: jkl abc:" || + len(tx) != 4 || + tx[0].text.ToString() != " abc: def:" || tx[0].prefixLength != 0 || + tx[1].text.ToString() != " ghi:" || tx[1].prefixLength != 12 || + tx[2].text.ToString() != " def: ghi: jkl" || tx[2].prefixLength != 6 || + tx[3].text.ToString() != " abc:" || tx[3].prefixLength != 0 { + t.Errorf("%s", tx) + } + } + } +} + +func TestTransformIndexOutOfBounds(t *testing.T) { + Transform([]Token{}, splitNth("1")) +} diff --git a/.fzf/src/tui/dummy.go b/.fzf/src/tui/dummy.go new file mode 100644 index 0000000..af7e759 --- /dev/null +++ b/.fzf/src/tui/dummy.go @@ -0,0 +1,46 @@ +// +build !ncurses +// +build !tcell +// +build !windows + +package tui + +type Attr int32 + +func HasFullscreenRenderer() bool { + return false +} + +func (a Attr) Merge(b Attr) Attr { + return a | b +} + +const ( + AttrUndefined = Attr(0) + AttrRegular = Attr(1 << 7) + AttrClear = Attr(1 << 8) + + Bold = Attr(1) + Dim = Attr(1 << 1) + Italic = Attr(1 << 2) + Underline = Attr(1 << 3) + Blink = Attr(1 << 4) + Blink2 = Attr(1 << 5) + Reverse = Attr(1 << 6) +) + +func (r *FullscreenRenderer) Init() {} +func (r *FullscreenRenderer) Pause(bool) {} +func (r *FullscreenRenderer) Resume(bool, bool) {} +func (r *FullscreenRenderer) Clear() {} +func (r *FullscreenRenderer) Refresh() {} +func (r *FullscreenRenderer) Close() {} + +func (r *FullscreenRenderer) GetChar() Event { return Event{} } +func (r *FullscreenRenderer) MaxX() int { return 0 } +func (r *FullscreenRenderer) MaxY() int { return 0 } + +func (r *FullscreenRenderer) RefreshWindows(windows []Window) {} + +func (r *FullscreenRenderer) NewWindow(top int, left int, width int, height int, preview bool, borderStyle BorderStyle) Window { + return nil +} diff --git a/.fzf/src/tui/light.go b/.fzf/src/tui/light.go new file mode 100644 index 0000000..d3e3fab --- /dev/null +++ b/.fzf/src/tui/light.go @@ -0,0 +1,987 @@ +package tui + +import ( + "bytes" + "fmt" + "os" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" + + "github.com/mattn/go-runewidth" + "github.com/rivo/uniseg" + + "golang.org/x/term" +) + +const ( + defaultWidth = 80 + defaultHeight = 24 + + defaultEscDelay = 100 + escPollInterval = 5 + offsetPollTries = 10 + maxInputBuffer = 10 * 1024 +) + +const consoleDevice string = "/dev/tty" + +var offsetRegexp *regexp.Regexp = regexp.MustCompile("(.*)\x1b\\[([0-9]+);([0-9]+)R") +var offsetRegexpBegin *regexp.Regexp = regexp.MustCompile("^\x1b\\[[0-9]+;[0-9]+R") + +func (r *LightRenderer) stderr(str string) { + r.stderrInternal(str, true) +} + +// FIXME: Need better handling of non-displayable characters +func (r *LightRenderer) stderrInternal(str string, allowNLCR bool) { + bytes := []byte(str) + runes := []rune{} + for len(bytes) > 0 { + r, sz := utf8.DecodeRune(bytes) + nlcr := r == '\n' || r == '\r' + if r >= 32 || r == '\x1b' || nlcr { + if r == utf8.RuneError || nlcr && !allowNLCR { + runes = append(runes, ' ') + } else { + runes = append(runes, r) + } + } + bytes = bytes[sz:] + } + r.queued.WriteString(string(runes)) +} + +func (r *LightRenderer) csi(code string) { + r.stderr("\x1b[" + code) +} + +func (r *LightRenderer) flush() { + if r.queued.Len() > 0 { + fmt.Fprint(os.Stderr, r.queued.String()) + r.queued.Reset() + } +} + +// Light renderer +type LightRenderer struct { + theme *ColorTheme + mouse bool + forceBlack bool + clearOnExit bool + prevDownTime time.Time + clickY []int + ttyin *os.File + buffer []byte + origState *term.State + width int + height int + yoffset int + tabstop int + escDelay int + fullscreen bool + upOneLine bool + queued strings.Builder + y int + x int + maxHeightFunc func(int) int + + // Windows only + ttyinChannel chan byte + inHandle uintptr + outHandle uintptr + origStateInput uint32 + origStateOutput uint32 +} + +type LightWindow struct { + renderer *LightRenderer + colored bool + preview bool + border BorderStyle + top int + left int + width int + height int + posx int + posy int + tabstop int + fg Color + bg Color +} + +func NewLightRenderer(theme *ColorTheme, forceBlack bool, mouse bool, tabstop int, clearOnExit bool, fullscreen bool, maxHeightFunc func(int) int) Renderer { + r := LightRenderer{ + theme: theme, + forceBlack: forceBlack, + mouse: mouse, + clearOnExit: clearOnExit, + ttyin: openTtyIn(), + yoffset: 0, + tabstop: tabstop, + fullscreen: fullscreen, + upOneLine: false, + maxHeightFunc: maxHeightFunc} + return &r +} + +func repeat(r rune, times int) string { + if times > 0 { + return strings.Repeat(string(r), times) + } + return "" +} + +func atoi(s string, defaultValue int) int { + value, err := strconv.Atoi(s) + if err != nil { + return defaultValue + } + return value +} + +func (r *LightRenderer) Init() { + r.escDelay = atoi(os.Getenv("ESCDELAY"), defaultEscDelay) + + if err := r.initPlatform(); err != nil { + errorExit(err.Error()) + } + r.updateTerminalSize() + initTheme(r.theme, r.defaultTheme(), r.forceBlack) + + if r.fullscreen { + r.smcup() + } else { + // We assume that --no-clear is used for repetitive relaunching of fzf. + // So we do not clear the lower bottom of the screen. + if r.clearOnExit { + r.csi("J") + } + y, x := r.findOffset() + r.mouse = r.mouse && y >= 0 + // When --no-clear is used for repetitive relaunching, there is a small + // time frame between fzf processes where the user keystrokes are not + // captured by either of fzf process which can cause x offset to be + // increased and we're left with unwanted extra new line. + if x > 0 && r.clearOnExit { + r.upOneLine = true + r.makeSpace() + } + for i := 1; i < r.MaxY(); i++ { + r.makeSpace() + } + } + + if r.mouse { + r.csi("?1000h") + } + r.csi(fmt.Sprintf("%dA", r.MaxY()-1)) + r.csi("G") + r.csi("K") + if !r.clearOnExit && !r.fullscreen { + r.csi("s") + } + if !r.fullscreen && r.mouse { + r.yoffset, _ = r.findOffset() + } +} + +func (r *LightRenderer) makeSpace() { + r.stderr("\n") + r.csi("G") +} + +func (r *LightRenderer) move(y int, x int) { + // w.csi("u") + if r.y < y { + r.csi(fmt.Sprintf("%dB", y-r.y)) + } else if r.y > y { + r.csi(fmt.Sprintf("%dA", r.y-y)) + } + r.stderr("\r") + if x > 0 { + r.csi(fmt.Sprintf("%dC", x)) + } + r.y = y + r.x = x +} + +func (r *LightRenderer) origin() { + r.move(0, 0) +} + +func getEnv(name string, defaultValue int) int { + env := os.Getenv(name) + if len(env) == 0 { + return defaultValue + } + return atoi(env, defaultValue) +} + +func (r *LightRenderer) getBytes() []byte { + return r.getBytesInternal(r.buffer, false) +} + +func (r *LightRenderer) getBytesInternal(buffer []byte, nonblock bool) []byte { + c, ok := r.getch(nonblock) + if !nonblock && !ok { + r.Close() + errorExit("Failed to read " + consoleDevice) + } + + retries := 0 + if c == ESC.Int() || nonblock { + retries = r.escDelay / escPollInterval + } + buffer = append(buffer, byte(c)) + + pc := c + for { + c, ok = r.getch(true) + if !ok { + if retries > 0 { + retries-- + time.Sleep(escPollInterval * time.Millisecond) + continue + } + break + } else if c == ESC.Int() && pc != c { + retries = r.escDelay / escPollInterval + } else { + retries = 0 + } + buffer = append(buffer, byte(c)) + pc = c + + // This should never happen under normal conditions, + // so terminate fzf immediately. + if len(buffer) > maxInputBuffer { + r.Close() + panic(fmt.Sprintf("Input buffer overflow (%d): %v", len(buffer), buffer)) + } + } + + return buffer +} + +func (r *LightRenderer) GetChar() Event { + if len(r.buffer) == 0 { + r.buffer = r.getBytes() + } + if len(r.buffer) == 0 { + panic("Empty buffer") + } + + sz := 1 + defer func() { + r.buffer = r.buffer[sz:] + }() + + switch r.buffer[0] { + case CtrlC.Byte(): + return Event{CtrlC, 0, nil} + case CtrlG.Byte(): + return Event{CtrlG, 0, nil} + case CtrlQ.Byte(): + return Event{CtrlQ, 0, nil} + case 127: + return Event{BSpace, 0, nil} + case 0: + return Event{CtrlSpace, 0, nil} + case 28: + return Event{CtrlBackSlash, 0, nil} + case 29: + return Event{CtrlRightBracket, 0, nil} + case 30: + return Event{CtrlCaret, 0, nil} + case 31: + return Event{CtrlSlash, 0, nil} + case ESC.Byte(): + ev := r.escSequence(&sz) + // Second chance + if ev.Type == Invalid { + r.buffer = r.getBytes() + ev = r.escSequence(&sz) + } + return ev + } + + // CTRL-A ~ CTRL-Z + if r.buffer[0] <= CtrlZ.Byte() { + return Event{EventType(r.buffer[0]), 0, nil} + } + char, rsz := utf8.DecodeRune(r.buffer) + if char == utf8.RuneError { + return Event{ESC, 0, nil} + } + sz = rsz + return Event{Rune, char, nil} +} + +func (r *LightRenderer) escSequence(sz *int) Event { + if len(r.buffer) < 2 { + return Event{ESC, 0, nil} + } + + loc := offsetRegexpBegin.FindIndex(r.buffer) + if loc != nil && loc[0] == 0 { + *sz = loc[1] + return Event{Invalid, 0, nil} + } + + *sz = 2 + if r.buffer[1] >= 1 && r.buffer[1] <= 'z'-'a'+1 { + return CtrlAltKey(rune(r.buffer[1] + 'a' - 1)) + } + alt := false + if len(r.buffer) > 2 && r.buffer[1] == ESC.Byte() { + r.buffer = r.buffer[1:] + alt = true + } + switch r.buffer[1] { + case ESC.Byte(): + return Event{ESC, 0, nil} + case 127: + return Event{AltBS, 0, nil} + case '[', 'O': + if len(r.buffer) < 3 { + return Event{Invalid, 0, nil} + } + *sz = 3 + switch r.buffer[2] { + case 'D': + if alt { + return Event{AltLeft, 0, nil} + } + return Event{Left, 0, nil} + case 'C': + if alt { + // Ugh.. + return Event{AltRight, 0, nil} + } + return Event{Right, 0, nil} + case 'B': + if alt { + return Event{AltDown, 0, nil} + } + return Event{Down, 0, nil} + case 'A': + if alt { + return Event{AltUp, 0, nil} + } + return Event{Up, 0, nil} + case 'Z': + return Event{BTab, 0, nil} + case 'H': + return Event{Home, 0, nil} + case 'F': + return Event{End, 0, nil} + case 'M': + return r.mouseSequence(sz) + case 'P': + return Event{F1, 0, nil} + case 'Q': + return Event{F2, 0, nil} + case 'R': + return Event{F3, 0, nil} + case 'S': + return Event{F4, 0, nil} + case '1', '2', '3', '4', '5', '6': + if len(r.buffer) < 4 { + return Event{Invalid, 0, nil} + } + *sz = 4 + switch r.buffer[2] { + case '2': + if r.buffer[3] == '~' { + return Event{Insert, 0, nil} + } + if len(r.buffer) > 4 && r.buffer[4] == '~' { + *sz = 5 + switch r.buffer[3] { + case '0': + return Event{F9, 0, nil} + case '1': + return Event{F10, 0, nil} + case '3': + return Event{F11, 0, nil} + case '4': + return Event{F12, 0, nil} + } + } + // Bracketed paste mode: \e[200~ ... \e[201~ + if len(r.buffer) > 5 && r.buffer[3] == '0' && (r.buffer[4] == '0' || r.buffer[4] == '1') && r.buffer[5] == '~' { + // Immediately discard the sequence from the buffer and reread input + r.buffer = r.buffer[6:] + *sz = 0 + return r.GetChar() + } + return Event{Invalid, 0, nil} // INS + case '3': + return Event{Del, 0, nil} + case '4': + return Event{End, 0, nil} + case '5': + return Event{PgUp, 0, nil} + case '6': + return Event{PgDn, 0, nil} + case '1': + switch r.buffer[3] { + case '~': + return Event{Home, 0, nil} + case '1', '2', '3', '4', '5', '7', '8', '9': + if len(r.buffer) == 5 && r.buffer[4] == '~' { + *sz = 5 + switch r.buffer[3] { + case '1': + return Event{F1, 0, nil} + case '2': + return Event{F2, 0, nil} + case '3': + return Event{F3, 0, nil} + case '4': + return Event{F4, 0, nil} + case '5': + return Event{F5, 0, nil} + case '7': + return Event{F6, 0, nil} + case '8': + return Event{F7, 0, nil} + case '9': + return Event{F8, 0, nil} + } + } + return Event{Invalid, 0, nil} + case ';': + if len(r.buffer) < 6 { + return Event{Invalid, 0, nil} + } + *sz = 6 + switch r.buffer[4] { + case '1', '2', '3', '5': + alt := r.buffer[4] == '3' + altShift := r.buffer[4] == '1' && r.buffer[5] == '0' + char := r.buffer[5] + if altShift { + if len(r.buffer) < 7 { + return Event{Invalid, 0, nil} + } + *sz = 7 + char = r.buffer[6] + } + switch char { + case 'A': + if alt { + return Event{AltUp, 0, nil} + } + if altShift { + return Event{AltSUp, 0, nil} + } + return Event{SUp, 0, nil} + case 'B': + if alt { + return Event{AltDown, 0, nil} + } + if altShift { + return Event{AltSDown, 0, nil} + } + return Event{SDown, 0, nil} + case 'C': + if alt { + return Event{AltRight, 0, nil} + } + if altShift { + return Event{AltSRight, 0, nil} + } + return Event{SRight, 0, nil} + case 'D': + if alt { + return Event{AltLeft, 0, nil} + } + if altShift { + return Event{AltSLeft, 0, nil} + } + return Event{SLeft, 0, nil} + } + } // r.buffer[4] + } // r.buffer[3] + } // r.buffer[2] + } // r.buffer[2] + } // r.buffer[1] + rest := bytes.NewBuffer(r.buffer[1:]) + c, size, err := rest.ReadRune() + if err == nil { + *sz = 1 + size + return AltKey(c) + } + return Event{Invalid, 0, nil} +} + +func (r *LightRenderer) mouseSequence(sz *int) Event { + if len(r.buffer) < 6 || !r.mouse { + return Event{Invalid, 0, nil} + } + *sz = 6 + switch r.buffer[3] { + case 32, 34, 36, 40, 48, // mouse-down / shift / cmd / ctrl + 35, 39, 43, 51: // mouse-up / shift / cmd / ctrl + mod := r.buffer[3] >= 36 + left := r.buffer[3] == 32 + down := r.buffer[3]%2 == 0 + x := int(r.buffer[4] - 33) + y := int(r.buffer[5]-33) - r.yoffset + double := false + if down { + now := time.Now() + if !left { // Right double click is not allowed + r.clickY = []int{} + } else if now.Sub(r.prevDownTime) < doubleClickDuration { + r.clickY = append(r.clickY, y) + } else { + r.clickY = []int{y} + } + r.prevDownTime = now + } else { + if len(r.clickY) > 1 && r.clickY[0] == r.clickY[1] && + time.Since(r.prevDownTime) < doubleClickDuration { + double = true + } + } + + return Event{Mouse, 0, &MouseEvent{y, x, 0, left, down, double, mod}} + case 96, 100, 104, 112, // scroll-up / shift / cmd / ctrl + 97, 101, 105, 113: // scroll-down / shift / cmd / ctrl + mod := r.buffer[3] >= 100 + s := 1 - int(r.buffer[3]%2)*2 + x := int(r.buffer[4] - 33) + y := int(r.buffer[5]-33) - r.yoffset + return Event{Mouse, 0, &MouseEvent{y, x, s, false, false, false, mod}} + } + return Event{Invalid, 0, nil} +} + +func (r *LightRenderer) smcup() { + r.csi("?1049h") +} + +func (r *LightRenderer) rmcup() { + r.csi("?1049l") +} + +func (r *LightRenderer) Pause(clear bool) { + r.restoreTerminal() + if clear { + if r.fullscreen { + r.rmcup() + } else { + r.smcup() + r.csi("H") + } + r.flush() + } +} + +func (r *LightRenderer) Resume(clear bool, sigcont bool) { + r.setupTerminal() + if clear { + if r.fullscreen { + r.smcup() + } else { + r.rmcup() + } + r.flush() + } else if sigcont && !r.fullscreen && r.mouse { + // NOTE: SIGCONT (Coming back from CTRL-Z): + // It's highly likely that the offset we obtained at the beginning is + // no longer correct, so we simply disable mouse input. + r.csi("?1000l") + r.mouse = false + } +} + +func (r *LightRenderer) Clear() { + if r.fullscreen { + r.csi("H") + } + // r.csi("u") + r.origin() + r.csi("J") + r.flush() +} + +func (r *LightRenderer) RefreshWindows(windows []Window) { + r.flush() +} + +func (r *LightRenderer) Refresh() { + r.updateTerminalSize() +} + +func (r *LightRenderer) Close() { + // r.csi("u") + if r.clearOnExit { + if r.fullscreen { + r.rmcup() + } else { + r.origin() + if r.upOneLine { + r.csi("A") + } + r.csi("J") + } + } else if !r.fullscreen { + r.csi("u") + } + if r.mouse { + r.csi("?1000l") + } + r.flush() + r.closePlatform() + r.restoreTerminal() +} + +func (r *LightRenderer) MaxX() int { + return r.width +} + +func (r *LightRenderer) MaxY() int { + return r.height +} + +func (r *LightRenderer) NewWindow(top int, left int, width int, height int, preview bool, borderStyle BorderStyle) Window { + w := &LightWindow{ + renderer: r, + colored: r.theme.Colored, + preview: preview, + border: borderStyle, + top: top, + left: left, + width: width, + height: height, + tabstop: r.tabstop, + fg: colDefault, + bg: colDefault} + if preview { + w.fg = r.theme.PreviewFg.Color + w.bg = r.theme.PreviewBg.Color + } else { + w.fg = r.theme.Fg.Color + w.bg = r.theme.Bg.Color + } + w.drawBorder() + return w +} + +func (w *LightWindow) drawBorder() { + switch w.border.shape { + case BorderRounded, BorderSharp: + w.drawBorderAround() + case BorderHorizontal: + w.drawBorderHorizontal(true, true) + case BorderVertical: + w.drawBorderVertical(true, true) + case BorderTop: + w.drawBorderHorizontal(true, false) + case BorderBottom: + w.drawBorderHorizontal(false, true) + case BorderLeft: + w.drawBorderVertical(true, false) + case BorderRight: + w.drawBorderVertical(false, true) + } +} + +func (w *LightWindow) drawBorderHorizontal(top, bottom bool) { + color := ColBorder + if w.preview { + color = ColPreviewBorder + } + if top { + w.Move(0, 0) + w.CPrint(color, repeat(w.border.horizontal, w.width)) + } + if bottom { + w.Move(w.height-1, 0) + w.CPrint(color, repeat(w.border.horizontal, w.width)) + } +} + +func (w *LightWindow) drawBorderVertical(left, right bool) { + width := w.width - 2 + if !left || !right { + width++ + } + color := ColBorder + if w.preview { + color = ColPreviewBorder + } + for y := 0; y < w.height; y++ { + w.Move(y, 0) + if left { + w.CPrint(color, string(w.border.vertical)) + } + w.CPrint(color, repeat(' ', width)) + if right { + w.CPrint(color, string(w.border.vertical)) + } + } +} + +func (w *LightWindow) drawBorderAround() { + w.Move(0, 0) + color := ColBorder + if w.preview { + color = ColPreviewBorder + } + w.CPrint(color, string(w.border.topLeft)+repeat(w.border.horizontal, w.width-2)+string(w.border.topRight)) + for y := 1; y < w.height-1; y++ { + w.Move(y, 0) + w.CPrint(color, string(w.border.vertical)) + w.CPrint(color, repeat(' ', w.width-2)) + w.CPrint(color, string(w.border.vertical)) + } + w.Move(w.height-1, 0) + w.CPrint(color, string(w.border.bottomLeft)+repeat(w.border.horizontal, w.width-2)+string(w.border.bottomRight)) +} + +func (w *LightWindow) csi(code string) { + w.renderer.csi(code) +} + +func (w *LightWindow) stderrInternal(str string, allowNLCR bool) { + w.renderer.stderrInternal(str, allowNLCR) +} + +func (w *LightWindow) Top() int { + return w.top +} + +func (w *LightWindow) Left() int { + return w.left +} + +func (w *LightWindow) Width() int { + return w.width +} + +func (w *LightWindow) Height() int { + return w.height +} + +func (w *LightWindow) Refresh() { +} + +func (w *LightWindow) Close() { +} + +func (w *LightWindow) X() int { + return w.posx +} + +func (w *LightWindow) Y() int { + return w.posy +} + +func (w *LightWindow) Enclose(y int, x int) bool { + return x >= w.left && x < (w.left+w.width) && + y >= w.top && y < (w.top+w.height) +} + +func (w *LightWindow) Move(y int, x int) { + w.posx = x + w.posy = y + + w.renderer.move(w.Top()+y, w.Left()+x) +} + +func (w *LightWindow) MoveAndClear(y int, x int) { + w.Move(y, x) + // We should not delete preview window on the right + // csi("K") + w.Print(repeat(' ', w.width-x)) + w.Move(y, x) +} + +func attrCodes(attr Attr) []string { + codes := []string{} + if (attr & AttrClear) > 0 { + return codes + } + if (attr & Bold) > 0 { + codes = append(codes, "1") + } + if (attr & Dim) > 0 { + codes = append(codes, "2") + } + if (attr & Italic) > 0 { + codes = append(codes, "3") + } + if (attr & Underline) > 0 { + codes = append(codes, "4") + } + if (attr & Blink) > 0 { + codes = append(codes, "5") + } + if (attr & Reverse) > 0 { + codes = append(codes, "7") + } + return codes +} + +func colorCodes(fg Color, bg Color) []string { + codes := []string{} + appendCode := func(c Color, offset int) { + if c == colDefault { + return + } + if c.is24() { + r := (c >> 16) & 0xff + g := (c >> 8) & 0xff + b := (c) & 0xff + codes = append(codes, fmt.Sprintf("%d;2;%d;%d;%d", 38+offset, r, g, b)) + } else if c >= colBlack && c <= colWhite { + codes = append(codes, fmt.Sprintf("%d", int(c)+30+offset)) + } else if c > colWhite && c < 16 { + codes = append(codes, fmt.Sprintf("%d", int(c)+90+offset-8)) + } else if c >= 16 && c < 256 { + codes = append(codes, fmt.Sprintf("%d;5;%d", 38+offset, c)) + } + } + appendCode(fg, 0) + appendCode(bg, 10) + return codes +} + +func (w *LightWindow) csiColor(fg Color, bg Color, attr Attr) bool { + codes := append(attrCodes(attr), colorCodes(fg, bg)...) + w.csi(";" + strings.Join(codes, ";") + "m") + return len(codes) > 0 +} + +func (w *LightWindow) Print(text string) { + w.cprint2(colDefault, w.bg, AttrRegular, text) +} + +func cleanse(str string) string { + return strings.Replace(str, "\x1b", "", -1) +} + +func (w *LightWindow) CPrint(pair ColorPair, text string) { + w.csiColor(pair.Fg(), pair.Bg(), pair.Attr()) + w.stderrInternal(cleanse(text), false) + w.csi("m") +} + +func (w *LightWindow) cprint2(fg Color, bg Color, attr Attr, text string) { + if w.csiColor(fg, bg, attr) { + defer w.csi("m") + } + w.stderrInternal(cleanse(text), false) +} + +type wrappedLine struct { + text string + displayWidth int +} + +func wrapLine(input string, prefixLength int, max int, tabstop int) []wrappedLine { + lines := []wrappedLine{} + width := 0 + line := "" + gr := uniseg.NewGraphemes(input) + for gr.Next() { + rs := gr.Runes() + str := string(rs) + var w int + if len(rs) == 1 && rs[0] == '\t' { + w = tabstop - (prefixLength+width)%tabstop + str = repeat(' ', w) + } else { + w = runewidth.StringWidth(str) + } + width += w + + if prefixLength+width <= max { + line += str + } else { + lines = append(lines, wrappedLine{string(line), width - w}) + line = str + prefixLength = 0 + width = w + } + } + lines = append(lines, wrappedLine{string(line), width}) + return lines +} + +func (w *LightWindow) fill(str string, onMove func()) FillReturn { + allLines := strings.Split(str, "\n") + for i, line := range allLines { + lines := wrapLine(line, w.posx, w.width, w.tabstop) + for j, wl := range lines { + w.stderrInternal(wl.text, false) + w.posx += wl.displayWidth + + // Wrap line + if j < len(lines)-1 || i < len(allLines)-1 { + if w.posy+1 >= w.height { + return FillSuspend + } + w.MoveAndClear(w.posy, w.posx) + w.Move(w.posy+1, 0) + onMove() + } + } + } + if w.posx+1 >= w.Width() { + if w.posy+1 >= w.height { + return FillSuspend + } + w.Move(w.posy+1, 0) + onMove() + return FillNextLine + } + return FillContinue +} + +func (w *LightWindow) setBg() { + if w.bg != colDefault { + w.csiColor(colDefault, w.bg, AttrRegular) + } +} + +func (w *LightWindow) Fill(text string) FillReturn { + w.Move(w.posy, w.posx) + w.setBg() + return w.fill(text, w.setBg) +} + +func (w *LightWindow) CFill(fg Color, bg Color, attr Attr, text string) FillReturn { + w.Move(w.posy, w.posx) + if fg == colDefault { + fg = w.fg + } + if bg == colDefault { + bg = w.bg + } + if w.csiColor(fg, bg, attr) { + defer w.csi("m") + return w.fill(text, func() { w.csiColor(fg, bg, attr) }) + } + return w.fill(text, w.setBg) +} + +func (w *LightWindow) FinishFill() { + w.MoveAndClear(w.posy, w.posx) + for y := w.posy + 1; y < w.height; y++ { + w.MoveAndClear(y, 0) + } +} + +func (w *LightWindow) Erase() { + w.drawBorder() + // We don't erase the window here to avoid flickering during scroll + w.Move(0, 0) +} diff --git a/.fzf/src/tui/light_unix.go b/.fzf/src/tui/light_unix.go new file mode 100644 index 0000000..936a13e --- /dev/null +++ b/.fzf/src/tui/light_unix.go @@ -0,0 +1,110 @@ +// +build !windows + +package tui + +import ( + "fmt" + "os" + "os/exec" + "strings" + "syscall" + + "github.com/junegunn/fzf/src/util" + "golang.org/x/term" +) + +func IsLightRendererSupported() bool { + return true +} + +func (r *LightRenderer) defaultTheme() *ColorTheme { + if strings.Contains(os.Getenv("TERM"), "256") { + return Dark256 + } + colors, err := exec.Command("tput", "colors").Output() + if err == nil && atoi(strings.TrimSpace(string(colors)), 16) > 16 { + return Dark256 + } + return Default16 +} + +func (r *LightRenderer) fd() int { + return int(r.ttyin.Fd()) +} + +func (r *LightRenderer) initPlatform() error { + fd := r.fd() + origState, err := term.GetState(fd) + if err != nil { + return err + } + r.origState = origState + term.MakeRaw(fd) + return nil +} + +func (r *LightRenderer) closePlatform() { + // NOOP +} + +func openTtyIn() *os.File { + in, err := os.OpenFile(consoleDevice, syscall.O_RDONLY, 0) + if err != nil { + tty := ttyname() + if len(tty) > 0 { + if in, err := os.OpenFile(tty, syscall.O_RDONLY, 0); err == nil { + return in + } + } + fmt.Fprintln(os.Stderr, "Failed to open "+consoleDevice) + os.Exit(2) + } + return in +} + +func (r *LightRenderer) setupTerminal() { + term.MakeRaw(r.fd()) +} + +func (r *LightRenderer) restoreTerminal() { + term.Restore(r.fd(), r.origState) +} + +func (r *LightRenderer) updateTerminalSize() { + width, height, err := term.GetSize(r.fd()) + + if err == nil { + r.width = width + r.height = r.maxHeightFunc(height) + } else { + r.width = getEnv("COLUMNS", defaultWidth) + r.height = r.maxHeightFunc(getEnv("LINES", defaultHeight)) + } +} + +func (r *LightRenderer) findOffset() (row int, col int) { + r.csi("6n") + r.flush() + bytes := []byte{} + for tries := 0; tries < offsetPollTries; tries++ { + bytes = r.getBytesInternal(bytes, tries > 0) + offsets := offsetRegexp.FindSubmatch(bytes) + if len(offsets) > 3 { + // Add anything we skipped over to the input buffer + r.buffer = append(r.buffer, offsets[1]...) + return atoi(string(offsets[2]), 0) - 1, atoi(string(offsets[3]), 0) - 1 + } + } + return -1, -1 +} + +func (r *LightRenderer) getch(nonblock bool) (int, bool) { + b := make([]byte, 1) + fd := r.fd() + util.SetNonblock(r.ttyin, nonblock) + _, err := util.Read(fd, b) + if err != nil { + return 0, false + } + return int(b[0]), true +} diff --git a/.fzf/src/tui/light_windows.go b/.fzf/src/tui/light_windows.go new file mode 100644 index 0000000..875bf6f --- /dev/null +++ b/.fzf/src/tui/light_windows.go @@ -0,0 +1,145 @@ +//+build windows + +package tui + +import ( + "os" + "syscall" + "time" + + "github.com/junegunn/fzf/src/util" + "golang.org/x/sys/windows" +) + +const ( + timeoutInterval = 10 +) + +var ( + consoleFlagsInput = uint32(windows.ENABLE_VIRTUAL_TERMINAL_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_EXTENDED_FLAGS) + consoleFlagsOutput = uint32(windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING | windows.ENABLE_PROCESSED_OUTPUT | windows.DISABLE_NEWLINE_AUTO_RETURN) +) + +// IsLightRendererSupported checks to see if the Light renderer is supported +func IsLightRendererSupported() bool { + var oldState uint32 + // enable vt100 emulation (https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) + if windows.GetConsoleMode(windows.Stderr, &oldState) != nil { + return false + } + // attempt to set mode to determine if we support VT 100 codes. This will work on newer Windows 10 + // version: + canSetVt100 := windows.SetConsoleMode(windows.Stderr, oldState|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) == nil + var checkState uint32 + if windows.GetConsoleMode(windows.Stderr, &checkState) != nil || + (checkState&windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING) != windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING { + return false + } + windows.SetConsoleMode(windows.Stderr, oldState) + return canSetVt100 +} + +func (r *LightRenderer) defaultTheme() *ColorTheme { + // the getenv check is borrowed from here: https://github.com/gdamore/tcell/commit/0c473b86d82f68226a142e96cc5a34c5a29b3690#diff-b008fcd5e6934bf31bc3d33bf49f47d8R178: + if !IsLightRendererSupported() || os.Getenv("ConEmuPID") != "" || os.Getenv("TCELL_TRUECOLOR") == "disable" { + return Default16 + } + return Dark256 +} + +func (r *LightRenderer) initPlatform() error { + //outHandle := windows.Stdout + outHandle, _ := syscall.Open("CONOUT$", syscall.O_RDWR, 0) + // enable vt100 emulation (https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) + if err := windows.GetConsoleMode(windows.Handle(outHandle), &r.origStateOutput); err != nil { + return err + } + r.outHandle = uintptr(outHandle) + inHandle, _ := syscall.Open("CONIN$", syscall.O_RDWR, 0) + if err := windows.GetConsoleMode(windows.Handle(inHandle), &r.origStateInput); err != nil { + return err + } + r.inHandle = uintptr(inHandle) + + r.setupTerminal() + + // channel for non-blocking reads. Buffer to make sure + // we get the ESC sets: + r.ttyinChannel = make(chan byte, 1024) + + // the following allows for non-blocking IO. + // syscall.SetNonblock() is a NOOP under Windows. + go func() { + fd := int(r.inHandle) + b := make([]byte, 1) + for { + // HACK: if run from PSReadline, something resets ConsoleMode to remove ENABLE_VIRTUAL_TERMINAL_INPUT. + _ = windows.SetConsoleMode(windows.Handle(r.inHandle), consoleFlagsInput) + + _, err := util.Read(fd, b) + if err == nil { + r.ttyinChannel <- b[0] + } + } + }() + + return nil +} + +func (r *LightRenderer) closePlatform() { + windows.SetConsoleMode(windows.Handle(r.outHandle), r.origStateOutput) + windows.SetConsoleMode(windows.Handle(r.inHandle), r.origStateInput) +} + +func openTtyIn() *os.File { + // not used + return nil +} + +func (r *LightRenderer) setupTerminal() error { + if err := windows.SetConsoleMode(windows.Handle(r.outHandle), consoleFlagsOutput); err != nil { + return err + } + return windows.SetConsoleMode(windows.Handle(r.inHandle), consoleFlagsInput) +} + +func (r *LightRenderer) restoreTerminal() error { + if err := windows.SetConsoleMode(windows.Handle(r.inHandle), r.origStateInput); err != nil { + return err + } + return windows.SetConsoleMode(windows.Handle(r.outHandle), r.origStateOutput) +} + +func (r *LightRenderer) updateTerminalSize() { + var bufferInfo windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(r.outHandle), &bufferInfo); err != nil { + r.width = getEnv("COLUMNS", defaultWidth) + r.height = r.maxHeightFunc(getEnv("LINES", defaultHeight)) + + } else { + r.width = int(bufferInfo.Window.Right - bufferInfo.Window.Left) + r.height = r.maxHeightFunc(int(bufferInfo.Window.Bottom - bufferInfo.Window.Top)) + } +} + +func (r *LightRenderer) findOffset() (row int, col int) { + var bufferInfo windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(r.outHandle), &bufferInfo); err != nil { + return -1, -1 + } + return int(bufferInfo.CursorPosition.X), int(bufferInfo.CursorPosition.Y) +} + +func (r *LightRenderer) getch(nonblock bool) (int, bool) { + if nonblock { + select { + case bc := <-r.ttyinChannel: + return int(bc), true + case <-time.After(timeoutInterval * time.Millisecond): + return 0, false + } + } else { + bc := <-r.ttyinChannel + return int(bc), true + } +} diff --git a/.fzf/src/tui/tcell.go b/.fzf/src/tui/tcell.go new file mode 100644 index 0000000..82c7566 --- /dev/null +++ b/.fzf/src/tui/tcell.go @@ -0,0 +1,721 @@ +// +build tcell windows + +package tui + +import ( + "os" + "time" + + "runtime" + + "github.com/gdamore/tcell" + "github.com/gdamore/tcell/encoding" + + "github.com/mattn/go-runewidth" + "github.com/rivo/uniseg" +) + +func HasFullscreenRenderer() bool { + return true +} + +func (p ColorPair) style() tcell.Style { + style := tcell.StyleDefault + return style.Foreground(tcell.Color(p.Fg())).Background(tcell.Color(p.Bg())) +} + +type Attr tcell.Style + +type TcellWindow struct { + color bool + preview bool + top int + left int + width int + height int + normal ColorPair + lastX int + lastY int + moveCursor bool + borderStyle BorderStyle +} + +func (w *TcellWindow) Top() int { + return w.top +} + +func (w *TcellWindow) Left() int { + return w.left +} + +func (w *TcellWindow) Width() int { + return w.width +} + +func (w *TcellWindow) Height() int { + return w.height +} + +func (w *TcellWindow) Refresh() { + if w.moveCursor { + _screen.ShowCursor(w.left+w.lastX, w.top+w.lastY) + w.moveCursor = false + } + w.lastX = 0 + w.lastY = 0 + + w.drawBorder() +} + +func (w *TcellWindow) FinishFill() { + // NO-OP +} + +const ( + Bold Attr = Attr(tcell.AttrBold) + Dim = Attr(tcell.AttrDim) + Blink = Attr(tcell.AttrBlink) + Reverse = Attr(tcell.AttrReverse) + Underline = Attr(tcell.AttrUnderline) + Italic = Attr(tcell.AttrItalic) +) + +const ( + AttrUndefined = Attr(0) + AttrRegular = Attr(1 << 7) + AttrClear = Attr(1 << 8) +) + +func (r *FullscreenRenderer) defaultTheme() *ColorTheme { + if _screen.Colors() >= 256 { + return Dark256 + } + return Default16 +} + +var ( + _colorToAttribute = []tcell.Color{ + tcell.ColorBlack, + tcell.ColorRed, + tcell.ColorGreen, + tcell.ColorYellow, + tcell.ColorBlue, + tcell.ColorDarkMagenta, + tcell.ColorLightCyan, + tcell.ColorWhite, + } +) + +func (c Color) Style() tcell.Color { + if c <= colDefault { + return tcell.ColorDefault + } else if c >= colBlack && c <= colWhite { + return _colorToAttribute[int(c)] + } else { + return tcell.Color(c) + } +} + +func (a Attr) Merge(b Attr) Attr { + return a | b +} + +// handle the following as private members of FullscreenRenderer instance +// they are declared here to prevent introducing tcell library in non-windows builds +var ( + _screen tcell.Screen + _prevMouseButton tcell.ButtonMask +) + +func (r *FullscreenRenderer) initScreen() { + s, e := tcell.NewScreen() + if e != nil { + errorExit(e.Error()) + } + if e = s.Init(); e != nil { + errorExit(e.Error()) + } + if r.mouse { + s.EnableMouse() + } else { + s.DisableMouse() + } + _screen = s +} + +func (r *FullscreenRenderer) Init() { + if os.Getenv("TERM") == "cygwin" { + os.Setenv("TERM", "") + } + encoding.Register() + + r.initScreen() + initTheme(r.theme, r.defaultTheme(), r.forceBlack) +} + +func (r *FullscreenRenderer) MaxX() int { + ncols, _ := _screen.Size() + return int(ncols) +} + +func (r *FullscreenRenderer) MaxY() int { + _, nlines := _screen.Size() + return int(nlines) +} + +func (w *TcellWindow) X() int { + return w.lastX +} + +func (w *TcellWindow) Y() int { + return w.lastY +} + +func (r *FullscreenRenderer) Clear() { + _screen.Sync() + _screen.Clear() +} + +func (r *FullscreenRenderer) Refresh() { + // noop +} + +func (r *FullscreenRenderer) GetChar() Event { + ev := _screen.PollEvent() + switch ev := ev.(type) { + case *tcell.EventResize: + return Event{Resize, 0, nil} + + // process mouse events: + case *tcell.EventMouse: + // mouse down events have zeroed buttons, so we can't use them + // mouse up event consists of two events, 1. (main) event with modifier and other metadata, 2. event with zeroed buttons + // so mouse click is three consecutive events, but the first and last are indistinguishable from movement events (with released buttons) + // dragging has same structure, it only repeats the middle (main) event appropriately + x, y := ev.Position() + mod := ev.Modifiers() != 0 + + // since we dont have mouse down events (unlike LightRenderer), we need to track state in prevButton + prevButton, button := _prevMouseButton, ev.Buttons() + _prevMouseButton = button + drag := prevButton == button + + switch { + case button&tcell.WheelDown != 0: + return Event{Mouse, 0, &MouseEvent{y, x, -1, false, false, false, mod}} + case button&tcell.WheelUp != 0: + return Event{Mouse, 0, &MouseEvent{y, x, +1, false, false, false, mod}} + case button&tcell.Button1 != 0 && !drag: + // all potential double click events put their 'line' coordinate in the clickY array + // double click event has two conditions, temporal and spatial, the first is checked here + now := time.Now() + if now.Sub(r.prevDownTime) < doubleClickDuration { + r.clickY = append(r.clickY, y) + } else { + r.clickY = []int{y} + } + r.prevDownTime = now + + // detect double clicks (also check for spatial condition) + n := len(r.clickY) + double := n > 1 && r.clickY[n-2] == r.clickY[n-1] + if double { + // make sure two consecutive double clicks require four clicks + r.clickY = []int{} + } + + // fire single or double click event + return Event{Mouse, 0, &MouseEvent{y, x, 0, true, !double, double, mod}} + case button&tcell.Button2 != 0 && !drag: + return Event{Mouse, 0, &MouseEvent{y, x, 0, false, true, false, mod}} + case runtime.GOOS != "windows": + + // double and single taps on Windows don't quite work due to + // the console acting on the events and not allowing us + // to consume them. + + left := button&tcell.Button1 != 0 + down := left || button&tcell.Button3 != 0 + double := false + if down { + now := time.Now() + if !left { + r.clickY = []int{} + } else if now.Sub(r.prevDownTime) < doubleClickDuration { + r.clickY = append(r.clickY, x) + } else { + r.clickY = []int{x} + r.prevDownTime = now + } + } else { + if len(r.clickY) > 1 && r.clickY[0] == r.clickY[1] && + time.Now().Sub(r.prevDownTime) < doubleClickDuration { + double = true + } + } + + return Event{Mouse, 0, &MouseEvent{y, x, 0, left, down, double, mod}} + } + + // process keyboard: + case *tcell.EventKey: + mods := ev.Modifiers() + none := mods == tcell.ModNone + alt := (mods & tcell.ModAlt) > 0 + ctrl := (mods & tcell.ModCtrl) > 0 + shift := (mods & tcell.ModShift) > 0 + ctrlAlt := ctrl && alt + altShift := alt && shift + + keyfn := func(r rune) Event { + if alt { + return CtrlAltKey(r) + } + return EventType(CtrlA.Int() - 'a' + int(r)).AsEvent() + } + switch ev.Key() { + // section 1: Ctrl+(Alt)+[a-z] + case tcell.KeyCtrlA: + return keyfn('a') + case tcell.KeyCtrlB: + return keyfn('b') + case tcell.KeyCtrlC: + return keyfn('c') + case tcell.KeyCtrlD: + return keyfn('d') + case tcell.KeyCtrlE: + return keyfn('e') + case tcell.KeyCtrlF: + return keyfn('f') + case tcell.KeyCtrlG: + return keyfn('g') + case tcell.KeyCtrlH: + switch ev.Rune() { + case 0: + if ctrl { + return Event{BSpace, 0, nil} + } + case rune(tcell.KeyCtrlH): + switch { + case ctrl: + return keyfn('h') + case alt: + return Event{AltBS, 0, nil} + case none, shift: + return Event{BSpace, 0, nil} + } + } + case tcell.KeyCtrlI: + return keyfn('i') + case tcell.KeyCtrlJ: + return keyfn('j') + case tcell.KeyCtrlK: + return keyfn('k') + case tcell.KeyCtrlL: + return keyfn('l') + case tcell.KeyCtrlM: + return keyfn('m') + case tcell.KeyCtrlN: + return keyfn('n') + case tcell.KeyCtrlO: + return keyfn('o') + case tcell.KeyCtrlP: + return keyfn('p') + case tcell.KeyCtrlQ: + return keyfn('q') + case tcell.KeyCtrlR: + return keyfn('r') + case tcell.KeyCtrlS: + return keyfn('s') + case tcell.KeyCtrlT: + return keyfn('t') + case tcell.KeyCtrlU: + return keyfn('u') + case tcell.KeyCtrlV: + return keyfn('v') + case tcell.KeyCtrlW: + return keyfn('w') + case tcell.KeyCtrlX: + return keyfn('x') + case tcell.KeyCtrlY: + return keyfn('y') + case tcell.KeyCtrlZ: + return keyfn('z') + // section 2: Ctrl+[ \]_] + case tcell.KeyCtrlSpace: + return Event{CtrlSpace, 0, nil} + case tcell.KeyCtrlBackslash: + return Event{CtrlBackSlash, 0, nil} + case tcell.KeyCtrlRightSq: + return Event{CtrlRightBracket, 0, nil} + case tcell.KeyCtrlCarat: + return Event{CtrlCaret, 0, nil} + case tcell.KeyCtrlUnderscore: + return Event{CtrlSlash, 0, nil} + // section 3: (Alt)+Backspace2 + case tcell.KeyBackspace2: + if alt { + return Event{AltBS, 0, nil} + } + return Event{BSpace, 0, nil} + + // section 4: (Alt+Shift)+Key(Up|Down|Left|Right) + case tcell.KeyUp: + if altShift { + return Event{AltSUp, 0, nil} + } + if shift { + return Event{SUp, 0, nil} + } + if alt { + return Event{AltUp, 0, nil} + } + return Event{Up, 0, nil} + case tcell.KeyDown: + if altShift { + return Event{AltSDown, 0, nil} + } + if shift { + return Event{SDown, 0, nil} + } + if alt { + return Event{AltDown, 0, nil} + } + return Event{Down, 0, nil} + case tcell.KeyLeft: + if altShift { + return Event{AltSLeft, 0, nil} + } + if shift { + return Event{SLeft, 0, nil} + } + if alt { + return Event{AltLeft, 0, nil} + } + return Event{Left, 0, nil} + case tcell.KeyRight: + if altShift { + return Event{AltSRight, 0, nil} + } + if shift { + return Event{SRight, 0, nil} + } + if alt { + return Event{AltRight, 0, nil} + } + return Event{Right, 0, nil} + + // section 5: (Insert|Home|Delete|End|PgUp|PgDn|BackTab|F1-F12) + case tcell.KeyInsert: + return Event{Insert, 0, nil} + case tcell.KeyHome: + return Event{Home, 0, nil} + case tcell.KeyDelete: + return Event{Del, 0, nil} + case tcell.KeyEnd: + return Event{End, 0, nil} + case tcell.KeyPgUp: + return Event{PgUp, 0, nil} + case tcell.KeyPgDn: + return Event{PgDn, 0, nil} + case tcell.KeyBacktab: + return Event{BTab, 0, nil} + case tcell.KeyF1: + return Event{F1, 0, nil} + case tcell.KeyF2: + return Event{F2, 0, nil} + case tcell.KeyF3: + return Event{F3, 0, nil} + case tcell.KeyF4: + return Event{F4, 0, nil} + case tcell.KeyF5: + return Event{F5, 0, nil} + case tcell.KeyF6: + return Event{F6, 0, nil} + case tcell.KeyF7: + return Event{F7, 0, nil} + case tcell.KeyF8: + return Event{F8, 0, nil} + case tcell.KeyF9: + return Event{F9, 0, nil} + case tcell.KeyF10: + return Event{F10, 0, nil} + case tcell.KeyF11: + return Event{F11, 0, nil} + case tcell.KeyF12: + return Event{F12, 0, nil} + + // section 6: (Ctrl+Alt)+'rune' + case tcell.KeyRune: + r := ev.Rune() + + switch { + // translate native key events to ascii control characters + case r == ' ' && ctrl: + return Event{CtrlSpace, 0, nil} + // handle AltGr characters + case ctrlAlt: + return Event{Rune, r, nil} // dropping modifiers + // simple characters (possibly with modifier) + case alt: + return AltKey(r) + default: + return Event{Rune, r, nil} + } + + // section 7: Esc + case tcell.KeyEsc: + return Event{ESC, 0, nil} + } + } + + // section 8: Invalid + return Event{Invalid, 0, nil} +} + +func (r *FullscreenRenderer) Pause(clear bool) { + if clear { + _screen.Fini() + } +} + +func (r *FullscreenRenderer) Resume(clear bool, sigcont bool) { + if clear { + r.initScreen() + } +} + +func (r *FullscreenRenderer) Close() { + _screen.Fini() +} + +func (r *FullscreenRenderer) RefreshWindows(windows []Window) { + // TODO + for _, w := range windows { + w.Refresh() + } + _screen.Show() +} + +func (r *FullscreenRenderer) NewWindow(top int, left int, width int, height int, preview bool, borderStyle BorderStyle) Window { + normal := ColNormal + if preview { + normal = ColPreview + } + return &TcellWindow{ + color: r.theme.Colored, + preview: preview, + top: top, + left: left, + width: width, + height: height, + normal: normal, + borderStyle: borderStyle} +} + +func (w *TcellWindow) Close() { + // TODO +} + +func fill(x, y, w, h int, n ColorPair, r rune) { + for ly := 0; ly <= h; ly++ { + for lx := 0; lx <= w; lx++ { + _screen.SetContent(x+lx, y+ly, r, nil, n.style()) + } + } +} + +func (w *TcellWindow) Erase() { + fill(w.left-1, w.top, w.width+1, w.height, w.normal, ' ') +} + +func (w *TcellWindow) Enclose(y int, x int) bool { + return x >= w.left && x < (w.left+w.width) && + y >= w.top && y < (w.top+w.height) +} + +func (w *TcellWindow) Move(y int, x int) { + w.lastX = x + w.lastY = y + w.moveCursor = true +} + +func (w *TcellWindow) MoveAndClear(y int, x int) { + w.Move(y, x) + for i := w.lastX; i < w.width; i++ { + _screen.SetContent(i+w.left, w.lastY+w.top, rune(' '), nil, w.normal.style()) + } + w.lastX = x +} + +func (w *TcellWindow) Print(text string) { + w.printString(text, w.normal) +} + +func (w *TcellWindow) printString(text string, pair ColorPair) { + lx := 0 + a := pair.Attr() + + style := pair.style() + if a&AttrClear == 0 { + style = style. + Reverse(a&Attr(tcell.AttrReverse) != 0). + Underline(a&Attr(tcell.AttrUnderline) != 0). + Italic(a&Attr(tcell.AttrItalic) != 0). + Blink(a&Attr(tcell.AttrBlink) != 0). + Dim(a&Attr(tcell.AttrDim) != 0) + } + + gr := uniseg.NewGraphemes(text) + for gr.Next() { + rs := gr.Runes() + + if len(rs) == 1 { + r := rs[0] + if r < rune(' ') { // ignore control characters + continue + } else if r == '\n' { + w.lastY++ + lx = 0 + continue + } else if r == '\u000D' { // skip carriage return + continue + } + } + var xPos = w.left + w.lastX + lx + var yPos = w.top + w.lastY + if xPos < (w.left+w.width) && yPos < (w.top+w.height) { + _screen.SetContent(xPos, yPos, rs[0], rs[1:], style) + } + lx += runewidth.StringWidth(string(rs)) + } + w.lastX += lx +} + +func (w *TcellWindow) CPrint(pair ColorPair, text string) { + w.printString(text, pair) +} + +func (w *TcellWindow) fillString(text string, pair ColorPair) FillReturn { + lx := 0 + a := pair.Attr() + + var style tcell.Style + if w.color { + style = pair.style() + } else { + style = w.normal.style() + } + style = style. + Blink(a&Attr(tcell.AttrBlink) != 0). + Bold(a&Attr(tcell.AttrBold) != 0). + Dim(a&Attr(tcell.AttrDim) != 0). + Reverse(a&Attr(tcell.AttrReverse) != 0). + Underline(a&Attr(tcell.AttrUnderline) != 0). + Italic(a&Attr(tcell.AttrItalic) != 0) + + gr := uniseg.NewGraphemes(text) + for gr.Next() { + rs := gr.Runes() + if len(rs) == 1 && rs[0] == '\n' { + w.lastY++ + w.lastX = 0 + lx = 0 + continue + } + + // word wrap: + xPos := w.left + w.lastX + lx + if xPos >= (w.left + w.width) { + w.lastY++ + w.lastX = 0 + lx = 0 + xPos = w.left + } + + yPos := w.top + w.lastY + if yPos >= (w.top + w.height) { + return FillSuspend + } + + _screen.SetContent(xPos, yPos, rs[0], rs[1:], style) + lx += runewidth.StringWidth(string(rs)) + } + w.lastX += lx + if w.lastX == w.width { + w.lastY++ + w.lastX = 0 + return FillNextLine + } + + return FillContinue +} + +func (w *TcellWindow) Fill(str string) FillReturn { + return w.fillString(str, w.normal) +} + +func (w *TcellWindow) CFill(fg Color, bg Color, a Attr, str string) FillReturn { + if fg == colDefault { + fg = w.normal.Fg() + } + if bg == colDefault { + bg = w.normal.Bg() + } + return w.fillString(str, NewColorPair(fg, bg, a)) +} + +func (w *TcellWindow) drawBorder() { + shape := w.borderStyle.shape + if shape == BorderNone { + return + } + + left := w.left + right := left + w.width + top := w.top + bot := top + w.height + + var style tcell.Style + if w.color { + if w.preview { + style = ColPreviewBorder.style() + } else { + style = ColBorder.style() + } + } else { + style = w.normal.style() + } + + switch shape { + case BorderRounded, BorderSharp, BorderHorizontal, BorderTop: + for x := left; x < right; x++ { + _screen.SetContent(x, top, w.borderStyle.horizontal, nil, style) + } + } + switch shape { + case BorderRounded, BorderSharp, BorderHorizontal, BorderBottom: + for x := left; x < right; x++ { + _screen.SetContent(x, bot-1, w.borderStyle.horizontal, nil, style) + } + } + switch shape { + case BorderRounded, BorderSharp, BorderVertical, BorderLeft: + for y := top; y < bot; y++ { + _screen.SetContent(left, y, w.borderStyle.vertical, nil, style) + } + } + switch shape { + case BorderRounded, BorderSharp, BorderVertical, BorderRight: + for y := top; y < bot; y++ { + _screen.SetContent(right-1, y, w.borderStyle.vertical, nil, style) + } + } + switch shape { + case BorderRounded, BorderSharp: + _screen.SetContent(left, top, w.borderStyle.topLeft, nil, style) + _screen.SetContent(right-1, top, w.borderStyle.topRight, nil, style) + _screen.SetContent(left, bot-1, w.borderStyle.bottomLeft, nil, style) + _screen.SetContent(right-1, bot-1, w.borderStyle.bottomRight, nil, style) + } +} diff --git a/.fzf/src/tui/tcell_test.go b/.fzf/src/tui/tcell_test.go new file mode 100644 index 0000000..aa63b72 --- /dev/null +++ b/.fzf/src/tui/tcell_test.go @@ -0,0 +1,392 @@ +// +build tcell windows + +package tui + +import ( + "testing" + + "github.com/gdamore/tcell" + "github.com/junegunn/fzf/src/util" +) + +func assert(t *testing.T, context string, got interface{}, want interface{}) bool { + if got == want { + return true + } else { + t.Errorf("%s = (%T)%v, want (%T)%v", context, got, got, want, want) + return false + } +} + +// Test the handling of the tcell keyboard events. +func TestGetCharEventKey(t *testing.T) { + if util.ToTty() { + // This test is skipped when output goes to terminal, because it causes + // some glitches: + // - output lines may not start at the beginning of a row which makes + // the output unreadable + // - terminal may get cleared which prevents you from seeing results of + // previous tests + // Good ways to prevent the glitches are piping the output to a pager + // or redirecting to a file. I've found `less +G` to be trouble-free. + t.Skip("Skipped because this test misbehaves in terminal, pipe to a pager or redirect output to a file to run it safely.") + } else if testing.Verbose() { + // I have observed a behaviour when this test outputted more than 8192 + // bytes (32*256) into the 'less' pager, both the go's test executable + // and the pager hanged. The go's executable was blocking on printing. + // I was able to create minimal working example of that behaviour, but + // that example hanged after 12256 bytes (32*(256+127)). + t.Log("If you are piping this test to a pager and it hangs, make the pager greedy for input, e.g. 'less +G'.") + } + + if !HasFullscreenRenderer() { + t.Skip("Can't test FullscreenRenderer.") + } + + // construct test cases + type giveKey struct { + Type tcell.Key + Char rune + Mods tcell.ModMask + } + type wantKey = Event + type testCase struct { + giveKey + wantKey + } + /* + Some test cases are marked "fabricated". It means that giveKey value + is valid, but it is not what you get when you press the keys. For + example Ctrl+C will NOT give you tcell.KeyCtrlC, but tcell.KeyETX + (End-Of-Text character, causing SIGINT). + I was trying to accompany the fabricated test cases with real ones. + + Some test cases are marked "unhandled". It means that giveKey.Type + is not present in tcell.go source code. It can still be handled via + implicit or explicit alias. + + If not said otherwise, test cases are for US keyboard. + + (tabstop=44) + */ + tests := []testCase{ + + // section 1: Ctrl+(Alt)+[a-z] + {giveKey{tcell.KeyCtrlA, rune(tcell.KeyCtrlA), tcell.ModCtrl}, wantKey{CtrlA, 0, nil}}, + {giveKey{tcell.KeyCtrlC, rune(tcell.KeyCtrlC), tcell.ModCtrl}, wantKey{CtrlC, 0, nil}}, // fabricated + {giveKey{tcell.KeyETX, rune(tcell.KeyETX), tcell.ModCtrl}, wantKey{CtrlC, 0, nil}}, // this is SIGINT (Ctrl+C) + {giveKey{tcell.KeyCtrlZ, rune(tcell.KeyCtrlZ), tcell.ModCtrl}, wantKey{CtrlZ, 0, nil}}, // fabricated + // KeyTab is alias for KeyTAB + {giveKey{tcell.KeyCtrlI, rune(tcell.KeyCtrlI), tcell.ModCtrl}, wantKey{Tab, 0, nil}}, // fabricated + {giveKey{tcell.KeyTab, rune(tcell.KeyTab), tcell.ModNone}, wantKey{Tab, 0, nil}}, // unhandled, actual "Tab" keystroke + {giveKey{tcell.KeyTAB, rune(tcell.KeyTAB), tcell.ModNone}, wantKey{Tab, 0, nil}}, // fabricated, unhandled + // KeyEnter is alias for KeyCR + {giveKey{tcell.KeyCtrlM, rune(tcell.KeyCtrlM), tcell.ModNone}, wantKey{CtrlM, 0, nil}}, // actual "Enter" keystroke + {giveKey{tcell.KeyCR, rune(tcell.KeyCR), tcell.ModNone}, wantKey{CtrlM, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyEnter, rune(tcell.KeyEnter), tcell.ModNone}, wantKey{CtrlM, 0, nil}}, // fabricated, unhandled + // Ctrl+Alt keys + {giveKey{tcell.KeyCtrlA, rune(tcell.KeyCtrlA), tcell.ModCtrl | tcell.ModAlt}, wantKey{CtrlAlt, 'a', nil}}, // fabricated + {giveKey{tcell.KeyCtrlA, rune(tcell.KeyCtrlA), tcell.ModCtrl | tcell.ModAlt | tcell.ModShift}, wantKey{CtrlAlt, 'a', nil}}, // fabricated + + // section 2: Ctrl+[ \]_] + {giveKey{tcell.KeyCtrlSpace, rune(tcell.KeyCtrlSpace), tcell.ModCtrl}, wantKey{CtrlSpace, 0, nil}}, // fabricated + {giveKey{tcell.KeyNUL, rune(tcell.KeyNUL), tcell.ModNone}, wantKey{CtrlSpace, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyRune, ' ', tcell.ModCtrl}, wantKey{CtrlSpace, 0, nil}}, // actual Ctrl+' ' + {giveKey{tcell.KeyCtrlBackslash, rune(tcell.KeyCtrlBackslash), tcell.ModCtrl}, wantKey{CtrlBackSlash, 0, nil}}, + {giveKey{tcell.KeyCtrlRightSq, rune(tcell.KeyCtrlRightSq), tcell.ModCtrl}, wantKey{CtrlRightBracket, 0, nil}}, + {giveKey{tcell.KeyCtrlCarat, rune(tcell.KeyCtrlCarat), tcell.ModShift | tcell.ModCtrl}, wantKey{CtrlCaret, 0, nil}}, // fabricated + {giveKey{tcell.KeyRS, rune(tcell.KeyRS), tcell.ModShift | tcell.ModCtrl}, wantKey{CtrlCaret, 0, nil}}, // actual Ctrl+Shift+6 (i.e. Ctrl+^) keystroke + {giveKey{tcell.KeyCtrlUnderscore, rune(tcell.KeyCtrlUnderscore), tcell.ModShift | tcell.ModCtrl}, wantKey{CtrlSlash, 0, nil}}, + + // section 3: (Alt)+Backspace2 + // KeyBackspace2 is alias for KeyDEL = 0x7F (ASCII) (allegedly unused by Windows) + // KeyDelete = 0x2E (VK_DELETE constant in Windows) + // KeyBackspace is alias for KeyBS = 0x08 (ASCII) (implicit alias with KeyCtrlH) + {giveKey{tcell.KeyBackspace2, 0, tcell.ModNone}, wantKey{BSpace, 0, nil}}, // fabricated + {giveKey{tcell.KeyBackspace2, 0, tcell.ModAlt}, wantKey{AltBS, 0, nil}}, // fabricated + {giveKey{tcell.KeyDEL, 0, tcell.ModNone}, wantKey{BSpace, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyDelete, 0, tcell.ModNone}, wantKey{Del, 0, nil}}, + {giveKey{tcell.KeyDelete, 0, tcell.ModAlt}, wantKey{Del, 0, nil}}, + {giveKey{tcell.KeyBackspace, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyBS, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyCtrlH, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModNone}, wantKey{BSpace, 0, nil}}, // actual "Backspace" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModAlt}, wantKey{AltBS, 0, nil}}, // actual "Alt+Backspace" keystroke + {giveKey{tcell.KeyDEL, rune(tcell.KeyDEL), tcell.ModCtrl}, wantKey{BSpace, 0, nil}}, // actual "Ctrl+Backspace" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModShift}, wantKey{BSpace, 0, nil}}, // actual "Shift+Backspace" keystroke + {giveKey{tcell.KeyCtrlH, 0, tcell.ModCtrl | tcell.ModAlt}, wantKey{BSpace, 0, nil}}, // actual "Ctrl+Alt+Backspace" keystroke + {giveKey{tcell.KeyCtrlH, 0, tcell.ModCtrl | tcell.ModShift}, wantKey{BSpace, 0, nil}}, // actual "Ctrl+Shift+Backspace" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModShift | tcell.ModAlt}, wantKey{AltBS, 0, nil}}, // actual "Shift+Alt+Backspace" keystroke + {giveKey{tcell.KeyCtrlH, 0, tcell.ModCtrl | tcell.ModAlt | tcell.ModShift}, wantKey{BSpace, 0, nil}}, // actual "Ctrl+Shift+Alt+Backspace" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModCtrl}, wantKey{CtrlH, 0, nil}}, // actual "Ctrl+H" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModCtrl | tcell.ModAlt}, wantKey{CtrlAlt, 'h', nil}}, // fabricated "Ctrl+Alt+H" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModCtrl | tcell.ModShift}, wantKey{CtrlH, 0, nil}}, // actual "Ctrl+Shift+H" keystroke + {giveKey{tcell.KeyCtrlH, rune(tcell.KeyCtrlH), tcell.ModCtrl | tcell.ModAlt | tcell.ModShift}, wantKey{CtrlAlt, 'h', nil}}, // fabricated "Ctrl+Shift+Alt+H" keystroke + + // section 4: (Alt+Shift)+Key(Up|Down|Left|Right) + {giveKey{tcell.KeyUp, 0, tcell.ModNone}, wantKey{Up, 0, nil}}, + {giveKey{tcell.KeyDown, 0, tcell.ModAlt}, wantKey{AltDown, 0, nil}}, + {giveKey{tcell.KeyLeft, 0, tcell.ModShift}, wantKey{SLeft, 0, nil}}, + {giveKey{tcell.KeyRight, 0, tcell.ModShift | tcell.ModAlt}, wantKey{AltSRight, 0, nil}}, + {giveKey{tcell.KeyUpLeft, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyUpRight, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyDownLeft, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyDownRight, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyCenter, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + // section 5: (Insert|Home|Delete|End|PgUp|PgDn|BackTab|F1-F12) + {giveKey{tcell.KeyInsert, 0, tcell.ModNone}, wantKey{Insert, 0, nil}}, + {giveKey{tcell.KeyF1, 0, tcell.ModNone}, wantKey{F1, 0, nil}}, + // section 6: (Ctrl+Alt)+'rune' + {giveKey{tcell.KeyRune, 'a', tcell.ModNone}, wantKey{Rune, 'a', nil}}, + {giveKey{tcell.KeyRune, 'a', tcell.ModCtrl}, wantKey{Rune, 'a', nil}}, // fabricated + {giveKey{tcell.KeyRune, 'a', tcell.ModAlt}, wantKey{Alt, 'a', nil}}, + {giveKey{tcell.KeyRune, 'A', tcell.ModAlt}, wantKey{Alt, 'A', nil}}, + {giveKey{tcell.KeyRune, '`', tcell.ModAlt}, wantKey{Alt, '`', nil}}, + /* + "Input method" in Windows Language options: + US: "US Keyboard" does not generate any characters (and thus any events) in Ctrl+Alt+[a-z] range + CS: "Czech keyboard" + DE: "German keyboard" + + Note that right Alt is not just `tcell.ModAlt` on foreign language keyboards, but it is the AltGr `tcell.ModCtrl|tcell.ModAlt`. + */ + {giveKey{tcell.KeyRune, '{', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, '{', nil}}, // CS: Ctrl+Alt+b = "{" // Note that this does not interfere with CtrlB, since the "b" is replaced with "{" on OS level + {giveKey{tcell.KeyRune, '$', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, '$', nil}}, // CS: Ctrl+Alt+ů = "$" + {giveKey{tcell.KeyRune, '~', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, '~', nil}}, // CS: Ctrl+Alt++ = "~" + {giveKey{tcell.KeyRune, '`', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, '`', nil}}, // CS: Ctrl+Alt+ý,Space = "`" // this is dead key, space is required to emit the char + + {giveKey{tcell.KeyRune, '{', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, '{', nil}}, // DE: Ctrl+Alt+7 = "{" + {giveKey{tcell.KeyRune, '@', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, '@', nil}}, // DE: Ctrl+Alt+q = "@" + {giveKey{tcell.KeyRune, 'µ', tcell.ModCtrl | tcell.ModAlt}, wantKey{Rune, 'µ', nil}}, // DE: Ctrl+Alt+m = "µ" + + // section 7: Esc + // KeyEsc and KeyEscape are aliases for KeyESC + {giveKey{tcell.KeyEsc, rune(tcell.KeyEsc), tcell.ModNone}, wantKey{ESC, 0, nil}}, // fabricated + {giveKey{tcell.KeyESC, rune(tcell.KeyESC), tcell.ModNone}, wantKey{ESC, 0, nil}}, // unhandled + {giveKey{tcell.KeyEscape, rune(tcell.KeyEscape), tcell.ModNone}, wantKey{ESC, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyESC, rune(tcell.KeyESC), tcell.ModCtrl}, wantKey{ESC, 0, nil}}, // actual Ctrl+[ keystroke + {giveKey{tcell.KeyCtrlLeftSq, rune(tcell.KeyCtrlLeftSq), tcell.ModCtrl}, wantKey{ESC, 0, nil}}, // fabricated, unhandled + + // section 8: Invalid + {giveKey{tcell.KeyRune, 'a', tcell.ModMeta}, wantKey{Rune, 'a', nil}}, // fabricated + {giveKey{tcell.KeyF24, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, + {giveKey{tcell.KeyHelp, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyExit, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyClear, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // unhandled, actual keystroke Numpad_5 with Numlock OFF + {giveKey{tcell.KeyCancel, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyPrint, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // fabricated, unhandled + {giveKey{tcell.KeyPause, 0, tcell.ModNone}, wantKey{Invalid, 0, nil}}, // unhandled + + } + r := NewFullscreenRenderer(&ColorTheme{}, false, false) + r.Init() + + // run and evaluate the tests + for _, test := range tests { + // generate key event + giveEvent := tcell.NewEventKey(test.giveKey.Type, test.giveKey.Char, test.giveKey.Mods) + _screen.PostEventWait(giveEvent) + t.Logf("giveEvent = %T{key: %v, ch: %q (%[3]v), mod: %#04b}\n", giveEvent, giveEvent.Key(), giveEvent.Rune(), giveEvent.Modifiers()) + + // process the event in fzf and evaluate the test + gotEvent := r.GetChar() + // skip Resize events, those are sometimes put in the buffer outside of this test + for gotEvent.Type == Resize { + t.Logf("Resize swallowed") + gotEvent = r.GetChar() + } + t.Logf("wantEvent = %T{Type: %v, Char: %q (%[3]v)}\n", test.wantKey, test.wantKey.Type, test.wantKey.Char) + t.Logf("gotEvent = %T{Type: %v, Char: %q (%[3]v)}\n", gotEvent, gotEvent.Type, gotEvent.Char) + + assert(t, "r.GetChar().Type", gotEvent.Type, test.wantKey.Type) + assert(t, "r.GetChar().Char", gotEvent.Char, test.wantKey.Char) + } + + r.Close() +} + +/* +Quick reference +--------------- + +(tabstop=18) +(this is not mapping table, it merely puts multiple constants ranges in one table) + +¹) the two columns are each other implicit alias +²) explicit aliases here + +%v section # tcell ctrl key¹ tcell ctrl char¹ tcell alias² tui constants tcell named keys tcell mods +-- --------- -------------- --------------- ----------- ------------- ---------------- ---------- +0 2 KeyCtrlSpace KeyNUL = ^@ Rune ModNone +1 1 KeyCtrlA KeySOH = ^A CtrlA ModShift +2 1 KeyCtrlB KeySTX = ^B CtrlB ModCtrl +3 1 KeyCtrlC KeyETX = ^C CtrlC +4 1 KeyCtrlD KeyEOT = ^D CtrlD ModAlt +5 1 KeyCtrlE KeyENQ = ^E CtrlE +6 1 KeyCtrlF KeyACK = ^F CtrlF +7 1 KeyCtrlG KeyBEL = ^G CtrlG +8 1 KeyCtrlH KeyBS = ^H KeyBackspace CtrlH ModMeta +9 1 KeyCtrlI KeyTAB = ^I KeyTab Tab +10 1 KeyCtrlJ KeyLF = ^J CtrlJ +11 1 KeyCtrlK KeyVT = ^K CtrlK +12 1 KeyCtrlL KeyFF = ^L CtrlL +13 1 KeyCtrlM KeyCR = ^M KeyEnter CtrlM +14 1 KeyCtrlN KeySO = ^N CtrlN +15 1 KeyCtrlO KeySI = ^O CtrlO +16 1 KeyCtrlP KeyDLE = ^P CtrlP +17 1 KeyCtrlQ KeyDC1 = ^Q CtrlQ +18 1 KeyCtrlR KeyDC2 = ^R CtrlR +19 1 KeyCtrlS KeyDC3 = ^S CtrlS +20 1 KeyCtrlT KeyDC4 = ^T CtrlT +21 1 KeyCtrlU KeyNAK = ^U CtrlU +22 1 KeyCtrlV KeySYN = ^V CtrlV +23 1 KeyCtrlW KeyETB = ^W CtrlW +24 1 KeyCtrlX KeyCAN = ^X CtrlX +25 1 KeyCtrlY KeyEM = ^Y CtrlY +26 1 KeyCtrlZ KeySUB = ^Z CtrlZ +27 7 KeyCtrlLeftSq KeyESC = ^[ KeyEsc, KeyEscape ESC +28 2 KeyCtrlBackslash KeyFS = ^\ CtrlSpace +29 2 KeyCtrlRightSq KeyGS = ^] CtrlBackSlash +30 2 KeyCtrlCarat KeyRS = ^^ CtrlRightBracket +31 2 KeyCtrlUnderscore KeyUS = ^_ CtrlCaret +32 CtrlSlash +33 Invalid +34 Resize +35 Mouse +36 DoubleClick +37 LeftClick +38 RightClick +39 BTab +40 BSpace +41 Del +42 PgUp +43 PgDn +44 Up +45 Down +46 Left +47 Right +48 Home +49 End +50 Insert +51 SUp +52 SDown +53 SLeft +54 SRight +55 F1 +56 F2 +57 F3 +58 F4 +59 F5 +60 F6 +61 F7 +62 F8 +63 F9 +64 F10 +65 F11 +66 F12 +67 Change +68 BackwardEOF +69 AltBS +70 AltUp +71 AltDown +72 AltLeft +73 AltRight +74 AltSUp +75 AltSDown +76 AltSLeft +77 AltSRight +78 Alt +79 CtrlAlt +.. +127 3 KeyDEL KeyBackspace2 +.. +256 6 KeyRune +257 4 KeyUp +258 4 KeyDown +259 4 KeyRight +260 4 KeyLeft +261 8 KeyUpLeft +262 8 KeyUpRight +263 8 KeyDownLeft +264 8 KeyDownRight +265 8 KeyCenter +266 5 KeyPgUp +267 5 KeyPgDn +268 5 KeyHome +269 5 KeyEnd +270 5 KeyInsert +271 5 KeyDelete +272 8 KeyHelp +273 8 KeyExit +274 8 KeyClear +275 8 KeyCancel +276 8 KeyPrint +277 8 KeyPause +278 5 KeyBacktab +279 5 KeyF1 +280 5 KeyF2 +281 5 KeyF3 +282 5 KeyF4 +283 5 KeyF5 +284 5 KeyF6 +285 5 KeyF7 +286 5 KeyF8 +287 5 KeyF9 +288 5 KeyF10 +289 5 KeyF11 +290 5 KeyF12 +291 8 KeyF13 +292 8 KeyF14 +293 8 KeyF15 +294 8 KeyF16 +295 8 KeyF17 +296 8 KeyF18 +297 8 KeyF19 +298 8 KeyF20 +299 8 KeyF21 +300 8 KeyF22 +301 8 KeyF23 +302 8 KeyF24 +303 8 KeyF25 +304 8 KeyF26 +305 8 KeyF27 +306 8 KeyF28 +307 8 KeyF29 +308 8 KeyF30 +309 8 KeyF31 +310 8 KeyF32 +311 8 KeyF33 +312 8 KeyF34 +313 8 KeyF35 +314 8 KeyF36 +315 8 KeyF37 +316 8 KeyF38 +317 8 KeyF39 +318 8 KeyF40 +319 8 KeyF41 +320 8 KeyF42 +321 8 KeyF43 +322 8 KeyF44 +323 8 KeyF45 +324 8 KeyF46 +325 8 KeyF47 +326 8 KeyF48 +327 8 KeyF49 +328 8 KeyF50 +329 8 KeyF51 +330 8 KeyF52 +331 8 KeyF53 +332 8 KeyF54 +333 8 KeyF55 +334 8 KeyF56 +335 8 KeyF57 +336 8 KeyF58 +337 8 KeyF59 +338 8 KeyF60 +339 8 KeyF61 +340 8 KeyF62 +341 8 KeyF63 +342 8 KeyF64 +-- --------- -------------- --------------- ----------- ------------- ---------------- ---------- +%v section # tcell ctrl key tcell ctrl char tcell alias tui constants tcell named keys tcell mods +*/ diff --git a/.fzf/src/tui/ttyname_unix.go b/.fzf/src/tui/ttyname_unix.go new file mode 100644 index 0000000..68298cd --- /dev/null +++ b/.fzf/src/tui/ttyname_unix.go @@ -0,0 +1,47 @@ +// +build !windows + +package tui + +import ( + "io/ioutil" + "os" + "syscall" +) + +var devPrefixes = [...]string{"/dev/pts/", "/dev/"} + +func ttyname() string { + var stderr syscall.Stat_t + if syscall.Fstat(2, &stderr) != nil { + return "" + } + + for _, prefix := range devPrefixes { + files, err := ioutil.ReadDir(prefix) + if err != nil { + continue + } + + for _, file := range files { + if stat, ok := file.Sys().(*syscall.Stat_t); ok && stat.Rdev == stderr.Rdev { + return prefix + file.Name() + } + } + } + return "" +} + +// TtyIn returns terminal device to be used as STDIN, falls back to os.Stdin +func TtyIn() *os.File { + in, err := os.OpenFile(consoleDevice, syscall.O_RDONLY, 0) + if err != nil { + tty := ttyname() + if len(tty) > 0 { + if in, err := os.OpenFile(tty, syscall.O_RDONLY, 0); err == nil { + return in + } + } + return os.Stdin + } + return in +} diff --git a/.fzf/src/tui/ttyname_windows.go b/.fzf/src/tui/ttyname_windows.go new file mode 100644 index 0000000..8db490a --- /dev/null +++ b/.fzf/src/tui/ttyname_windows.go @@ -0,0 +1,14 @@ +// +build windows + +package tui + +import "os" + +func ttyname() string { + return "" +} + +// TtyIn on Windows returns os.Stdin +func TtyIn() *os.File { + return os.Stdin +} diff --git a/.fzf/src/tui/tui.go b/.fzf/src/tui/tui.go new file mode 100644 index 0000000..eb09da4 --- /dev/null +++ b/.fzf/src/tui/tui.go @@ -0,0 +1,625 @@ +package tui + +import ( + "fmt" + "os" + "strconv" + "time" +) + +// Types of user action +type EventType int + +const ( + Rune EventType = iota + + CtrlA + CtrlB + CtrlC + CtrlD + CtrlE + CtrlF + CtrlG + CtrlH + Tab + CtrlJ + CtrlK + CtrlL + CtrlM + CtrlN + CtrlO + CtrlP + CtrlQ + CtrlR + CtrlS + CtrlT + CtrlU + CtrlV + CtrlW + CtrlX + CtrlY + CtrlZ + ESC + CtrlSpace + + // https://apple.stackexchange.com/questions/24261/how-do-i-send-c-that-is-control-slash-to-the-terminal + CtrlBackSlash + CtrlRightBracket + CtrlCaret + CtrlSlash + + Invalid + Resize + Mouse + DoubleClick + LeftClick + RightClick + + BTab + BSpace + + Del + PgUp + PgDn + + Up + Down + Left + Right + Home + End + Insert + + SUp + SDown + SLeft + SRight + + F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 + + Change + BackwardEOF + + AltBS + + AltUp + AltDown + AltLeft + AltRight + + AltSUp + AltSDown + AltSLeft + AltSRight + + Alt + CtrlAlt +) + +func (t EventType) AsEvent() Event { + return Event{t, 0, nil} +} + +func (t EventType) Int() int { + return int(t) +} + +func (t EventType) Byte() byte { + return byte(t) +} + +func (e Event) Comparable() Event { + // Ignore MouseEvent pointer + return Event{e.Type, e.Char, nil} +} + +func Key(r rune) Event { + return Event{Rune, r, nil} +} + +func AltKey(r rune) Event { + return Event{Alt, r, nil} +} + +func CtrlAltKey(r rune) Event { + return Event{CtrlAlt, r, nil} +} + +const ( + doubleClickDuration = 500 * time.Millisecond +) + +type Color int32 + +func (c Color) IsDefault() bool { + return c == colDefault +} + +func (c Color) is24() bool { + return c > 0 && (c&(1<<24)) > 0 +} + +type ColorAttr struct { + Color Color + Attr Attr +} + +func NewColorAttr() ColorAttr { + return ColorAttr{Color: colUndefined, Attr: AttrUndefined} +} + +const ( + colUndefined Color = -2 + colDefault Color = -1 +) + +const ( + colBlack Color = iota + colRed + colGreen + colYellow + colBlue + colMagenta + colCyan + colWhite +) + +type FillReturn int + +const ( + FillContinue FillReturn = iota + FillNextLine + FillSuspend +) + +type ColorPair struct { + fg Color + bg Color + attr Attr +} + +func HexToColor(rrggbb string) Color { + r, _ := strconv.ParseInt(rrggbb[1:3], 16, 0) + g, _ := strconv.ParseInt(rrggbb[3:5], 16, 0) + b, _ := strconv.ParseInt(rrggbb[5:7], 16, 0) + return Color((1 << 24) + (r << 16) + (g << 8) + b) +} + +func NewColorPair(fg Color, bg Color, attr Attr) ColorPair { + return ColorPair{fg, bg, attr} +} + +func (p ColorPair) Fg() Color { + return p.fg +} + +func (p ColorPair) Bg() Color { + return p.bg +} + +func (p ColorPair) Attr() Attr { + return p.attr +} + +func (p ColorPair) HasBg() bool { + return p.attr&Reverse == 0 && p.bg != colDefault || + p.attr&Reverse > 0 && p.fg != colDefault +} + +func (p ColorPair) merge(other ColorPair, except Color) ColorPair { + dup := p + dup.attr = dup.attr.Merge(other.attr) + if other.fg != except { + dup.fg = other.fg + } + if other.bg != except { + dup.bg = other.bg + } + return dup +} + +func (p ColorPair) WithAttr(attr Attr) ColorPair { + dup := p + dup.attr = dup.attr.Merge(attr) + return dup +} + +func (p ColorPair) MergeAttr(other ColorPair) ColorPair { + return p.WithAttr(other.attr) +} + +func (p ColorPair) Merge(other ColorPair) ColorPair { + return p.merge(other, colUndefined) +} + +func (p ColorPair) MergeNonDefault(other ColorPair) ColorPair { + return p.merge(other, colDefault) +} + +type ColorTheme struct { + Colored bool + Input ColorAttr + Disabled ColorAttr + Fg ColorAttr + Bg ColorAttr + PreviewFg ColorAttr + PreviewBg ColorAttr + DarkBg ColorAttr + Gutter ColorAttr + Prompt ColorAttr + Match ColorAttr + Current ColorAttr + CurrentMatch ColorAttr + Spinner ColorAttr + Info ColorAttr + Cursor ColorAttr + Selected ColorAttr + Header ColorAttr + Border ColorAttr +} + +type Event struct { + Type EventType + Char rune + MouseEvent *MouseEvent +} + +type MouseEvent struct { + Y int + X int + S int + Left bool + Down bool + Double bool + Mod bool +} + +type BorderShape int + +const ( + BorderNone BorderShape = iota + BorderRounded + BorderSharp + BorderHorizontal + BorderVertical + BorderTop + BorderBottom + BorderLeft + BorderRight +) + +type BorderStyle struct { + shape BorderShape + horizontal rune + vertical rune + topLeft rune + topRight rune + bottomLeft rune + bottomRight rune +} + +type BorderCharacter int + +func MakeBorderStyle(shape BorderShape, unicode bool) BorderStyle { + if unicode { + if shape == BorderRounded { + return BorderStyle{ + shape: shape, + horizontal: '─', + vertical: '│', + topLeft: '╭', + topRight: '╮', + bottomLeft: '╰', + bottomRight: '╯', + } + } + return BorderStyle{ + shape: shape, + horizontal: '─', + vertical: '│', + topLeft: '┌', + topRight: '┐', + bottomLeft: '└', + bottomRight: '┘', + } + } + return BorderStyle{ + shape: shape, + horizontal: '-', + vertical: '|', + topLeft: '+', + topRight: '+', + bottomLeft: '+', + bottomRight: '+', + } +} + +func MakeTransparentBorder() BorderStyle { + return BorderStyle{ + shape: BorderRounded, + horizontal: ' ', + vertical: ' ', + topLeft: ' ', + topRight: ' ', + bottomLeft: ' ', + bottomRight: ' '} +} + +type Renderer interface { + Init() + Pause(clear bool) + Resume(clear bool, sigcont bool) + Clear() + RefreshWindows(windows []Window) + Refresh() + Close() + + GetChar() Event + + MaxX() int + MaxY() int + + NewWindow(top int, left int, width int, height int, preview bool, borderStyle BorderStyle) Window +} + +type Window interface { + Top() int + Left() int + Width() int + Height() int + + Refresh() + FinishFill() + Close() + + X() int + Y() int + Enclose(y int, x int) bool + + Move(y int, x int) + MoveAndClear(y int, x int) + Print(text string) + CPrint(color ColorPair, text string) + Fill(text string) FillReturn + CFill(fg Color, bg Color, attr Attr, text string) FillReturn + Erase() +} + +type FullscreenRenderer struct { + theme *ColorTheme + mouse bool + forceBlack bool + prevDownTime time.Time + clickY []int +} + +func NewFullscreenRenderer(theme *ColorTheme, forceBlack bool, mouse bool) Renderer { + r := &FullscreenRenderer{ + theme: theme, + mouse: mouse, + forceBlack: forceBlack, + prevDownTime: time.Unix(0, 0), + clickY: []int{}} + return r +} + +var ( + Default16 *ColorTheme + Dark256 *ColorTheme + Light256 *ColorTheme + + ColPrompt ColorPair + ColNormal ColorPair + ColInput ColorPair + ColDisabled ColorPair + ColMatch ColorPair + ColCursor ColorPair + ColCursorEmpty ColorPair + ColSelected ColorPair + ColCurrent ColorPair + ColCurrentMatch ColorPair + ColCurrentCursor ColorPair + ColCurrentCursorEmpty ColorPair + ColCurrentSelected ColorPair + ColCurrentSelectedEmpty ColorPair + ColSpinner ColorPair + ColInfo ColorPair + ColHeader ColorPair + ColBorder ColorPair + ColPreview ColorPair + ColPreviewBorder ColorPair +) + +func EmptyTheme() *ColorTheme { + return &ColorTheme{ + Colored: true, + Input: ColorAttr{colUndefined, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + Fg: ColorAttr{colUndefined, AttrUndefined}, + Bg: ColorAttr{colUndefined, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + DarkBg: ColorAttr{colUndefined, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + Prompt: ColorAttr{colUndefined, AttrUndefined}, + Match: ColorAttr{colUndefined, AttrUndefined}, + Current: ColorAttr{colUndefined, AttrUndefined}, + CurrentMatch: ColorAttr{colUndefined, AttrUndefined}, + Spinner: ColorAttr{colUndefined, AttrUndefined}, + Info: ColorAttr{colUndefined, AttrUndefined}, + Cursor: ColorAttr{colUndefined, AttrUndefined}, + Selected: ColorAttr{colUndefined, AttrUndefined}, + Header: ColorAttr{colUndefined, AttrUndefined}, + Border: ColorAttr{colUndefined, AttrUndefined}} +} + +func NoColorTheme() *ColorTheme { + return &ColorTheme{ + Colored: false, + Input: ColorAttr{colDefault, AttrRegular}, + Disabled: ColorAttr{colDefault, AttrRegular}, + Fg: ColorAttr{colDefault, AttrRegular}, + Bg: ColorAttr{colDefault, AttrRegular}, + PreviewFg: ColorAttr{colDefault, AttrRegular}, + PreviewBg: ColorAttr{colDefault, AttrRegular}, + DarkBg: ColorAttr{colDefault, AttrRegular}, + Gutter: ColorAttr{colDefault, AttrRegular}, + Prompt: ColorAttr{colDefault, AttrRegular}, + Match: ColorAttr{colDefault, Underline}, + Current: ColorAttr{colDefault, Reverse}, + CurrentMatch: ColorAttr{colDefault, Reverse | Underline}, + Spinner: ColorAttr{colDefault, AttrRegular}, + Info: ColorAttr{colDefault, AttrRegular}, + Cursor: ColorAttr{colDefault, AttrRegular}, + Selected: ColorAttr{colDefault, AttrRegular}, + Header: ColorAttr{colDefault, AttrRegular}, + Border: ColorAttr{colDefault, AttrRegular}} +} + +func errorExit(message string) { + fmt.Fprintln(os.Stderr, message) + os.Exit(2) +} + +func init() { + Default16 = &ColorTheme{ + Colored: true, + Input: ColorAttr{colDefault, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + DarkBg: ColorAttr{colBlack, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + Prompt: ColorAttr{colBlue, AttrUndefined}, + Match: ColorAttr{colGreen, AttrUndefined}, + Current: ColorAttr{colYellow, AttrUndefined}, + CurrentMatch: ColorAttr{colGreen, AttrUndefined}, + Spinner: ColorAttr{colGreen, AttrUndefined}, + Info: ColorAttr{colWhite, AttrUndefined}, + Cursor: ColorAttr{colRed, AttrUndefined}, + Selected: ColorAttr{colMagenta, AttrUndefined}, + Header: ColorAttr{colCyan, AttrUndefined}, + Border: ColorAttr{colBlack, AttrUndefined}} + Dark256 = &ColorTheme{ + Colored: true, + Input: ColorAttr{colDefault, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + DarkBg: ColorAttr{236, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + Prompt: ColorAttr{110, AttrUndefined}, + Match: ColorAttr{108, AttrUndefined}, + Current: ColorAttr{254, AttrUndefined}, + CurrentMatch: ColorAttr{151, AttrUndefined}, + Spinner: ColorAttr{148, AttrUndefined}, + Info: ColorAttr{144, AttrUndefined}, + Cursor: ColorAttr{161, AttrUndefined}, + Selected: ColorAttr{168, AttrUndefined}, + Header: ColorAttr{109, AttrUndefined}, + Border: ColorAttr{59, AttrUndefined}} + Light256 = &ColorTheme{ + Colored: true, + Input: ColorAttr{colDefault, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + DarkBg: ColorAttr{251, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + Prompt: ColorAttr{25, AttrUndefined}, + Match: ColorAttr{66, AttrUndefined}, + Current: ColorAttr{237, AttrUndefined}, + CurrentMatch: ColorAttr{23, AttrUndefined}, + Spinner: ColorAttr{65, AttrUndefined}, + Info: ColorAttr{101, AttrUndefined}, + Cursor: ColorAttr{161, AttrUndefined}, + Selected: ColorAttr{168, AttrUndefined}, + Header: ColorAttr{31, AttrUndefined}, + Border: ColorAttr{145, AttrUndefined}} +} + +func initTheme(theme *ColorTheme, baseTheme *ColorTheme, forceBlack bool) { + if forceBlack { + theme.Bg = ColorAttr{colBlack, AttrUndefined} + } + + o := func(a ColorAttr, b ColorAttr) ColorAttr { + c := a + if b.Color != colUndefined { + c.Color = b.Color + } + if b.Attr != AttrUndefined { + c.Attr = b.Attr + } + return c + } + theme.Input = o(baseTheme.Input, theme.Input) + theme.Disabled = o(theme.Input, o(baseTheme.Disabled, theme.Disabled)) + theme.Fg = o(baseTheme.Fg, theme.Fg) + theme.Bg = o(baseTheme.Bg, theme.Bg) + theme.PreviewFg = o(theme.Fg, o(baseTheme.PreviewFg, theme.PreviewFg)) + theme.PreviewBg = o(theme.Bg, o(baseTheme.PreviewBg, theme.PreviewBg)) + theme.DarkBg = o(baseTheme.DarkBg, theme.DarkBg) + theme.Gutter = o(theme.DarkBg, o(baseTheme.Gutter, theme.Gutter)) + theme.Prompt = o(baseTheme.Prompt, theme.Prompt) + theme.Match = o(baseTheme.Match, theme.Match) + theme.Current = o(baseTheme.Current, theme.Current) + theme.CurrentMatch = o(baseTheme.CurrentMatch, theme.CurrentMatch) + theme.Spinner = o(baseTheme.Spinner, theme.Spinner) + theme.Info = o(baseTheme.Info, theme.Info) + theme.Cursor = o(baseTheme.Cursor, theme.Cursor) + theme.Selected = o(baseTheme.Selected, theme.Selected) + theme.Header = o(baseTheme.Header, theme.Header) + theme.Border = o(baseTheme.Border, theme.Border) + + initPalette(theme) +} + +func initPalette(theme *ColorTheme) { + pair := func(fg, bg ColorAttr) ColorPair { + if fg.Color == colDefault && (fg.Attr&Reverse) > 0 { + bg.Color = colDefault + } + return ColorPair{fg.Color, bg.Color, fg.Attr} + } + blank := theme.Fg + blank.Attr = AttrRegular + + ColPrompt = pair(theme.Prompt, theme.Bg) + ColNormal = pair(theme.Fg, theme.Bg) + ColInput = pair(theme.Input, theme.Bg) + ColDisabled = pair(theme.Disabled, theme.Bg) + ColMatch = pair(theme.Match, theme.Bg) + ColCursor = pair(theme.Cursor, theme.Gutter) + ColCursorEmpty = pair(blank, theme.Gutter) + ColSelected = pair(theme.Selected, theme.Gutter) + ColCurrent = pair(theme.Current, theme.DarkBg) + ColCurrentMatch = pair(theme.CurrentMatch, theme.DarkBg) + ColCurrentCursor = pair(theme.Cursor, theme.DarkBg) + ColCurrentCursorEmpty = pair(blank, theme.DarkBg) + ColCurrentSelected = pair(theme.Selected, theme.DarkBg) + ColCurrentSelectedEmpty = pair(blank, theme.DarkBg) + ColSpinner = pair(theme.Spinner, theme.Bg) + ColInfo = pair(theme.Info, theme.Bg) + ColHeader = pair(theme.Header, theme.Bg) + ColBorder = pair(theme.Border, theme.Bg) + ColPreview = pair(theme.PreviewFg, theme.PreviewBg) + ColPreviewBorder = pair(theme.Border, theme.PreviewBg) +} diff --git a/.fzf/src/tui/tui_test.go b/.fzf/src/tui/tui_test.go new file mode 100644 index 0000000..3ba9bf3 --- /dev/null +++ b/.fzf/src/tui/tui_test.go @@ -0,0 +1,20 @@ +package tui + +import "testing" + +func TestHexToColor(t *testing.T) { + assert := func(expr string, r, g, b int) { + color := HexToColor(expr) + if !color.is24() || + int((color>>16)&0xff) != r || + int((color>>8)&0xff) != g || + int((color)&0xff) != b { + t.Fail() + } + } + + assert("#ff0000", 255, 0, 0) + assert("#010203", 1, 2, 3) + assert("#102030", 16, 32, 48) + assert("#ffffff", 255, 255, 255) +} diff --git a/.fzf/src/util/atomicbool.go b/.fzf/src/util/atomicbool.go new file mode 100644 index 0000000..c5c7e69 --- /dev/null +++ b/.fzf/src/util/atomicbool.go @@ -0,0 +1,34 @@ +package util + +import ( + "sync/atomic" +) + +func convertBoolToInt32(b bool) int32 { + if b { + return 1 + } + return 0 +} + +// AtomicBool is a boxed-class that provides synchronized access to the +// underlying boolean value +type AtomicBool struct { + state int32 // "1" is true, "0" is false +} + +// NewAtomicBool returns a new AtomicBool +func NewAtomicBool(initialState bool) *AtomicBool { + return &AtomicBool{state: convertBoolToInt32(initialState)} +} + +// Get returns the current boolean value synchronously +func (a *AtomicBool) Get() bool { + return atomic.LoadInt32(&a.state) == 1 +} + +// Set updates the boolean value synchronously +func (a *AtomicBool) Set(newState bool) bool { + atomic.StoreInt32(&a.state, convertBoolToInt32(newState)) + return newState +} diff --git a/.fzf/src/util/atomicbool_test.go b/.fzf/src/util/atomicbool_test.go new file mode 100644 index 0000000..1feff79 --- /dev/null +++ b/.fzf/src/util/atomicbool_test.go @@ -0,0 +1,17 @@ +package util + +import "testing" + +func TestAtomicBool(t *testing.T) { + if !NewAtomicBool(true).Get() || NewAtomicBool(false).Get() { + t.Error("Invalid initial value") + } + + ab := NewAtomicBool(true) + if ab.Set(false) { + t.Error("Invalid return value") + } + if ab.Get() { + t.Error("Invalid state") + } +} diff --git a/.fzf/src/util/chars.go b/.fzf/src/util/chars.go new file mode 100644 index 0000000..41de924 --- /dev/null +++ b/.fzf/src/util/chars.go @@ -0,0 +1,198 @@ +package util + +import ( + "fmt" + "unicode" + "unicode/utf8" + "unsafe" +) + +const ( + overflow64 uint64 = 0x8080808080808080 + overflow32 uint32 = 0x80808080 +) + +type Chars struct { + slice []byte // or []rune + inBytes bool + trimLengthKnown bool + trimLength uint16 + + // XXX Piggybacking item index here is a horrible idea. But I'm trying to + // minimize the memory footprint by not wasting padded spaces. + Index int32 +} + +func checkAscii(bytes []byte) (bool, int) { + i := 0 + for ; i <= len(bytes)-8; i += 8 { + if (overflow64 & *(*uint64)(unsafe.Pointer(&bytes[i]))) > 0 { + return false, i + } + } + for ; i <= len(bytes)-4; i += 4 { + if (overflow32 & *(*uint32)(unsafe.Pointer(&bytes[i]))) > 0 { + return false, i + } + } + for ; i < len(bytes); i++ { + if bytes[i] >= utf8.RuneSelf { + return false, i + } + } + return true, 0 +} + +// ToChars converts byte array into rune array +func ToChars(bytes []byte) Chars { + inBytes, bytesUntil := checkAscii(bytes) + if inBytes { + return Chars{slice: bytes, inBytes: inBytes} + } + + runes := make([]rune, bytesUntil, len(bytes)) + for i := 0; i < bytesUntil; i++ { + runes[i] = rune(bytes[i]) + } + for i := bytesUntil; i < len(bytes); { + r, sz := utf8.DecodeRune(bytes[i:]) + i += sz + runes = append(runes, r) + } + return RunesToChars(runes) +} + +func RunesToChars(runes []rune) Chars { + return Chars{slice: *(*[]byte)(unsafe.Pointer(&runes)), inBytes: false} +} + +func (chars *Chars) IsBytes() bool { + return chars.inBytes +} + +func (chars *Chars) Bytes() []byte { + return chars.slice +} + +func (chars *Chars) optionalRunes() []rune { + if chars.inBytes { + return nil + } + return *(*[]rune)(unsafe.Pointer(&chars.slice)) +} + +func (chars *Chars) Get(i int) rune { + if runes := chars.optionalRunes(); runes != nil { + return runes[i] + } + return rune(chars.slice[i]) +} + +func (chars *Chars) Length() int { + if runes := chars.optionalRunes(); runes != nil { + return len(runes) + } + return len(chars.slice) +} + +// String returns the string representation of a Chars object. +func (chars *Chars) String() string { + return fmt.Sprintf("Chars{slice: []byte(%q), inBytes: %v, trimLengthKnown: %v, trimLength: %d, Index: %d}", chars.slice, chars.inBytes, chars.trimLengthKnown, chars.trimLength, chars.Index) +} + +// TrimLength returns the length after trimming leading and trailing whitespaces +func (chars *Chars) TrimLength() uint16 { + if chars.trimLengthKnown { + return chars.trimLength + } + chars.trimLengthKnown = true + var i int + len := chars.Length() + for i = len - 1; i >= 0; i-- { + char := chars.Get(i) + if !unicode.IsSpace(char) { + break + } + } + // Completely empty + if i < 0 { + return 0 + } + + var j int + for j = 0; j < len; j++ { + char := chars.Get(j) + if !unicode.IsSpace(char) { + break + } + } + chars.trimLength = AsUint16(i - j + 1) + return chars.trimLength +} + +func (chars *Chars) LeadingWhitespaces() int { + whitespaces := 0 + for i := 0; i < chars.Length(); i++ { + char := chars.Get(i) + if !unicode.IsSpace(char) { + break + } + whitespaces++ + } + return whitespaces +} + +func (chars *Chars) TrailingWhitespaces() int { + whitespaces := 0 + for i := chars.Length() - 1; i >= 0; i-- { + char := chars.Get(i) + if !unicode.IsSpace(char) { + break + } + whitespaces++ + } + return whitespaces +} + +func (chars *Chars) TrimTrailingWhitespaces() { + whitespaces := chars.TrailingWhitespaces() + chars.slice = chars.slice[0 : len(chars.slice)-whitespaces] +} + +func (chars *Chars) ToString() string { + if runes := chars.optionalRunes(); runes != nil { + return string(runes) + } + return string(chars.slice) +} + +func (chars *Chars) ToRunes() []rune { + if runes := chars.optionalRunes(); runes != nil { + return runes + } + bytes := chars.slice + runes := make([]rune, len(bytes)) + for idx, b := range bytes { + runes[idx] = rune(b) + } + return runes +} + +func (chars *Chars) CopyRunes(dest []rune) { + if runes := chars.optionalRunes(); runes != nil { + copy(dest, runes) + return + } + for idx, b := range chars.slice[:len(dest)] { + dest[idx] = rune(b) + } +} + +func (chars *Chars) Prepend(prefix string) { + if runes := chars.optionalRunes(); runes != nil { + runes = append([]rune(prefix), runes...) + chars.slice = *(*[]byte)(unsafe.Pointer(&runes)) + } else { + chars.slice = append([]byte(prefix), chars.slice...) + } +} diff --git a/.fzf/src/util/chars_test.go b/.fzf/src/util/chars_test.go new file mode 100644 index 0000000..b7983f3 --- /dev/null +++ b/.fzf/src/util/chars_test.go @@ -0,0 +1,46 @@ +package util + +import "testing" + +func TestToCharsAscii(t *testing.T) { + chars := ToChars([]byte("foobar")) + if !chars.inBytes || chars.ToString() != "foobar" || !chars.inBytes { + t.Error() + } +} + +func TestCharsLength(t *testing.T) { + chars := ToChars([]byte("\tabc한글 ")) + if chars.inBytes || chars.Length() != 8 || chars.TrimLength() != 5 { + t.Error() + } +} + +func TestCharsToString(t *testing.T) { + text := "\tabc한글 " + chars := ToChars([]byte(text)) + if chars.ToString() != text { + t.Error() + } +} + +func TestTrimLength(t *testing.T) { + check := func(str string, exp uint16) { + chars := ToChars([]byte(str)) + trimmed := chars.TrimLength() + if trimmed != exp { + t.Errorf("Invalid TrimLength result for '%s': %d (expected %d)", + str, trimmed, exp) + } + } + check("hello", 5) + check("hello ", 5) + check("hello ", 5) + check(" hello", 5) + check(" hello", 5) + check(" hello ", 5) + check(" hello ", 5) + check("h o", 5) + check(" h o ", 5) + check(" ", 0) +} diff --git a/.fzf/src/util/eventbox.go b/.fzf/src/util/eventbox.go new file mode 100644 index 0000000..b710cf1 --- /dev/null +++ b/.fzf/src/util/eventbox.go @@ -0,0 +1,96 @@ +package util + +import "sync" + +// EventType is the type for fzf events +type EventType int + +// Events is a type that associates EventType to any data +type Events map[EventType]interface{} + +// EventBox is used for coordinating events +type EventBox struct { + events Events + cond *sync.Cond + ignore map[EventType]bool +} + +// NewEventBox returns a new EventBox +func NewEventBox() *EventBox { + return &EventBox{ + events: make(Events), + cond: sync.NewCond(&sync.Mutex{}), + ignore: make(map[EventType]bool)} +} + +// Wait blocks the goroutine until signaled +func (b *EventBox) Wait(callback func(*Events)) { + b.cond.L.Lock() + + if len(b.events) == 0 { + b.cond.Wait() + } + + callback(&b.events) + b.cond.L.Unlock() +} + +// Set turns on the event type on the box +func (b *EventBox) Set(event EventType, value interface{}) { + b.cond.L.Lock() + b.events[event] = value + if _, found := b.ignore[event]; !found { + b.cond.Broadcast() + } + b.cond.L.Unlock() +} + +// Clear clears the events +// Unsynchronized; should be called within Wait routine +func (events *Events) Clear() { + for event := range *events { + delete(*events, event) + } +} + +// Peek peeks at the event box if the given event is set +func (b *EventBox) Peek(event EventType) bool { + b.cond.L.Lock() + _, ok := b.events[event] + b.cond.L.Unlock() + return ok +} + +// Watch deletes the events from the ignore list +func (b *EventBox) Watch(events ...EventType) { + b.cond.L.Lock() + for _, event := range events { + delete(b.ignore, event) + } + b.cond.L.Unlock() +} + +// Unwatch adds the events to the ignore list +func (b *EventBox) Unwatch(events ...EventType) { + b.cond.L.Lock() + for _, event := range events { + b.ignore[event] = true + } + b.cond.L.Unlock() +} + +// WaitFor blocks the execution until the event is received +func (b *EventBox) WaitFor(event EventType) { + looping := true + for looping { + b.Wait(func(events *Events) { + for evt := range *events { + switch evt { + case event: + looping = false + return + } + } + }) + } +} diff --git a/.fzf/src/util/eventbox_test.go b/.fzf/src/util/eventbox_test.go new file mode 100644 index 0000000..5a9dc30 --- /dev/null +++ b/.fzf/src/util/eventbox_test.go @@ -0,0 +1,61 @@ +package util + +import "testing" + +// fzf events +const ( + EvtReadNew EventType = iota + EvtReadFin + EvtSearchNew + EvtSearchProgress + EvtSearchFin + EvtClose +) + +func TestEventBox(t *testing.T) { + eb := NewEventBox() + + // Wait should return immediately + ch := make(chan bool) + + go func() { + eb.Set(EvtReadNew, 10) + ch <- true + <-ch + eb.Set(EvtSearchNew, 10) + eb.Set(EvtSearchNew, 15) + eb.Set(EvtSearchNew, 20) + eb.Set(EvtSearchProgress, 30) + ch <- true + <-ch + eb.Set(EvtSearchFin, 40) + ch <- true + <-ch + }() + + count := 0 + sum := 0 + looping := true + for looping { + <-ch + eb.Wait(func(events *Events) { + for _, value := range *events { + switch val := value.(type) { + case int: + sum += val + looping = sum < 100 + } + } + events.Clear() + }) + ch <- true + count++ + } + + if count != 3 { + t.Error("Invalid number of events", count) + } + if sum != 100 { + t.Error("Invalid sum", sum) + } +} diff --git a/.fzf/src/util/slab.go b/.fzf/src/util/slab.go new file mode 100644 index 0000000..0c49d2d --- /dev/null +++ b/.fzf/src/util/slab.go @@ -0,0 +1,12 @@ +package util + +type Slab struct { + I16 []int16 + I32 []int32 +} + +func MakeSlab(size16 int, size32 int) *Slab { + return &Slab{ + I16: make([]int16, size16), + I32: make([]int32, size32)} +} diff --git a/.fzf/src/util/util.go b/.fzf/src/util/util.go new file mode 100644 index 0000000..c16f1af --- /dev/null +++ b/.fzf/src/util/util.go @@ -0,0 +1,138 @@ +package util + +import ( + "math" + "os" + "strings" + "time" + + "github.com/mattn/go-isatty" + "github.com/mattn/go-runewidth" + "github.com/rivo/uniseg" +) + +// RunesWidth returns runes width +func RunesWidth(runes []rune, prefixWidth int, tabstop int, limit int) (int, int) { + width := 0 + gr := uniseg.NewGraphemes(string(runes)) + idx := 0 + for gr.Next() { + rs := gr.Runes() + var w int + if len(rs) == 1 && rs[0] == '\t' { + w = tabstop - (prefixWidth+width)%tabstop + } else { + s := string(rs) + w = runewidth.StringWidth(s) + strings.Count(s, "\n") + } + width += w + if limit > 0 && width > limit { + return width, idx + } + idx += len(rs) + } + return width, -1 +} + +// Max returns the largest integer +func Max(first int, second int) int { + if first >= second { + return first + } + return second +} + +// Max16 returns the largest integer +func Max16(first int16, second int16) int16 { + if first >= second { + return first + } + return second +} + +// Max32 returns the largest 32-bit integer +func Max32(first int32, second int32) int32 { + if first > second { + return first + } + return second +} + +// Min returns the smallest integer +func Min(first int, second int) int { + if first <= second { + return first + } + return second +} + +// Min32 returns the smallest 32-bit integer +func Min32(first int32, second int32) int32 { + if first <= second { + return first + } + return second +} + +// Constrain32 limits the given 32-bit integer with the upper and lower bounds +func Constrain32(val int32, min int32, max int32) int32 { + if val < min { + return min + } + if val > max { + return max + } + return val +} + +// Constrain limits the given integer with the upper and lower bounds +func Constrain(val int, min int, max int) int { + if val < min { + return min + } + if val > max { + return max + } + return val +} + +func AsUint16(val int) uint16 { + if val > math.MaxUint16 { + return math.MaxUint16 + } else if val < 0 { + return 0 + } + return uint16(val) +} + +// DurWithin limits the given time.Duration with the upper and lower bounds +func DurWithin( + val time.Duration, min time.Duration, max time.Duration) time.Duration { + if val < min { + return min + } + if val > max { + return max + } + return val +} + +// IsTty returns true if stdin is a terminal +func IsTty() bool { + return isatty.IsTerminal(os.Stdin.Fd()) +} + +// ToTty returns true if stdout is a terminal +func ToTty() bool { + return isatty.IsTerminal(os.Stdout.Fd()) +} + +// Once returns a function that returns the specified boolean value only once +func Once(nextResponse bool) func() bool { + state := nextResponse + return func() bool { + prevState := state + state = false + return prevState + } +} diff --git a/.fzf/src/util/util_test.go b/.fzf/src/util/util_test.go new file mode 100644 index 0000000..4baa56f --- /dev/null +++ b/.fzf/src/util/util_test.go @@ -0,0 +1,40 @@ +package util + +import "testing" + +func TestMax(t *testing.T) { + if Max(-2, 5) != 5 { + t.Error("Invalid result") + } +} + +func TestContrain(t *testing.T) { + if Constrain(-3, -1, 3) != -1 { + t.Error("Expected", -1) + } + if Constrain(2, -1, 3) != 2 { + t.Error("Expected", 2) + } + + if Constrain(5, -1, 3) != 3 { + t.Error("Expected", 3) + } +} + +func TestOnce(t *testing.T) { + o := Once(false) + if o() { + t.Error("Expected: false") + } + if o() { + t.Error("Expected: false") + } + + o = Once(true) + if !o() { + t.Error("Expected: true") + } + if o() { + t.Error("Expected: false") + } +} diff --git a/.fzf/src/util/util_unix.go b/.fzf/src/util/util_unix.go new file mode 100644 index 0000000..6331275 --- /dev/null +++ b/.fzf/src/util/util_unix.go @@ -0,0 +1,47 @@ +// +build !windows + +package util + +import ( + "os" + "os/exec" + "syscall" +) + +// ExecCommand executes the given command with $SHELL +func ExecCommand(command string, setpgid bool) *exec.Cmd { + shell := os.Getenv("SHELL") + if len(shell) == 0 { + shell = "sh" + } + return ExecCommandWith(shell, command, setpgid) +} + +// ExecCommandWith executes the given command with the specified shell +func ExecCommandWith(shell string, command string, setpgid bool) *exec.Cmd { + cmd := exec.Command(shell, "-c", command) + if setpgid { + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + } + return cmd +} + +// KillCommand kills the process for the given command +func KillCommand(cmd *exec.Cmd) error { + return syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) +} + +// IsWindows returns true on Windows +func IsWindows() bool { + return false +} + +// SetNonblock executes syscall.SetNonblock on file descriptor +func SetNonblock(file *os.File, nonblock bool) { + syscall.SetNonblock(int(file.Fd()), nonblock) +} + +// Read executes syscall.Read on file descriptor +func Read(fd int, b []byte) (int, error) { + return syscall.Read(int(fd), b) +} diff --git a/.fzf/src/util/util_windows.go b/.fzf/src/util/util_windows.go new file mode 100644 index 0000000..e4e0437 --- /dev/null +++ b/.fzf/src/util/util_windows.go @@ -0,0 +1,83 @@ +// +build windows + +package util + +import ( + "fmt" + "os" + "os/exec" + "strings" + "sync/atomic" + "syscall" +) + +var shellPath atomic.Value + +// ExecCommand executes the given command with $SHELL +func ExecCommand(command string, setpgid bool) *exec.Cmd { + var shell string + if cached := shellPath.Load(); cached != nil { + shell = cached.(string) + } else { + shell = os.Getenv("SHELL") + if len(shell) == 0 { + shell = "cmd" + } else if strings.Contains(shell, "/") { + out, err := exec.Command("cygpath", "-w", shell).Output() + if err == nil { + shell = strings.Trim(string(out), "\n") + } + } + shellPath.Store(shell) + } + return ExecCommandWith(shell, command, setpgid) +} + +// ExecCommandWith executes the given command with the specified shell +// FIXME: setpgid is unused. We set it in the Unix implementation so that we +// can kill preview process with its child processes at once. +// NOTE: For "powershell", we should ideally set output encoding to UTF8, +// but it is left as is now because no adverse effect has been observed. +func ExecCommandWith(shell string, command string, setpgid bool) *exec.Cmd { + var cmd *exec.Cmd + if strings.Contains(shell, "cmd") { + cmd = exec.Command(shell) + cmd.SysProcAttr = &syscall.SysProcAttr{ + HideWindow: false, + CmdLine: fmt.Sprintf(` /v:on/s/c "%s"`, command), + CreationFlags: 0, + } + return cmd + } + + if strings.Contains(shell, "pwsh") || strings.Contains(shell, "powershell") { + cmd = exec.Command(shell, "-NoProfile", "-Command", command) + } else { + cmd = exec.Command(shell, "-c", command) + } + cmd.SysProcAttr = &syscall.SysProcAttr{ + HideWindow: false, + CreationFlags: 0, + } + return cmd +} + +// KillCommand kills the process for the given command +func KillCommand(cmd *exec.Cmd) error { + return cmd.Process.Kill() +} + +// IsWindows returns true on Windows +func IsWindows() bool { + return true +} + +// SetNonblock executes syscall.SetNonblock on file descriptor +func SetNonblock(file *os.File, nonblock bool) { + syscall.SetNonblock(syscall.Handle(file.Fd()), nonblock) +} + +// Read executes syscall.Read on file descriptor +func Read(fd int, b []byte) (int, error) { + return syscall.Read(syscall.Handle(fd), b) +} diff --git a/.fzf/test/fzf.vader b/.fzf/test/fzf.vader new file mode 100644 index 0000000..07f0c8d --- /dev/null +++ b/.fzf/test/fzf.vader @@ -0,0 +1,175 @@ +Execute (Setup): + let g:dir = fnamemodify(g:vader_file, ':p:h') + unlet! g:fzf_layout g:fzf_action g:fzf_history_dir + Log 'Test directory: ' . g:dir + Save &acd + +Execute (fzf#run with dir option): + let cwd = getcwd() + let result = fzf#run({ 'source': 'git ls-files', 'options': '--filter=vdr', 'dir': g:dir }) + AssertEqual ['fzf.vader'], result + AssertEqual 0, haslocaldir() + AssertEqual getcwd(), cwd + + execute 'lcd' fnameescape(cwd) + let result = sort(fzf#run({ 'source': 'git ls-files', 'options': '--filter e', 'dir': g:dir })) + AssertEqual ['fzf.vader', 'test_go.rb'], result + AssertEqual 1, haslocaldir() + AssertEqual getcwd(), cwd + +Execute (fzf#run with Funcref command): + let g:ret = [] + function! g:FzfTest(e) + call add(g:ret, a:e) + endfunction + let result = sort(fzf#run({ 'source': 'git ls-files', 'sink': function('g:FzfTest'), 'options': '--filter e', 'dir': g:dir })) + AssertEqual ['fzf.vader', 'test_go.rb'], result + AssertEqual ['fzf.vader', 'test_go.rb'], sort(g:ret) + +Execute (fzf#run with string source): + let result = sort(fzf#run({ 'source': 'echo hi', 'options': '-f i' })) + AssertEqual ['hi'], result + +Execute (fzf#run with list source): + let result = sort(fzf#run({ 'source': ['hello', 'world'], 'options': '-f e' })) + AssertEqual ['hello'], result + let result = sort(fzf#run({ 'source': ['hello', 'world'], 'options': '-f o' })) + AssertEqual ['hello', 'world'], result + +Execute (fzf#run with string source): + let result = sort(fzf#run({ 'source': 'echo hi', 'options': '-f i' })) + AssertEqual ['hi'], result + +Execute (fzf#run with dir option and noautochdir): + set noacd + let cwd = getcwd() + call fzf#run({'source': ['/foobar'], 'sink': 'e', 'dir': '/tmp', 'options': '-1'}) + " No change in working directory + AssertEqual cwd, getcwd() + + call fzf#run({'source': ['/foobar'], 'sink': 'tabe', 'dir': '/tmp', 'options': '-1'}) + AssertEqual cwd, getcwd() + tabclose + AssertEqual cwd, getcwd() + +Execute (Incomplete fzf#run with dir option and autochdir): + set acd + let cwd = getcwd() + call fzf#run({'source': [], 'sink': 'e', 'dir': '/tmp', 'options': '-0'}) + " No change in working directory even if &acd is set + AssertEqual cwd, getcwd() + +Execute (FIXME: fzf#run with dir option and autochdir): + set acd + call fzf#run({'source': ['/foobar'], 'sink': 'e', 'dir': '/tmp', 'options': '-1'}) + " Working directory changed due to &acd + AssertEqual '/foobar', expand('%') + AssertEqual '/', getcwd() + +Execute (fzf#run with dir option and autochdir when final cwd is same as dir): + set acd + cd /tmp + call fzf#run({'source': ['/foobar'], 'sink': 'e', 'dir': '/', 'options': '-1'}) + " Working directory changed due to &acd + AssertEqual '/', getcwd() + +Execute (fzf#wrap): + AssertThrows fzf#wrap({'foo': 'bar'}) + + let opts = fzf#wrap('foobar') + Log opts + AssertEqual '~40%', opts.down + Assert opts.options =~ '--expect=' + Assert !has_key(opts, 'sink') + Assert has_key(opts, 'sink*') + + let opts = fzf#wrap('foobar', {}, 0) + Log opts + AssertEqual '~40%', opts.down + + let opts = fzf#wrap('foobar', {}, 1) + Log opts + Assert !has_key(opts, 'down') + + let opts = fzf#wrap('foobar', {'down': '50%'}) + Log opts + AssertEqual '50%', opts.down + + let opts = fzf#wrap('foobar', {'down': '50%'}, 1) + Log opts + Assert !has_key(opts, 'down') + + let opts = fzf#wrap('foobar', {'sink': 'e'}) + Log opts + AssertEqual 'e', opts.sink + Assert !has_key(opts, 'sink*') + + let opts = fzf#wrap('foobar', {'options': '--reverse'}) + Log opts + Assert opts.options =~ '--expect=' + Assert opts.options =~ '--reverse' + + let g:fzf_layout = {'window': 'enew'} + let opts = fzf#wrap('foobar') + Log opts + AssertEqual 'enew', opts.window + + let opts = fzf#wrap('foobar', {}, 1) + Log opts + Assert !has_key(opts, 'window') + + let opts = fzf#wrap('foobar', {'right': '50%'}) + Log opts + Assert !has_key(opts, 'window') + AssertEqual '50%', opts.right + + let opts = fzf#wrap('foobar', {'right': '50%'}, 1) + Log opts + Assert !has_key(opts, 'window') + Assert !has_key(opts, 'right') + + let g:fzf_action = {'a': 'tabe'} + let opts = fzf#wrap('foobar') + Log opts + Assert opts.options =~ '--expect=a' + Assert !has_key(opts, 'sink') + Assert has_key(opts, 'sink*') + + let opts = fzf#wrap('foobar', {'sink': 'e'}) + Log opts + AssertEqual 'e', opts.sink + Assert !has_key(opts, 'sink*') + + let g:fzf_history_dir = '/tmp' + let opts = fzf#wrap('foobar', {'options': '--color light'}) + Log opts + Assert opts.options =~ "--history '/tmp/foobar'" + Assert opts.options =~ '--color light' + + let g:fzf_colors = { 'fg': ['fg', 'Error'] } + let opts = fzf#wrap({}) + Assert opts.options =~ '^--color=fg:' + +Execute (fzf#shellescape with sh): + AssertEqual '''''', fzf#shellescape('', 'sh') + AssertEqual '''\''', fzf#shellescape('\', 'sh') + AssertEqual '''""''', fzf#shellescape('""', 'sh') + AssertEqual '''foobar>''', fzf#shellescape('foobar>', 'sh') + AssertEqual '''\\\"\\\''', fzf#shellescape('\\\"\\\', 'sh') + AssertEqual '''echo ''\''''a''\'''' && echo ''\''''b''\''''''', fzf#shellescape('echo ''a'' && echo ''b''', 'sh') + +Execute (fzf#shellescape with cmd.exe): + AssertEqual '^"^"', fzf#shellescape('', 'cmd.exe') + AssertEqual '^"\\^"', fzf#shellescape('\', 'cmd.exe') + AssertEqual '^"\^"\^"^"', fzf#shellescape('""', 'cmd.exe') + AssertEqual '^"foobar^>^"', fzf#shellescape('foobar>', 'cmd.exe') + AssertEqual '^"\\\\\\\^"\\\\\\^"', fzf#shellescape('\\\"\\\', 'cmd.exe') + AssertEqual '^"echo ''a'' ^&^& echo ''b''^"', fzf#shellescape('echo ''a'' && echo ''b''', 'cmd.exe') + + AssertEqual '^"C:\Program Files ^(x86^)\\^"', fzf#shellescape('C:\Program Files (x86)\', 'cmd.exe') + AssertEqual '^"C:/Program Files ^(x86^)/^"', fzf#shellescape('C:/Program Files (x86)/', 'cmd.exe') + AssertEqual '^"%%USERPROFILE%%^"', fzf#shellescape('%USERPROFILE%', 'cmd.exe') + +Execute (Cleanup): + unlet g:dir + Restore diff --git a/.fzf/test/test_go.rb b/.fzf/test/test_go.rb new file mode 100755 index 0000000..20a4c92 --- /dev/null +++ b/.fzf/test/test_go.rb @@ -0,0 +1,2626 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'minitest/autorun' +require 'fileutils' +require 'English' +require 'shellwords' +require 'erb' +require 'tempfile' + +TEMPLATE = DATA.read +UNSETS = %w[ + FZF_DEFAULT_COMMAND FZF_DEFAULT_OPTS + FZF_TMUX FZF_TMUX_OPTS + FZF_CTRL_T_COMMAND FZF_CTRL_T_OPTS + FZF_ALT_C_COMMAND + FZF_ALT_C_OPTS FZF_CTRL_R_OPTS + fish_history +].freeze +DEFAULT_TIMEOUT = 10 + +FILE = File.expand_path(__FILE__) +BASE = File.expand_path('..', __dir__) +Dir.chdir(BASE) +FZF = "FZF_DEFAULT_OPTS= FZF_DEFAULT_COMMAND= #{BASE}/bin/fzf" + +def wait + since = Time.now + begin + yield or raise Minitest::Assertion, 'Assertion failure' + rescue Minitest::Assertion + raise if Time.now - since > DEFAULT_TIMEOUT + + sleep(0.05) + retry + end +end + +class Shell + class << self + def bash + @bash ||= + begin + bashrc = '/tmp/fzf.bash' + File.open(bashrc, 'w') do |f| + f.puts ERB.new(TEMPLATE).result(binding) + end + + "bash --rcfile #{bashrc}" + end + end + + def zsh + @zsh ||= + begin + zdotdir = '/tmp/fzf-zsh' + FileUtils.rm_rf(zdotdir) + FileUtils.mkdir_p(zdotdir) + File.open("#{zdotdir}/.zshrc", 'w') do |f| + f.puts ERB.new(TEMPLATE).result(binding) + end + "ZDOTDIR=#{zdotdir} zsh" + end + end + + def fish + UNSETS.map { |v| v + '= ' }.join + 'fish' + end + end +end + +class Tmux + attr_reader :win + + def initialize(shell = :bash) + @win = go(%W[new-window -d -P -F #I #{Shell.send(shell)}]).first + go(%W[set-window-option -t #{@win} pane-base-index 0]) + return unless shell == :fish + + send_keys 'function fish_prompt; end; clear', :Enter + self.until(&:empty?) + end + + def kill + go(%W[kill-window -t #{win}]) + end + + def focus + go(%W[select-window -t #{win}]) + end + + def send_keys(*args) + go(%W[send-keys -t #{win}] + args.map(&:to_s)) + end + + def paste(str) + system('tmux', 'setb', str, ';', 'pasteb', '-t', win, ';', 'send-keys', '-t', win, 'Enter') + end + + def capture + go(%W[capture-pane -p -J -t #{win}]).map(&:rstrip).reverse.drop_while(&:empty?).reverse + end + + def until(refresh = false) + lines = nil + begin + wait do + lines = capture + class << lines + def counts + lazy + .map { |l| l.scan(%r{^. ([0-9]+)/([0-9]+)( \(([0-9]+)\))?}) } + .reject(&:empty?) + .first&.first&.map(&:to_i)&.values_at(0, 1, 3) || [0, 0, 0] + end + + def match_count + counts[0] + end + + def item_count + counts[1] + end + + def select_count + counts[2] + end + + def any_include?(val) + method = val.is_a?(Regexp) ? :match : :include? + find { |line| line.send(method, val) } + end + end + yield(lines).tap do |ok| + send_keys 'C-l' if refresh && !ok + end + end + rescue Minitest::Assertion + puts $ERROR_INFO.backtrace + puts '>' * 80 + puts lines + puts '<' * 80 + raise + end + lines + end + + def prepare + tries = 0 + begin + self.until(true) do |lines| + message = "Prepare[#{tries}]" + send_keys ' ', 'C-u', :Enter, message, :Left, :Right + lines[-1] == message + end + rescue Minitest::Assertion + (tries += 1) < 5 ? retry : raise + end + send_keys 'C-u', 'C-l' + end + + private + + def go(args) + IO.popen(%w[tmux] + args) { |io| io.readlines(chomp: true) } + end +end + +class TestBase < Minitest::Test + TEMPNAME = '/tmp/output' + + attr_reader :tmux + + def tempname + @temp_suffix ||= 0 + [TEMPNAME, + caller_locations.map(&:label).find { |l| l.start_with?('test_') }, + @temp_suffix].join('-') + end + + def writelines(path, lines) + File.unlink(path) while File.exist?(path) + File.open(path, 'w') { |f| f.puts lines } + end + + def readonce + wait { assert_path_exists tempname } + File.read(tempname) + ensure + File.unlink(tempname) while File.exist?(tempname) + @temp_suffix += 1 + tmux.prepare + end + + def fzf(*opts) + fzf!(*opts) + " > #{tempname}.tmp; mv #{tempname}.tmp #{tempname}" + end + + def fzf!(*opts) + opts = opts.map do |o| + case o + when Symbol + o = o.to_s + o.length > 1 ? "--#{o.tr('_', '-')}" : "-#{o}" + when String, Numeric + o.to_s + end + end.compact + "#{FZF} #{opts.join(' ')}" + end +end + +class TestGoFZF < TestBase + def setup + super + @tmux = Tmux.new + end + + def teardown + @tmux.kill + end + + def test_vanilla + tmux.send_keys "seq 1 100000 | #{fzf}", :Enter + tmux.until do |lines| + assert_equal '>', lines.last + assert_equal ' 100000/100000', lines[-2] + end + lines = tmux.capture + assert_equal ' 2', lines[-4] + assert_equal '> 1', lines[-3] + assert_equal ' 100000/100000', lines[-2] + assert_equal '>', lines[-1] + + # Testing basic key bindings + tmux.send_keys '99', 'C-a', '1', 'C-f', '3', 'C-b', 'C-h', 'C-u', 'C-e', 'C-y', 'C-k', 'Tab', 'BTab' + tmux.until do |lines| + assert_equal '> 3910', lines[-4] + assert_equal ' 391', lines[-3] + assert_equal ' 856/100000', lines[-2] + assert_equal '> 391', lines[-1] + end + + tmux.send_keys :Enter + assert_equal '3910', readonce.chomp + end + + def test_fzf_default_command + tmux.send_keys fzf.sub('FZF_DEFAULT_COMMAND=', "FZF_DEFAULT_COMMAND='echo hello'"), :Enter + tmux.until { |lines| assert_equal '> hello', lines[-3] } + + tmux.send_keys :Enter + assert_equal 'hello', readonce.chomp + end + + def test_fzf_default_command_failure + tmux.send_keys fzf.sub('FZF_DEFAULT_COMMAND=', 'FZF_DEFAULT_COMMAND=false'), :Enter + tmux.until { |lines| assert_equal ' [Command failed: false]', lines[-2] } + tmux.send_keys :Enter + end + + def test_key_bindings + tmux.send_keys "#{FZF} -q 'foo bar foo-bar'", :Enter + tmux.until { |lines| assert_equal '> foo bar foo-bar', lines.last } + + # CTRL-A + tmux.send_keys 'C-A', '(' + tmux.until { |lines| assert_equal '> (foo bar foo-bar', lines.last } + + # META-F + tmux.send_keys :Escape, :f, ')' + tmux.until { |lines| assert_equal '> (foo) bar foo-bar', lines.last } + + # CTRL-B + tmux.send_keys 'C-B', 'var' + tmux.until { |lines| assert_equal '> (foovar) bar foo-bar', lines.last } + + # Left, CTRL-D + tmux.send_keys :Left, :Left, 'C-D' + tmux.until { |lines| assert_equal '> (foovr) bar foo-bar', lines.last } + + # META-BS + tmux.send_keys :Escape, :BSpace + tmux.until { |lines| assert_equal '> (r) bar foo-bar', lines.last } + + # CTRL-Y + tmux.send_keys 'C-Y', 'C-Y' + tmux.until { |lines| assert_equal '> (foovfoovr) bar foo-bar', lines.last } + + # META-B + tmux.send_keys :Escape, :b, :Space, :Space + tmux.until { |lines| assert_equal '> ( foovfoovr) bar foo-bar', lines.last } + + # CTRL-F / Right + tmux.send_keys 'C-F', :Right, '/' + tmux.until { |lines| assert_equal '> ( fo/ovfoovr) bar foo-bar', lines.last } + + # CTRL-H / BS + tmux.send_keys 'C-H', :BSpace + tmux.until { |lines| assert_equal '> ( fovfoovr) bar foo-bar', lines.last } + + # CTRL-E + tmux.send_keys 'C-E', 'baz' + tmux.until { |lines| assert_equal '> ( fovfoovr) bar foo-barbaz', lines.last } + + # CTRL-U + tmux.send_keys 'C-U' + tmux.until { |lines| assert_equal '>', lines.last } + + # CTRL-Y + tmux.send_keys 'C-Y' + tmux.until { |lines| assert_equal '> ( fovfoovr) bar foo-barbaz', lines.last } + + # CTRL-W + tmux.send_keys 'C-W', 'bar-foo' + tmux.until { |lines| assert_equal '> ( fovfoovr) bar bar-foo', lines.last } + + # META-D + tmux.send_keys :Escape, :b, :Escape, :b, :Escape, :d, 'C-A', 'C-Y' + tmux.until { |lines| assert_equal '> bar( fovfoovr) bar -foo', lines.last } + + # CTRL-M + tmux.send_keys 'C-M' + tmux.until { |lines| refute_equal '>', lines.last } + end + + def test_file_word + tmux.send_keys "#{FZF} -q '--/foo bar/foo-bar/baz' --filepath-word", :Enter + tmux.until { |lines| assert_equal '> --/foo bar/foo-bar/baz', lines.last } + + tmux.send_keys :Escape, :b + tmux.send_keys :Escape, :b + tmux.send_keys :Escape, :b + tmux.send_keys :Escape, :d + tmux.send_keys :Escape, :f + tmux.send_keys :Escape, :BSpace + tmux.until { |lines| assert_equal '> --///baz', lines.last } + end + + def test_multi_order + tmux.send_keys "seq 1 10 | #{fzf(:multi)}", :Enter + tmux.until { |lines| assert_equal '>', lines.last } + + tmux.send_keys :Tab, :Up, :Up, :Tab, :Tab, :Tab, # 3, 2 + 'C-K', 'C-K', 'C-K', 'C-K', :BTab, :BTab, # 5, 6 + :PgUp, 'C-J', :Down, :Tab, :Tab # 8, 7 + tmux.until { |lines| assert_equal ' 10/10 (6)', lines[-2] } + tmux.send_keys 'C-M' + assert_equal %w[3 2 5 6 8 7], readonce.lines(chomp: true) + end + + def test_multi_max + tmux.send_keys "seq 1 10 | #{FZF} -m 3 --bind A:select-all,T:toggle-all --preview 'echo [{+}]/{}'", :Enter + + tmux.until { |lines| assert_equal 10, lines.item_count } + + tmux.send_keys '1' + tmux.until do |lines| + assert_includes lines[1], ' [1]/1 ' + assert lines[-2]&.start_with?(' 2/10 ') + end + + tmux.send_keys 'A' + tmux.until do |lines| + assert_includes lines[1], ' [1 10]/1 ' + assert lines[-2]&.start_with?(' 2/10 (2/3)') + end + + tmux.send_keys :BSpace + tmux.until { |lines| assert lines[-2]&.start_with?(' 10/10 (2/3)') } + + tmux.send_keys 'T' + tmux.until do |lines| + assert_includes lines[1], ' [2 3 4]/1 ' + assert lines[-2]&.start_with?(' 10/10 (3/3)') + end + + %w[T A].each do |key| + tmux.send_keys key + tmux.until do |lines| + assert_includes lines[1], ' [1 5 6]/1 ' + assert lines[-2]&.start_with?(' 10/10 (3/3)') + end + end + + tmux.send_keys :BTab + tmux.until do |lines| + assert_includes lines[1], ' [5 6]/2 ' + assert lines[-2]&.start_with?(' 10/10 (2/3)') + end + + [:BTab, :BTab, 'A'].each do |key| + tmux.send_keys key + tmux.until do |lines| + assert_includes lines[1], ' [5 6 2]/3 ' + assert lines[-2]&.start_with?(' 10/10 (3/3)') + end + end + + tmux.send_keys '2' + tmux.until { |lines| assert lines[-2]&.start_with?(' 1/10 (3/3)') } + + tmux.send_keys 'T' + tmux.until do |lines| + assert_includes lines[1], ' [5 6]/2 ' + assert lines[-2]&.start_with?(' 1/10 (2/3)') + end + + tmux.send_keys :BSpace + tmux.until { |lines| assert lines[-2]&.start_with?(' 10/10 (2/3)') } + + tmux.send_keys 'A' + tmux.until do |lines| + assert_includes lines[1], ' [5 6 1]/1 ' + assert lines[-2]&.start_with?(' 10/10 (3/3)') + end + end + + def test_with_nth + [true, false].each do |multi| + tmux.send_keys "(echo ' 1st 2nd 3rd/'; + echo ' first second third/') | + #{fzf(multi && :multi, :x, :nth, 2, :with_nth, '2,-1,1')}", + :Enter + tmux.until { |lines| assert_equal multi ? ' 2/2 (0)' : ' 2/2', lines[-2] } + + # Transformed list + lines = tmux.capture + assert_equal ' second third/first', lines[-4] + assert_equal '> 2nd 3rd/1st', lines[-3] + + # However, the output must not be transformed + if multi + tmux.send_keys :BTab, :BTab + tmux.until { |lines| assert_equal ' 2/2 (2)', lines[-2] } + tmux.send_keys :Enter + assert_equal [' 1st 2nd 3rd/', ' first second third/'], readonce.lines(chomp: true) + else + tmux.send_keys '^', '3' + tmux.until { |lines| assert_equal ' 1/2', lines[-2] } + tmux.send_keys :Enter + assert_equal [' 1st 2nd 3rd/'], readonce.lines(chomp: true) + end + end + end + + def test_scroll + [true, false].each do |rev| + tmux.send_keys "seq 1 100 | #{fzf(rev && :reverse)}", :Enter + tmux.until { |lines| assert_includes lines, ' 100/100' } + tmux.send_keys(*Array.new(110) { rev ? :Down : :Up }) + tmux.until { |lines| assert_includes lines, '> 100' } + tmux.send_keys :Enter + assert_equal '100', readonce.chomp + end + end + + def test_select_1 + tmux.send_keys "seq 1 100 | #{fzf(:with_nth, '..,..', :print_query, :q, 5555, :'1')}", :Enter + assert_equal %w[5555 55], readonce.lines(chomp: true) + end + + def test_exit_0 + tmux.send_keys "seq 1 100 | #{fzf(:with_nth, '..,..', :print_query, :q, 555_555, :'0')}", :Enter + assert_equal %w[555555], readonce.lines(chomp: true) + end + + def test_select_1_exit_0_fail + [:'0', :'1', %i[1 0]].each do |opt| + tmux.send_keys "seq 1 100 | #{fzf(:print_query, :multi, :q, 5, *opt)}", :Enter + tmux.until { |lines| assert_equal '> 5', lines.last } + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 19/100 (3)', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[5 5 50 51], readonce.lines(chomp: true) + end + end + + def test_query_unicode + tmux.paste "(echo abc; echo $'\\352\\260\\200\\353\\202\\230\\353\\213\\244') | #{fzf(:query, "$'\\352\\260\\200\\353\\213\\244'")}" + tmux.until { |lines| assert_equal ' 1/2', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[가나다], readonce.lines(chomp: true) + end + + def test_sync + tmux.send_keys "seq 1 100 | #{fzf!(:multi)} | awk '{print $1 $1}' | #{fzf(:sync)}", :Enter + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys 9 + tmux.until { |lines| assert_equal ' 19/100 (0)', lines[-2] } + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 19/100 (3)', lines[-2] } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys 'C-K', :Enter + assert_equal %w[9090], readonce.lines(chomp: true) + end + + def test_tac + tmux.send_keys "seq 1 1000 | #{fzf(:tac, :multi)}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 1000/1000 (3)', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[1000 999 998], readonce.lines(chomp: true) + end + + def test_tac_sort + tmux.send_keys "seq 1 1000 | #{fzf(:tac, :multi)}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys '99' + tmux.until { |lines| assert_equal ' 28/1000 (0)', lines[-2] } + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 28/1000 (3)', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[99 999 998], readonce.lines(chomp: true) + end + + def test_tac_nosort + tmux.send_keys "seq 1 1000 | #{fzf(:tac, :no_sort, :multi)}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys '00' + tmux.until { |lines| assert_equal ' 10/1000 (0)', lines[-2] } + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 10/1000 (3)', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[1000 900 800], readonce.lines(chomp: true) + end + + def test_expect + test = lambda do |key, feed, expected = key| + tmux.send_keys "seq 1 100 | #{fzf(:expect, key)}", :Enter + tmux.until { |lines| assert_equal ' 100/100', lines[-2] } + tmux.send_keys '55' + tmux.until { |lines| assert_equal ' 1/100', lines[-2] } + tmux.send_keys(*feed) + tmux.prepare + assert_equal [expected, '55'], readonce.lines(chomp: true) + end + test.call('ctrl-t', 'C-T') + test.call('ctrl-t', 'Enter', '') + test.call('alt-c', %i[Escape c]) + test.call('f1', 'f1') + test.call('f2', 'f2') + test.call('f3', 'f3') + test.call('f2,f4', 'f2', 'f2') + test.call('f2,f4', 'f4', 'f4') + test.call('alt-/', %i[Escape /]) + %w[f5 f6 f7 f8 f9 f10].each do |key| + test.call('f5,f6,f7,f8,f9,f10', key, key) + end + test.call('@', '@') + end + + def test_expect_print_query + tmux.send_keys "seq 1 100 | #{fzf('--expect=alt-z', :print_query)}", :Enter + tmux.until { |lines| assert_equal ' 100/100', lines[-2] } + tmux.send_keys '55' + tmux.until { |lines| assert_equal ' 1/100', lines[-2] } + tmux.send_keys :Escape, :z + assert_equal %w[55 alt-z 55], readonce.lines(chomp: true) + end + + def test_expect_printable_character_print_query + tmux.send_keys "seq 1 100 | #{fzf('--expect=z --print-query')}", :Enter + tmux.until { |lines| assert_equal ' 100/100', lines[-2] } + tmux.send_keys '55' + tmux.until { |lines| assert_equal ' 1/100', lines[-2] } + tmux.send_keys 'z' + assert_equal %w[55 z 55], readonce.lines(chomp: true) + end + + def test_expect_print_query_select_1 + tmux.send_keys "seq 1 100 | #{fzf('-q55 -1 --expect=alt-z --print-query')}", :Enter + assert_equal ['55', '', '55'], readonce.lines(chomp: true) + end + + def test_toggle_sort + ['--toggle-sort=ctrl-r', '--bind=ctrl-r:toggle-sort'].each do |opt| + tmux.send_keys "seq 1 111 | #{fzf("-m +s --tac #{opt} -q11")}", :Enter + tmux.until { |lines| assert_equal '> 111', lines[-3] } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' 4/111 -S (1)', lines[-2] } + tmux.send_keys 'C-R' + tmux.until { |lines| assert_equal '> 11', lines[-3] } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' 4/111 +S (2)', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[111 11], readonce.lines(chomp: true) + end + end + + def test_unicode_case + writelines(tempname, %w[строКА1 СТРОКА2 строка3 Строка4]) + assert_equal %w[СТРОКА2 Строка4], `#{FZF} -fС < #{tempname}`.lines(chomp: true) + assert_equal %w[строКА1 СТРОКА2 строка3 Строка4], `#{FZF} -fс < #{tempname}`.lines(chomp: true) + end + + def test_tiebreak + input = %w[ + --foobar-------- + -----foobar--- + ----foobar-- + -------foobar- + ] + writelines(tempname, input) + + assert_equal input, `#{FZF} -ffoobar --tiebreak=index < #{tempname}`.lines(chomp: true) + + by_length = %w[ + ----foobar-- + -----foobar--- + -------foobar- + --foobar-------- + ] + assert_equal by_length, `#{FZF} -ffoobar < #{tempname}`.lines(chomp: true) + assert_equal by_length, `#{FZF} -ffoobar --tiebreak=length < #{tempname}`.lines(chomp: true) + + by_begin = %w[ + --foobar-------- + ----foobar-- + -----foobar--- + -------foobar- + ] + assert_equal by_begin, `#{FZF} -ffoobar --tiebreak=begin < #{tempname}`.lines(chomp: true) + assert_equal by_begin, `#{FZF} -f"!z foobar" -x --tiebreak begin < #{tempname}`.lines(chomp: true) + + assert_equal %w[ + -------foobar- + ----foobar-- + -----foobar--- + --foobar-------- + ], `#{FZF} -ffoobar --tiebreak end < #{tempname}`.lines(chomp: true) + + assert_equal input, `#{FZF} -f"!z" -x --tiebreak end < #{tempname}`.lines(chomp: true) + end + + def test_tiebreak_index_begin + writelines(tempname, [ + 'xoxxxxxoxx', + 'xoxxxxxox', + 'xxoxxxoxx', + 'xxxoxoxxx', + 'xxxxoxox', + ' xxoxoxxx' + ]) + + assert_equal [ + 'xxxxoxox', + ' xxoxoxxx', + 'xxxoxoxxx', + 'xxoxxxoxx', + 'xoxxxxxox', + 'xoxxxxxoxx' + ], `#{FZF} -foo < #{tempname}`.lines(chomp: true) + + assert_equal [ + 'xxxoxoxxx', + 'xxxxoxox', + ' xxoxoxxx', + 'xxoxxxoxx', + 'xoxxxxxoxx', + 'xoxxxxxox' + ], `#{FZF} -foo --tiebreak=index < #{tempname}`.lines(chomp: true) + + # Note that --tiebreak=begin is now based on the first occurrence of the + # first character on the pattern + assert_equal [ + ' xxoxoxxx', + 'xxxoxoxxx', + 'xxxxoxox', + 'xxoxxxoxx', + 'xoxxxxxoxx', + 'xoxxxxxox' + ], `#{FZF} -foo --tiebreak=begin < #{tempname}`.lines(chomp: true) + + assert_equal [ + ' xxoxoxxx', + 'xxxoxoxxx', + 'xxxxoxox', + 'xxoxxxoxx', + 'xoxxxxxox', + 'xoxxxxxoxx' + ], `#{FZF} -foo --tiebreak=begin,length < #{tempname}`.lines(chomp: true) + end + + def test_tiebreak_begin_algo_v2 + writelines(tempname, [ + 'baz foo bar', + 'foo bar baz' + ]) + assert_equal [ + 'foo bar baz', + 'baz foo bar' + ], `#{FZF} -fbar --tiebreak=begin --algo=v2 < #{tempname}`.lines(chomp: true) + end + + def test_tiebreak_end + writelines(tempname, [ + 'xoxxxxxxxx', + 'xxoxxxxxxx', + 'xxxoxxxxxx', + 'xxxxoxxxx', + 'xxxxxoxxx', + ' xxxxoxxx' + ]) + + assert_equal [ + ' xxxxoxxx', + 'xxxxoxxxx', + 'xxxxxoxxx', + 'xoxxxxxxxx', + 'xxoxxxxxxx', + 'xxxoxxxxxx' + ], `#{FZF} -fo < #{tempname}`.lines(chomp: true) + + assert_equal [ + 'xxxxxoxxx', + ' xxxxoxxx', + 'xxxxoxxxx', + 'xxxoxxxxxx', + 'xxoxxxxxxx', + 'xoxxxxxxxx' + ], `#{FZF} -fo --tiebreak=end < #{tempname}`.lines(chomp: true) + + assert_equal [ + 'xxxxxoxxx', + ' xxxxoxxx', + 'xxxxoxxxx', + 'xxxoxxxxxx', + 'xxoxxxxxxx', + 'xoxxxxxxxx' + ], `#{FZF} -fo --tiebreak=end,length,begin < #{tempname}`.lines(chomp: true) + end + + def test_tiebreak_length_with_nth + input = %w[ + 1:hell + 123:hello + 12345:he + 1234567:h + ] + writelines(tempname, input) + + output = %w[ + 1:hell + 12345:he + 123:hello + 1234567:h + ] + assert_equal output, `#{FZF} -fh < #{tempname}`.lines(chomp: true) + + # Since 0.16.8, --nth doesn't affect --tiebreak + assert_equal output, `#{FZF} -fh -n2 -d: < #{tempname}`.lines(chomp: true) + end + + def test_invalid_cache + tmux.send_keys "(echo d; echo D; echo x) | #{fzf('-q d')}", :Enter + tmux.until { |lines| assert_equal ' 2/3', lines[-2] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal ' 3/3', lines[-2] } + tmux.send_keys :D + tmux.until { |lines| assert_equal ' 1/3', lines[-2] } + tmux.send_keys :Enter + end + + def test_invalid_cache_query_type + command = %[(echo 'foo$bar'; echo 'barfoo'; echo 'foo^bar'; echo "foo'1-2"; seq 100) | #{fzf}] + + # Suffix match + tmux.send_keys command, :Enter + tmux.until { |lines| assert_equal 104, lines.match_count } + tmux.send_keys 'foo$' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys 'bar' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + + # Prefix match + tmux.prepare + tmux.send_keys command, :Enter + tmux.until { |lines| assert_equal 104, lines.match_count } + tmux.send_keys '^bar' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys 'C-a', 'foo' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + + # Exact match + tmux.prepare + tmux.send_keys command, :Enter + tmux.until { |lines| assert_equal 104, lines.match_count } + tmux.send_keys "'12" + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys 'C-a', 'foo' + tmux.until { |lines| assert_equal 1, lines.match_count } + end + + def test_smart_case_for_each_term + assert_equal 1, `echo Foo bar | #{FZF} -x -f "foo Fbar" | wc -l`.to_i + end + + def test_bind + tmux.send_keys "seq 1 1000 | #{fzf('-m --bind=ctrl-j:accept,u:up,T:toggle-up,t:toggle')}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys 'uuu', 'TTT', 'tt', 'uu', 'ttt', 'C-j' + assert_equal %w[4 5 6 9], readonce.lines(chomp: true) + end + + def test_bind_print_query + tmux.send_keys "seq 1 1000 | #{fzf('-m --bind=ctrl-j:print-query')}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys 'print-my-query', 'C-j' + assert_equal %w[print-my-query], readonce.lines(chomp: true) + end + + def test_bind_replace_query + tmux.send_keys "seq 1 1000 | #{fzf('--print-query --bind=ctrl-j:replace-query')}", :Enter + tmux.send_keys '1' + tmux.until { |lines| assert_equal ' 272/1000', lines[-2] } + tmux.send_keys 'C-k', 'C-j' + tmux.until { |lines| assert_equal ' 29/1000', lines[-2] } + tmux.until { |lines| assert_equal '> 10', lines[-1] } + end + + def test_long_line + data = '.' * 256 * 1024 + File.open(tempname, 'w') do |f| + f << data + end + assert_equal data, `#{FZF} -f . < #{tempname}`.chomp + end + + def test_read0 + lines = `find .`.lines(chomp: true) + assert_equal lines.last, `find . | #{FZF} -e -f "^#{lines.last}$"`.chomp + assert_equal \ + lines.last, + `find . -print0 | #{FZF} --read0 -e -f "^#{lines.last}$"`.chomp + end + + def test_select_all_deselect_all_toggle_all + tmux.send_keys "seq 100 | #{fzf('--bind ctrl-a:select-all,ctrl-d:deselect-all,ctrl-t:toggle-all --multi')}", :Enter + tmux.until { |lines| assert_equal ' 100/100 (0)', lines[-2] } + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 100/100 (3)', lines[-2] } + tmux.send_keys 'C-t' + tmux.until { |lines| assert_equal ' 100/100 (97)', lines[-2] } + tmux.send_keys 'C-a' + tmux.until { |lines| assert_equal ' 100/100 (100)', lines[-2] } + tmux.send_keys :Tab, :Tab + tmux.until { |lines| assert_equal ' 100/100 (98)', lines[-2] } + tmux.send_keys '100' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys 'C-d' + tmux.until { |lines| assert_equal ' 1/100 (97)', lines[-2] } + tmux.send_keys 'C-u' + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.send_keys 'C-d' + tmux.until { |lines| assert_equal ' 100/100 (0)', lines[-2] } + tmux.send_keys :BTab, :BTab + tmux.until { |lines| assert_equal ' 100/100 (2)', lines[-2] } + tmux.send_keys 0 + tmux.until { |lines| assert_equal ' 10/100 (2)', lines[-2] } + tmux.send_keys 'C-a' + tmux.until { |lines| assert_equal ' 10/100 (12)', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[1 2 10 20 30 40 50 60 70 80 90 100], + readonce.lines(chomp: true) + end + + def test_history + history_file = '/tmp/fzf-test-history' + + # History with limited number of entries + begin + File.unlink(history_file) + rescue StandardError + nil + end + opts = "--history=#{history_file} --history-size=4" + input = %w[00 11 22 33 44] + input.each do |keys| + tmux.prepare + tmux.send_keys "seq 100 | #{fzf(opts)}", :Enter + tmux.until { |lines| assert_equal ' 100/100', lines[-2] } + tmux.send_keys keys + tmux.until { |lines| assert_equal ' 1/100', lines[-2] } + tmux.send_keys :Enter + end + wait do + assert_path_exists history_file + assert_equal input[1..-1], File.readlines(history_file, chomp: true) + end + + # Update history entries (not changed on disk) + tmux.send_keys "seq 100 | #{fzf(opts)}", :Enter + tmux.until { |lines| assert_equal ' 100/100', lines[-2] } + tmux.send_keys 'C-p' + tmux.until { |lines| assert_equal '> 44', lines[-1] } + tmux.send_keys 'C-p' + tmux.until { |lines| assert_equal '> 33', lines[-1] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal '> 3', lines[-1] } + tmux.send_keys 1 + tmux.until { |lines| assert_equal '> 31', lines[-1] } + tmux.send_keys 'C-p' + tmux.until { |lines| assert_equal '> 22', lines[-1] } + tmux.send_keys 'C-n' + tmux.until { |lines| assert_equal '> 31', lines[-1] } + tmux.send_keys 0 + tmux.until { |lines| assert_equal '> 310', lines[-1] } + tmux.send_keys :Enter + wait do + assert_path_exists history_file + assert_equal %w[22 33 44 310], File.readlines(history_file, chomp: true) + end + + # Respect --bind option + tmux.send_keys "seq 100 | #{fzf(opts + ' --bind ctrl-p:next-history,ctrl-n:previous-history')}", :Enter + tmux.until { |lines| assert_equal ' 100/100', lines[-2] } + tmux.send_keys 'C-n', 'C-n', 'C-n', 'C-n', 'C-p' + tmux.until { |lines| assert_equal '> 33', lines[-1] } + tmux.send_keys :Enter + ensure + File.unlink(history_file) + end + + def test_execute + output = '/tmp/fzf-test-execute' + opts = %[--bind "alt-a:execute(echo /{}/ >> #{output}),alt-b:execute[echo /{}{}/ >> #{output}],C:execute:echo /{}{}{}/ >> #{output}"] + writelines(tempname, %w[foo'bar foo"bar foo$bar]) + tmux.send_keys "cat #{tempname} | #{fzf(opts)}", :Enter + tmux.until { |lines| assert_equal ' 3/3', lines[-2] } + tmux.send_keys :Escape, :a + tmux.send_keys :Escape, :a + tmux.send_keys :Up + tmux.send_keys :Escape, :b + tmux.send_keys :Escape, :b + tmux.send_keys :Up + tmux.send_keys :C + tmux.send_keys 'barfoo' + tmux.until { |lines| assert_equal ' 0/3', lines[-2] } + tmux.send_keys :Escape, :a + tmux.send_keys :Escape, :b + wait do + assert_path_exists output + assert_equal %w[ + /foo'bar/ /foo'bar/ + /foo"barfoo"bar/ /foo"barfoo"bar/ + /foo$barfoo$barfoo$bar/ + ], File.readlines(output, chomp: true) + end + ensure + begin + File.unlink(output) + rescue StandardError + nil + end + end + + def test_execute_multi + output = '/tmp/fzf-test-execute-multi' + opts = %[--multi --bind "alt-a:execute-multi(echo {}/{+} >> #{output})"] + writelines(tempname, %w[foo'bar foo"bar foo$bar foobar]) + tmux.send_keys "cat #{tempname} | #{fzf(opts)}", :Enter + tmux.until { |lines| assert_equal ' 4/4 (0)', lines[-2] } + tmux.send_keys :Escape, :a + tmux.send_keys :BTab, :BTab, :BTab + tmux.until { |lines| assert_equal ' 4/4 (3)', lines[-2] } + tmux.send_keys :Escape, :a + tmux.send_keys :Tab, :Tab + tmux.until { |lines| assert_equal ' 4/4 (3)', lines[-2] } + tmux.send_keys :Escape, :a + wait do + assert_path_exists output + assert_equal [ + %(foo'bar/foo'bar), + %(foo'bar foo"bar foo$bar/foo'bar foo"bar foo$bar), + %(foo'bar foo"bar foobar/foo'bar foo"bar foobar) + ], File.readlines(output, chomp: true) + end + ensure + begin + File.unlink(output) + rescue StandardError + nil + end + end + + def test_execute_plus_flag + output = tempname + '.tmp' + begin + File.unlink(output) + rescue StandardError + nil + end + writelines(tempname, ['foo bar', '123 456']) + + tmux.send_keys "cat #{tempname} | #{FZF} --multi --bind 'x:execute-silent(echo {+}/{}/{+2}/{2} >> #{output})'", :Enter + + tmux.until { |lines| assert_equal ' 2/2 (0)', lines[-2] } + tmux.send_keys 'xy' + tmux.until { |lines| assert_equal ' 0/2 (0)', lines[-2] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal ' 2/2 (0)', lines[-2] } + + tmux.send_keys :Up + tmux.send_keys :Tab + tmux.send_keys 'xy' + tmux.until { |lines| assert_equal ' 0/2 (1)', lines[-2] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal ' 2/2 (1)', lines[-2] } + + tmux.send_keys :Tab + tmux.send_keys 'xy' + tmux.until { |lines| assert_equal ' 0/2 (2)', lines[-2] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal ' 2/2 (2)', lines[-2] } + + wait do + assert_path_exists output + assert_equal [ + %(foo bar/foo bar/bar/bar), + %(123 456/foo bar/456/bar), + %(123 456 foo bar/foo bar/456 bar/bar) + ], File.readlines(output, chomp: true) + end + rescue StandardError + begin + File.unlink(output) + rescue StandardError + nil + end + end + + def test_execute_shell + # Custom script to use as $SHELL + output = tempname + '.out' + begin + File.unlink(output) + rescue StandardError + nil + end + writelines(tempname, + ['#!/usr/bin/env bash', "echo $1 / $2 > #{output}"]) + system("chmod +x #{tempname}") + + tmux.send_keys "echo foo | SHELL=#{tempname} fzf --bind 'enter:execute:{}bar'", :Enter + tmux.until { |lines| assert_equal ' 1/1', lines[-2] } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal ' 1/1', lines[-2] } + wait do + assert_path_exists output + assert_equal ["-c / 'foo'bar"], File.readlines(output, chomp: true) + end + ensure + begin + File.unlink(output) + rescue StandardError + nil + end + end + + def test_cycle + tmux.send_keys "seq 8 | #{fzf(:cycle)}", :Enter + tmux.until { |lines| assert_equal ' 8/8', lines[-2] } + tmux.send_keys :Down + tmux.until { |lines| assert_equal '> 8', lines[-10] } + tmux.send_keys :Down + tmux.until { |lines| assert_equal '> 7', lines[-9] } + tmux.send_keys :Up + tmux.until { |lines| assert_equal '> 8', lines[-10] } + tmux.send_keys :PgUp + tmux.until { |lines| assert_equal '> 8', lines[-10] } + tmux.send_keys :Up + tmux.until { |lines| assert_equal '> 1', lines[-3] } + tmux.send_keys :PgDn + tmux.until { |lines| assert_equal '> 1', lines[-3] } + tmux.send_keys :Down + tmux.until { |lines| assert_equal '> 8', lines[-10] } + end + + def test_header_lines + tmux.send_keys "seq 100 | #{fzf('--header-lines=10 -q 5')}", :Enter + 2.times do + tmux.until do |lines| + assert_equal ' 18/90', lines[-2] + assert_equal ' 1', lines[-3] + assert_equal ' 2', lines[-4] + assert_equal '> 50', lines[-13] + end + tmux.send_keys :Down + end + tmux.send_keys :Enter + assert_equal '50', readonce.chomp + end + + def test_header_lines_reverse + tmux.send_keys "seq 100 | #{fzf('--header-lines=10 -q 5 --reverse')}", :Enter + 2.times do + tmux.until do |lines| + assert_equal ' 18/90', lines[1] + assert_equal ' 1', lines[2] + assert_equal ' 2', lines[3] + assert_equal '> 50', lines[12] + end + tmux.send_keys :Up + end + tmux.send_keys :Enter + assert_equal '50', readonce.chomp + end + + def test_header_lines_reverse_list + tmux.send_keys "seq 100 | #{fzf('--header-lines=10 -q 5 --layout=reverse-list')}", :Enter + 2.times do + tmux.until do |lines| + assert_equal '> 50', lines[0] + assert_equal ' 2', lines[-4] + assert_equal ' 1', lines[-3] + assert_equal ' 18/90', lines[-2] + end + tmux.send_keys :Up + end + tmux.send_keys :Enter + assert_equal '50', readonce.chomp + end + + def test_header_lines_overflow + tmux.send_keys "seq 100 | #{fzf('--header-lines=200')}", :Enter + tmux.until do |lines| + assert_equal ' 0/0', lines[-2] + assert_equal ' 1', lines[-3] + end + tmux.send_keys :Enter + assert_equal '', readonce.chomp + end + + def test_header_lines_with_nth + tmux.send_keys "seq 100 | #{fzf('--header-lines 5 --with-nth 1,1,1,1,1')}", :Enter + tmux.until do |lines| + assert_equal ' 95/95', lines[-2] + assert_equal ' 11111', lines[-3] + assert_equal ' 55555', lines[-7] + assert_equal '> 66666', lines[-8] + end + tmux.send_keys :Enter + assert_equal '6', readonce.chomp + end + + def test_header + tmux.send_keys "seq 100 | #{fzf("--header \"$(head -5 #{FILE})\"")}", :Enter + header = File.readlines(FILE, chomp: true).take(5) + tmux.until do |lines| + assert_equal ' 100/100', lines[-2] + assert_equal header.map { |line| " #{line}".rstrip }, lines[-7..-3] + assert_equal '> 1', lines[-8] + end + end + + def test_header_reverse + tmux.send_keys "seq 100 | #{fzf("--header \"$(head -5 #{FILE})\" --reverse")}", :Enter + header = File.readlines(FILE, chomp: true).take(5) + tmux.until do |lines| + assert_equal ' 100/100', lines[1] + assert_equal header.map { |line| " #{line}".rstrip }, lines[2..6] + assert_equal '> 1', lines[7] + end + end + + def test_header_reverse_list + tmux.send_keys "seq 100 | #{fzf("--header \"$(head -5 #{FILE})\" --layout=reverse-list")}", :Enter + header = File.readlines(FILE, chomp: true).take(5) + tmux.until do |lines| + assert_equal ' 100/100', lines[-2] + assert_equal header.map { |line| " #{line}".rstrip }, lines[-7..-3] + assert_equal '> 1', lines[0] + end + end + + def test_header_and_header_lines + tmux.send_keys "seq 100 | #{fzf("--header-lines 10 --header \"$(head -5 #{FILE})\"")}", :Enter + header = File.readlines(FILE, chomp: true).take(5) + tmux.until do |lines| + assert_equal ' 90/90', lines[-2] + assert_equal header.map { |line| " #{line}".rstrip }, lines[-7...-2] + assert_equal (' 1'..' 10').to_a.reverse, lines[-17...-7] + end + end + + def test_header_and_header_lines_reverse + tmux.send_keys "seq 100 | #{fzf("--reverse --header-lines 10 --header \"$(head -5 #{FILE})\"")}", :Enter + header = File.readlines(FILE, chomp: true).take(5) + tmux.until do |lines| + assert_equal ' 90/90', lines[1] + assert_equal header.map { |line| " #{line}".rstrip }, lines[2...7] + assert_equal (' 1'..' 10').to_a, lines[7...17] + end + end + + def test_header_and_header_lines_reverse_list + tmux.send_keys "seq 100 | #{fzf("--layout=reverse-list --header-lines 10 --header \"$(head -5 #{FILE})\"")}", :Enter + header = File.readlines(FILE, chomp: true).take(5) + tmux.until do |lines| + assert_equal ' 90/90', lines[-2] + assert_equal header.map { |line| " #{line}".rstrip }, lines[-7...-2] + assert_equal (' 1'..' 10').to_a.reverse, lines[-17...-7] + end + end + + def test_cancel + tmux.send_keys "seq 10 | #{fzf('--bind 2:cancel')}", :Enter + tmux.until { |lines| assert_equal ' 10/10', lines[-2] } + tmux.send_keys '123' + tmux.until do |lines| + assert_equal '> 3', lines[-1] + assert_equal ' 1/10', lines[-2] + end + tmux.send_keys 'C-y', 'C-y' + tmux.until { |lines| assert_equal '> 311', lines[-1] } + tmux.send_keys 2 + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys 2 + tmux.prepare + end + + def test_margin + tmux.send_keys "yes | head -1000 | #{fzf('--margin 5,3')}", :Enter + tmux.until do |lines| + assert_equal '', lines[4] + assert_equal ' y', lines[5] + end + tmux.send_keys :Enter + end + + def test_margin_reverse + tmux.send_keys "seq 1000 | #{fzf('--margin 7,5 --reverse')}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000', lines[1 + 7] } + tmux.send_keys :Enter + end + + def test_margin_reverse_list + tmux.send_keys "yes | head -1000 | #{fzf('--margin 5,3 --layout=reverse-list')}", :Enter + tmux.until do |lines| + assert_equal '', lines[4] + assert_equal ' > y', lines[5] + end + tmux.send_keys :Enter + end + + def test_tabstop + writelines(tempname, %W[f\too\tba\tr\tbaz\tbarfooq\tux]) + { + 1 => '> f oo ba r baz barfooq ux', + 2 => '> f oo ba r baz barfooq ux', + 3 => '> f oo ba r baz barfooq ux', + 4 => '> f oo ba r baz barfooq ux', + 5 => '> f oo ba r baz barfooq ux', + 6 => '> f oo ba r baz barfooq ux', + 7 => '> f oo ba r baz barfooq ux', + 8 => '> f oo ba r baz barfooq ux', + 9 => '> f oo ba r baz barfooq ux' + }.each do |ts, exp| + tmux.prepare + tmux.send_keys %(cat #{tempname} | fzf --tabstop=#{ts}), :Enter + tmux.until(true) do |lines| + assert_equal exp, lines[-3] + end + tmux.send_keys :Enter + end + end + + def test_with_nth_basic + writelines(tempname, ['hello world ', 'byebye']) + assert_equal \ + 'hello world ', + `#{FZF} -f"^he hehe" -x -n 2.. --with-nth 2,1,1 < #{tempname}`.chomp + end + + def test_with_nth_ansi + writelines(tempname, ["\x1b[33mhello \x1b[34;1mworld\x1b[m ", 'byebye']) + assert_equal \ + 'hello world ', + `#{FZF} -f"^he hehe" -x -n 2.. --with-nth 2,1,1 --ansi < #{tempname}`.chomp + end + + def test_with_nth_no_ansi + src = "\x1b[33mhello \x1b[34;1mworld\x1b[m " + writelines(tempname, [src, 'byebye']) + assert_equal \ + src, + `#{FZF} -fhehe -x -n 2.. --with-nth 2,1,1 --no-ansi < #{tempname}`.chomp + end + + def test_exit_0_exit_code + `echo foo | #{FZF} -q bar -0` + assert_equal 1, $CHILD_STATUS.exitstatus + end + + def test_invalid_option + lines = `#{FZF} --foobar 2>&1` + assert_equal 2, $CHILD_STATUS.exitstatus + assert_includes lines, 'unknown option: --foobar' + end + + def test_filter_exitstatus + # filter / streaming filter + ['', '--no-sort'].each do |opts| + assert_includes `echo foo | #{FZF} -f foo #{opts}`, 'foo' + assert_equal 0, $CHILD_STATUS.exitstatus + + assert_empty `echo foo | #{FZF} -f bar #{opts}` + assert_equal 1, $CHILD_STATUS.exitstatus + end + end + + def test_exitstatus_empty + { '99' => '0', '999' => '1' }.each do |query, status| + tmux.send_keys "seq 100 | #{FZF} -q #{query}; echo --$?--", :Enter + tmux.until { |lines| assert_match %r{ [10]/100}, lines[-2] } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal "--#{status}--", lines.last } + end + end + + def test_default_extended + assert_equal '100', `seq 100 | #{FZF} -f "1 00$"`.chomp + assert_equal '', `seq 100 | #{FZF} -f "1 00$" +x`.chomp + end + + def test_exact + assert_equal 4, `seq 123 | #{FZF} -f 13`.lines.length + assert_equal 2, `seq 123 | #{FZF} -f 13 -e`.lines.length + assert_equal 4, `seq 123 | #{FZF} -f 13 +e`.lines.length + end + + def test_or_operator + assert_equal %w[1 5 10], `seq 10 | #{FZF} -f "1 | 5"`.lines(chomp: true) + assert_equal %w[1 10 2 3 4 5 6 7 8 9], + `seq 10 | #{FZF} -f '1 | !1'`.lines(chomp: true) + end + + def test_hscroll_off + writelines(tempname, ['=' * 10_000 + '0123456789']) + [0, 3, 6].each do |off| + tmux.prepare + tmux.send_keys "#{FZF} --hscroll-off=#{off} -q 0 < #{tempname}", :Enter + tmux.until { |lines| assert lines[-3]&.end_with?((0..off).to_a.join + '..') } + tmux.send_keys '9' + tmux.until { |lines| assert lines[-3]&.end_with?('789') } + tmux.send_keys :Enter + end + end + + def test_partial_caching + tmux.send_keys 'seq 1000 | fzf -e', :Enter + tmux.until { |lines| assert_equal ' 1000/1000', lines[-2] } + tmux.send_keys 11 + tmux.until { |lines| assert_equal ' 19/1000', lines[-2] } + tmux.send_keys 'C-a', "'" + tmux.until { |lines| assert_equal ' 28/1000', lines[-2] } + tmux.send_keys :Enter + end + + def test_jump + tmux.send_keys "seq 1000 | #{fzf("--multi --jump-labels 12345 --bind 'ctrl-j:jump'")}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys 'C-j' + tmux.until { |lines| assert_equal '5 5', lines[-7] } + tmux.until { |lines| assert_equal ' 6', lines[-8] } + tmux.send_keys '5' + tmux.until { |lines| assert_equal '> 5', lines[-7] } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' >5', lines[-7] } + tmux.send_keys 'C-j' + tmux.until { |lines| assert_equal '5>5', lines[-7] } + tmux.send_keys '2' + tmux.until { |lines| assert_equal '> 2', lines[-4] } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' >2', lines[-4] } + tmux.send_keys 'C-j' + tmux.until { |lines| assert_equal '5>5', lines[-7] } + + # Press any key other than jump labels to cancel jump + tmux.send_keys '6' + tmux.until { |lines| assert_equal '> 1', lines[-3] } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal '>>1', lines[-3] } + tmux.send_keys :Enter + assert_equal %w[5 2 1], readonce.lines(chomp: true) + end + + def test_jump_accept + tmux.send_keys "seq 1000 | #{fzf("--multi --jump-labels 12345 --bind 'ctrl-j:jump-accept'")}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000 (0)', lines[-2] } + tmux.send_keys 'C-j' + tmux.until { |lines| assert_equal '5 5', lines[-7] } + tmux.send_keys '3' + assert_equal '3', readonce.chomp + end + + def test_pointer + tmux.send_keys "seq 10 | #{fzf("--pointer '>>'")}", :Enter + # Assert that specified pointer is displayed + tmux.until { |lines| assert_equal '>> 1', lines[-3] } + end + + def test_pointer_with_jump + tmux.send_keys "seq 10 | #{fzf("--multi --jump-labels 12345 --bind 'ctrl-j:jump' --pointer '>>'")}", :Enter + tmux.until { |lines| assert_equal ' 10/10 (0)', lines[-2] } + tmux.send_keys 'C-j' + # Correctly padded jump label should appear + tmux.until { |lines| assert_equal '5 5', lines[-7] } + tmux.until { |lines| assert_equal ' 6', lines[-8] } + tmux.send_keys '5' + # Assert that specified pointer is displayed + tmux.until { |lines| assert_equal '>> 5', lines[-7] } + end + + def test_marker + tmux.send_keys "seq 10 | #{fzf("--multi --marker '>>'")}", :Enter + tmux.until { |lines| assert_equal ' 10/10 (0)', lines[-2] } + tmux.send_keys :BTab + # Assert that specified marker is displayed + tmux.until { |lines| assert_equal ' >>1', lines[-3] } + end + + def test_preview + tmux.send_keys %(seq 1000 | sed s/^2$// | #{FZF} -m --preview 'sleep 0.2; echo {{}-{+}}' --bind ?:toggle-preview), :Enter + tmux.until { |lines| assert_includes lines[1], ' {1-1} ' } + tmux.send_keys :Up + tmux.until { |lines| assert_includes lines[1], ' {-} ' } + tmux.send_keys '555' + tmux.until { |lines| assert_includes lines[1], ' {555-555} ' } + tmux.send_keys '?' + tmux.until { |lines| refute_includes lines[1], ' {555-555} ' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[1], ' {555-555} ' } + tmux.send_keys :BSpace + tmux.until { |lines| assert lines[-2]&.start_with?(' 28/1000 ') } + tmux.send_keys 'foobar' + tmux.until { |lines| refute_includes lines[1], ' {55-55} ' } + tmux.send_keys 'C-u' + tmux.until { |lines| assert_equal 1000, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' {1-1} ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' {-1} ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' {3-1 } ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' {4-1 3} ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' {5-1 3 4} ' } + end + + def test_preview_hidden + tmux.send_keys %(seq 1000 | #{FZF} --preview 'echo {{}-{}-$FZF_PREVIEW_LINES-$FZF_PREVIEW_COLUMNS}' --preview-window down:1:hidden --bind ?:toggle-preview), :Enter + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys '?' + tmux.until { |lines| assert_match(/ {1-1-1-[0-9]+}/, lines[-2]) } + tmux.send_keys '555' + tmux.until { |lines| assert_match(/ {555-555-1-[0-9]+}/, lines[-2]) } + tmux.send_keys '?' + tmux.until { |lines| assert_equal '> 555', lines[-1] } + end + + def test_preview_size_0 + begin + File.unlink(tempname) + rescue StandardError + nil + end + tmux.send_keys %(seq 100 | #{FZF} --reverse --preview 'echo {} >> #{tempname}; echo ' --preview-window 0), :Enter + tmux.until do |lines| + assert_equal 100, lines.item_count + assert_equal ' 100/100', lines[1] + assert_equal '> 1', lines[2] + end + wait do + assert_path_exists tempname + assert_equal %w[1], File.readlines(tempname, chomp: true) + end + tmux.send_keys :Down + tmux.until { |lines| assert_equal '> 2', lines[3] } + wait do + assert_path_exists tempname + assert_equal %w[1 2], File.readlines(tempname, chomp: true) + end + tmux.send_keys :Down + tmux.until { |lines| assert_equal '> 3', lines[4] } + wait do + assert_path_exists tempname + assert_equal %w[1 2 3], File.readlines(tempname, chomp: true) + end + end + + def test_preview_flags + tmux.send_keys %(seq 10 | sed 's/^/:: /; s/$/ /' | + #{FZF} --multi --preview 'echo {{2}/{s2}/{+2}/{+s2}/{q}/{n}/{+n}}'), :Enter + tmux.until { |lines| assert_includes lines[1], ' {1/1 /1/1 //0/0} ' } + tmux.send_keys '123' + tmux.until { |lines| assert_includes lines[1], ' {////123//} ' } + tmux.send_keys 'C-u', '1' + tmux.until { |lines| assert_equal 2, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' {1/1 /1/1 /1/0/0} ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' {10/10 /1/1 /1/9/0} ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' {10/10 /1 10/1 10 /1/9/0 9} ' } + tmux.send_keys '2' + tmux.until { |lines| assert_includes lines[1], ' {//1 10/1 10 /12//0 9} ' } + tmux.send_keys '3' + tmux.until { |lines| assert_includes lines[1], ' {//1 10/1 10 /123//0 9} ' } + end + + def test_preview_file + tmux.send_keys %[(echo foo bar; echo bar foo) | #{FZF} --multi --preview 'cat {+f} {+f2} {+nf} {+fn}' --print0], :Enter + tmux.until { |lines| assert_includes lines[1], ' foo barbar00 ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' foo barbar00 ' } + tmux.send_keys :BTab + tmux.until { |lines| assert_includes lines[1], ' foo barbar foobarfoo0101 ' } + end + + def test_preview_q_no_match + tmux.send_keys %(: | #{FZF} --preview 'echo foo {q}'), :Enter + tmux.until { |lines| assert_equal 0, lines.match_count } + tmux.until { |lines| refute_includes lines[1], ' foo ' } + tmux.send_keys 'bar' + tmux.until { |lines| assert_includes lines[1], ' foo bar ' } + tmux.send_keys 'C-u' + tmux.until { |lines| refute_includes lines[1], ' foo ' } + end + + def test_preview_q_no_match_with_initial_query + tmux.send_keys %(: | #{FZF} --preview 'echo foo {q}{q}' --query foo), :Enter + tmux.until { |lines| assert_equal 0, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' foofoo ' } + end + + def test_no_clear + tmux.send_keys "seq 10 | fzf --no-clear --inline-info --height 5 > #{tempname}", :Enter + prompt = '> < 10/10' + tmux.until { |lines| assert_equal prompt, lines[-1] } + tmux.send_keys :Enter + wait do + assert_path_exists tempname + assert_equal %w[1], File.readlines(tempname, chomp: true) + end + tmux.until { |lines| assert_equal prompt, lines[-1] } + end + + def test_info_hidden + tmux.send_keys 'seq 10 | fzf --info=hidden', :Enter + tmux.until { |lines| assert_equal '> 1', lines[-2] } + end + + def test_change_first_last + tmux.send_keys %(seq 1000 | #{FZF} --bind change:first,alt-Z:last), :Enter + tmux.until { |lines| assert_equal 1000, lines.match_count } + tmux.send_keys :Up + tmux.until { |lines| assert_equal '> 2', lines[-4] } + tmux.send_keys 1 + tmux.until { |lines| assert_equal '> 1', lines[-3] } + tmux.send_keys :Up + tmux.until { |lines| assert_equal '> 10', lines[-4] } + tmux.send_keys 1 + tmux.until { |lines| assert_equal '> 11', lines[-3] } + tmux.send_keys 'C-u' + tmux.until { |lines| assert_equal '> 1', lines[-3] } + tmux.send_keys :Escape, 'Z' + tmux.until { |lines| assert_equal '> 1000', lines[0] } + tmux.send_keys :Enter + end + + def test_accept_non_empty + tmux.send_keys %(seq 1000 | #{fzf('--print-query --bind enter:accept-non-empty')}), :Enter + tmux.until { |lines| assert_equal 1000, lines.match_count } + tmux.send_keys 'foo' + tmux.until { |lines| assert_equal ' 0/1000', lines[-2] } + # fzf doesn't exit since there's no selection + tmux.send_keys :Enter + tmux.until { |lines| assert_equal ' 0/1000', lines[-2] } + tmux.send_keys 'C-u' + tmux.until { |lines| assert_equal ' 1000/1000', lines[-2] } + tmux.send_keys '999' + tmux.until { |lines| assert_equal ' 1/1000', lines[-2] } + tmux.send_keys :Enter + assert_equal %w[999 999], readonce.lines(chomp: true) + end + + def test_accept_non_empty_with_multi_selection + tmux.send_keys %(seq 1000 | #{fzf('-m --print-query --bind enter:accept-non-empty')}), :Enter + tmux.until { |lines| assert_equal 1000, lines.match_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' 1000/1000 (1)', lines[-2] } + tmux.send_keys 'foo' + tmux.until { |lines| assert_equal ' 0/1000 (1)', lines[-2] } + # fzf will exit in this case even though there's no match for the current query + tmux.send_keys :Enter + assert_equal %w[foo 1], readonce.lines(chomp: true) + end + + def test_accept_non_empty_with_empty_list + tmux.send_keys %(: | #{fzf('-q foo --print-query --bind enter:accept-non-empty')}), :Enter + tmux.until { |lines| assert_equal ' 0/0', lines[-2] } + tmux.send_keys :Enter + # fzf will exit anyway since input list is empty + assert_equal %w[foo], readonce.lines(chomp: true) + end + + def test_preview_update_on_select + tmux.send_keys %(seq 10 | fzf -m --preview 'echo {+}' --bind a:toggle-all), + :Enter + tmux.until { |lines| assert_equal 10, lines.item_count } + tmux.send_keys 'a' + tmux.until { |lines| assert(lines.any? { |line| line.include?(' 1 2 3 4 5 ') }) } + tmux.send_keys 'a' + tmux.until { |lines| lines.each { |line| refute_includes line, ' 1 2 3 4 5 ' } } + end + + def test_escaped_meta_characters + input = [ + 'foo^bar', + 'foo$bar', + 'foo!bar', + "foo'bar", + 'foo bar', + 'bar foo' + ] + writelines(tempname, input) + + assert_equal input.length, `#{FZF} -f'foo bar' < #{tempname}`.lines.length + assert_equal input.length - 1, `#{FZF} -f'^foo bar$' < #{tempname}`.lines.length + assert_equal ['foo bar'], `#{FZF} -f'foo\\ bar' < #{tempname}`.lines(chomp: true) + assert_equal ['foo bar'], `#{FZF} -f'^foo\\ bar$' < #{tempname}`.lines(chomp: true) + assert_equal input.length - 1, `#{FZF} -f'!^foo\\ bar$' < #{tempname}`.lines.length + end + + def test_inverse_only_search_should_not_sort_the_result + # Filter + assert_equal %w[aaaaa b ccc], + `printf '%s\n' aaaaa b ccc BAD | #{FZF} -f '!bad'`.lines(chomp: true) + + # Interactive + tmux.send_keys %(printf '%s\n' aaaaa b ccc BAD | #{FZF} -q '!bad'), :Enter + tmux.until do |lines| + assert_equal 4, lines.item_count + assert_equal 3, lines.match_count + end + tmux.until { |lines| assert_equal '> aaaaa', lines[-3] } + tmux.until { |lines| assert_equal ' b', lines[-4] } + tmux.until { |lines| assert_equal ' ccc', lines[-5] } + end + + def test_preview_correct_tab_width_after_ansi_reset_code + writelines(tempname, ["\x1b[31m+\x1b[m\t\x1b[32mgreen"]) + tmux.send_keys "#{FZF} --preview 'cat #{tempname}'", :Enter + tmux.until { |lines| assert_includes lines[1], ' + green ' } + end + + def test_disabled + tmux.send_keys %(seq 1000 | #{FZF} --query 333 --disabled --bind a:enable-search,b:disable-search,c:toggle-search --preview 'echo {} {q}'), :Enter + tmux.until { |lines| assert_equal 1000, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' 1 333 ' } + tmux.send_keys 'foo' + tmux.until { |lines| assert_equal 1000, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' 1 333foo ' } + + # Already disabled, no change + tmux.send_keys 'b' + tmux.until { |lines| assert_equal 1000, lines.match_count } + + # Enable search + tmux.send_keys 'a' + tmux.until { |lines| assert_equal 0, lines.match_count } + tmux.send_keys :BSpace, :BSpace, :BSpace + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' 333 333 ' } + + # Toggle search -> disabled again, but retains the previous result + tmux.send_keys 'c' + tmux.send_keys 'foo' + tmux.until { |lines| assert_includes lines[1], ' 333 333foo ' } + tmux.until { |lines| assert_equal 1, lines.match_count } + + # Enabled, no match + tmux.send_keys 'c' + tmux.until { |lines| assert_equal 0, lines.match_count } + tmux.until { |lines| assert_includes lines[1], ' 333foo ' } + end + + def test_reload + tmux.send_keys %(seq 1000 | #{FZF} --bind 'change:reload(seq {q}),a:reload(seq 100),b:reload:seq 200' --header-lines 2 --multi 2), :Enter + tmux.until { |lines| assert_equal 998, lines.match_count } + tmux.send_keys 'a' + tmux.until do |lines| + assert_equal 98, lines.item_count + assert_equal 98, lines.match_count + end + tmux.send_keys 'b' + tmux.until do |lines| + assert_equal 198, lines.item_count + assert_equal 198, lines.match_count + end + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' 198/198 (1/2)', lines[-2] } + tmux.send_keys '555' + tmux.until { |lines| assert_equal ' 1/553 (0/2)', lines[-2] } + end + + def test_reload_even_when_theres_no_match + tmux.send_keys %(: | #{FZF} --bind 'space:reload(seq 10)'), :Enter + tmux.until { |lines| assert_equal 0, lines.item_count } + tmux.send_keys :Space + tmux.until { |lines| assert_equal 10, lines.item_count } + end + + def test_clear_list_when_header_lines_changed_due_to_reload + tmux.send_keys %(seq 10 | #{FZF} --header 0 --header-lines 3 --bind 'space:reload(seq 1)'), :Enter + tmux.until { |lines| assert_includes lines, ' 9' } + tmux.send_keys :Space + tmux.until { |lines| refute_includes lines, ' 9' } + end + + def test_clear_query + tmux.send_keys %(: | #{FZF} --query foo --bind space:clear-query), :Enter + tmux.until { |lines| assert_equal 0, lines.item_count } + tmux.until { |lines| assert_equal '> foo', lines.last } + tmux.send_keys 'C-a', 'bar' + tmux.until { |lines| assert_equal '> barfoo', lines.last } + tmux.send_keys :Space + tmux.until { |lines| assert_equal '>', lines.last } + end + + def test_clear_selection + tmux.send_keys %(seq 100 | #{FZF} --multi --bind space:clear-selection), :Enter + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal ' 100/100 (1)', lines[-2] } + tmux.send_keys 'foo' + tmux.until { |lines| assert_equal ' 0/100 (1)', lines[-2] } + tmux.send_keys :Space + tmux.until { |lines| assert_equal ' 0/100 (0)', lines[-2] } + end + + def test_backward_delete_char_eof + tmux.send_keys "seq 1000 | #{fzf("--bind 'bs:backward-delete-char/eof'")}", :Enter + tmux.until { |lines| assert_equal ' 1000/1000', lines[-2] } + tmux.send_keys '11' + tmux.until { |lines| assert_equal '> 11', lines[-1] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal '> 1', lines[-1] } + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys :BSpace + tmux.prepare + end + + def test_strip_xterm_osc_sequence + %W[\x07 \x1b\\].each do |esc| + writelines(tempname, [%(printf $1"\e]4;3;rgb:aa/bb/cc#{esc} "$2)]) + File.chmod(0o755, tempname) + tmux.prepare + tmux.send_keys \ + %(echo foo bar | #{FZF} --preview '#{tempname} {2} {1}'), :Enter + + tmux.until { |lines| assert lines.any_include?('bar foo') } + tmux.send_keys :Enter + end + end + + def test_keep_right + tmux.send_keys "seq 10000 | #{FZF} --read0 --keep-right", :Enter + tmux.until { |lines| assert lines.any_include?('9999 10000') } + end + + def test_backward_eof + tmux.send_keys "echo foo | #{FZF} --bind 'backward-eof:reload(seq 100)'", :Enter + tmux.until { |lines| lines.item_count == 1 && lines.match_count == 1 } + tmux.send_keys 'x' + tmux.until { |lines| lines.item_count == 1 && lines.match_count == 0 } + tmux.send_keys :BSpace + tmux.until { |lines| lines.item_count == 1 && lines.match_count == 1 } + tmux.send_keys :BSpace + tmux.until { |lines| lines.item_count == 100 && lines.match_count == 100 } + end + + def test_preview_bindings_with_default_preview + tmux.send_keys "seq 10 | #{FZF} --preview 'echo [{}]' --bind 'a:preview(echo [{}{}]),b:preview(echo [{}{}{}]),c:refresh-preview'", :Enter + tmux.until { |lines| lines.item_count == 10 } + tmux.until { |lines| assert_includes lines[1], '[1]' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[1], '[11]' } + tmux.send_keys 'c' + tmux.until { |lines| assert_includes lines[1], '[1]' } + tmux.send_keys 'b' + tmux.until { |lines| assert_includes lines[1], '[111]' } + tmux.send_keys :Up + tmux.until { |lines| assert_includes lines[1], '[2]' } + end + + def test_preview_bindings_without_default_preview + tmux.send_keys "seq 10 | #{FZF} --bind 'a:preview(echo [{}{}]),b:preview(echo [{}{}{}]),c:refresh-preview'", :Enter + tmux.until { |lines| lines.item_count == 10 } + tmux.until { |lines| refute_includes lines[1], '1' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[1], '[11]' } + tmux.send_keys 'c' # does nothing + tmux.until { |lines| assert_includes lines[1], '[11]' } + tmux.send_keys 'b' + tmux.until { |lines| assert_includes lines[1], '[111]' } + tmux.send_keys 9 + tmux.until { |lines| lines.match_count == 1 } + tmux.until { |lines| refute_includes lines[1], '2' } + tmux.until { |lines| assert_includes lines[1], '[111]' } + end + + def test_preview_scroll_begin_constant + tmux.send_keys "echo foo 123 321 | #{FZF} --preview 'seq 1000' --preview-window left:+123", :Enter + tmux.until { |lines| assert_match %r{1/1}, lines[-2] } + tmux.until { |lines| assert_match %r{123.*123/1000}, lines[1] } + end + + def test_preview_scroll_begin_expr + tmux.send_keys "echo foo 123 321 | #{FZF} --preview 'seq 1000' --preview-window left:+{3}", :Enter + tmux.until { |lines| assert_match %r{1/1}, lines[-2] } + tmux.until { |lines| assert_match %r{321.*321/1000}, lines[1] } + end + + def test_preview_scroll_begin_and_offset + ['echo foo 123 321', 'echo foo :123: 321'].each do |input| + tmux.send_keys "#{input} | #{FZF} --preview 'seq 1000' --preview-window left:+{2}-2", :Enter + tmux.until { |lines| assert_match %r{1/1}, lines[-2] } + tmux.until { |lines| assert_match %r{121.*121/1000}, lines[1] } + tmux.send_keys 'C-c' + end + end + + def test_normalized_match + echoes = '(echo a; echo á; echo A; echo Á;)' + assert_equal %w[a á A Á], `#{echoes} | #{FZF} -f a`.lines.map(&:chomp) + assert_equal %w[á Á], `#{echoes} | #{FZF} -f á`.lines.map(&:chomp) + assert_equal %w[A Á], `#{echoes} | #{FZF} -f A`.lines.map(&:chomp) + assert_equal %w[Á], `#{echoes} | #{FZF} -f Á`.lines.map(&:chomp) + end + + def test_preview_clear_screen + tmux.send_keys %{seq 100 | #{FZF} --preview 'for i in $(seq 300); do (( i % 200 == 0 )) && printf "\\033[2J"; echo "[$i]"; sleep 0.001; done'}, :Enter + tmux.until { |lines| lines.item_count == 100 } + tmux.until { |lines| lines[1]&.include?('[200]') } + end + + def test_change_prompt + tmux.send_keys "#{FZF} --bind 'a:change-prompt(a> ),b:change-prompt:b> ' --query foo", :Enter + tmux.until { |lines| assert_equal '> foo', lines[-1] } + tmux.send_keys 'a' + tmux.until { |lines| assert_equal 'a> foo', lines[-1] } + tmux.send_keys 'b' + tmux.until { |lines| assert_equal 'b> foo', lines[-1] } + end + + def test_preview_window_follow + tmux.send_keys "#{FZF} --preview 'seq 1000 | nl' --preview-window down:noborder:follow", :Enter + tmux.until { |lines| assert_equal '1000 1000', lines[-1].strip } + end + + def test_toggle_preview_wrap + tmux.send_keys "#{FZF} --preview 'for i in $(seq $FZF_PREVIEW_COLUMNS); do echo -n .; done; echo wrapped; echo 2nd line' --bind ctrl-w:toggle-preview-wrap", :Enter + 2.times do + tmux.until { |lines| assert_includes lines[2], '2nd line' } + tmux.send_keys 'C-w' + tmux.until do |lines| + assert_includes lines[2], 'wrapped' + assert_includes lines[3], '2nd line' + end + tmux.send_keys 'C-w' + end + end + + def test_close + tmux.send_keys "seq 100 | #{FZF} --preview 'echo foo' --bind ctrl-c:close", :Enter + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.until { |lines| assert_includes lines[1], 'foo' } + tmux.send_keys 'C-c' + tmux.until { |lines| refute_includes lines[1], 'foo' } + tmux.send_keys '10' + tmux.until { |lines| assert_equal 2, lines.match_count } + tmux.send_keys 'C-c' + tmux.send_keys 'C-l', 'closed' + tmux.until { |lines| assert_includes lines[0], 'closed' } + end + + def test_select_deselect + tmux.send_keys "seq 3 | #{FZF} --multi --bind up:deselect+up,down:select+down", :Enter + tmux.until { |lines| assert_equal 3, lines.match_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 1, lines.select_count } + tmux.send_keys :Up + tmux.until { |lines| assert_equal 0, lines.select_count } + tmux.send_keys :Down, :Down + tmux.until { |lines| assert_equal 2, lines.select_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 1, lines.select_count } + tmux.send_keys :Down, :Down + tmux.until { |lines| assert_equal 2, lines.select_count } + tmux.send_keys :Up + tmux.until { |lines| assert_equal 1, lines.select_count } + tmux.send_keys :Down + tmux.until { |lines| assert_equal 1, lines.select_count } + tmux.send_keys :Down + tmux.until { |lines| assert_equal 2, lines.select_count } + end + + def test_interrupt_execute + tmux.send_keys "seq 100 | #{FZF} --bind 'ctrl-l:execute:echo executing {}; sleep 100'", :Enter + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys 'C-l' + tmux.until { |lines| assert lines.any_include?('executing 1') } + tmux.send_keys 'C-c' + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys 99 + tmux.until { |lines| assert_equal 1, lines.match_count } + end + + def test_kill_default_command_on_abort + script = tempname + '.sh' + writelines(script, + ['#!/usr/bin/env bash', + "echo 'Started'", + 'while :; do sleep 1; done']) + system("chmod +x #{script}") + + tmux.send_keys fzf.sub('FZF_DEFAULT_COMMAND=', "FZF_DEFAULT_COMMAND=#{script}"), :Enter + tmux.until { |lines| assert_equal 1, lines.item_count } + tmux.send_keys 'C-c' + tmux.send_keys 'C-l', 'closed' + tmux.until { |lines| assert_includes lines[0], 'closed' } + wait { refute system("pgrep -f #{script}") } + ensure + system("pkill -9 -f #{script}") + begin + File.unlink(script) + rescue StandardError + nil + end + end + + def test_kill_default_command_on_accept + script = tempname + '.sh' + writelines(script, + ['#!/usr/bin/env bash', + "echo 'Started'", + 'while :; do sleep 1; done']) + system("chmod +x #{script}") + + tmux.send_keys fzf.sub('FZF_DEFAULT_COMMAND=', "FZF_DEFAULT_COMMAND=#{script}"), :Enter + tmux.until { |lines| assert_equal 1, lines.item_count } + tmux.send_keys :Enter + assert_equal 'Started', readonce.chomp + wait { refute system("pgrep -f #{script}") } + ensure + system("pkill -9 -f #{script}") + begin + File.unlink(script) + rescue StandardError + nil + end + end + + def test_kill_reload_command_on_abort + script = tempname + '.sh' + writelines(script, + ['#!/usr/bin/env bash', + "echo 'Started'", + 'while :; do sleep 1; done']) + system("chmod +x #{script}") + + tmux.send_keys "seq 1 3 | #{fzf("--bind 'ctrl-r:reload(#{script})'")}", :Enter + tmux.until { |lines| assert_equal 3, lines.item_count } + tmux.send_keys 'C-r' + tmux.until { |lines| assert_equal 1, lines.item_count } + tmux.send_keys 'C-c' + tmux.send_keys 'C-l', 'closed' + tmux.until { |lines| assert_includes lines[0], 'closed' } + wait { refute system("pgrep -f #{script}") } + ensure + system("pkill -9 -f #{script}") + begin + File.unlink(script) + rescue StandardError + nil + end + end + + def test_kill_reload_command_on_accept + script = tempname + '.sh' + writelines(script, + ['#!/usr/bin/env bash', + "echo 'Started'", + 'while :; do sleep 1; done']) + system("chmod +x #{script}") + + tmux.send_keys "seq 1 3 | #{fzf("--bind 'ctrl-r:reload(#{script})'")}", :Enter + tmux.until { |lines| assert_equal 3, lines.item_count } + tmux.send_keys 'C-r' + tmux.until { |lines| assert_equal 1, lines.item_count } + tmux.send_keys :Enter + assert_equal 'Started', readonce.chomp + wait { refute system("pgrep -f #{script}") } + ensure + system("pkill -9 -f #{script}") + begin + File.unlink(script) + rescue StandardError + nil + end + end + + def test_preview_header + tmux.send_keys "seq 100 | #{FZF} --bind ctrl-k:preview-up+preview-up,ctrl-j:preview-down+preview-down+preview-down --preview 'seq 1000' --preview-window 'top:+{1}:~3'", :Enter + tmux.until { |lines| assert_equal 100, lines.item_count } + top5 = ->(lines) { lines.drop(1).take(5).map { |s| s[/[0-9]+/] } } + tmux.until do |lines| + assert_includes lines[1], '4/1000' + assert_equal(%w[1 2 3 4 5], top5[lines]) + end + tmux.send_keys '55' + tmux.until do |lines| + assert_equal 1, lines.match_count + assert_equal(%w[1 2 3 55 56], top5[lines]) + end + tmux.send_keys 'C-J' + tmux.until do |lines| + assert_equal(%w[1 2 3 58 59], top5[lines]) + end + tmux.send_keys :BSpace + tmux.until do |lines| + assert_equal 19, lines.match_count + assert_equal(%w[1 2 3 5 6], top5[lines]) + end + tmux.send_keys 'C-K' + tmux.until { |lines| assert_equal(%w[1 2 3 4 5], top5[lines]) } + end + + def test_unbind + tmux.send_keys "seq 100 | #{FZF} --bind 'c:clear-query,d:unbind(c,d)'", :Enter + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys 'ab' + tmux.until { |lines| assert_equal '> ab', lines[-1] } + tmux.send_keys 'c' + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys 'dabcd' + tmux.until { |lines| assert_equal '> abcd', lines[-1] } + end + + def test_item_index_reset_on_reload + tmux.send_keys "seq 10 | #{FZF} --preview 'echo [[{n}]]' --bind 'up:last,down:first,space:reload:seq 100'", :Enter + tmux.until { |lines| assert_includes lines[1], '[[0]]' } + tmux.send_keys :Up + tmux.until { |lines| assert_includes lines[1], '[[9]]' } + tmux.send_keys :Down + tmux.until { |lines| assert_includes lines[1], '[[0]]' } + tmux.send_keys :Space + tmux.until do |lines| + assert_equal 100, lines.item_count + assert_includes lines[1], '[[0]]' + end + tmux.send_keys :Up + tmux.until { |lines| assert_includes lines[1], '[[99]]' } + end + + def test_reload_should_update_preview + tmux.send_keys "seq 3 | #{FZF} --bind 'ctrl-t:reload:echo 4' --preview 'echo {}' --preview-window 'nohidden'", :Enter + tmux.until { |lines| assert_includes lines[1], '1' } + tmux.send_keys 'C-t' + tmux.until { |lines| assert_includes lines[1], '4' } + end + + def test_scroll_off + tmux.send_keys "seq 1000 | #{FZF} --scroll-off=3 --bind l:last", :Enter + tmux.until { |lines| assert_equal 1000, lines.item_count } + height = tmux.until { |lines| lines }.first.to_i + tmux.send_keys :PgUp + tmux.until do |lines| + assert_equal height + 3, lines.first.to_i + assert_equal "> #{height}", lines[3].strip + end + tmux.send_keys :Up + tmux.until { |lines| assert_equal "> #{height + 1}", lines[3].strip } + tmux.send_keys 'l' + tmux.until { |lines| assert_equal '> 1000', lines.first.strip } + tmux.send_keys :PgDn + tmux.until { |lines| assert_equal "> #{1000 - height + 1}", lines.reverse[5].strip } + tmux.send_keys :Down + tmux.until { |lines| assert_equal "> #{1000 - height}", lines.reverse[5].strip } + end + + def test_scroll_off_large + tmux.send_keys "seq 1000 | #{FZF} --scroll-off=9999", :Enter + tmux.until { |lines| assert_equal 1000, lines.item_count } + height = tmux.until { |lines| lines }.first.to_i + tmux.send_keys :PgUp + tmux.until { |lines| assert_equal "> #{height}", lines[height / 2].strip } + tmux.send_keys :Up + tmux.until { |lines| assert_equal "> #{height + 1}", lines[height / 2].strip } + tmux.send_keys :Up + tmux.until { |lines| assert_equal "> #{height + 2}", lines[height / 2].strip } + tmux.send_keys :Down + tmux.until { |lines| assert_equal "> #{height + 1}", lines[height / 2].strip } + end + + def test_header_first + tmux.send_keys "seq 1000 | #{FZF} --header foobar --header-lines 3 --header-first", :Enter + tmux.until do |lines| + expected = <<~OUTPUT + > 4 + 997/997 + > + 3 + 2 + 1 + foobar + OUTPUT + + assert_equal expected.chomp, lines.reverse.take(7).reverse.join("\n") + end + end + + def test_header_first_reverse + tmux.send_keys "seq 1000 | #{FZF} --header foobar --header-lines 3 --header-first --reverse --inline-info", :Enter + tmux.until do |lines| + expected = <<~OUTPUT + foobar + 1 + 2 + 3 + > < 997/997 + > 4 + OUTPUT + + assert_equal expected.chomp, lines.take(6).join("\n") + end + end +end + +module TestShell + def setup + @tmux = Tmux.new(shell) + tmux.prepare + end + + def teardown + @tmux.kill + end + + def set_var(name, val) + tmux.prepare + tmux.send_keys "export #{name}='#{val}'", :Enter + tmux.prepare + end + + def unset_var(name) + tmux.prepare + tmux.send_keys "unset #{name}", :Enter + tmux.prepare + end + + def test_ctrl_t + set_var('FZF_CTRL_T_COMMAND', 'seq 100') + + tmux.prepare + tmux.send_keys 'C-t' + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys :Tab, :Tab, :Tab + tmux.until { |lines| assert lines.any_include?(' (3)') } + tmux.send_keys :Enter + tmux.until { |lines| assert lines.any_include?('1 2 3') } + tmux.send_keys 'C-c' + end + + def test_ctrl_t_unicode + writelines(tempname, ['fzf-unicode 테스트1', 'fzf-unicode 테스트2']) + set_var('FZF_CTRL_T_COMMAND', "cat #{tempname}") + + tmux.prepare + tmux.send_keys 'echo ', 'C-t' + tmux.until { |lines| assert_equal 2, lines.item_count } + tmux.send_keys 'fzf-unicode' + tmux.until { |lines| assert_equal 2, lines.match_count } + + tmux.send_keys '1' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 1, lines.select_count } + + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal 2, lines.match_count } + + tmux.send_keys '2' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 2, lines.select_count } + + tmux.send_keys :Enter + tmux.until { |lines| assert_match(/echo .*fzf-unicode.*1.* .*fzf-unicode.*2/, lines.join) } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal 'fzf-unicode 테스트1 fzf-unicode 테스트2', lines[-1] } + end + + def test_alt_c + tmux.prepare + tmux.send_keys :Escape, :c + lines = tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + expected = lines.reverse.find { |l| l.start_with?('> ') }[2..-1] + tmux.send_keys :Enter + tmux.prepare + tmux.send_keys :pwd, :Enter + tmux.until { |lines| assert lines[-1]&.end_with?(expected) } + end + + def test_alt_c_command + set_var('FZF_ALT_C_COMMAND', 'echo /tmp') + + tmux.prepare + tmux.send_keys 'cd /', :Enter + + tmux.prepare + tmux.send_keys :Escape, :c + tmux.until { |lines| assert_equal 1, lines.item_count } + tmux.send_keys :Enter + + tmux.prepare + tmux.send_keys :pwd, :Enter + tmux.until { |lines| assert_equal '/tmp', lines[-1] } + end + + def test_ctrl_r + tmux.prepare + tmux.send_keys 'echo 1st', :Enter + tmux.prepare + tmux.send_keys 'echo 2nd', :Enter + tmux.prepare + tmux.send_keys 'echo 3d', :Enter + tmux.prepare + 3.times do + tmux.send_keys 'echo 3rd', :Enter + tmux.prepare + end + tmux.send_keys 'echo 4th', :Enter + tmux.prepare + tmux.send_keys 'C-r' + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys 'e3d' + # Duplicates removed: 3d (1) + 3rd (1) => 2 matches + tmux.until { |lines| assert_equal 2, lines.match_count } + tmux.until { |lines| assert lines[-3]&.end_with?(' echo 3d') } + tmux.send_keys 'C-r' + tmux.until { |lines| assert lines[-3]&.end_with?(' echo 3rd') } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal 'echo 3rd', lines[-1] } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal '3rd', lines[-1] } + end + + def test_ctrl_r_multiline + tmux.send_keys 'echo "foo', :Enter, 'bar"', :Enter + tmux.until { |lines| assert_equal %w[foo bar], lines[-2..-1] } + tmux.prepare + tmux.send_keys 'C-r' + tmux.until { |lines| assert_equal '>', lines[-1] } + tmux.send_keys 'foo bar' + tmux.until { |lines| assert lines[-3]&.end_with?('bar"') } + tmux.send_keys :Enter + tmux.until { |lines| assert lines[-1]&.end_with?('bar"') } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal %w[foo bar], lines[-2..-1] } + end + + def test_ctrl_r_abort + skip("doesn't restore the original line when search is aborted pre Bash 4") if shell == :bash && `#{Shell.bash} --version`[/(?<= version )\d+/].to_i < 4 + %w[foo ' "].each do |query| + tmux.prepare + tmux.send_keys :Enter, query + tmux.until { |lines| assert lines[-1]&.start_with?(query) } + tmux.send_keys 'C-r' + tmux.until { |lines| assert_equal "> #{query}", lines[-1] } + tmux.send_keys 'C-g' + tmux.until { |lines| assert lines[-1]&.start_with?(query) } + end + end +end + +module CompletionTest + def test_file_completion + FileUtils.mkdir_p('/tmp/fzf-test') + FileUtils.mkdir_p('/tmp/fzf test') + (1..100).each { |i| FileUtils.touch("/tmp/fzf-test/#{i}") } + ['no~such~user', '/tmp/fzf test/foobar'].each do |f| + FileUtils.touch(File.expand_path(f)) + end + tmux.prepare + tmux.send_keys 'cat /tmp/fzf-test/10**', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys ' !d' + tmux.until { |lines| assert_equal 2, lines.match_count } + tmux.send_keys :Tab, :Tab + tmux.until { |lines| assert_equal 2, lines.select_count } + tmux.send_keys :Enter + tmux.until(true) do |lines| + assert_equal 'cat /tmp/fzf-test/10 /tmp/fzf-test/100', lines[-1] + end + + # ~USERNAME** + user = `whoami`.chomp + tmux.send_keys 'C-u' + tmux.send_keys "cat ~#{user}**", :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys "/#{user}" + tmux.until { |lines| assert(lines.any? { |l| l.end_with?("/#{user}") }) } + tmux.send_keys :Enter + tmux.until(true) do |lines| + assert_match %r{cat .*/#{user}}, lines[-1] + end + + # ~INVALID_USERNAME** + tmux.send_keys 'C-u' + tmux.send_keys 'cat ~such**', :Tab + tmux.until(true) { |lines| assert lines.any_include?('no~such~user') } + tmux.send_keys :Enter + tmux.until(true) { |lines| assert_equal 'cat no~such~user', lines[-1] } + + # /tmp/fzf\ test** + tmux.send_keys 'C-u' + tmux.send_keys 'cat /tmp/fzf\ test/**', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys 'foobar$' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + tmux.until(true) { |lines| assert_equal 'cat /tmp/fzf\ test/foobar', lines[-1] } + + # Should include hidden files + (1..100).each { |i| FileUtils.touch("/tmp/fzf-test/.hidden-#{i}") } + tmux.send_keys 'C-u' + tmux.send_keys 'cat /tmp/fzf-test/hidden**', :Tab + tmux.until(true) do |lines| + assert_equal 100, lines.match_count + assert lines.any_include?('/tmp/fzf-test/.hidden-') + end + tmux.send_keys :Enter + ensure + ['/tmp/fzf-test', '/tmp/fzf test', '~/.fzf-home', 'no~such~user'].each do |f| + FileUtils.rm_rf(File.expand_path(f)) + end + end + + def test_file_completion_root + tmux.send_keys 'ls /**', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys :Enter + end + + def test_dir_completion + (1..100).each do |idx| + FileUtils.mkdir_p("/tmp/fzf-test/d#{idx}") + end + FileUtils.touch('/tmp/fzf-test/d55/xxx') + tmux.prepare + tmux.send_keys 'cd /tmp/fzf-test/**', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys :Tab, :Tab # Tab does not work here + tmux.send_keys 55 + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + tmux.until(true) { |lines| assert_equal 'cd /tmp/fzf-test/d55/', lines[-1] } + tmux.send_keys :xx + tmux.until { |lines| assert_equal 'cd /tmp/fzf-test/d55/xx', lines[-1] } + + # Should not match regular files (bash-only) + if instance_of?(TestBash) + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 'cd /tmp/fzf-test/d55/xx', lines[-1] } + end + + # Fail back to plusdirs + tmux.send_keys :BSpace, :BSpace, :BSpace + tmux.until { |lines| assert_equal 'cd /tmp/fzf-test/d55', lines[-1] } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 'cd /tmp/fzf-test/d55/', lines[-1] } + end + + def test_process_completion + tmux.send_keys 'sleep 12345 &', :Enter + lines = tmux.until { |lines| assert lines[-1]&.start_with?('[1] ') } + pid = lines[-1]&.split&.last + tmux.prepare + tmux.send_keys 'C-L' + tmux.send_keys 'kill ', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys 'sleep12345' + tmux.until { |lines| assert lines.any_include?('sleep 12345') } + tmux.send_keys :Enter + tmux.until(true) { |lines| assert_equal "kill #{pid}", lines[-1] } + ensure + if pid + begin + Process.kill('KILL', pid.to_i) + rescue StandardError + nil + end + end + end + + def test_custom_completion + tmux.send_keys '_fzf_compgen_path() { echo "$1"; seq 10; }', :Enter + tmux.prepare + tmux.send_keys 'ls /tmp/**', :Tab + tmux.until { |lines| assert_equal 11, lines.match_count } + tmux.send_keys :Tab, :Tab, :Tab + tmux.until { |lines| assert_equal 3, lines.select_count } + tmux.send_keys :Enter + tmux.until(true) { |lines| assert_equal 'ls /tmp 1 2', lines[-1] } + end + + def test_unset_completion + tmux.send_keys 'export FZFFOOBAR=BAZ', :Enter + tmux.prepare + + # Using tmux + tmux.send_keys 'unset FZFFOOBR**', :Tab + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal 'unset FZFFOOBAR', lines[-1] } + tmux.send_keys 'C-c' + + # FZF_TMUX=1 + new_shell + tmux.focus + tmux.send_keys 'unset FZFFOOBR**', :Tab + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal 'unset FZFFOOBAR', lines[-1] } + end + + def test_file_completion_unicode + FileUtils.mkdir_p('/tmp/fzf-test') + tmux.paste "cd /tmp/fzf-test; echo test3 > $'fzf-unicode \\355\\205\\214\\354\\212\\244\\355\\212\\2701'; echo test4 > $'fzf-unicode \\355\\205\\214\\354\\212\\244\\355\\212\\2702'" + tmux.prepare + tmux.send_keys 'cat fzf-unicode**', :Tab + tmux.until { |lines| assert_equal 2, lines.match_count } + + tmux.send_keys '1' + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 1, lines.select_count } + + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal 2, lines.match_count } + + tmux.send_keys '2' + tmux.until { |lines| assert_equal 1, lines.select_count } + tmux.send_keys :Tab + tmux.until { |lines| assert_equal 2, lines.select_count } + + tmux.send_keys :Enter + tmux.until(true) { |lines| assert_match(/cat .*fzf-unicode.*1.* .*fzf-unicode.*2/, lines[-1]) } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal %w[test3 test4], lines[-2..-1] } + end + + def test_custom_completion_api + tmux.send_keys 'eval "_fzf$(declare -f _comprun)"', :Enter + %w[f g].each do |command| + tmux.prepare + tmux.send_keys "#{command} b**", :Tab + tmux.until do |lines| + assert_equal 2, lines.item_count + assert_equal 1, lines.match_count + assert lines.any_include?("prompt-#{command}") + assert lines.any_include?("preview-#{command}-bar") + end + tmux.send_keys :Enter + tmux.until { |lines| assert_equal "#{command} #{command}barbar", lines[-1] } + tmux.send_keys 'C-u' + end + ensure + tmux.prepare + tmux.send_keys 'unset -f _fzf_comprun', :Enter + end +end + +class TestBash < TestBase + include TestShell + include CompletionTest + + def shell + :bash + end + + def new_shell + tmux.prepare + tmux.send_keys "FZF_TMUX=1 #{Shell.bash}", :Enter + tmux.prepare + end + + def test_dynamic_completion_loader + tmux.paste 'touch /tmp/foo; _fzf_completion_loader=1' + tmux.paste '_completion_loader() { complete -o default fake; }' + tmux.paste 'complete -F _fzf_path_completion -o default -o bashdefault fake' + tmux.send_keys 'fake /tmp/foo**', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + tmux.send_keys 'C-c' + + tmux.prepare + tmux.send_keys 'fake /tmp/foo' + tmux.send_keys :Tab, 'C-u' + + tmux.prepare + tmux.send_keys 'fake /tmp/foo**', :Tab + tmux.until { |lines| assert_operator lines.match_count, :>, 0 } + end +end + +class TestZsh < TestBase + include TestShell + include CompletionTest + + def shell + :zsh + end + + def new_shell + tmux.send_keys "FZF_TMUX=1 #{Shell.zsh}", :Enter + tmux.prepare + end + + def test_complete_quoted_command + tmux.send_keys 'export FZFFOOBAR=BAZ', :Enter + ['unset', '\unset', "'unset'"].each do |command| + tmux.prepare + tmux.send_keys "#{command} FZFFOOBR**", :Tab + tmux.until { |lines| assert_equal 1, lines.match_count } + tmux.send_keys :Enter + tmux.until { |lines| assert_equal "#{command} FZFFOOBAR", lines[-1] } + tmux.send_keys 'C-c' + end + end +end + +class TestFish < TestBase + include TestShell + + def shell + :fish + end + + def new_shell + tmux.send_keys 'env FZF_TMUX=1 fish', :Enter + tmux.send_keys 'function fish_prompt; end; clear', :Enter + tmux.until { |lines| assert_empty lines } + end + + def set_var(name, val) + tmux.prepare + tmux.send_keys "set -g #{name} '#{val}'", :Enter + tmux.prepare + end +end + +__END__ +PS1= PROMPT_COMMAND= HISTFILE= HISTSIZE=100 +unset <%= UNSETS.join(' ') %> +unset $(env | sed -n /^_fzf_orig/s/=.*//p) +unset $(declare -F | sed -n "/_fzf/s/.*-f //p") + +# Setup fzf +# --------- +if [[ ! "$PATH" == *<%= BASE %>/bin* ]]; then + export PATH="${PATH:+${PATH}:}<%= BASE %>/bin" +fi + +# Auto-completion +# --------------- +[[ $- == *i* ]] && source "<%= BASE %>/shell/completion.<%= __method__ %>" 2> /dev/null + +# Key bindings +# ------------ +source "<%= BASE %>/shell/key-bindings.<%= __method__ %>" + +# Old API +_fzf_complete_f() { + _fzf_complete "+m --multi --prompt \"prompt-f> \"" "$@" < <( + echo foo + echo bar + ) +} + +# New API +_fzf_complete_g() { + _fzf_complete +m --multi --prompt "prompt-g> " -- "$@" < <( + echo foo + echo bar + ) +} + +_fzf_complete_f_post() { + awk '{print "f" $0 $0}' +} + +_fzf_complete_g_post() { + awk '{print "g" $0 $0}' +} + +[ -n "$BASH" ] && complete -F _fzf_complete_f -o default -o bashdefault f +[ -n "$BASH" ] && complete -F _fzf_complete_g -o default -o bashdefault g + +_comprun() { + local command=$1 + shift + + case "$command" in + f) fzf "$@" --preview 'echo preview-f-{}' ;; + g) fzf "$@" --preview 'echo preview-g-{}' ;; + *) fzf "$@" ;; + esac +} diff --git a/.fzf/uninstall b/.fzf/uninstall new file mode 100755 index 0000000..094d689 --- /dev/null +++ b/.fzf/uninstall @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +xdg=0 +prefix='~/.fzf' +prefix_expand=~/.fzf +fish_dir=${XDG_CONFIG_HOME:-$HOME/.config}/fish + +help() { + cat << EOF +usage: $0 [OPTIONS] + + --help Show this message + --xdg Remove files generated under \$XDG_CONFIG_HOME/fzf +EOF +} + +for opt in "$@"; do + case $opt in + --help) + help + exit 0 + ;; + --xdg) + xdg=1 + prefix='"${XDG_CONFIG_HOME:-$HOME/.config}"/fzf/fzf' + prefix_expand=${XDG_CONFIG_HOME:-$HOME/.config}/fzf/fzf + ;; + *) + echo "unknown option: $opt" + help + exit 1 + ;; + esac +done + +ask() { + while true; do + read -p "$1 ([y]/n) " -r + REPLY=${REPLY:-"y"} + if [[ $REPLY =~ ^[Yy]$ ]]; then + return 0 + elif [[ $REPLY =~ ^[Nn]$ ]]; then + return 1 + fi + done +} + +remove() { + echo "Remove $1" + rm -f "$1" +} + +remove_line() { + src=$(readlink "$1") + if [ $? -eq 0 ]; then + echo "Remove from $1 ($src):" + else + src=$1 + echo "Remove from $1:" + fi + + shift + line_no=1 + match=0 + while [ -n "$1" ]; do + line=$(sed -n "$line_no,\$p" "$src" | \grep -m1 -nF "$1") + if [ $? -ne 0 ]; then + shift + line_no=1 + continue + fi + line_no=$(( $(sed 's/:.*//' <<< "$line") + line_no - 1 )) + content=$(sed 's/^[0-9]*://' <<< "$line") + match=1 + echo " - Line #$line_no: $content" + [ "$content" = "$1" ] || ask " - Remove?" + if [ $? -eq 0 ]; then + awk -v n=$line_no 'NR == n {next} {print}' "$src" > "$src.bak" && + mv "$src.bak" "$src" || break + echo " - Removed" + else + echo " - Skipped" + line_no=$(( line_no + 1 )) + fi + done + [ $match -eq 0 ] && echo " - Nothing found" + echo +} + +for shell in bash zsh; do + shell_config=${prefix_expand}.${shell} + remove "${shell_config}" + remove_line ~/.${shell}rc \ + "[ -f ${prefix}.${shell} ] && source ${prefix}.${shell}" \ + "source ${prefix}.${shell}" +done + +bind_file="${fish_dir}/functions/fish_user_key_bindings.fish" +if [ -f "$bind_file" ]; then + remove_line "$bind_file" "fzf_key_bindings" +fi + +if [ -d "${fish_dir}/functions" ]; then + remove "${fish_dir}/functions/fzf.fish" + remove "${fish_dir}/functions/fzf_key_bindings.fish" + + if [ -z "$(ls -A "${fish_dir}/functions")" ]; then + rmdir "${fish_dir}/functions" + else + echo "Can't delete non-empty directory: \"${fish_dir}/functions\"" + fi +fi + +config_dir=$(dirname "$prefix_expand") +if [[ "$xdg" = 1 ]] && [[ "$config_dir" = */fzf ]] && [[ -d "$config_dir" ]]; then + rmdir "$config_dir" +fi diff --git a/.vim/colors/challenger-deep b/.vim/colors/challenger-deep deleted file mode 160000 index 56e87bb..0000000 --- a/.vim/colors/challenger-deep +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 56e87bbc83caf66b4c7326eb27890a79cc66bc52 diff --git a/.vim/colors/challenger-deep/LICENSE b/.vim/colors/challenger-deep/LICENSE new file mode 100755 index 0000000..6f354e0 --- /dev/null +++ b/.vim/colors/challenger-deep/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 MaxSt + +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. diff --git a/.vim/colors/challenger-deep/README.md b/.vim/colors/challenger-deep/README.md new file mode 100755 index 0000000..9512971 --- /dev/null +++ b/.vim/colors/challenger-deep/README.md @@ -0,0 +1,109 @@ +![Challenger Deep](https://challenger-deep-theme.github.io/images/logo.png) + +### [Challenger Deep Theme](https://challenger-deep-theme.github.io/) for VIM + +To enable this color scheme, set it in your vimrc: +``` +colorscheme challenger_deep +``` + +### Terminal True Color Support ### + Add this to your .vimrc to enable true colors: +``` +if has('nvim') || has('termguicolors') + set termguicolors +endif +``` + +### Installation + +#### vim-plug ### +``` +Plug 'challenger-deep-theme/vim', { 'as': 'challenger-deep' } +``` +#### vundle ### +``` +Plugin 'challenger-deep-theme/vim', {'name': 'challenger-deep-theme'} +``` + +### Screenshot ### + +![Screenshot](https://challenger-deep-theme.github.io/images/screenshots/vim.png) + +### Options ### + * **g:challenger_deep_termcolors** + This options sets the terminal colors to 16 or 256 Colors. Default value is 256. + If it is set to 16 ,this colorscheme will attempt to use the standard 16 colors of your terminal emulator and background color will be the default background color of your terminal emulator. + For the best colors in terminal, its recommended to set set your terminalcolors to [Challenger Deep Terminal Colors](#challenger-deep-terminal-colors) and use 16 colors. + + +### Challenger Deep Terminal Colors ### +``` +! ~/.Xresource +*.foreground: #cbe3e7 +*.background: #1e1c31 +*.cursorColor: #fbfcfc + +! black +*.color0: #565575 +*.color8: #100e23 + +! red +*.color1: #ff8080 +*.color9: #ff5458 + +! green +*.color2: #95ffa4 +*.color10: #62d196 + +! yellow +*.color3: #ffe9aa +*.color11: #ffb378 + +! blue +*.color4: #91ddff +*.color12: #65b2ff + +! magenta +*.color5: #c991e1 +*.color13: #906cff + +! cyan +*.color6: #aaffe4 +*.color14: #63f2f1 + +! white +*.color7: #cbe3e7 +*.color15: #a6b3cc +``` + +### Lightline Theme ### + +![Lightline](https://challenger-deep-theme.github.io/images/screenshots/vim-lightline.png) + +Challenger Deep supports [lightline.vim](https://github.com/itchyny/lightline.vim). To enable the colorscheme, +add one of the following lines to your `.vimrc`: + +``` viml +let g:lightline = { 'colorscheme': 'challenger_deep'} +``` + +### Lualine Theme ### + +Challenger Deep also supports [lualine.vim](https://github.com/nvim-lualine/lualine.nvim). To enable the colorscheme, +add the following lines to your `init.lua`: + +```lua +require'lualine'.setup { + options = { theme = 'challenger_deep' } +} +``` + +### Troubleshooting ### + If you are running vim inside tmux with the alacritty terminal, make sure to set `default-terminal` to `xterm-256color` in your tmux config (see [this issue](https://github.com/challenger-deep-theme/vim/issues/18) for more details: + +```text +# ... +set-option -g default-terminal "xterm-256color" +# ... +``` diff --git a/.vim/colors/challenger-deep/autoload/airline/themes/challenger_deep.vim b/.vim/colors/challenger-deep/autoload/airline/themes/challenger_deep.vim new file mode 100755 index 0000000..71d84e9 --- /dev/null +++ b/.vim/colors/challenger-deep/autoload/airline/themes/challenger_deep.vim @@ -0,0 +1,116 @@ +" Colors +let s:black = { "gui": "#212121", "cterm": "0", "cterm16" : "0" } +let s:medium_gray = { "gui": "#767676", "cterm": "243", "cterm16" : "243" } +let s:white = { "gui": "#F3F3F3", "cterm": "15", "cterm16" : "15" } +let s:actual_white = { "gui": "#FFFFFF", "cterm": "231", "cterm16" : "231" } +let s:light_black = { "gui": "#424242", "cterm": "8", "cterm16" : "8" } +let s:lighter_black = { "gui": "#545454", "cterm": "240", "cterm16" : "240" } + +" lighter shadows and darker grays +let s:subtle_black = { "gui": "#303030", "cterm": "236", "cterm16" : "236" } +let s:light_gray = { "gui": "#B2B2B2", "cterm": "249", "cterm16" : "249" } +let s:lighter_gray = { "gui": "#C6C6C6", "cterm": "251", "cterm16" : "251" } + +" flat colors: +let s:asphalt = { "gui": "#1e1c31", "cterm": "233", "cterm16": "NONE"} +let s:asphalt_subtle= { "gui": "#100E23", "cterm": "232", "cterm16": "8"} +let s:dark_asphalt = { "gui": "#565575", "cterm": "236", "cterm16": "0"} + +let s:red = { "gui": "#ff8080", "cterm": "204", "cterm16": "1"} +let s:dark_red = { "gui": "#ff5458", "cterm": "203", "cterm16": "9"} + +let s:green = { "gui": "#95ffa4", "cterm": "120", "cterm16": "2"} +let s:dark_green = { "gui": "#62d196", "cterm": "119", "cterm16": "10"} + +let s:yellow = { "gui": "#ffe9aa", "cterm": "228", "cterm16": "3"} +let s:dark_yellow = { "gui": "#ffb378", "cterm": "215", "cterm16": "11"} + +let s:blue = { "gui": "#91ddff", "cterm": "159", "cterm16": "4"} +let s:dark_blue = { "gui": "#65b2ff", "cterm": "75", "cterm16": "12"} + +let s:purple = { "gui": "#c991e1", "cterm": "141", "cterm16": "5"} +let s:dark_purple = { "gui": "#906cff", "cterm": "135", "cterm16": "13"} + +let s:cyan = { "gui": "#aaffe4", "cterm": "122", "cterm16": "6"} +let s:dark_cyan = { "gui": "#63f2f1", "cterm": "121", "cterm16": "14"} + +let s:clouds = { "gui": "#cbe3e7", "cterm": "253", "cterm16": "7"} +let s:dark_clouds = { "gui": "#a6b3cc", "cterm": "252", "cterm16": "15"} + +let s:bg = s:asphalt +let s:bg_subtle = s:asphalt_subtle +let s:bg_dark = s:dark_asphalt +let s:norm = s:clouds +let s:norm_subtle = s:dark_clouds +let s:visual = s:bg_dark +let g:airline#themes#challenger_deep#palette = {} + +let s:N1 = [ s:bg_subtle.gui, s:cyan.gui, s:bg_subtle.cterm16, s:cyan.cterm16 ] +let s:N2 = [ s:bg_subtle.gui, s:dark_cyan.gui, s:bg_subtle.cterm16, s:dark_cyan.cterm16 ] +let s:N3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + +let g:airline#themes#challenger_deep#palette.normal_modified = { + \ 'airline_c': [ s:N3[0] , s:N3[1] , s:N3[2] , s:N3[3], '' ] , + \ } + +let s:I1 = [ s:bg_subtle.gui , s:red.gui , s:bg_subtle.cterm16 , s:red.cterm16] +let s:I2 = [ s:bg_subtle.gui , s:dark_red.gui , s:bg_subtle.cterm16 , s:dark_red.cterm16] +let s:I3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) +let g:airline#themes#challenger_deep#palette.insert_modified = { + \ 'airline_c': [ s:white.gui , s:bg_subtle.gui , s:white.cterm16, s:bg_subtle.cterm16 , '' ] , + \ } +let g:airline#themes#challenger_deep#palette.insert_paste = { + \ 'airline_a': [ s:I1[0] , s:yellow.gui , s:I1[2] , s:yellow.cterm16 , '' ] , + \ } + + +let g:airline#themes#challenger_deep#palette.replace = copy(g:airline#themes#challenger_deep#palette.insert) +let g:airline#themes#challenger_deep#palette.replace.airline_a = [ s:I2[0] , s:yellow.gui , s:I2[2] , s:yellow.cterm16 , '' ] +let g:airline#themes#challenger_deep#palette.replace_modified = g:airline#themes#challenger_deep#palette.insert_modified + + +let s:V1 = [ s:bg_subtle.gui , s:yellow.gui , s:bg_subtle.cterm16 , s:yellow.cterm16] +let s:V2 = [ s:bg_subtle.gui , s:dark_yellow.gui , s:bg_subtle.cterm16 , s:dark_yellow.cterm16] +let s:V3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) +let g:airline#themes#challenger_deep#palette.visual_modified = { + \ 'airline_c': [ s:V3[0] , s:V3[1] , s:V3[2] , s:V3[3], '' ] , + \ } + +let s:IA1 = [ s:bg_subtle.gui , s:purple.gui , s:bg_subtle.cterm16 , s:purple.cterm16] +let s:IA2 = [ s:bg_subtle.gui , s:dark_purple.gui , s:bg_subtle.cterm16 , s:dark_purple.cterm16] +let s:IA3 = [ s:white.gui, s:bg_subtle.gui, s:white.cterm16, s:bg_subtle.cterm16 ] +let g:airline#themes#challenger_deep#palette.inactive = airline#themes#generate_color_map(s:IA1, s:IA2, s:IA3) +let g:airline#themes#challenger_deep#palette.inactive_modified = { + \ 'airline_c': [ s:IA3[0] , s:IA3[1] , s:IA3[2] , s:IA3[3], '' ] , + \ } + + +let s:WI = [ s:yellow.gui, s:dark_red.gui, s:yellow.cterm16, s:dark_red.cterm16 ] +let g:airline#themes#challenger_deep#palette.normal.airline_warning = [ + \ s:WI[0], s:WI[1], s:WI[2], s:WI[3] + \ ] + +let g:airline#themes#challenger_deep#palette.normal_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.insert.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.insert_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.visual.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.visual_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.replace.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + +let g:airline#themes#challenger_deep#palette.replace_modified.airline_warning = + \ g:airline#themes#challenger_deep#palette.normal.airline_warning + diff --git a/.vim/colors/challenger-deep/autoload/lightline/colorscheme/challenger_deep.vim b/.vim/colors/challenger-deep/autoload/lightline/colorscheme/challenger_deep.vim new file mode 100755 index 0000000..88385ff --- /dev/null +++ b/.vim/colors/challenger-deep/autoload/lightline/colorscheme/challenger_deep.vim @@ -0,0 +1,114 @@ +" Colors +let s:black = { "gui": "#212121", "cterm": "0", "cterm16" : "0" } +let s:medium_gray = { "gui": "#767676", "cterm": "243", "cterm16" : "243" } +let s:white = { "gui": "#F3F3F3", "cterm": "15", "cterm16" : "15" } +let s:actual_white = { "gui": "#FFFFFF", "cterm": "231", "cterm16" : "231" } +let s:light_black = { "gui": "#424242", "cterm": "8", "cterm16" : "8" } +let s:lighter_black = { "gui": "#545454", "cterm": "240", "cterm16" : "240" } + +" lighter shadows and darker grays +let s:subtle_black = { "gui": "#303030", "cterm": "236", "cterm16" : "236" } +let s:light_gray = { "gui": "#B2B2B2", "cterm": "249", "cterm16" : "249" } +let s:lighter_gray = { "gui": "#C6C6C6", "cterm": "251", "cterm16" : "251" } + +" challenger deep colors: +let s:asphalt = { "gui": "#1e1c31", "cterm": "233", "cterm16": "NONE"} +let s:asphalt_subtle= { "gui": "#100E23", "cterm": "232", "cterm16": "8"} +let s:dark_asphalt = { "gui": "#565575", "cterm": "236", "cterm16": "0"} + +let s:red = { "gui": "#ff8080", "cterm": "204", "cterm16": "1"} +let s:dark_red = { "gui": "#ff5458", "cterm": "203", "cterm16": "9"} + +let s:green = { "gui": "#95ffa4", "cterm": "120", "cterm16": "2"} +let s:dark_green = { "gui": "#62d196", "cterm": "119", "cterm16": "10"} + +let s:yellow = { "gui": "#ffe9aa", "cterm": "228", "cterm16": "3"} +let s:dark_yellow = { "gui": "#ffb378", "cterm": "215", "cterm16": "11"} + +let s:blue = { "gui": "#91ddff", "cterm": "159", "cterm16": "4"} +let s:dark_blue = { "gui": "#65b2ff", "cterm": "75", "cterm16": "12"} + +let s:purple = { "gui": "#c991e1", "cterm": "141", "cterm16": "5"} +let s:dark_purple = { "gui": "#906cff", "cterm": "135", "cterm16": "13"} + +let s:cyan = { "gui": "#aaffe4", "cterm": "122", "cterm16": "6"} +let s:dark_cyan = { "gui": "#63f2f1", "cterm": "121", "cterm16": "14"} + +let s:clouds = { "gui": "#cbe3e7", "cterm": "253", "cterm16": "7"} +let s:dark_clouds = { "gui": "#a6b3cc", "cterm": "252", "cterm16": "15"} + +let s:bg = s:asphalt +let s:bg_subtle = s:asphalt_subtle +let s:bg_dark = s:dark_asphalt +let s:norm = s:clouds +let s:norm_subtle = s:dark_clouds +let s:visual = s:bg_dark + +" lightline challenger deep colors: +let s:lfc = { + \'black': [ s:black.gui, s:black.cterm16], + \'medium_gray': [ s:medium_gray.gui, s:medium_gray.cterm16], + \'white': [ s:white.gui, s:white.cterm16], + \'actual_white': [ s:actual_white.gui, s:actual_white.cterm16 ], + \'light_black': [s:light_black.gui, s:light_black.cterm16], + \'lighter_black': [ s:lighter_black.gui, s:lighter_black.cterm16], + \'subtle_black': [ s:subtle_black.gui, s:subtle_black.cterm16], + \'light_gray': [ s:light_gray.gui, s:light_gray.cterm16], + \'lighter_gray': [ s:lighter_gray.gui, s:lighter_gray.cterm16], + \'asphalt': [s:asphalt.gui, s:asphalt.cterm16], + \'asphalt_subtle': [s:asphalt_subtle.gui, s:asphalt_subtle.cterm16], + \'dark_asphalt' : [s:dark_asphalt.gui, s:dark_asphalt.cterm16], + \'red' : [s:red.gui, s:red.cterm16], + \'dark_red' : [s:dark_red.gui, s:dark_red.cterm16], + \'green' : [s:green.gui, s:green.cterm16], + \'dark_green' : [s:dark_green.gui, s:dark_green.cterm16], + \'yellow' : [s:yellow.gui, s:yellow.cterm16], + \'dark_yellow' : [s:dark_yellow.gui, s:dark_yellow.cterm16], + \'blue' : [s:blue.gui, s:blue.cterm16], + \'dark_blue' : [s:dark_blue.gui, s:dark_blue.cterm16], + \'purple' : [s:purple.gui, s:purple.cterm16], + \'dark_purple' : [s:dark_purple.gui, s:dark_purple.cterm16], + \'cyan' : [s:cyan.gui, s:cyan.cterm16], + \'dark_cyan' : [s:dark_cyan.gui, s:dark_cyan.cterm16], + \'clouds' : [s:clouds.gui, s:clouds.cterm16], + \'dark_clouds' : [s:dark_clouds.gui, s:dark_clouds.cterm16], + \'bg': [s:bg.gui, s:bg.cterm16], + \'bg_subtle': [s:bg_subtle.gui, s:bg_subtle.cterm16], + \'bg_dark': [s:bg_dark.gui, s:bg_dark.cterm16], + \'norm': [s:norm.gui, s:norm.cterm16], + \'norm_subtle': [s:norm_subtle.gui, s:norm_subtle.cterm16], + \} + +let s:p = { 'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {} } + +" Tabline +let s:p.tabline.left = [ [ s:lfc.white, s:lfc.bg_subtle ] ] +let s:p.tabline.tabsel = [ [ s:lfc.bg_subtle, s:lfc.blue ] ] +let s:p.tabline.middle = [ [ s:lfc.white, s:lfc.bg_subtle ] ] +let s:p.tabline.right = [ [ s:lfc.bg_subtle, s:lfc.red ] ] + +" Normal mode +let s:p.normal.left = [ [ s:lfc.bg_subtle, s:lfc.cyan ], [ s:lfc.bg_subtle, s:lfc.dark_cyan ] ] +let s:p.normal.middle = [ [ s:lfc.white, s:lfc.bg_subtle ] ] +let s:p.normal.right = [ [ s:lfc.bg_subtle, s:lfc.cyan ], [ s:lfc.bg_subtle, s:lfc.dark_cyan ] ] +let s:p.normal.error = [ [ s:lfc.red, s:lfc.bg_subtle ] ] +let s:p.normal.warning = [ [ s:lfc.yellow, s:lfc.bg_subtle ] ] + +" Visual mode +let s:p.visual.left = [ [ s:lfc.bg_subtle, s:lfc.yellow ], [ s:lfc.bg_subtle, s:lfc.dark_yellow ] ] +let s:p.visual.right = [ [ s:lfc.bg_subtle, s:lfc.yellow ], [ s:lfc.bg_subtle, s:lfc.dark_yellow ] ] + +" Replace mode +let s:p.replace.left = [ [ s:lfc.bg_subtle, s:lfc.green ], [ s:lfc.bg_subtle, s:lfc.dark_green ] ] +let s:p.replace.right = [ [ s:lfc.bg_subtle, s:lfc.green ], [ s:lfc.bg_subtle, s:lfc.dark_green ] ] + +" Insert mode +let s:p.insert.left = [ [ s:lfc.bg_subtle, s:lfc.red ], [ s:lfc.bg_subtle, s:lfc.dark_red ] ] +let s:p.insert.right = [ [ s:lfc.bg_subtle, s:lfc.red ], [ s:lfc.bg_subtle, s:lfc.dark_red ] ] + +" Inactive split +let s:p.inactive.left = [ [ s:lfc.dark_asphalt, s:lfc.bg_subtle ], [ s:lfc.dark_asphalt, s:lfc.bg_subtle ] ] +let s:p.inactive.middle = [ [ s:lfc.dark_asphalt, s:lfc.bg_subtle ] ] +let s:p.inactive.right = [ [ s:lfc.dark_asphalt, s:lfc.bg_subtle ], [ s:lfc.dark_asphalt, s:lfc.bg_subtle ] ] + +let g:lightline#colorscheme#challenger_deep#palette = lightline#colorscheme#flatten(s:p) diff --git a/.vim/colors/challenger-deep/colors/challenger_deep.vim b/.vim/colors/challenger-deep/colors/challenger_deep.vim new file mode 100755 index 0000000..720dfe4 --- /dev/null +++ b/.vim/colors/challenger-deep/colors/challenger_deep.vim @@ -0,0 +1,338 @@ +" Vim Color File +" Name: challenger_deep.vim +" Version: 2.0 +" Maintainer: github.com/MaxSt +" License: The MIT License (MIT) +" Based On: pencil by github.com/reedes and github.com/mattly + +hi clear + +if exists('syntax on') + syntax reset +endif + +let g:colors_name='challenger_deep' +set background=dark + + +if ! exists("g:challenger_deep_termcolors") + let g:challenger_deep_termcolors = 256 +endif + +" not all terminals support italics properly. If yours does, opt-in. +if ! exists("g:challenger_deep_terminal_italics") + let g:challenger_deep_terminal_italics = 0 +endif + +" Colors +let s:black = { "gui": "#212121", "cterm": "0", "cterm16" : "8" } +let s:medium_gray = { "gui": "#767676", "cterm": "243", "cterm16" : "243" } +let s:white = { "gui": "#F3F3F3", "cterm": "15", "cterm16" : "15" } +let s:actual_white = { "gui": "#FFFFFF", "cterm": "231", "cterm16" : "231" } +let s:light_black = { "gui": "#424242", "cterm": "8", "cterm16" : "0" } +let s:lighter_black = { "gui": "#545454", "cterm": "240", "cterm16" : "240" } + +" lighter shadows and darker grays +let s:subtle_black = { "gui": "#303030", "cterm": "236", "cterm16" : "236" } +let s:light_gray = { "gui": "#B2B2B2", "cterm": "249", "cterm16" : "249" } +let s:lighter_gray = { "gui": "#C6C6C6", "cterm": "251", "cterm16" : "251" } + +" flat colors: +let s:asphalt = { "gui": "#1e1c31", "cterm": "233", "cterm16": "NONE"} +let s:asphalt_subtle= { "gui": "#100E23", "cterm": "232", "cterm16": "0"} +let s:dark_asphalt = { "gui": "#565575", "cterm": "236", "cterm16": "8"} + +let s:red = { "gui": "#ff8080", "cterm": "204", "cterm16": "1"} +let s:dark_red = { "gui": "#ff5458", "cterm": "203", "cterm16": "9"} + +let s:green = { "gui": "#95ffa4", "cterm": "120", "cterm16": "2"} +let s:dark_green = { "gui": "#62d196", "cterm": "119", "cterm16": "10"} + +let s:yellow = { "gui": "#ffe9aa", "cterm": "228", "cterm16": "3"} +let s:dark_yellow = { "gui": "#ffb378", "cterm": "215", "cterm16": "11"} + +let s:blue = { "gui": "#91ddff", "cterm": "159", "cterm16": "4"} +let s:dark_blue = { "gui": "#65b2ff", "cterm": "75", "cterm16": "12"} + +let s:purple = { "gui": "#c991e1", "cterm": "141", "cterm16": "5"} +let s:dark_purple = { "gui": "#906cff", "cterm": "135", "cterm16": "13"} + +let s:cyan = { "gui": "#aaffe4", "cterm": "122", "cterm16": "6"} +let s:dark_cyan = { "gui": "#63f2f1", "cterm": "121", "cterm16": "14"} + +let s:clouds = { "gui": "#cbe3e7", "cterm": "253", "cterm16": "7"} +let s:dark_clouds = { "gui": "#a6b3cc", "cterm": "252", "cterm16": "15"} + +let s:bg = s:asphalt +let s:bg_subtle = s:asphalt_subtle +let s:bg_dark = s:dark_asphalt +let s:norm = s:clouds +let s:norm_subtle = s:dark_clouds +let s:visual = s:bg_dark + +let s:head_a = s:dark_blue +let s:head_b = s:blue +let s:head_c = s:dark_cyan + +" shamelessly stolen from hemisu: https://github.com/noahfrederick/vim-hemisu/ +function! s:h(group, style) + " Not all terminals support italics properly. If yours does, opt-in. + if g:challenger_deep_terminal_italics == 0 && has_key(a:style, "cterm") && a:style["cterm"] == "italic" + unlet a:style.cterm + endif + if g:challenger_deep_termcolors == 16 + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm16 : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm16 : "NONE") + else + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm : "NONE") + end + execute "highlight" a:group + \ "guifg=" (has_key(a:style, "fg") ? a:style.fg.gui : "NONE") + \ "guibg=" (has_key(a:style, "bg") ? a:style.bg.gui : "NONE") + \ "guisp=" (has_key(a:style, "sp") ? a:style.sp.gui : "NONE") + \ "gui=" (has_key(a:style, "gui") ? a:style.gui : "NONE") + \ "ctermfg=" . l:ctermfg + \ "ctermbg=" . l:ctermbg + \ "cterm=" (has_key(a:style, "cterm") ? a:style.cterm : "NONE") +endfunction + +" common groups ================================================================ +" (see `:h w18`) + +call s:h("Normal", {"bg": s:bg, "fg": s:norm}) +call s:h("Cursor", {"bg": s:blue, "fg": s:bg_dark}) +call s:h("Comment", {"fg": s:medium_gray, "gui": "italic", "cterm": "italic"}) + +call s:h("Constant", {"fg": s:yellow}) +hi! link String Constant +hi! link Character Constant + +call s:h("Number", {"fg": s:dark_yellow}) +hi! link Boolean Constant +hi! link Float Constant + +call s:h("Identifier", {"fg": s:purple}) +hi! link Function Identifier + +call s:h("Label", {"fg": s:dark_blue}) +hi! link Conditonal Statement +hi! link Exception Statement + +call s:h("Operator", {"fg": s:dark_cyan}) +hi! link Repeat Operator + +call s:h("PreProc", {"fg": s:green}) +hi! link Include PreProc +hi! link Define PreProc +hi! link Macro PreProc +hi! link PreCondit PreProc + + +call s:h("Keyword", {"fg": s:red}) +hi! link Statement Keyword + +call s:h("Type", {"fg": s:blue}) +hi! link StorageClass Type +hi! link Structure Type +hi! link Typedef Type + +call s:h("Special", {"fg": s:cyan}) +hi! link SpecialChar Special +hi! link Tag Special +hi! link Delimiter Special +hi! link SpecialComment Special +hi! link Debug Special + +call s:h("Underlined", {"fg": s:norm , "gui": "underline", "cterm": "underline"}) +call s:h("Ignore", {"fg": s:bg }) +call s:h("Error", {"fg": s:dark_red, "bg": s:bg_subtle , "gui": "bold" , "cterm": "bold" }) +call s:h("Todo", {"fg": s:dark_yellow, "bg": s:bg_subtle, "gui": "bold" , "cterm": "bold" }) + +" ui chrome ==================================================================== +" ordered according to `:help hitest.vim` + +call s:h("SpecialKey", {"fg": s:blue}) +call s:h("Boolean", {"fg": s:dark_yellow}) +call s:h("Number", {"fg": s:dark_yellow}) +call s:h("Float", {"fg": s:dark_yellow}) +call s:h("NonText", {"fg": s:bg_dark}) +call s:h("Directory", {"fg": s:purple}) +call s:h("ErrorMsg", {"fg": s:dark_red}) +call s:h("IncSearch", {"bg": s:red, "fg": s:clouds}) +call s:h("Search", {"bg": s:bg_dark}) +call s:h("MoreMsg", {"fg": s:medium_gray, "gui": "bold", "cterm": "bold"}) +hi! link ModeMsg MoreMsg +call s:h("LineNr", {"fg": s:dark_asphalt, "bg": s:bg_subtle}) +call s:h("CursorLineNr", {"bg": s:bg_subtle, "fg": s:blue, "gui": "bold"}) +call s:h("Question", {"fg": s:red}) +call s:h("StatusLine", {"bg": s:bg_dark}) +call s:h("Conceal", {"fg": s:norm}) +call s:h("StatusLineNC", {"bg": s:bg_dark, "fg": s:medium_gray}) +call s:h("VertSplit", {"fg": s:bg_subtle}) +call s:h("Title", {"fg": s:dark_blue}) +call s:h("Visual", {"bg": s:visual}) +call s:h("WarningMsg", {"fg": s:yellow}) +call s:h("WildMenu", {"fg": s:bg_subtle, "bg": s:cyan}) +call s:h("Folded", {"bg": s:purple, "fg": s:bg_subtle}) +call s:h("FoldColumn", {"fg": s:yellow}) +call s:h("DiffAdd", {"fg": s:green}) +call s:h("DiffDelete", {"fg": s:red}) +call s:h("DiffChange", {"fg": s:dark_yellow}) +call s:h("DiffText", {"fg": s:dark_blue}) +call s:h("SignColumn", {"fg": s:green}) + +if has("gui_running") + call s:h("SpellBad", {"gui": "underline", "sp": s:dark_red}) + call s:h("SpellCap", {"gui": "underline", "sp": s:green}) + call s:h("SpellRare", {"gui": "underline", "sp": s:red}) + call s:h("SpellLocal", {"gui": "underline", "sp": s:dark_green}) +else + call s:h("SpellBad", {"cterm": "underline", "fg": s:dark_red}) + call s:h("SpellCap", {"cterm": "underline", "fg": s:green}) + call s:h("SpellRare", {"cterm": "underline", "fg": s:red}) + call s:h("SpellLocal", {"cterm": "underline", "fg": s:dark_green}) +endif +call s:h("Pmenu", {"fg": s:norm, "bg": s:bg_subtle}) +call s:h("PmenuSel", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("PmenuSbar", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("PmenuThumb", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("TabLine", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("TabLineSel", {"fg": s:norm, "bg": s:bg_subtle, "gui": "bold", "cterm": "bold"}) +call s:h("TabLineFill", {"fg": s:norm, "bg": s:bg_dark}) +call s:h("CursorColumn", {"bg": s:bg_subtle}) +call s:h("CursorLine", {"bg": s:bg_subtle}) +call s:h("ColorColumn", {"bg": s:bg_subtle}) + +" remainder of syntax highlighting +call s:h("MatchParen", {"bg": s:bg_subtle, "fg": s:purple, "gui": "bold", "cterm": "bold"}) +call s:h("qfLineNr", {"fg": s:medium_gray}) + +" hi helpHyperTextJump guifg=#5FAFD7 ctermfg=74 + +" HTML syntax +hi! link htmlTag Special +hi! link htmlEndTag htmlTag + +hi! link htmlTagName KeyWord +" html5 tags show up as htmlTagN +hi! link htmlTagN Keyword + +" HTML content +call s:h("htmlH1", {"fg": s:head_a, "gui": "bold,italic", "cterm": "bold" }) +call s:h("htmlH2", {"fg": s:head_a, "gui": "bold" , "cterm": "bold" }) +call s:h("htmlH3", {"fg": s:head_b, "gui": "italic" , "cterm": "italic" }) +call s:h("htmlH4", {"fg": s:head_b, "gui": "italic" , "cterm": "italic" }) +call s:h("htmlH5", {"fg": s:head_c }) +call s:h("htmlH6", {"fg": s:head_c }) +call s:h("htmlLink", {"fg": s:blue , "gui": "underline" , "cterm": "underline"}) +call s:h("htmlItalic", { "gui": "italic" , "cterm": "italic" }) +call s:h("htmlBold", { "gui": "bold" , "cterm": "bold" }) +call s:h("htmlBoldItalic",{ "gui": "bold,italic", "cterm": "bold" }) +" hi htmlString guifg=#87875f guibg=NONE gui=NONE ctermfg=101 ctermbg=NONE cterm=NONE + +" tpope/vim-markdown +call s:h("markdownBlockquote", {"fg": s:norm}) +call s:h("markdownBold", {"fg": s:norm , "gui": "bold" , "cterm": "bold" }) +call s:h("markdownBoldItalic", {"fg": s:norm , "gui": "bold,italic", "cterm": "bold" }) +call s:h("markdownEscape", {"fg": s:norm}) +call s:h("markdownH1", {"fg": s:head_a, "gui": "bold,italic", "cterm": "bold" }) +call s:h("markdownH2", {"fg": s:head_a, "gui": "bold" , "cterm": "bold" }) +call s:h("markdownH3", {"fg": s:head_a, "gui": "italic" , "cterm": "italic"}) +call s:h("markdownH4", {"fg": s:head_a, "gui": "italic" , "cterm": "italic"}) +call s:h("mckarkdownH5", {"fg": s:head_a}) +call s:h("markdownH6", {"fg": s:head_a}) +call s:h("markdownHeadingDelimiter", {"fg": s:norm}) +call s:h("markdownHeadingRule", {"fg": s:norm}) +call s:h("markdownId", {"fg": s:medium_gray}) +call s:h("markdownIdDeclaration", {"fg": s:norm_subtle}) +call s:h("markdownItalic", {"fg": s:norm , "gui": "italic" , "cterm": "italic"}) +call s:h("markdownLinkDelimiter", {"fg": s:medium_gray}) +call s:h("markdownLinkText", {"fg": s:norm}) +call s:h("markdownLinkTextDelimiter", {"fg": s:medium_gray}) +call s:h("markdownListMarker", {"fg": s:norm}) +call s:h("markdownOrderedListMarker", {"fg": s:norm}) +call s:h("markdownRule", {"fg": s:norm}) +call s:h("markdownUrl", {"fg": s:medium_gray, "gui": "underline", "cterm": "underline"}) +call s:h("markdownUrlDelimiter", {"fg": s:medium_gray}) +call s:h("markdownUrlTitle", {"fg": s:norm}) +call s:h("markdownUrlTitleDelimiter", {"fg": s:medium_gray}) +call s:h("markdownCode", {"fg": s:norm}) +call s:h("markdownCodeDelimiter", {"fg": s:norm}) + +" plasticboy/vim-markdown +call s:h("mkdBlockQuote", {"fg": s:norm}) +call s:h("mkdDelimiter", {"fg": s:medium_gray}) +call s:h("mkdID", {"fg": s:medium_gray}) +call s:h("mkdLineContinue", {"fg": s:norm}) +call s:h("mkdLink", {"fg": s:norm}) +call s:h("mkdLinkDef", {"fg": s:medium_gray}) +call s:h("mkdListItem", {"fg": s:norm}) +call s:h("mkdNonListItemBlock", {"fg": s:norm}) " bug in syntax? +call s:h("mkdRule", {"fg": s:norm}) +call s:h("mkdUrl", {"fg": s:medium_gray, "gui": "underline", "cterm": "underline"}) +call s:h("mkdCode", {"fg": s:norm}) +call s:h("mkdIndentCode", {"fg": s:norm}) + +" gabrielelana/vim-markdown +call s:h("markdownBlockquoteDelimiter", {"fg": s:norm}) +call s:h("markdownInlineDelimiter", {"fg": s:norm}) +call s:h("markdownItemDelimiter", {"fg": s:norm}) +call s:h("markdownLinkReference", {"fg": s:medium_gray}) +call s:h("markdownLinkText", {"fg": s:norm}) +call s:h("markdownLinkTextContainer", {"fg": s:medium_gray}) +call s:h("markdownLinkUrl", {"fg": s:medium_gray, "gui": "underline", "cterm": "underline"}) +call s:h("markdownLinkUrlContainer", {"fg": s:medium_gray}) +call s:h("markdownFencedCodeBlock", {"fg": s:norm}) +call s:h("markdownInlineCode", {"fg": s:norm}) + +" mattly/vim-markdown-enhancements +call s:h("mmdFootnoteDelimiter", {"fg": s:medium_gray}) +call s:h("mmdFootnoteMarker", {"fg": s:norm}) +call s:h("mmdTableAlign", {"fg": s:norm}) +call s:h("mmdTableDelimiter", {"fg": s:norm}) +call s:h("mmdTableHeadDelimiter", {"fg": s:norm}) +call s:h("mmdTableHeader", {"fg": s:norm}) +call s:h("mmdTableCaptionDelimiter", {"fg": s:norm}) +call s:h("mmdTableCaption", {"fg": s:norm}) + +" Textile content +" https://github.com/timcharper/textile.vim/blob/master/syntax/textile.vim +"call s:h("txtBold", {"fg": s:norm , "gui": "bold" , "cterm": "bold" }) +"call s:h("txtEmphasis", {"fg": s:norm , "gui": "italic" , "cterm": "italic"}) + +" XML content +hi! link xmlTag htmlTag +hi! link xmlEndTag xmlTag +hi! link xmlTagName htmlTagName + +" Signify +call s:h("SignifySignAdd",{"fg": s:green, "bg": s:bg_subtle}) +call s:h("SignifySignDelete",{"fg": s:red, "bg": s:bg_subtle}) +call s:h("SignifySignChange",{"fg": s:yellow, "bg": s:bg_subtle}) +call s:h("SignifySignDeleteFirstLine",{"fg": s:red, "bg": s:bg_subtle}) + +" GitGutter +call s:h("GitGutterAdd",{"fg": s:green, "bg": s:bg_subtle}) +call s:h("GitGutterDelete",{"fg": s:red, "bg": s:bg_subtle}) +call s:h("GitGutterChange",{"fg": s:yellow, "bg": s:bg_subtle}) +call s:h("GitGutterChangeDelete",{"fg": s:red, "bg": s:bg_subtle}) + + +"nvim terminal colors +let g:terminal_color_0 = s:bg_dark.gui +let g:terminal_color_1 = s:red.gui +let g:terminal_color_2 = s:green.gui +let g:terminal_color_3 = s:yellow.gui +let g:terminal_color_4 = s:blue.gui +let g:terminal_color_5 = s:purple.gui +let g:terminal_color_6 = s:cyan.gui +let g:terminal_color_7 = s:clouds.gui +let g:terminal_color_8 = s:bg_subtle.gui +let g:terminal_color_9 = s:dark_red.gui +let g:terminal_color_10 = s:dark_green.gui +let g:terminal_color_11 = s:dark_yellow.gui +let g:terminal_color_12 = s:dark_blue.gui +let g:terminal_color_13 = s:dark_purple.gui +let g:terminal_color_14 = s:dark_cyan.gui +let g:terminal_color_15 = s:dark_clouds.gui diff --git a/.vim/colors/challenger-deep/lua/lualine/themes/challenger_deep.lua b/.vim/colors/challenger-deep/lua/lualine/themes/challenger_deep.lua new file mode 100755 index 0000000..d9dee11 --- /dev/null +++ b/.vim/colors/challenger-deep/lua/lualine/themes/challenger_deep.lua @@ -0,0 +1,46 @@ +-- ============================================================================= +-- Genarated by lightline to lualine theme converter +-- https://gist.github.com/shadmansaleh/000871c9a608a012721c6acc6d7a19b9 +-- License: MIT License +-- ============================================================================= + +local colors = { + red = "#ff8080", + green = "#95ffa4", + yellow = "#ffe9aa", + cyan = "#aaffe4", + white = "#F3F3F3", + dark_red = "#ff5458", + dark_green = "#62d196", + dark_yellow = "#ffb378", + dark_cyan = "#63f2f1", + dark_asphalt = "#565575", + asphalt_subtle = "#100E23", +} + +local challenger_deep = { + normal = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_cyan }, + a = { fg = colors.asphalt_subtle, bg = colors.cyan , gui = "bold", }, + c = { fg = colors.white, bg = colors.asphalt_subtle }, + }, + visual = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_yellow }, + a = { fg = colors.asphalt_subtle, bg = colors.yellow , gui = "bold", }, + }, + inactive = { + b = { fg = colors.dark_asphalt, bg = colors.asphalt_subtle }, + a = { fg = colors.dark_asphalt, bg = colors.asphalt_subtle , gui = "bold", }, + c = { fg = colors.dark_asphalt, bg = colors.asphalt_subtle }, + }, + replace = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_green }, + a = { fg = colors.asphalt_subtle, bg = colors.green , gui = "bold", }, + }, + insert = { + b = { fg = colors.asphalt_subtle, bg = colors.dark_red }, + a = { fg = colors.asphalt_subtle, bg = colors.red , gui = "bold", }, + }, +} + +return challenger_deep diff --git a/.vim/colors/falcon b/.vim/colors/falcon deleted file mode 160000 index 0ecdf0f..0000000 --- a/.vim/colors/falcon +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0ecdf0fbeb441d7c4134fb28f9f5f6a3cfc1e837 diff --git a/.vim/colors/falcon/.vimrc_check b/.vim/colors/falcon/.vimrc_check new file mode 100755 index 0000000..19c7b25 --- /dev/null +++ b/.vim/colors/falcon/.vimrc_check @@ -0,0 +1,16 @@ +set nocompatible " disable compatibility with vi +syntax enable "enable syntax highlighting + +" Assumes vim-plug is installed. +call plug#begin() +Plug 'fenetikm/falcon' +call plug#end() + +"enable 24bit support. +set termguicolors + +" enables the active / inactive functionality. +let g:falcon_background = 0 +let g:falcon_inactive = 1 + +colorscheme falcon diff --git a/.vim/colors/falcon/LICENSE b/.vim/colors/falcon/LICENSE new file mode 100755 index 0000000..15d3f6a --- /dev/null +++ b/.vim/colors/falcon/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 fenetikm + +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. diff --git a/.vim/colors/falcon/README.md b/.vim/colors/falcon/README.md new file mode 100755 index 0000000..e6b71f6 --- /dev/null +++ b/.vim/colors/falcon/README.md @@ -0,0 +1,28 @@ +![falcon logo](https://raw.githubusercontent.com/fenetikm/falcon/master/support/logo2.png) + +A colour scheme for terminals, vim and friends. + +This is **v2.0** - vastly improved, with more tweak, less cruft. + +Falcon is a work horse of a colour scheme that will (hopefully) stand the test of time - with fewer gimmicks, a more restrained colour palette but with a splash just enough to distinguish everything semantically as well a touch of delight thrown in. + +![hero shot](https://raw.githubusercontent.com/fenetikm/falcon/master/support/hero2.png) + +## Get started + +Head to [the wiki installation page](https://github.com/fenetikm/falcon/wiki/Installation) to get going. Also have a look through what plugins and programs are [covered](https://github.com/fenetikm/falcon/wiki/Coverage), browse the [screenshot gallery](https://github.com/fenetikm/falcon/wiki/Screenshots), the [palette](https://github.com/fenetikm/falcon/wiki/Palette) and if you need a little bit of help there is also the [troubleshooting section and +FAQ](https://github.com/fenetikm/falcon/wiki/Troubleshooting-&-FAQ). + +## Contact + +If you want to get in touch please [drop me a line](https://michaelwelford.com/contact). + +## Big Thanks + +* Built with [estilo](https://github.com/jacoborus/estilo), gracias! +* Inspiration: gruvbox for not being quite right to my tastes and thus being the seed of this project +* Everyone who Vims, f'yeah! + +## License + +Falcon is released under the [MIT license](https://github.com/fenetikm/falcon/blob/master/LICENSE). diff --git a/.vim/colors/falcon/TODO.md b/.vim/colors/falcon/TODO.md new file mode 100755 index 0000000..a331652 --- /dev/null +++ b/.vim/colors/falcon/TODO.md @@ -0,0 +1,75 @@ +# Falcon Todo + +## @Todo +* statusline - airline check +* increase contrast in markdown for code blocks - maybe another gray... +* check gnome +* add in palette file with rbg and hex and names +* vscode scheme, in progress +* update other themes with indigo for selection colour +* kitty file for inclusion + +## VSCode refs +- https://github.com/sdras/night-owl-vscode-theme +- https://css-tricks.com/creating-a-vs-code-theme/ +- https://marketplace.visualstudio.com/items?itemName=whizkydee.material-palenight-theme&WT.mc_id=csstricks-themearticle-sdras + +## Full list +* Tag current version, create 2.x branch +* Add in some lean prompt stuff, fix up brackets to be delimiter colour etc. +* Fill out corpus (https://rosettacode.org/wiki/Rosetta_Code, https://rosettacode.org/wiki/Sorting_algorithms/Quicksort) + * PHP + * Python + * JS + * Java + * C++ + * HTML + * Haskell + * Shell + * CSS + * HTML +* Automate the screenshot taking + +## Done +* redo screenshots since String syntax change +* Option to force background colour / don't do +* Update all values across repo - done? +* everything else: + * alfred + * alacritty + * prism + * taskwarrior + * timewarrior +* Update palette images +* Update hero image +* New logo +* The README is too long - split into wiki pages on github +* vimdiff colours - done +* Check all grays re blueness - done +* kitty - done +* terminal colours - done +* inactive colour - a touch bluer and brighter - done +* purple use - anywhere else? - done +* fix status line and cursor line, too close - done +* other syntax highlighting for different code types = done? +* PHP - done +* tmux - done +* Colour ideas: + * Introduce a tan colour, mostly in place of bright yellow - done + * Maybe introduce another darker blue colour - done + * Tweak the terminal colours, more subdued, try other alternates e.g. pink - done +* Background colour bluer - done +* Fix contrast and: - done +* Tweak colours back to their humanistic values e.g. remove saturation from some of the brighter colours - done +* Inactive background colour more gray, tad lighter - done +* Tweak contrast, use of white vs orange for delimiters - done +* Fix exa attributes, too colourful currently - done + +## Someday +* L*a*b values +* Light version? probably not though. Maybe some contrast options. +* More support: + * Mutt + * TeX + * highlight: https://gitlab.com/saalen/highlight +* Setup page under projects on michaelwelford.com, point to blog posts about it. diff --git a/.vim/colors/falcon/alacritty/alacritty.yml b/.vim/colors/falcon/alacritty/alacritty.yml new file mode 100755 index 0000000..487b252 --- /dev/null +++ b/.vim/colors/falcon/alacritty/alacritty.yml @@ -0,0 +1,38 @@ +# falcon colorscheme for alacritty +# by fenetikm, https://github.com/fenetikm/falcon +colors: + # Default colors + primary: + background: '0x020221' + foreground: '0xb4b4b9' + + # Colors the cursor will use if `custom_cursor_colors` is true + cursor: + text: '0x020221' + cursor: '0xffe8c0' + + # Normal colors + normal: + black: '0x000004' + red: '0xff3600' + green: '0x718e3f' + yellow: '0xffc552' + blue: '0x635196' + magenta: '0xff761a' + cyan: '0x34bfa4' + white: '0xb4b4b9' + + # Bright colors + bright: + black: '0x020221' + red: '0xff8e78' + green: '0xb1bf75' + yellow: '0xffd392' + blue: '0x99a4bc' + magenta: '0xffb07b' + cyan: '0x8bccbf' + white: '0xf8f8ff' + +# Use custom cursor colors. If true, display the cursor in the cursor.foreground +# and cursor.background colors, otherwise invert the colors of the cursor. +custom_cursor_colors: true diff --git a/.vim/colors/falcon/alfred/falcon-alternate.alfredappearance b/.vim/colors/falcon/alfred/falcon-alternate.alfredappearance new file mode 100755 index 0000000..1e5463f --- /dev/null +++ b/.vim/colors/falcon/alfred/falcon-alternate.alfredappearance @@ -0,0 +1,61 @@ +{ + "alfredtheme" : { + "result" : { + "textSpacing" : 4, + "subtext" : { + "size" : 12, + "colorSelected" : "#DFDFE5FF", + "font" : "Fira Code", + "color" : "#57575EFF" + }, + "shortcut" : { + "size" : 16, + "colorSelected" : "#B4B4B9FF", + "font" : "Fira Code", + "color" : "#787882FF" + }, + "backgroundSelected" : "#212127FF", + "text" : { + "size" : 20, + "colorSelected" : "#F8F8FFFF", + "font" : "Fira Code", + "color" : "#B4B4B9FF" + }, + "iconPaddingHorizontal" : 12, + "paddingVertical" : 9, + "iconSize" : 32 + }, + "search" : { + "paddingVertical" : 11, + "background" : "#2F2F3AFF", + "spacing" : 0, + "text" : { + "size" : 32, + "colorSelected" : "#000004FF", + "font" : "Fira Code", + "color" : "#FFC552FF" + }, + "backgroundSelected" : "#BFDAFFFF" + }, + "window" : { + "color" : "#2F2F3AFF", + "paddingHorizontal" : 9, + "width" : 560, + "borderPadding" : 0, + "borderColor" : "#FFC552FF", + "blur" : 0, + "roundness" : -16, + "paddingVertical" : 0 + }, + "credit" : "Michael Welford", + "separator" : { + "color" : "#00000400", + "thickness" : 0 + }, + "scrollbar" : { + "color" : "#57575EFF", + "thickness" : 0 + }, + "name" : "Falcon Alternate" + } +} diff --git a/.vim/colors/falcon/alfred/falcon-default.alfredappearance b/.vim/colors/falcon/alfred/falcon-default.alfredappearance new file mode 100755 index 0000000..0ffd035 --- /dev/null +++ b/.vim/colors/falcon/alfred/falcon-default.alfredappearance @@ -0,0 +1,61 @@ +{ + "alfredtheme" : { + "result" : { + "textSpacing" : 4, + "subtext" : { + "size" : 12, + "colorSelected" : "#DFDFE5FF", + "font" : "Fira Code", + "color" : "#57575EFF" + }, + "shortcut" : { + "size" : 16, + "colorSelected" : "#B4B4B9FF", + "font" : "Fira Code", + "color" : "#787882FF" + }, + "backgroundSelected" : "#212127FF", + "text" : { + "size" : 20, + "colorSelected" : "#F8F8FFFF", + "font" : "Fira Code", + "color" : "#B4B4B9FF" + }, + "iconPaddingHorizontal" : 12, + "paddingVertical" : 9, + "iconSize" : 32 + }, + "search" : { + "paddingVertical" : 11, + "background" : "#020221FF", + "spacing" : 0, + "text" : { + "size" : 32, + "colorSelected" : "#000004FF", + "font" : "Fira Code", + "color" : "#FFC552FF" + }, + "backgroundSelected" : "#BFDAFFFF" + }, + "window" : { + "color" : "#020221FF", + "paddingHorizontal" : 9, + "width" : 560, + "borderPadding" : 0, + "borderColor" : "#FFC552FF", + "blur" : 0, + "roundness" : -16, + "paddingVertical" : 0 + }, + "credit" : "Michael Welford", + "separator" : { + "color" : "#00000400", + "thickness" : 0 + }, + "scrollbar" : { + "color" : "#57575EFF", + "thickness" : 0 + }, + "name" : "Falcon Default" + } +} diff --git a/.vim/colors/falcon/autoload/airline/themes/falcon.vim b/.vim/colors/falcon/autoload/airline/themes/falcon.vim new file mode 100755 index 0000000..6927e46 --- /dev/null +++ b/.vim/colors/falcon/autoload/airline/themes/falcon.vim @@ -0,0 +1,50 @@ +" ============================================================ +" falcon +" +" URL:https://github.com/fenetikm/falcon +" Author: Michael Welford +" License: MIT +" Last Change: 2021/10/25 20:07 +" ============================================================ + +let g:airline#themes#falcon#palette = {} + +let s:normal1 = [ "#000004", "#B4B4B9", 0, 249 ] +let s:normal2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:normal3 = [ "#787882", "#28282D", 243, 235 ] +let g:airline#themes#falcon#palette.normal = airline#themes#generate_color_map(s:normal1, s:normal2, s:normal3) + +let s:insert1 = [ "#000004", "#FF3600", 0, 202 ] +let s:insert2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:insert3 = [ "#B4B4B9", "#28282D", 249, 235 ] +let g:airline#themes#falcon#palette.insert = airline#themes#generate_color_map(s:insert1, s:insert2, s:insert3) + +let s:replace1 = [ "#000004", "#FF761A", 0, 208 ] +let s:replace2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:replace3 = [ "#B4B4B9", "#28282D", 249, 235 ] +let g:airline#themes#falcon#palette.replace = airline#themes#generate_color_map(s:replace1, s:replace2, s:replace3) + +let s:visual1 = [ "#000004", "#FFC552", 0, 221 ] +let s:visual2 = [ "#B4B4B9", "#36363A", 249, 237 ] +let s:visual3 = [ "#B4B4B9", "#28282D", 249, 235 ] +let g:airline#themes#falcon#palette.visual = airline#themes#generate_color_map(s:visual1, s:visual2, s:visual3) + +let s:inactive1 = [ "#57575E", "#1C1C22", 240, 234 ] +let s:inactive2 = [ "#57575E", "#1C1C22", 240, 234 ] +let s:inactive3 = [ "#57575E", "#1C1C22", 240, 234 ] +let g:airline#themes#falcon#palette.inactive = airline#themes#generate_color_map(s:inactive1, s:inactive2, s:inactive3) + +if !get(g:, 'loaded_ctrlp', 0) + finish +endif + +let s:CP1 = [ "#787882", "#36363A", 243, 237 ] +let s:CP2 = [ "#787882", "#36363A", 243, 237 ] +let s:CP3 = [ "#787882", "#36363A", 243, 237 ] + +let g:airline#themes#falcon#palette.ctrlp = airline#extensions#ctrlp#generate_color_map(s:CP1, s:CP2, s:CP3) + +" =================================== +" Generated by Estilo 1.5.0 +" https://github.com/jacoborus/estilo +" =================================== diff --git a/.vim/colors/falcon/autoload/lightline/colorscheme/falcon.vim b/.vim/colors/falcon/autoload/lightline/colorscheme/falcon.vim new file mode 100755 index 0000000..af951ac --- /dev/null +++ b/.vim/colors/falcon/autoload/lightline/colorscheme/falcon.vim @@ -0,0 +1,42 @@ +" ============================================================ +" Falcon +" +" URL: https://github.com/fenetikm/falcon +" Author: Michael Welford +" License: MIT +" Last Change: 2018/01/06 22:27 +" ============================================================ + +if exists('g:lightline') + let s:p = {"normal": {}, "inactive": {}, "insert": {}, "replace": {}, "visual": {}, "tabline": {} } + + let s:p.normal.left = [[["#000004", 0], ["#dfdfe5", 254]], [["#dfdfe5", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.normal.right = [[["#000004", 0], ["#dfdfe5", 254]], [["#787882", 248], ["#28282d", 241]]] + let s:p.normal.middle = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.inactive.left = [[["#57575e", 241], ["#1c1c22", 237], 'italic'], [["#57575e", 241], ["#1c1c22", 237], 'italic']] + let s:p.inactive.right = [[["#57575e", 241], ["#1c1c22", 237], 'italic'], [["#57575e", 241], ["#1c1c22", 237], 'italic']] + let s:p.inactive.middle = [[["#57575e", 241], ["#1c1c22", 237], 'italic']] + let s:p.insert.left = [[["#000004", 0], ["#ff3600", 202]], [["#d4d4d9", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.insert.right = [[["#000004", 0], ["#ff3600", 202]], [["#787882", 248], ["#28282d", 241]]] + let s:p.insert.middle = [[["#57575e", 241], ["#28282d", 241]]] + let s:p.replace.left = [[["#000004", 0], ["#ff761a", 208]], [["#d4d4d9", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.replace.right = [[["#000004", 0], ["#ff761a", 208]], [["#787882", 248], ["#28282d", 241]]] + let s:p.replace.middle = [[["#57575e", 241], ["#28282d", 241]]] + let s:p.visual.left = [[["#000004", 0], ["#ffc552", 220]], [["#d4d4d9", 248], ["#28282d", 241]], [["#787882", 248], ["#28282d", 241]]] + let s:p.visual.right = [[["#000004", 0], ["#ffc552", 220]], [["#787882", 248], ["#28282d", 241]]] + let s:p.visual.middle = [[["#57575e", 241], ["#28282d", 241]]] + let s:p.tabline.left = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.tabline.tabsel = [[["#dfdfe5", 248], ["#28282d", 237]]] + let s:p.tabline.middle = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.tabline.right = [[["#57575e", 241], ["#28282d", 237]]] + let s:p.normal.error = [[["#000004", 254], ["#ff3600", 202]]] + let s:p.normal.warning = [[["#000004", 208], ["#ff761a", 208]]] + let s:p.normal.ok = [[["#000004", 208], ["#718e3f", 208]]] + + let g:lightline#colorscheme#falcon#palette = lightline#colorscheme#flatten(s:p) +endif + +" =================================== +" Generated by Estilo 1.3.3 +" https://github.com/jacoborus/estilo +" =================================== diff --git a/.vim/colors/falcon/colors/falcon.vim b/.vim/colors/falcon/colors/falcon.vim new file mode 100755 index 0000000..33f21df --- /dev/null +++ b/.vim/colors/falcon/colors/falcon.vim @@ -0,0 +1,597 @@ +" =============================================================== +" falcon +" +" URL: https://github.com/fenetikm/falcon +" Author: Michael Welford +" License: MIT +" Last Change: 2021/10/25 20:07 +" =============================================================== + +set background=dark +hi clear +if exists("syntax_on") + syntax reset +endif +let g:colors_name="falcon" + + +let Italic = "" +if exists('g:falcon_italic') + let Italic = "italic" +endif +let g:falcon_italic = get(g:, 'falcon_italic', 0) + +let Bold = "" +if exists('g:falcon_bold') + let Bold = "bold" +endif + +let g:falcon_bold = get(g:, 'falcon_bold', 0) +hi ALEErrorSign guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi ALEWarningSign guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi ALEInfoSign guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link AspVBSVariableSimple Identifier +hi link AspVBSStatement Keyword +hi ColorColumn guifg=NONE ctermfg=NONE guibg=#151521 ctermbg=234 gui=NONE cterm=NONE +hi Conceal guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Cursor guifg=NONE ctermfg=NONE guibg=#787882 ctermbg=243 gui=NONE cterm=NONE +hi CursorColumn guifg=NONE ctermfg=NONE guibg=#171729 ctermbg=234 gui=NONE cterm=NONE +hi CursorLine guifg=NONE ctermfg=NONE guibg=#2F2F3A ctermbg=236 gui=NONE cterm=NONE +hi CursorLineNr guifg=#B4B4B9 ctermfg=249 guibg=#2F2F3A ctermbg=236 gui=NONE cterm=NONE +hi Directory guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi DiffAdd guifg=NONE ctermfg=NONE guibg=#203003 ctermbg=234 gui=NONE cterm=NONE +hi DiffChange guifg=NONE ctermfg=NONE guibg=#031630 ctermbg=233 gui=NONE cterm=NONE +hi DiffDelete guifg=NONE ctermfg=NONE guibg=#300E03 ctermbg=233 gui=NONE cterm=NONE +hi DiffText guifg=NONE ctermfg=NONE guibg=#203003 ctermbg=234 gui=NONE cterm=NONE +hi ErrorMsg guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VertSplit guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Folded guifg=#787882 ctermfg=243 guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi FoldColumn guifg=#787882 ctermfg=243 guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi SignColumn guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IncSearch guifg=#020221 ctermfg=0 guibg=#BFDAFF ctermbg=153 gui=Bold cterm=Bold +hi LineNr guifg=#57575E ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi MatchParen guifg=#f0e1ce ctermfg=224 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi NonText guifg=#36363A ctermfg=237 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE +hi Normal guifg=#B4B4B9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE +hi PMenu guifg=#878791 ctermfg=102 guibg=#171729 ctermbg=234 gui=NONE cterm=NONE +hi PMenuSel guifg=#000004 ctermfg=0 guibg=#FFC552 ctermbg=221 gui=NONE cterm=NONE +hi PmenuSbar guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi PmenuThumb guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Question guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Search guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=Bold,underline cterm=Bold,underline +hi SpecialKey guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi SpellBad guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=underline cterm=underline +hi SpellLocal guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=underline cterm=underline +hi SpellCap guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=undercurl cterm=undercurl +hi SpellRare guifg=NONE ctermfg=NONE guibg=#3F3A59 ctermbg=237 gui=underline cterm=underline +hi StatusLine guifg=#787882 ctermfg=243 guibg=#28282D ctermbg=235 gui=NONE cterm=NONE +hi StatusLineNC guifg=#787882 ctermfg=243 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi TabLine guifg=#787882 ctermfg=243 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi TabLineFill guifg=NONE ctermfg=NONE guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi TabLineSel guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Title guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Visual guifg=#DFDFE5 ctermfg=254 guibg=#2D1078 ctermbg=4 gui=NONE cterm=NONE +hi WildMenu guifg=#020221 ctermfg=0 guibg=#FFC552 ctermbg=221 gui=NONE cterm=NONE +hi Comment guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi Constant guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi String guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Character String +hi Boolean guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi Number guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Float Number +hi Identifier guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Function guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Statement guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Conditional guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Repeat Statement +hi link Label Statement +hi Operator guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Keyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Exception Statement +hi PreProc guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link Include PreProc +hi link Define PreProc +hi link Macro PreProc +hi link PreCondit PreProc +hi Type guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link StorageClass Type +hi link Structure Type +hi link Typedef Type +hi Special guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link SpecialChar Special +hi link Tag Special +hi Delimiter guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link SpecialComment Special +hi link Debug Special +hi Underlined guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi Todo guifg=#020221 ctermfg=0 guibg=#cfc1b2 ctermbg=181 gui=Italic cterm=Italic +hi QuickFixLine guifg=#BFDAFF ctermfg=153 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi Bold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi Italic guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi IndentBlanklineChar guifg=#36363A ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IndentBlanklineIndent1 guifg=#36363A ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IndentBlanklineIndent2 guifg=#4F4F59 ctermfg=239 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi BufTabLineCurrent guifg=#B4B4B9 ctermfg=249 guibg=#787882 ctermbg=243 gui=NONE cterm=NONE +hi BufTabLineActive guifg=#DFDFE5 ctermfg=254 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi BufTabLineHidden guifg=#787882 ctermfg=243 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi BufTabLineFill guifg=NONE ctermfg=NONE guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi CleverFDefaultLabel guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi cPreCondit guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link cDefine Define +hi cStructure guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link cStorageClass StorageClass +hi link cType Type +hi cCustomParen guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cConditional guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cCustomFunc guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cStatement guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cppSTLnamespace guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cppAccess guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cAnsiFunction guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cSpecial guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi cssVendor guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssTagName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssSelectorOp2 guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssAttrComma guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link cssFunction Function +hi cssIdentifier guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssInclude guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssIncludeKeyword guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssImportant guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link cssBraces Delimiter +hi cssAttributeSelector guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssMediaType guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi cssMediaKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssFontDescriptor guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssClassName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssClassNameDot guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssProp guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssAttr guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssNoise guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssPseudoClass guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi cssAtRuleLogical guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Done guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Partial guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link diffAdded DiffAdd +hi link diffRemoved DiffDelete +hi link diffFile Title +hi diffLine guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi diffSubname guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi dockercomposeKeywords guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link elmTypeDef Type +hi elmType guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi elmTopLevelDecl guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link elmAlias Identifier +hi fugitiveSymbolicRef guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fugitiveHeader guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fugitiveHunk guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fugitiveModifier guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi fzf1 guifg=#FFC552 ctermfg=221 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi fzf2 guifg=#FF761A ctermfg=208 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi fzf3 guifg=#FF761A ctermfg=208 guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi gitcommitSummary guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitBranch guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitDiscardedType guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitSelectedType guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitDiscardedFile guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitcommitSelectedFile guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitconfigSection guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi gitconfigVariable guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsAdd guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsChange guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsDelete guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitSignsChangeDelete guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goLabel guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goBuiltins guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goVar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi goPackage guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link goImport goPackage +hi graphqlVariable guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlStructure guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi graphqlOperator guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpHyperTextJump guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi helpStar guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpHeadline guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpSectionDelim guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi helpOption guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi HighlightedyankRegion guifg=#F8F8FF ctermfg=15 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlTag guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlEndTag guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlArg guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link htmlTagName Number +hi htmlSpecialTagName guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlH1 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi htmlH2 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link htmlH3 htmlH2 +hi link htmlH4 htmlH2 +hi link htmlH5 htmlH2 +hi link htmlH6 htmlH2 +hi htmlTitle guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi htmlSpecialChar guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi IndentGuidesOdd guifg=NONE ctermfg=NONE guibg=#36363A ctermbg=237 gui=NONE cterm=NONE +hi IndentGuidesEven guifg=NONE ctermfg=NONE guibg=#212127 ctermbg=235 gui=NONE cterm=NONE +hi javaRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link javaStatement javaRepeat +hi javaScriptBraces guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi javaScriptNull guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi javaScriptGlobal guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link jsBrackets Delimiter +hi link jsClassBraces jsBrackets +hi link jsBraces jsBrackets +hi link jsObjectBraces jsBrackets +hi link jsParens jsBrackets +hi jsObjectKey guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsFuncBraces jsBrackets +hi link jsFuncParens jsBrackets +hi link jsIfElseBraces jsBrackets +hi jsFuncArgs guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsExtendsKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsArrowFunction Operator +hi jsFunction guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsRepeat jsFunction +hi jsReturn guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassDefinition guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassProperty guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsClassFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsNull guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link jsStorageClass StorageClass +hi jsObjectSeparator guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsObjectValue guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsExportDefault guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsRegexpCharClass guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsTemplateBraces guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsThis guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi jsFuncCall guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsObjectProp guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsConditional guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsVariableDef guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsFuncBlock guifg=#F8F8FF ctermfg=15 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsTry guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsCatch jsTry +hi jsTryCatchBraces guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsGlobalObjects guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi jsParen guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsParenCatch jsParen +hi link jsParenIfElse jsParen +hi jsAsyncKeyword guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsForAwait jsAsyncKeyword +hi jsGlobalNodeObjects guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi jsonBoolean guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link jsonKeywordMatch Delimiter +hi link xmlEqual Operator +hi xmlEndTag guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlTagN guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlTagName guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultError guifg=#a82400 ctermfg=124 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultWarning guifg=#c99c40 ctermfg=179 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultInformation guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspDiagnosticsDefaultHint guifg=#a1968a ctermfg=246 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi LspReferenceRead guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi LspReferenceText guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi LspReferenceWrite guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi LspDiagnosticsVirtualTextError guifg=#a82400 ctermfg=124 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsVirtualTextWarning guifg=#c99c40 ctermfg=179 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsVirtualTextHint guifg=#a1968a ctermfg=246 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsVirtualTextInformation guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi LspDiagnosticsUnderlineError guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#a82400 +hi LspDiagnosticsUnderlineWarning guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#c99c40 +hi LspDiagnosticsUnderlineHint guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#a1968a +hi LspDiagnosticsUnderlineInformation guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=undercurl cterm=undercurl guisp=#787882 +hi luaFuncKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncTable guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncCall guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaFuncArgName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi luaCond guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link luaStatement luaCond +hi link luaLocal Constant +hi link luaFuncParens Delimiter +hi link luaParens luaFuncParens +hi link luaBraces luaFuncParens +hi luaDocTag guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link markdownHeadingDelimiter Delimiter +hi link markdownItemDelimiter Delimiter +hi markdownInlineDelimiter guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link markdownOrderedListMarker Delimiter +hi link markdownListMarker Delimiter +hi link markdownLinkTextDelimiter Delimiter +hi markdownUrl guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi markdownCodeDelimiter guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi markdownCode guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link markdownError SpellBad +hi markdownXmlElement guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link mkdLink Underlined +hi mkdURL guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi mkdInlineURL guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi mkdBold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi htmlBold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link mkdListItem Delimiter +hi htmlItalic guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi mkdCode guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi mkdCodeDelimiter guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link mkdHeading Delimiter +hi healthSuccess guifg=#020221 ctermfg=0 guibg=#718E3F ctermbg=65 gui=NONE cterm=NONE +hi healthError guifg=#020221 ctermfg=0 guibg=#FF3600 ctermbg=202 gui=NONE cterm=NONE +hi NormalFloat guifg=NONE ctermfg=NONE guibg=#2F2F3A ctermbg=236 gui=NONE cterm=NONE +hi NormalFloatAlt guifg=NONE ctermfg=NONE guibg=#242430 ctermbg=235 gui=NONE cterm=NONE +hi NERDTreeCWD guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeOpenable guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeClosable guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeFlags guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NERDTreeGitStatusDirDirty guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi netrwClassify guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbr guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbrDeprecated guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbrMatch guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemAbbrMatchFuzzy guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemKind guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi CmpItemMenu guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeFolderName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeRootFolder guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeFolderIcon guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeEmptyFolderName guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeOpenedFolderName guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeOpenedFile guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi NvimTreeGitDirty guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitStaged guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitMerge guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitRenamed guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitNew guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi NvimTreeGitDeleted guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpCommentTitle guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi phpDocTags guifg=#a1968a ctermfg=246 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi phpDocCustomTags guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpDocNamespaceSeparator Comment +hi phpUseNamespaceSeparator guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpBoolean Boolean +hi phpStorageClass guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpClasses guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpStaticClasses guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi phpClassImplements guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link phpClassExtends phpClassImplements +hi phpStructure guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi phpMethod guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpFunctions guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpKeyword Keyword +hi link phpType Type +hi link phpParent Delimiter +hi phpMemberSelector guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpOperator Operator +hi phpVarSelector guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link phpIdentifier Identifier +hi phpStringDelimiter guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi phpSuperglobals guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi phpSpecialChar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link phpNullValue Boolean +hi plugDeleted guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi plugBracket guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi plug1 guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi plug2 guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonStatement guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonRepeat guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonFunction guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonExClass guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonBuiltinObj guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonDot guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi pythonBuiltinFunc guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link pythonNone Boolean +hi rstSections guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rstCodeBlock guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rstDirective guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rstHyperlinkTarget guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=underline cterm=underline +hi rstExDirective guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyClass guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyClassName Normal +hi rubyModule guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyModuleName Normal +hi rubyDefine guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyFunction guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyControl guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyConstant guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyGlobalVariable guifg=#9F97CC ctermfg=140 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi rubySymbol guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyArrayDelimiter Delimiter +hi rubyBlockParameterList guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link rubyCurlyBlockDelimiter Delimiter +hi rubyDoBlock guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyLocalVariableOrMethod guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyMethodBlock guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyHeredocDelimiter guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi rubyCurlyBlock guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shCaseBar Operator +hi link shQuote Delimiter +hi shFunction guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shLoop Function +hi link shTestOpr Operator +hi shVariable guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi bashSpecialVariables guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shSnglCase Delimiter +hi shSetList guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi shStatement guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link shSet shStatement +hi Sneak guifg=#F8F8FF ctermfg=15 guibg=#2D1078 ctermbg=4 gui=NONE cterm=NONE +hi SneakLabel guifg=#F8F8FF ctermfg=15 guibg=#2D1078 ctermbg=4 gui=NONE cterm=NONE +hi SneakScope guifg=#F8F8FF ctermfg=15 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link sqlStatement Function +hi sqlKeyword guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link sqlSpecial Number +hi sqlType guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link sqlFunction Title +hi link mysqlKeyword sqlKeyword +hi link mysqlOperator Operator +hi link mysqlFunction sqlType +hi link mysqlStatement sqlStatement +hi link mysqlType sqlType +hi link Quote Delimiter +hi sshconfigKeyword guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi sshconfigMatch guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi sshconfigYesNo guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi sshconfigLogLevel guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifySlash guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyPath guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyHeader guifg=#5521D9 ctermfg=56 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyFile guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifySection guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi StartifyNumber guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarComment guifg=#36363A ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarKind guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarNestedKind guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarScope guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarType guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarSignature guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarPseudoID guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarFoldIcon guifg=#787882 ctermfg=243 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarHighlight guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarVisibilityPublic guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarVisibilityProtected guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi TagbarVisibilityPrivate guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxCmds guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxOptsSet guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxOptions guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi tmuxOptsSetw guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link TSKeyword Keyword +hi link TSVariable Identifier +hi TSMethod guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link TSVariableBuiltin Type +hi link TSFunction Keyword +hi link TSOperator Operator +hi TSConstructor guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi link TSException Keyword +hi link TSConstant Constant +hi link TSConstBuiltin Boolean +hi TSError guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link twigVarDelim Delimiter +hi link twigTagDelim Delimiter +hi twigString guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi twigOperator guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi twigTagBlock guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi htmlLink guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link twigVariable Identifier +hi twigFilter guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi snipSnippetHeaderKeyword guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link snipSnippetFooterKeyword snipSnippetHeaderKeyword +hi link snipTabStop Identifier +hi snipTabStopDefault guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link snipMirror snipTabStop +hi link snipSnippetTrigger String +hi link snipSnippetDocContextString Comment +hi DbgBreakptLine guifg=NONE ctermfg=NONE guibg=#031630 ctermbg=233 gui=NONE cterm=NONE +hi DbgBreakptSign guifg=#031630 ctermfg=233 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi DbgCurrentLine guifg=NONE ctermfg=NONE guibg=#300E03 ctermbg=233 gui=NONE cterm=NONE +hi DbgCurrentSign guifg=#300E03 ctermfg=233 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterAdd guifg=#718E3F ctermfg=65 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterChange guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterDelete guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi GitGutterChangeDelete guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi SignatureMarkText guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi Terminal guifg=#B4B4B9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE +hi titleEntry guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimCommentTitle guifg=#DFDFE5 ctermfg=254 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi vimCommand guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimVar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimLet guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimNotFunc guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimIsCommand guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link vimOperParen Delimiter +hi vimFuncVar guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi vimFuncName guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimAutoEvent guifg=#FF3600 ctermfg=202 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimMap guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimGroup guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimHiTerm guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimSetSep guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link vimHighlight vimLet +hi vimSetEqual guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimNotation guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimMapLhs guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi vimMapRhs guifg=#C8D0E3 ctermfg=252 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link VimwikiLink Underlined +hi link VimwikiHeaderChar Delimiter +hi VimwikiHeader1 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi VimwikiHeader2 guifg=#BFDAFF ctermfg=153 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link VimwikiHeader3 VimwikiHeader2 +hi link VimwikiHeader4 VimwikiHeader2 +hi link VimwikiHeader5 VimwikiHeader2 +hi link VimwikiHeader6 VimwikiHeader2 +hi link VimwikiList Delimiter +hi VimwikiPre guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiCode guifg=#878791 ctermfg=102 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiCodeChar guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiMarkers guifg=#cfc1b2 ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VimwikiBold guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Bold cterm=Bold +hi VimwikiItalic guifg=NONE ctermfg=NONE guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi VistaTag guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi VistaPrefix guifg=#57575E ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlAttrib guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlTag guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi xmlProcessingDelim guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlFlowStringDelimiter guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlBlockCollectionItemStart guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlBlockMappingKey guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi yamlFlowMappingKey guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link yamlFlowIndicator Delimiter +hi link yamlKeyValueDelimiter Delimiter +hi yamlNull guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=Italic cterm=Italic +hi link yamlBool Number +hi yamlPlainScalar guifg=#B4B4B9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi zshCommands guifg=#FFC552 ctermfg=221 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link zshBrackets Delimiter +hi zshOptStart guifg=#FF761A ctermfg=208 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi zshVariableDef guifg=#99A4BC ctermfg=248 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +hi link zshTypes Type +hi link zshKeyword Keyword +hi link zshStringDelimiter Delimiter +hi link zshDelimiter Delimiter +hi link zshParentheses Delimiter + +if exists('*term_setansicolors') + let g:terminal_ansi_colors = repeat([0], 16) + + let g:terminal_ansi_colors[0] = '#000004' + let g:terminal_ansi_colors[1] = '#FF3600' + let g:terminal_ansi_colors[2] = '#718E3F' + let g:terminal_ansi_colors[3] = '#FFC552' + let g:terminal_ansi_colors[4] = '#635196' + let g:terminal_ansi_colors[5] = '#FF761A' + let g:terminal_ansi_colors[6] = '#34bfa4' + let g:terminal_ansi_colors[7] = '#B4B4B9' + let g:terminal_ansi_colors[8] = '#020221' + let g:terminal_ansi_colors[9] = '#FF8E78' + let g:terminal_ansi_colors[10] = '#B1BF75' + let g:terminal_ansi_colors[11] = '#FFD392' + let g:terminal_ansi_colors[12] = '#99A4BC' + let g:terminal_ansi_colors[13] = '#FFB07B' + let g:terminal_ansi_colors[14] = '#8BCCBF' + let g:terminal_ansi_colors[15] = '#F8F8FF' +endif + +if has('nvim') + let g:terminal_color_0 = '#000004' + let g:terminal_color_1 = '#FF3600' + let g:terminal_color_2 = '#718E3F' + let g:terminal_color_3 = '#FFC552' + let g:terminal_color_4 = '#635196' + let g:terminal_color_5 = '#FF761A' + let g:terminal_color_6 = '#34bfa4' + let g:terminal_color_7 = '#B4B4B9' + let g:terminal_color_8 = '#020221' + let g:terminal_color_9 = '#FF8E78' + let g:terminal_color_10 = '#B1BF75' + let g:terminal_color_11 = '#FFD392' + let g:terminal_color_12 = '#99A4BC' + let g:terminal_color_13 = '#FFB07B' + let g:terminal_color_14 = '#8BCCBF' + let g:terminal_color_15 = '#F8F8FF' +endif + +" =================================== +" Generated by Estilo 1.5.0 +" https://github.com/jacoborus/estilo +" =================================== diff --git a/.vim/colors/falcon/corpus/README.rst b/.vim/colors/falcon/corpus/README.rst new file mode 100755 index 0000000..19f85ca --- /dev/null +++ b/.vim/colors/falcon/corpus/README.rst @@ -0,0 +1,107 @@ +digimarks +========= + +|PyPI version| |PyPI license| |Code health| |Codacy| + +Simple bookmarking service, using a SQLite database to store bookmarks, supporting tags and automatic title fetching. + + +Installation +------------ + +From PyPI +~~~~~~~~~ + +Assuming you already are inside a virtualenv: + +.. code-block:: bash + + pip install digimarks + + +From Git +~~~~~~~~ + +Create a new virtualenv (if you are not already in one) and install the +necessary packages: + +.. code-block:: bash + + git clone https://github.com/aquatix/digimarks.git + cd digimarks + mkvirtualenv digimarks # or whatever project you are working on + pip install -r requirements.txt + + +Usage / example configuration +----------------------------- + +Copy ``settings.py`` from example_config to the parent directory and +configure to your needs (*at the least* change the value of `SYSTEMKEY`). + +Run digimarks as a service under nginx or apache and call the appropriate +url's when wanted. + +Url's are of the form https://marks.example.com// + + +Bookmarklet +~~~~~~~~~~~ + +To easily save a link from your browser, open its bookmark manager and create a new bookmark with as url: + +.. code-block:: javascript + + javascript:location.href='http://marks.example.com/1234567890abcdef/add?url='+encodeURIComponent(location.href); + + +Creating a new user +------------------- + +After having set up the ```settings.py``` as under Usage, you can add a new user, by going to this path on your digimarks server: + +//adduser + +where `secretkey` is the value set in settings.SYSTEMKEY + +digimarks will then redirect to the bookmarks overview page of the new user. Please remember the user key (the hash in the url), as it will not be visible otherwise in the interface. + +If you for whatever reason would lose this user key, just either look on the console (or webserver logs) where the list of available user keys is printed on digimarks startup, or open bookmarks.db with a SQLite editor. + + +Server configuration +~~~~~~~~~~~~~~~~~~~~ + +* `vhost for Apache2.4`_ +* `uwsgi.ini`_ + + +What's new? +----------- + +See the `Changelog`_. + + +Attributions +------------ + +'M' favicon by `Freepik`_. + + +.. _digimarks: https://github.com/aquatix/digimarks +.. _webhook: https://en.wikipedia.org/wiki/Webhook +.. |PyPI version| image:: https://img.shields.io/pypi/v/digimarks.svg + :target: https://pypi.python.org/pypi/digimarks/ +.. |PyPI license| image:: https://img.shields.io/github/license/aquatix/digimarks.svg + :target: https://pypi.python.org/pypi/digimarks/ +.. |Code health| image:: https://landscape.io/github/aquatix/digimarks/master/landscape.svg?style=flat + :target: https://landscape.io/github/aquatix/digimarks/master + :alt: Code Health +.. |Codacy| image:: https://api.codacy.com/project/badge/Grade/9a34319d917b43219a29e59e9ac75e3b + :alt: Codacy Badge + :target: https://app.codacy.com/app/aquatix/digimarks?utm_source=github.com&utm_medium=referral&utm_content=aquatix/digimarks&utm_campaign=badger +.. _hook settings: https://github.com/aquatix/digimarks/blob/master/example_config/examples.yaml +.. _vhost for Apache2.4: https://github.com/aquatix/digimarks/blob/master/example_config/apache_vhost.conf +.. _uwsgi.ini: https://github.com/aquatix/digimarks/blob/master/example_config/uwsgi.ini +.. _Changelog: https://github.com/aquatix/digimarks/blob/master/CHANGELOG.md +.. _Freepik: http://www.flaticon.com/free-icon/letter-m_2041 diff --git a/.vim/colors/falcon/corpus/bash.sh b/.vim/colors/falcon/corpus/bash.sh new file mode 100755 index 0000000..cd73db1 --- /dev/null +++ b/.vim/colors/falcon/corpus/bash.sh @@ -0,0 +1,35 @@ +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi +# +# aliases +alias grpe=grep +alias grep='grep --color --line-number' +alias vim="vim -p" +alias rebash="source ~/.bashrc" + +alias install='sudo apt-get -y install' +alias search='apt-cache search' +alias purge='sudo apt-get purge' + +export EDITOR=vim + +# set up the prompt to the hostname +shopt -s checkwinsize +PS1="\e[1;35m[\w] --- \@ \d \n$>\[\e[0m\]" +PS2="\e[1;35m->\[\e[0m\]" + +#-------------------------------------------------- +# grabs some definitions from google +#-------------------------------------------------- +define () { + lynx -dump "http://www.google.com/search?hl=en&q=define%3A+${1}" | grep -m 25 -w "*" | sed 's/;/ -/g' | cut -d- -f5 > /tmp/templookup.txt + if [[ -s /tmp/templookup.txt ]] ;then + until ! read response + do + echo "${response}" + done < /tmp/templookup.txt + else + echo "Sorry $USER, I can't find the term \"${1} \"" + fi diff --git a/.vim/colors/falcon/corpus/c.c b/.vim/colors/falcon/corpus/c.c new file mode 100755 index 0000000..c46b913 --- /dev/null +++ b/.vim/colors/falcon/corpus/c.c @@ -0,0 +1,48 @@ +#include + +void quicksort(int *A, int len); + +/** + * Main starts here. + */ +int main (void) { + int a[] = {4, 65, 2, -31, 0, 99, 2, 83, 782, 1}; + int n = sizeof a / sizeof a[0]; + + int i; + for (i = 0; i < n; i++) { + printf("%d ", a[i]); + } + printf("\n hello"); + + quicksort(a, n); + + for (i = 0; i < n; i++) { + printf("%d ", a[i]); + } + printf("\n"); + + return 0; +} + +// This is quicksort. +void quicksort(int *A, int len) { + if (len < 2) return; + + int pivot = A[len / 2]; + + int i, j; + for (i = 0, j = len - 1; ; i++, j--) { + while (A[i] < pivot) i++; + while (A[j] > pivot) j--; + + if (i >= j) break; + + int temp = A[i]; + A[i] = A[j]; + A[j] = temp; + } + + quicksort(A, i); + quicksort(A + i, len - i); +} diff --git a/.vim/colors/falcon/corpus/clojure.clj b/.vim/colors/falcon/corpus/clojure.clj new file mode 100755 index 0000000..788f045 --- /dev/null +++ b/.vim/colors/falcon/corpus/clojure.clj @@ -0,0 +1,48 @@ +;; A comment! +(defn qsort [L] + (if (empty? L) + '() + (let [[pivot & L2] L] + (lazy-cat (qsort (for [y L2 :when (< y pivot)] y)) + (list pivot) + (qsort (for [y L2 :when (>= y pivot)] y)))))) + +(defn qsort3 [[pivot :as coll]] + (when pivot + (lazy-cat (qsort (filter #(< % pivot) coll)) + (filter #{pivot} coll) + (qsort (filter #(> % pivot) coll))))) + +(def bit-bucket-writer + (proxy [java.io.Writer] [] + (write [buf] nil) + (close [] nil) + (flush [] nil))) + +(defmacro noprint + "Evaluates the given expressions with all printing to *out* silenced." + [& forms] + `(binding [*out* bit-bucket-writer] + ~@forms)) + +(noprint + (println "Hello, nobody!")) + +(defn run [nvecs nitems nthreads niters] + (let [vec-refs (->> (range (* nvecs nitems)) (partition nitems) (map (comp ref vec)) vec) + swap #(let [v1 (rand-int nvecs) + v2 (rand-int nvecs) + i1 (rand-int nitems) + i2 (rand-int nitems)] + (dosync + (let [tmp (nth @(vec-refs v1) i1)] + (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2)) + (alter (vec-refs v2) assoc i2 tmp)))) + report #(let [derefed (map deref vec-refs)] + (prn derefed) + (println "Distinct:" (->> derefed (apply concat) distinct count)))] + (report) + (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap))))) + (report))) + +(run 100 10 10 100000) diff --git a/.vim/colors/falcon/corpus/cpp.cpp b/.vim/colors/falcon/corpus/cpp.cpp new file mode 100755 index 0000000..5e53f1b --- /dev/null +++ b/.vim/colors/falcon/corpus/cpp.cpp @@ -0,0 +1,73 @@ +/** + * From: http://rosettacode.org/wiki/Sorting_algorithms/ + */ +#include +#include // for std::partition +#include // for std::less + +// helper function for median of three +template + T median(T t1, T t2, T t3) +{ + if (t1 < t2) + { + if (t2 < t3) + return t2; + else if (t1 < t3) + return t3; + else + return t1; + } + else + { + if (t1 < t3) + return t1; + else if (t2 < t3) + return t3; + else + return t2; + } +} + +// helper object to get <= from < +template struct non_strict_op: + public std::binary_function +{ + non_strict_op(Order o): order(o) {} + bool operator()(typename Order::second_argument_type arg1, + typename Order::first_argument_type arg2) const + { + return !order(arg2, arg1); + } +private: + Order order; +}; + +template non_strict_op non_strict(Order o) +{ + return non_strict_op(o); +} + +template + void quicksort(RandomAccessIterator first, RandomAccessIterator last, Order order) +{ + if (first != last && first+1 != last) + { + typedef typename std::iterator_traits::value_type value_type; + RandomAccessIterator mid = first + (last - first)/2; + value_type pivot = median(*first, *mid, *(last-1)); + RandomAccessIterator split1 = std::partition(first, last, std::bind2nd(order, pivot)); + RandomAccessIterator split2 = std::partition(split1, last, std::bind2nd(non_strict(order), pivot)); + quicksort(first, split1, order); + quicksort(split2, last, order); + } +} + +template + void quicksort(RandomAccessIterator first, RandomAccessIterator last) +{ + quicksort(first, last, std::less::value_type>()); +} diff --git a/.vim/colors/falcon/corpus/css.css b/.vim/colors/falcon/corpus/css.css new file mode 100755 index 0000000..fce85dc --- /dev/null +++ b/.vim/colors/falcon/corpus/css.css @@ -0,0 +1,59 @@ +/* A comment. */ +@font-face { + font-family: 'Fira Code'; + src: url('eot/FiraCode-Bold.eot'); + src: url('eot/FiraCode-Bold.eot') format('embedded-opentype'), + url('woff2/FiraCode-Bold.woff2') format('woff2'), + url('woff/FiraCode-Bold.woff') format('woff'), + url('ttf/FiraCode-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal !important; + color: #fff; +} + +html, body { + padding: 0; + margin: 0; +} + +html { + font-size: 14px; +} + +@media screen and (min-width: 320px) { + html { + font-size: calc(11px + 9 * ((100vw - 320px) / 680)); + } +} + +@media screen and (min-width: 1000px) { + html { + font-size: 21px; + } +} + +body { + font-family: "Fira Code", monospace; + background: #000002; + color: #d4d4d9; + font-feature-settings: "calt" 1; /* Enable ligatures for IE 10+, Edge */ + text-rendering: optimizeLegibility; /* Force ligatures for Webkit, Blink, Gecko */ + -webkit-font-smoothing: subpixel-antialiased; +} + +#canvas { + display: block; + z-index: -1; + position: fixed; + top: 0; + left: 0; +} + +code, pre { + font-family: "Fira Code", monospace; + background: transparent; +} + +.blah #thing:nth-child(1) { + display: inline; +} diff --git a/.vim/colors/falcon/corpus/elm.elm b/.vim/colors/falcon/corpus/elm.elm new file mode 100755 index 0000000..de6a5e8 --- /dev/null +++ b/.vim/colors/falcon/corpus/elm.elm @@ -0,0 +1,86 @@ +import Html exposing (..) + +{-| TodoMVC implemented in Elm, using plain HTML and CSS for rendering. +This application is broken up into three key parts: + 1. Model - a full definition of the application's state + 2. Update - a way to step the application state forward + 3. View - a way to visualize our application state with HTML +This clean division of concerns is a core part of Elm. You can read more about +this in +-} + + +main : Program (Maybe Model) Model Msg +main = + Browser.document + { init = init + , view = \model -> { title = "Elm • TodoMVC", body = [view model] } + , update = updateWithStorage + , subscriptions = \_ -> Sub.none + } + +-- The full application state of our todo app. +type alias Model = + { entries : List Entry + , field : String + , uid : Int + , visibility : String + } + +type Msg + = NoOp + | UpdateField String + | EditingEntry Int Bool + | UpdateEntry Int String + | Add + | Delete Int + | DeleteComplete + | Check Int Bool + | CheckAll Bool + | ChangeVisibility String + +-- How we update our Model on a given Msg? +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + NoOp -> + ( model, Cmd.none ) + + Add -> + ( { model + | uid = model.uid + 1 + , field = "" + , entries = + if String.isEmpty model.field then + model.entries + else + model.entries ++ [ newEntry model.field model.uid ] + } + , Cmd.none + ) + + UpdateField str -> + ( { model | field = str } + , Cmd.none + ) + +-- VIEW CONTROLS AND FOOTER + + +viewControls : String -> List Entry -> Html Msg +viewControls visibility entries = + let + entriesCompleted = + List.length (List.filter .completed entries) + + entriesLeft = + List.length entries - entriesCompleted + in + footer + [ class "footer" + , hidden (List.isEmpty entries) + ] + [ lazy viewControlsCount entriesLeft + , lazy viewControlsFilters visibility + , lazy viewControlsClear entriesCompleted + ] diff --git a/.vim/colors/falcon/corpus/go.go b/.vim/colors/falcon/corpus/go.go new file mode 100755 index 0000000..cc1d6ff --- /dev/null +++ b/.vim/colors/falcon/corpus/go.go @@ -0,0 +1,93 @@ +package main + +import "fmt" + +func main() { + list := []int{31, 41, 59, 26, 53, 58, 97, 93, 23, 84} + fmt.Println("unsorted:", list) + + quicksort(list) + fmt.Println("sorted! ", list) +} + +func quicksort(a []int) { + var pex func(int, int) + pex = func(lower, upper int) { + for { + switch upper - lower { + case -1, 0: // 0 or 1 item in segment. nothing to do here! + return + case 1: // 2 items in segment + // < operator respects strict weak order + if a[upper] < a[lower] { + // a quick exchange and we're done. + a[upper], a[lower] = a[lower], a[upper] + } + return + // Hoare suggests optimized sort-3 or sort-4 algorithms here, + // but does not provide an algorithm. + } + + // Hoare stresses picking a bound in a way to avoid worst case + // behavior, but offers no suggestions other than picking a + // random element. A function call to get a random number is + // relatively expensive, so the method used here is to simply + // choose the middle element. This at least avoids worst case + // behavior for the obvious common case of an already sorted list. + bx := (upper + lower) / 2 + b := a[bx] // b = Hoare's "bound" (aka "pivot") + lp := lower // lp = Hoare's "lower pointer" + up := upper // up = Hoare's "upper pointer" + outer: + for { + // use < operator to respect strict weak order + for lp < upper && !(b < a[lp]) { + lp++ + } + for { + if lp > up { + // "pointers crossed!" + break outer + } + // < operator for strict weak order + if a[up] < b { + break // inner + } + up-- + } + // exchange + a[lp], a[up] = a[up], a[lp] + lp++ + up-- + } + // segment boundary is between up and lp, but lp-up might be + // 1 or 2, so just call segment boundary between lp-1 and lp. + if bx < lp { + // bound was in lower segment + if bx < lp-1 { + // exchange bx with lp-1 + a[bx], a[lp-1] = a[lp-1], b + } + up = lp - 2 + } else { + // bound was in upper segment + if bx > lp { + // exchange + a[bx], a[lp] = a[lp], b + } + up = lp - 1 + lp++ + } + // "postpone the larger of the two segments" = recurse on + // the smaller segment, then iterate on the remaining one. + if up-lower < upper-lp { + pex(lower, up) + lower = lp + } else { + pex(lp, upper) + upper = up + } + } + } + pex(0, len(a)-1) +} diff --git a/.vim/colors/falcon/corpus/html.html b/.vim/colors/falcon/corpus/html.html new file mode 100755 index 0000000..3d333a1 --- /dev/null +++ b/.vim/colors/falcon/corpus/html.html @@ -0,0 +1,36 @@ + + + + Name Submission + + + + + + +

Submit your Name here!

+

We'll get more information on the following pages..

+
+ First name >
+ Last name: >
+ +
+

Click "Submit" to continue..

+ +

A nested List:

+ Google +
    +
  • Coffee & Tea
  • +
  • Tea +
      +
    • Black tea
    • +
    • Green tea +
        +
      • China
      • +
      • Africa
      • +
      +
    • +
    +
  • +
  • Milk
  • +
diff --git a/.vim/colors/falcon/corpus/java.java b/.vim/colors/falcon/corpus/java.java new file mode 100755 index 0000000..f55e307 --- /dev/null +++ b/.vim/colors/falcon/corpus/java.java @@ -0,0 +1,31 @@ +// From http://rosettacode.org/wiki/Sorting_algorithms +public static > List quickSort(List arr) { + if (arr.isEmpty()) + return arr; + else { + E pivot = arr.get(0); + + List less = new LinkedList(); + List pivotList = new LinkedList(); + List more = new LinkedList(); + + // Partition + for (E i: arr) { + if (i.compareTo(pivot) < 0) + less.add(i); + else if (i.compareTo(pivot) > 0) + more.add(i); + else + pivotList.add(i); + } + + // Recursively sort sublists + less = quickSort(less); + more = quickSort(more); + + // Concatenate results + less.addAll(pivotList); + less.addAll(more); + return less; + } +} diff --git a/.vim/colors/falcon/corpus/javascript.js b/.vim/colors/falcon/corpus/javascript.js new file mode 100755 index 0000000..8ffeaed --- /dev/null +++ b/.vim/colors/falcon/corpus/javascript.js @@ -0,0 +1,53 @@ +/** + * @file + * + * Watch changes to *.es6.js files and compile them to ES5 during development. + * + * @internal This file is part of the core javascript build process and is only + * meant to be used in that context. + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const chokidar = require('chokidar'); +const nconst = 4; +const arr = thing[1]; + +const changeOrAdded = require('./changeOrAdded'); +const log = require('./log'); + +// Match only on .es6.js files. +const fileMatch = './**/*.es6.js'; +// Ignore everything in node_modules +const watcher = chokidar.watch(fileMatch, { + ignoreInitial: true, + ignored: './node_modules/**' +}); + +const unlinkHandler = (err) => { + if (err) { + log(err); + } + for (var i = 0; i < 9; i++) { + console.log(i); + } +}; + +const bool = false; +const nullish = null; + +console.log('Check.'); + +// Watch for filesystem changes. +watcher + .on('add', changeOrAdded) + .on('change', changeOrAdded) + .on('unlink', (filePath) => { + const fileName = filePath.slice(0, -7); + fs.stat(`${fileName}.js`, () => { + fs.unlink(`${fileName}.js`, unlinkHandler); + }); + }) + .on('ready', () => log(`Watching '${fileMatch}' for changes.`)); diff --git a/.vim/colors/falcon/corpus/lua.lua b/.vim/colors/falcon/corpus/lua.lua new file mode 100755 index 0000000..b2c19ee --- /dev/null +++ b/.vim/colors/falcon/corpus/lua.lua @@ -0,0 +1,45 @@ +-- in-place quicksort +-- @todo do the thing +function quicksort(t, start, endi) + start, endi = start or 1, endi or #t + --partition w.r.t. first element + if(endi - start < 1) then return t end + local pivot = start + for i = start + 1, endi do + if t[i] <= t[pivot] then + if i == pivot + 1 then + t[pivot],t[pivot+1] = t[pivot+1],t[pivot] + else + t[pivot],t[pivot+1],t[i] = t[i],t[pivot],t[pivot+1] + end + pivot = pivot + 1 + end + end + t = quicksort(t, start, pivot - 1) + return quicksort(t, pivot + 1, endi) +end + +-- example +print(unpack(quicksort{5, 2, 7, 3, 4, 7, 1})) + +function quicksort(t) + if #t<2 then return t end + local pivot=t[1] + local a,b,c={},{},{} + for _,v in ipairs(t) do + if vpivot then c[#c+1]=v + else b[#b+1]=v + end + end + a=quicksort(a) + c=quicksort(c) + for _,v in ipairs(b) do a[#a+1]=v end + for _,v in ipairs(c) do a[#a+1]=v end + return a +end + +-- on purpose errors to check LSP +re +function + diff --git a/.vim/colors/falcon/corpus/markdown.md b/.vim/colors/falcon/corpus/markdown.md new file mode 100755 index 0000000..927efbf --- /dev/null +++ b/.vim/colors/falcon/corpus/markdown.md @@ -0,0 +1,35 @@ +# Top level +## Another level down +1. Number list item +2. Another item + - Ul item + - And another + +A Paragraph with some _italics_ and something **bold** and now a [link](http://example.com). + +> This is a block +> + +Inline `code` perhaps? + +```sh +ls -al +``` + +```php +$thing = 'string'; +``` +![image](http://example.com) + +## Other stuff +- [ ] A checkbox +- [X] A checkbox that is marked + +Tables: + +First Header | Second Header +------------ | ------------- +Content from cell 1 | Content from cell 2 +Content in the first column | Content in the second column + +~~strikethrough~~ ? diff --git a/.vim/colors/falcon/corpus/php.php b/.vim/colors/falcon/corpus/php.php new file mode 100755 index 0000000..56ced4a --- /dev/null +++ b/.vim/colors/falcon/corpus/php.php @@ -0,0 +1,61 @@ +loadUserByName($reviewer_id); + if (!empty($reviewer)) { + return reset($reviewer); + } + $change; + + $user_storage = $this->entityTypeManager->getStorage('user'); + $reviewer = $user_storage->create(); + $reviewer->setUsername($reviewer_id) + ->enforceIsNew() + ->activate() + ->set('roles', ['reviewer']) + ->set(CcspUserService::FIELD_FULL_NAME, $reviewer_name) + ->setEmail($email) + ->save(); + + define('CONST', 1); //thing + // Here is a comment + + $a_flag = FALSE; + $a_number = 0; + $a_null = NULL; + + // @TODO fix this up, plaz. + return $reviewer; + + $hello = array_map(function($item) { + return $item; + }, $arr); + } + +} diff --git a/.vim/colors/falcon/corpus/php_old.php b/.vim/colors/falcon/corpus/php_old.php new file mode 100755 index 0000000..57900c9 --- /dev/null +++ b/.vim/colors/falcon/corpus/php_old.php @@ -0,0 +1,36 @@ +prepare($sql); + } +} diff --git a/.vim/colors/falcon/corpus/python.py b/.vim/colors/falcon/corpus/python.py new file mode 100755 index 0000000..e50e1af --- /dev/null +++ b/.vim/colors/falcon/corpus/python.py @@ -0,0 +1,54 @@ +def dump_args(func): + "This decorator dumps out the arguments passed to a function before calling it" + argnames = func.func_code.co_varnames[:func.func_code.co_argcount] + fname = func.func_name + def echo_func(*args,**kwargs): + print fname, ":", ', '.join( + '%s=%r' % entry + for entry in zip(argnames,args) + kwargs.items()) + return func(*args, **kwargs) + return echo_func + +@dump_args +def f1(a,b,c): + print a + b + c + +f1(1, 2, 3) + +def precondition(precondition, use_conditions=DEFAULT_ON): + return conditions(precondition, None, use_conditions) + +def postcondition(postcondition, use_conditions=DEFAULT_ON): + return conditions(None, postcondition, use_conditions) + +class conditions(object): + __slots__ = ('__precondition', '__postcondition') + + def __init__(self, pre, post, use_conditions=DEFAULT_ON): + if not use_conditions: + pre, post = None, None + + self.__precondition = pre + self.__postcondition = post + +def quickSort(arr): + less = [] + pivotList = [] + more = [] + if len(arr) <= 1: + return arr + else: + pivot = arr[0] + for i in arr: + if i < pivot: + less.append(i) + elif i > pivot: + more.append(i) + else: + pivotList.append(i) + less = quickSort(less) + more = quickSort(more) + return less + pivotList + more + +a = [4, 65, 2, -31, 0, 99, 83, 782, 1] +a = quickSort(a) diff --git a/.vim/colors/falcon/corpus/ruby.rb b/.vim/colors/falcon/corpus/ruby.rb new file mode 100755 index 0000000..b2a0900 --- /dev/null +++ b/.vim/colors/falcon/corpus/ruby.rb @@ -0,0 +1,37 @@ +require 'active_support' + +module VimColors + class RubyExample + CONSTANT = /^[0-9]+ regex awesomes$/ + + attr_reader :colorscheme + + # TODO: Bacon ipsum dolor sit amet + def initialize(attributes = {}) + @colorscheme = attributes[:colorscheme] + end + + def self.examples + # Bacon ipsum dolor sit amet + ['string', :symbol, true, false, nil, 99.9, 1..2].each do |value| + puts "it appears that #{value.inspect} is a #{value.class}" + end + + {:key1 => :value1, key2: 'value2'}.each do |key, value| + puts "the #{key.inspect} key has a value of #{value.inspect}" + end + + %w[One Two Three].each { |number| puts number } + end + + private + + def heredoc_example + <<-SQL + SELECT * + FROM colorschemes + WHERE background = 'dark' + SQL + end + end +end diff --git a/.vim/colors/falcon/corpus/twig.html.twig b/.vim/colors/falcon/corpus/twig.html.twig new file mode 100755 index 0000000..0f5ba83 --- /dev/null +++ b/.vim/colors/falcon/corpus/twig.html.twig @@ -0,0 +1,87 @@ +{# +/** + * @file + * Theme override to display a single page. + * + * The doctype, html, head and body tags are not in this template. Instead they + * can be found in the html.html.twig template in this directory. + * + * Available variables: + * + * General utility variables: + * - base_path: The base URL path of the Drupal installation. Will usually be + * "/" unless you have installed Drupal in a sub-directory. + * - is_front: A flag indicating if the current page is the front page. + * - logged_in: A flag indicating if the user is registered and signed in. + * - is_admin: A flag indicating if the user has permission to access + * administration pages. + * + * Site identity: + * - front_page: The URL of the front page. Use this instead of base_path when + * linking to the front page. This includes the language domain or prefix. + * + * Page content (in order of occurrence in the default page.html.twig): + * - node: Fully loaded node, if there is an automatically-loaded node + * associated with the page and the node ID is the second argument in the + * page's path (e.g. node/12345 and node/12345/revisions, but not + * comment/reply/12345). + * + * Regions: + * - page.header: Items for the header region. + * - page.primary_menu: Items for the primary menu region. + * - page.secondary_menu: Items for the secondary menu region. + * - page.highlighted: Items for the highlighted content region. + * - page.help: Dynamic help text, mostly for admin pages. + * - page.content: The main content of the current page. + * - page.sidebar_first: Items for the first sidebar. + * - page.sidebar_second: Items for the second sidebar. + * - page.footer: Items for the footer region. + * - page.breadcrumb: Items for the breadcrumb region. + * + * @see template_preprocess_page() + * @see html.html.twig + */ +#} +
+ +
+ {{ page.header }} +
+ + {{ page.primary_menu }} + {{ page.secondary_menu }} + + {{ page.breadcrumb }} + + {{ page.highlighted }} + + {{ page.help }} + +
+ {# link is in html.html.twig #} + +
+ {{ page.content }} +
{# /.layout-content #} + + {% if page.sidebar_first %} + + {% endif %} + + {% if page.sidebar_second %} + + {% endif %} + +
+ + {% if page.footer %} +
+ {{ page.footer }} +
+ {% endif %} + +
{# /.layout-container #} diff --git a/.vim/colors/falcon/corpus/xml.xml b/.vim/colors/falcon/corpus/xml.xml new file mode 100755 index 0000000..4cff2ae --- /dev/null +++ b/.vim/colors/falcon/corpus/xml.xml @@ -0,0 +1,24 @@ + + + + + ./tests/Behat/Gherkin/ + + + + + + ./src/Behat/Gherkin/ + + + diff --git a/.vim/colors/falcon/estilo.yml b/.vim/colors/falcon/estilo.yml new file mode 100755 index 0000000..38c91e1 --- /dev/null +++ b/.vim/colors/falcon/estilo.yml @@ -0,0 +1,18 @@ +name: 'Falcon' +version: '0.0.8' +license: 'MIT' +author: 'Michael Welford' +url: 'https://github.com/fenetikm/falcon' +description: 'A dark, easy on the eyes, fiery gray bluish kinda colour scheme' +colorschemes: + - name: falcon + background: dark + palette: falcon +lightline: + - name: falcon + palette: falcon + style: falcon +airline: + - name: falcon + palette: falcon + style: falcon diff --git a/.vim/colors/falcon/estilo/addons/nvim-term.yml b/.vim/colors/falcon/estilo/addons/nvim-term.yml new file mode 100755 index 0000000..ebbf21e --- /dev/null +++ b/.vim/colors/falcon/estilo/addons/nvim-term.yml @@ -0,0 +1,18 @@ +color_foreground: 'normal_gray' +color_background: 'bg' +color_0: 'black' +color_1: 'red' +color_2: 'green' +color_3: 'yellow' +color_4: 'purple' +color_5: 'orange' +color_6: 'cyan' +color_7: 'normal_gray' +color_8: 'bg' +color_9: 'bright_red' +color_10: 'bright_green' +color_11: 'bright_yellow' +color_12: 'blue_gray' +color_13: 'bright_orange' +color_14: 'bright_cyan' +color_15: 'white' diff --git a/.vim/colors/falcon/estilo/addons/term.yml b/.vim/colors/falcon/estilo/addons/term.yml new file mode 100755 index 0000000..4bc85c8 --- /dev/null +++ b/.vim/colors/falcon/estilo/addons/term.yml @@ -0,0 +1,16 @@ +0: 'black' +1: 'red' +2: 'green' +3: 'yellow' +4: 'purple' +5: 'orange' +6: 'cyan' +7: 'normal_gray' +8: 'bg' +9: 'bright_red' +10: 'bright_green' +11: 'bright_yellow' +12: 'blue_gray' +13: 'bright_orange' +14: 'bright_cyan' +15: 'white' diff --git a/.vim/colors/falcon/estilo/airline/falcon.yml b/.vim/colors/falcon/estilo/airline/falcon.yml new file mode 100755 index 0000000..9c197a4 --- /dev/null +++ b/.vim/colors/falcon/estilo/airline/falcon.yml @@ -0,0 +1,18 @@ +normal1: 'black normal_gray' +normal2: 'normal_gray dark_gray' +normal3: 'mid_gray status' +inactive1: 'mid_dark_gray inactive_status' +inactive2: 'mid_dark_gray inactive_status' +inactive3: 'mid_dark_gray inactive_status' +insert1: 'black red' +insert2: 'normal_gray dark_gray' +insert3: 'normal_gray status' +replace1: 'black orange' +replace2: 'normal_gray dark_gray' +replace3: 'normal_gray status' +visual1: 'black yellow' +visual2: 'normal_gray dark_gray' +visual3: 'normal_gray status' +ctrlp1: 'mid_gray dark_gray' +ctrlp2: 'mid_gray dark_gray' +ctrlp3: 'mid_gray dark_gray' diff --git a/.vim/colors/falcon/estilo/lightline/falcon.yml b/.vim/colors/falcon/estilo/lightline/falcon.yml new file mode 100755 index 0000000..260173a --- /dev/null +++ b/.vim/colors/falcon/estilo/lightline/falcon.yml @@ -0,0 +1,30 @@ +normal1: 'black normal_gray' +normal2: 'normal_gray status' +normal3: 'mid_gray dark_gray' +normal4: 'light_gray mid_gray' +normal5: 'black normal_gray' +normalError: 'black red' +inactive1: 'mid_gray dark_gray' +inactive2: 'mid_gray dark_gray' +inactive3: 'mid_gray dark_gray' +inactive4: 'mid_gray dark_gray' +inactive5: 'mid_gray dark_gray' +insert1: 'black red' +insert2: 'normal_gray mid_gray' +insert3: 'normal_gray mid_gray' +insert4: 'normal_gray mid_gray' +insert5: 'black red' +replace1: 'black orange' +replace2: 'normal_gray mid_gray' +replace3: 'normal_gray mid_gray' +replace4: 'normal_gray mid_gray' +replace5: 'black orange' +visual1: 'black yellow' +visual2: 'normal_gray mid_gray' +visual3: 'normal_gray mid_gray' +visual4: 'normal_gray mid_gray' +visual5: 'black yellow' +tablineLeft: 'mid_gray dark_gray' +tablineSelected: 'light_gray dark_gray' +tablineMiddle: 'mid_gray dark_gray' +tablineRight: 'mid_gray dark_gray' diff --git a/.vim/colors/falcon/estilo/palettes/falcon.yml b/.vim/colors/falcon/estilo/palettes/falcon.yml new file mode 100755 index 0000000..937c96c --- /dev/null +++ b/.vim/colors/falcon/estilo/palettes/falcon.yml @@ -0,0 +1,48 @@ +red: '#FF3600' +mid_red: '#a82400' +orange: '#FF761A' +yellow: '#FFC552' +mid_yellow: '#c99c40' +green: '#718E3F' +light_blue_gray: '#C8D0E3' +blue_gray: '#99A4BC' +blue_mid_gray: '#4F4F59' +blue_dark_gray: '#2F2F3A' +blue_dark_gray_alt: '#242430' +blue_darkest_gray: '#171729' +dark_tan: '#a1968a' +tan: '#cfc1b2' +br_tan: '#f0e1ce' +tan_yellow: '#FFD392' +br_yellow: '#FFE8C0' +br_green: '#EAFFC0' +br_blue: '#BFDAFF' +white: '#F8F8FF' +light_gray: '#DFDFE5' +normal_gray: '#B4B4B9' +mid_gray_alt: '#878791' +mid_gray: '#787882' +mid_dark_gray: '#57575E' +dark_gray: '#36363A' +darker_gray: '#212127' +black: '#000004' +bg: '#020221' +bg_alt: '#0A0A29' +inactive_bg: '#151521' +purple_dark_gray: '#3F3A59' +purple: '#635196' +lavender: '#9F97CC' +status: '#28282D' +inactive_status: '#1C1C22' +off_red: '#300E03' +off_blue: '#031630' +off_green: '#203003' +dark_indigo: '#2D1078' +indigo: '#5521D9' +br_indigo: '#8859FF' +cyan: '#34bfa4' +bright_red: '#FF8E78' +bright_green: '#B1BF75' +bright_yellow: '#FFD392' +bright_orange: '#FFB07B' +bright_cyan: '#8BCCBF' diff --git a/.vim/colors/falcon/estilo/syntax/ale.yml b/.vim/colors/falcon/estilo/syntax/ale.yml new file mode 100755 index 0000000..231ab5a --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/ale.yml @@ -0,0 +1,3 @@ +ALEErrorSign: 'red -' +ALEWarningSign: 'orange -' +ALEInfoSign: 'normal_gray -' diff --git a/.vim/colors/falcon/estilo/syntax/aspvbs.yml b/.vim/colors/falcon/estilo/syntax/aspvbs.yml new file mode 100755 index 0000000..34e70af --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/aspvbs.yml @@ -0,0 +1,2 @@ +AspVBSVariableSimple: '@Identifier' +AspVBSStatement: '@Keyword' diff --git a/.vim/colors/falcon/estilo/syntax/base.yml b/.vim/colors/falcon/estilo/syntax/base.yml new file mode 100755 index 0000000..99904cd --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/base.yml @@ -0,0 +1,85 @@ +# BASE UI +ColorColumn: '- inactive_bg' +Conceal: '- -' +Cursor: '- mid_gray' +CursorIM: '' +CursorColumn: '- blue_darkest_gray' +CursorLine: '- blue_dark_gray' +CursorLineNr: 'normal_gray blue_dark_gray' +Directory: 'blue_gray' +DiffAdd: '- off_green' +DiffChange: '- off_blue' +DiffDelete: '- off_red' +DiffText: '- off_green' +ErrorMsg: 'red -' +VertSplit: 'mid_gray -' +Folded: 'mid_gray darker_gray' +FoldColumn: 'mid_gray darker_gray' +SignColumn: 'blue_gray' +IncSearch: 'bg br_blue b' +LineNr: 'mid_dark_gray' +MatchParen: 'br_tan - b' +ModeMsg: '' +MoreMsg: '' +NonText: 'dark_gray bg' +Normal: 'normal_gray bg' +PMenu: 'mid_gray_alt blue_darkest_gray' +PMenuSel: 'black yellow' +PmenuSbar: 'normal_gray' +PmenuThumb: 'light_gray' +Question: 'light_gray' +Search: 'br_blue - bu' +SpecialKey: 'mid_gray' +SpellBad: '- purple_dark_gray u' +SpellLocal: '- purple_dark_gray u' +SpellCap: '- purple_dark_gray c' +SpellRare: '- purple_dark_gray u' +StatusLine: 'mid_gray status' +StatusLineNC: 'mid_gray dark_gray' +TabLine: 'mid_gray dark_gray' +TabLineFill: '- darker_gray' +TabLineSel: 'light_gray -' +Title: 'tan' +Visual: 'light_gray dark_indigo' +VisualNOS: '' +WarningMsg: '' +WildMenu: 'bg yellow' +# BASE SYNTAX +Comment: 'mid_gray - i' +Constant: 'normal_gray - b' +String: 'light_blue_gray' # Constant +Character: '@String' # Constant +Boolean: 'normal_gray - i' # Constant +Number: 'normal_gray' # Constant +Float: '@Number' # Constant +Identifier: 'blue_gray' +Function: 'yellow' # Identifier +Statement: 'blue_gray' +Conditional: 'yellow' # Statement +Repeat: '@Statement' # Statement +Label: '@Statement' # Statement +Operator: 'orange' # Statement +Keyword: 'yellow' # Statement +Exception: '@Statement' # Statement +PreProc: 'tan' +Include: '@PreProc' # PreProc +Define: '@PreProc' # PreProc +Macro: '@PreProc' # PreProc +PreCondit: '@PreProc' # PreProc +Type: 'light_gray -' +StorageClass: '@Type' # Type +Structure: '@Type' # Type +Typedef: '@Type' # Type +Special: 'orange' +SpecialChar: '@Special' # Special +Tag: '@Special' # Special +Delimiter: 'light_gray' # Special +SpecialComment: '@Special' # Special +Debug: '@Special' # Special +Underlined: 'blue_gray - u' +Ignore: '' +Error: '' +Todo: 'bg tan i' +QuickFixLine: 'br_blue dark_gray' +Bold: '- - b' +Italic: '- - i' diff --git a/.vim/colors/falcon/estilo/syntax/blankline.yml b/.vim/colors/falcon/estilo/syntax/blankline.yml new file mode 100755 index 0000000..dab6cbb --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/blankline.yml @@ -0,0 +1,3 @@ +IndentBlanklineChar: 'dark_gray -' +IndentBlanklineIndent1: 'dark_gray -' +IndentBlanklineIndent2: 'blue_mid_gray -' diff --git a/.vim/colors/falcon/estilo/syntax/buftabline.yml b/.vim/colors/falcon/estilo/syntax/buftabline.yml new file mode 100755 index 0000000..a728018 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/buftabline.yml @@ -0,0 +1,4 @@ +BufTabLineCurrent: 'normal_gray mid_gray' +BufTabLineActive: 'light_gray dark_gray' +BufTabLineHidden: 'mid_gray dark_gray' +BufTabLineFill: '- darker_gray' diff --git a/.vim/colors/falcon/estilo/syntax/cleverf.yml b/.vim/colors/falcon/estilo/syntax/cleverf.yml new file mode 100755 index 0000000..8e2bee6 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/cleverf.yml @@ -0,0 +1 @@ +CleverFDefaultLabel: 'br_blue - u' diff --git a/.vim/colors/falcon/estilo/syntax/cpp.yml b/.vim/colors/falcon/estilo/syntax/cpp.yml new file mode 100755 index 0000000..34916bd --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/cpp.yml @@ -0,0 +1,14 @@ +cPreCondit: 'br_blue' +cDefine: '@Define' +cStructure: 'blue_gray' +cStorageClass: '@StorageClass' +cType: '@Type' +cCustomParen: 'orange' +cConditional: 'yellow' +cCustomFunc: 'blue_gray' +cStatement: 'yellow' +cppSTLnamespace: 'light_blue_gray' +cppAccess: 'light_gray' +cAnsiFunction: 'tan' +cRepeat: 'yellow' +cSpecial: 'light_blue_gray - b' diff --git a/.vim/colors/falcon/estilo/syntax/css.yml b/.vim/colors/falcon/estilo/syntax/css.yml new file mode 100755 index 0000000..51f7d5e --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/css.yml @@ -0,0 +1,120 @@ +cssComment: '' # Comment +cssVendor: 'tan' # Comment +cssHacks: '' # Comment +cssTagName: 'blue_gray' # Statement +cssDeprecated: '' # Error +cssSelectorOp: '' # Special +cssSelectorOp2: 'yellow' # Special +cssAttrComma: 'normal_gray' # Special +cssAnimationProp: '' # cssProp +cssBackgroundProp: '' # cssProp +cssBorderProp: '' # cssProp +cssBoxProp: '' # cssProp +cssColorProp: '' # cssProp +cssContentForPagedMediaProp: '' # cssProp +cssDimensionProp: '' # cssProp +cssFlexibleBoxProp: '' # cssProp +cssFontProp: '' # cssProp +cssGeneratedContentProp: '' # cssProp +cssGridProp: '' # cssProp +cssHyerlinkProp: '' # cssProp +cssLineboxProp: '' # cssProp +cssListProp: '' # cssProp +cssMarqueeProp: '' # cssProp +cssMultiColumnProp: '' # cssProp +cssPagedMediaProp: '' # cssProp +cssPositioningProp: '' # cssProp +cssPrintProp: '' # cssProp +cssRubyProp: '' # cssProp +cssSpeechProp: '' # cssProp +cssTableProp: '' # cssProp +cssTextProp: '' # cssProp +cssTransformProp: '' # cssProp +cssTransitionProp: '' # cssProp +cssUIProp: '' # cssProp +cssIEUIProp: '' # cssProp +cssAuralProp: '' # cssProp +cssRenderProp: '' # cssProp +cssMobileTextProp: '' # cssProp +cssAnimationAttr: '' # cssAttr +cssBackgroundAttr: '' # cssAttr +cssBorderAttr: '' # cssAttr +cssBoxAttr: '' # cssAttr +cssContentForPagedMediaAttr: '' # cssAttr +cssDimensionAttr: '' # cssAttr +cssFlexibleBoxAttr: '' # cssAttr +cssFontAttr: '' # cssAttr +cssGeneratedContentAttr: '' # cssAttr +cssGridAttr: '' # cssAttr +cssHyerlinkAttr: '' # cssAttr +cssLineboxAttr: '' # cssAttr +cssListAttr: '' # cssAttr +cssMarginAttr: '' # cssAttr +cssMarqueeAttr: '' # cssAttr +cssMultiColumnAttr: '' # cssAttr +cssPaddingAttr: '' # cssAttr +cssPagedMediaAttr: '' # cssAttr +cssPositioningAttr: '' # cssAttr +cssGradientAttr: '' # cssAttr +cssPrintAttr: '' # cssAttr +cssRubyAttr: '' # cssAttr +cssSpeechAttr: '' # cssAttr +cssTableAttr: '' # cssAttr +cssTextAttr: '' # cssAttr +cssTransformAttr: '' # cssAttr +cssTransitionAttr: '' # cssAttr +cssUIAttr: '' # cssAttr +cssIEUIAttr: '' # cssAttr +cssAuralAttr: '' # cssAttr +cssRenderAttr: '' # cssAttr +cssCommonAttr: '' # cssAttr +cssPseudoClassId: '' # PreProc +cssPseudoClassLang: '' # Constant +cssValueLength: '' # Number +cssValueInteger: '' # Number +cssValueNumber: '' # Number +cssValueAngle: '' # Number +cssValueTime: '' # Number +cssValueFrequency: '' # Number +cssFunction: '@Function' # Constant +cssURL: '' # String +cssFunctionName: '' # Function +cssFunctionComma: '' # Function +cssColor: '' # Constant +cssIdentifier: 'normal_gray' # Function +cssInclude: 'normal_gray' # Include +cssIncludeKeyword: 'tan' # atKeyword +cssImportant: 'red - b' # Special +cssBraces: '@Delimiter' # Function +cssBraceError: '' # Error +cssError: '' # Error +cssUnicodeEscape: '' # Special +cssStringQQ: '' # String +cssStringQ: '' # String +cssAttributeSelector: 'normal_gray' # String +cssMedia: '' # atKeyword +cssMediaType: 'yellow - i' # Special +cssMediaComma: '' # Normal +cssMediaKeyword: 'yellow' # Statement +cssMediaProp: '' # cssProp +cssMediaAttr: '' # cssAttr +cssPage: '' # atKeyword +cssPagePseudo: '' # PreProc +cssPageMargin: '' # atKeyword +cssPageProp: '' # cssProp +cssKeyFrame: '' # atKeyword +cssKeyFrameSelector: '' # Constant +cssFontDescriptor: 'tan' # Special +cssFontDescriptorFunction: '' # Constant +cssFontDescriptorProp: '' # cssProp +cssFontDescriptorAttr: '' # cssAttr +cssUnicodeRange: '' # Constant +cssClassName: 'normal_gray' # Function +cssClassNameDot: 'yellow' # Function +cssProp: 'normal_gray' # StorageClass +cssAttr: 'light_gray' # Constant +cssUnitDecorators: '' # Number +cssNoise: 'light_gray' # Noise +atKeyword: '' # PreProc +cssPseudoClass: 'light_gray' +cssAtRuleLogical: 'orange' diff --git a/.vim/colors/falcon/estilo/syntax/custom.yml b/.vim/colors/falcon/estilo/syntax/custom.yml new file mode 100755 index 0000000..d040a7a --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/custom.yml @@ -0,0 +1,2 @@ +Done: 'green -' +Partial: 'yellow -' diff --git a/.vim/colors/falcon/estilo/syntax/diff.yml b/.vim/colors/falcon/estilo/syntax/diff.yml new file mode 100755 index 0000000..895f847 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/diff.yml @@ -0,0 +1,7 @@ +# git commit messages +diffAdded: 'light_gray off_green' +diffRemoved: 'light_gray off_red' +diffFile: '@Title' +diffLine: 'light_blue_gray' +diffSubname: 'light_gray' +# vimdiff uses DiffAdd etc. in base.yml diff --git a/.vim/colors/falcon/estilo/syntax/docker.yml b/.vim/colors/falcon/estilo/syntax/docker.yml new file mode 100755 index 0000000..5a0580e --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/docker.yml @@ -0,0 +1 @@ +dockercomposeKeywords: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/elm.yml b/.vim/colors/falcon/estilo/syntax/elm.yml new file mode 100755 index 0000000..4dead7d --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/elm.yml @@ -0,0 +1,4 @@ +elmTypeDef: '@Type' +elmType: 'light_gray' +elmTopLevelDecl: 'tan' +elmAlias: '@Identifier' diff --git a/.vim/colors/falcon/estilo/syntax/fugitive.yml b/.vim/colors/falcon/estilo/syntax/fugitive.yml new file mode 100755 index 0000000..4bc1bb5 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/fugitive.yml @@ -0,0 +1,14 @@ +FugitiveblameBoundary: '' # Keyword +FugitiveblameHash: '' # Identifier +FugitiveblameUncommitted: '' # Ignore +FugitiveblameTime: '' # PreProc +FugitiveblameLineNumber: '' # Number +FugitiveblameOriginalFile: '' # String +FugitiveblameOriginalLineNumber: '' # +FugitiveblameShort: '' # FugitiveblameDelimiter +FugitiveblameDelimiter: '' # Delimiter +FugitiveblameNotCommittedYet: '' # Comment +fugitiveSymbolicRef: 'blue_gray' +fugitiveHeader: 'yellow' +fugitiveHunk: 'normal_gray' +fugitiveModifier: 'orange' diff --git a/.vim/colors/falcon/estilo/syntax/fzf.yml b/.vim/colors/falcon/estilo/syntax/fzf.yml new file mode 100755 index 0000000..1d321ce --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/fzf.yml @@ -0,0 +1,3 @@ +fzf1: 'yellow dark_gray' +fzf2: 'orange dark_gray' +fzf3: 'orange dark_gray' diff --git a/.vim/colors/falcon/estilo/syntax/gitcommit.yml b/.vim/colors/falcon/estilo/syntax/gitcommit.yml new file mode 100755 index 0000000..1afc818 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/gitcommit.yml @@ -0,0 +1,26 @@ +gitcommitSummary: 'normal_gray' # Keyword +gitcommitComment: '' # Comment +gitcommitUntracked: '' # gitcommitComment +gitcommitDiscarded: '' # gitcommitComment +gitcommitSelected: '' # gitcommitComment +gitcommitUnmerged: '' # gitcommitComment +gitcommitOnBranch: '' # Comment +gitcommitBranch: 'normal_gray' # Special +gitcommitNoBranch: '' # gitCommitBranch +gitcommitDiscardedType: 'blue_gray' # gitcommitType +gitcommitSelectedType: 'green' # gitcommitType +gitcommitUnmergedType: '' # gitcommitType +gitcommitType: '' # Type +gitcommitNoChanges: '' # gitcommitHeader +gitcommitHeader: '' # PreProc +gitcommitUntrackedFile: '' # gitcommitFile +gitcommitDiscardedFile: 'light_gray' # gitcommitFile +gitcommitSelectedFile: 'normal_gray' # gitcommitFile +gitcommitUnmergedFile: '' # gitcommitFile +gitcommitFile: '' # Constant +gitcommitDiscardedArrow: '' # gitcommitArrow +gitcommitSelectedArrow: '' # gitcommitArrow +gitcommitUnmergedArrow: '' # gitcommitArrow +gitcommitArrow: '' # gitcommitComment +gitcommitOverflow: '' # none +gitcommitBlank: '' # Error diff --git a/.vim/colors/falcon/estilo/syntax/gitconfig.yml b/.vim/colors/falcon/estilo/syntax/gitconfig.yml new file mode 100755 index 0000000..b0c23b5 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/gitconfig.yml @@ -0,0 +1,2 @@ +gitconfigSection: 'yellow' +gitconfigVariable: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/gitsigns.yml b/.vim/colors/falcon/estilo/syntax/gitsigns.yml new file mode 100755 index 0000000..89ee290 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/gitsigns.yml @@ -0,0 +1,5 @@ +# GitGutter airblade/vim-gitgutter +GitSignsAdd: 'green -' +GitSignsChange: 'yellow -' +GitSignsDelete: 'red -' +GitSignsChangeDelete: 'orange -' diff --git a/.vim/colors/falcon/estilo/syntax/go.yml b/.vim/colors/falcon/estilo/syntax/go.yml new file mode 100755 index 0000000..598a1cf --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/go.yml @@ -0,0 +1,37 @@ +goDirective: '' # Statement +goDeclaration: '' # Keyword +goDeclType: '' # Keyword +goStatement: '' # Statement +goConditional: '' # Conditional +goLabel: 'yellow' # Label +goRepeat: 'yellow' # Repeat +goType: '' # Type +goSignedInts: '' # Type +goUnsignedInts: '' # Type +goFloats: '' # Type +goComplexes: '' # Type +goBuiltins: 'yellow' # Keyword +goConstants: '' # Keyword +goComment: '' # Comment +goTodo: '' # Todo +goEscapeOctal: '' # goSpecialString +goEscapeC: '' # goSpecialString +goEscapeX: '' # goSpecialString +goEscapeU: '' # goSpecialString +goEscapeBigU: '' # goSpecialString +goSpecialString: '' # Special +goEscapeError: '' # Error +goString: '' # String +goRawString: '' # String +goCharacter: '' # Character +goDecimalInt: '' # Integer +goHexadecimalInt: '' # Integer +goOctalInt: '' # Integer +Integer: '' # Number +goFloat: '' # Float +goImaginary: '' # Number +goExtraType: '' # Type +goSpaceError: '' # Error +goVar: 'blue_gray' +goPackage: 'tan' +goImport: '@goPackage' diff --git a/.vim/colors/falcon/estilo/syntax/graphql.yml b/.vim/colors/falcon/estilo/syntax/graphql.yml new file mode 100755 index 0000000..5f538e6 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/graphql.yml @@ -0,0 +1,5 @@ +graphqlVariable: 'blue_gray' +graphqlStructure: 'tan' +graphqlName: 'normal_gray' +graphqlKeyword: 'yellow' +graphqlOperator: 'orange' diff --git a/.vim/colors/falcon/estilo/syntax/help.yml b/.vim/colors/falcon/estilo/syntax/help.yml new file mode 100755 index 0000000..f782544 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/help.yml @@ -0,0 +1,49 @@ +helpIgnore: '' # Ignore +helpHyperTextJump: 'blue_gray - u' # Identifier +helpBar: '' # Ignore +helpBacktick: '' # Ignore +helpStar: 'br_blue' # Ignore +helpHyperTextEntry: '' # String +helpHeadline: 'yellow' # Statement +helpHeader: '' # PreProc +helpSectionDelim: 'tan' # PreProc +helpVim: '' # Identifier +helpCommand: '' # Comment +helpExample: '' # Comment +helpOption: 'tan' # Type +helpSpecial: '' # Special +helpNote: '' # Todo +helpComment: '' # Comment +helpConstant: '' # Constant +helpString: '' # String +helpCharacter: '' # Character +helpNumber: '' # Number +helpBoolean: '' # Boolean +helpFloat: '' # Float +helpIdentifier: '' # Identifier +helpFunction: '' # Function +helpStatement: '' # Statement +helpConditional: '' # Conditional +helpRepeat: '' # Repeat +helpLabel: '' # Label +helpOperator: '' # Operator +helpKeyword: '' # Keyword +helpException: '' # Exception +helpPreProc: '' # PreProc +helpInclude: '' # Include +helpDefine: '' # Define +helpMacro: '' # Macro +helpPreCondit: '' # PreCondit +helpType: '' # Type +helpStorageClass: '' # StorageClass +helpStructure: '' # Structure +helpTypedef: '' # Typedef +helpSpecialChar: '' # SpecialChar +helpTag: '' # Tag +helpDelimiter: '' # Delimiter +helpSpecialComment: '' # SpecialComment +helpDebug: '' # Debug +helpUnderlined: '' # Underlined +helpError: '' # Error +helpTodo: '' # Todo +helpURL: '' # String diff --git a/.vim/colors/falcon/estilo/syntax/highlightedyank.yml b/.vim/colors/falcon/estilo/syntax/highlightedyank.yml new file mode 100755 index 0000000..e65e970 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/highlightedyank.yml @@ -0,0 +1 @@ +HighlightedyankRegion: 'white -' diff --git a/.vim/colors/falcon/estilo/syntax/html.yml b/.vim/colors/falcon/estilo/syntax/html.yml new file mode 100755 index 0000000..fd75955 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/html.yml @@ -0,0 +1,44 @@ +htmlTag: 'normal_gray' # Function +htmlEndTag: '@Delimiter' # Identifier +htmlArg: 'blue_gray' # Type +htmlTagName: '@Number' # htmlStatement +htmlSpecialTagName: 'yellow' # Exception +htmlValue: '' # String +htmlH1: 'yellow' # Title +htmlH2: 'tan' # htmlH1 +htmlH3: 'tan' # htmlH2 +htmlH4: 'tan' # htmlH3 +htmlH5: 'tan' # htmlH4 +htmlH6: 'tan' # htmlH5 +htmlHead: '' # PreProc +htmlTitle: 'normal_gray - b' # Title +htmlBoldItalicUnderline: '' # htmlBoldUnderlineItalic +htmlUnderlineBold: '' # htmlBoldUnderline +htmlUnderlineItalicBold: '' # htmlBoldUnderlineItalic +htmlUnderlineBoldItalic: '' # htmlBoldUnderlineItalic +htmlItalicUnderline: '' # htmlUnderlineItalic +htmlItalicBold: '' # htmlBoldItalic +htmlItalicBoldUnderline: '' # htmlBoldUnderlineItalic +htmlItalicUnderlineBold: '' # htmlBoldUnderlineItalic +htmlLink: '' # Underlined +htmlLeadingSpace: '' # None +htmlPreStmt: '' # PreProc +htmlPreError: '' # Error +htmlPreProc: '' # PreProc +htmlPreAttr: '' # String +htmlPreProcAttrName: '' # PreProc +htmlPreProcAttrError: '' # Error +htmlSpecial: '' # Special +htmlSpecialChar: 'tan' # Special +htmlString: '' # String +htmlStatement: '' # Statement +htmlComment: '' # Comment +htmlCommentPart: '' # Comment +htmlCommentError: '' # htmlError +htmlTagError: '' # htmlError +htmlEvent: '' # javaScript +htmlError: '' # Error +javaScript: '' # Special +javaScriptExpression: '' # javaScript +htmlCssStyleComment: '' # Comment +htmlCssDefinition: '' # Special diff --git a/.vim/colors/falcon/estilo/syntax/indent.yml b/.vim/colors/falcon/estilo/syntax/indent.yml new file mode 100755 index 0000000..72de954 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/indent.yml @@ -0,0 +1,2 @@ +IndentGuidesOdd: '- dark_gray' +IndentGuidesEven: '- darker_gray' diff --git a/.vim/colors/falcon/estilo/syntax/java.yml b/.vim/colors/falcon/estilo/syntax/java.yml new file mode 100755 index 0000000..369ee31 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/java.yml @@ -0,0 +1,2 @@ +javaRepeat: 'yellow' +javaStatement: '@javaRepeat' diff --git a/.vim/colors/falcon/estilo/syntax/javascript.yml b/.vim/colors/falcon/estilo/syntax/javascript.yml new file mode 100755 index 0000000..b7cd6d0 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/javascript.yml @@ -0,0 +1,75 @@ +javaScriptComment: '' # Comment +javaScriptLineComment: '' # Comment +javaScriptCommentTodo: '' # Todo +javaScriptSpecial: '' # Special +javaScriptStringS: '' # String +javaScriptStringD: '' # String +javaScriptCharacter: '' # Character +javaScriptSpecialCharacter: '' # javaScriptSpecial +javaScriptNumber: '' # javaScriptValue +javaScriptConditional: '' # Conditional +javaScriptRepeat: '' # Repeat +javaScriptBranch: '' # Conditional +javaScriptOperator: '' # Operator +javaScriptType: '' # Type +javaScriptStatement: '' # Statement +javaScriptFunction: '' # Function +javaScriptBraces: 'orange' # Function +javaScriptError: '' # Error +javaScriptParensError: '' # Error +javaScriptNull: 'normal_gray - i' # Keyword +javaScriptBoolean: '' # Boolean +javaScriptRegexpString: '' # String +javaScriptIdentifier: '' # Identifier +javaScriptLabel: '' # Label +javaScriptException: '' # Exception +javaScriptMessage: '' # Keyword +javaScriptGlobal: 'lavender - b' # Keyword +javaScriptMember: '' # Keyword +javaScriptDeprecated: '' # Exception +javaScriptReserved: '' # Keyword +javaScriptDebug: '' # Debug +javaScriptConstant: '' # Label +jsBrackets: '@Delimiter' +jsClassBraces: '@jsBrackets' +jsBraces: '@jsBrackets' +jsObjectBraces: '@jsBrackets' +jsParens: '@jsBrackets' +jsObjectKey: 'blue_gray' +jsFuncBraces: '@jsBrackets' +jsFuncParens: '@jsBrackets' +jsIfElseBraces: '@jsBrackets' +jsFuncArgs: 'blue_gray' +jsExtendsKeyword: 'yellow' +jsArrowFunction: '@Operator' +jsFunction: 'yellow' +jsRepeat: '@jsFunction' +jsReturn: 'yellow' +jsClassDefinition: 'normal_gray' +jsClassProperty: 'normal_gray' +jsClassKeyword: 'yellow' +jsClassFuncName: 'normal_gray' +jsFuncName: 'normal_gray' +jsNull: 'normal_gray - i' +jsStorageClass: '@StorageClass' +jsObjectSeparator: 'normal_gray' +jsObjectValue: 'blue_gray' +jsExportDefault: 'blue_gray' +jsRegexpCharClass: 'orange' +jsTemplateBraces: 'orange' +jsThis: 'blue_gray - b' +jsFuncCall: 'tan' +jsObjectProp: 'normal_gray' +jsConditional: 'yellow' +jsVariableDef: 'blue_gray' +jsFuncBlock: 'white' +jsTry: 'yellow' +jsCatch: '@jsTry' +jsTryCatchBraces: 'orange' +jsGlobalObjects: 'lavender - b' +jsParen: 'blue_gray' +jsParenCatch: '@jsParen' +jsParenIfElse: '@jsParen' +jsAsyncKeyword: 'tan' +jsForAwait: '@jsAsyncKeyword' +jsGlobalNodeObjects: 'tan' diff --git a/.vim/colors/falcon/estilo/syntax/json.yml b/.vim/colors/falcon/estilo/syntax/json.yml new file mode 100755 index 0000000..c7f79b0 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/json.yml @@ -0,0 +1,20 @@ +jsonPadding: '' # Operator +jsonString: '' # String +jsonTest: '' # Label +jsonEscape: '' # Special +jsonNumber: '' # Number +jsonBraces: '' # Delimiter +jsonNull: '' # Function +jsonBoolean: 'red' # Boolean +jsonKeyword: '' # Label +jsonNumError: '' # Error +jsonCommentError: '' # Error +jsonSemicolonError: '' # Error +jsonTrailingCommaError: '' # Error +jsonMissingCommaError: '' # Error +jsonStringSQError: '' # Error +jsonNoQuotesError: '' # Error +jsonTripleQuotesError: '' # Error +jsonQuote: '' # Quote +jsonNoise: '' # Noise +jsonKeywordMatch: '@Delimiter' diff --git a/.vim/colors/falcon/estilo/syntax/jsx.yml b/.vim/colors/falcon/estilo/syntax/jsx.yml new file mode 100755 index 0000000..b67c758 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/jsx.yml @@ -0,0 +1,4 @@ +xmlEqual: 'yellow' +xmlEndTag: 'yellow' +xmlTagN: 'blue_gray' +xmlTagName: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/lsp.yml b/.vim/colors/falcon/estilo/syntax/lsp.yml new file mode 100755 index 0000000..60b610c --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/lsp.yml @@ -0,0 +1,15 @@ +LspDiagnosticsDefaultError: 'mid_red - ' +LspDiagnosticsDefaultWarning: 'mid_yellow -' +LspDiagnosticsDefaultInformation: 'mid_gray - ' +LspDiagnosticsDefaultHint: 'dark_tan -' +LspReferenceRead: '- - u' +LspReferenceText: '- - u' +LspReferenceWrite: '- - u' +LspDiagnosticsVirtualTextError: 'mid_red - i' +LspDiagnosticsVirtualTextWarning: 'mid_yellow - i' +LspDiagnosticsVirtualTextHint: 'dark_tan - i' +LspDiagnosticsVirtualTextInformation: 'mid_gray - i' +LspDiagnosticsUnderlineError: '- - c mid_red' +LspDiagnosticsUnderlineWarning: '- - c mid_yellow' +LspDiagnosticsUnderlineHint: '- - c dark_tan' +LspDiagnosticsUnderlineInformation: '- - c mid_gray' diff --git a/.vim/colors/falcon/estilo/syntax/lua.yml b/.vim/colors/falcon/estilo/syntax/lua.yml new file mode 100755 index 0000000..f03ea78 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/lua.yml @@ -0,0 +1,12 @@ +luaFuncKeyword: 'yellow' +luaFuncTable: 'normal_gray' +luaFuncName: 'normal_gray' +luaFuncCall: 'normal_gray' +luaFuncArgName: 'blue_gray' +luaCond: 'yellow' +luaStatement: '@luaCond' +luaLocal: '@Constant' +luaFuncParens: '@Delimiter' +luaParens: '@luaFuncParens' +luaBraces: '@luaFuncParens' +luaDocTag: 'tan - i' diff --git a/.vim/colors/falcon/estilo/syntax/markdown.yml b/.vim/colors/falcon/estilo/syntax/markdown.yml new file mode 100755 index 0000000..d3d2db0 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/markdown.yml @@ -0,0 +1,53 @@ +markdownH1: '' # htmlH1 +markdownH2: '' # htmlH2 +markdownH3: '' # htmlH3 +markdownH4: '' # htmlH4 +markdownH5: '' # htmlH5 +markdownH6: '' # htmlH6 +markdownHeadingRule: '' # markdownRule +markdownHeadingDelimiter: '@Delimiter' # Delimiter +markdownItemDelimiter: '@Delimiter' +markdownInlineDelimiter: 'tan' +markdownOrderedListMarker: '@Delimiter' # markdownListMarker +markdownListMarker: '@Delimiter' # htmlTagName +markdownBlockquote: '' # Comment +markdownRule: '' # PreProc +markdownLinkText: '' # htmlLink +markdownLinkTextDelimiter: '@Delimiter' +markdownIdDeclaration: '' # Typedef +markdownId: '' # Type +markdownAutomaticLink: '' # markdownUrl +markdownUrl: 'blue_gray - u' # Float +markdownUrlTitle: '' # String +markdownIdDelimiter: '' # markdownLinkDelimiter +markdownUrlDelimiter: '' # htmlTag +markdownUrlTitleDelimiter: '' # Delimiter +markdownItalic: '' # htmlItalic +markdownBold: '' # htmlBold +markdownBoldItalic: '' # htmlBoldItalic +markdownCodeDelimiter: 'orange' # Delimiter +markdownCode: 'mid_gray_alt' +markdownEscape: '' # Special +markdownError: '@SpellBad' # Error +markdownXmlElement: 'mid_gray' + +htmlH1: 'br_blue - b' +htmlH2: 'br_blue -' +htmlH3: '@htmlH2' +htmlH4: '@htmlH2' +htmlH5: '@htmlH2' +htmlH6: '@htmlH2' +mkdLink: '@Underlined' +mkdURL: 'blue_gray - u' +mkdInlineURL: 'blue_gray - u' +mkdBold: '- - b' +htmlBold: '- - b' +mkdListItem: '@Delimiter' +htmlItalic: '- - i' +mkdCode: 'mid_gray_alt' +mkdCodeDelimiter: 'orange' +mkdHeading: '@Delimiter' + +# These are used when running Neovim health checks. +healthSuccess: 'bg green' +healthError: 'bg red' diff --git a/.vim/colors/falcon/estilo/syntax/neovim.yml b/.vim/colors/falcon/estilo/syntax/neovim.yml new file mode 100755 index 0000000..a3e3c60 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/neovim.yml @@ -0,0 +1,2 @@ +NormalFloat: '- blue_dark_gray' +NormalFloatAlt: '- blue_dark_gray_alt' diff --git a/.vim/colors/falcon/estilo/syntax/nerdtree.yml b/.vim/colors/falcon/estilo/syntax/nerdtree.yml new file mode 100755 index 0000000..414e51f --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/nerdtree.yml @@ -0,0 +1,27 @@ +NERDTreePart: '' # Special +NERDTreePartFile: '' # Type +NERDTreeExecFile: '' # Title +NERDTreeDirSlash: '' # Identifier +NERDTreeBookmarksHeader: '' # statement +NERDTreeBookmarksLeader: '' # ignore +NERDTreeBookmarkName: '' # Identifier +NERDTreeBookmark: '' # normal +NERDTreeHelp: '' # String +NERDTreeHelpKey: '' # Identifier +NERDTreeHelpCommand: '' # Identifier +NERDTreeHelpTitle: '' # Macro +NERDTreeToggleOn: '' # Question +NERDTreeToggleOff: '' # WarningMsg +NERDTreeLinkTarget: '' # Type +NERDTreeLinkFile: '' # Macro +NERDTreeLinkDir: '' # Macro +NERDTreeDir: '' # Directory +NERDTreeUp: '' # Directory +NERDTreeFile: '' # Normal +NERDTreeCWD: 'yellow' # Statement +NERDTreeOpenable: 'light_blue_gray' # Title +NERDTreeClosable: 'light_blue_gray' # Title +NERDTreeIgnore: '' # ignore +NERDTreeRO: '' # WarningMsg +NERDTreeFlags: 'light_blue_gray' # Number +NERDTreeGitStatusDirDirty: 'red' diff --git a/.vim/colors/falcon/estilo/syntax/netrw.yml b/.vim/colors/falcon/estilo/syntax/netrw.yml new file mode 100755 index 0000000..0d24bc7 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/netrw.yml @@ -0,0 +1 @@ +netrwClassify: 'normal_gray' diff --git a/.vim/colors/falcon/estilo/syntax/nvim-cmp.yml b/.vim/colors/falcon/estilo/syntax/nvim-cmp.yml new file mode 100755 index 0000000..56d686c --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/nvim-cmp.yml @@ -0,0 +1,6 @@ +CmpItemAbbr: 'mid_gray_alt' +CmpItemAbbrDeprecated: 'tan' +CmpItemAbbrMatch: 'light_gray' +CmpItemAbbrMatchFuzzy: 'light_gray' +CmpItemKind: 'mid_gray' +CmpItemMenu: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/nvim-tree.yml b/.vim/colors/falcon/estilo/syntax/nvim-tree.yml new file mode 100755 index 0000000..d7a20f5 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/nvim-tree.yml @@ -0,0 +1,34 @@ +NvimTreeSymlink: '' +NvimTreeFolderName: 'blue_gray' +NvimTreeRootFolder: 'light_blue_gray' +NvimTreeFolderIcon: 'light_blue_gray' +NvimTreeEmptyFolderName: 'blue_gray' +NvimTreeOpenedFolderName: 'light_gray' +NvimTreeOpenedFile: 'br_blue - u' +NvimTreeExecFile: '' +NvimTreeSpecialFile: '' +NvimTreeImageFile: '' +NvimTreeMarkdownFile: '' +NvimTreeIndentMarker: '' +NvimTreeLspDiagnostics: '' +NvimTreeLicenseIcon: '' +NvimTreeYamlIcon: '' +NvimTreeTomlIcon: '' +NvimTreeGitignoreIcon: '' +NvimTreeJsonIcon: '' +NvimTreeLuaIcon: '' +NvimTreePythonIcon: '' +NvimTreeShellIcon: '' +NvimTreeJavascriptIcon: '' +NvimTreeCIcon: '' +NvimTreeReactIcon: '' +NvimTreeHtmlIcon: '' +NvimTreeRustIcon: '' +NvimTreeVimIcon: '' +NvimTreeTypescriptIcon: '' +NvimTreeGitDirty: 'orange' +NvimTreeGitStaged: 'orange' +NvimTreeGitMerge: 'yellow' +NvimTreeGitRenamed: 'yellow' +NvimTreeGitNew: 'green' +NvimTreeGitDeleted: 'red' diff --git a/.vim/colors/falcon/estilo/syntax/php.yml b/.vim/colors/falcon/estilo/syntax/php.yml new file mode 100755 index 0000000..1024ffc --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/php.yml @@ -0,0 +1,63 @@ +phpConstant: '' # Constant +phpCoreConstant: '' # Constant +phpComment: '' # Comment +phpCommentTitle: 'mid_gray_alt - i' +phpDocTags: 'dark_tan - i' # PreProc +phpDocCustomTags: 'br_blue' # Type +phpDocNamespaceSeparator: '@Comment' +phpUseNamespaceSeparator: 'light_gray -' +phpException: '' # Exception +phpBoolean: '@Boolean' # Boolean +phpStorageClass: 'orange' # StorageClass +phpClasses: 'light_gray' +phpStaticClasses: 'normal_gray - b' +phpClassImplements: 'normal_gray - i' +phpClassExtends: '@phpClassImplements' +phpSCKeyword: '' # StorageClass +phpFCKeyword: '' # Define +phpStructure: 'blue_gray - b' # Structure +phpStringSingle: '' # String +phpStringDouble: '' # String +phpBacktick: '' # String +phpNumber: '' # Number +phpFloat: '' # Float +phpMethod: 'normal_gray' # Function +phpFunctions: 'tan' # Function +phpBaselib: '' # Function +phpRepeat: 'yellow' # Repeat +phpConditional: '' # Conditional +phpLabel: '' # Label +phpStatement: '' # Statement +phpKeyword: '@Keyword' # Statement +phpType: '@Type' # Type +phpInclude: '' # Include +phpDefine: '' # Define +phpBackslashSequences: '' # SpecialChar +phpBackslashDoubleQuote: '' # SpecialChar +phpBackslashSingleQuote: '' # SpecialChar +phpParent: '@Delimiter' # Delimiter +phpBrackets: '' # Delimiter +phpIdentifierConst: '' # Delimiter +phpParentError: '' # Error +phpOctalError: '' # Error +phpInterpSimpleError: '' # Error +phpInterpBogusDollarCurley: '' # Error +phpInterpDollarCurly1: '' # Error +phpInterpDollarCurly2: '' # Error +phpInterpSimpleBracketsInner: '' # String +phpInterpSimpleCurly: '' # Delimiter +phpInterpVarname: '' # Identifier +phpTodo: '' # Todo +phpDocTodo: '' # Todo +phpMemberSelector: 'light_gray' # Structure +phpIntVar: '' # Identifier +phpEnvVar: '' # Identifier +phpOperator: '@Operator' # Operator +phpVarSelector: 'light_gray' # Operator +phpRelation: '' # Operator +phpIdentifier: '@Identifier' # Identifier +phpIdentifierSimply: '' # Identifier +phpStringDelimiter: 'light_gray' +phpSuperglobals: 'lavender - b' +phpSpecialChar: 'blue_gray - b' +phpNullValue: '@Boolean' diff --git a/.vim/colors/falcon/estilo/syntax/plug.yml b/.vim/colors/falcon/estilo/syntax/plug.yml new file mode 100755 index 0000000..4391d0e --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/plug.yml @@ -0,0 +1,4 @@ +plugDeleted: 'red' +plugBracket: 'orange' +plug1: 'tan' +plug2: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/python.yml b/.vim/colors/falcon/estilo/syntax/python.yml new file mode 100755 index 0000000..2eb1c86 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/python.yml @@ -0,0 +1,26 @@ +pythonStatement: 'yellow' # Statement +pythonConditional: '' # Conditional +pythonRepeat: 'yellow' # Repeat +pythonOperator: '' # Operator +pythonException: '' # Exception +pythonInclude: '' # Include +pythonDecorator: '' # Define +pythonFunction: 'normal_gray' # Function +pythonComment: '' # Comment +pythonTodo: '' # Todo +pythonString: '' # String +pythonRawString: '' # String +pythonQuotes: '' # String +pythonTripleQuotes: '' # pythonQuotes +pythonEscape: '' # Special +pythonNumber: '' # Number +pythonBuiltin: '' # Function +pythonExceptions: '' # Structure +pythonSpaceError: '' # Error +pythonDoctest: '' # Special +pythonDoctestValue: '' # Define +pythonExClass: 'tan' +pythonBuiltinObj: 'yellow' +pythonDot: 'orange' +pythonBuiltinFunc: 'tan' +pythonNone: '@Boolean' diff --git a/.vim/colors/falcon/estilo/syntax/rst.yml b/.vim/colors/falcon/estilo/syntax/rst.yml new file mode 100755 index 0000000..ef98327 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/rst.yml @@ -0,0 +1,5 @@ +rstSections: 'br_blue' +rstCodeBlock: 'mid_gray_alt' +rstDirective: 'orange' +rstHyperlinkTarget: 'blue_gray - u' +rstExDirective: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/ruby.yml b/.vim/colors/falcon/estilo/syntax/ruby.yml new file mode 100755 index 0000000..f9e1bd5 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/ruby.yml @@ -0,0 +1,71 @@ +rubyClass: 'light_gray' # rubyDefine +rubyClassName: '@Normal' +rubyModule: 'light_gray' # rubyDefine +rubyModuleName: '@Normal' +rubyMethodExceptional: '' # rubyDefine +rubyDefine: 'yellow' # Define +rubyFunction: 'normal_gray' # Function +rubyConditional: '' # Conditional +rubyConditionalModifier: '' # rubyConditional +rubyExceptional: '' # rubyConditional +rubyRepeat: '' # Repeat +rubyRepeatModifier: '' # rubyRepeat +rubyOptionalDo: '' # rubyRepeat +rubyControl: 'yellow' # Statement +rubyInclude: '' # Include +rubyInteger: '' # Number +rubyASCIICode: '' # Character +rubyFloat: '' # Float +rubyBoolean: '' # Boolean +rubyException: '' # Exception +rubyIdentifier: '' # Identifier +rubyClassVariable: '' # rubyIdentifier +rubyConstant: 'light_blue_gray' # Type +rubyGlobalVariable: 'lavender - b' # rubyIdentifier +rubyBlockParameter: '' # rubyIdentifier +rubyInstanceVariable: '' # rubyIdentifier +rubyPredefinedIdentifier: '' # rubyIdentifier +rubyPredefinedConstant: '' # rubyPredefinedIdentifier +rubyPredefinedVariable: '' # rubyPredefinedIdentifier +rubySymbol: 'blue_gray' # Constant +rubyKeyword: '' # Keyword +rubyOperator: '' # Operator +rubyBeginEnd: '' # Statement +rubyAccess: '' # Statement +rubyAttribute: '' # Statement +rubyEval: '' # Statement +rubyPseudoVariable: '' # Constant +rubyComment: '' # Comment +rubyData: '' # Comment +rubyDataDirective: '' # Delimiter +rubyDocumentation: '' # Comment +rubyTodo: '' # Todo +rubyQuoteEscape: '' # rubyStringEscape +rubyStringEscape: '' # Special +rubyInterpolationDelimiter: '' # Delimiter +rubyNoInterpolation: '' # rubyString +rubySharpBang: '' # PreProc +rubyRegexpDelimiter: '' # rubyStringDelimiter +rubySymbolDelimiter: '' # rubyStringDelimiter +rubyStringDelimiter: '' # Delimiter +rubyHeredoc: '' # rubyString +rubyString: '' # String +rubyRegexpEscape: '' # rubyRegexpSpecial +rubyRegexpQuantifier: '' # rubyRegexpSpecial +rubyRegexpAnchor: '' # rubyRegexpSpecial +rubyRegexpDot: '' # rubyRegexpCharClass +rubyRegexpCharClass: '' # rubyRegexpSpecial +rubyRegexpSpecial: '' # Special +rubyRegexpComment: '' # Comment +rubyRegexp: '' # rubyString +rubyInvalidVariable: '' # Error +rubyError: '' # Error +rubySpaceError: '' # rubyError +rubyArrayDelimiter: '@Delimiter' +rubyBlockParameterList: 'blue_gray' +rubyCurlyBlockDelimiter: '@Delimiter' +rubyDoBlock: 'yellow' +rubyLocalVariableOrMethod: 'blue_gray' +rubyMethodBlock: 'tan' +rubyHeredocDelimiter: 'orange' +rubyCurlyBlock: 'orange' diff --git a/.vim/colors/falcon/estilo/syntax/sh.yml b/.vim/colors/falcon/estilo/syntax/sh.yml new file mode 100755 index 0000000..5f95162 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/sh.yml @@ -0,0 +1,127 @@ +shArithRegion: '' # shShellVariables +shAtExpr: '' # shSetList +shBeginHere: '' # shRedir +shCaseBar: '@Operator' # shConditional +shCaseCommandSub: '' # shCommandSub +shCaseDoubleQuote: '' # shDoubleQuote +shCaseIn: '' # shConditional +shQuote: '@Delimiter' # shOperator +shCaseSingleQuote: '' # shSingleQuote +shCaseStart: '' # shConditional +shCmdSubRegion: '' # shShellVariables +shColon: '' # shComment +shDerefOp: '' # shOperator +shDerefPOL: '' # shDerefOp +shDerefPPS: '' # shDerefOp +shDeref: '' # shShellVariables +shDerefDelim: '' # shOperator +shDerefSimple: '' # shDeref +shDerefSpecial: '' # shDeref +shDerefString: '' # shDoubleQuote +shDerefVar: '' # shDeref +shDoubleQuote: '' # shString +shEcho: '' # shString +shEchoDelim: '' # shOperator +shEchoQuote: '' # shString +shForPP: '' # shLoop +shEmbeddedEcho: '' # shString +shEscape: '' # shCommandSub +shExDoubleQuote: '' # shDoubleQuote +shExSingleQuote: '' # shSingleQuote +shFunction: 'normal_gray' # Function +shHereDoc: '' # shString +shHerePayload: '' # shHereDoc +shLoop: '@Function' # shStatement +shMoreSpecial: '' # shSpecial +shOption: '' # shCommandSub +shPattern: '' # shString +shParen: '' # shArithmetic +shPosnParm: '' # shShellVariables +shQuickComment: '' # shComment +shRange: '' # shOperator +shRedir: '' # shOperator +shSetListDelim: '' # shOperator +shSetOption: '' # shOption +shSingleQuote: '' # shString +shSource: '' # shOperator +shStringSpecial: '' # shSpecial +shSubShRegion: '' # shOperator +shTestOpr: '@Operator' # shConditional +shTestPattern: '' # shString +shTestDoubleQuote: '' # shString +shTestSingleQuote: '' # shString +shVariable: 'blue_gray' # shSetList +shWrapLineOperator: '' # shOperator +bashAdminStatement: '' # shStatement if exists("b:is_bash") +bashSpecialVariables: 'blue_gray' # shShellVariables if exists("b:is_bash") +bashStatement: '' # shStatement if exists("b:is_bash") +shFunctionParen: '' # Delimiter if exists("b:is_bash") +shFunctionDelim: '' # Delimiter if exists("b:is_bash") +kshSpecialVariables: '' # shShellVariables if exists("b:is_kornshell") +kshStatement: '' # shStatement if exists("b:is_kornshell") +shCaseError: '' # Error if !exists("g:sh_no_error") +shCondError: '' # Error if !exists("g:sh_no_error") +shCurlyError: '' # Error if !exists("g:sh_no_error") +shDerefError: '' # Error if !exists("g:sh_no_error") +shDerefOpError: '' # Error if !exists("g:sh_no_error") +shDerefWordError: '' # Error if !exists("g:sh_no_error") +shDoError: '' # Error if !exists("g:sh_no_error") +shEsacError: '' # Error if !exists("g:sh_no_error") +shIfError: '' # Error if !exists("g:sh_no_error") +shInError: '' # Error if !exists("g:sh_no_error") +shParenError: '' # Error if !exists("g:sh_no_error") +shTestError: '' # Error if !exists("g:sh_no_error") +shDTestError: '' # Error if exists("b:is_kornshell") +shArithmetic: '' # Special +shCharClass: '' # Identifier +shSnglCase: '@Delimiter' # Statement +shCommandSub: '' # Special +shComment: '' # Comment +shConditional: '' # Conditional +shCtrlSeq: '' # Special +shExprRegion: '' # Delimiter +shFunctionKey: '' # Function +shFunctionName: '' # Function +shNumber: '' # Number +shOperator: '' # Operator +shRepeat: '' # Repeat +shSetList: 'light_blue_gray' # Identifier +shShellVariables: '' # PreProc +shSpecial: '' # Special +shStatement: 'normal_gray' # Statement +shSet: '@shStatement' # Statement +shString: '' # String +shTodo: '' # Todo +shAlias: '' # Identifier +shHereDoc01: '' # shRedir +shHereDoc02: '' # shRedir +shHereDoc03: '' # shRedir +shHereDoc04: '' # shRedir +shHereDoc05: '' # shRedir +shHereDoc06: '' # shRedir +shHereDoc07: '' # shRedir +shHereDoc08: '' # shRedir +shHereDoc09: '' # shRedir +shHereDoc10: '' # shRedir +shHereDoc11: '' # shRedir +shHereDoc12: '' # shRedir +shHereDoc13: '' # shRedir +shHereDoc14: '' # shRedir +shHereDoc15: '' # shRedir +shHereDoc16: '' # shRedir +shHereDoc17: '' # shRedir +shHereDoc18: '' # shRedir +shHereDoc19: '' # shRedir +shHereDoc20: '' # shRedir +shHereDoc21: '' # shRedir +shHereDoc22: '' # shRedir +shHereDoc23: '' # shRedir +shHereDoc24: '' # shRedir +shHereDoc25: '' # shRedir +shHereDoc26: '' # shRedir +shHereDoc27: '' # shRedir +shHereDoc28: '' # shRedir +shHereDoc29: '' # shRedir +shHereDoc30: '' # shRedir +shHereDoc31: '' # shRedir +shHereDoc32: '' # shRedir diff --git a/.vim/colors/falcon/estilo/syntax/sneak.yml b/.vim/colors/falcon/estilo/syntax/sneak.yml new file mode 100755 index 0000000..41938db --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/sneak.yml @@ -0,0 +1,3 @@ +Sneak: 'white dark_indigo' +SneakLabel: 'white dark_indigo' +SneakScope: 'white -' diff --git a/.vim/colors/falcon/estilo/syntax/sql.yml b/.vim/colors/falcon/estilo/syntax/sql.yml new file mode 100755 index 0000000..fe6ccf3 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/sql.yml @@ -0,0 +1,11 @@ +sqlStatement: '@Function' +sqlKeyword: 'tan' +sqlSpecial: '@Number' +sqlType: 'blue_gray' +sqlFunction: '@Title' +mysqlKeyword: '@sqlKeyword' +mysqlOperator: '@Operator' +mysqlFunction: '@sqlType' +mysqlStatement: '@sqlStatement' +mysqlType: '@sqlType' +Quote: '@Delimiter' diff --git a/.vim/colors/falcon/estilo/syntax/sshconfig.yml b/.vim/colors/falcon/estilo/syntax/sshconfig.yml new file mode 100755 index 0000000..f1e998b --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/sshconfig.yml @@ -0,0 +1,4 @@ +sshconfigKeyword: 'blue_gray' +sshconfigMatch: 'blue_gray' +sshconfigYesNo: 'red' +sshconfigLogLevel: 'tan' diff --git a/.vim/colors/falcon/estilo/syntax/startify.yml b/.vim/colors/falcon/estilo/syntax/startify.yml new file mode 100755 index 0000000..59e4303 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/startify.yml @@ -0,0 +1,6 @@ +StartifySlash: 'mid_gray' +StartifyPath: 'mid_gray' +StartifyHeader: 'indigo' +StartifyFile: 'normal_gray' +StartifySection: 'yellow' +StartifyNumber: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/tagbar.yml b/.vim/colors/falcon/estilo/syntax/tagbar.yml new file mode 100755 index 0000000..1d6e442 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/tagbar.yml @@ -0,0 +1,12 @@ +TagbarComment: 'dark_gray -' +TagbarKind: 'blue_gray -' +TagbarNestedKind: 'blue_gray -' +TagbarScope: 'tan' +TagbarType: 'light_gray -' +TagbarSignature: 'normal_gray -' +TagbarPseudoID: 'normal_gray -' +TagbarFoldIcon: 'mid_gray -' +TagbarHighlight: 'normal_gray -' +TagbarVisibilityPublic: 'green -' +TagbarVisibilityProtected: 'orange -' +TagbarVisibilityPrivate: 'red -' diff --git a/.vim/colors/falcon/estilo/syntax/tmux.yml b/.vim/colors/falcon/estilo/syntax/tmux.yml new file mode 100755 index 0000000..c36927c --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/tmux.yml @@ -0,0 +1,4 @@ +tmuxCmds: 'yellow' +tmuxOptsSet: 'blue_gray' +tmuxOptions: 'orange' +tmuxOptsSetw: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/treesitter.yml b/.vim/colors/falcon/estilo/syntax/treesitter.yml new file mode 100755 index 0000000..3150807 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/treesitter.yml @@ -0,0 +1,11 @@ +TSKeyword: '@Keyword' +TSVariable: '@Identifier' +TSMethod: 'normal_gray' +TSVariableBuiltin: '@Type' +TSFunction: '@Keyword' +TSOperator: '@Operator' +TSConstructor: 'normal_gray - b' +TSException: '@Keyword' +TSConstant: '@Constant' +TSConstBuiltin: '@Boolean' +TSError: 'yellow' diff --git a/.vim/colors/falcon/estilo/syntax/twig.yml b/.vim/colors/falcon/estilo/syntax/twig.yml new file mode 100755 index 0000000..69c5c42 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/twig.yml @@ -0,0 +1,9 @@ +twigVarDelim: '@Delimiter' +twigTagDelim: '@Delimiter' +htmlEndTag: 'yellow' +twigString: 'light_gray' +twigOperator: 'orange' +twigTagBlock: 'yellow' +htmlLink: 'blue_gray' +twigVariable: '@Identifier' +twigFilter: 'tan' diff --git a/.vim/colors/falcon/estilo/syntax/ultisnips.yml b/.vim/colors/falcon/estilo/syntax/ultisnips.yml new file mode 100755 index 0000000..153d034 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/ultisnips.yml @@ -0,0 +1,7 @@ +snipSnippetHeaderKeyword: 'yellow' +snipSnippetFooterKeyword: '@snipSnippetHeaderKeyword' +snipTabStop: '@Identifier' +snipTabStopDefault: 'blue_gray - i' +snipMirror: '@snipTabStop' +snipSnippetTrigger: '@String' +snipSnippetDocContextString: '@Comment' diff --git a/.vim/colors/falcon/estilo/syntax/vdebug.yml b/.vim/colors/falcon/estilo/syntax/vdebug.yml new file mode 100755 index 0000000..fda5330 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vdebug.yml @@ -0,0 +1,4 @@ +DbgBreakptLine: '- off_blue' +DbgBreakptSign: 'off_blue -' +DbgCurrentLine: '- off_red' +DbgCurrentSign: 'off_red -' diff --git a/.vim/colors/falcon/estilo/syntax/vim-gitgutter.yml b/.vim/colors/falcon/estilo/syntax/vim-gitgutter.yml new file mode 100755 index 0000000..ebf78ce --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vim-gitgutter.yml @@ -0,0 +1,5 @@ +# GitGutter airblade/vim-gitgutter +GitGutterAdd: 'green -' +GitGutterChange: 'yellow -' +GitGutterDelete: 'red -' +GitGutterChangeDelete: 'orange -' diff --git a/.vim/colors/falcon/estilo/syntax/vim-signature.yml b/.vim/colors/falcon/estilo/syntax/vim-signature.yml new file mode 100755 index 0000000..a656b1d --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vim-signature.yml @@ -0,0 +1 @@ +SignatureMarkText: 'blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/vim.yml b/.vim/colors/falcon/estilo/syntax/vim.yml new file mode 100755 index 0000000..219699a --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vim.yml @@ -0,0 +1 @@ +Terminal: 'normal_gray bg' diff --git a/.vim/colors/falcon/estilo/syntax/vimagit.yml b/.vim/colors/falcon/estilo/syntax/vimagit.yml new file mode 100755 index 0000000..50757bb --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vimagit.yml @@ -0,0 +1,3 @@ +titleEntry: 'yellow' +diffRemoved: '@DiffDelete' +diffAdded: '@DiffAdd' diff --git a/.vim/colors/falcon/estilo/syntax/viml.yml b/.vim/colors/falcon/estilo/syntax/viml.yml new file mode 100755 index 0000000..a96cf2a --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/viml.yml @@ -0,0 +1,19 @@ +vimCommentTitle: 'light_gray - i' +vimCommand: 'tan' +vimVar: 'blue_gray' +vimLet: 'yellow' +vimNotFunc: 'yellow' +vimIsCommand: 'yellow' +vimOperParen: '@Delimiter' +vimFuncVar: 'blue_gray - b' +vimFuncName: 'normal_gray' +vimAutoEvent: 'red' +vimMap: 'blue_gray' +vimGroup: 'blue_gray' +vimHiTerm: 'blue_gray' +vimSetSep: 'normal_gray' +vimHighlight: '@vimLet' +vimSetEqual: 'orange' +vimNotation: 'normal_gray' +vimMapLhs: 'tan' +vimMapRhs: 'light_blue_gray' diff --git a/.vim/colors/falcon/estilo/syntax/vimwiki.yml b/.vim/colors/falcon/estilo/syntax/vimwiki.yml new file mode 100755 index 0000000..1ca6569 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vimwiki.yml @@ -0,0 +1,17 @@ +VimwikiLink: '@Underlined' +VimwikiHeaderChar: '@Delimiter' +VimwikiHeader1: 'br_blue - b' +VimwikiHeader2: 'br_blue -' +VimwikiHeader3: '@VimwikiHeader2' +VimwikiHeader4: '@VimwikiHeader2' +VimwikiHeader5: '@VimwikiHeader2' +VimwikiHeader6: '@VimwikiHeader2' +VimwikiList: '@Delimiter' +# preformatted block, unfortunately not just the fence but all the code too +VimwikiPre: 'mid_gray_alt' +# inline +VimwikiCode: 'mid_gray_alt' +VimwikiCodeChar: 'orange' +VimwikiMarkers: 'tan' +VimwikiBold: '- - b' +VimwikiItalic: '- - i' diff --git a/.vim/colors/falcon/estilo/syntax/vista.yml b/.vim/colors/falcon/estilo/syntax/vista.yml new file mode 100755 index 0000000..0b43a45 --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/vista.yml @@ -0,0 +1,2 @@ +VistaTag: 'normal_gray -' +VistaPrefix: 'mid_dark_gray' diff --git a/.vim/colors/falcon/estilo/syntax/xml.yml b/.vim/colors/falcon/estilo/syntax/xml.yml new file mode 100755 index 0000000..d7b86fb --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/xml.yml @@ -0,0 +1,6 @@ +xmlEndTag: 'blue_gray' +xmlEqual: '@Operator' +xmlTagName: 'light_blue_gray' +xmlAttrib: 'blue_gray' +xmlTag: 'normal_gray' +xmlProcessingDelim: 'orange' diff --git a/.vim/colors/falcon/estilo/syntax/yaml.yml b/.vim/colors/falcon/estilo/syntax/yaml.yml new file mode 100755 index 0000000..2e66d3b --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/yaml.yml @@ -0,0 +1,34 @@ +yamlTodo: '' # Todo +yamlComment: '' # Comment +yamlDocumentStart: '' # PreProc +yamlDocumentEnd: '' # PreProc +yamlDirectiveName: '' # Keyword +yamlTAGDirective: '' # yamlDirectiveName +yamlTagHandle: '' # String +yamlTagPrefix: '' # String +yamlYAMLDirective: '' # yamlDirectiveName +yamlReservedDirective: '' # Error +yamlYAMLVersion: '' # Number +yamlString: '' # String +yamlFlowString: '' # yamlString +yamlFlowStringDelimiter: 'normal_gray' # yamlString +yamlEscape: '' # SpecialChar +yamlSingleEscape: '' # SpecialChar +yamlBlockCollectionItemStart: 'orange' # Label +yamlBlockMappingKey: 'blue_gray' # Identifier +yamlBlockMappingMerge: '' # Special +yamlFlowMappingKey: 'normal_gray' # Identifier +yamlFlowMappingMerge: '' # Special +yamlMappingKeyStart: '' # Special +yamlFlowIndicator: '@Delimiter' # Special +yamlKeyValueDelimiter: '@Delimiter' # Special +yamlConstant: '' # Constant +yamlNull: 'normal_gray - i' # yamlConstant +yamlBool: '@Number' # yamlConstant +yamlAnchor: '' # Type +yamlAlias: '' # Type +yamlNodeTag: '' # Type +yamlInteger: '' # Number +yamlFloat: '' # Float +yamlTimestamp: '' # Number +yamlPlainScalar: 'normal_gray' diff --git a/.vim/colors/falcon/estilo/syntax/zsh.yml b/.vim/colors/falcon/estilo/syntax/zsh.yml new file mode 100755 index 0000000..f3cb3ff --- /dev/null +++ b/.vim/colors/falcon/estilo/syntax/zsh.yml @@ -0,0 +1,9 @@ +zshCommands: 'yellow' +zshBrackets: '@Delimiter' +zshOptStart: 'orange' +zshVariableDef: 'blue_gray' +zshTypes: '@Type' +zshKeyword: '@Keyword' +zshStringDelimiter: '@Delimiter' +zshDelimiter: '@Delimiter' +zshParentheses: '@Delimiter' diff --git a/.vim/colors/falcon/exa/EXA_COLORS b/.vim/colors/falcon/exa/EXA_COLORS new file mode 100755 index 0000000..789554c --- /dev/null +++ b/.vim/colors/falcon/exa/EXA_COLORS @@ -0,0 +1,20 @@ +# di directories +# ex executable files +# fi regular files +# ln symlinks +# ur,uw,ux user permissions +# gr,gw,gx group permissions +# tr,tw,tx others permissions +# sn the numbers of a file's size +# sb the units of a file's size +# uu user that is you +# un user that is someone else +# gu a group that you belong to +# gn a group you aren't a member of +# ga new file in Git +# gm a modified file in Git +# gd a deleted file in Git +# gv a renamed file in Git +# da a file's date +# xa is the special attribute +export EXA_COLORS="uu=38;5;249:un=38;5;241:gu=38;5;245:gn=38;5;241:da=38;5;245:sn=38;5;7:sb=38;5;7:ur=38;5;3;1:uw=38;5;5;1:ux=38;5;1;1:ue=38;5;1;1:gr=38;5;249:gw=38;5;249:gx=38;5;249:tr=38;5;249:tw=38;5;249:tx=38;5;249:fi=38;5;248:di=38;5;253:ex=38;5;1:xa=38;5;12:*.png=38;5;4:*.jpg=38;5;4:*.gif=38;5;4" diff --git a/.vim/colors/falcon/iterm2/falcon.itermcolors b/.vim/colors/falcon/iterm2/falcon.itermcolors new file mode 100755 index 0000000..2e9e51a --- /dev/null +++ b/.vim/colors/falcon/iterm2/falcon.itermcolors @@ -0,0 +1,344 @@ + + + + + Ansi 0 Color + + Alpha Component + 1 + Blue Component + 0.015686275437474251 + Color Space + sRGB + Green Component + 0.0 + Red Component + 0.0 + + Ansi 1 Color + + Alpha Component + 1 + Blue Component + 0.0 + Color Space + sRGB + Green Component + 0.21176470816135406 + Red Component + 1 + + Ansi 10 Color + + Alpha Component + 1 + Blue Component + 0.45882353186607361 + Color Space + sRGB + Green Component + 0.74901962280273438 + Red Component + 0.69411766529083252 + + Ansi 11 Color + + Alpha Component + 1 + Blue Component + 0.57254904508590698 + Color Space + sRGB + Green Component + 0.82745099067687988 + Red Component + 1 + + Ansi 12 Color + + Alpha Component + 1 + Blue Component + 0.73725491762161255 + Color Space + sRGB + Green Component + 0.64313727617263794 + Red Component + 0.60000002384185791 + + Ansi 13 Color + + Alpha Component + 1 + Blue Component + 0.48235294222831726 + Color Space + sRGB + Green Component + 0.69019609689712524 + Red Component + 1 + + Ansi 14 Color + + Alpha Component + 1 + Blue Component + 0.74901962280273438 + Color Space + sRGB + Green Component + 0.80000001192092896 + Red Component + 0.5215686559677124 + + Ansi 15 Color + + Alpha Component + 1 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.97254902124404907 + Red Component + 0.97254902124404907 + + Ansi 2 Color + + Alpha Component + 1 + Blue Component + 0.24705882370471954 + Color Space + sRGB + Green Component + 0.55686277151107788 + Red Component + 0.44313725829124451 + + Ansi 3 Color + + Alpha Component + 1 + Blue Component + 0.32156863808631897 + Color Space + sRGB + Green Component + 0.77254903316497803 + Red Component + 1 + + Ansi 4 Color + + Alpha Component + 1 + Blue Component + 0.58823531866073608 + Color Space + sRGB + Green Component + 0.31764706969261169 + Red Component + 0.38823530077934265 + + Ansi 5 Color + + Alpha Component + 1 + Blue Component + 0.10196078568696976 + Color Space + sRGB + Green Component + 0.46274510025978088 + Red Component + 1 + + Ansi 6 Color + + Alpha Component + 1 + Blue Component + 0.64313727617263794 + Color Space + sRGB + Green Component + 0.74901962280273438 + Red Component + 0.20392157137393951 + + Ansi 7 Color + + Alpha Component + 1 + Blue Component + 0.72549021244049072 + Color Space + sRGB + Green Component + 0.70588237047195435 + Red Component + 0.70588237047195435 + + Ansi 8 Color + + Alpha Component + 1 + Blue Component + 0.12941177189350128 + Color Space + sRGB + Green Component + 0.0078431377187371254 + Red Component + 0.0078431377187371254 + + Ansi 9 Color + + Alpha Component + 1 + Blue Component + 0.47058823704719543 + Color Space + sRGB + Green Component + 0.55686277151107788 + Red Component + 1 + + Background Color + + Alpha Component + 1 + Blue Component + 0.12941177189350128 + Color Space + sRGB + Green Component + 0.0078431377187371254 + Red Component + 0.0078431377187371254 + + Badge Color + + Alpha Component + 0.5 + Blue Component + 0.054901950061321259 + Color Space + sRGB + Green Component + 0.36470580101013184 + Red Component + 0.83921569585800171 + + Bold Color + + Alpha Component + 1 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.97254902124404907 + Red Component + 0.97254902124404907 + + Cursor Color + + Alpha Component + 1 + Blue Component + 0.75294119119644165 + Color Space + sRGB + Green Component + 0.90980392694473267 + Red Component + 1 + + Cursor Guide Color + + Alpha Component + 1 + Blue Component + 0.21176469326019287 + Color Space + sRGB + Green Component + 0.21960783004760742 + Red Component + 0.23529419302940369 + + Cursor Text Color + + Alpha Component + 1 + Blue Component + 0.12941177189350128 + Color Space + sRGB + Green Component + 0.08235294371843338 + Red Component + 0.08235294371843338 + + Foreground Color + + Alpha Component + 1 + Blue Component + 0.72549021244049072 + Color Space + sRGB + Green Component + 0.70588237047195435 + Red Component + 0.70588237047195435 + + Link Color + + Alpha Component + 1 + Blue Component + 1 + Color Space + sRGB + Green Component + 0.85490196943283081 + Red Component + 0.74901962280273438 + + Selected Text Color + + Alpha Component + 1 + Blue Component + 0.89803922176361084 + Color Space + sRGB + Green Component + 0.87450981140136719 + Red Component + 0.87450981140136719 + + Selection Color + + Alpha Component + 1 + Blue Component + 0.50980395078659058 + Color Space + sRGB + Green Component + 0.054901961237192154 + Red Component + 0.18431372940540314 + + + diff --git a/.vim/colors/falcon/kitty/kitty.falcon.conf b/.vim/colors/falcon/kitty/kitty.falcon.conf new file mode 100755 index 0000000..e56cacb --- /dev/null +++ b/.vim/colors/falcon/kitty/kitty.falcon.conf @@ -0,0 +1,45 @@ +# falcon colour scheme + +cursor #ffe8c0 +cursor_text_color #151521 + +url_color #bfdaff + +foreground #b4b4b9 +background #020221 + +selection_foreground #dfdfe5 +selection_background #2d1078 + +#: black +color0 #000004 +color8 #020221 + +#: red +color1 #ff3600 +color9 #ff8e78 + +#: green +color2 #718e3f +color10 #b1bf75 + +#: yellow +color3 #ffc552 +color11 #ffd392 + +#: blue +color4 #635196 +color12 #99a4bc + +#: magenta +color5 #ff761a +color13 #ffb07b + +#: cyan +color6 #34bfa4 +color14 #85ccbf + +#: white +color7 #b4b4b9 +color15 #f8f8ff + diff --git a/.vim/colors/falcon/lua/falcon.lua b/.vim/colors/falcon/lua/falcon.lua new file mode 100755 index 0000000..b6188e2 --- /dev/null +++ b/.vim/colors/falcon/lua/falcon.lua @@ -0,0 +1,26 @@ +vim.api.nvim_set_var('falcon.palette', { + red = '#ff3600', + orange = '#ff761a', + yellow = '#ffc552', + green = '#718e3f', + blue_gray = '#99a4bc', + purple = '#635196', + indigo = '#5521d9', + status = '#28282d', + status_2 = '#36363a', + inactive_status = '#1c1c22', + black = '#000004', + white = '#F8F8FF', + light_gray = '#dfdfe5', + normal_gray = '#b4b4b9', + mid_gray = '#787882', + mid_dark_gray = '#57575e', + dark_gray = '#36363a', + modified = '#c8d0e3', + branch = '#99a4bc', + method = '#a1968a', + path = '#787882', + info = '#a1968a', + error = '#a82400', + warning = '#c99c40' +}) diff --git a/.vim/colors/falcon/mintty/.minttyrc b/.vim/colors/falcon/mintty/.minttyrc new file mode 100755 index 0000000..3b31550 --- /dev/null +++ b/.vim/colors/falcon/mintty/.minttyrc @@ -0,0 +1,20 @@ +ForegroundColour=180,180,185 +BackgroundColour=2,2,33 +CursorColour=255,232,192 + +Black=0,0,4 +Red=255,54,0 +Green=113,142,63 +Yellow=255,197,82 +Blue=99,81,150 +Magenta=255,118,26 +Cyan=52,181,164 +White=180,180,185 +BoldBlack=2,2,33 +BoldRed=255,142,120 +BoldGreen=177,191,177 +BoldYellow=255,211,146 +BoldBlue=153,164,188 +BoldMagenta=255,176,123 +BoldCyan=139,204,191 +BoldWhite=248,248,255 diff --git a/.vim/colors/falcon/nix/.Xresources b/.vim/colors/falcon/nix/.Xresources new file mode 100755 index 0000000..d085bc5 --- /dev/null +++ b/.vim/colors/falcon/nix/.Xresources @@ -0,0 +1,18 @@ +*.foreground: #B4B4B9 +*.background: #020221 +*.color0: #000004 +*.color8: #020221 +*.color1: #FF3600 +*.color9: #FF8E78 +*.color2: #718E3F +*.color10: #B1BF75 +*.color3: #FFC552 +*.color11: #FFD392 +*.color4: #635196 +*.color12: #99A4BC +*.color5: #FF761A +*.color13: #FFB07B +*.color6: #34BFA4 +*.color14: #85CCBF +*.color7: #B4B4B9 +*.color15: #F8F8FF diff --git a/.vim/colors/falcon/plugin/falcon.vim b/.vim/colors/falcon/plugin/falcon.vim new file mode 100755 index 0000000..09552e8 --- /dev/null +++ b/.vim/colors/falcon/plugin/falcon.vim @@ -0,0 +1,95 @@ +" Guard +if exists('g:colors_name') && g:colors_name != "falcon" + finish +endif + +if exists('g:loaded_falcon') + finish +endif +let g:loaded_falcon=1 + +" Required as colors will come from terminal without +if !exists('g:fzf_colors') + let g:fzf_colors= + \ { 'fg': ['fg', 'Comment'], + \ 'bg': ['bg', 'PMenu'], + \ 'hl': ['fg', 'Normal'], + \ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'], + \ 'bg+': ['bg', 'PMenu', 'PMenu'], + \ 'hl+': ['fg', 'Keyword'], + \ 'info': ['fg', 'PreProc'], + \ 'border': ['fg', 'Ignore'], + \ 'prompt': ['fg', 'Conditional'], + \ 'pointer': ['fg', 'Question'], + \ 'marker': ['fg', 'Directory'], + \ 'spinner': ['fg', 'Label'], + \ 'header': ['fg', 'Comment'] } +endif + +function s:HandleInactiveBackground() + " NeoVim has support for changing background colour depending on active or not + if !exists('g:falcon_inactive') + let g:falcon_inactive=0 + endif + + " Put in a background colour for gui + if !exists('g:falcon_background') + let g:falcon_background=1 + endif + + if !has("gui_running") || g:falcon_background == 0 + hi NonText guifg=#36363a ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + hi Normal guifg=#b4b4b9 ctermfg=249 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + else + hi NonText guifg=#36363a ctermfg=237 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + hi Normal guifg=#b4b4b9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + endif + + if exists('+winhighlight') && g:falcon_inactive == 1 + hi ActiveWindow guibg=NONE + hi InactiveWindow guibg=#151521 + + "TODO normalfloat background settings to not use PMenu + set winhighlight=Normal:ActiveWindow,NormalNC:InactiveWindow + return + endif + + if g:falcon_background == 1 + hi ActiveWindow guibg=#020221 + hi InactiveWindow guibg=#151521 + else + hi ActiveWindow guibg=NONE + hi InactiveWindow guibg=NONE + endif +endfunction + +function s:SetColors() + " Guard + if !exists('g:colors_name') || !exists('g:loaded_falcon') + return + endif + + if g:colors_name != "falcon" + return + endif + + call s:HandleInactiveBackground() +endfunction + +" goyo support +function! s:GoyoEnter() + " add in background colour + hi NonText guifg=#36363a ctermfg=237 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + hi Normal guifg=#b4b4b9 ctermfg=249 guibg=#020221 ctermbg=0 gui=NONE cterm=NONE + hi ActiveWindow guibg=#020221 + hi InactiveWindow guibg=#020221 +endfunction + +function! s:GoyoLeave() + call s:HandleInactiveBackground() +endfunction + +autocmd! User GoyoEnter nested call GoyoEnter() +autocmd! User GoyoLeave nested call GoyoLeave() + +autocmd VimEnter,ColorScheme * call s:SetColors() diff --git a/.vim/colors/falcon/prism/prism-falcon.css b/.vim/colors/falcon/prism/prism-falcon.css new file mode 100755 index 0000000..6a82894 --- /dev/null +++ b/.vim/colors/falcon/prism/prism-falcon.css @@ -0,0 +1,71 @@ +.token.function { + color: #b4b4b9; +} + +.token.brackets { + color: #f8f8ff; +} + +.token.punctuation { + color: #f8f8ff; +} + +.token.variable, .token.function-variable, .token.this, .token.key, .token.builtin { + color: #99a4bc; +} + +.token.variable .dollar { + color: #b4b4b9; +} + +.token.string { + color: #dfdfe5; +} + +.token.comment { + color: #787882; + font-style: italic; +} + +.token.comment .doc-block { + color: #ddcfbf; +} + +.token.scope { + color: #b4b4b9; + font-weight: 700; +} + +.token.class-name { + color: #b4b4b9; +} + +.token.delimiter.important { + color: #dfdfe5; + font-weight: normal; +} + +.token.keyword.keyword-protected, .token.keyword.keyword-public, .token.keyword.keyword-private, .token.keyword.keyword-parent, .token.keyword.keyword-array, .token.keyword.keyword-NULL, .token.keyword.keyword-use, .token.keyword.keyword-namespace { + color: #ddcfbf; + font-weight: normal; +} + +.token.boolean, .token.php-boolean, .token.number { + color: #ff3600; +} + +.token.php-functions { + color: #ddcfbf; +} + +.token.property { + color: #b4b4b9; +} + +.token.operator { + color: #ff761a; +} + +.token.keyword { + color: #ffc552; +} diff --git a/.vim/colors/falcon/prism/prism-falcon.php.js b/.vim/colors/falcon/prism/prism-falcon.php.js new file mode 100755 index 0000000..0443de1 --- /dev/null +++ b/.vim/colors/falcon/prism/prism-falcon.php.js @@ -0,0 +1,50 @@ +(function(Prism) { + + Prism.languages.php = Prism.languages.insertBefore('php', 'punctuation', { + 'brackets': { + pattern: /\(|\)|\{|\}|\[|\]/ + }, + 'operator': { + pattern: /\.|\&|\!|\=\=\>|\!\=\=|\=\=\=|\=|\?\?/ + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'package', { + 'variable': { + pattern: /\$+(?:\w+\b|(?={))/i, + inside: { + 'dollar': { + pattern: /\$/ + } + } + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'punctuation', { + 'member-selector': { + pattern: /\-\>|\:\:/g + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'keyword', { + 'php-functions': { + pattern: /method_exists|function_exists|array_reduce|array_map|array_filter|array_replace/ + }, + 'php-boolean': { + pattern: /FALSE|TRUE/ + } + }); + + Prism.languages.php = Prism.languages.insertBefore('php', 'package', { + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true, + inside: { + 'doc-block': { + pattern: /\@var|\@param|\{\@inheritdoc\}/ + } + } + } + }); + +})(Prism); diff --git a/.vim/colors/falcon/ranger/falcon.py b/.vim/colors/falcon/ranger/falcon.py new file mode 100755 index 0000000..ccf9cbb --- /dev/null +++ b/.vim/colors/falcon/ranger/falcon.py @@ -0,0 +1,140 @@ +# Falcon ranger colorscheme. + +from __future__ import (absolute_import, division, print_function) + +from ranger.gui.colorscheme import ColorScheme +from ranger.gui.color import ( + cyan, magenta, red, white, default, + normal, bold, reverse, + default_colors, +) + +class Solarized(ColorScheme): + progress_bar_color = 3 + + def use(self, context): # pylint: disable=too-many-branches,too-many-statements + fg, bg, attr = default_colors + + if context.reset: + return default_colors + + elif context.in_browser: + fg = 7 + # selected means under cursor + if context.selected: + attr = reverse + fg = 15 + else: + attr = normal + if context.empty or context.error: + fg = 235 + bg = 160 + if context.border: + fg = default + if context.media: + if context.image: + fg = 5 + else: + fg = 5 + if context.container: + fg = 61 + if context.directory: + fg = 253 + elif context.executable and not \ + any((context.media, context.container, + context.fifo, context.socket)): + fg = 1 + attr |= bold + if context.socket: + fg = 136 + bg = 230 + attr |= bold + if context.fifo: + fg = 136 + bg = 230 + attr |= bold + if context.device: + fg = 244 + bg = 230 + attr |= bold + if context.link: + fg = 37 if context.good else 160 + attr |= bold + if context.bad: + bg = 235 + if context.tag_marker and not context.selected: + attr |= bold + if fg in (red, magenta): + fg = white + else: + fg = red + if not context.selected and (context.cut or context.copied): + fg = 234 + attr |= bold + if context.main_column: + if context.selected: + attr |= bold + if context.marked: + attr |= bold + bg = 3 + fg = 8 + if context.badinfo: + if attr & reverse: + bg = magenta + else: + fg = magenta + + if context.inactive_pane: + fg = 3 + + elif context.in_titlebar: + attr |= bold + if context.hostname: + fg = 16 if context.bad else 249 + if context.bad: + bg = 166 + elif context.directory: + fg = 253 + elif context.tab: + fg = 0 if context.good else 7 + bg = 5 if context.good else 237 + elif context.link: + fg = cyan + + elif context.in_statusbar: + if context.permissions: + if context.good: + fg = 3 + elif context.bad: + fg = 160 + bg = 235 + if context.marked: + attr |= bold | reverse + fg = 2 + bg = 15 + if context.message: + if context.bad: + attr |= bold + fg = 160 + bg = 235 + if context.loaded: + bg = self.progress_bar_color + + if context.text: + if context.highlight: + attr |= reverse + + if context.in_taskview: + if context.title: + fg = 93 + + if context.selected: + attr |= reverse + + if context.loaded: + if context.selected: + fg = self.progress_bar_color + else: + bg = self.progress_bar_color + + return fg, bg, attr diff --git a/.vim/colors/falcon/slack/slack.txt b/.vim/colors/falcon/slack/slack.txt new file mode 100755 index 0000000..2df38c1 --- /dev/null +++ b/.vim/colors/falcon/slack/slack.txt @@ -0,0 +1 @@ +#151521,#4f4f59,#2f2f3a,#F8f8ff,#36363a,#b4b4b9,#99a4bc,#718e3f diff --git a/.vim/colors/falcon/sublime/falcon.tmTheme b/.vim/colors/falcon/sublime/falcon.tmTheme new file mode 100755 index 0000000..742690d --- /dev/null +++ b/.vim/colors/falcon/sublime/falcon.tmTheme @@ -0,0 +1,2166 @@ + + + + + name + Falcon + semanticClass + falcon.dark + gutterSettings + + background + #020221 + divider + #020221 + foreground + #586E75 + selectionBackground + #073642 + selectionForeground + #586E75 + + settings + + + settings + + background + #020221 + caret + #ddcfbf + foreground + #b4b4b9 + invisibles + #073642 + lineHighlight + #073642 + selection + #ddcfbfb + + + + name + Comment + scope + comment + settings + + fontStyle + + foreground + #787882 + + + + name + String + scope + string + settings + + foreground + #dfdfe5 + + + + name + StringNumber + scope + string + settings + + foreground + #dfdfe5 + + + + name + Regexp + scope + string.regexp + settings + + foreground + #ff761a + + + + name + Number + scope + constant.numeric + settings + + foreground + #dfdfe5 + + + + name + Variable + scope + variable.language, variable.other + settings + + foreground + #99a4bc + + + + name + Keyword + scope + keyword + settings + + foreground + #ffc552 + + + + name + Storage + scope + storage + settings + + fontStyle + + foreground + #ff761a + + + + name + Class name + scope + entity.name.class, entity.name.type.class + settings + + foreground + #b4b4b9 + + + + name + Function name + scope + entity.name.function + settings + + foreground + #ddcfbf + + + + name + Variable start + scope + punctuation.definition.variable + settings + + foreground + #99a4bc + + + + name + Embedded code markers + scope + punctuation.section.embedded.begin, punctuation.section.embedded.end + settings + + foreground + #ff761a + + + + name + Built-in constant + scope + constant.language, meta.preprocessor + settings + + foreground + #dfdfe5 + + + + name + Support.construct + scope + support.function.construct, keyword.other.new + settings + + foreground + #ff3600 + + + + name + User-defined constant + scope + constant.character, constant.other + settings + + foreground + #dfdfe5 + + + + name + Inherited class + scope + entity.other.inherited-class + settings + + + + name + Function argument + scope + variable.parameter + settings + + + + name + Tag name + scope + entity.name.tag + settings + + fontStyle + bold + foreground + #99a4bc + + + + name + Tag start/end + scope + punctuation.definition.tag.html, punctuation.definition.tag.begin, punctuation.definition.tag.end + settings + + foreground + #dfdfe5 + + + + name + Tag attribute + scope + entity.other.attribute-name + settings + + foreground + #99a4bc + + + + name + Library function + scope + support.function + settings + + foreground + #ddcfbf + + + + name + Continuation + scope + punctuation.separator.continuation + settings + + foreground + #ff3600 + + + + name + Library constant + scope + support.constant + settings + + + + name + Library class/type + scope + support.type, support.class + settings + + foreground + #9f97cc + + + + name + Library Exception + scope + support.type.exception + settings + + foreground + #b24d36 + + + + name + Special + scope + keyword.other.special-method + settings + + foreground + #b24d36 + + + + name + Library variable + scope + support.other.variable + settings + + + + name + Invalid + scope + invalid + settings + + + + name + Quoted String + scope + string.quoted.double, string.quoted.single + settings + + foreground + #dfdfe5 + + + + name + Quotes + scope + punctuation.definition.string.begin, punctuation.definition.string.end + settings + + foreground + #b4b4b9 + + + + name + CSS: Property + scope + entity.name.tag.css, support.type.property-name.css, meta.property-name.css + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + CSS: @font-face + scope + source.css + settings + + foreground + #ddcfbf + + + + name + CSS: Selector + scope + meta.selector.css + settings + + fontStyle + + foreground + #ffc552 + + + + name + CSS: {} + scope + punctuation.section.property-list.css + settings + + foreground + #dfdfe5 + + + + name + CSS: Numeric Value + scope + meta.property-value.css constant.numeric.css, keyword.other.unit.css,constant.other.color.rgb-value.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS: Value + scope + meta.property-value.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS: !Important + scope + keyword.other.important.css + settings + + foreground + #ff3600 + + + + name + CSS: Standard Value + scope + support.constant.color + settings + + foreground + #dfdfe5 + + + + name + CSS: Tag + scope + entity.name.tag.css + settings + + foreground + #dfdfe5 + + + + name + CSS: : , + scope + punctuation.separator.key-value.css, punctuation.terminator.rule.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS .class + scope + entity.other.attribute-name.class.css + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + CSS :pseudo + scope + entity.other.attribute-name.pseudo-element.css, entity.other.attribute-name.pseudo-class.css + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + CSS: #id + scope + entity.other.attribute-name.id.css + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + JS: Function Name + scope + meta.function.js, entity.name.function.js, support.function.dom.js + settings + + foreground + #ffc552 + + + + name + JS: Source + scope + text.html.basic source.js.embedded.html + settings + + fontStyle + + foreground + #ffc552 + + + + name + JS: Function + scope + storage.type.function.js + settings + + foreground + #ddcfbf + + + + name + JS: Numeric Constant + scope + constant.numeric.js + settings + + foreground + #dfdfe5 + + + + name + JS: [] + scope + meta.brace.square.js + settings + + foreground + #dfdfe5 + + + + name + JS: Storage Type + scope + storage.type.js + settings + + foreground + #dfdfe5 + + + + name + () + scope + meta.brace.round, punctuation.definition.parameters.begin.js, punctuation.definition.parameters.end.js + settings + + foreground + #dfdfe5 + + + + name + {} + scope + meta.brace.curly.js + settings + + foreground + #dfdfe5 + + + + name + HTML: Doctype + scope + entity.name.tag.doctype.html, meta.tag.sgml.html, string.quoted.double.doctype.identifiers-and-DTDs.html + settings + + fontStyle + italic + foreground + #787882 + + + + name + HTML: Comment Block + scope + comment.block.html + settings + + fontStyle + italic + foreground + #787882 + + + + name + HTML: Script + scope + entity.name.tag.script.html + settings + + fontStyle + italic + + + + name + HTML: Style + scope + source.css.embedded.html string.quoted.double.html + settings + + fontStyle + + foreground + #99a4bc + + + + name + HTML: Text + scope + text.html.ruby + settings + + fontStyle + bold + foreground + #dfdfe5 + + + + name + HTML: = + scope + text.html.basic meta.tag.other.html, text.html.basic meta.tag.any.html, text.html.basic meta.tag.block.any, text.html.basic meta.tag.inline.any, text.html.basic meta.tag.structure.any.html, text.html.basic source.js.embedded.html, punctuation.separator.key-value.html + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + HTML: something= + scope + text.html.basic entity.other.attribute-name.html + settings + + foreground + #99a4bc + + + + name + HTML: " + scope + text.html.basic meta.tag.structure.any.html punctuation.definition.string.begin.html, punctuation.definition.string.begin.html, punctuation.definition.string.end.html + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + HTML: <tag> + scope + entity.name.tag.block.any.html + settings + + fontStyle + bold + foreground + #dfdfe5 + + + + name + HTML: style + scope + source.css.embedded.html entity.name.tag.style.html + settings + + fontStyle + italic + + + + name + HTML: <style> + scope + entity.name.tag.style.html + settings + + fontStyle + + + + + name + HTML: {} + scope + text.html.basic punctuation.section.property-list.css + settings + + fontStyle + + + + + name + HTML: Embeddable + scope + source.css.embedded.html, comment.block.html + settings + + fontStyle + italic + foreground + #99a4bc + + + + name + Ruby: Variable definition + scope + punctuation.definition.variable.ruby + settings + + fontStyle + + foreground + #99a4bc + + + + name + Ruby: Function Name + scope + meta.function.method.with-arguments.ruby + settings + + foreground + #b4b4b9 + + + + name + Ruby: Variable + scope + variable.language.ruby + settings + + foreground + #99a4bc + + + + name + Ruby: Function + scope + entity.name.function.ruby + settings + + foreground + #b4b4b9 + + + + name + Ruby: Keyword Control + scope + keyword.control.ruby, keyword.control.def.ruby + settings + + fontStyle + bold + foreground + #ffc552 + + + + name + Ruby: Class + scope + keyword.control.class.ruby, meta.class.ruby + settings + + foreground + #b4b4b9 + + + + name + Ruby: Class Name + scope + entity.name.type.class.ruby + settings + + fontStyle + + foreground + #b4b4b9 + + + + name + Ruby: Keyword + scope + keyword.control.ruby + settings + + fontStyle + + foreground + #ffc552 + + + + name + Ruby: Support Class + scope + support.class.ruby + settings + + fontStyle + + foreground + #ffc552 + + + + name + Ruby: Special Method + scope + keyword.other.special-method.ruby + settings + + foreground + #ff761a + + + + name + Ruby: Constant + scope + constant.language.ruby, constant.numeric.ruby + settings + + foreground + #dfdfe5 + + + + name + Ruby: Constant Other + scope + variable.other.constant.ruby + settings + + fontStyle + + foreground + #dfdfe5 + + + + name + Ruby: :symbol + scope + constant.other.symbol.ruby + settings + + fontStyle + + foreground + #99a4bc + + + + name + Ruby: Punctuation Section '' + scope + punctuation.section.embedded.ruby, punctuation.definition.string.begin.ruby, punctuation.definition.string.end.ruby + settings + + foreground + #dc322f + + + + name + Ruby: Special Method + scope + keyword.other.special-method.ruby + settings + + foreground + #ff761a + + + + name + PHP: Include + scope + keyword.control.import.include.php + settings + + foreground + #ddcfbf + + + + name + Ruby: erb = + scope + text.html.ruby meta.tag.inline.any.html + settings + + fontStyle + + foreground + #839496 + + + + name + Ruby: erb "" + scope + text.html.ruby punctuation.definition.string.begin, text.html.ruby punctuation.definition.string.end + settings + + fontStyle + + foreground + #2aa198 + + + + name + PHP: Quoted Single + scope + punctuation.definition.string.begin, punctuation.definition.string.end + settings + + foreground + #839496 + + + + name + PHP: Class Names + scope + support.class.php + settings + + foreground + #839496 + + + + name + PHP: [] + scope + keyword.operator.index-start.php, keyword.operator.index-end.php + settings + + foreground + #dc322f + + + + name + PHP: Array + scope + meta.array.php + settings + + foreground + #586e75 + + + + name + PHP: Array() + scope + meta.array.php support.function.construct.php, meta.array.empty.php support.function.construct.php + settings + + fontStyle + + foreground + #b58900 + + + + name + PHP: Array Construct + scope + support.function.construct.php + settings + + foreground + #b58900 + + + + name + PHP: Array Begin + scope + punctuation.definition.array.begin, punctuation.definition.array.end + settings + + foreground + #dc322f + + + + name + PHP: Numeric Constant + scope + constant.numeric.php + settings + + foreground + #2aa198 + + + + name + PHP: New + scope + keyword.other.new.php + settings + + foreground + #CB4B16 + + + + name + PHP: :: + scope + keyword.operator.class + settings + + fontStyle + + foreground + #839496 + + + + name + PHP: Other Property + scope + variable.other.property.php + settings + + foreground + #93a1a1 + + + + name + PHP: Class + scope + storage.modifier.extends.php, storage.type.class.php, keyword.operator.class.php + settings + + foreground + #b58900 + + + + name + PHP: Class Function + settings + + + + name + PHP: Semicolon + scope + punctuation.terminator.expression.php + settings + + foreground + #839496 + + + + name + PHP: Inherited Class + scope + meta.other.inherited-class.php + settings + + fontStyle + + foreground + #586e75 + + + + name + PHP: Storage Type + scope + storage.type.php + settings + + foreground + #859900 + + + + name + PHP: Function + scope + entity.name.function.php + settings + + foreground + #93a1a1 + + + + name + PHP: Function Construct + scope + support.function.construct.php + settings + + foreground + #859900 + + + + name + PHP: Function Call + scope + entity.name.type.class.php, meta.function-call.php, meta.function-call.static.php, meta.function-call.object.php + settings + + foreground + #839496 + + + + name + PHP: Comment + scope + keyword.other.phpdoc + settings + + fontStyle + + foreground + #93a1a1 + + + + name + PHP: Source Emebedded + scope + source.php.embedded.block.html + settings + + foreground + #cb4b16 + + + + name + PHP: Storage Type Function + scope + storage.type.function.php + settings + + foreground + #cb4b16 + + + + name + C: constant + scope + constant.numeric.c + settings + + fontStyle + + foreground + #2aa198 + + + + name + C: Meta Preprocessor + scope + meta.preprocessor.c.include, meta.preprocessor.macro.c + settings + + fontStyle + + foreground + #cb4b16 + + + + name + C: Keyword + scope + keyword.control.import.define.c, keyword.control.import.include.c + settings + + fontStyle + + foreground + #cb4b16 + + + + name + C: Function Preprocessor + scope + entity.name.function.preprocessor.c + settings + + fontStyle + + foreground + #cb4b16 + + + + name + C: include <something.c> + scope + meta.preprocessor.c.include string.quoted.other.lt-gt.include.c, meta.preprocessor.c.include punctuation.definition.string.begin.c, meta.preprocessor.c.include punctuation.definition.string.end.c + settings + + fontStyle + + foreground + #2aa198 + + + + name + C: Function + scope + support.function.C99.c, support.function.any-method.c, entity.name.function.c + settings + + fontStyle + + foreground + #586e75 + + + + name + C: " + scope + punctuation.definition.string.begin.c, punctuation.definition.string.end.c + settings + + fontStyle + + foreground + #2aa198 + + + + name + C: Storage Type + scope + storage.type.c + settings + + fontStyle + + foreground + #b58900 + + + + name + diff: header + scope + meta.diff, meta.diff.header + settings + + background + #b58900 + fontStyle + italic + foreground + #E0EDDD + + + + name + diff: deleted + scope + markup.deleted + settings + + background + #eee8d5 + fontStyle + + foreground + #dc322f + + + + name + diff: changed + scope + markup.changed + settings + + background + #eee8d5 + fontStyle + + foreground + #cb4b16 + + + + name + diff: inserted + scope + markup.inserted + settings + + background + #eee8d5 + foreground + #219186 + + + + name + Markdown: Linebreak + scope + text.html.markdown meta.dummy.line-break + settings + + background + #b58900 + foreground + #E0EDDD + + + + name + Markdown: Raw + scope + text.html.markdown markup.raw.inline + settings + + foreground + #2aa198 + + + + name + reST raw + scope + text.restructuredtext markup.raw + settings + + foreground + #2aa198 + + + + name + Other: Removal + scope + other.package.exclude, other.remove + settings + + fontStyle + + foreground + #dc322f + + + + name + Other: Add + scope + other.add + settings + + foreground + #2aa198 + + + + name + Tex: {} + scope + punctuation.section.group.tex , punctuation.definition.arguments.begin.latex, punctuation.definition.arguments.end.latex, punctuation.definition.arguments.latex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: {text} + scope + meta.group.braces.tex + settings + + fontStyle + + foreground + #b58900 + + + + name + Tex: Other Math + scope + string.other.math.tex + settings + + fontStyle + + foreground + #b58900 + + + + name + Tex: {var} + scope + variable.parameter.function.latex + settings + + fontStyle + + foreground + #cb4b16 + + + + name + Tex: Math \\ + scope + punctuation.definition.constant.math.tex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: Constant Math + scope + text.tex.latex constant.other.math.tex, constant.other.general.math.tex, constant.other.general.math.tex, constant.character.math.tex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Tex: Other Math String + scope + string.other.math.tex + settings + + fontStyle + + foreground + #b58900 + + + + name + Tex: $ + scope + punctuation.definition.string.begin.tex, punctuation.definition.string.end.tex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: \label + scope + keyword.control.label.latex, text.tex.latex constant.other.general.math.tex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Tex: \label { } + scope + variable.parameter.definition.label.latex + settings + + fontStyle + + foreground + #dc322f + + + + name + Tex: Function + scope + support.function.be.latex + settings + + fontStyle + + foreground + #859900 + + + + name + Tex: Support Function Section + scope + support.function.section.latex + settings + + fontStyle + + foreground + #cb4b16 + + + + name + Tex: Support Function + scope + support.function.general.tex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Tex: Comment + scope + punctuation.definition.comment.tex, comment.line.percentage.tex + settings + + fontStyle + italic + + + + name + Tex: Reference Label + scope + keyword.control.ref.latex + settings + + fontStyle + + foreground + #2aa198 + + + + name + Python: docstring + scope + string.quoted.double.block.python + settings + + fontStyle + + foreground + #586e75 + + + + name + Python: storage + scope + storage.type.class.python, storage.type.function.python, storage.modifier.global.python + settings + + fontStyle + + foreground + #859900 + + + + name + Python: import + scope + keyword.control.import.python, keyword.control.import.from.python + settings + + foreground + #cb4b16 + + + + name + Python: Support.exception + scope + support.type.exception.python + settings + + foreground + #b58900 + + + + name + Shell: builtin + scope + support.function.builtin.shell + settings + + foreground + #859900 + + + + name + Shell: variable + scope + variable.other.normal.shell + settings + + foreground + #cb4b16 + + + + name + Shell: DOT_FILES + scope + source.shell + settings + + fontStyle + + foreground + #268BD2 + + + + name + Shell: meta scope in loop + scope + meta.scope.for-in-loop.shell, variable.other.loop.shell + settings + + fontStyle + + foreground + #586e75 + + + + name + Shell: "" + scope + punctuation.definition.string.end.shell, punctuation.definition.string.begin.shell + settings + + fontStyle + + foreground + #859900 + + + + name + Shell: Meta Block + scope + meta.scope.case-block.shell, meta.scope.case-body.shell + settings + + fontStyle + + foreground + #586e75 + + + + name + Shell: [] + scope + punctuation.definition.logical-expression.shell + settings + + fontStyle + + foreground + #dc322f + + + + name + Shell: Comment + scope + comment.line.number-sign.shell + settings + + fontStyle + italic + + + + name + Java: import + scope + keyword.other.import.java + settings + + fontStyle + + foreground + #cb4b16 + + + + name + Java: meta-import + scope + storage.modifier.import.java + settings + + fontStyle + + foreground + #586E75 + + + + name + Java: Class + scope + meta.class.java storage.modifier.java + settings + + fontStyle + + foreground + #b58900 + + + + name + Java: /* comment */ + scope + source.java comment.block + settings + + fontStyle + + foreground + #586e75 + + + + name + Java: /* @param */ + scope + comment.block meta.documentation.tag.param.javadoc keyword.other.documentation.param.javadoc + settings + + fontStyle + + foreground + #586e75 + + + + name + Perl: variables + scope + punctuation.definition.variable.perl, variable.other.readwrite.global.perl, variable.other.predefined.perl, keyword.operator.comparison.perl + settings + + foreground + #B58900 + + + + name + Perl: functions + scope + support.function.perl + settings + + foreground + #859900 + + + + name + Perl: comments + scope + comment.line.number-sign.perl + settings + + fontStyle + italic + foreground + #586E75 + + + + name + Perl: quotes + scope + punctuation.definition.string.begin.perl, punctuation.definition.string.end.perl + settings + + foreground + #2AA198 + + + + name + Perl: \char + scope + constant.character.escape.perl + settings + + foreground + #DC322F + + + + + name + Markdown: Headings + scope + markup.heading.markdown, markup.heading.1.markdown, markup.heading.2.markdown, markup.heading.3.markdown, markup.heading.4.markdown, markup.heading.5.markdown, markup.heading.6.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Bold + scope + markup.bold.markdown + settings + + fontStyle + bold + foreground + #b4b4b9 + + + + name + Markdown: Italic + scope + markup.italic.markdown + settings + + fontStyle + italic + foreground + #b4b4b9 + + + + name + Markdown: Punctuation for Bold, Italic, and Inline Block + scope + punctuation.definition.bold.markdown, punctuation.definition.italic.markdown, punctuation.definition.raw.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Bulleted List + scope + markup.list.unnumbered.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Numbered List + scope + markup.list.numbered.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Block and Inline Block + scope + markup.raw.block.markdown, markup.raw.inline.markdown + settings + + foreground + #b4b4b9 + + + + name + Markdown: Quote Block and Punctuation + scope + markup.quote.markdown, punctuation.definition.blockquote.markdown + settings + + foreground + #b4b4b9 + + + + name + Markdown: Seperator + scope + meta.separator.markdown + settings + + foreground + #ff761a + + + + name + Markdown: Link and Reference URL + scope + meta.image.inline.markdown, markup.underline.link.markdown + settings + + fontStyle + italic + foreground + #99a4bc + + + + name + Markdown: Link Title, Image Description + scope + string.other.link.title.markdown, string.other.link.description.markdown + settings + + foreground + #99a4bc + + + + name + Markdown: Angle Brakets on Link and Image + scope + punctuation.definition.link.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Parens on Link and Image + scope + punctuation.definition.metadata.markdown + settings + + foreground + #dfdfe5 + + + + name + Markdown: Square Brakets on Link, Image, and Reference + scope + punctuation.definition.string.begin.markdown, punctuation.definition.string.end.markdown, punctuation.definition.constant.markdown + settings + + foreground + #dfdfe5 + + + + name + SublimeLinter Annotations + scope + sublimelinter.notes + settings + + background + #eee8d5 + foreground + #eee8d5 + + + + name + SublimeLinter Error Outline + scope + sublimelinter.outline.illegal + settings + + background + #93A1A1 + foreground + #93A1A1 + + + + name + SublimeLinter Error Underline + scope + sublimelinter.underline.illegal + settings + + background + #DC322F + + + + name + SublimeLinter Warning Outline + scope + sublimelinter.outline.warning + settings + + background + #839496 + foreground + #839496 + + + + name + SublimeLinter Warning Underline + scope + sublimelinter.underline.warning + settings + + background + #B58900 + + + + name + SublimeLinter Violation Outline + scope + sublimelinter.outline.violation + settings + + background + #657b83 + foreground + #657b83 + + + + name + SublimeLinter Violation Underline + scope + sublimelinter.underline.violation + settings + + background + #ff3600 + + + + + uuid + A4299D9C-1DE5-4BC4-87F6-A757E71B1597 + colorSpaceName + sRGB + + diff --git a/.vim/colors/falcon/support/alfred.jpg b/.vim/colors/falcon/support/alfred.jpg new file mode 100755 index 0000000..423e644 Binary files /dev/null and b/.vim/colors/falcon/support/alfred.jpg differ diff --git a/.vim/colors/falcon/support/alfred_alternate.jpg b/.vim/colors/falcon/support/alfred_alternate.jpg new file mode 100755 index 0000000..ccc2596 Binary files /dev/null and b/.vim/colors/falcon/support/alfred_alternate.jpg differ diff --git a/.vim/colors/falcon/support/hero2.png b/.vim/colors/falcon/support/hero2.png new file mode 100755 index 0000000..d25a05f Binary files /dev/null and b/.vim/colors/falcon/support/hero2.png differ diff --git a/.vim/colors/falcon/support/logo2.png b/.vim/colors/falcon/support/logo2.png new file mode 100755 index 0000000..f16c162 Binary files /dev/null and b/.vim/colors/falcon/support/logo2.png differ diff --git a/.vim/colors/falcon/support/snaps/c.png b/.vim/colors/falcon/support/snaps/c.png new file mode 100755 index 0000000..52bf862 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/c.png differ diff --git a/.vim/colors/falcon/support/snaps/clojure.png b/.vim/colors/falcon/support/snaps/clojure.png new file mode 100755 index 0000000..cf1a266 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/clojure.png differ diff --git a/.vim/colors/falcon/support/snaps/cpp.png b/.vim/colors/falcon/support/snaps/cpp.png new file mode 100755 index 0000000..d4ee604 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/cpp.png differ diff --git a/.vim/colors/falcon/support/snaps/css.png b/.vim/colors/falcon/support/snaps/css.png new file mode 100755 index 0000000..d931072 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/css.png differ diff --git a/.vim/colors/falcon/support/snaps/elm.png b/.vim/colors/falcon/support/snaps/elm.png new file mode 100755 index 0000000..5e2102b Binary files /dev/null and b/.vim/colors/falcon/support/snaps/elm.png differ diff --git a/.vim/colors/falcon/support/snaps/exa.png b/.vim/colors/falcon/support/snaps/exa.png new file mode 100755 index 0000000..64843e3 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/exa.png differ diff --git a/.vim/colors/falcon/support/snaps/gitr.png b/.vim/colors/falcon/support/snaps/gitr.png new file mode 100755 index 0000000..32f8596 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/gitr.png differ diff --git a/.vim/colors/falcon/support/snaps/go.png b/.vim/colors/falcon/support/snaps/go.png new file mode 100755 index 0000000..486a05c Binary files /dev/null and b/.vim/colors/falcon/support/snaps/go.png differ diff --git a/.vim/colors/falcon/support/snaps/js.png b/.vim/colors/falcon/support/snaps/js.png new file mode 100755 index 0000000..f5d0261 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/js.png differ diff --git a/.vim/colors/falcon/support/snaps/json.png b/.vim/colors/falcon/support/snaps/json.png new file mode 100755 index 0000000..0074974 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/json.png differ diff --git a/.vim/colors/falcon/support/snaps/lua.png b/.vim/colors/falcon/support/snaps/lua.png new file mode 100755 index 0000000..a402839 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/lua.png differ diff --git a/.vim/colors/falcon/support/snaps/php.png b/.vim/colors/falcon/support/snaps/php.png new file mode 100755 index 0000000..ab4bedd Binary files /dev/null and b/.vim/colors/falcon/support/snaps/php.png differ diff --git a/.vim/colors/falcon/support/snaps/python.png b/.vim/colors/falcon/support/snaps/python.png new file mode 100755 index 0000000..479efbd Binary files /dev/null and b/.vim/colors/falcon/support/snaps/python.png differ diff --git a/.vim/colors/falcon/support/snaps/ruby.png b/.vim/colors/falcon/support/snaps/ruby.png new file mode 100755 index 0000000..b1336c1 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/ruby.png differ diff --git a/.vim/colors/falcon/support/snaps/startup.png b/.vim/colors/falcon/support/snaps/startup.png new file mode 100755 index 0000000..9c0f2fb Binary files /dev/null and b/.vim/colors/falcon/support/snaps/startup.png differ diff --git a/.vim/colors/falcon/support/snaps/twig.png b/.vim/colors/falcon/support/snaps/twig.png new file mode 100755 index 0000000..fac1253 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/twig.png differ diff --git a/.vim/colors/falcon/support/snaps/vim.png b/.vim/colors/falcon/support/snaps/vim.png new file mode 100755 index 0000000..5ef279d Binary files /dev/null and b/.vim/colors/falcon/support/snaps/vim.png differ diff --git a/.vim/colors/falcon/support/snaps/zsh.png b/.vim/colors/falcon/support/snaps/zsh.png new file mode 100755 index 0000000..f6fb076 Binary files /dev/null and b/.vim/colors/falcon/support/snaps/zsh.png differ diff --git a/.vim/colors/falcon/support/swatches_terminal.png b/.vim/colors/falcon/support/swatches_terminal.png new file mode 100755 index 0000000..911dc1e Binary files /dev/null and b/.vim/colors/falcon/support/swatches_terminal.png differ diff --git a/.vim/colors/falcon/support/swatches_vim.png b/.vim/colors/falcon/support/swatches_vim.png new file mode 100755 index 0000000..abcf6ac Binary files /dev/null and b/.vim/colors/falcon/support/swatches_vim.png differ diff --git a/.vim/colors/falcon/taskwarrior/falcon.theme b/.vim/colors/falcon/taskwarrior/falcon.theme new file mode 100755 index 0000000..ce402ab --- /dev/null +++ b/.vim/colors/falcon/taskwarrior/falcon.theme @@ -0,0 +1,99 @@ +################################################################################ +# +# Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. +# +# 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. +# +# http://www.opensource.org/licenses/mit-license.php +# +############################################################################### + +# Taskwarrior falcon theme. + +rule.precedence.color=deleted,completed,active,keyword.,tag.,project.,overdue,scheduled,due.today,due,blocked,blocking,recurring,tagged,uda. + +# General decoration +color.label= +color.label.sort= +color.alternate=on color0 +color.header=color15 +color.footnote=color195 +color.warning=color0 on color3 +color.error=color195 +color.debug=color249 + +# Task state +color.completed= +color.deleted= +color.active=bold color207 on color8 +color.recurring=color4 +color.scheduled= +color.until= +color.blocked=bold color253 on color235 +color.blocking=color253 on color237 + +# Project +color.project.none= + +# Priority +color.uda.priority.H=bold color3 +color.uda.priority.M=bold color5 +color.uda.priority.L=bold color4 + +# Tags +color.tag.next= +color.tag.none= +color.tagged=color110 + +# Due +color.due=color230 +color.due.today=color1 +color.overdue=bold color15 on color1 + +# Report: burndown +color.burndown.done=color0 on color2 +color.burndown.pending=color0 on color1 +color.burndown.started=color0 on color3 + +# Report: history +color.history.add=color0 on color1 +color.history.delete=color0 on color3 +color.history.done=color0 on color2 + +# Report: summary +color.summary.background=on color0 +color.summary.bar=color0 on color110 + +# Command: calendar +color.calendar.due=color0 on color230 +color.calendar.due.today=color0 on color1 +color.calendar.holiday=color0 on color3 +color.calendar.overdue=color0 on color5 +color.calendar.today=color0 on color207 +color.calendar.weekend=on color0 +color.calendar.weeknumber=color110 + +# Command: sync +color.sync.added=color110 +color.sync.changed=color9 +color.sync.rejected=color13 + +# Command: undo +color.undo.after=color2 +color.undo.before=color1 diff --git a/.vim/colors/falcon/terminal/falcon.terminal b/.vim/colors/falcon/terminal/falcon.terminal new file mode 100755 index 0000000..32e9ade --- /dev/null +++ b/.vim/colors/falcon/terminal/falcon.terminal @@ -0,0 +1,1609 @@ + + + + + ANSIBlackColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEBMwIDAgMC4wMTU2 + ODYyNzQ1MSAxTxASMCAwIDAuMDE5MzYyNDQ5NjUAEAGAAoAG0xQVDRYXGFROU0lEVU5T + SUNDEAeAA4AF0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAH + zgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA + AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA + ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBk + bWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz + AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAE + PAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29t + cGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC + IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAA + AFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA + JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1 + bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4x + IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx + OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU + Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA + AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA + AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA + fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7 + AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB + qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE + Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YD + ogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw + BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG + jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha + CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoK + gQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZ + DPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oP + lg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE + EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V + 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlr + GZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd + cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGh + Ic4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3Jicm + VyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 + K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGww + pDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3 + NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8 + ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 + QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJ + qUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 + UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y + fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBX + YKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo + 7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV + cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7 + BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSA + hOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaO + zo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk + mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak + VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L + sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 + p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ + yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU + y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM + 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv + zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 + /kv+3P9t//+ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg + IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj + ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa + ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMAKIAtwC5ALsAvQDEAMkAzwDRANMA1QDaAOIN + Lg0wDTUNQA1JDVcNWw1iDWsNcA19DYANjQ2SDZoNnQ2vDbINtwAAAAAAAAIBAAAAAAAA + AC8AAAAAAAAAAAAAAAAAAA25 + + ANSIBlueColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjM4ODIzNTI5 + NDEgMC4zMTc2NDcwNTg4IDAuNTc2NDcwNTg4MiAxTxAnMC4zMTI1MjcyMDk1IDAuMjM1 + ODUxNDY2NyAwLjUwMzg0MTgxNzQAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightBlackColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECwwLjAwNzg0MzEz + NzI1NSAwLjAwNzg0MzEzNzI1NSAwLjEyNTQ5MDE5NjEgMU8QLDAuMDA5MjM2NzEwMTQ2 + IDAuMDAyMTM1NzE1NDQ3IDAuMDk0ODA4NDg5MDgAEAGAAoAG0xQVDRYXGFROU0lEVU5T + SUNDEAeAA4AF0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAH + zgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA + AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA + ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBk + bWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz + AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAE + PAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29t + cGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC + IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAA + AFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA + JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1 + bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4x + IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx + OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU + Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA + AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA + AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA + fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7 + AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB + qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE + Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YD + ogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw + BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG + jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha + CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoK + gQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZ + DPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oP + lg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE + EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V + 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlr + GZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd + cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGh + Ic4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3Jicm + VyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 + K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGww + pDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3 + NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8 + ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 + QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJ + qUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 + UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y + fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBX + YKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo + 7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV + cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7 + BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSA + hOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaO + zo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk + mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak + VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L + sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 + p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ + yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU + y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM + 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv + zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 + /kv+3P9t//+ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg + IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj + ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa + ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALsA6gDsAO4A8AD3APwBAgEEAQYBCAENARUN + YQ1jDWgNcw18DYoNjg2VDZ4Now2wDbMNwA3FDc0N0A3iDeUN6gAAAAAAAAIBAAAAAAAA + AC8AAAAAAAAAAAAAAAAAAA3s + + ANSIBrightBlueColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjYgMC42NDMx + MzcyNTQ5IDAuNzMzMzMzMzMzMyAxTxAmMC41MzA2MjE2NDc4IDAuNTczODM0Nzc2OSAw + LjY3NzY5MTEwMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXSGg0bHFdOUy5k + YXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZU + AAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rl + c2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoA + AAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANM + AAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAA + DHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJp + Z2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJz + UkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAA + AAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAA + A5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAA + AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cu + aWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNl + IC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3Vy + IHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZl + cmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAs + UmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4A + AAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA + AAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgA + LQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACp + AK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIB + OAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHy + AfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC + 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQT + BCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcF + hgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcr + Bz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJ + JQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR + C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN + 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCb + ELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT + xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd + F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa + 7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7p + HxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgj + ZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN + KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwt + QS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKb + MtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4 + jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6g + PuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJF + VUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq + THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19T + qlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtF + W5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Nj + l2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/ + bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 + KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i + fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASI + aYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6 + kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed + ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhS + qMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660 + JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1 + wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM + tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls + 2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbn + H+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC + 9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE0h4fICFaJGNs + YXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFYTlNPYmplY3TS + Hh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlNDb2xvcqIpI18Q + D05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/AEUAUABdAGMA + cACFAIwArgDXANkA2wDdAOQA6QDvAPEA8wD1APoBAg1ODVANVQ1gDWkNdw17DYINiw2Q + DZ0NoA2tDbINug29Dc8N0g3XAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAAAAAAAAAADdk= + + ANSIBrightCyanColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB8wLjU0OTAxOTYw + NzggMC44IDAuNzQ5MDE5NjA3OCAxTxAnMC40ODQxNzc1Mjk4IDAuNzYyMjY4MDY2NCAw + LjY5NTg4ODUxOTMAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF0hoNGxxXTlMu + ZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNG + VAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNk + ZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFla + AAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD + TAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAA + AAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHly + aWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAAS + c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA + AAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUA + AAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3 + LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFj + ZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91 + ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVm + ZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA + LFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1ye + AAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAo + AC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQA + qQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy + ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB + 8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLg + AusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYE + EwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 + BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkH + Kwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQ + CSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkL + UQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3D + Dd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4Q + mxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOk + E8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoX + HRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrF + GuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e + 6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4 + I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9wo + DSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M + LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMy + mzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQ + OIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+ + oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUS + RVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JM + KkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1Nf + U6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVb + RVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GND + Y5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr + /2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTM + dSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+ + Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gE + iGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGS + epLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3 + nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+Co + UqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu + tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/ + 9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1 + zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZ + bNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW + 5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0 + wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+ABNIeHyAhWiRj + bGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRhWE5TT2JqZWN0 + 0h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05TQ29sb3KiKSNf + EA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcAPwBFAFAAXQBj + AHAAhQCMAK4A2ADaANwA3gDlAOoA8ADyAPQA9gD7AQMNTw1RDVYNYQ1qDXgNfA2DDYwN + kQ2eDaENrg2zDbsNvg3QDdMN2AAAAAAAAAIBAAAAAAAAAC8AAAAAAAAAAAAAAAAAAA3a + + ANSIBrightGreenColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjY5NDExNzY0 + NzEgMC43NDkwMTk2MDc4IDAuNDgyMzUyOTQxMiAxTxAnMC42MzU2Njk2NDg2IDAuNzA1 + NDY2NDQ5MyAwLjQwNzc5Nzg0MzIAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightMagentaColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC42OTAxOTYwNzg0IDAuNTAxOTYwNzg0MyAxTxAnMC45ODc0NzQ2MjAzIDAuNjI2 + MDc3MTE1NSAwLjQyODQ3NDYwNTEAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightRedColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC41NjA3ODQzMTM3IDAuNDgyMzUyOTQxMiAxTxAnMC45ODUwNDk2MDU0IDAuNDc2 + MTA3NDE4NSAwLjQwODQxODIzODIAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIBrightWhiteColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0wLjk3MjU0OTAx + OTYgMC45NzI1NDkwMTk2IDEgMU8QJzAuOTY1Mzg2ODY3NSAwLjk2NDIzMzc1NjEgMC45 + OTk4ODA5MDk5ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + ANSIBrightYellowColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0xIDAuODI3NDUw + OTgwNCAwLjU5MjE1Njg2MjcgMU8QJzAuOTk1NTMyNjMxOSAwLjc5MTI1NjA3MDEgMC41 + MjI3ODYyNTk3ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + ANSICyanColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjIxOTYwNzg0 + MzEgMC43NDkwMTk2MDc4IDAuNjQ3MDU4ODIzNSAxTxAnMC4xOTM0MzMyNjk5IDAuNzA2 + ODY3ODczNyAwLjU4MDY4MjAzOTMAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIGreenColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjQ0MzEzNzI1 + NDkgMC41NTY4NjI3NDUxIDAuMjc0NTA5ODAzOSAxTxAnMC4zNzE0OTQ3NzAxIDAuNDky + NzgxOTA3MyAwLjIxMjg3MDY4NzIAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIMagentaColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC40NjY2NjY2NjY3IDAuMTgwMzkyMTU2OSAxTxAnMC45ODM4NzA1MDYzIDAuMzc4 + MTUyNzI4MSAwLjE0MDM5MTQ5ODgAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + ANSIRedColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjk5NjA3ODQz + MTQgMC4yMjM1Mjk0MTE4IDAuMTAxOTYwNzg0MyAxTxAoMC45ODE2ODI0MTk4IDAuMTIy + ODEzMDYwOSAwLjA4NTc5NjAyODM4ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOA + BdIaDRscV05TLmRhdGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYA + MQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAg + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3By + dAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAA + AhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQA + AACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAk + dGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4 + dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRl + c2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2 + Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAA + AAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAA + ts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMg + aHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBj + b2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0 + IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MA + AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA + AAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD + 7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAA + AAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAP + ABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsA + kACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQET + ARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEB + yQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKs + ArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD + 0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUr + BToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG + 0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiq + CL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK + 3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1A + DVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQ + CRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMD + EyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkW + bBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoE + GioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHewe + Fh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJV + IoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3Jugn + GCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwF + LDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUox + gjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426Tck + N2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9 + YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA + RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1K + xEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1Hm + UjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZ + uFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2Gi + YfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFq + SGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMB + c11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8 + gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YO + hnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQ + bpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrV + m0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pamm + GqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFg + sdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9 + j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5 + yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW + 2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr + 5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx + //KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf// + gATSHh8gIVokY2xhc3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0 + YVhOU09iamVjdNIeHyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldO + U0NvbG9yoikjXxAPTlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3 + AD8ARQBQAF0AYwBwAIUAjAC3AOIA5ADmAOgA7wD0APoA/AD+AQABBQENDVkNWw1gDWsN + dA2CDYYNjQ2WDZsNqA2rDbgNvQ3FDcgN2g3dDeIAAAAAAAACAQAAAAAAAAAvAAAAAAAA + AAAAAAAAAAAN5A== + + ANSIWhiteColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjcwNTg4MjM1 + MjkgMC43MDU4ODIzNTI5IDAuNzI1NDkwMTk2MSAxTxAmMC42NDY3MjkzNTAxIDAuNjQ1 + OTgzOTk0IDAuNjY5MDE2MDYzMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + ANSIYellowColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0xIDAuNzcyNTQ5 + MDE5NiAwLjM3MjU0OTAxOTYgMU8QJzAuOTk0MzQ4OTQzMiAwLjcyNzk1ODkxNzYgMC4z + MDMwNjMzOTI2ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECwwLjAwNzg0MzEz + NzI1NSAwLjAwNzg0MzEzNzI1NSAwLjEyNTQ5MDE5NjEgMU8QLDAuMDA5MjM2NzEwMTQ2 + IDAuMDAyMTM1NzE1NDQ3IDAuMDk0ODA4NDg5MDgAEAGAAoAG0xQVDRYXGFROU0lEVU5T + SUNDEAeAA4AF0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAH + zgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA + AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAA + ABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBk + bWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz + AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAE + PAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29t + cGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC + IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAA + AFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAA + JKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAA + AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1 + bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4x + IERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx + OTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ + RUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAU + Xy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA + AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQA + AAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcA + fACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7 + AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB + qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKE + Ao4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YD + ogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw + BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsG + jAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha + CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoK + gQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZ + DPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oP + lg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKE + EqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V + 4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlr + GZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcd + cB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGh + Ic4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3Jicm + VyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2 + K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGww + pDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3 + NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8 + ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 + QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJ + qUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 + UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y + fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBX + YKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo + 7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGV + cfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7 + BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSA + hOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaO + zo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkk + mZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+ak + VqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+L + sACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67 + p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/ + yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU + y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM + 4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070Dv + zPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 + /kv+3P9t//+ABNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMg + IiNWTlNEYXRhWE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFj + ZdIeHykqV05TQ29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAa + ACMALQAyADcAPwBFAFAAXQBjAHAAhQCMALsA6gDsAO4A8AD3APwBAgEEAQYBCAENARUN + YQ1jDWgNcw18DYoNjg2VDZ4Now2wDbMNwA3FDc0N0A3iDeUN6gAAAAAAAAIBAAAAAAAA + AC8AAAAAAAAAAAAAAAAAAA3s + + CursorColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0xIDAuOTA5ODAz + OTIxNiAwLjc2NDcwNTg4MjQgMU8QJzAuOTk3NjE2MDUyNiAwLjg5MDczOTY3OTMgMC43 + MTUxMzQ5MTg3ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + Font + + YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs + YXNzI0AsAAAAAAAAEBCAAoADXxAgRnVyYUNvZGVOZXJkRm9udENvbXBsZXRlLVJlZ3Vs + YXLSExQVFlokY2xhc3NuYW1lWCRjbGFzc2VzVk5TRm9udKIVF1hOU09iamVjdF8QD05T + S2V5ZWRBcmNoaXZlctEaG1Ryb290gAEIERojLTI3PEJLUltiaXJ0dniboKu0u77H2dzh + AAAAAAAAAQEAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAOM= + + ProfileCurrentVersion + 2.0499999999999998 + SelectionColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjg2NjY2NjY2 + NjcgMC44MTE3NjQ3MDU5IDAuNzUyOTQxMTc2NSAxTxAmMC44MzM2ODE1MjM4IDAuNzcw + MzczNTgyOCAwLjcwMTAwMjEyMQAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPEB0wLjk3MjU0OTAx + OTYgMC45NzI1NDkwMTk2IDEgMU8QJzAuOTY1Mzg2ODY3NSAwLjk2NDIzMzc1NjEgMC45 + OTk4ODA5MDk5ABABgAKABtMUFQ0WFxhUTlNJRFVOU0lDQxAHgAOABdIaDRscV05TLmRh + dGFPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQA + AAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVz + YwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAA + AiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wA + AACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAM + clRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmln + aHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS + R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAAD + kFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAA + ABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5p + ZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2Ug + LSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIg + c3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVy + ZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxS + ZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAA + AAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA + AAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAt + ADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkA + rgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4 + AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB + +gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALr + AvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME + IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWG + BZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysH + PQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAkl + CToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1EL + aQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3e + DfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ + uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPF + E+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0X + QRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrs + GxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+Hukf + Ex8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm + I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0o + PyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1B + LXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy + 1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiM + OMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+ + 4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVV + RZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpM + cky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq + U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0Vb + lVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OX + Y+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9s + V2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUo + dYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+ + wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp + iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS + 45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951k + ndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKo + xKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQl + tJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA + cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1 + zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ + 8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf + 56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1 + UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf//gATSHh8gIVokY2xh + c3NuYW1lWCRjbGFzc2VzXU5TTXV0YWJsZURhdGGjICIjVk5TRGF0YVhOU09iamVjdNIe + HyUmXE5TQ29sb3JTcGFjZaInI1xOU0NvbG9yU3BhY2XSHh8pKldOU0NvbG9yoikjXxAP + TlNLZXllZEFyY2hpdmVy0S0uVHJvb3SAAQAIABEAGgAjAC0AMgA3AD8ARQBQAF0AYwBw + AIUAjACsANYA2ADaANwA4wDoAO4A8ADyAPQA+QEBDU0NTw1UDV8NaA12DXoNgQ2KDY8N + nA2fDawNsQ25DbwNzg3RDdYAAAAAAAACAQAAAAAAAAAvAAAAAAAAAAAAAAAAAAAN2A== + + TextColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjcwNTg4MjM1 + MjkgMC43MDU4ODIzNTI5IDAuNzI1NDkwMTk2MSAxTxAmMC42NDY3MjkzNTAxIDAuNjQ1 + OTgzOTk0IDAuNjY5MDE2MDYzMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtwDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + name + falcon + type + Window Settings + + diff --git a/.vim/colors/falcon/timewarrior/falcon.theme b/.vim/colors/falcon/timewarrior/falcon.theme new file mode 100755 index 0000000..6e827b4 --- /dev/null +++ b/.vim/colors/falcon/timewarrior/falcon.theme @@ -0,0 +1,44 @@ +############################################################################### +# +# Copyright 2015 - 2016, Paul Beckingham, Federico Hernandez. +# +# 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. +# +# https://www.opensource.org/licenses/mit-license.php +# +############################################################################### + +define theme: + description = "falcon.theme" + colors: + # General UI color. + exclusion = "gray8 on gray4" + today = "color3" + holiday = "gray4" + label = "color249" + ids = "color12" + debug = "blue" + + # Rotating Color Palette for tags. The leading zeroes allow the order to be + # preserved. + palette: + color01 = "color7 on color3" + color02 = "color7 on color4" + color03 = "color7 on color5" + color04 = "color7 on color6" diff --git a/.vim/colors/falcon/tmux/falcon.tmux.conf b/.vim/colors/falcon/tmux/falcon.tmux.conf new file mode 100755 index 0000000..1c45cfd --- /dev/null +++ b/.vim/colors/falcon/tmux/falcon.tmux.conf @@ -0,0 +1,36 @@ +# status +set -g status "on" +set -g status-style "bg=#020221,none,align=left" + +# messages +set -g message-style "fg=#b4b4b9,bg=#020221" +set -g message-command-style "fg=#99a4bc,bg=#020221" + +# panes +set -g pane-border-style "fg=#57575e,bg=#151521" +set -g pane-active-border-style "fg=#57575e,bg=#020221" + +# put a line above the status +set -g pane-border-status bottom +set -g pane-border-format '─' + +# selection +set -g mode-style "fg=#dfdfe5,bg=#2f0e82" + +# active / inactive pane bg +set -g window-style "bg=#151521" +set -g window-active-style "bg=#020221" + +# window status +setw -g window-status-style "fg=#b4b4b9,bg=black,none" +setw -g window-status-activity-style "fg=magenta,bg=#36363a,none" +setw -g window-status-separator "" +setw -g window-status-format "#[fg=#787882,bg=#020221] #I:#W " +setw -g window-status-current-format "#[fg=white,bg=#020221] #I#[fg=#787882]:#[fg=yellow]#{?window_zoomed_flag,#[fg=#c8d0e3](,}#W#{?window_zoomed_flag,#[fg=#c8d0e3]),} " + +set -g status-left-style "none" +set -g status-right-style "none" +set -g status-left-length "100" +set -g status-right-length "100" +set -g status-left "#[fg=white] #S #[fg=#57575e]│ " +set -g status-right "#[fg=yellow,bg=#36363a]$USER@#h #[fg=#787882]│ #[fg=white]%d/%m/%Y %H:%M " diff --git a/.vim/colors/falcon/tmux/falcon.tmux.conf.pre-2.9 b/.vim/colors/falcon/tmux/falcon.tmux.conf.pre-2.9 new file mode 100755 index 0000000..d92159f --- /dev/null +++ b/.vim/colors/falcon/tmux/falcon.tmux.conf.pre-2.9 @@ -0,0 +1,46 @@ +# status +set -g status-justify "left" +set -g status "on" +set -g status-attr "none" +set -g status-bg "#020221" + +# messages +set -g message-fg "#b4b4b9" +set -g message-bg "#020221" +set -g message-command-fg "#99a4bc" +set -g message-command-bg "#020221" + +# panes +set -g pane-active-border-fg "#57575e" +set -g pane-active-border-bg "#020221" +set -g pane-border-fg "#57575e" +set -g pane-border-bg "#151521" + +# put a line above the status +set -g pane-border-status bottom +set -g pane-border-format '─' + +# selection +set -g mode-style "fg=#dfdfe5,bg=#2f0e82" + +# active / inactive pane bg +set -g window-style "bg=#151521" +set -g window-active-style "bg=#020221" + +# window status +setw -g window-status-fg "#b4b4b9" +setw -g window-status-attr "none" +setw -g window-status-activity-bg "#36363a" +setw -g window-status-activity-attr "none" +setw -g window-status-activity-fg "magenta" +setw -g window-status-separator "" +setw -g window-status-bg "black" +setw -g window-status-format "#[fg=#787882,bg=#020221] #I:#W " +setw -g window-status-current-format "#[fg=white,bg=#020221] #I#[fg=#787882]:#[fg=yellow]#{?window_zoomed_flag,#[fg=black](,}#W#{?window_zoomed_flag,#[fg=black]),} " + +set -g status-left-attr "none" +set -g status-left-length "100" +set -g status-right-attr "none" +set -g status-right-length "100" +set -g status-left "#[fg=white] #S #[fg=#57575e]│ " +set -g status-right "#[fg=yellow,bg=#36363a]$USER@#h #[fg=#787882]│ #[fg=white]%d/%m/%Y %H:%M " diff --git a/.vim/colors/falcon/wallpapers/geometric_3840x1600.jpg b/.vim/colors/falcon/wallpapers/geometric_3840x1600.jpg new file mode 100755 index 0000000..da6bfa7 Binary files /dev/null and b/.vim/colors/falcon/wallpapers/geometric_3840x1600.jpg differ diff --git a/.vim/colors/falcon/wallpapers/hex2_3840x1600.jpg b/.vim/colors/falcon/wallpapers/hex2_3840x1600.jpg new file mode 100755 index 0000000..bc4cf6a Binary files /dev/null and b/.vim/colors/falcon/wallpapers/hex2_3840x1600.jpg differ diff --git a/.vim/colors/falcon/wallpapers/hex3_3840x1600.jpg b/.vim/colors/falcon/wallpapers/hex3_3840x1600.jpg new file mode 100755 index 0000000..ac6b7ce Binary files /dev/null and b/.vim/colors/falcon/wallpapers/hex3_3840x1600.jpg differ diff --git a/.vim/colors/falcon/wallpapers/hex_3840x1600.jpg b/.vim/colors/falcon/wallpapers/hex_3840x1600.jpg new file mode 100755 index 0000000..c5cf720 Binary files /dev/null and b/.vim/colors/falcon/wallpapers/hex_3840x1600.jpg differ diff --git a/.vim/colors/falcon/zsh/falcon.zsh b/.vim/colors/falcon/zsh/falcon.zsh new file mode 100755 index 0000000..ab00f63 --- /dev/null +++ b/.vim/colors/falcon/zsh/falcon.zsh @@ -0,0 +1,20 @@ +#!/bin/zsh + +# add in colouring to man +# mb = blink +# md = begin bold +# me = end mode +# se = end stand out +# so = begin stand out +# ue = end underline +# us = begin underline +man() { + LESS_TERMCAP_mb=$'\e[01;31m' \ + LESS_TERMCAP_md=$'\e[01;97m' \ + LESS_TERMCAP_me=$'\e[0m' \ + LESS_TERMCAP_so=$'\e[01;48;5;117;30m' \ + LESS_TERMCAP_se=$'\e[0m' \ + LESS_TERMCAP_ue=$'\e[0m' \ + LESS_TERMCAP_us=$'\e[04;94m' \ + command man "$@" +} diff --git a/.vim/colors/gruvbox b/.vim/colors/gruvbox deleted file mode 160000 index bf2885a..0000000 --- a/.vim/colors/gruvbox +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bf2885a95efdad7bd5e4794dd0213917770d79b7 diff --git a/.vim/colors/gruvbox/CHANGELOG.md b/.vim/colors/gruvbox/CHANGELOG.md new file mode 100755 index 0000000..90fd3a2 --- /dev/null +++ b/.vim/colors/gruvbox/CHANGELOG.md @@ -0,0 +1,117 @@ +# Change Log + +## [Unreleased](https://github.com/morhetz/gruvbox/tree/HEAD) + +[Full Changelog](https://github.com/morhetz/gruvbox/compare/v1.3.5...HEAD) + +**Fixed bugs:** + +- Lighter background on terminal [\#8](https://github.com/morhetz/gruvbox/issues/8) + +**Closed issues:** + +- Installation issue. [\#54](https://github.com/morhetz/gruvbox/issues/54) + +- Italic font in terminal\(urxvt\) [\#49](https://github.com/morhetz/gruvbox/issues/49) + +- Unable to log in when sourcing the palette shellscript [\#48](https://github.com/morhetz/gruvbox/issues/48) + +- How can i modify multiple comment scheme [\#46](https://github.com/morhetz/gruvbox/issues/46) + +- Remove comment highlight in iterm [\#44](https://github.com/morhetz/gruvbox/issues/44) + +- Comments looking strange withing tmux [\#43](https://github.com/morhetz/gruvbox/issues/43) + +- comments are reverse-video in xterm [\#41](https://github.com/morhetz/gruvbox/issues/41) + +- What font are you using in the screenshots? [\#39](https://github.com/morhetz/gruvbox/issues/39) + +- vim-signature crashes when I use gruvbox [\#38](https://github.com/morhetz/gruvbox/issues/38) + +- Color of statusbar in inactive windows [\#37](https://github.com/morhetz/gruvbox/issues/37) + +- Go method and struct highlighting missing [\#36](https://github.com/morhetz/gruvbox/issues/36) + +- gruvbox\_256palette.sh doesn't work for Konsole [\#35](https://github.com/morhetz/gruvbox/issues/35) + +- Contrast in jekyll markdown files [\#33](https://github.com/morhetz/gruvbox/issues/33) + +- Pentadactyl Gruvbox Theme [\#32](https://github.com/morhetz/gruvbox/issues/32) + +- make vertsplit better [\#31](https://github.com/morhetz/gruvbox/issues/31) + +- Console support. [\#30](https://github.com/morhetz/gruvbox/issues/30) + +- How can I change the background color? [\#29](https://github.com/morhetz/gruvbox/issues/29) + +- Some words are not bold [\#28](https://github.com/morhetz/gruvbox/issues/28) + +- Terminal theme on base gruvbox [\#25](https://github.com/morhetz/gruvbox/issues/25) + +- Markdown has inverted colors when using \* [\#24](https://github.com/morhetz/gruvbox/issues/24) + +- how install it on mac osx [\#23](https://github.com/morhetz/gruvbox/issues/23) + +- Comments color for Terminal Vim [\#22](https://github.com/morhetz/gruvbox/issues/22) + +- Move palette files to gruvbox-generalized [\#20](https://github.com/morhetz/gruvbox/issues/20) + +- Maybe add Gruvbox Airline theme? [\#19](https://github.com/morhetz/gruvbox/issues/19) + +- For Sublime text [\#18](https://github.com/morhetz/gruvbox/issues/18) + +**Merged pull requests:** + +- Fix the 256 palette script failed login issue [\#53](https://github.com/morhetz/gruvbox/pull/53) ([jonasmalacofilho](https://github.com/jonasmalacofilho)) + +- add minimal coloring for gitcommit highlighting [\#52](https://github.com/morhetz/gruvbox/pull/52) ([daniely](https://github.com/daniely)) + +- For terminals, turn off italics by default. [\#47](https://github.com/morhetz/gruvbox/pull/47) ([ryanmjacobs](https://github.com/ryanmjacobs)) + +- Change color of vertical/horizontal seperators between split windows [\#45](https://github.com/morhetz/gruvbox/pull/45) ([deshtop](https://github.com/deshtop)) + +- Improve gruvbox with C code [\#34](https://github.com/morhetz/gruvbox/pull/34) ([gladiac](https://github.com/gladiac)) + +- Fix for linux console [\#27](https://github.com/morhetz/gruvbox/pull/27) ([vyp](https://github.com/vyp)) + +- Colors for plugin vimshell.vim [\#21](https://github.com/morhetz/gruvbox/pull/21) ([joelmo](https://github.com/joelmo)) + +## [v1.3.5](https://github.com/morhetz/gruvbox/tree/v1.3.5) (2014-03-19) + +[Full Changelog](https://github.com/morhetz/gruvbox/compare/v0.0.8...v1.3.5) + +**Implemented enhancements:** + +- Better selection colors [\#15](https://github.com/morhetz/gruvbox/issues/15) + +- When hlsearch is on, the cursor inverts the search color and not visible [\#2](https://github.com/morhetz/gruvbox/issues/2) + +**Fixed bugs:** + +- Problem with changing between dark and light on 256 color terminal [\#7](https://github.com/morhetz/gruvbox/issues/7) + +- IndentGuides coloring doesn't show up [\#1](https://github.com/morhetz/gruvbox/issues/1) + +**Closed issues:** + +- Requesting rxvt-unicode theme [\#17](https://github.com/morhetz/gruvbox/issues/17) + +- gruvbox\_256palette.sh gets reset \(gnome-terminal on Ubuntu\) [\#13](https://github.com/morhetz/gruvbox/issues/13) + +- Powerline colors [\#12](https://github.com/morhetz/gruvbox/issues/12) + +- Info necessary for making a port of this colorscheme [\#10](https://github.com/morhetz/gruvbox/issues/10) + +**Merged pull requests:** + +- Fix GNU screen detection for \*-bce [\#16](https://github.com/morhetz/gruvbox/pull/16) ([blueyed](https://github.com/blueyed)) + +- Added iTerm2 dark theme [\#11](https://github.com/morhetz/gruvbox/pull/11) ([Greduan](https://github.com/Greduan)) + +- Fix typo in Readme [\#5](https://github.com/morhetz/gruvbox/pull/5) ([ViViDboarder](https://github.com/ViViDboarder)) + +## [v0.0.8](https://github.com/morhetz/gruvbox/tree/v0.0.8) (2012-12-08) + + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/.vim/colors/gruvbox/README.md b/.vim/colors/gruvbox/README.md new file mode 100755 index 0000000..eca249c --- /dev/null +++ b/.vim/colors/gruvbox/README.md @@ -0,0 +1,113 @@ + + +gruvbox is heavily inspired by [badwolf][], [jellybeans][] and [solarized][]. + +Designed as a bright theme with pastel 'retro groove' colors and light/dark mode switching in the way of [solarized][]. The main focus when developing gruvbox is to keep colors easily distinguishable, contrast enough and still pleasant for the eyes. + + [badwolf]: https://github.com/sjl/badwolf + [jellybeans]: https://github.com/nanotech/jellybeans.vim + [solarized]: http://ethanschoonover.com/solarized + +Attention +--------- + +1. [Read this first](https://github.com/morhetz/gruvbox/wiki/Terminal-specific) +2. Typeface from gallery is [Fantasque Sans Mono](https://github.com/belluzj/fantasque-sans) +3. Typeface from screenshots below is [Fira Mono](https://mozilla.github.io/Fira/) + +Screenshots +----------- + +Refer [Gallery][] for more syntax-specific screenshots. + + [Gallery]: https://github.com/morhetz/gruvbox/wiki/Gallery + +### Dark mode + +![Screenshot Dark](http://i.imgur.com/GkIl8Fn.png) + +### Light mode + +![Screenshot Light](http://i.imgur.com/X75niEa.png) + +### Airline theme + +![Screenshot Airline](http://i.imgur.com/wRQceUR.png) + +Palette +------- + +### Dark mode + +![Palette Dark](http://i.imgur.com/wa666xg.png) + +### Light mode + +![Palette Light](http://i.imgur.com/49qKyYW.png) + +Contrast options +---------------- + +Refer [wiki section][] for contrast configuration and other options. + + [wiki section]: https://github.com/morhetz/gruvbox/wiki/Configuration#ggruvbox_contrast_dark + +![Contrast Options](http://i.imgur.com/5MSbe6T.png) + +Documentation +------------- + +Please check [wiki][] for installation details, terminal-specific setup, troubleshooting, configuration options and others. + + [wiki]: https://github.com/morhetz/gruvbox/wiki + +Features +-------- + +* Lots of style-customization options (contrast, color invertion, italics usage etc.) +* Extended filetype highlighting: Html, Xml, Vim, Clojure, C, Python, JavaScript, TypeScript, PureScript, CoffeeScript, Ruby, Objective-C, Go, Lua, MoonScript, Java, Markdown, Haskell, Elixir +* Supported plugins: [EasyMotion][], [vim-sneak][], [Indent Guides][], [indentLine][], [Rainbow Parentheses][], [Airline][], [Lightline][], [GitGutter][], [Signify][], [ShowMarks][], [Signature][], [Syntastic][], [Ale][], [CtrlP][], [Startify][], [NERDTree][], [Dirvish][] + + [EasyMotion]: https://github.com/Lokaltog/vim-easymotion + [vim-sneak]: https://github.com/justinmk/vim-sneak + [Indent Guides]: https://github.com/nathanaelkane/vim-indent-guides + [indentLine]: https://github.com/Yggdroot/indentLine + [Rainbow Parentheses]: https://github.com/kien/rainbow_parentheses.vim + [Airline]: https://github.com/bling/vim-airline + [Lightline]: https://github.com/itchyny/lightline.vim + [GitGutter]: https://github.com/airblade/vim-gitgutter + [Signify]: https://github.com/mhinz/vim-signify + [ShowMarks]: http://www.vim.org/scripts/script.php?script_id=152 + [Signature]: https://github.com/kshenoy/vim-signature + [Syntastic]: https://github.com/scrooloose/syntastic + [Ale]: https://github.com/w0rp/ale + [CtrlP]: https://github.com/kien/ctrlp.vim + [Startify]: https://github.com/mhinz/vim-startify + [NERDTree]: https://github.com/scrooloose/nerdtree + [Dirvish]: https://github.com/justinmk/vim-dirvish + +Contributions +------------- + +See [gruvbox-contrib][] repo for contributions, ports and extras. + +[gruvbox-contrib]: https://github.com/morhetz/gruvbox-contrib + +ToDo +---- + +* Filetype syntax highlighting (R, TeX, Swift, Erlang) +* Plugin support (Tagbar, VimPlug) + +Self-Promotion +-------------- + +If you like gruvbox follow the repository on +[GitHub](https://github.com/morhetz/gruvbox) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=4349). + +License +------- +[MIT/X11][] + + [MIT/X11]: https://en.wikipedia.org/wiki/MIT_License diff --git a/.vim/colors/gruvbox/autoload/airline/themes/gruvbox.vim b/.vim/colors/gruvbox/autoload/airline/themes/gruvbox.vim new file mode 100755 index 0000000..6862a81 --- /dev/null +++ b/.vim/colors/gruvbox/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/.vim/colors/gruvbox/autoload/gruvbox.vim b/.vim/colors/gruvbox/autoload/gruvbox.vim new file mode 100755 index 0000000..44bec6e --- /dev/null +++ b/.vim/colors/gruvbox/autoload/gruvbox.vim @@ -0,0 +1,41 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Vim +" Author: morhetz +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 09 Apr 2014 +" ----------------------------------------------------------------------------- + +function! gruvbox#invert_signs_toggle() + if g:gruvbox_invert_signs == 0 + let g:gruvbox_invert_signs=1 + else + let g:gruvbox_invert_signs=0 + endif + + colorscheme gruvbox +endfunction + +" Search Highlighting {{{ + +function! gruvbox#hls_show() + set hlsearch + call GruvboxHlsShowCursor() +endfunction + +function! gruvbox#hls_hide() + set nohlsearch + call GruvboxHlsHideCursor() +endfunction + +function! gruvbox#hls_toggle() + if &hlsearch + call gruvbox#hls_hide() + else + call gruvbox#hls_show() + endif +endfunction + +" }}} + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/.vim/colors/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/.vim/colors/gruvbox/autoload/lightline/colorscheme/gruvbox.vim new file mode 100755 index 0000000..4730c09 --- /dev/null +++ b/.vim/colors/gruvbox/autoload/lightline/colorscheme/gruvbox.vim @@ -0,0 +1,57 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Gruvbox colorscheme for Lightline (itchyny/lightline.vim) +" Author: gmoe +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 20 Sep 2017 +" ----------------------------------------------------------------------------- + +function! s:getGruvColor(group) + let guiColor = synIDattr(hlID(a:group), "fg", "gui") + let termColor = synIDattr(hlID(a:group), "fg", "cterm") + return [ guiColor, termColor ] +endfunction + +if exists('g:lightline') + + let s:bg0 = s:getGruvColor('GruvboxBg0') + let s:bg1 = s:getGruvColor('GruvboxBg1') + let s:bg2 = s:getGruvColor('GruvboxBg2') + let s:bg4 = s:getGruvColor('GruvboxBg4') + let s:fg1 = s:getGruvColor('GruvboxFg1') + let s:fg4 = s:getGruvColor('GruvboxFg4') + + let s:yellow = s:getGruvColor('GruvboxYellow') + let s:blue = s:getGruvColor('GruvboxBlue') + let s:aqua = s:getGruvColor('GruvboxAqua') + let s:orange = s:getGruvColor('GruvboxOrange') + let s:green = s:getGruvColor('GruvboxGreen') + + let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}, 'terminal':{}} + let s:p.normal.left = [ [ s:bg0, s:fg4, 'bold' ], [ s:fg4, s:bg2 ] ] + let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] + let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ] + let s:p.inactive.right = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] + let s:p.inactive.left = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] + let s:p.inactive.middle = [ [ s:bg4, s:bg1 ] ] + let s:p.insert.left = [ [ s:bg0, s:blue, 'bold' ], [ s:fg1, s:bg2 ] ] + let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] + let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.terminal.left = [ [ s:bg0, s:green, 'bold' ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.right = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.replace.left = [ [ s:bg0, s:aqua, 'bold' ], [ s:fg1, s:bg2 ] ] + let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] + let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.visual.left = [ [ s:bg0, s:orange, 'bold' ], [ s:bg0, s:bg4 ] ] + let s:p.visual.right = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ] + let s:p.visual.middle = [ [ s:fg4, s:bg1 ] ] + let s:p.tabline.left = [ [ s:fg4, s:bg2 ] ] + let s:p.tabline.tabsel = [ [ s:bg0, s:fg4 ] ] + let s:p.tabline.middle = [ [ s:bg0, s:bg0 ] ] + let s:p.tabline.right = [ [ s:bg0, s:orange ] ] + let s:p.normal.error = [ [ s:bg0, s:orange ] ] + let s:p.normal.warning = [ [ s:bg2, s:yellow ] ] + + let g:lightline#colorscheme#gruvbox#palette = lightline#colorscheme#flatten(s:p) +endif diff --git a/.vim/colors/gruvbox/colors/gruvbox.vim b/.vim/colors/gruvbox/colors/gruvbox.vim new file mode 100755 index 0000000..66246fb --- /dev/null +++ b/.vim/colors/gruvbox/colors/gruvbox.vim @@ -0,0 +1,1418 @@ +" ----------------------------------------------------------------------------- +" File: gruvbox.vim +" Description: Retro groove color scheme for Vim +" Author: morhetz +" Source: https://github.com/morhetz/gruvbox +" Last Modified: 12 Aug 2017 +" ----------------------------------------------------------------------------- + +" Supporting code ------------------------------------------------------------- +" Initialisation: {{{ + +if version > 580 + hi clear + if exists("syntax_on") + syntax reset + endif +endif + +let g:colors_name='gruvbox' + +if !(has('termguicolors') && &termguicolors) && !has('gui_running') && &t_Co != 256 + finish +endif + +" }}} +" Global Settings: {{{ + +if !exists('g:gruvbox_bold') + let g:gruvbox_bold=1 +endif +if !exists('g:gruvbox_italic') + if has('gui_running') || $TERM_ITALICS == 'true' + let g:gruvbox_italic=1 + else + let g:gruvbox_italic=0 + endif +endif +if !exists('g:gruvbox_undercurl') + let g:gruvbox_undercurl=1 +endif +if !exists('g:gruvbox_underline') + let g:gruvbox_underline=1 +endif +if !exists('g:gruvbox_inverse') + let g:gruvbox_inverse=1 +endif + +if !exists('g:gruvbox_guisp_fallback') || index(['fg', 'bg'], g:gruvbox_guisp_fallback) == -1 + let g:gruvbox_guisp_fallback='NONE' +endif + +if !exists('g:gruvbox_improved_strings') + let g:gruvbox_improved_strings=0 +endif + +if !exists('g:gruvbox_improved_warnings') + let g:gruvbox_improved_warnings=0 +endif + +if !exists('g:gruvbox_termcolors') + let g:gruvbox_termcolors=256 +endif + +if !exists('g:gruvbox_invert_indent_guides') + let g:gruvbox_invert_indent_guides=0 +endif + +if exists('g:gruvbox_contrast') + echo 'g:gruvbox_contrast is deprecated; use g:gruvbox_contrast_light and g:gruvbox_contrast_dark instead' +endif + +if !exists('g:gruvbox_contrast_dark') + let g:gruvbox_contrast_dark='medium' +endif + +if !exists('g:gruvbox_contrast_light') + let g:gruvbox_contrast_light='medium' +endif + +let s:is_dark=(&background == 'dark') + +" }}} +" Palette: {{{ + +" setup palette dictionary +let s:gb = {} + +" fill it with absolute colors +let s:gb.dark0_hard = ['#1d2021', 234] " 29-32-33 +let s:gb.dark0 = ['#282828', 235] " 40-40-40 +let s:gb.dark0_soft = ['#32302f', 236] " 50-48-47 +let s:gb.dark1 = ['#3c3836', 237] " 60-56-54 +let s:gb.dark2 = ['#504945', 239] " 80-73-69 +let s:gb.dark3 = ['#665c54', 241] " 102-92-84 +let s:gb.dark4 = ['#7c6f64', 243] " 124-111-100 +let s:gb.dark4_256 = ['#7c6f64', 243] " 124-111-100 + +let s:gb.gray_245 = ['#928374', 245] " 146-131-116 +let s:gb.gray_244 = ['#928374', 244] " 146-131-116 + +let s:gb.light0_hard = ['#f9f5d7', 230] " 249-245-215 +let s:gb.light0 = ['#fbf1c7', 229] " 253-244-193 +let s:gb.light0_soft = ['#f2e5bc', 228] " 242-229-188 +let s:gb.light1 = ['#ebdbb2', 223] " 235-219-178 +let s:gb.light2 = ['#d5c4a1', 250] " 213-196-161 +let s:gb.light3 = ['#bdae93', 248] " 189-174-147 +let s:gb.light4 = ['#a89984', 246] " 168-153-132 +let s:gb.light4_256 = ['#a89984', 246] " 168-153-132 + +let s:gb.bright_red = ['#fb4934', 167] " 251-73-52 +let s:gb.bright_green = ['#b8bb26', 142] " 184-187-38 +let s:gb.bright_yellow = ['#fabd2f', 214] " 250-189-47 +let s:gb.bright_blue = ['#83a598', 109] " 131-165-152 +let s:gb.bright_purple = ['#d3869b', 175] " 211-134-155 +let s:gb.bright_aqua = ['#8ec07c', 108] " 142-192-124 +let s:gb.bright_orange = ['#fe8019', 208] " 254-128-25 + +let s:gb.neutral_red = ['#cc241d', 124] " 204-36-29 +let s:gb.neutral_green = ['#98971a', 106] " 152-151-26 +let s:gb.neutral_yellow = ['#d79921', 172] " 215-153-33 +let s:gb.neutral_blue = ['#458588', 66] " 69-133-136 +let s:gb.neutral_purple = ['#b16286', 132] " 177-98-134 +let s:gb.neutral_aqua = ['#689d6a', 72] " 104-157-106 +let s:gb.neutral_orange = ['#d65d0e', 166] " 214-93-14 + +let s:gb.faded_red = ['#9d0006', 88] " 157-0-6 +let s:gb.faded_green = ['#79740e', 100] " 121-116-14 +let s:gb.faded_yellow = ['#b57614', 136] " 181-118-20 +let s:gb.faded_blue = ['#076678', 24] " 7-102-120 +let s:gb.faded_purple = ['#8f3f71', 96] " 143-63-113 +let s:gb.faded_aqua = ['#427b58', 66] " 66-123-88 +let s:gb.faded_orange = ['#af3a03', 130] " 175-58-3 + +" }}} +" Setup Emphasis: {{{ + +let s:bold = 'bold,' +if g:gruvbox_bold == 0 + let s:bold = '' +endif + +let s:italic = 'italic,' +if g:gruvbox_italic == 0 + let s:italic = '' +endif + +let s:underline = 'underline,' +if g:gruvbox_underline == 0 + let s:underline = '' +endif + +let s:undercurl = 'undercurl,' +if g:gruvbox_undercurl == 0 + let s:undercurl = '' +endif + +let s:inverse = 'inverse,' +if g:gruvbox_inverse == 0 + let s:inverse = '' +endif + +" }}} +" Setup Colors: {{{ + +let s:vim_bg = ['bg', 'bg'] +let s:vim_fg = ['fg', 'fg'] +let s:none = ['NONE', 'NONE'] + +" determine relative colors +if s:is_dark + let s:bg0 = s:gb.dark0 + if g:gruvbox_contrast_dark == 'soft' + let s:bg0 = s:gb.dark0_soft + elseif g:gruvbox_contrast_dark == 'hard' + let s:bg0 = s:gb.dark0_hard + endif + + let s:bg1 = s:gb.dark1 + let s:bg2 = s:gb.dark2 + let s:bg3 = s:gb.dark3 + let s:bg4 = s:gb.dark4 + + let s:gray = s:gb.gray_245 + + let s:fg0 = s:gb.light0 + let s:fg1 = s:gb.light1 + let s:fg2 = s:gb.light2 + let s:fg3 = s:gb.light3 + let s:fg4 = s:gb.light4 + + let s:fg4_256 = s:gb.light4_256 + + let s:red = s:gb.bright_red + let s:green = s:gb.bright_green + let s:yellow = s:gb.bright_yellow + let s:blue = s:gb.bright_blue + let s:purple = s:gb.bright_purple + let s:aqua = s:gb.bright_aqua + let s:orange = s:gb.bright_orange +else + let s:bg0 = s:gb.light0 + if g:gruvbox_contrast_light == 'soft' + let s:bg0 = s:gb.light0_soft + elseif g:gruvbox_contrast_light == 'hard' + let s:bg0 = s:gb.light0_hard + endif + + let s:bg1 = s:gb.light1 + let s:bg2 = s:gb.light2 + let s:bg3 = s:gb.light3 + let s:bg4 = s:gb.light4 + + let s:gray = s:gb.gray_244 + + let s:fg0 = s:gb.dark0 + let s:fg1 = s:gb.dark1 + let s:fg2 = s:gb.dark2 + let s:fg3 = s:gb.dark3 + let s:fg4 = s:gb.dark4 + + let s:fg4_256 = s:gb.dark4_256 + + let s:red = s:gb.faded_red + let s:green = s:gb.faded_green + let s:yellow = s:gb.faded_yellow + let s:blue = s:gb.faded_blue + let s:purple = s:gb.faded_purple + let s:aqua = s:gb.faded_aqua + let s:orange = s:gb.faded_orange +endif + +" reset to 16 colors fallback +if g:gruvbox_termcolors == 16 + let s:bg0[1] = 0 + let s:fg4[1] = 7 + let s:gray[1] = 8 + let s:red[1] = 9 + let s:green[1] = 10 + let s:yellow[1] = 11 + let s:blue[1] = 12 + let s:purple[1] = 13 + let s:aqua[1] = 14 + let s:fg1[1] = 15 +endif + +" save current relative colors back to palette dictionary +let s:gb.bg0 = s:bg0 +let s:gb.bg1 = s:bg1 +let s:gb.bg2 = s:bg2 +let s:gb.bg3 = s:bg3 +let s:gb.bg4 = s:bg4 + +let s:gb.gray = s:gray + +let s:gb.fg0 = s:fg0 +let s:gb.fg1 = s:fg1 +let s:gb.fg2 = s:fg2 +let s:gb.fg3 = s:fg3 +let s:gb.fg4 = s:fg4 + +let s:gb.fg4_256 = s:fg4_256 + +let s:gb.red = s:red +let s:gb.green = s:green +let s:gb.yellow = s:yellow +let s:gb.blue = s:blue +let s:gb.purple = s:purple +let s:gb.aqua = s:aqua +let s:gb.orange = s:orange + +" }}} +" Setup Terminal Colors For Neovim: {{{ + +if has('nvim') + let g:terminal_color_0 = s:bg0[0] + let g:terminal_color_8 = s:gray[0] + + let g:terminal_color_1 = s:gb.neutral_red[0] + let g:terminal_color_9 = s:red[0] + + let g:terminal_color_2 = s:gb.neutral_green[0] + let g:terminal_color_10 = s:green[0] + + let g:terminal_color_3 = s:gb.neutral_yellow[0] + let g:terminal_color_11 = s:yellow[0] + + let g:terminal_color_4 = s:gb.neutral_blue[0] + let g:terminal_color_12 = s:blue[0] + + let g:terminal_color_5 = s:gb.neutral_purple[0] + let g:terminal_color_13 = s:purple[0] + + let g:terminal_color_6 = s:gb.neutral_aqua[0] + let g:terminal_color_14 = s:aqua[0] + + let g:terminal_color_7 = s:fg4[0] + let g:terminal_color_15 = s:fg1[0] +endif + +" }}} +" Overload Setting: {{{ + +let s:hls_cursor = s:orange +if exists('g:gruvbox_hls_cursor') + let s:hls_cursor = get(s:gb, g:gruvbox_hls_cursor) +endif + +let s:number_column = s:none +if exists('g:gruvbox_number_column') + let s:number_column = get(s:gb, g:gruvbox_number_column) +endif + +let s:sign_column = s:bg1 + +if exists('g:gitgutter_override_sign_column_highlight') && + \ g:gitgutter_override_sign_column_highlight == 1 + let s:sign_column = s:number_column +else + let g:gitgutter_override_sign_column_highlight = 0 + + if exists('g:gruvbox_sign_column') + let s:sign_column = get(s:gb, g:gruvbox_sign_column) + endif +endif + +let s:color_column = s:bg1 +if exists('g:gruvbox_color_column') + let s:color_column = get(s:gb, g:gruvbox_color_column) +endif + +let s:vert_split = s:bg0 +if exists('g:gruvbox_vert_split') + let s:vert_split = get(s:gb, g:gruvbox_vert_split) +endif + +let s:invert_signs = '' +if exists('g:gruvbox_invert_signs') + if g:gruvbox_invert_signs == 1 + let s:invert_signs = s:inverse + endif +endif + +let s:invert_selection = s:inverse +if exists('g:gruvbox_invert_selection') + if g:gruvbox_invert_selection == 0 + let s:invert_selection = '' + endif +endif + +let s:invert_tabline = '' +if exists('g:gruvbox_invert_tabline') + if g:gruvbox_invert_tabline == 1 + let s:invert_tabline = s:inverse + endif +endif + +let s:italicize_comments = s:italic +if exists('g:gruvbox_italicize_comments') + if g:gruvbox_italicize_comments == 0 + let s:italicize_comments = '' + endif +endif + +let s:italicize_strings = '' +if exists('g:gruvbox_italicize_strings') + if g:gruvbox_italicize_strings == 1 + let s:italicize_strings = s:italic + endif +endif + +" }}} +" Highlighting Function: {{{ + +function! s:HL(group, fg, ...) + " Arguments: group, guifg, guibg, gui, guisp + + " foreground + let fg = a:fg + + " background + if a:0 >= 1 + let bg = a:1 + else + let bg = s:none + endif + + " emphasis + if a:0 >= 2 && strlen(a:2) + let emstr = a:2 + else + let emstr = 'NONE,' + endif + + " special fallback + if a:0 >= 3 + if g:gruvbox_guisp_fallback != 'NONE' + let fg = a:3 + endif + + " bg fallback mode should invert higlighting + if g:gruvbox_guisp_fallback == 'bg' + let emstr .= 'inverse,' + endif + endif + + let histring = [ 'hi', a:group, + \ 'guifg=' . fg[0], 'ctermfg=' . fg[1], + \ 'guibg=' . bg[0], 'ctermbg=' . bg[1], + \ 'gui=' . emstr[:-2], 'cterm=' . emstr[:-2] + \ ] + + " special + if a:0 >= 3 + call add(histring, 'guisp=' . a:3[0]) + endif + + execute join(histring, ' ') +endfunction + +" }}} +" Gruvbox Hi Groups: {{{ + +" memoize common hi groups +call s:HL('GruvboxFg0', s:fg0) +call s:HL('GruvboxFg1', s:fg1) +call s:HL('GruvboxFg2', s:fg2) +call s:HL('GruvboxFg3', s:fg3) +call s:HL('GruvboxFg4', s:fg4) +call s:HL('GruvboxGray', s:gray) +call s:HL('GruvboxBg0', s:bg0) +call s:HL('GruvboxBg1', s:bg1) +call s:HL('GruvboxBg2', s:bg2) +call s:HL('GruvboxBg3', s:bg3) +call s:HL('GruvboxBg4', s:bg4) + +call s:HL('GruvboxRed', s:red) +call s:HL('GruvboxRedBold', s:red, s:none, s:bold) +call s:HL('GruvboxGreen', s:green) +call s:HL('GruvboxGreenBold', s:green, s:none, s:bold) +call s:HL('GruvboxYellow', s:yellow) +call s:HL('GruvboxYellowBold', s:yellow, s:none, s:bold) +call s:HL('GruvboxBlue', s:blue) +call s:HL('GruvboxBlueBold', s:blue, s:none, s:bold) +call s:HL('GruvboxPurple', s:purple) +call s:HL('GruvboxPurpleBold', s:purple, s:none, s:bold) +call s:HL('GruvboxAqua', s:aqua) +call s:HL('GruvboxAquaBold', s:aqua, s:none, s:bold) +call s:HL('GruvboxOrange', s:orange) +call s:HL('GruvboxOrangeBold', s:orange, s:none, s:bold) + +call s:HL('GruvboxRedSign', s:red, s:sign_column, s:invert_signs) +call s:HL('GruvboxGreenSign', s:green, s:sign_column, s:invert_signs) +call s:HL('GruvboxYellowSign', s:yellow, s:sign_column, s:invert_signs) +call s:HL('GruvboxBlueSign', s:blue, s:sign_column, s:invert_signs) +call s:HL('GruvboxPurpleSign', s:purple, s:sign_column, s:invert_signs) +call s:HL('GruvboxAquaSign', s:aqua, s:sign_column, s:invert_signs) +call s:HL('GruvboxOrangeSign', s:orange, s:sign_column, s:invert_signs) + +" }}} + +" Vanilla colorscheme --------------------------------------------------------- +" General UI: {{{ + +" Normal text +call s:HL('Normal', s:fg1, s:bg0) + +" Correct background (see issue #7): +" --- Problem with changing between dark and light on 256 color terminal +" --- https://github.com/morhetz/gruvbox/issues/7 +if s:is_dark + set background=dark +else + set background=light +endif + +if version >= 700 + " Screen line that the cursor is + call s:HL('CursorLine', s:none, s:bg1) + " Screen column that the cursor is + hi! link CursorColumn CursorLine + + " Tab pages line filler + call s:HL('TabLineFill', s:bg4, s:bg1, s:invert_tabline) + " Active tab page label + call s:HL('TabLineSel', s:green, s:bg1, s:invert_tabline) + " Not active tab page label + hi! link TabLine TabLineFill + + " Match paired bracket under the cursor + call s:HL('MatchParen', s:none, s:bg3, s:bold) +endif + +if version >= 703 + " Highlighted screen columns + call s:HL('ColorColumn', s:none, s:color_column) + + " Concealed element: \lambda → λ + call s:HL('Conceal', s:blue, s:none) + + " Line number of CursorLine + call s:HL('CursorLineNr', s:yellow, s:bg1) +endif + +hi! link NonText GruvboxBg2 +hi! link SpecialKey GruvboxBg2 + +call s:HL('Visual', s:none, s:bg3, s:invert_selection) +hi! link VisualNOS Visual + +call s:HL('Search', s:yellow, s:bg0, s:inverse) +call s:HL('IncSearch', s:hls_cursor, s:bg0, s:inverse) + +call s:HL('Underlined', s:blue, s:none, s:underline) + +call s:HL('StatusLine', s:bg2, s:fg1, s:inverse) +call s:HL('StatusLineNC', s:bg1, s:fg4, s:inverse) + +" The column separating vertically split windows +call s:HL('VertSplit', s:bg3, s:vert_split) + +" Current match in wildmenu completion +call s:HL('WildMenu', s:blue, s:bg2, s:bold) + +" Directory names, special names in listing +hi! link Directory GruvboxGreenBold + +" Titles for output from :set all, :autocmd, etc. +hi! link Title GruvboxGreenBold + +" Error messages on the command line +call s:HL('ErrorMsg', s:bg0, s:red, s:bold) +" More prompt: -- More -- +hi! link MoreMsg GruvboxYellowBold +" Current mode message: -- INSERT -- +hi! link ModeMsg GruvboxYellowBold +" 'Press enter' prompt and yes/no questions +hi! link Question GruvboxOrangeBold +" Warning messages +hi! link WarningMsg GruvboxRedBold + +" }}} +" Gutter: {{{ + +" Line number for :number and :# commands +call s:HL('LineNr', s:bg4, s:number_column) + +" Column where signs are displayed +call s:HL('SignColumn', s:none, s:sign_column) + +" Line used for closed folds +call s:HL('Folded', s:gray, s:bg1, s:italic) +" Column where folds are displayed +call s:HL('FoldColumn', s:gray, s:bg1) + +" }}} +" Cursor: {{{ + +" Character under cursor +call s:HL('Cursor', s:none, s:none, s:inverse) +" Visual mode cursor, selection +hi! link vCursor Cursor +" Input moder cursor +hi! link iCursor Cursor +" Language mapping cursor +hi! link lCursor Cursor + +" }}} +" Syntax Highlighting: {{{ + +if g:gruvbox_improved_strings == 0 + hi! link Special GruvboxOrange +else + call s:HL('Special', s:orange, s:bg1, s:italicize_strings) +endif + +call s:HL('Comment', s:gray, s:none, s:italicize_comments) +call s:HL('Todo', s:vim_fg, s:vim_bg, s:bold . s:italic) +call s:HL('Error', s:red, s:vim_bg, s:bold . s:inverse) + +" Generic statement +hi! link Statement GruvboxRed +" if, then, else, endif, swicth, etc. +hi! link Conditional GruvboxRed +" for, do, while, etc. +hi! link Repeat GruvboxRed +" case, default, etc. +hi! link Label GruvboxRed +" try, catch, throw +hi! link Exception GruvboxRed +" sizeof, "+", "*", etc. +hi! link Operator Normal +" Any other keyword +hi! link Keyword GruvboxRed + +" Variable name +hi! link Identifier GruvboxBlue +" Function name +hi! link Function GruvboxGreenBold + +" Generic preprocessor +hi! link PreProc GruvboxAqua +" Preprocessor #include +hi! link Include GruvboxAqua +" Preprocessor #define +hi! link Define GruvboxAqua +" Same as Define +hi! link Macro GruvboxAqua +" Preprocessor #if, #else, #endif, etc. +hi! link PreCondit GruvboxAqua + +" Generic constant +hi! link Constant GruvboxPurple +" Character constant: 'c', '/n' +hi! link Character GruvboxPurple +" String constant: "this is a string" +if g:gruvbox_improved_strings == 0 + call s:HL('String', s:green, s:none, s:italicize_strings) +else + call s:HL('String', s:fg1, s:bg1, s:italicize_strings) +endif +" Boolean constant: TRUE, false +hi! link Boolean GruvboxPurple +" Number constant: 234, 0xff +hi! link Number GruvboxPurple +" Floating point constant: 2.3e10 +hi! link Float GruvboxPurple + +" Generic type +hi! link Type GruvboxYellow +" static, register, volatile, etc +hi! link StorageClass GruvboxOrange +" struct, union, enum, etc. +hi! link Structure GruvboxAqua +" typedef +hi! link Typedef GruvboxYellow + +" }}} +" Completion Menu: {{{ + +if version >= 700 + " Popup menu: normal item + call s:HL('Pmenu', s:fg1, s:bg2) + " Popup menu: selected item + call s:HL('PmenuSel', s:bg2, s:blue, s:bold) + " Popup menu: scrollbar + call s:HL('PmenuSbar', s:none, s:bg2) + " Popup menu: scrollbar thumb + call s:HL('PmenuThumb', s:none, s:bg4) +endif + +" }}} +" Diffs: {{{ + +call s:HL('DiffDelete', s:red, s:bg0, s:inverse) +call s:HL('DiffAdd', s:green, s:bg0, s:inverse) +"call s:HL('DiffChange', s:bg0, s:blue) +"call s:HL('DiffText', s:bg0, s:yellow) + +" Alternative setting +call s:HL('DiffChange', s:aqua, s:bg0, s:inverse) +call s:HL('DiffText', s:yellow, s:bg0, s:inverse) + +" }}} +" Spelling: {{{ + +if has("spell") + " Not capitalised word, or compile warnings + if g:gruvbox_improved_warnings == 0 + call s:HL('SpellCap', s:none, s:none, s:undercurl, s:red) + else + call s:HL('SpellCap', s:green, s:none, s:bold . s:italic) + endif + " Not recognized word + call s:HL('SpellBad', s:none, s:none, s:undercurl, s:blue) + " Wrong spelling for selected region + call s:HL('SpellLocal', s:none, s:none, s:undercurl, s:aqua) + " Rare word + call s:HL('SpellRare', s:none, s:none, s:undercurl, s:purple) +endif + +" }}} + +" Plugin specific ------------------------------------------------------------- +" EasyMotion: {{{ + +hi! link EasyMotionTarget Search +hi! link EasyMotionShade Comment + +" }}} +" Sneak: {{{ + +hi! link Sneak Search +hi! link SneakLabel Search + +" }}} +" Indent Guides: {{{ + +if !exists('g:indent_guides_auto_colors') + let g:indent_guides_auto_colors = 0 +endif + +if g:indent_guides_auto_colors == 0 + if g:gruvbox_invert_indent_guides == 0 + call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2) + call s:HL('IndentGuidesEven', s:vim_bg, s:bg1) + else + call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2, s:inverse) + call s:HL('IndentGuidesEven', s:vim_bg, s:bg3, s:inverse) + endif +endif + +" }}} +" IndentLine: {{{ + +if !exists('g:indentLine_color_term') + let g:indentLine_color_term = s:bg2[1] +endif +if !exists('g:indentLine_color_gui') + let g:indentLine_color_gui = s:bg2[0] +endif + +" }}} +" Rainbow Parentheses: {{{ + +if !exists('g:rbpt_colorpairs') + let g:rbpt_colorpairs = + \ [ + \ ['blue', '#458588'], ['magenta', '#b16286'], + \ ['red', '#cc241d'], ['166', '#d65d0e'] + \ ] +endif + +let g:rainbow_guifgs = [ '#d65d0e', '#cc241d', '#b16286', '#458588' ] +let g:rainbow_ctermfgs = [ '166', 'red', 'magenta', 'blue' ] + +if !exists('g:rainbow_conf') + let g:rainbow_conf = {} +endif +if !has_key(g:rainbow_conf, 'guifgs') + let g:rainbow_conf['guifgs'] = g:rainbow_guifgs +endif +if !has_key(g:rainbow_conf, 'ctermfgs') + let g:rainbow_conf['ctermfgs'] = g:rainbow_ctermfgs +endif + +let g:niji_dark_colours = g:rbpt_colorpairs +let g:niji_light_colours = g:rbpt_colorpairs + +"}}} +" GitGutter: {{{ + +hi! link GitGutterAdd GruvboxGreenSign +hi! link GitGutterChange GruvboxAquaSign +hi! link GitGutterDelete GruvboxRedSign +hi! link GitGutterChangeDelete GruvboxAquaSign + +" }}} +" GitCommit: "{{{ + +hi! link gitcommitSelectedFile GruvboxGreen +hi! link gitcommitDiscardedFile GruvboxRed + +" }}} +" Signify: {{{ + +hi! link SignifySignAdd GruvboxGreenSign +hi! link SignifySignChange GruvboxAquaSign +hi! link SignifySignDelete GruvboxRedSign + +" }}} +" Syntastic: {{{ + +call s:HL('SyntasticError', s:none, s:none, s:undercurl, s:red) +call s:HL('SyntasticWarning', s:none, s:none, s:undercurl, s:yellow) + +hi! link SyntasticErrorSign GruvboxRedSign +hi! link SyntasticWarningSign GruvboxYellowSign + +" }}} +" Signature: {{{ +hi! link SignatureMarkText GruvboxBlueSign +hi! link SignatureMarkerText GruvboxPurpleSign + +" }}} +" ShowMarks: {{{ + +hi! link ShowMarksHLl GruvboxBlueSign +hi! link ShowMarksHLu GruvboxBlueSign +hi! link ShowMarksHLo GruvboxBlueSign +hi! link ShowMarksHLm GruvboxBlueSign + +" }}} +" CtrlP: {{{ + +hi! link CtrlPMatch GruvboxYellow +hi! link CtrlPNoEntries GruvboxRed +hi! link CtrlPPrtBase GruvboxBg2 +hi! link CtrlPPrtCursor GruvboxBlue +hi! link CtrlPLinePre GruvboxBg2 + +call s:HL('CtrlPMode1', s:blue, s:bg2, s:bold) +call s:HL('CtrlPMode2', s:bg0, s:blue, s:bold) +call s:HL('CtrlPStats', s:fg4, s:bg2, s:bold) + +" }}} +" Startify: {{{ + +hi! link StartifyBracket GruvboxFg3 +hi! link StartifyFile GruvboxFg1 +hi! link StartifyNumber GruvboxBlue +hi! link StartifyPath GruvboxGray +hi! link StartifySlash GruvboxGray +hi! link StartifySection GruvboxYellow +hi! link StartifySpecial GruvboxBg2 +hi! link StartifyHeader GruvboxOrange +hi! link StartifyFooter GruvboxBg2 + +" }}} +" Vimshell: {{{ + +let g:vimshell_escape_colors = [ + \ s:bg4[0], s:red[0], s:green[0], s:yellow[0], + \ s:blue[0], s:purple[0], s:aqua[0], s:fg4[0], + \ s:bg0[0], s:red[0], s:green[0], s:orange[0], + \ s:blue[0], s:purple[0], s:aqua[0], s:fg0[0] + \ ] + +" }}} +" BufTabLine: {{{ + +call s:HL('BufTabLineCurrent', s:bg0, s:fg4) +call s:HL('BufTabLineActive', s:fg4, s:bg2) +call s:HL('BufTabLineHidden', s:bg4, s:bg1) +call s:HL('BufTabLineFill', s:bg0, s:bg0) + +" }}} +" Asynchronous Lint Engine: {{{ + +call s:HL('ALEError', s:none, s:none, s:undercurl, s:red) +call s:HL('ALEWarning', s:none, s:none, s:undercurl, s:yellow) +call s:HL('ALEInfo', s:none, s:none, s:undercurl, s:blue) + +hi! link ALEErrorSign GruvboxRedSign +hi! link ALEWarningSign GruvboxYellowSign +hi! link ALEInfoSign GruvboxBlueSign + +" }}} +" Dirvish: {{{ + +hi! link DirvishPathTail GruvboxAqua +hi! link DirvishArg GruvboxYellow + +" }}} +" Netrw: {{{ + +hi! link netrwDir GruvboxAqua +hi! link netrwClassify GruvboxAqua +hi! link netrwLink GruvboxGray +hi! link netrwSymLink GruvboxFg1 +hi! link netrwExe GruvboxYellow +hi! link netrwComment GruvboxGray +hi! link netrwList GruvboxBlue +hi! link netrwHelpCmd GruvboxAqua +hi! link netrwCmdSep GruvboxFg3 +hi! link netrwVersion GruvboxGreen + +" }}} +" NERDTree: {{{ + +hi! link NERDTreeDir GruvboxAqua +hi! link NERDTreeDirSlash GruvboxAqua + +hi! link NERDTreeOpenable GruvboxOrange +hi! link NERDTreeClosable GruvboxOrange + +hi! link NERDTreeFile GruvboxFg1 +hi! link NERDTreeExecFile GruvboxYellow + +hi! link NERDTreeUp GruvboxGray +hi! link NERDTreeCWD GruvboxGreen +hi! link NERDTreeHelp GruvboxFg1 + +hi! link NERDTreeToggleOn GruvboxGreen +hi! link NERDTreeToggleOff GruvboxRed + +" }}} +" Vim Multiple Cursors: {{{ + +call s:HL('multiple_cursors_cursor', s:none, s:none, s:inverse) +call s:HL('multiple_cursors_visual', s:none, s:bg2) + +" }}} +" coc.nvim: {{{ + +hi! link CocErrorSign GruvboxRedSign +hi! link CocWarningSign GruvboxOrangeSign +hi! link CocInfoSign GruvboxYellowSign +hi! link CocHintSign GruvboxBlueSign +hi! link CocErrorFloat GruvboxRed +hi! link CocWarningFloat GruvboxOrange +hi! link CocInfoFloat GruvboxYellow +hi! link CocHintFloat GruvboxBlue +hi! link CocDiagnosticsError GruvboxRed +hi! link CocDiagnosticsWarning GruvboxOrange +hi! link CocDiagnosticsInfo GruvboxYellow +hi! link CocDiagnosticsHint GruvboxBlue + +hi! link CocSelectedText GruvboxRed +hi! link CocCodeLens GruvboxGray + +call s:HL('CocErrorHighlight', s:none, s:none, s:undercurl, s:red) +call s:HL('CocWarningHighlight', s:none, s:none, s:undercurl, s:orange) +call s:HL('CocInfoHighlight', s:none, s:none, s:undercurl, s:yellow) +call s:HL('CocHintHighlight', s:none, s:none, s:undercurl, s:blue) + +" }}} + +" Filetype specific ----------------------------------------------------------- +" Diff: {{{ + +hi! link diffAdded GruvboxGreen +hi! link diffRemoved GruvboxRed +hi! link diffChanged GruvboxAqua + +hi! link diffFile GruvboxOrange +hi! link diffNewFile GruvboxYellow + +hi! link diffLine GruvboxBlue + +" }}} +" Html: {{{ + +hi! link htmlTag GruvboxBlue +hi! link htmlEndTag GruvboxBlue + +hi! link htmlTagName GruvboxAquaBold +hi! link htmlArg GruvboxAqua + +hi! link htmlScriptTag GruvboxPurple +hi! link htmlTagN GruvboxFg1 +hi! link htmlSpecialTagName GruvboxAquaBold + +call s:HL('htmlLink', s:fg4, s:none, s:underline) + +hi! link htmlSpecialChar GruvboxOrange + +call s:HL('htmlBold', s:vim_fg, s:vim_bg, s:bold) +call s:HL('htmlBoldUnderline', s:vim_fg, s:vim_bg, s:bold . s:underline) +call s:HL('htmlBoldItalic', s:vim_fg, s:vim_bg, s:bold . s:italic) +call s:HL('htmlBoldUnderlineItalic', s:vim_fg, s:vim_bg, s:bold . s:underline . s:italic) + +call s:HL('htmlUnderline', s:vim_fg, s:vim_bg, s:underline) +call s:HL('htmlUnderlineItalic', s:vim_fg, s:vim_bg, s:underline . s:italic) +call s:HL('htmlItalic', s:vim_fg, s:vim_bg, s:italic) + +" }}} +" Xml: {{{ + +hi! link xmlTag GruvboxBlue +hi! link xmlEndTag GruvboxBlue +hi! link xmlTagName GruvboxBlue +hi! link xmlEqual GruvboxBlue +hi! link docbkKeyword GruvboxAquaBold + +hi! link xmlDocTypeDecl GruvboxGray +hi! link xmlDocTypeKeyword GruvboxPurple +hi! link xmlCdataStart GruvboxGray +hi! link xmlCdataCdata GruvboxPurple +hi! link dtdFunction GruvboxGray +hi! link dtdTagName GruvboxPurple + +hi! link xmlAttrib GruvboxAqua +hi! link xmlProcessingDelim GruvboxGray +hi! link dtdParamEntityPunct GruvboxGray +hi! link dtdParamEntityDPunct GruvboxGray +hi! link xmlAttribPunct GruvboxGray + +hi! link xmlEntity GruvboxOrange +hi! link xmlEntityPunct GruvboxOrange +" }}} +" Vim: {{{ + +call s:HL('vimCommentTitle', s:fg4_256, s:none, s:bold . s:italicize_comments) + +hi! link vimNotation GruvboxOrange +hi! link vimBracket GruvboxOrange +hi! link vimMapModKey GruvboxOrange +hi! link vimFuncSID GruvboxFg3 +hi! link vimSetSep GruvboxFg3 +hi! link vimSep GruvboxFg3 +hi! link vimContinue GruvboxFg3 + +" }}} +" Clojure: {{{ + +hi! link clojureKeyword GruvboxBlue +hi! link clojureCond GruvboxOrange +hi! link clojureSpecial GruvboxOrange +hi! link clojureDefine GruvboxOrange + +hi! link clojureFunc GruvboxYellow +hi! link clojureRepeat GruvboxYellow +hi! link clojureCharacter GruvboxAqua +hi! link clojureStringEscape GruvboxAqua +hi! link clojureException GruvboxRed + +hi! link clojureRegexp GruvboxAqua +hi! link clojureRegexpEscape GruvboxAqua +call s:HL('clojureRegexpCharClass', s:fg3, s:none, s:bold) +hi! link clojureRegexpMod clojureRegexpCharClass +hi! link clojureRegexpQuantifier clojureRegexpCharClass + +hi! link clojureParen GruvboxFg3 +hi! link clojureAnonArg GruvboxYellow +hi! link clojureVariable GruvboxBlue +hi! link clojureMacro GruvboxOrange + +hi! link clojureMeta GruvboxYellow +hi! link clojureDeref GruvboxYellow +hi! link clojureQuote GruvboxYellow +hi! link clojureUnquote GruvboxYellow + +" }}} +" C: {{{ + +hi! link cOperator GruvboxPurple +hi! link cStructure GruvboxOrange + +" }}} +" Python: {{{ + +hi! link pythonBuiltin GruvboxOrange +hi! link pythonBuiltinObj GruvboxOrange +hi! link pythonBuiltinFunc GruvboxOrange +hi! link pythonFunction GruvboxAqua +hi! link pythonDecorator GruvboxRed +hi! link pythonInclude GruvboxBlue +hi! link pythonImport GruvboxBlue +hi! link pythonRun GruvboxBlue +hi! link pythonCoding GruvboxBlue +hi! link pythonOperator GruvboxRed +hi! link pythonException GruvboxRed +hi! link pythonExceptions GruvboxPurple +hi! link pythonBoolean GruvboxPurple +hi! link pythonDot GruvboxFg3 +hi! link pythonConditional GruvboxRed +hi! link pythonRepeat GruvboxRed +hi! link pythonDottedName GruvboxGreenBold + +" }}} +" CSS: {{{ + +hi! link cssBraces GruvboxBlue +hi! link cssFunctionName GruvboxYellow +hi! link cssIdentifier GruvboxOrange +hi! link cssClassName GruvboxGreen +hi! link cssColor GruvboxBlue +hi! link cssSelectorOp GruvboxBlue +hi! link cssSelectorOp2 GruvboxBlue +hi! link cssImportant GruvboxGreen +hi! link cssVendor GruvboxFg1 + +hi! link cssTextProp GruvboxAqua +hi! link cssAnimationProp GruvboxAqua +hi! link cssUIProp GruvboxYellow +hi! link cssTransformProp GruvboxAqua +hi! link cssTransitionProp GruvboxAqua +hi! link cssPrintProp GruvboxAqua +hi! link cssPositioningProp GruvboxYellow +hi! link cssBoxProp GruvboxAqua +hi! link cssFontDescriptorProp GruvboxAqua +hi! link cssFlexibleBoxProp GruvboxAqua +hi! link cssBorderOutlineProp GruvboxAqua +hi! link cssBackgroundProp GruvboxAqua +hi! link cssMarginProp GruvboxAqua +hi! link cssListProp GruvboxAqua +hi! link cssTableProp GruvboxAqua +hi! link cssFontProp GruvboxAqua +hi! link cssPaddingProp GruvboxAqua +hi! link cssDimensionProp GruvboxAqua +hi! link cssRenderProp GruvboxAqua +hi! link cssColorProp GruvboxAqua +hi! link cssGeneratedContentProp GruvboxAqua + +" }}} +" JavaScript: {{{ + +hi! link javaScriptBraces GruvboxFg1 +hi! link javaScriptFunction GruvboxAqua +hi! link javaScriptIdentifier GruvboxRed +hi! link javaScriptMember GruvboxBlue +hi! link javaScriptNumber GruvboxPurple +hi! link javaScriptNull GruvboxPurple +hi! link javaScriptParens GruvboxFg3 + +" }}} +" YAJS: {{{ + +hi! link javascriptImport GruvboxAqua +hi! link javascriptExport GruvboxAqua +hi! link javascriptClassKeyword GruvboxAqua +hi! link javascriptClassExtends GruvboxAqua +hi! link javascriptDefault GruvboxAqua + +hi! link javascriptClassName GruvboxYellow +hi! link javascriptClassSuperName GruvboxYellow +hi! link javascriptGlobal GruvboxYellow + +hi! link javascriptEndColons GruvboxFg1 +hi! link javascriptFuncArg GruvboxFg1 +hi! link javascriptGlobalMethod GruvboxFg1 +hi! link javascriptNodeGlobal GruvboxFg1 +hi! link javascriptBOMWindowProp GruvboxFg1 +hi! link javascriptArrayMethod GruvboxFg1 +hi! link javascriptArrayStaticMethod GruvboxFg1 +hi! link javascriptCacheMethod GruvboxFg1 +hi! link javascriptDateMethod GruvboxFg1 +hi! link javascriptMathStaticMethod GruvboxFg1 + +" hi! link javascriptProp GruvboxFg1 +hi! link javascriptURLUtilsProp GruvboxFg1 +hi! link javascriptBOMNavigatorProp GruvboxFg1 +hi! link javascriptDOMDocMethod GruvboxFg1 +hi! link javascriptDOMDocProp GruvboxFg1 +hi! link javascriptBOMLocationMethod GruvboxFg1 +hi! link javascriptBOMWindowMethod GruvboxFg1 +hi! link javascriptStringMethod GruvboxFg1 + +hi! link javascriptVariable GruvboxOrange +" hi! link javascriptVariable GruvboxRed +" hi! link javascriptIdentifier GruvboxOrange +" hi! link javascriptClassSuper GruvboxOrange +hi! link javascriptIdentifier GruvboxOrange +hi! link javascriptClassSuper GruvboxOrange + +" hi! link javascriptFuncKeyword GruvboxOrange +" hi! link javascriptAsyncFunc GruvboxOrange +hi! link javascriptFuncKeyword GruvboxAqua +hi! link javascriptAsyncFunc GruvboxAqua +hi! link javascriptClassStatic GruvboxOrange + +hi! link javascriptOperator GruvboxRed +hi! link javascriptForOperator GruvboxRed +hi! link javascriptYield GruvboxRed +hi! link javascriptExceptions GruvboxRed +hi! link javascriptMessage GruvboxRed + +hi! link javascriptTemplateSB GruvboxAqua +hi! link javascriptTemplateSubstitution GruvboxFg1 + +" hi! link javascriptLabel GruvboxBlue +" hi! link javascriptObjectLabel GruvboxBlue +" hi! link javascriptPropertyName GruvboxBlue +hi! link javascriptLabel GruvboxFg1 +hi! link javascriptObjectLabel GruvboxFg1 +hi! link javascriptPropertyName GruvboxFg1 + +hi! link javascriptLogicSymbols GruvboxFg1 +hi! link javascriptArrowFunc GruvboxYellow + +hi! link javascriptDocParamName GruvboxFg4 +hi! link javascriptDocTags GruvboxFg4 +hi! link javascriptDocNotation GruvboxFg4 +hi! link javascriptDocParamType GruvboxFg4 +hi! link javascriptDocNamedParamType GruvboxFg4 + +hi! link javascriptBrackets GruvboxFg1 +hi! link javascriptDOMElemAttrs GruvboxFg1 +hi! link javascriptDOMEventMethod GruvboxFg1 +hi! link javascriptDOMNodeMethod GruvboxFg1 +hi! link javascriptDOMStorageMethod GruvboxFg1 +hi! link javascriptHeadersMethod GruvboxFg1 + +hi! link javascriptAsyncFuncKeyword GruvboxRed +hi! link javascriptAwaitFuncKeyword GruvboxRed + +" }}} +" PanglossJS: {{{ + +hi! link jsClassKeyword GruvboxAqua +hi! link jsExtendsKeyword GruvboxAqua +hi! link jsExportDefault GruvboxAqua +hi! link jsTemplateBraces GruvboxAqua +hi! link jsGlobalNodeObjects GruvboxFg1 +hi! link jsGlobalObjects GruvboxFg1 +hi! link jsFunction GruvboxAqua +hi! link jsFuncParens GruvboxFg3 +hi! link jsParens GruvboxFg3 +hi! link jsNull GruvboxPurple +hi! link jsUndefined GruvboxPurple +hi! link jsClassDefinition GruvboxYellow + +" }}} +" TypeScript: {{{ + +hi! link typeScriptReserved GruvboxAqua +hi! link typeScriptLabel GruvboxAqua +hi! link typeScriptFuncKeyword GruvboxAqua +hi! link typeScriptIdentifier GruvboxOrange +hi! link typeScriptBraces GruvboxFg1 +hi! link typeScriptEndColons GruvboxFg1 +hi! link typeScriptDOMObjects GruvboxFg1 +hi! link typeScriptAjaxMethods GruvboxFg1 +hi! link typeScriptLogicSymbols GruvboxFg1 +hi! link typeScriptDocSeeTag Comment +hi! link typeScriptDocParam Comment +hi! link typeScriptDocTags vimCommentTitle +hi! link typeScriptGlobalObjects GruvboxFg1 +hi! link typeScriptParens GruvboxFg3 +hi! link typeScriptOpSymbols GruvboxFg3 +hi! link typeScriptHtmlElemProperties GruvboxFg1 +hi! link typeScriptNull GruvboxPurple +hi! link typeScriptInterpolationDelimiter GruvboxAqua + +" }}} +" PureScript: {{{ + +hi! link purescriptModuleKeyword GruvboxAqua +hi! link purescriptModuleName GruvboxFg1 +hi! link purescriptWhere GruvboxAqua +hi! link purescriptDelimiter GruvboxFg4 +hi! link purescriptType GruvboxFg1 +hi! link purescriptImportKeyword GruvboxAqua +hi! link purescriptHidingKeyword GruvboxAqua +hi! link purescriptAsKeyword GruvboxAqua +hi! link purescriptStructure GruvboxAqua +hi! link purescriptOperator GruvboxBlue + +hi! link purescriptTypeVar GruvboxFg1 +hi! link purescriptConstructor GruvboxFg1 +hi! link purescriptFunction GruvboxFg1 +hi! link purescriptConditional GruvboxOrange +hi! link purescriptBacktick GruvboxOrange + +" }}} +" CoffeeScript: {{{ + +hi! link coffeeExtendedOp GruvboxFg3 +hi! link coffeeSpecialOp GruvboxFg3 +hi! link coffeeCurly GruvboxOrange +hi! link coffeeParen GruvboxFg3 +hi! link coffeeBracket GruvboxOrange + +" }}} +" Ruby: {{{ + +hi! link rubyStringDelimiter GruvboxGreen +hi! link rubyInterpolationDelimiter GruvboxAqua + +" }}} +" ObjectiveC: {{{ + +hi! link objcTypeModifier GruvboxRed +hi! link objcDirective GruvboxBlue + +" }}} +" Go: {{{ + +hi! link goDirective GruvboxAqua +hi! link goConstants GruvboxPurple +hi! link goDeclaration GruvboxRed +hi! link goDeclType GruvboxBlue +hi! link goBuiltins GruvboxOrange + +" }}} +" Lua: {{{ + +hi! link luaIn GruvboxRed +hi! link luaFunction GruvboxAqua +hi! link luaTable GruvboxOrange + +" }}} +" MoonScript: {{{ + +hi! link moonSpecialOp GruvboxFg3 +hi! link moonExtendedOp GruvboxFg3 +hi! link moonFunction GruvboxFg3 +hi! link moonObject GruvboxYellow + +" }}} +" Java: {{{ + +hi! link javaAnnotation GruvboxBlue +hi! link javaDocTags GruvboxAqua +hi! link javaCommentTitle vimCommentTitle +hi! link javaParen GruvboxFg3 +hi! link javaParen1 GruvboxFg3 +hi! link javaParen2 GruvboxFg3 +hi! link javaParen3 GruvboxFg3 +hi! link javaParen4 GruvboxFg3 +hi! link javaParen5 GruvboxFg3 +hi! link javaOperator GruvboxOrange + +hi! link javaVarArg GruvboxGreen + +" }}} +" Elixir: {{{ + +hi! link elixirDocString Comment + +hi! link elixirStringDelimiter GruvboxGreen +hi! link elixirInterpolationDelimiter GruvboxAqua + +hi! link elixirModuleDeclaration GruvboxYellow + +" }}} +" Scala: {{{ + +" NB: scala vim syntax file is kinda horrible +hi! link scalaNameDefinition GruvboxFg1 +hi! link scalaCaseFollowing GruvboxFg1 +hi! link scalaCapitalWord GruvboxFg1 +hi! link scalaTypeExtension GruvboxFg1 + +hi! link scalaKeyword GruvboxRed +hi! link scalaKeywordModifier GruvboxRed + +hi! link scalaSpecial GruvboxAqua +hi! link scalaOperator GruvboxFg1 + +hi! link scalaTypeDeclaration GruvboxYellow +hi! link scalaTypeTypePostDeclaration GruvboxYellow + +hi! link scalaInstanceDeclaration GruvboxFg1 +hi! link scalaInterpolation GruvboxAqua + +" }}} +" Markdown: {{{ + +call s:HL('markdownItalic', s:fg3, s:none, s:italic) + +hi! link markdownH1 GruvboxGreenBold +hi! link markdownH2 GruvboxGreenBold +hi! link markdownH3 GruvboxYellowBold +hi! link markdownH4 GruvboxYellowBold +hi! link markdownH5 GruvboxYellow +hi! link markdownH6 GruvboxYellow + +hi! link markdownCode GruvboxAqua +hi! link markdownCodeBlock GruvboxAqua +hi! link markdownCodeDelimiter GruvboxAqua + +hi! link markdownBlockquote GruvboxGray +hi! link markdownListMarker GruvboxGray +hi! link markdownOrderedListMarker GruvboxGray +hi! link markdownRule GruvboxGray +hi! link markdownHeadingRule GruvboxGray + +hi! link markdownUrlDelimiter GruvboxFg3 +hi! link markdownLinkDelimiter GruvboxFg3 +hi! link markdownLinkTextDelimiter GruvboxFg3 + +hi! link markdownHeadingDelimiter GruvboxOrange +hi! link markdownUrl GruvboxPurple +hi! link markdownUrlTitleDelimiter GruvboxGreen + +call s:HL('markdownLinkText', s:gray, s:none, s:underline) +hi! link markdownIdDeclaration markdownLinkText + +" }}} +" Haskell: {{{ + +" hi! link haskellType GruvboxYellow +" hi! link haskellOperators GruvboxOrange +" hi! link haskellConditional GruvboxAqua +" hi! link haskellLet GruvboxOrange +" +hi! link haskellType GruvboxFg1 +hi! link haskellIdentifier GruvboxFg1 +hi! link haskellSeparator GruvboxFg1 +hi! link haskellDelimiter GruvboxFg4 +hi! link haskellOperators GruvboxBlue +" +hi! link haskellBacktick GruvboxOrange +hi! link haskellStatement GruvboxOrange +hi! link haskellConditional GruvboxOrange + +hi! link haskellLet GruvboxAqua +hi! link haskellDefault GruvboxAqua +hi! link haskellWhere GruvboxAqua +hi! link haskellBottom GruvboxAqua +hi! link haskellBlockKeywords GruvboxAqua +hi! link haskellImportKeywords GruvboxAqua +hi! link haskellDeclKeyword GruvboxAqua +hi! link haskellDeriving GruvboxAqua +hi! link haskellAssocType GruvboxAqua + +hi! link haskellNumber GruvboxPurple +hi! link haskellPragma GruvboxPurple + +hi! link haskellString GruvboxGreen +hi! link haskellChar GruvboxGreen + +" }}} +" Json: {{{ + +hi! link jsonKeyword GruvboxGreen +hi! link jsonQuote GruvboxGreen +hi! link jsonBraces GruvboxFg1 +hi! link jsonString GruvboxFg1 + +" }}} + + +" Functions ------------------------------------------------------------------- +" Search Highlighting Cursor {{{ + +function! GruvboxHlsShowCursor() + call s:HL('Cursor', s:bg0, s:hls_cursor) +endfunction + +function! GruvboxHlsHideCursor() + call s:HL('Cursor', s:none, s:none, s:inverse) +endfunction + +" }}} + +" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker: diff --git a/.vim/colors/gruvbox/gruvbox_256palette.sh b/.vim/colors/gruvbox/gruvbox_256palette.sh new file mode 100755 index 0000000..c7fd190 --- /dev/null +++ b/.vim/colors/gruvbox/gruvbox_256palette.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +if [ "${TERM%%-*}" = "screen" ]; then + if [ -n "$TMUX" ]; then + printf "\033Ptmux;\033\033]4;236;rgb:32/30/2f\007\033\\" + printf "\033Ptmux;\033\033]4;234;rgb:1d/20/21\007\033\\" + + printf "\033Ptmux;\033\033]4;235;rgb:28/28/28\007\033\\" + printf "\033Ptmux;\033\033]4;237;rgb:3c/38/36\007\033\\" + printf "\033Ptmux;\033\033]4;239;rgb:50/49/45\007\033\\" + printf "\033Ptmux;\033\033]4;241;rgb:66/5c/54\007\033\\" + printf "\033Ptmux;\033\033]4;243;rgb:7c/6f/64\007\033\\" + + printf "\033Ptmux;\033\033]4;244;rgb:92/83/74\007\033\\" + printf "\033Ptmux;\033\033]4;245;rgb:92/83/74\007\033\\" + + printf "\033Ptmux;\033\033]4;228;rgb:f2/e5/bc\007\033\\" + printf "\033Ptmux;\033\033]4;230;rgb:f9/f5/d7\007\033\\" + + printf "\033Ptmux;\033\033]4;229;rgb:fb/f1/c7\007\033\\" + printf "\033Ptmux;\033\033]4;223;rgb:eb/db/b2\007\033\\" + printf "\033Ptmux;\033\033]4;250;rgb:d5/c4/a1\007\033\\" + printf "\033Ptmux;\033\033]4;248;rgb:bd/ae/93\007\033\\" + printf "\033Ptmux;\033\033]4;246;rgb:a8/99/84\007\033\\" + + printf "\033Ptmux;\033\033]4;167;rgb:fb/49/34\007\033\\" + printf "\033Ptmux;\033\033]4;142;rgb:b8/bb/26\007\033\\" + printf "\033Ptmux;\033\033]4;214;rgb:fa/bd/2f\007\033\\" + printf "\033Ptmux;\033\033]4;109;rgb:83/a5/98\007\033\\" + printf "\033Ptmux;\033\033]4;175;rgb:d3/86/9b\007\033\\" + printf "\033Ptmux;\033\033]4;108;rgb:8e/c0/7c\007\033\\" + printf "\033Ptmux;\033\033]4;208;rgb:fe/80/19\007\033\\" + + printf "\033Ptmux;\033\033]4;88;rgb:9d/00/06\007\033\\" + printf "\033Ptmux;\033\033]4;100;rgb:79/74/0e\007\033\\" + printf "\033Ptmux;\033\033]4;136;rgb:b5/76/14\007\033\\" + printf "\033Ptmux;\033\033]4;24;rgb:07/66/78\007\033\\" + printf "\033Ptmux;\033\033]4;96;rgb:8f/3f/71\007\033\\" + printf "\033Ptmux;\033\033]4;66;rgb:42/7b/58\007\033\\" + printf "\033Ptmux;\033\033]4;130;rgb:af/3a/03\007\033\\" + else + printf "\033P\033]4;236;rgb:32/30/2f\007\033\\" + printf "\033P\033]4;234;rgb:1d/20/21\007\033\\" + + printf "\033P\033]4;235;rgb:28/28/28\007\033\\" + printf "\033P\033]4;237;rgb:3c/38/36\007\033\\" + printf "\033P\033]4;239;rgb:50/49/45\007\033\\" + printf "\033P\033]4;241;rgb:66/5c/54\007\033\\" + printf "\033P\033]4;243;rgb:7c/6f/64\007\033\\" + + printf "\033P\033]4;244;rgb:92/83/74\007\033\\" + printf "\033P\033]4;245;rgb:92/83/74\007\033\\" + + printf "\033P\033]4;228;rgb:f2/e5/bc\007\033\\" + printf "\033P\033]4;230;rgb:f9/f5/d7\007\033\\" + + printf "\033P\033]4;229;rgb:fb/f1/c7\007\033\\" + printf "\033P\033]4;223;rgb:eb/db/b2\007\033\\" + printf "\033P\033]4;250;rgb:d5/c4/a1\007\033\\" + printf "\033P\033]4;248;rgb:bd/ae/93\007\033\\" + printf "\033P\033]4;246;rgb:a8/99/84\007\033\\" + + printf "\033P\033]4;167;rgb:fb/49/34\007\033\\" + printf "\033P\033]4;142;rgb:b8/bb/26\007\033\\" + printf "\033P\033]4;214;rgb:fa/bd/2f\007\033\\" + printf "\033P\033]4;109;rgb:83/a5/98\007\033\\" + printf "\033P\033]4;175;rgb:d3/86/9b\007\033\\" + printf "\033P\033]4;108;rgb:8e/c0/7c\007\033\\" + printf "\033P\033]4;208;rgb:fe/80/19\007\033\\" + + printf "\033P\033]4;88;rgb:9d/00/06\007\033\\" + printf "\033P\033]4;100;rgb:79/74/0e\007\033\\" + printf "\033P\033]4;136;rgb:b5/76/14\007\033\\" + printf "\033P\033]4;24;rgb:07/66/78\007\033\\" + printf "\033P\033]4;96;rgb:8f/3f/71\007\033\\" + printf "\033P\033]4;66;rgb:42/7b/58\007\033\\" + printf "\033P\033]4;130;rgb:af/3a/03\007\033\\" + fi + +elif [ "$TERM" != "linux" ] && [ "$TERM" != "vt100" ] && [ "$TERM" != "vt220" ]; then + + printf "\033]4;236;rgb:32/30/2f\033\\" + printf "\033]4;234;rgb:1d/20/21\033\\" + + printf "\033]4;235;rgb:28/28/28\033\\" + printf "\033]4;237;rgb:3c/38/36\033\\" + printf "\033]4;239;rgb:50/49/45\033\\" + printf "\033]4;241;rgb:66/5c/54\033\\" + printf "\033]4;243;rgb:7c/6f/64\033\\" + + printf "\033]4;244;rgb:92/83/74\033\\" + printf "\033]4;245;rgb:92/83/74\033\\" + + printf "\033]4;228;rgb:f2/e5/bc\033\\" + printf "\033]4;230;rgb:f9/f5/d7\033\\" + + printf "\033]4;229;rgb:fb/f1/c7\033\\" + printf "\033]4;223;rgb:eb/db/b2\033\\" + printf "\033]4;250;rgb:d5/c4/a1\033\\" + printf "\033]4;248;rgb:bd/ae/93\033\\" + printf "\033]4;246;rgb:a8/99/84\033\\" + + printf "\033]4;167;rgb:fb/49/34\033\\" + printf "\033]4;142;rgb:b8/bb/26\033\\" + printf "\033]4;214;rgb:fa/bd/2f\033\\" + printf "\033]4;109;rgb:83/a5/98\033\\" + printf "\033]4;175;rgb:d3/86/9b\033\\" + printf "\033]4;108;rgb:8e/c0/7c\033\\" + printf "\033]4;208;rgb:fe/80/19\033\\" + + printf "\033]4;88;rgb:9d/00/06\033\\" + printf "\033]4;100;rgb:79/74/0e\033\\" + printf "\033]4;136;rgb:b5/76/14\033\\" + printf "\033]4;24;rgb:07/66/78\033\\" + printf "\033]4;96;rgb:8f/3f/71\033\\" + printf "\033]4;66;rgb:42/7b/58\033\\" + printf "\033]4;130;rgb:af/3a/03\033\\" +fi diff --git a/.vim/colors/gruvbox/gruvbox_256palette_osx.sh b/.vim/colors/gruvbox/gruvbox_256palette_osx.sh new file mode 100755 index 0000000..ad5111a --- /dev/null +++ b/.vim/colors/gruvbox/gruvbox_256palette_osx.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +if [ "${TERM%%-*}" = "screen" ]; then + if [ -n "$TMUX" ]; then + printf "\033Ptmux;\033\033]4;236;rgb:26/24/23\007\033\\" + printf "\033Ptmux;\033\033]4;234;rgb:16/18/19\007\033\\" + + printf "\033Ptmux;\033\033]4;235;rgb:1e/1e/1e\007\033\\" + printf "\033Ptmux;\033\033]4;237;rgb:2e/2a/29\007\033\\" + printf "\033Ptmux;\033\033]4;239;rgb:3f/39/35\007\033\\" + printf "\033Ptmux;\033\033]4;241;rgb:53/4a/42\007\033\\" + printf "\033Ptmux;\033\033]4;243;rgb:68/5c/51\007\033\\" + + printf "\033Ptmux;\033\033]4;244;rgb:7f/70/61\007\033\\" + printf "\033Ptmux;\033\033]4;245;rgb:7f/70/61\007\033\\" + + printf "\033Ptmux;\033\033]4;228;rgb:ef/df/ae\007\033\\" + printf "\033Ptmux;\033\033]4;230;rgb:f8/f4/cd\007\033\\" + + printf "\033Ptmux;\033\033]4;229;rgb:fa/ee/bb\007\033\\" + printf "\033Ptmux;\033\033]4;223;rgb:e6/d4/a3\007\033\\" + printf "\033Ptmux;\033\033]4;250;rgb:cb/b8/90\007\033\\" + printf "\033Ptmux;\033\033]4;248;rgb:af/9f/81\007\033\\" + printf "\033Ptmux;\033\033]4;246;rgb:97/87/71\007\033\\" + + printf "\033Ptmux;\033\033]4;167;rgb:f7/30/28\007\033\\" + printf "\033Ptmux;\033\033]4;142;rgb:aa/b0/1e\007\033\\" + printf "\033Ptmux;\033\033]4;214;rgb:f7/b1/25\007\033\\" + printf "\033Ptmux;\033\033]4;109;rgb:71/95/86\007\033\\" + printf "\033Ptmux;\033\033]4;175;rgb:c7/70/89\007\033\\" + printf "\033Ptmux;\033\033]4;108;rgb:7d/b6/69\007\033\\" + printf "\033Ptmux;\033\033]4;208;rgb:fb/6a/16\007\033\\" + + printf "\033Ptmux;\033\033]4;88;rgb:89/00/09\007\033\\" + printf "\033Ptmux;\033\033]4;100;rgb:66/62/0d\007\033\\" + printf "\033Ptmux;\033\033]4;136;rgb:a5/63/11\007\033\\" + printf "\033Ptmux;\033\033]4;24;rgb:0e/53/65\007\033\\" + printf "\033Ptmux;\033\033]4;96;rgb:7b/2b/5e\007\033\\" + printf "\033Ptmux;\033\033]4;66;rgb:35/6a/46\007\033\\" + printf "\033Ptmux;\033\033]4;130;rgb:9d/28/07\007\033\\" + else + printf "\033P\033]4;236;rgb:26/24/23\007\033\\" + printf "\033P\033]4;234;rgb:16/18/19\007\033\\" + + printf "\033P\033]4;235;rgb:1e/1e/1e\007\033\\" + printf "\033P\033]4;237;rgb:2e/2a/29\007\033\\" + printf "\033P\033]4;239;rgb:3f/39/35\007\033\\" + printf "\033P\033]4;241;rgb:53/4a/42\007\033\\" + printf "\033P\033]4;243;rgb:68/5c/51\007\033\\" + + printf "\033P\033]4;244;rgb:7f/70/61\007\033\\" + printf "\033P\033]4;245;rgb:7f/70/61\007\033\\" + + printf "\033P\033]4;228;rgb:ef/df/ae\007\033\\" + printf "\033P\033]4;230;rgb:f8/f4/cd\007\033\\" + + printf "\033P\033]4;229;rgb:fa/ee/bb\007\033\\" + printf "\033P\033]4;223;rgb:e6/d4/a3\007\033\\" + printf "\033P\033]4;250;rgb:cb/b8/90\007\033\\" + printf "\033P\033]4;248;rgb:af/9f/81\007\033\\" + printf "\033P\033]4;246;rgb:97/87/71\007\033\\" + + printf "\033P\033]4;167;rgb:f7/30/28\007\033\\" + printf "\033P\033]4;142;rgb:aa/b0/1e\007\033\\" + printf "\033P\033]4;214;rgb:f7/b1/25\007\033\\" + printf "\033P\033]4;109;rgb:71/95/86\007\033\\" + printf "\033P\033]4;175;rgb:c7/70/89\007\033\\" + printf "\033P\033]4;108;rgb:7d/b6/69\007\033\\" + printf "\033P\033]4;208;rgb:fb/6a/16\007\033\\" + + printf "\033P\033]4;88;rgb:89/00/09\007\033\\" + printf "\033P\033]4;100;rgb:66/62/0d\007\033\\" + printf "\033P\033]4;136;rgb:a5/63/11\007\033\\" + printf "\033P\033]4;24;rgb:0e/53/65\007\033\\" + printf "\033P\033]4;96;rgb:7b/2b/5e\007\033\\" + printf "\033P\033]4;66;rgb:35/6a/46\007\033\\" + printf "\033P\033]4;130;rgb:9d/28/07\007\033\\" + fi +else + printf "\033]4;236;rgb:26/24/23\033\\" + printf "\033]4;234;rgb:16/18/19\033\\" + + printf "\033]4;235;rgb:1e/1e/1e\033\\" + printf "\033]4;237;rgb:2e/2a/29\033\\" + printf "\033]4;239;rgb:3f/39/35\033\\" + printf "\033]4;241;rgb:53/4a/42\033\\" + printf "\033]4;243;rgb:68/5c/51\033\\" + + printf "\033]4;244;rgb:7f/70/61\033\\" + printf "\033]4;245;rgb:7f/70/61\033\\" + + printf "\033]4;228;rgb:ef/df/ae\033\\" + printf "\033]4;230;rgb:f8/f4/cd\033\\" + + printf "\033]4;229;rgb:fa/ee/bb\033\\" + printf "\033]4;223;rgb:e6/d4/a3\033\\" + printf "\033]4;250;rgb:cb/b8/90\033\\" + printf "\033]4;248;rgb:af/9f/81\033\\" + printf "\033]4;246;rgb:97/87/71\033\\" + + printf "\033]4;167;rgb:f7/30/28\033\\" + printf "\033]4;142;rgb:aa/b0/1e\033\\" + printf "\033]4;214;rgb:f7/b1/25\033\\" + printf "\033]4;109;rgb:71/95/86\033\\" + printf "\033]4;175;rgb:c7/70/89\033\\" + printf "\033]4;108;rgb:7d/b6/69\033\\" + printf "\033]4;208;rgb:fb/6a/16\033\\" + + printf "\033]4;88;rgb:89/00/09\033\\" + printf "\033]4;100;rgb:66/62/0d\033\\" + printf "\033]4;136;rgb:a5/63/11\033\\" + printf "\033]4;24;rgb:0e/53/65\033\\" + printf "\033]4;96;rgb:7b/2b/5e\033\\" + printf "\033]4;66;rgb:35/6a/46\033\\" + printf "\033]4;130;rgb:9d/28/07\033\\" +fi diff --git a/.vim/colors/gruvbox/package.json b/.vim/colors/gruvbox/package.json new file mode 100755 index 0000000..355c180 --- /dev/null +++ b/.vim/colors/gruvbox/package.json @@ -0,0 +1,10 @@ +{ + "name": "gruvbox", + "version": "2.0.0", + "repository": "git@github.com:morhetz/gruvbox.git", + "author": "Pavel Pertsev ", + "license": "MIT", + "vim": { + "opt": true + } +} diff --git a/.vim/colors/neodark b/.vim/colors/neodark deleted file mode 160000 index 44919aa..0000000 --- a/.vim/colors/neodark +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 44919aa0bebfa60e93e653fdd2a81d1c75c2e721 diff --git a/.vim/colors/neodark/202020.png b/.vim/colors/neodark/202020.png new file mode 100755 index 0000000..b1c373c Binary files /dev/null and b/.vim/colors/neodark/202020.png differ diff --git a/.vim/colors/neodark/256.png b/.vim/colors/neodark/256.png new file mode 100755 index 0000000..f483cc6 Binary files /dev/null and b/.vim/colors/neodark/256.png differ diff --git a/.vim/colors/neodark/README.md b/.vim/colors/neodark/README.md new file mode 100755 index 0000000..27badb1 --- /dev/null +++ b/.vim/colors/neodark/README.md @@ -0,0 +1,87 @@ +# neodark.vim + +### Vim (True color) + +**Default color** + +![vim](https://github.com/KeitaNakamura/neodark.vim/blob/master/default.png) + +**`#202020` background color** + +![vim](https://github.com/KeitaNakamura/neodark.vim/blob/master/202020.png) + +### Vim (256 color) +![vim](https://github.com/KeitaNakamura/neodark.vim/blob/master/256.png) + +### tmux +![tmux](https://github.com/KeitaNakamura/neodark.vim/blob/master/tmux.png) + +## Installation + +### Vim +For vim-plug + +```vim +Plug 'KeitaNakamura/neodark.vim' +colorscheme neodark +``` + +If you want to change background, set the 6 digit color code: + +```vim +let g:neodark#background = '#202020' +``` + +To use 256-color in both of vim and gvim: + +```vim +let g:neodark#use_256color = 1 " default: 0 +``` + +To use your default terminal background: +```vim +let g:neodark#terminal_transparent = 1 " default: 0 +``` + +If you want solid vertical split matching the statusline: +```vim +let g:neodark#solid_vertsplit = 1 " default: 0 +``` + +[Airline](https://github.com/vim-airline/vim-airline) and [lightline](https://github.com/itchyny/lightline.vim) themes are also included. For lightline, + +```vim +let g:lightline = {} +let g:lightline.colorscheme = 'neodark' +``` + +For airline, just use! + +### Terminal +Custom terminal themes (`terms/NeoDark.terminal` for Terminal.app and `terms/NeoDark.itermcolors` for iTerm2) are also available. + +```vim +let g:neodark#use_custom_terminal_theme = 1 " default: 0 +``` + +In this case, even if you use a terminal which doesn't support true color like Terminal.app, you can get true color scheme! + +### tmux + +``` +cat tmuxcolors.conf >> ~/.tmux.conf +``` + +or + +``` +set -g @plugin 'KeitaNakamura/neodark.vim' +``` + +in `.tmux.conf` with [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm). +[tmux-statusbar](https://github.com/KeitaNakamura/tmux-statusbar) is used for tmux statusbar in the screen shot. + +## Inspiration and special thanks +* [tyrannicaltoucan/vim-deep-space](https://github.com/tyrannicaltoucan/vim-deep-space) +* [tyrannicaltoucan/vim-quantum](https://github.com/tyrannicaltoucan/vim-quantum) +* [joshdick/onedark.vim](https://github.com/joshdick/onedark.vim) diff --git a/.vim/colors/neodark/autoload/airline/themes/neodark.vim b/.vim/colors/neodark/autoload/airline/themes/neodark.vim new file mode 100755 index 0000000..e71bd84 --- /dev/null +++ b/.vim/colors/neodark/autoload/airline/themes/neodark.vim @@ -0,0 +1,42 @@ +let g:airline#themes#neodark#palette = {} + +function! airline#themes#neodark#refresh() + let g:airline#themes#neodark#palette.accents = { + \ 'red': airline#themes#get_highlight('Error'), + \ } + + let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Statement', 'fg'], 'none') + let s:N2 = airline#themes#get_highlight('Pmenu') + let s:N3 = airline#themes#get_highlight('FoldColumn') + let g:airline#themes#neodark#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + + let group = airline#themes#get_highlight('Type') + let g:airline#themes#neodark#palette.normal_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Function', 'fg'], 'none') + let g:airline#themes#neodark#palette.insert = airline#themes#generate_color_map(s:I1, s:N2, s:N3) + let g:airline#themes#neodark#palette.insert_modified = g:airline#themes#neodark#palette.normal_modified + + let s:R1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Error', 'fg'], 'none') + let g:airline#themes#neodark#palette.replace = airline#themes#generate_color_map(s:R1, s:N2, s:N3) + let g:airline#themes#neodark#palette.replace_modified = g:airline#themes#neodark#palette.normal_modified + + let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['String', 'fg'], 'none') + let g:airline#themes#neodark#palette.visual = airline#themes#generate_color_map(s:V1, s:N2, s:N3) + let g:airline#themes#neodark#palette.visual_modified = g:airline#themes#neodark#palette.normal_modified + + let s:IA = airline#themes#get_highlight2(['NonText', 'fg'], ['CursorLine', 'bg']) + let g:airline#themes#neodark#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA) + let g:airline#themes#neodark#palette.inactive_modified = g:airline#themes#neodark#palette.normal_modified + + if get(g:, 'loaded_ctrlp', 0) + let g:airline#themes#neodark#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'])) + endif +endfun + +call airline#themes#neodark#refresh() diff --git a/.vim/colors/neodark/autoload/lightline/colorscheme/neodark.vim b/.vim/colors/neodark/autoload/lightline/colorscheme/neodark.vim new file mode 100755 index 0000000..ff4e0d2 --- /dev/null +++ b/.vim/colors/neodark/autoload/lightline/colorscheme/neodark.vim @@ -0,0 +1,64 @@ +let s:base1 = neodark#get_color('Normal', 'bg') +let s:base2 = neodark#get_color('CursorLine', 'bg') +let s:base3 = neodark#get_color('Visual', 'bg') +let s:base4 = neodark#get_color('Comment', 'fg') +let s:base5 = neodark#get_color('Normal', 'fg') + +let s:red = neodark#get_color('ErrorMsg', 'fg') +let s:green = neodark#get_color('Statement', 'fg') +let s:yellow = neodark#get_color('Type', 'fg') +let s:blue = neodark#get_color('Function', 'fg') +let s:orange = neodark#get_color('String', 'fg') + +let s:p = { + \ 'normal': {}, + \ 'inactive': {}, + \ 'insert': {}, + \ 'replace': {}, + \ 'visual': {}, + \ 'tabline': {}} + +" [[guifg, guibg, ctermfg, ctermbg], ...] +let s:p.normal.middle = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.normal.left = [ + \ [s:base1[0], s:green[0], s:base1[1], s:green[1]], + \ [s:base5[0], s:base3[0], s:base5[1], s:base3[1]]] +let s:p.normal.right = [ + \ [s:base1[0], s:base4[0], s:base1[1], s:base4[1]], + \ [s:base4[0], s:base3[0], s:base4[1], s:base3[1]]] +let s:p.normal.error = [ + \ [ s:base2[0], s:red[0], s:base2[1], s:red[1]]] +let s:p.normal.warning = [ + \ [ s:base2[0], s:yellow[0], s:base2[1], s:yellow[1]]] + +let s:p.inactive.middle = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.inactive.right = [ + \ [s:base4[0], s:base3[0], s:base4[1], s:base3[1]], + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.inactive.left = [ + \ [s:base4[0], s:base3[0], s:base4[1], s:base3[1]], + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] + +let s:p.insert.left = [ + \ [s:base1[0], s:blue[0], s:base1[1], s:blue[1]], + \ s:p.normal.left[1]] +let s:p.replace.left = [ + \ [s:base1[0], s:red[0], s:base1[1], s:red[1]], + \ s:p.normal.left[1]] +let s:p.visual.left = [ + \ [s:base1[0], s:orange[0], s:base1[1], s:orange[1]], + \ s:p.normal.left[1]] + +let s:p.tabline.middle = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.tabline.right = [ + \ [s:base1[0], s:base4[0], s:base1[1], s:base4[1]], + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.tabline.left = [ + \ [s:base4[0], s:base2[0], s:base4[1], s:base2[1]]] +let s:p.tabline.tabsel = [ + \ [s:yellow[0], s:base3[0], s:yellow[1], s:base3[1]]] + +let g:lightline#colorscheme#neodark#palette = s:p diff --git a/.vim/colors/neodark/colors/neodark.vim b/.vim/colors/neodark/colors/neodark.vim new file mode 100755 index 0000000..d5c408d --- /dev/null +++ b/.vim/colors/neodark/colors/neodark.vim @@ -0,0 +1,391 @@ +highlight clear + +if exists('syntax_on') + syntax reset +endif + +let g:colors_name = 'neodark' + +" Functions {{{ +function! s:generate_base_colors(base1) + let b1 = s:RGB2HSL(s:hex2RGB(a:base1)) + let b2 = [b1[0], b1[1], b1[2]+5] + let b3 = [b1[0], b1[1], b2[2]+10] + let b4 = [b1[0], b1[1], b3[2]+15] + let b5 = [b1[0], b1[1], b4[2]+25] + return [a:base1, + \ s:RGB2hex(s:HSL2RGB(b2)), + \ s:RGB2hex(s:HSL2RGB(b3)), + \ s:RGB2hex(s:HSL2RGB(b4)), + \ s:RGB2hex(s:HSL2RGB(b5))] +endfunction + +function! s:hex2RGB(hex) + let R = printf("%d", "0x".a:hex[1:2]) + let G = printf("%d", "0x".a:hex[3:4]) + let B = printf("%d", "0x".a:hex[5:6]) + return [R,G,B] +endfunction + +function! s:RGB2hex(RGB) + return printf("#%x%x%x", a:RGB[0], a:RGB[1], a:RGB[2]) +endfunction + +function! s:RGB2HSL(RGB) + let R = a:RGB[0] + let G = a:RGB[1] + let B = a:RGB[2] + + let MAX = max([R, G, B]) + let MIN = min([R, G, B]) + + let H = MAX - MIN + if H > 0 + if MAX == R + let H = 60 * (G - B) / H + elseif MAX == G + let H = 60 * (B - R) / H + 120 + elseif MAX == B + let H = 60 * (R - G) / H + 240 + endif + if H < 0 + let H += 360 + endif + endif + + let CNT = (MAX + MIN) / 2 + if CNT < 128 + let S = 100 * (MAX - MIN) / (MAX + MIN) + else + let S = 100 * (MAX - MIN) / (510 - MAX - MIN) + endif + + let L = CNT * 100 / 255 + + return [H,S,L] +endfunction + +function! s:HSL2RGB(HSL) + let H = a:HSL[0] + let S = a:HSL[1] + let L = a:HSL[2] + + if L < 50 + let MAX = 255 * (L + L*S/100) / 100 + let MIN = 255 * (L - L*S/100) / 100 + else + let MAX = 255 * (L + (100-L)*S/100) / 100 + let MIN = 255 * (L - (100-L)*S/100) / 100 + endif + + if H < 60 + let R = MAX + let G = H * (MAX-MIN) / 60 + MIN + let B = MIN + elseif H < 120 + let R = (120-H) * (MAX-MIN) / 60 + MIN + let G = MAX + let B = MIN + elseif H < 180 + let R = MIN + let G = MAX + let B = (H-120) * (MAX-MIN) / 60 + MIN + elseif H < 240 + let R = MIN + let G = (240-H) * (MAX-MIN) / 60 + MIN + let B = MAX + elseif H < 300 + let R = (H-240) * (MAX-MIN) / 60 + MIN + let G = MIN + let B = MAX + else + let R = MAX + let G = MIN + let B = (360-H) * (MAX-MIN) / 60 + MIN + endif + return [R,G,B] +endfunction + +" }}} + +if !exists('g:neodark#italics') + let g:neodark#italics = 0 +endif + +if !exists('g:neodark#use_custom_terminal_theme') + let g:neodark#use_custom_terminal_theme = 0 +endif + +if !exists('g:neodark#use_256color') + let g:neodark#use_256color = 0 +endif + +if !exists('g:neodark#background') + let g:neodark#background = '' +endif + +if !exists('g:neodark#terminal_transparent') + let g:neodark#terminal_transparent = 0 +endif + +if !exists('g:neodark#solid_vertsplit') + let g:neodark#solid_vertsplit = 0 +endif + +if g:neodark#background == '' + let s:base1 = ['#1F2F38', 236] + let s:base2 = ['#263A45', 237] + let s:base3 = ['#475C69', 59] + let s:base4 = ['#658595', 245] + let s:base5 = ['#AABBC4', 250] +else + let bases = s:generate_base_colors(g:neodark#background) + let s:base1 = [bases[0], 236] + let s:base2 = [bases[1], 237] + let s:base3 = [bases[2], 59] + let s:base4 = [bases[3], 245] + let s:base5 = [bases[4], 250] +endif + +let s:red = ['#DC657D', 168] +let s:green = ['#84B97C', 108] +let s:yellow = ['#D4B261', 179] +let s:blue = ['#639EE4', 74] +let s:purple = ['#B888E2', 140] +let s:orange = ['#E18254', 173] +let s:pink = ['#E69CA0', 181] +let s:teal = ['#4BB1A7', 73] +let s:beige = ['#C7C18B', 180] +let s:light_blue = ['#72C7D1', 80] +let s:brown = ['#AE8785', 138] + +if g:neodark#use_256color == 1 + let s:base1[0] = '#303030' + let s:base2[0] = '#3a3a3a' + let s:base3[0] = '#5f5f5f' + let s:base4[0] = '#8a8a8a' + let s:base5[0] = '#bcbcbc' + + let s:red[0] = '#d75f87' + let s:green[0] = '#87af87' + let s:yellow[0] = '#d7af5f' + let s:blue[0] = '#5fafd7' + let s:purple[0] = '#af87d7' + let s:orange[0] = '#d7875f' + let s:pink[0] = '#d7afaf' + let s:teal[0] = '#5fafaf' + let s:beige[0] = '#d7af87' + let s:light_blue[0] = '#5fd7d7' + let s:brown[0] = '#af8787' +endif + +if g:neodark#use_custom_terminal_theme == 1 + let s:base1[1] = 0 + let s:base2[1] = 8 + let s:base3[1] = 13 + let s:base4[1] = 7 + let s:base5[1] = 15 + + let s:red[1] = 1 + let s:green[1] = 2 + let s:yellow[1] = 3 + let s:blue[1] = 4 + let s:purple[1] = 5 + let s:orange[1] = 6 + let s:pink[1] = 9 + let s:teal[1] = 10 + let s:beige[1] = 11 + let s:light_blue[1] = 12 + let s:brown[1] = 14 +endif + +" Transparent Background +if g:neodark#terminal_transparent == 1 + let s:base1[1] = 'none' " This doesn't work well for airline +end + +" neovim terminal colors +if has('nvim') + let g:terminal_color_0 = s:base1[0] + let g:terminal_color_1 = s:red[0] + let g:terminal_color_2 = s:green[0] + let g:terminal_color_3 = s:yellow[0] + let g:terminal_color_4 = s:blue[0] + let g:terminal_color_5 = s:purple[0] + let g:terminal_color_6 = s:orange[0] + let g:terminal_color_7 = s:base4[0] + let g:terminal_color_8 = s:base2[0] + let g:terminal_color_9 = s:pink[0] + let g:terminal_color_10 = s:teal[0] + let g:terminal_color_11 = s:beige[0] + let g:terminal_color_12 = s:light_blue[0] + let g:terminal_color_13 = s:base3[0] + let g:terminal_color_14 = s:brown[0] + let g:terminal_color_15 = s:base5[0] +endif + +" vim terminal colors +let g:terminal_ansi_colors = [s:base1[0], s:red[0], s:green[0], s:yellow[0], + \ s:blue[0], s:purple[0], s:orange[0], s:base4[0], s:base2[0], s:pink[0], + \ s:teal[0], s:beige[0], s:light_blue[0], s:base3[0], s:brown[0], s:base5[0]] + +function! s:hi(group, fg, bg, attr) + let l:attr = a:attr + if g:neodark#italics == 0 && l:attr ==? 'italic' + let l:attr = 'none' + endif + + if !empty(a:fg) + exec 'hi ' . a:group . ' guifg=' . a:fg[0] . ' ctermfg=' . a:fg[1] + endif + + if !empty(a:bg) + exec 'hi ' . a:group . ' guibg=' . a:bg[0] . ' ctermbg=' . a:bg[1] + endif + + if l:attr != '' + exec 'hi ' . a:group . ' gui=' . l:attr . ' cterm=' . l:attr . ' guisp=NONE' + endif +endfun + +" Vim Editor +call s:hi('ColorColumn', '', s:base2, '') +call s:hi('Cursor', s:base2, s:base5, '') +call s:hi('CursorColumn', '', s:base2, '') +call s:hi('CursorLine', '', s:base2, 'none') +call s:hi('CursorLineNr', s:light_blue, s:base2, 'none') +call s:hi('Directory', s:blue, '', '') +call s:hi('DiffAdd', s:green, s:base2, 'none') +call s:hi('DiffChange', s:yellow, s:base2, 'none') +call s:hi('DiffDelete', s:red, s:base2, 'none') +call s:hi('DiffText', s:blue, s:base1, 'none') +call s:hi('ErrorMsg', s:red, s:base1, 'bold') +call s:hi('FoldColumn', s:base4, s:base2, '') +call s:hi('Folded', s:base3, s:base1, '') +call s:hi('IncSearch', s:beige, '', '') +call s:hi('LineNr', s:base3, '', '') +call s:hi('MatchParen', s:light_blue, s:base1, 'underline,bold') +call s:hi('ModeMsg', s:green, '', '') +call s:hi('MoreMsg', s:green, '', '') +call s:hi('NonText', s:base4, '', 'none') +call s:hi('Normal', s:base5, s:base1, 'none') +call s:hi('Pmenu', s:base5, s:base3, '') +call s:hi('PmenuSbar', '', s:base2, '') +call s:hi('PmenuSel', s:base2, s:green, '') +call s:hi('PmenuThumb', '', s:base4, '') +call s:hi('Question', s:blue, '', 'none') +call s:hi('Search', s:base1, s:beige, '') +call s:hi('SignColumn', s:base5, s:base1, '') +call s:hi('SpecialKey', s:base4, '', '') +call s:hi('SpellBad', s:red, s:base1, 'underline') +call s:hi('SpellCap', s:brown, s:base1, 'none') +call s:hi('SpellRare', s:brown, s:base1, 'none') +call s:hi('SpellLocal', s:brown, s:base1, 'none') +call s:hi('StatusLine', s:base5, s:base3, 'none') +call s:hi('StatusLineNC', s:base2, s:base4, '') +call s:hi('TabLine', s:base4, s:base2, 'none') +call s:hi('TabLineFill', s:base4, s:base2, 'none') +call s:hi('TabLineSel', s:yellow, s:base3, 'none') +call s:hi('Title', s:orange, '', 'none') +call s:hi('Visual', s:base5, s:base3, '') +call s:hi('WarningMsg', s:red, '', '') +call s:hi('WildMenu', s:base2, s:green, '') + +" Solid bar for vertical split +if g:neodark#solid_vertsplit == 1 + call s:hi('VertSplit', s:base2, s:base2, 'none') +else + call s:hi('VertSplit', s:base4, s:base1, 'none') +endif + +" Standard Syntax +call s:hi('Comment', s:base4, '', 'italic') +call s:hi('Constant', s:red, '', '') +call s:hi('String', s:orange, '', '') +call s:hi('Character', s:orange, '', '') +call s:hi('Identifier', s:teal, '', 'none') +call s:hi('Function', s:blue, '', '') +call s:hi('Statement', s:green, '', 'none') +call s:hi('Exception', s:red, '', '') +call s:hi('PreProc', s:purple, '', '') +call s:hi('Define', s:purple, '', 'none') +call s:hi('Macro', s:purple, '', '') +call s:hi('Type', s:yellow, '', 'none') +call s:hi('StorageClass', s:teal, '', '') +call s:hi('Special', s:pink, '', '') +call s:hi('Delimiter', s:base5, '', '') +call s:hi('Underlined', s:base5, '', 'underline') +call s:hi('Error', s:red, s:base1, 'bold') +call s:hi('Todo', s:base5, s:base1, 'bold') +call s:hi('Conceal', s:beige, s:base1, '') + +" Languages {{{ +" Vim {{{ +hi! link vimFunc Function +hi! link vimUserFunc Function +call s:hi('vimLet', s:yellow, '', '') +" }}} +" Shell {{{ +hi! link shFunction Function +" }}} +" Markdown {{{ +hi! link markdownHeadingDelimiter Statement +hi! link markdownLinkDelimiter Statement +hi! link markdownLinkTextDelimiter Statement +hi! link markdownLinkText Statement +hi! link markdownURL Underlined +call s:hi('markdownCode', s:blue, '', '') +call s:hi('markdownListMarker', s:teal, '', '') +call s:hi('markdownHeadingRule', s:base4, '', '') +call s:hi('markdownCodeDelimiter', s:green, '', '') +call s:hi('markdownBold', '', '', 'bold') +call s:hi('markdownBoldItalic', '', '', 'bold,italic') +" }}} +" Pandoc markdown {{{ +call s:hi('pandocDelimitedCodeBlock', s:blue, '', '') +call s:hi('pandocDelimitedCodeBlockStart', s:base5, '', '') +call s:hi('pandocDelimitedCodeBlockEnd', s:base5, '', '') +call s:hi('pandocAtxHeader', s:orange, '', 'bold') +" }}} +" TeX {{{ +call s:hi('texRefZone', s:orange, '', '') +call s:hi('texMath', s:blue, '', '') +" }}} +" Ruby {{{ +hi! link rubyStringDelimiter String +hi! link rubyBlockParameterList rubyBlockParameter +call s:hi('rubyInterpolationDelimiter', s:teal, '', '') +" }}} +" Go {{{ +hi! link goFunctionCall Function +hi! link goMethodCall Function +" }}} +" }}} +" Plugins {{{ +" Vim-Fugitive +call s:hi('diffAdded', s:green, '', '') +call s:hi('diffRemoved', s:red, '', '') + +" Vim-Gittgutter +call s:hi('GitGutterAdd', s:green, '', '') +call s:hi('GitGutterChange', s:yellow, '', '') +call s:hi('GitGutterDelete', s:red, '', '') +call s:hi('GitGutterChangeDelete', s:orange, '', '') + +" indent-guides +call s:hi('IndentGuidesOdd', '', s:base2, '') +call s:hi('IndentGuidesEven', '', s:base2, '') + +" indentLine +let g:indentLine_color_gui = s:base3[0] +let g:indentLine_bgcolor_gui = s:base1[0] +let g:indentLine_color_term = s:base3[1] +let g:indentLine_bgcolor_term = s:base1[1] + +" Vim-Signify +hi link SignifySignAdd GitGutterAdd +hi link SignifySignChange GitGutterChange +hi link SignifySignDelete GitGutterDelete +" }}} + +set background=dark diff --git a/.vim/colors/neodark/default.png b/.vim/colors/neodark/default.png new file mode 100755 index 0000000..f755aa5 Binary files /dev/null and b/.vim/colors/neodark/default.png differ diff --git a/.vim/colors/neodark/doc/neodark.txt b/.vim/colors/neodark/doc/neodark.txt new file mode 100755 index 0000000..e76f411 --- /dev/null +++ b/.vim/colors/neodark/doc/neodark.txt @@ -0,0 +1,100 @@ +*neodark.txt* Modified: 2018 Oct + + + neodark.vim - Dark Colorscheme by Keita Nakamura~ + + + *neodark* +Neodark is a Vim colorscheme that runs in GUI or 256 color mode and includes +themes for terminal colors, tmux and |status-line| plugins. + +For screenshots, updates and more details please visit: +https://github.com/KeitaNakamura/neodark.vim + +1. Install |neodark-install| +2. Options |neodark-options| +3. Airline and lightline Themes |neodark-statusline| +4. Terminal Themes |neodark-terminal| +5. tmux |neodark-tmux| +6. Inspiration and Special Thanks |neodark-thanks| + +============================================================================== +1. Install *neodark-install* + +Neodark can be installed by maually moving the files to their appropriated +directories, using the native |packages| system or with a custom plugin +manager. For |vim-plug|: > + + Plug 'KeitaNakamura/neodark.vim' + colorscheme neodark +< +============================================================================== +2. Options *neodark-options* + +Supported options can be controlled by setting global variables (|g:|). +Boolean options are set with numbers `1` or `0` for true and false, +respectively. + + *g:neodark#background* {string} Default: '' + Hex color value used as custom background. > + let g:neodark#background = '#202020' +< + *g:neodark#use_256color* {boolean} Default: 0 + Use 256-color in both vim and gvim. + + *g:neodark#terminal_transparent* {boolean} Default: 0 + Use your default terminal background. + + *g:neodark#solid_vertsplit* {boolean} Default: 0 + Enable solid vertical split, matching the + statusline. + + *g:neodark#use_custom_terminal_theme* + {boolean} Default: 0 + Use the native terminal colors. + See |neodark-terminal|. + +============================================================================== +3. Airline and lightline Themes *neodark-statusline* + *neodark-airline* *neodark-lightline* + +Themes for |Airline| and |lightline| are included. To enable in lightline: > + + let g:lightline = {} + let g:lightline.colorscheme = 'neodark' +< +For airline, just use! + + - Airline: https://github.com/vim-airline/vim-airline + - lightline: https://github.com/itchyny/lightline.vim + +============================================================================== +4. Terminal Themes *neodark-terminal* + +Custom terminal themes (`terms/NeoDark.terminal` for Terminal.app and +`terms/NeoDark.itermcolors` for iTerm2) are also available. + +If you use a terminal which doesn't support true color like Terminal.app, you +can get a true color scheme by enabling |g:neodark#use_custom_terminal_theme|. + +============================================================================== +5. tmux + +You can set tmux colors with: > + cat tmuxcolors.conf >> ~/.tmux.conf +or > + set -g @plugin 'KeitaNakamura/neodark.vim' +< +in `.tmux.conf` with Tmux Plugin Manager (https://github.com/tmux-plugins/tpm). + +============================================================================== +6. Inspiration and Special Thanks + + - tyrannicaltoucan/vim-deep-space + https://github.com/tyrannicaltoucan/vim-deep-space + - tyrannicaltoucan/vim-quantum + https://github.com/tyrannicaltoucan/vim-quantum + - joshdick/onedark.vim + https://github.com/joshdick/onedark.vim + + vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/.vim/colors/neodark/plugin/neodark.vim b/.vim/colors/neodark/plugin/neodark.vim new file mode 100755 index 0000000..9d91864 --- /dev/null +++ b/.vim/colors/neodark/plugin/neodark.vim @@ -0,0 +1,20 @@ +if exists("g:loaded_neodark") + finish +endif +let g:loaded_neodark = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function neodark#get_color(hlgroup, fg_or_bg) + let gui = synIDattr(synIDtrans(hlID(a:hlgroup)), a:fg_or_bg, 'gui') + let cterm = synIDattr(synIDtrans(hlID(a:hlgroup)), a:fg_or_bg, 'cterm') + if cterm == '' + let cterm = 'none' + endif + return [l:gui, l:cterm] +endfunction + + +let &cpo = s:save_cpo +unlet s:save_cpo diff --git a/.vim/colors/neodark/terms/NeoDark.itermcolors b/.vim/colors/neodark/terms/NeoDark.itermcolors new file mode 100755 index 0000000..7e6dcda --- /dev/null +++ b/.vim/colors/neodark/terms/NeoDark.itermcolors @@ -0,0 +1,344 @@ + + + + + Ansi 0 Color + + Alpha Component + 1 + Blue Component + 0.16604986786842346 + Color Space + Calibrated + Green Component + 0.13810592889785767 + Red Component + 0.093520961701869965 + + Ansi 1 Color + + Alpha Component + 1 + Blue Component + 0.41553044319152832 + Color Space + Calibrated + Green Component + 0.30194917321205139 + Red Component + 0.82076919078826904 + + Ansi 10 Color + + Alpha Component + 1 + Blue Component + 0.58926409482955933 + Color Space + Calibrated + Green Component + 0.64080047607421875 + Red Component + 0.24541383981704712 + + Ansi 11 Color + + Alpha Component + 1 + Blue Component + 0.47225937247276306 + Color Space + Calibrated + Green Component + 0.71151053905487061 + Red Component + 0.7323186993598938 + + Ansi 12 Color + + Alpha Component + 1 + Blue Component + 0.77816593647003174 + Color Space + Calibrated + Green Component + 0.73666906356811523 + Red Component + 0.38363903760910034 + + Ansi 13 Color + + Alpha Component + 1 + Blue Component + 0.33687889575958252 + Color Space + Calibrated + Green Component + 0.28850468993186951 + Red Component + 0.21723657846450806 + + Ansi 14 Color + + Alpha Component + 1 + Blue Component + 0.4471639096736908 + Color Space + Calibrated + Green Component + 0.45141583681106567 + Red Component + 0.61654645204544067 + + Ansi 15 Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Ansi 2 Color + + Alpha Component + 1 + Blue Component + 0.41127902269363403 + Color Space + Calibrated + Green Component + 0.68033838272094727 + Red Component + 0.45019713044166565 + + Ansi 3 Color + + Alpha Component + 1 + Blue Component + 0.30927106738090515 + Color Space + Calibrated + Green Component + 0.64334207773208618 + Red Component + 0.78965777158737183 + + Ansi 4 Color + + Alpha Component + 1 + Blue Component + 0.8673635721206665 + Color Space + Calibrated + Green Component + 0.54140889644622803 + Red Component + 0.32095783948898315 + + Ansi 5 Color + + Alpha Component + 1 + Blue Component + 0.85811066627502441 + Color Space + Calibrated + Green Component + 0.43545463681221008 + Red Component + 0.65922987461090088 + + Ansi 6 Color + + Alpha Component + 1 + Blue Component + 0.26240810751914978 + Color Space + Calibrated + Green Component + 0.42816618084907532 + Red Component + 0.84590542316436768 + + Ansi 7 Color + + Alpha Component + 1 + Blue Component + 0.51242685317993164 + Color Space + Calibrated + Green Component + 0.44662865996360779 + Red Component + 0.32551044225692749 + + Ansi 8 Color + + Alpha Component + 1 + Blue Component + 0.20836980640888214 + Color Space + Calibrated + Green Component + 0.17225378751754761 + Red Component + 0.1135505884885788 + + Ansi 9 Color + + Alpha Component + 1 + Blue Component + 0.56007015705108643 + Color Space + Calibrated + Green Component + 0.53337842226028442 + Red Component + 0.8708946704864502 + + Background Color + + Alpha Component + 1 + Blue Component + 0.16604986786842346 + Color Space + Calibrated + Green Component + 0.13810592889785767 + Red Component + 0.093520961701869965 + + Badge Color + + Alpha Component + 0.5 + Blue Component + 0.0 + Color Space + Calibrated + Green Component + 0.0 + Red Component + 1 + + Bold Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Cursor Color + + Alpha Component + 1 + Blue Component + 0.5 + Color Space + Calibrated + Green Component + 0.5 + Red Component + 0.5 + + Cursor Guide Color + + Alpha Component + 0.25 + Blue Component + 1 + Color Space + Calibrated + Green Component + 0.9100000262260437 + Red Component + 0.64999997615814209 + + Cursor Text Color + + Alpha Component + 1 + Blue Component + 0.83052277565002441 + Color Space + Calibrated + Green Component + 0.85444784164428711 + Red Component + 0.87751418352127075 + + Foreground Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Link Color + + Alpha Component + 1 + Blue Component + 0.8673635721206665 + Color Space + Calibrated + Green Component + 0.54140889644622803 + Red Component + 0.32095783948898315 + + Selected Text Color + + Alpha Component + 1 + Blue Component + 0.71859800815582275 + Color Space + Calibrated + Green Component + 0.67806756496429443 + Red Component + 0.60460680723190308 + + Selection Color + + Alpha Component + 1 + Blue Component + 0.33687889575958252 + Color Space + Calibrated + Green Component + 0.28850468993186951 + Red Component + 0.21723657846450806 + + + diff --git a/.vim/colors/neodark/terms/NeoDark.terminal b/.vim/colors/neodark/terms/NeoDark.terminal new file mode 100755 index 0000000..2f310d4 --- /dev/null +++ b/.vim/colors/neodark/terms/NeoDark.terminal @@ -0,0 +1,559 @@ + + + + + ANSIBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjEyMTU2ODYyNzUgMC4xODQzMTM3MjU1IDAuMjE5NjA3ODQzMQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM4ODIzNTI5NDEgMC42MTk2MDc4NDMxIDAuODk0MTE3NjQ3MQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjE0OTAxOTYwNzggMC4yMjc0NTA5ODA0IDAuMjcwNTg4MjM1MwAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjQ0NzA1ODgyMzUgMC43ODAzOTIxNTY5IDAuODE5NjA3ODQzMQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightCyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY4MjM1Mjk0MTIgMC41Mjk0MTE3NjQ3IDAuNTIxNTY4NjI3NQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjI5NDExNzY0NzEgMC42OTQxMTc2NDcxIDAuNjU0OTAxOTYwOAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjI3ODQzMTM3MjUgMC4zNjA3ODQzMTM3IDAuNDExNzY0NzA1OQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightRedColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjkwMTk2MDc4NDMgMC42MTE3NjQ3MDU5IDAuNjI3NDUwOTgwNAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw + LjY2NjY2NjY2NjcgMC43MzMzMzMzMzMzIDAuNzY4NjI3NDUxABACgALSEBESE1okY2xh + c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 + ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA + ABkAAAAAAAAAAAAAAAAAAADY + + ANSIBrightYellowColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljc4MDM5MjE1NjkgMC43NTY4NjI3NDUxIDAuNTQ1MDk4MDM5MgAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSICyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg4MjM1Mjk0MTIgMC41MDk4MDM5MjE2IDAuMzI5NDExNzY0NwAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjUxNzY0NzA1ODggMC43MjU0OTAxOTYxIDAuNDg2Mjc0NTA5OAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjcyMTU2ODYyNzUgMC41MzMzMzMzMzMzIDAuODg2Mjc0NTA5OAAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIRedColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjg2Mjc0NTA5 + OCAwLjM5NjA3ODQzMTQgMC40OTAxOTYwNzg0IDFPECcwLjgyMDc2OTE5MDggMC4zMDE5 + NDkxNzMyIDAuNDE1NTMwNDQzMgAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtgDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + ANSIWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM5NjA3ODQzMTQgMC41MjE1Njg2Mjc1IDAuNTg0MzEzNzI1NQAQAoAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIYellowColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjgzMTM3MjU0 + OSAwLjY5ODAzOTIxNTcgMC4zODAzOTIxNTY5IDFPECcwLjc4OTY1Nzc3MTYgMC42NDMz + NDIwNzc3IDAuMzA5MjcxMDY3NAAQAYACgAbTFBUNFhcYVE5TSURVTlNJQ0MQB4ADgAXS + Gg0bHFdOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA + AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQA + AAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIY + AAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA + iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRl + Y2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQA + AAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNj + AAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt + Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAA + AG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbP + ZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0 + dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s + b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBS + R0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAA + AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAA + AAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIu + MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M + AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA + AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAU + ABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAA + lQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ + AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB + 0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2 + AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD + 4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 + BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG + 4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+ + CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK + 8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1a + DXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQ + JhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj + E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwW + jxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoq + GlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYe + QB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKC + Iq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn + SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 + LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIx + ujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdg + N5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 + oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQD + REdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRL + DEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIx + UnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha + B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1 + YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhq + n2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNd + c7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF8 + 4X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZy + hteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q + 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtC + m6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqm + i6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHW + skuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++ + Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 + yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX + XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz + 5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/y + jPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//4AE + 0h4fICFaJGNsYXNzbmFtZVgkY2xhc3Nlc11OU011dGFibGVEYXRhoyAiI1ZOU0RhdGFY + TlNPYmplY3TSHh8lJlxOU0NvbG9yU3BhY2WiJyNcTlNDb2xvclNwYWNl0h4fKSpXTlND + b2xvcqIpI18QD05TS2V5ZWRBcmNoaXZlctEtLlRyb290gAEACAARABoAIwAtADIANwA/ + AEUAUABdAGMAcACFAIwAtgDgAOIA5ADmAO0A8gD4APoA/AD+AQMBCw1XDVkNXg1pDXIN + gA2EDYsNlA2ZDaYNqQ22DbsNww3GDdgN2w3gAAAAAAAAAgEAAAAAAAAALwAAAAAAAAAA + AAAAAAAADeI= + + BackgroundBlur + 0.0 + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjEyMTU2ODYy + NzUgMC4xODQzMTM3MjU1IDAuMjE5NjA3ODQzMSAxTxAnMC4wOTM1MjA5NjE3IDAuMTM4 + MTA1OTI4OSAwLjE2NjA0OTg2NzkAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + BackgroundSettingsForInactiveWindows + + Bell + + CommandString + + CursorBlink + + CursorColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjM2MDc4NDk5 + OTkgMC40NzUzMjY4MzMyIDAuNTM0MjMwMDIwMSAxTxAnMC4yOTE5NjMyNDk0IDAuMzk5 + NDU4MzQ4OCAwLjQ1OTYxMjE5MDcAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + Font + + YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs + YXNzI0AoAAAAAAAAEBCAAoADVk1vbmFjb9ITFBUWWiRjbGFzc25hbWVYJGNsYXNzZXNW + TlNGb250ohUXWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RobVHJvb3SAAQgRGiMt + Mjc8QktSW2JpcnR2eH+Ej5ifoqu9wMUAAAAAAAABAQAAAAAAAAAcAAAAAAAAAAAAAAAA + AAAAxw== + + ProfileCurrentVersion + 2.0499999999999998 + RunCommandAsShell + + SelectionColor + + YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T + Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjI3ODQzMTM3 + MjUgMC4zNjA3ODQzMTM3IDAuNDExNzY0NzA1OSAxTxAnMC4yMTcyMzY1Nzg1IDAuMjg4 + NTA0Njg5OSAwLjMzNjg3ODg5NTgAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF + 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx + AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 + AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC + GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA + AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 + ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 + AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz + YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 + LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA + AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 + z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo + dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv + bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg + UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA + AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA + AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y + LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt + zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A + FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ + AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB + GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ + AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC + tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT + A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF + OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR + BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI + vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc + CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN + Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ + ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT + IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs + Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa + KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W + HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi + giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY + J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs + OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC + Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 + YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h + PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE + A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE + SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS + MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 + WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh + 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI + ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz + XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB + fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G + cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu + kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb + QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa + poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx + 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P + vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK + OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY + 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk + c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ + 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A + BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh + WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T + Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA + PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z + DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA + AAAAAAAAAA3j + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw + LjY2NjY2NjY2NjcgMC43MzMzMzMzMzMzIDAuNzY4NjI3NDUxABACgALSEBESE1okY2xh + c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 + ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA + ABkAAAAAAAAAAAAAAAAAAADY + + TextColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw + LjY2NjY2NjY2NjcgMC43MzMzMzMzMzMzIDAuNzY4NjI3NDUxABACgALSEBESE1okY2xh + c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 + ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA + ABkAAAAAAAAAAAAAAAAAAADY + + VisualBell + + name + NeoDark + type + Window Settings + + diff --git a/.vim/colors/neodark/test/test.rb b/.vim/colors/neodark/test/test.rb new file mode 100755 index 0000000..b2a0900 --- /dev/null +++ b/.vim/colors/neodark/test/test.rb @@ -0,0 +1,37 @@ +require 'active_support' + +module VimColors + class RubyExample + CONSTANT = /^[0-9]+ regex awesomes$/ + + attr_reader :colorscheme + + # TODO: Bacon ipsum dolor sit amet + def initialize(attributes = {}) + @colorscheme = attributes[:colorscheme] + end + + def self.examples + # Bacon ipsum dolor sit amet + ['string', :symbol, true, false, nil, 99.9, 1..2].each do |value| + puts "it appears that #{value.inspect} is a #{value.class}" + end + + {:key1 => :value1, key2: 'value2'}.each do |key, value| + puts "the #{key.inspect} key has a value of #{value.inspect}" + end + + %w[One Two Three].each { |number| puts number } + end + + private + + def heredoc_example + <<-SQL + SELECT * + FROM colorschemes + WHERE background = 'dark' + SQL + end + end +end diff --git a/.vim/colors/neodark/tmux.png b/.vim/colors/neodark/tmux.png new file mode 100755 index 0000000..3fdb6c7 Binary files /dev/null and b/.vim/colors/neodark/tmux.png differ diff --git a/.vim/colors/neodark/tmuxcolors.conf b/.vim/colors/neodark/tmuxcolors.conf new file mode 100755 index 0000000..aef83f2 --- /dev/null +++ b/.vim/colors/neodark/tmuxcolors.conf @@ -0,0 +1,28 @@ +# default statusbar colors +set -g status-style bg=colour235,fg=colour6 + +# default window title colors +setw -g window-status-style bg=default,fg=colour15 + +# active window title colors +setw -g window-status-current-style bg=default,fg=red + +# pane border +set -g pane-border-style fg=colour8 +set -g pane-active-border-style fg=green + +# message text +set -g message-style bg=colour235,fg=red + +# modes +setw -g mode-style bg=colour11,fg=colour13,bold + +# pane number display +set -g display-panes-active-colour green +set -g display-panes-colour blue + +# clock +setw -g clock-mode-colour blue + +# bell +# set-window-option -g window-status-bell-style fg=colour235,bg=colour160 #base02, red diff --git a/.vim/colors/neodark/tmuxcolors.tmux b/.vim/colors/neodark/tmuxcolors.tmux new file mode 100755 index 0000000..04d8950 --- /dev/null +++ b/.vim/colors/neodark/tmuxcolors.tmux @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +tmux source-file "$CURRENT_DIR/tmuxcolors.conf" diff --git a/.vim/colors/oceanic-next b/.vim/colors/oceanic-next deleted file mode 160000 index 5ef31a3..0000000 --- a/.vim/colors/oceanic-next +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5ef31a34204f84714885ae9036f66a626036c3dc diff --git a/.vim/colors/oceanic-next/README.md b/.vim/colors/oceanic-next/README.md new file mode 100755 index 0000000..e3e4951 --- /dev/null +++ b/.vim/colors/oceanic-next/README.md @@ -0,0 +1,102 @@ +# Oceanic-Next.vim + +Oceanic-Next.vim is a neovim theme inspired by [Oceanic Next for Sublime](https://github.com/voronianski/oceanic-next-color-scheme). +It is not a direct port, but uses some colors from the sublime theme, that are fitted to work with neovim and vim8. + +For best results, it is suggested that you use the following syntax plugins. + +- [yajs.vim](https://github.com/othree/yajs.vim) +- [html5.vim](https://github.com/othree/html5.vim) +- [yats.vim](https://github.com/HerringtonDarkholme/yats.vim/) + +## Installation + +All major plugin managers for vim/nvim are supported + + ```vim + 'mhartington/oceanic-next' + ``` + +For vim, add the following to your `.vimrc`. + +*(On Google Cloud Shell try to `set t_Co=256` instead of `set termguicolors` even though your vim version is 8)* + + ```viml +" Theme + syntax enable +" for vim 7 + set t_Co=256 + +" for vim 8 + if (has("termguicolors")) + set termguicolors + endif + +colorscheme OceanicNext + ``` + +For neovim, add the following to your `.nvimrc`. + + +```viml +" For Neovim 0.1.3 and 0.1.4 +let $NVIM_TUI_ENABLE_TRUE_COLOR=1 + +" Or if you have Neovim >= 0.1.5 +if (has("termguicolors")) + set termguicolors +endif + +" Theme +syntax enable +colorscheme OceanicNext +``` + +There is an included theme for vim-airline, to use it, just change the airline theme to: + +``` + let g:airline_theme='oceanicnext' +``` + +There is a light mode, but it still needs some work. +Currently, light mode has issues with cursor, need to tweak the colors a bit for that. +Also, the included airline theme could use some work in light mode. Right now it is the exact same as the dark version, I'd like to tweak this a bit. +If anyone would like to contribute, I'd be happy to accept a Pull Request. + +## Configuration + +If your terminal and setup supports it, you can enable italics and bold fonts with the following setting + +```viml + syntax on + let g:oceanic_next_terminal_bold = 1 + let g:oceanic_next_terminal_italic = 1 + colorscheme OceanicNext +``` + +If your terminal has transparancy, you can enable it in neovim by adding the +following lines to your init.vim **after** calling `colorscheme OceanicNext`: + +```viml +hi Normal guibg=NONE ctermbg=NONE +hi LineNr guibg=NONE ctermbg=NONE +hi SignColumn guibg=NONE ctermbg=NONE +hi EndOfBuffer guibg=NONE ctermbg=NONE +``` +Each line above disables the background for a given highlight group +(e.g., LineNr). You can choose which to disable. This will show your terminal's +background (whether or not it's transparent). For best results, use an Oceanic +Next color scheme in your terminal. + +## Screenshot + +Base colors used in the theme. + +![](https://raw.githubusercontent.com/voronianski/oceanic-next-theme/master/colors.png) + +_neovim_ + +![](https://raw.githubusercontent.com/mhartington/oceanic-next/master/oceanic-next-dark.nvim.png) + +Shown here with [vim-devicons](https://github.com/ryanoasis/vim-devicons) + diff --git a/.vim/colors/oceanic-next/after/syntax/xml.vim b/.vim/colors/oceanic-next/after/syntax/xml.vim new file mode 100755 index 0000000..c3935a5 --- /dev/null +++ b/.vim/colors/oceanic-next/after/syntax/xml.vim @@ -0,0 +1,14 @@ +" =============================================================== +" OceanicNext +" Language: XML +" Description: Overrides for XML +" Author: Mike Hartington +" Last Change: 2016/12/11 17:28 +" =============================================================== + +syn region xmlEndTag + \ start=++ + \ contains=xmlTagN +syn match xmlTagN + \ contained +hi(group, fg, bg, attr, attrsp) + " fg, bg, attr, attrsp + if !empty(a:fg) + exec "hi " . a:group . " guifg=" . a:fg[0] + exec "hi " . a:group . " ctermfg=" . a:fg[1] + endif + if !empty(a:bg) + exec "hi " . a:group . " guibg=" . a:bg[0] + exec "hi " . a:group . " ctermbg=" . a:bg[1] + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr + exec "hi " . a:group . " cterm=" . a:attr + endif + if !empty(a:attrsp) + exec "hi " . a:group . " guisp=" . a:attrsp[0] + endif +endfunction +" }}} +" {{{ call s::hi(group, fg, bg, gui, guisp) + call s:hi('Bold', '', '', s:bold, '') + call s:hi('Debug', s:red, '', '', '') + call s:hi('Directory', s:blue, '', '', '') + call s:hi('ErrorMsg', s:red, s:base00, '', '') + call s:hi('Exception', s:red, '', '', '') + call s:hi('FoldColumn', s:blue, s:base00, '', '') + call s:hi('Folded', s:base03, s:base01, s:italic, '') + call s:hi('IncSearch', s:base01, s:orange, 'NONE', '') + call s:hi('Italic', '', '', s:italic, '') + + call s:hi('Macro', s:red, '', '', '') + call s:hi('MatchParen', s:base05, s:base03, '', '') + call s:hi('ModeMsg', s:green, '', '', '') + call s:hi('MoreMsg', s:green, '', '', '') + call s:hi('Question', s:blue, '', '', '') + call s:hi('Search', s:base03, s:yellow, '', '') + call s:hi('SpecialKey', s:base03, '', '', '') + call s:hi('TooLong', s:red, '', '', '') + call s:hi('Underlined', s:red, '', '', '') + call s:hi('Visual', '', s:base02, '', '') + call s:hi('VisualNOS', s:red, '', '', '') + call s:hi('WarningMsg', s:red, '', '', '') + call s:hi('WildMenu', s:base07, s:blue, '', '') + call s:hi('Title', s:blue, '', '', '') + call s:hi('Conceal', s:blue, s:base00, '', '') + call s:hi('Cursor', s:base00, s:base05, '', '') + call s:hi('NonText', s:base03, '', '', '') + call s:hi('Normal', s:base07, s:base00, '', '') + call s:hi('EndOfBuffer', s:base05, s:base00, '', '') + call s:hi('LineNr', s:base03, s:base00, '', '') + call s:hi('SignColumn', s:base00, s:base00, '', '') + call s:hi('StatusLine', s:base01, s:base03, '', '') + call s:hi('StatusLineNC', s:base03, s:base01, '', '') + call s:hi('VertSplit', s:base00, s:base02, '', '') + call s:hi('ColorColumn', '', s:base01, '', '') + call s:hi('CursorColumn', '', s:base01, '', '') + call s:hi('CursorLine', '', s:base01, 'None', '') + call s:hi('CursorLineNR', s:base00, s:base00, '', '') + call s:hi('CursorLineNr', s:base03, s:base01, '', '') + call s:hi('PMenu', s:base04, s:base01, '', '') + call s:hi('PMenuSel', s:base07, s:blue, '', '') + call s:hi('PmenuSbar', '', s:base02, '', '') + call s:hi('PmenuThumb', '', s:base07, '', '') + call s:hi('TabLine', s:base03, s:base01, '', '') + call s:hi('TabLineFill', s:base03, s:base01, '', '') + call s:hi('TabLineSel', s:green, s:base01, '', '') + call s:hi('helpExample', s:yellow, '', '', '') + call s:hi('helpCommand', s:yellow, '', '', '') + + " Standard syntax highlighting + call s:hi('Boolean', s:orange, '', '', '') + call s:hi('Character', s:red, '', '', '') + call s:hi('Comment', s:base03, '', s:italic, '') + call s:hi('Conditional', s:purple, '', '', '') + call s:hi('Constant', s:orange, '', '', '') + call s:hi('Define', s:purple, '', '', '') + call s:hi('Delimiter', s:brown, '', '', '') + call s:hi('Float', s:orange, '', '', '') + call s:hi('Function', s:blue, '', '', '') + + call s:hi('Identifier', s:cyan, '', '', '') + call s:hi('Include', s:blue, '', '', '') + call s:hi('Keyword', s:purple, '', '', '') + + call s:hi('Label', s:yellow, '', '', '') + call s:hi('Number', s:orange, '', '', '') + call s:hi('Operator', s:base05, '', '', '') + call s:hi('PreProc', s:yellow, '', '', '') + call s:hi('Repeat', s:yellow, '', '', '') + call s:hi('Special', s:cyan, '', '', '') + call s:hi('SpecialChar', s:brown, '', '', '') + call s:hi('Statement', s:red, '', '', '') + call s:hi('StorageClass', s:yellow, '', '', '') + call s:hi('String', s:green, '', '', '') + call s:hi('Structure', s:purple, '', '', '') + call s:hi('Tag', s:yellow, '', '', '') + call s:hi('Todo', s:yellow, s:base01, '', '') + call s:hi('Type', s:yellow, '', '', '') + call s:hi('Typedef', s:yellow, '', '', '') + + " LSP + call s:hi('LspDiagnosticsDefaultError', '', '', '', '') + call s:hi('LspDiagnosticsSignError', s:red, '', '', '') + call s:hi('LspDiagnosticsUnderlineError', '', '', 'undercurl', '') + + call s:hi('LspDiagnosticsDefaultWarning', '', '', '', '') + call s:hi('LspDiagnosticsSignWarning', s:yellow, '', '', '') + call s:hi('LspDiagnosticsUnderlineWarning', '', '', 'undercurl', '') + + call s:hi('LspDiagnosticsDefaultInformation', '', '', '', '') + call s:hi('LspDiagnosticsSignInformation', s:blue, '', '', '') + call s:hi('LspDiagnosticsUnderlineInformation', '', '', 'undercurl', '') + + call s:hi('LspDiagnosticsDefaultHint', '', '', '', '') + call s:hi('LspDiagnosticsSignHint', s:cyan, '', '', '') + call s:hi('LspDiagnosticsUnderlineHint', '', '', 'undercurl', '') + + " TreeSitter stuff + call s:hi('TSInclude', s:cyan, '', '', '') + call s:hi('TSPunctBracket', s:cyan, '', '', '') + call s:hi('TSPunctDelimiter', s:base07, '', '', '') + call s:hi('TSParameter', s:base07, '', '', '') + call s:hi('TSType', s:blue, '', '', '') + call s:hi('TSFunction', s:cyan, '', '', '') + + call s:hi('TSTagDelimiter', s:cyan, '', '', '') + call s:hi('TSProperty', s:yellow, '', '', '') + call s:hi('TSMethod', s:blue, '', '', '') + call s:hi('TSParameter', s:yellow, '', '', '') + call s:hi('TSConstructor', s:base07, '', '', '') + call s:hi('TSVariable', s:base07, '', '', '') + call s:hi('TSOperator', s:base07, '', '', '') + call s:hi('TSTag', s:base07, '', '', '') + call s:hi('TSKeyword', s:purple, '', '', '') + call s:hi('TSKeywordOperator', s:purple, '', '', '') + call s:hi('TSVariableBuiltin', s:red, '', '', '') + call s:hi('TSLabel', s:cyan, '', '', '') + + call s:hi('SpellBad', '', '', 'undercurl', '') + call s:hi('SpellLocal', '', '', 'undercurl', '') + call s:hi('SpellCap', '', '', 'undercurl', '') + call s:hi('SpellRare', '', '', 'undercurl', '') + + call s:hi('csClass', s:yellow, '', '', '') + call s:hi('csAttribute', s:yellow, '', '', '') + call s:hi('csModifier', s:purple, '', '', '') + call s:hi('csType', s:red, '', '', '') + call s:hi('csUnspecifiedStatement', s:blue, '', '', '') + call s:hi('csContextualStatement', s:purple, '', '', '') + call s:hi('csNewDecleration', s:red, '', '', '') + call s:hi('cOperator', s:cyan, '', '', '') + call s:hi('cPreCondit', s:purple, '', '', '') + + call s:hi('cssColor', s:cyan, '', '', '') + call s:hi('cssBraces', s:base05, '', '', '') + call s:hi('cssClassName', s:purple, '', '', '') + + + call s:hi('DiffAdd', s:green, s:base01, s:bold, '') + call s:hi('DiffChange', s:base03, s:base01, '', '') + call s:hi('DiffDelete', s:red, s:base01, '', '') + call s:hi('DiffText', s:blue, s:base01, '', '') + call s:hi('DiffAdded', s:base07, s:green, s:bold, '') + call s:hi('DiffFile', s:red, s:base00, '', '') + call s:hi('DiffNewFile', s:green, s:base00, '', '') + call s:hi('DiffLine', s:blue, s:base00, '', '') + call s:hi('DiffRemoved', s:base07, s:red, s:bold, '') + + call s:hi('gitCommitOverflow', s:red, '', '', '') + call s:hi('gitCommitSummary', s:green, '', '', '') + + call s:hi('htmlBold', s:yellow, '', '', '') + call s:hi('htmlItalic', s:purple, '', '', '') + call s:hi('htmlTag', s:cyan, '', '', '') + call s:hi('htmlEndTag', s:cyan, '', '', '') + call s:hi('htmlArg', s:yellow, '', '', '') + call s:hi('htmlTagName', s:base07, '', '', '') + + call s:hi('javaScript', s:base05, '', '', '') + call s:hi('javaScriptNumber', s:orange, '', '', '') + call s:hi('javaScriptBraces', s:base05, '', '', '') + + call s:hi('jsonKeyword', s:green, '', '', '') + call s:hi('jsonQuote', s:green, '', '', '') + + call s:hi('markdownCode', s:green, '', '', '') + call s:hi('markdownCodeBlock', s:green, '', '', '') + call s:hi('markdownHeadingDelimiter', s:blue, '', '', '') + call s:hi('markdownItalic', s:purple, '', s:italic, '') + call s:hi('markdownBold', s:yellow, '', s:bold, '') + call s:hi('markdownCodeDelimiter', s:brown, '', s:italic, '') + call s:hi('markdownError', s:base05, s:base00, '', '') + + call s:hi('typescriptParens', s:base05, s:none, '', '') + + call s:hi('NeomakeErrorSign', s:red, s:base00, '', '') + call s:hi('NeomakeWarningSign', s:yellow, s:base00, '', '') + call s:hi('NeomakeInfoSign', s:white, s:base00, '', '') + call s:hi('NeomakeError', s:red, '', 'underline', s:red) + call s:hi('NeomakeWarning', s:red, '', 'underline', s:red) + + call s:hi('ALEErrorSign', s:red, s:base00, s:bold, '') + call s:hi('ALEWarningSign', s:yellow, s:base00, s:bold, '') + call s:hi('ALEInfoSign', s:white, s:base00, s:bold, '') + + call s:hi('NERDTreeExecFile', s:base05, '', '', '') + call s:hi('NERDTreeDirSlash', s:blue, '', '', '') + call s:hi('NERDTreeOpenable', s:blue, '', '', '') + call s:hi('NERDTreeFile', '', s:none, '', '') + call s:hi('NERDTreeFlags', s:blue, '', '', '') + + call s:hi('phpComparison', s:base05, '', '', '') + call s:hi('phpParent', s:base05, '', '', '') + call s:hi('phpMemberSelector', s:base05, '', '', '') + + call s:hi('pythonRepeat', s:purple, '', '', '') + call s:hi('pythonOperator', s:purple, '', '', '') + + call s:hi('rubyConstant', s:yellow, '', '', '') + call s:hi('rubySymbol', s:green, '', '', '') + call s:hi('rubyAttribute', s:blue, '', '', '') + call s:hi('rubyInterpolation', s:green, '', '', '') + call s:hi('rubyInterpolationDelimiter', s:brown, '', '', '') + call s:hi('rubyStringDelimiter', s:green, '', '', '') + call s:hi('rubyRegexp', s:cyan, '', '', '') + + call s:hi('sassidChar', s:red, '', '', '') + call s:hi('sassClassChar', s:orange, '', '', '') + call s:hi('sassInclude', s:purple, '', '', '') + call s:hi('sassMixing', s:purple, '', '', '') + call s:hi('sassMixinName', s:blue, '', '', '') + + call s:hi('vimfilerLeaf', s:base05, '', '', '') + call s:hi('vimfilerNormalFile', s:base05, s:base00, '', '') + call s:hi('vimfilerOpenedFile', s:blue, '', '', '') + call s:hi('vimfilerClosedFile', s:blue, '', '', '') + + call s:hi('GitGutterAdd', s:green, s:base00, s:bold, '') + call s:hi('GitGutterChange', s:blue, s:base00, s:bold, '') + call s:hi('GitGutterDelete', s:red, s:base00, s:bold, '') + call s:hi('GitGutterChangeDelete', s:purple, s:base00, s:bold, '') + + call s:hi('SignifySignAdd', s:green, s:base00, s:bold, '') + call s:hi('SignifySignChange', s:blue, s:base00, s:bold, '') + call s:hi('SignifySignDelete', s:red, s:base00, s:bold, '') + call s:hi('SignifySignChangeDelete', s:purple, s:base00, s:bold, '') + call s:hi('SignifySignDeleteFirstLine', s:red, s:base00, s:bold, '') + + call s:hi('xmlTag', s:cyan, '', '', '') + call s:hi('xmlTagName', s:base05, '', '', '') + call s:hi('xmlEndTag', s:cyan, '', '', '') + call s:hi('Defx_filename_directory', s:blue, '', '', '') + + call s:hi('CocErrorSign', s:red, '', '', '') + call s:hi('CocWarningSign', s:yellow, '', '', '') + call s:hi('CocInfoSign', s:blue, '', '', '') + call s:hi('CocHintSign', s:cyan, '', '', '') + call s:hi('CocErrorFloat', s:red, '', '', '') + call s:hi('CocWarningFloat', s:yellow, '', '', '') + call s:hi('CocInfoFloat', s:blue, '', '', '') + call s:hi('CocHintFloat', s:cyan, '', '', '') + call s:hi('CocDiagnosticsError', s:red, '', '', '') + call s:hi('CocDiagnosticsWarning', s:yellow, '', '', '') + call s:hi('CocDiagnosticsInfo', s:blue, '', '', '') + call s:hi('CocDiagnosticsHint', s:cyan, '', '', '') + call s:hi('CocSelectedText', s:purple, '', '', '') + call s:hi('CocCodeLens', s:base04, '', '', '') +" }}} +" {{{ Terminal +if has('nvim') + let g:terminal_color_0=s:base00[0] + let g:terminal_color_8=s:base03[0] + + let g:terminal_color_1=s:red[0] + let g:terminal_color_9=s:red[0] + + let g:terminal_color_2=s:green[0] + let g:terminal_color_10=s:green[0] + + let g:terminal_color_3=s:yellow[0] + let g:terminal_color_11=s:yellow[0] + + let g:terminal_color_4=s:blue[0] + let g:terminal_color_12=s:blue[0] + + let g:terminal_color_5=s:purple[0] + let g:terminal_color_13=s:purple[0] + + let g:terminal_color_6=s:cyan[0] + let g:terminal_color_14=s:cyan[0] + + let g:terminal_color_7=s:base05[0] + let g:terminal_color_15=s:base05[0] + + let g:terminal_color_background=s:base00[0] + let g:terminal_color_foreground=s:white[0] +else + let g:terminal_ansi_colors = [ + \ s:base00[0], + \ s:red[0], + \ s:green[0], + \ s:yellow[0], + \ s:blue[0], + \ s:purple[0], + \ s:cyan[0], + \ s:white[0], + \ s:base03[0], + \ s:red[0], + \ s:green[0], + \ s:yellow[0], + \ s:blue[0], + \ s:purple[0], + \ s:cyan[0], + \ s:white[0], + \] + +endif + + diff --git a/.vim/colors/oceanic-next/estilo/addons/nvim-term.yml b/.vim/colors/oceanic-next/estilo/addons/nvim-term.yml new file mode 100755 index 0000000..e2fa29a --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/addons/nvim-term.yml @@ -0,0 +1,29 @@ +color_0: 'base00' +color_1: 'base08' +color_2: 'base0B' +color_3: 'base0A' +color_4: 'base0D' +color_5: 'base0E' +color_6: 'base0C' +color_7: 'base05' +color_8: 'base03' +color_9: 'base09' +color_10: 'base01' +color_11: 'base02' +color_12: 'base04' +color_13: 'base06' +color_14: 'base0F' +color_15: 'base07' +color_background: 'base00' +color_foreground: 'base10' + + +# color_7: 'base07' +# color_8: 'base03' +# color_9: 'base08' +# color_10: 'base01' +# color_11: 'base02' +# color_12: 'base04' +# color_13: 'base05' +# color_14: 'base0F' +# color_15: 'base07' diff --git a/.vim/colors/oceanic-next/estilo/airline/oceanicnextlight.yml b/.vim/colors/oceanic-next/estilo/airline/oceanicnextlight.yml new file mode 100755 index 0000000..66a72ff --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/airline/oceanicnextlight.yml @@ -0,0 +1,15 @@ +normal1: 'base10 base0D' +normal2: 'base07 base03' +normal3: 'base07 base01' +inactive1: 'base07 base03' +inactive2: 'base07 base01' +inactive3: 'base03 base01' +insert1: 'base10 base0B' +insert2: 'base07 base03' +insert3: 'base07 base01' +replace1: 'base10 base08' +replace2: 'base07 base03' +replace3: 'base07 base01' +visual1: 'base10 base09' +visual2: 'base07 base03' +visual3: 'base07 base01' diff --git a/.vim/colors/oceanic-next/estilo/lightline/oceanicnextlight.yml b/.vim/colors/oceanic-next/estilo/lightline/oceanicnextlight.yml new file mode 100755 index 0000000..d98b97d --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/lightline/oceanicnextlight.yml @@ -0,0 +1,33 @@ +normal1: 'base10 base0D' +normal2: 'base10 base03' +normal3: 'base10 base01' +normal4: 'base10 base03' +normal5: 'base10 base03' +# normalError: '' +# normalWarning: '' +inactive1: 'base07 base03' +inactive2: 'base07 base01' +inactive3: 'base03 base01' +inactive4: 'base07 base01' +inactive5: 'base07 base03' + +insert1: 'base10 base0B' +insert2: 'base10 base03' +insert3: 'base10 base01' +insert4: 'base10 base03' +insert5: 'base10 base0B' +replace1: 'base10 base08' +replace2: 'base10 base03' +replace3: 'base10 base01' +replace4: 'base10 base03' +replace5: 'base10 base08' + +visual1: 'base10 base09' +visual2: 'base10 base03' +visual3: 'base10 base01' +visual4: 'base10 base03' +visual5: 'base10 base09' +tablineLeft: 'base03 base01' +tablineSelected: 'base10 base03' +tablineMiddle: 'base03 base01' +tablineRight: 'base03 base01' diff --git a/.vim/colors/oceanic-next/estilo/palettes/oceanic-next-light.yml b/.vim/colors/oceanic-next/estilo/palettes/oceanic-next-light.yml new file mode 100755 index 0000000..b7edc0e --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/palettes/oceanic-next-light.yml @@ -0,0 +1,17 @@ +base00: '#d8dee9' +base01: '#cdd3de' +base02: '#c0c5ce' +base03: '#a7adba' +base04: '#65737e' +base05: '#4f5b66' +base06: '#343d46' +base07: '#1b2b34' +base08: "#b40b11" # #ec5f67 +base09: "#b4713d" # #f99157 +base0A: "#a48c32" # #fac863 +base0B: "#869235" # #99c794 +base0C: "#5b9c90" # #5fb3b3 +base0D: "#526f93" # #6699cc +base0E: "#896a98" # #c594c5 +base0F: "#9a806d" # #ab7967 +base10: '#ffffff' diff --git a/.vim/colors/oceanic-next/estilo/syntax/base.yml b/.vim/colors/oceanic-next/estilo/syntax/base.yml new file mode 100755 index 0000000..16ae0ea --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/base.yml @@ -0,0 +1,104 @@ +# fg bg b/u/r/i/c +# Vim editor colors + +Base00: 'base00' +Base01: 'base01' +Base02: 'base02' +Base03: 'base03' +Base04: 'base04' +Base05: 'base05' +Base06: 'base06' +Base07: 'base07' +Base08: 'base08' +Base09: 'base09' +Base0A: 'base0A' +Base0B: 'base0B' +Base0C: 'base0C' +Base0D: 'base0D' +Base0E: 'base0E' +Base0F: 'base0F' +Base10: 'base10' + +Bold: '. . b' +Debug: 'base08 . .' +Directory: 'base0D . .' +ErrorMsg: 'base08 base00 .' +Exception: 'base08 . .' +FoldColumn: '. base01 .' +Folded: 'base03 base01 .' +IncSearch: 'base01 base09 .' +# Italic: '. . i' +Italic: '. . u' +Macro: 'base08 . .' +MatchParen: 'base05 base03 .' +ModeMsg: 'base0B . .' +MoreMsg: 'base0B . .' +Question: 'base0D . .' +Search: 'base03 base0A .' +SpecialKey: 'base03 . .' +TooLong: 'base08 . .' +Underlined: 'base08 . .' +Visual: '. base02 .' +VisualNOS: 'base08 . .' +WarningMsg: 'base08 . .' +WildMenu: 'base10 base0D .' +Title: 'base0D . ' +Conceal: 'base0D base00 .' +Cursor: 'base00 base05 .' +NonText: 'base03 . .' +Normal: 'base05 base00 .' +LineNr: 'base03 base01 .' +CursorLineNR: 'base10 base10 .' +SignColumn: 'base03 base01 .' +StatusLine: 'base04 base02 ' +StatusLineNC: 'base03 base01 ' +VertSplit: 'base02 base02 ' +ColorColumn: '. base01 ' +CursorColumn: '. base01 ' +CursorLine: '. base01 ' +CursorLineNr: 'base03 base01 .' +PMenu: 'base04 base01 ' +PMenuSel: 'base01 base04 .' +PmenuSbar: '. base02 .' +PmenuThumb: '. base07 .' +TabLine: 'base03 base01 ' +TabLineFill: 'base03 base01 ' +TabLineSel: 'base0B base01 ' +helpExample: 'base0A . .' +helpCommand: 'base0A . .' + + # Standard syntax highlighting +Boolean: 'base09 . .' +Character: 'base08 . .' +# Comment: 'base03 . i' +Comment: 'base03 .' +Conditional: 'base0E . .' +Constant: 'base09 . .' +Define: 'base0E . ' +Delimiter: 'base0F . .' +Float: 'base09 . .' +Function: 'base0D . .' +Identifier: 'base08 . ' +Include: 'base0D . .' +Keyword: 'base0E . .' +Label: 'base0A . .' +Number: 'base09 . .' +Operator: 'base05 . ' +PreProc: 'base0A . .' +Repeat: 'base0A . .' +Special: 'base0C . .' +SpecialChar: 'base0F . .' +Statement: 'base08 . .' +StorageClass: 'base0A . .' +String: 'base0B . .' +Structure: 'base0E . .' +Tag: 'base0A . .' +Todo: 'base0A base01 .' +Type: 'base0A . ' +Typedef: 'base0A . .' + + # Spelling highlighting +SpellBad: '. base00 c' +SpellLocal: '. base00 c' +SpellCap: '. base00 c' +SpellRare: '. base00 c' diff --git a/.vim/colors/oceanic-next/estilo/syntax/c-sharp.yml b/.vim/colors/oceanic-next/estilo/syntax/c-sharp.yml new file mode 100755 index 0000000..a63cf9b --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/c-sharp.yml @@ -0,0 +1,8 @@ +# C# highlighting +csClass: 'base0A . .' +csAttribute: 'base0A . .' +csModifier: 'base0E . .' +csType: 'base08 . .' +csUnspecifiedStatement: 'base0D . .' +csContextualStatement: 'base0E . .' +csNewDecleration: 'base08 . .' diff --git a/.vim/colors/oceanic-next/estilo/syntax/c.yml b/.vim/colors/oceanic-next/estilo/syntax/c.yml new file mode 100755 index 0000000..1a3986e --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/c.yml @@ -0,0 +1,3 @@ +# C highlighting +cOperator: 'base0C . .' +cPreCondit: 'base0E . .' diff --git a/.vim/colors/oceanic-next/estilo/syntax/css.yml b/.vim/colors/oceanic-next/estilo/syntax/css.yml new file mode 100755 index 0000000..50bae3f --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/css.yml @@ -0,0 +1,120 @@ +# CSS highlighting + +cssComment: '' # Comment +cssVendor: '' # Comment +cssHacks: '' # Comment +cssTagName: '' # Statement +cssDeprecated: '' # Error +cssSelectorOp: '' # Special +cssSelectorOp2: '' # Special +cssAttrComma: '' # Special +cssAnimationProp: '' # cssProp +cssBackgroundProp: '' # cssProp +cssBorderProp: '' # cssProp +cssBoxProp: '' # cssProp +cssColorProp: '' # cssProp +cssContentForPagedMediaProp: '' # cssProp +cssDimensionProp: '' # cssProp +cssFlexibleBoxProp: '' # cssProp +cssFontProp: '' # cssProp +cssGeneratedContentProp: '' # cssProp +cssGridProp: '' # cssProp +cssHyerlinkProp: '' # cssProp +cssLineboxProp: '' # cssProp +cssListProp: '' # cssProp +cssMarqueeProp: '' # cssProp +cssMultiColumnProp: '' # cssProp +cssPagedMediaProp: '' # cssProp +cssPositioningProp: '' # cssProp +cssPrintProp: '' # cssProp +cssRubyProp: '' # cssProp +cssSpeechProp: '' # cssProp +cssTableProp: '' # cssProp +cssTextProp: '' # cssProp +cssTransformProp: '' # cssProp +cssTransitionProp: '' # cssProp +cssUIProp: '' # cssProp +cssIEUIProp: '' # cssProp +cssAuralProp: '' # cssProp +cssRenderProp: '' # cssProp +cssMobileTextProp: '' # cssProp +cssAnimationAttr: '' # cssAttr +cssBackgroundAttr: '' # cssAttr +cssBorderAttr: '' # cssAttr +cssBoxAttr: '' # cssAttr +cssContentForPagedMediaAttr: '' # cssAttr +cssDimensionAttr: '' # cssAttr +cssFlexibleBoxAttr: '' # cssAttr +cssFontAttr: '' # cssAttr +cssGeneratedContentAttr: '' # cssAttr +cssGridAttr: '' # cssAttr +cssHyerlinkAttr: '' # cssAttr +cssLineboxAttr: '' # cssAttr +cssListAttr: '' # cssAttr +cssMarginAttr: '' # cssAttr +cssMarqueeAttr: '' # cssAttr +cssMultiColumnAttr: '' # cssAttr +cssPaddingAttr: '' # cssAttr +cssPagedMediaAttr: '' # cssAttr +cssPositioningAttr: '' # cssAttr +cssGradientAttr: '' # cssAttr +cssPrintAttr: '' # cssAttr +cssRubyAttr: '' # cssAttr +cssSpeechAttr: '' # cssAttr +cssTableAttr: '' # cssAttr +cssTextAttr: '' # cssAttr +cssTransformAttr: '' # cssAttr +cssTransitionAttr: '' # cssAttr +cssUIAttr: '' # cssAttr +cssIEUIAttr: '' # cssAttr +cssAuralAttr: '' # cssAttr +cssRenderAttr: '' # cssAttr +cssCommonAttr: '' # cssAttr +cssPseudoClassId: '' # PreProc +cssPseudoClassLang: '' # Constant +cssValueLength: '' # Number +cssValueInteger: '' # Number +cssValueNumber: '' # Number +cssValueAngle: '' # Number +cssValueTime: '' # Number +cssValueFrequency: '' # Number +cssFunction: '' # Constant +cssURL: '' # String +cssFunctionName: '' # Function +cssFunctionComma: '' # Function +cssColor: 'base0C . .' +cssIdentifier: '' # Function +cssInclude: '' # Include +cssIncludeKeyword: '' # atKeyword +cssImportant: '' # Special +cssBraces: 'base05 . .' +cssBraceError: '' # Error +cssError: '' # Error +cssUnicodeEscape: '' # Special +cssStringQQ: '' # String +cssStringQ: '' # String +cssAttributeSelector: '' # String +cssMedia: '' # atKeyword +cssMediaType: '' # Special +cssMediaComma: '' # Normal +cssMediaKeyword: '' # Statement +cssMediaProp: '' # cssProp +cssMediaAttr: '' # cssAttr +cssPage: '' # atKeyword +cssPagePseudo: '' # PreProc +cssPageMargin: '' # atKeyword +cssPageProp: '' # cssProp +cssKeyFrame: '' # atKeyword +cssKeyFrameSelector: '' # Constant +cssFontDescriptor: '' # Special +cssFontDescriptorFunction: '' # Constant +cssFontDescriptorProp: '' # cssProp +cssFontDescriptorAttr: '' # cssAttr +cssUnicodeRange: '' # Constant +cssClassName: 'base0E . .' +cssClassNameDot: '' # Function +cssProp: '' # StorageClass +cssAttr: '' # Constant +cssUnitDecorators: '' # Number +cssNoise: '' # Noise +atKeyword: '' # PreProc diff --git a/.vim/colors/oceanic-next/estilo/syntax/diff.yml b/.vim/colors/oceanic-next/estilo/syntax/diff.yml new file mode 100755 index 0000000..acc54d9 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/diff.yml @@ -0,0 +1,27 @@ +# Diff highlighting +DiffAdd: 'base0B base01 .' +DiffChange: 'base03 base01 .' +DiffDelete: 'base08 base01 .' +DiffText: 'base0D base01 .' +DiffAdded: 'base10 base0B .' +DiffFile: 'base08 base00 .' +DiffNewFile: 'base0B base00 .' +DiffLine: 'base0D base00 .' +DiffRemoved: 'base10 base08 .' + +diffOldFile: '' # diffFile +diffNewFile: '' # diffFile +diffFile: '' # Type +diffOnly: '' # Constant +diffIdentical: '' # Constant +diffDiffer: '' # Constant +diffBDiffer: '' # Constant +diffIsA: '' # Constant +diffNoEOL: '' # Constant +diffCommon: '' # Constant +diffRemoved: '' # Special +diffChanged: '' # PreProc +diffAdded: '' # Identifier +diffLine: '' # Statement +diffSubname: '' # PreProc +diffComment: '' # Comment diff --git a/.vim/colors/oceanic-next/estilo/syntax/fugitive.yml b/.vim/colors/oceanic-next/estilo/syntax/fugitive.yml new file mode 100755 index 0000000..54c0bd3 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/fugitive.yml @@ -0,0 +1,10 @@ +FugitiveblameBoundary: '' # Keyword +FugitiveblameHash: '' # Identifier +FugitiveblameUncommitted: '' # Ignore +FugitiveblameTime: '' # PreProc +FugitiveblameLineNumber: '' # Number +FugitiveblameOriginalFile: '' # String +FugitiveblameOriginalLineNumber: '' # +FugitiveblameShort: '' # FugitiveblameDelimiter +FugitiveblameDelimiter: '' # Delimiter +FugitiveblameNotCommittedYet: '' # Comment diff --git a/.vim/colors/oceanic-next/estilo/syntax/git.yml b/.vim/colors/oceanic-next/estilo/syntax/git.yml new file mode 100755 index 0000000..eb88530 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/git.yml @@ -0,0 +1,22 @@ + # Git highlighting +gitCommitOverflow: 'base08 . .' +gitCommitSummary: 'base0B . .' +gitDateHeader: '' # gitIdentityHeader +gitIdentityHeader: '' # gitIdentityKeyword +gitIdentityKeyword: '' # Label +gitNotesHeader: '' # gitKeyword +gitReflogHeader: '' # gitKeyword +gitKeyword: '' # Keyword +gitIdentity: '' # String +gitEmailDelimiter: '' # Delimiter +gitEmail: '' # Special +gitDate: '' # Number +gitMode: '' # Number +gitHashAbbrev: '' # gitHash +gitHash: '' # Identifier +gitReflogMiddle: '' # gitReference +gitReference: '' # Function +gitStage: '' # gitType +gitType: '' # Type +gitDiffAdded: '' # diffAdded +gitDiffRemoved: '' # diffRemoved diff --git a/.vim/colors/oceanic-next/estilo/syntax/gitcommit.yml b/.vim/colors/oceanic-next/estilo/syntax/gitcommit.yml new file mode 100755 index 0000000..b25254c --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/gitcommit.yml @@ -0,0 +1,26 @@ +gitcommitSummary: '' # Keyword +gitcommitComment: '' # Comment +gitcommitUntracked: '' # gitcommitComment +gitcommitDiscarded: '' # gitcommitComment +gitcommitSelected: '' # gitcommitComment +gitcommitUnmerged: '' # gitcommitComment +gitcommitOnBranch: '' # Comment +gitcommitBranch: '' # Special +gitcommitNoBranch: '' # gitCommitBranch +gitcommitDiscardedType: '' # gitcommitType +gitcommitSelectedType: '' # gitcommitType +gitcommitUnmergedType: '' # gitcommitType +gitcommitType: '' # Type +gitcommitNoChanges: '' # gitcommitHeader +gitcommitHeader: '' # PreProc +gitcommitUntrackedFile: '' # gitcommitFile +gitcommitDiscardedFile: '' # gitcommitFile +gitcommitSelectedFile: '' # gitcommitFile +gitcommitUnmergedFile: '' # gitcommitFile +gitcommitFile: '' # Constant +gitcommitDiscardedArrow: '' # gitcommitArrow +gitcommitSelectedArrow: '' # gitcommitArrow +gitcommitUnmergedArrow: '' # gitcommitArrow +gitcommitArrow: '' # gitcommitComment +gitcommitOverflow: '' # none +gitcommitBlank: '' # Error diff --git a/.vim/colors/oceanic-next/estilo/syntax/gitconfig.yml b/.vim/colors/oceanic-next/estilo/syntax/gitconfig.yml new file mode 100755 index 0000000..8909f10 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/gitconfig.yml @@ -0,0 +1,9 @@ +gitconfigComment: '' # Comment +gitconfigSection: '' # Keyword +gitconfigVariable: '' # Identifier +gitconfigBoolean: '' # Boolean +gitconfigNumber: '' # Number +gitconfigString: '' # String +gitconfigDelim: '' # Delimiter +gitconfigEscape: '' # Delimiter +gitconfigError: '' # Error diff --git a/.vim/colors/oceanic-next/estilo/syntax/gitrebase.yml b/.vim/colors/oceanic-next/estilo/syntax/gitrebase.yml new file mode 100755 index 0000000..29d56e3 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/gitrebase.yml @@ -0,0 +1,11 @@ +gitrebaseCommit: '' # gitrebaseHash +gitrebaseHash: '' # Identifier +gitrebasePick: '' # Statement +gitrebaseReword: '' # Number +gitrebaseEdit: '' # PreProc +gitrebaseSquash: '' # Type +gitrebaseFixup: '' # Special +gitrebaseExec: '' # Function +gitrebaseSummary: '' # String +gitrebaseComment: '' # Comment +gitrebaseSquashError: '' # Error diff --git a/.vim/colors/oceanic-next/estilo/syntax/html.yml b/.vim/colors/oceanic-next/estilo/syntax/html.yml new file mode 100755 index 0000000..5f1401f --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/html.yml @@ -0,0 +1,48 @@ + # HTML highlighting +htmlBold: 'base0A . .' +htmlItalic: 'base0E . .' + +htmlTag: 'base0C . .' +htmlEndTag: 'base0C . .' +htmlArg: 'base0A' # Type +htmlTagName: 'base07 . .' # htmlStatement +htmlSpecialTagName: '' # Exception +htmlValue: '' # String +htmlH1: '' # Title +htmlH2: '' # htmlH1 +htmlH3: '' # htmlH2 +htmlH4: '' # htmlH3 +htmlH5: '' # htmlH4 +htmlH6: '' # htmlH5 +htmlHead: '' # PreProc +htmlTitle: '' # Title +htmlBoldItalicUnderline: '' # htmlBoldUnderlineItalic +htmlUnderlineBold: '' # htmlBoldUnderline +htmlUnderlineItalicBold: '' # htmlBoldUnderlineItalic +htmlUnderlineBoldItalic: '' # htmlBoldUnderlineItalic +htmlItalicUnderline: '' # htmlUnderlineItalic +htmlItalicBold: '' # htmlBoldItalic +htmlItalicBoldUnderline: '' # htmlBoldUnderlineItalic +htmlItalicUnderlineBold: '' # htmlBoldUnderlineItalic +htmlLink: '' # Underlined +htmlLeadingSpace: '' # None +htmlPreStmt: '' # PreProc +htmlPreError: '' # Error +htmlPreProc: '' # PreProc +htmlPreAttr: '' # String +htmlPreProcAttrName: '' # PreProc +htmlPreProcAttrError: '' # Error +htmlSpecial: '' # Special +htmlSpecialChar: '' # Special +htmlString: '' # String +htmlStatement: '' # Statement +htmlComment: '' # Comment +htmlCommentPart: '' # Comment +htmlCommentError: '' # htmlError +htmlTagError: '' # htmlError +htmlEvent: '' # javaScript +htmlError: '' # Error +javaScript: '' # Special +javaScriptExpression: '' # javaScript +htmlCssStyleComment: '' # Comment +htmlCssDefinition: '' # Special diff --git a/.vim/colors/oceanic-next/estilo/syntax/javascript.yml b/.vim/colors/oceanic-next/estilo/syntax/javascript.yml new file mode 100755 index 0000000..39ae751 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/javascript.yml @@ -0,0 +1,36 @@ + + # JavaScript highlighting +javaScript: 'base05 . .' + +javaScriptComment: '' # Comment +javaScriptLineComment: '' # Comment +javaScriptCommentTodo: '' # Todo +javaScriptSpecial: '' # Special +javaScriptStringS: '' # String +javaScriptStringD: '' # String +javaScriptCharacter: '' # Character +javaScriptSpecialCharacter: '' # javaScriptSpecial +javaScriptNumber: 'base09 . .' +javaScriptConditional: '' # Conditional +javaScriptRepeat: '' # Repeat +javaScriptBranch: '' # Conditional +javaScriptOperator: '' # Operator +javaScriptType: '' # Type +javaScriptStatement: '' # Statement +javaScriptFunction: '' # Function +javaScriptBraces: 'base05 . .' +javaScriptError: '' # Error +javaScriptParensError: '' # Error +javaScriptNull: '' # Keyword +javaScriptBoolean: '' # Boolean +javaScriptRegexpString: '' # String +javaScriptIdentifier: '' # Identifier +javaScriptLabel: '' # Label +javaScriptException: '' # Exception +javaScriptMessage: '' # Keyword +javaScriptGlobal: '' # Keyword +javaScriptMember: '' # Keyword +javaScriptDeprecated: '' # Exception +javaScriptReserved: '' # Keyword +javaScriptDebug: '' # Debug +javaScriptConstant: '' # Label diff --git a/.vim/colors/oceanic-next/estilo/syntax/json.yml b/.vim/colors/oceanic-next/estilo/syntax/json.yml new file mode 100755 index 0000000..6a3bbee --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/json.yml @@ -0,0 +1,19 @@ +jsonPadding: '' # Operator +jsonString: '' # String +jsonTest: '' # Label +jsonEscape: '' # Special +jsonNumber: '' # Number +jsonBraces: '' # Delimiter +jsonNull: '' # Function +jsonBoolean: '' # Boolean +jsonKeyword: '' # Label +jsonNumError: '' # Error +jsonCommentError: '' # Error +jsonSemicolonError: '' # Error +jsonTrailingCommaError: '' # Error +jsonMissingCommaError: '' # Error +jsonStringSQError: '' # Error +jsonNoQuotesError: '' # Error +jsonTripleQuotesError: '' # Error +jsonQuote: '' # Quote +jsonNoise: '' # Noise diff --git a/.vim/colors/oceanic-next/estilo/syntax/markdown.yml b/.vim/colors/oceanic-next/estilo/syntax/markdown.yml new file mode 100755 index 0000000..954e3cb --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/markdown.yml @@ -0,0 +1,32 @@ + # Markdown highlighting +markdownCode: 'base0B . .' +markdownCodeBlock: 'base0B . .' + + +markdownH1: '' # htmlH1 +markdownH2: '' # htmlH2 +markdownH3: '' # htmlH3 +markdownH4: '' # htmlH4 +markdownH5: '' # htmlH5 +markdownH6: '' # htmlH6 +markdownHeadingRule: '' # markdownRule +markdownHeadingDelimiter: 'base0D . .' +markdownOrderedListMarker: '' # markdownListMarker +markdownListMarker: '' # htmlTagName +markdownBlockquote: '' # Comment +markdownRule: '' # PreProc +markdownLinkText: '' # htmlLink +markdownIdDeclaration: '' # Typedef +markdownId: '' # Type +markdownAutomaticLink: '' # markdownUrl +markdownUrl: '' # Float +markdownUrlTitle: '' # String +markdownIdDelimiter: '' # markdownLinkDelimiter +markdownUrlDelimiter: '' # htmlTag +markdownUrlTitleDelimiter: '' # Delimiter +markdownItalic: 'base0E . i' +markdownBold: 'base0A . b' +markdownBoldItalic: '' # htmlBoldItalic +markdownCodeDelimiter: 'base0F . i' +markdownEscape: '' # Special +markdownError: 'base05 base00 .' diff --git a/.vim/colors/oceanic-next/estilo/syntax/neomake.yml b/.vim/colors/oceanic-next/estilo/syntax/neomake.yml new file mode 100755 index 0000000..9edc7d5 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/neomake.yml @@ -0,0 +1,6 @@ +# Neomake highlighting +NeomakeErrorSign: 'base08 base01 .' +NeomakeWarningSign: 'base0A base01 .' +NeomakeInfoSign: 'base10 base01 .' +NeomakeError: 'base08 . c' +NeomakeWarning: 'base08 . c' diff --git a/.vim/colors/oceanic-next/estilo/syntax/nerdtree.yml b/.vim/colors/oceanic-next/estilo/syntax/nerdtree.yml new file mode 100755 index 0000000..8238c9c --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/nerdtree.yml @@ -0,0 +1,28 @@ + # NERDTree highlighting + +NERDTreePart: '' # Special +NERDTreePartFile: '' # Type +NERDTreeExecFile: 'base05 . .' +NERDTreeDirSlash: 'base0D . .' +NERDTreeBookmarksHeader: '' # statement +NERDTreeBookmarksLeader: '' # ignore +NERDTreeBookmarkName: '' # Identifier +NERDTreeBookmark: '' # normal +NERDTreeHelp: '' # String +NERDTreeHelpKey: '' # Identifier +NERDTreeHelpCommand: '' # Identifier +NERDTreeHelpTitle: '' # Macro +NERDTreeToggleOn: '' # Question +NERDTreeToggleOff: '' # WarningMsg +NERDTreeLinkTarget: '' # Type +NERDTreeLinkFile: '' # Macro +NERDTreeLinkDir: '' # Macro +NERDTreeDir: '' # Directory +NERDTreeUp: '' # Directory +NERDTreeFile: '' # Normal +NERDTreeCWD: '' # Statement +NERDTreeOpenable: 'base0D . .' +NERDTreeClosable: '' # Title +NERDTreeIgnore: '' # ignore +NERDTreeRO: '' # WarningMsg +NERDTreeFlags: '' # Number diff --git a/.vim/colors/oceanic-next/estilo/syntax/php.yml b/.vim/colors/oceanic-next/estilo/syntax/php.yml new file mode 100755 index 0000000..35baf62 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/php.yml @@ -0,0 +1,54 @@ +# PHP highlighting +phpComparison: 'base05 . .' +phpConstant: '' # Constant +phpCoreConstant: '' # Constant +phpComment: '' # Comment +phpDocTags: '' # PreProc +phpDocCustomTags: '' # Type +phpException: '' # Exception +phpBoolean: '' # Boolean +phpStorageClass: '' # StorageClass +phpSCKeyword: '' # StorageClass +phpFCKeyword: '' # Define +phpStructure: '' # Structure +phpStringSingle: '' # String +phpStringDouble: '' # String +phpBacktick: '' # String +phpNumber: '' # Number +phpFloat: '' # Float +phpMethods: '' # Function +phpFunctions: '' # Function +phpBaselib: '' # Function +phpRepeat: '' # Repeat +phpConditional: '' # Conditional +phpLabel: '' # Label +phpStatement: '' # Statement +phpKeyword: '' # Statement +phpType: '' # Type +phpInclude: '' # Include +phpDefine: '' # Define +phpBackslashSequences: '' # SpecialChar +phpBackslashDoubleQuote: '' # SpecialChar +phpBackslashSingleQuote: '' # SpecialChar +phpParent: 'base05 . .' +phpBrackets: '' # Delimiter +phpIdentifierConst: '' # Delimiter +phpParentError: '' # Error +phpOctalError: '' # Error +phpInterpSimpleError: '' # Error +phpInterpBogusDollarCurley: '' # Error +phpInterpDollarCurly1: '' # Error +phpInterpDollarCurly2: '' # Error +phpInterpSimpleBracketsInner: '' # String +phpInterpSimpleCurly: '' # Delimiter +phpInterpVarname: '' # Identifier +phpTodo: '' # Todo +phpDocTodo: '' # Todo +phpMemberSelector: 'base05 . .' +phpIntVar: '' # Identifier +phpEnvVar: '' # Identifier +phpOperator: '' # Operator +phpVarSelector: '' # Operator +phpRelation: '' # Operator +phpIdentifier: '' # Identifier +phpIdentifierSimply: '' # Identifier diff --git a/.vim/colors/oceanic-next/estilo/syntax/python.yml b/.vim/colors/oceanic-next/estilo/syntax/python.yml new file mode 100755 index 0000000..a90c442 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/python.yml @@ -0,0 +1,23 @@ +# Python highlighting + +pythonStatement: '' # Statement +pythonConditional: '' # Conditional +pythonRepeat: 'base0E . .' +pythonOperator: 'base0E . .' +pythonException: '' # Exception +pythonInclude: '' # Include +pythonDecorator: '' # Define +pythonFunction: '' # Function +pythonComment: '' # Comment +pythonTodo: '' # Todo +pythonString: '' # String +pythonRawString: '' # String +pythonQuotes: '' # String +pythonTripleQuotes: '' # pythonQuotes +pythonEscape: '' # Special +pythonNumber: '' # Number +pythonBuiltin: '' # Function +pythonExceptions: '' # Structure +pythonSpaceError: '' # Error +pythonDoctest: '' # Special +pythonDoctestValue: '' # Define diff --git a/.vim/colors/oceanic-next/estilo/syntax/ruby.yml b/.vim/colors/oceanic-next/estilo/syntax/ruby.yml new file mode 100755 index 0000000..e6a8ed6 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/ruby.yml @@ -0,0 +1,64 @@ + # Ruby highlighting + +rubyClass: '' # rubyDefine +rubyModule: '' # rubyDefine +rubyMethodExceptional: '' # rubyDefine +rubyDefine: '' # Define +rubyFunction: '' # Function +rubyConditional: '' # Conditional +rubyConditionalModifier: '' # rubyConditional +rubyExceptional: '' # rubyConditional +rubyRepeat: '' # Repeat +rubyRepeatModifier: '' # rubyRepeat +rubyOptionalDo: '' # rubyRepeat +rubyControl: '' # Statement +rubyInclude: '' # Include +rubyInteger: '' # Number +rubyASCIICode: '' # Character +rubyFloat: '' # Float +rubyBoolean: '' # Boolean +rubyException: '' # Exception +rubyIdentifier: '' # Identifier +rubyClassVariable: '' # rubyIdentifier +rubyConstant: 'base0A . .' +rubyGlobalVariable: '' # rubyIdentifier +rubyBlockParameter: '' # rubyIdentifier +rubyInstanceVariable: '' # rubyIdentifier +rubyPredefinedIdentifier: '' # rubyIdentifier +rubyPredefinedConstant: '' # rubyPredefinedIdentifier +rubyPredefinedVariable: '' # rubyPredefinedIdentifier +rubySymbol: 'base0B . .' +rubyKeyword: '' # Keyword +rubyOperator: '' # Operator +rubyBeginEnd: '' # Statement +rubyAccess: '' # Statement +rubyAttribute: 'base0D . .' +rubyEval: '' # Statement +rubyPseudoVariable: '' # Constant +rubyComment: '' # Comment +rubyData: '' # Comment +rubyDataDirective: '' # Delimiter +rubyDocumentation: '' # Comment +rubyTodo: '' # Todo +rubyQuoteEscape: '' # rubyStringEscape +rubyStringEscape: '' # Special +rubyInterpolation: 'base0B . .' +rubyInterpolationDelimiter: 'base0F . .' +rubyNoInterpolation: '' # rubyString +rubySharpBang: '' # PreProc +rubyRegexpDelimiter: '' # rubyStringDelimiter +rubySymbolDelimiter: '' # rubyStringDelimiter +rubyStringDelimiter: 'base0B . .' +rubyHeredoc: '' # rubyString +rubyString: '' # String +rubyRegexpEscape: '' # rubyRegexpSpecial +rubyRegexpQuantifier: '' # rubyRegexpSpecial +rubyRegexpAnchor: '' # rubyRegexpSpecial +rubyRegexpDot: '' # rubyRegexpCharClass +rubyRegexpCharClass: '' # rubyRegexpSpecial +rubyRegexpSpecial: '' # Special +rubyRegexpComment: '' # Comment +rubyRegexp: 'base0C . .' +rubyInvalidVariable: '' # Error +rubyError: '' # Error +rubySpaceError: '' # rubyError diff --git a/.vim/colors/oceanic-next/estilo/syntax/scss.yml b/.vim/colors/oceanic-next/estilo/syntax/scss.yml new file mode 100755 index 0000000..a0a5e66 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/scss.yml @@ -0,0 +1,7 @@ + # SASS highlighting +sassidChar: 'base08 . .' +sassClassChar: 'base09 . .' +sassInclude: 'base0E . .' +sassMixing: 'base0E . .' +sassMixinName: 'base0D . .' + diff --git a/.vim/colors/oceanic-next/estilo/syntax/sh.yml b/.vim/colors/oceanic-next/estilo/syntax/sh.yml new file mode 100755 index 0000000..4da69a4 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/sh.yml @@ -0,0 +1,127 @@ +shArithRegion: '' # shShellVariables +shAtExpr: '' # shSetList +shBeginHere: '' # shRedir +shCaseBar: '' # shConditional +shCaseCommandSub: '' # shCommandSub +shCaseDoubleQuote: '' # shDoubleQuote +shCaseIn: '' # shConditional +shQuote: '' # shOperator +shCaseSingleQuote: '' # shSingleQuote +shCaseStart: '' # shConditional +shCmdSubRegion: '' # shShellVariables +shColon: '' # shComment +shDerefOp: '' # shOperator +shDerefPOL: '' # shDerefOp +shDerefPPS: '' # shDerefOp +shDeref: '' # shShellVariables +shDerefDelim: '' # shOperator +shDerefSimple: '' # shDeref +shDerefSpecial: '' # shDeref +shDerefString: '' # shDoubleQuote +shDerefVar: '' # shDeref +shDoubleQuote: '' # shString +shEcho: '' # shString +shEchoDelim: '' # shOperator +shEchoQuote: '' # shString +shForPP: '' # shLoop +shEmbeddedEcho: '' # shString +shEscape: '' # shCommandSub +shExDoubleQuote: '' # shDoubleQuote +shExSingleQuote: '' # shSingleQuote +shFunction: '' # Function +shHereDoc: '' # shString +shHerePayload: '' # shHereDoc +shLoop: '' # shStatement +shMoreSpecial: '' # shSpecial +shOption: '' # shCommandSub +shPattern: '' # shString +shParen: '' # shArithmetic +shPosnParm: '' # shShellVariables +shQuickComment: '' # shComment +shRange: '' # shOperator +shRedir: '' # shOperator +shSetListDelim: '' # shOperator +shSetOption: '' # shOption +shSingleQuote: '' # shString +shSource: '' # shOperator +shStringSpecial: '' # shSpecial +shSubShRegion: '' # shOperator +shTestOpr: '' # shConditional +shTestPattern: '' # shString +shTestDoubleQuote: '' # shString +shTestSingleQuote: '' # shString +shVariable: '' # shSetList +shWrapLineOperator: '' # shOperator +bashAdminStatement: '' # shStatement if exists("b:is_bash") +bashSpecialVariables: '' # shShellVariables if exists("b:is_bash") +bashStatement: '' # shStatement if exists("b:is_bash") +shFunctionParen: '' # Delimiter if exists("b:is_bash") +shFunctionDelim: '' # Delimiter if exists("b:is_bash") +kshSpecialVariables: '' # shShellVariables if exists("b:is_kornshell") +kshStatement: '' # shStatement if exists("b:is_kornshell") +shCaseError: '' # Error if !exists("g:sh_no_error") +shCondError: '' # Error if !exists("g:sh_no_error") +shCurlyError: '' # Error if !exists("g:sh_no_error") +shDerefError: '' # Error if !exists("g:sh_no_error") +shDerefOpError: '' # Error if !exists("g:sh_no_error") +shDerefWordError: '' # Error if !exists("g:sh_no_error") +shDoError: '' # Error if !exists("g:sh_no_error") +shEsacError: '' # Error if !exists("g:sh_no_error") +shIfError: '' # Error if !exists("g:sh_no_error") +shInError: '' # Error if !exists("g:sh_no_error") +shParenError: '' # Error if !exists("g:sh_no_error") +shTestError: '' # Error if !exists("g:sh_no_error") +shDTestError: '' # Error if exists("b:is_kornshell") +shArithmetic: '' # Special +shCharClass: '' # Identifier +shSnglCase: '' # Statement +shCommandSub: '' # Special +shComment: '' # Comment +shConditional: '' # Conditional +shCtrlSeq: '' # Special +shExprRegion: '' # Delimiter +shFunctionKey: '' # Function +shFunctionName: '' # Function +shNumber: '' # Number +shOperator: '' # Operator +shRepeat: '' # Repeat +shSet: '' # Statement +shSetList: '' # Identifier +shShellVariables: '' # PreProc +shSpecial: '' # Special +shStatement: '' # Statement +shString: '' # String +shTodo: '' # Todo +shAlias: '' # Identifier +shHereDoc01: '' # shRedir +shHereDoc02: '' # shRedir +shHereDoc03: '' # shRedir +shHereDoc04: '' # shRedir +shHereDoc05: '' # shRedir +shHereDoc06: '' # shRedir +shHereDoc07: '' # shRedir +shHereDoc08: '' # shRedir +shHereDoc09: '' # shRedir +shHereDoc10: '' # shRedir +shHereDoc11: '' # shRedir +shHereDoc12: '' # shRedir +shHereDoc13: '' # shRedir +shHereDoc14: '' # shRedir +shHereDoc15: '' # shRedir +shHereDoc16: '' # shRedir +shHereDoc17: '' # shRedir +shHereDoc18: '' # shRedir +shHereDoc19: '' # shRedir +shHereDoc20: '' # shRedir +shHereDoc21: '' # shRedir +shHereDoc22: '' # shRedir +shHereDoc23: '' # shRedir +shHereDoc24: '' # shRedir +shHereDoc25: '' # shRedir +shHereDoc26: '' # shRedir +shHereDoc27: '' # shRedir +shHereDoc28: '' # shRedir +shHereDoc29: '' # shRedir +shHereDoc30: '' # shRedir +shHereDoc31: '' # shRedir +shHereDoc32: '' # shRedir diff --git a/.vim/colors/oceanic-next/estilo/syntax/unite.yml b/.vim/colors/oceanic-next/estilo/syntax/unite.yml new file mode 100755 index 0000000..88ff793 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/unite.yml @@ -0,0 +1,29 @@ +uniteError: '' # Error +uniteMarkedLine: '' # Statement +uniteCandidateSourceName: '' # Type +uniteQuickMatchText: '' # Special +uniteCandidateIcon: '' # Special +uniteMarkedIcon: '' # Statement +uniteCandidateInputKeyword: '' # Function +uniteChooseAction: '' # NONE +uniteChooseCandidate: '' # NONE +uniteChooseKey: '' # SpecialKey +uniteChooseMessage: '' # NONE +uniteChoosePrompt: '' # uniteSourcePrompt +uniteChooseSource: '' # uniteSourceNames +uniteInputPrompt: '' # Normal +uniteInputLine: '' # Identifier +uniteInputCommand: '' # Statement +uniteStatusNormal: '' # StatusLine +uniteStatusHead: '' # Statement +uniteStatusSourceNames: '' # PreProc +uniteStatusSourceCandidates: '' # Constant +uniteStatusMessage: '' # Comment +uniteStatusLineNR: '' # LineNR + + +#vimfiler +vimfilerLeaf: 'base05 . .' +vimfilerNormalFile: 'base05 base00 .' +vimfilerOpenedFile: 'base0D . .' +vimfilerClosedFile: 'base0D . .' diff --git a/.vim/colors/oceanic-next/estilo/syntax/vim-gitgutter.yml b/.vim/colors/oceanic-next/estilo/syntax/vim-gitgutter.yml new file mode 100755 index 0000000..f89c9d9 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/vim-gitgutter.yml @@ -0,0 +1,5 @@ +# GitGutter airblade/vim-gitgutter +GitGutterAdd: 'base0B base01 .' +GitGutterChange: 'base0D base01 .' +GitGutterDelete: 'base08 base01 .' +GitGutterChangeDelete: 'base0E base01 .' diff --git a/.vim/colors/oceanic-next/estilo/syntax/xml.yml b/.vim/colors/oceanic-next/estilo/syntax/xml.yml new file mode 100755 index 0000000..76c00af --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/xml.yml @@ -0,0 +1,24 @@ +xmlTodo: '' # Todo +xmlTag: 'base0C' # Function +xmlTagName: 'base05' # Function +xmlEndTag: 'base0C . .' +xmlNamespace: '' # Tag +xmlEntity: '' # Statement +xmlEntityPunct: '' # Type +xmlAttribPunct: '' # Comment +xmlAttrib: '' # Type +xmlString: '' # String +xmlComment: '' # Comment +xmlCommentStart: '' # xmlComment +xmlCommentPart: '' # Comment +xmlCommentError: '' # Error +xmlError: '' # Error +xmlProcessingDelim: '' # Comment +xmlProcessing: '' # Type +xmlCdata: '' # String +xmlCdataCdata: '' # Statement +xmlCdataStart: '' # Type +xmlCdataEnd: '' # Type +xmlDocTypeDecl: '' # Function +xmlDocTypeKeyword: '' # Statement +xmlInlineDTD: '' # Function diff --git a/.vim/colors/oceanic-next/estilo/syntax/yajs.yml b/.vim/colors/oceanic-next/estilo/syntax/yajs.yml new file mode 100755 index 0000000..5846471 --- /dev/null +++ b/.vim/colors/oceanic-next/estilo/syntax/yajs.yml @@ -0,0 +1,80 @@ +javascriptReserved: '' # Error +javascriptReservedCase: '' # Error +javascriptInvalidOp: '' # Error +javascriptEndColons: '' # Statement +javascriptOpSymbol: '' # Normal +javascriptBraces: '' # Function +javascriptBrackets: '' # Function +javascriptParens: '' # Normal +javascriptComment: '' # Comment +javascriptLineComment: '' # Comment +javascriptDocComment: '' # Comment +javascriptCommentTodo: '' # Todo +javascriptDocNotation: '' # SpecialComment +javascriptDocTags: '' # SpecialComment +javascriptDocNGParam: '' # javascriptDocParam +javascriptDocParam: '' # Function +javascriptDocNumParam: '' # Function +javascriptDocEventRef: '' # Function +javascriptDocNamedParamType: '' # Type +javascriptDocParamName: '' # Type +javascriptDocParamType: '' # Type +javascriptString: '' # String +javascriptTemplate: '' # String +javascriptEventString: '' # String +javascriptASCII: '' # Label +javascriptTemplateSubstitution: '' # Label +javascriptTemplateSB: '' # javascriptTemplateSubstitution +javascriptRegexpString: '' # String +javascriptGlobal: '' # Constant +javascriptCharacter: '' # Character +javascriptPrototype: '' # Type +javascriptConditional: '' # Conditional +javascriptConditionalElse: '' # Conditional +javascriptSwitch: '' # Conditional +javascriptCase: '' # Conditional +javascriptDefault: '' # javascriptCase +javascriptExportDefault: '' # javascriptCase +javascriptBranch: '' # Conditional +javascriptIdentifier: '' # Structure +javascriptVariable: '' # Identifier +javascriptRepeat: '' # Repeat +javascriptForComprehension: '' # Repeat +javascriptIfComprehension: '' # Repeat +javascriptOfComprehension: '' # Repeat +javascriptForOperator: '' # Repeat +javascriptStatementKeyword: '' # Statement +javascriptReturn: '' # Statement +javascriptYield: '' # Statement +javascriptYieldGen: '' # Statement +javascriptMessage: '' # Keyword +javascriptOperator: '' # Identifier +javascriptTarget: '' # Identifier +javascriptNull: '' # Boolean +javascriptNumber: '' # Number +javascriptBoolean: '' # Boolean +javascriptObjectLabel: '' # javascriptLabel +javascriptObjectLabelColon: '' # javascriptLabel +javascriptLabel: '' # Label +javascriptPropertyName: '' # Label +javascriptImport: '' # Special +javascriptExport: '' # Special +javascriptTry: '' # Statement +javascriptExceptions: '' # Statement +javascriptMethodName: '' # Function +javascriptMethodAccessor: '' # Operator +javascriptObjectMethodName: '' # Function +javascriptFuncKeyword: '' # Keyword +javascriptAsyncFunc: '' # Keyword +javascriptArrowFunc: '' # Type +javascriptFuncName: '' # Function +javascriptFuncArg: '' # Special +javascriptArrowFuncArg: '' # javascriptFuncArg +javascriptComma: '' # Normal +javascriptClassKeyword: '' # Keyword +javascriptClassExtends: '' # Keyword +javascriptClassName: '' # Function +javascriptClassSuperName: '' # Function +javascriptClassStatic: '' # StorageClass +javascriptClassSuper: '' # keyword +shellbang: '' # Comment diff --git a/.vim/colors/oceanic-next/license.txt b/.vim/colors/oceanic-next/license.txt new file mode 100755 index 0000000..bd98b5e --- /dev/null +++ b/.vim/colors/oceanic-next/license.txt @@ -0,0 +1,272 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +==== + +The above license applies to all parts of Neovim except (1) parts that were +contributed under the Vim license and (2) externally maintained libraries. + +The externally maintained libraries used by Neovim are: + + - Klib: a Generic Library in C. MIT/X11 license. + - libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license. + - LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license. + +==== + +Any parts of Neovim that were contributed under the Vim license are licensed +under the Vim license unless the copyright holder gave permission to license +those contributions under the Apache 2.0 license. + +The Vim license follows: + +VIM LICENSE + +I) There are no restrictions on distributing unmodified copies of Vim except + that they must include this license text. You can also distribute + unmodified parts of Vim, likewise unrestricted except that they must + include this license text. You are also allowed to include executables + that you made from the unmodified Vim sources, plus your own usage + examples and Vim scripts. + +II) It is allowed to distribute a modified (or extended) version of Vim, + including executables and/or source code, when the following four + conditions are met: + 1) This license text must be included unmodified. + 2) The modified Vim must be distributed in one of the following five ways: + a) If you make changes to Vim yourself, you must clearly describe in + the distribution how to contact you. When the maintainer asks you + (in any way) for a copy of the modified Vim you distributed, you + must make your changes, including source code, available to the + maintainer without fee. The maintainer reserves the right to + include your changes in the official version of Vim. What the + maintainer will do with your changes and under what license they + will be distributed is negotiable. If there has been no negotiation + then this license, or a later version, also applies to your changes. + The current maintainer is Bram Moolenaar . If this + changes it will be announced in appropriate places (most likely + vim.sf.net, www.vim.org and/or comp.editors). When it is completely + impossible to contact the maintainer, the obligation to send him + your changes ceases. Once the maintainer has confirmed that he has + received your changes they will not have to be sent again. + b) If you have received a modified Vim that was distributed as + mentioned under a) you are allowed to further distribute it + unmodified, as mentioned at I). If you make additional changes the + text under a) applies to those changes. + c) Provide all the changes, including source code, with every copy of + the modified Vim you distribute. This may be done in the form of a + context diff. You can choose what license to use for new code you + add. The changes and their license must not restrict others from + making their own changes to the official version of Vim. + d) When you have a modified Vim which includes changes as mentioned + under c), you can distribute it without the source code for the + changes if the following three conditions are met: + - The license that applies to the changes permits you to distribute + the changes to the Vim maintainer without fee or restriction, and + permits the Vim maintainer to include the changes in the official + version of Vim without fee or restriction. + - You keep the changes for at least three years after last + distributing the corresponding modified Vim. When the maintainer + or someone who you distributed the modified Vim to asks you (in + any way) for the changes within this period, you must make them + available to him. + - You clearly describe in the distribution how to contact you. This + contact information must remain valid for at least three years + after last distributing the corresponding modified Vim, or as long + as possible. + e) When the GNU General Public License (GPL) applies to the changes, + you can distribute the modified Vim under the GNU GPL version 2 or + any later version. + 3) A message must be added, at least in the output of the ":version" + command and in the intro screen, such that the user of the modified Vim + is able to see that it was modified. When distributing as mentioned + under 2)e) adding the message is only required for as far as this does + not conflict with the license used for the changes. + 4) The contact information as required under 2)a) and 2)d) must not be + removed or changed, except that the person himself can make + corrections. + +III) If you distribute a modified version of Vim, you are encouraged to use + the Vim license for your changes and make them available to the + maintainer, including the source code. The preferred way to do this is + by e-mail or by uploading the files to a server and e-mailing the URL. + If the number of changes is small (e.g., a modified Makefile) e-mailing a + context diff will do. The e-mail address to be used is + + +IV) It is not allowed to remove this license from the distribution of the Vim + sources, parts of it or from a modified version. You may use this + license for previous Vim releases instead of the license that they came + with, at your option. diff --git a/.vim/colors/oceanic-next/oceanic-next-dark.nvim.png b/.vim/colors/oceanic-next/oceanic-next-dark.nvim.png new file mode 100755 index 0000000..2d59173 Binary files /dev/null and b/.vim/colors/oceanic-next/oceanic-next-dark.nvim.png differ diff --git a/.vim/colors/oceanic-next/test/react.Component.tsx b/.vim/colors/oceanic-next/test/react.Component.tsx new file mode 100755 index 0000000..895725c --- /dev/null +++ b/.vim/colors/oceanic-next/test/react.Component.tsx @@ -0,0 +1,31 @@ +import React from 'react'; + +class MyComponent extends React.Component { + constructor() { + super(); + + this.state = { + title: 'World', + }; + } + + componentDidMount() { + console.log('MyComponent is mounted!'); + } + + clickHandler(title) { + this.setState({ title }); + } + + render() { + const { title } = this.state; + + return ( +
+

Hello, {title}!

+ +
+ ); + } +} +export default MyComponent; diff --git a/.vim/colors/oceanic-next/test/react.js b/.vim/colors/oceanic-next/test/react.js new file mode 100755 index 0000000..895725c --- /dev/null +++ b/.vim/colors/oceanic-next/test/react.js @@ -0,0 +1,31 @@ +import React from 'react'; + +class MyComponent extends React.Component { + constructor() { + super(); + + this.state = { + title: 'World', + }; + } + + componentDidMount() { + console.log('MyComponent is mounted!'); + } + + clickHandler(title) { + this.setState({ title }); + } + + render() { + const { title } = this.state; + + return ( +
+

Hello, {title}!

+ +
+ ); + } +} +export default MyComponent; diff --git a/.vim/colors/oceanic-next/test/rust.rs b/.vim/colors/oceanic-next/test/rust.rs new file mode 100755 index 0000000..3978def --- /dev/null +++ b/.vim/colors/oceanic-next/test/rust.rs @@ -0,0 +1 @@ +#[tokio::main] diff --git a/.vim/colors/oceanic-next/test/style-components.js b/.vim/colors/oceanic-next/test/style-components.js new file mode 100755 index 0000000..52929ac --- /dev/null +++ b/.vim/colors/oceanic-next/test/style-components.js @@ -0,0 +1,17 @@ +import styled from 'styled-components'; + +const Button = styled.button` + /* Color the background and border with theme.main */ + background: ${props => props.theme.main}; + border: 2px solid ${props => props.theme.main}; + + /* …more styles here… */ +`; + +// Set the default theme, in our case main will be +// palevioletred if no other theme is specified +Button.defaultProps = { + theme: { + main: 'palevioletred', + }, +}; diff --git a/.vim/colors/oceanic-next/test/test.css b/.vim/colors/oceanic-next/test/test.css new file mode 100755 index 0000000..11cbf94 --- /dev/null +++ b/.vim/colors/oceanic-next/test/test.css @@ -0,0 +1,88 @@ +.color{ + color: #202020; /* dark-gray */ + color: #303030; /* med-gray-hi */ + color: #3a3a3a; /* med-gray-lo */ + color: #505050; /* light-gray */ + color: #99cc99; /* green */ + color: #6a9fb5; /* blue */ + color: #aa769f; /* purple */ + color: #d28446; /* orange */ + color: #ac4142; /* red */ + color: #d7afdc; /* pink */ + +} + +elm{ + let s:gui00 = "132838" + let s:gui01 = "343d46" + let s:gui02 = "4f5b66" + let s:gui03 = "65737e" + let s:gui04 = "a7adba" + let s:gui05 = "c0c5ce" + let s:gui06 = "cdd3de" + let s:gui07 = "d8dee9" + let s:gui08 = "ec5f67" + let s:gui09 = "f99157" + let s:gui0A = "fac863" + let s:gui0B = "99c794" + let s:gui0C = "5fb3b3" + let s:gui0D = "6699cc" + let s:gui0E = "c594c5" + let s:gui0F = "ab7967" + + + let s:cterm00 = "00" + let s:cterm01 = "236" + let s:cterm02 = "239" + let s:cterm03 = "59" + let s:cterm04 = "145" + let s:cterm05 = "152" + let s:cterm06 = "188" + let s:cterm07 = "15" + let s:cterm08 = "203" + let s:cterm09 = "209" + let s:cterm0A = "221" + let s:cterm0B = "114" + let s:cterm0C = "73" + let s:cterm0D = "68" + let s:cterm0E = "176" + let s:cterm0F = "137" +} +elm{ + + + +base04: #A7ADBA +base05: #C0C5CE +base06: #CDD3DE +base07: #D8DEE9 +base08: #EC5f67 +base09: #F99157 +base0A: #FAC863 +base0B: #99C794 +base0C: #5FB3B3 +base0D: #6699CC +base0E: #C594C5 +base0F: #AB7967 +} + +elm { + +gui00: #1b2b34; +gui01: #343d46; +gui02: #4f5b66; +gui03: #65737e; +gui04: #a7adba; +gui05: #c0c5ce; +gui06: #cdd3de; +gui07: #d8dee9; +gui08: #ec5f67; +gui09: #f99157; +gui0A: #fac863; +gui0B: #99c794; +gui0C: #5fb3b3; +gui0D: #6699cc; +gui0E: #c594c5; +gui0F: #ab7967; + +} diff --git a/.vim/colors/oceanic-next/test/test.js b/.vim/colors/oceanic-next/test/test.js new file mode 100755 index 0000000..341245a --- /dev/null +++ b/.vim/colors/oceanic-next/test/test.js @@ -0,0 +1,37 @@ +import config from '../config'; +import SoundCloudAudio from 'soundcould-audio'; + +class SoundCloudAudio extends SoundCloudAudio { + constructor(clientId) { + super(clientId); + this._events = {}; + } + + on(e, fn) { + this._events[e] = fn; + this.audio.addEventListener(e, fn, false); + } + + off(e, fn) { + this._events[e] = null; + this.audio.addEventListener(e, fn); + } + + unbindAll() { + for (var e in this._events) { + var fn = this._events[e]; + if (fn) { + this.off(e, fn); + } + } + } + + preload(streamUrl) { + this._track = { + stream_url: streamUrl, + }; + this.audio.src = streamUrl = '?client_id' = +this._clientId; + } +} + +export default new SoundCloud(config.soundcould.clientId); diff --git a/.vim/colors/oceanic-next/test/test.jsx b/.vim/colors/oceanic-next/test/test.jsx new file mode 100755 index 0000000..e11f6d9 --- /dev/null +++ b/.vim/colors/oceanic-next/test/test.jsx @@ -0,0 +1,42 @@ +const EmailField = function (props) { + return { + propTypes: { + email: React.PropTypes.string, + isEditMode: React.PropTypes.bool + }, + + props, + + onKeyUp (e) { + if (e.keyCode !== ENTER_KEY) return; + setEmail(e.target.value); + }, + + render () { + const isEditMode = this.props.isEditMode; + const email = this.props.email; + + const displayStyle = { + display: isEditMode ? 'none' : 'block' + }; + const editStyle = { + display: isEditMode ? 'block' : 'none' + }; + + return ( +
+

setEditMode(true) } + style = { displayStyle } + >{ email } +

+ +
+ ); + } + }; +}; diff --git a/.vim/colors/oceanic-next/test/test.md b/.vim/colors/oceanic-next/test/test.md new file mode 100755 index 0000000..b904e32 --- /dev/null +++ b/.vim/colors/oceanic-next/test/test.md @@ -0,0 +1,11 @@ +# Here is a H1 +## Here is a H2 +### Here is a H3 + +**Bold** + +_italic_ + +```html +
+``` diff --git a/.vim/colors/onedark b/.vim/colors/onedark deleted file mode 160000 index e86ce93..0000000 --- a/.vim/colors/onedark +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e86ce939d85576fb7ce6c1c45fd49c8a570c24cc diff --git a/.vim/colors/onedark/.eslintrc.json b/.vim/colors/onedark/.eslintrc.json new file mode 100755 index 0000000..eaa63f2 --- /dev/null +++ b/.vim/colors/onedark/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "env": { + "es6": true, + "node": true + }, + "extends": "eslint:recommended", + "rules": { + "no-console": ["off"] + } +} diff --git a/.vim/colors/onedark/.npmrc b/.vim/colors/onedark/.npmrc new file mode 100755 index 0000000..38f11c6 --- /dev/null +++ b/.vim/colors/onedark/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org diff --git a/.vim/colors/onedark/.prettierrc b/.vim/colors/onedark/.prettierrc new file mode 100755 index 0000000..6dd6218 --- /dev/null +++ b/.vim/colors/onedark/.prettierrc @@ -0,0 +1,6 @@ +{ + "arrowParens": "avoid", + "printWidth": 120, + "singleQuote": true, + "trailingComma": "none" +} diff --git a/.vim/colors/onedark/CONTRIBUTING.md b/.vim/colors/onedark/CONTRIBUTING.md new file mode 100755 index 0000000..6dcf8ef --- /dev/null +++ b/.vim/colors/onedark/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# Contributing to onedark.vim + +Please read this document before submitting a Pull Request. + +**Pull Requests containing changes to files in the `autoload/` or `colors/` directories without corresponding changes to files in the `build/templates` directory will _not_ be merged.** + +## Build System + +### Background Information + +onedark.vim's shared color definitions file `autoload/onedark.vim` and its companion Xresources color palette file are built using a rudimentary templating and build system that allows color definitions to live in a single, central file. (Additional terminal color palette files are themselves generated from the template-produced Xresources file.) + +The basic idea is that these files are generated by a build tool that substitutes color values into templates that live in `build/templates`. + +Here are the locations of the files that are generated by the build system, along with the locations of the corresponding templates they are generated from: + +| Theme Location | Template Location | +| --------------------------- | --------------------------------------- | +| `autoload/onedark.vim` | `build/templates/autoload.template.vim` | +| `term/One Dark.Xresources` | `build/templates/One Dark.Xresources` | +| `term/One Dark.itermcolors` | `build/templates/One Dark.itermcolors` | +| `term/One Dark.terminal` | `build/templates/One Dark.terminal` | +| `term/One Dark.alacritty` | `build/templates/One Dark.alacritty` | +| `term/One Dark.colorscheme` | `build/templates/One Dark.colorscheme` | + +### Configure It + +1. Install [Node.js](https://nodejs.org/en/) (Installing via [nvm](https://github.com/creationix/nvm) or [homebrew](https://brew.sh) are both better options than the official Node.js installer.) + +2. Run the following from within the root of this repository. This will install the build system's dependencies and will automatically configure a Git pre-commit hook that runs `npm test` (see below). + +```bash +> npm install +``` + +That's it! + +### Use It + +The build system consists of a single Node.js script, `build/build.js`, which supports two commands: + +- Running `./build/build.js` or `npm run build` generates theme files from the templates, **overwriting changes to the theme files without confirmation.** +- Running `./build/build.js check` or `npm test` checks that the theme files match the template-generated output, **without modifying theme files**. This command ensures that the theme files perfectly match the templates they are generated from, which is useful for detecting changes that were made to generated theme files but that should have been made in the templates. +- In addition to running `./build/build.js check`, `npm test` also runs linting and style checks on certain files to catch and prevent simple problems and stylistic inconsistency. If `npm test` reports any issues, many reported issues can be automatically fixed by running `npm run lint:fix`.) + +The basic development workflow looks like this: + +1. Make changes to the appropriate template files in `build/templates`, then run `npm run build`. + +2. Commit your changes with Git. `npm test` will automatically run before your commit is finalized. If the test fails, fix any inconsistencies between the template files and theme files (or linting/style errors if applicable), then try committing again. + +## Style Guidelines + +Please match the existing comment and whitespace style in all template files. + +For the "Language-Specific Highlighting" portion of onedark.vim, blocks for each language should be organized alphabetically ("Markdown" comes before "PHP"). + +All code changes should pass against the included linting and style checks. These checks are run via [husky](https://www.npmjs.com/package/husky) and [lint-staged](https://www.npmjs.com/package/lint-staged) when you attempt to commit changes. You can manually check for linting and stylistic issues by running `npm test`, and many reported issues can be automatically fixed by running `npm run lint:fix`. + +## Thanks! + +Thanks very much for contributing to onedark.vim! diff --git a/.vim/colors/onedark/LICENSE b/.vim/colors/onedark/LICENSE new file mode 100755 index 0000000..015bbd6 --- /dev/null +++ b/.vim/colors/onedark/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Joshua Dick + +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. diff --git a/.vim/colors/onedark/README.md b/.vim/colors/onedark/README.md new file mode 100755 index 0000000..64b4ba9 --- /dev/null +++ b/.vim/colors/onedark/README.md @@ -0,0 +1,277 @@ +![onedark.vim](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/readme_header.png) + +A dark Vim/Neovim color scheme for the GUI and 16/256/true-color terminals, based on [FlatColor](https://github.com/MaxSt/FlatColor), with colors inspired by the excellent [One Dark syntax theme](https://github.com/atom/atom/tree/master/packages/one-dark-syntax) for the [Atom text editor](https://atom.io). + +## Color Reference + +![Color Reference](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/color_reference.png) + +## Breaking Changes + +[Pull request #271](https://github.com/joshdick/onedark.vim/pull/271), merged July 11, 2021, contained several breaking changes, especially for 16-color users. + +If you are an existing onedark.vim user that is suddenly having issues after this PR was merged, see the [PR description](https://github.com/joshdick/onedark.vim/pull/271) for details. + +## Supported Plugins + +onedark.vim includes support for the following Vim and Neovim plugins: + +- [airblade/vim-gitgutter](https://github.com/airblade/vim-gitgutter) +- [dense-analysis/ale](https://github.com/dense-analysis/ale) +- [easymotion/vim-easymotion](https://github.com/easymotion/vim-easymotion) +- [itchyny/lightline.vim](https://github.com/itchyny/lightline.vim) +- [lewis6991/gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) +- [mhinz/vim-signify](https://github.com/mhinz/vim-signify) +- [neoclide/coc.nvim](https://github.com/neoclide/coc.nvim) +- [neomake/neomake](https://github.com/neomake/neomake) +- [Neovim LSP](https://neovim.io/doc/user/lsp.html) +- [plasticboy/vim-markdown](https://github.com/plasticboy/vim-markdown) +- [prabirshrestha/vim-lsp](https://github.com/prabirshrestha/vim-lsp) +- [tpope/vim-fugitive](https://github.com/tpope/vim-fugitive) +- [vim-airline/vim-airline](https://github.com/vim-airline/vim-airline) + +## Installation + +1. Install the theme using your Vim plug-in manager of choice (or manually, by placing `colors/onedark.vim` in your `~/.vim/colors/` directory and `autoload/onedark.vim` in your `~/.vim/autoload/` directory.) + + The theme also supports being installed as a Vim 8 package. Simply clone this repository into `~/.vim/pack/*/opt/` (so that the local path to this README would end up being `~/.vim/pack/*/opt/onedark.vim/README.md`) and add `packadd! onedark.vim` to your `~/.vimrc`. (The `*` in the path can be any value; see `:help packages` for more information.) + +2. If you use Vim in a terminal, do the following to test whether your terminal emulator supports [24-bit/"true" color](https://gist.github.com/XVilka/8346728), then add relevant `~/.vimrc` configuration if so: + + _Note: GUI (non-terminal) Vim will always display 24-bit color regardless of the configuration done in this step._ + + Run the following snippet in your shell: + + ```shell + printf "\x1b[38;2;255;100;0mTRUECOLOR\x1b[0m\n" + ``` + + If your terminal emulator **does NOT display the word `TRUECOLOR` in red**, it does not support 24-bit color. If you don't want to switch to a different terminal emulator that [supports 24-bit color](https://gist.github.com/XVilka/8346728), **proceed to step 3**. (After installation, the [`g:onedark_termcolors` option](#options) may interest you.) + + If your terminal emulator displays the word `TRUECOLOR` **in red**, it supports 24-bit color, and you should add the following lines to your `~/.vimrc` to enable 24-bit color terminal support inside Vim. + + (If you use [tmux](https://tmux.github.io/), be sure to view the tmux-related notes in the first few lines.) + + ```vim + "Use 24-bit (true-color) mode in Vim/Neovim when outside tmux. + "If you're using tmux version 2.2 or later, you can remove the outermost $TMUX check and use tmux's 24-bit color support + "(see < http://sunaku.github.io/tmux-24bit-color.html#usage > for more information.) + if (empty($TMUX)) + if (has("nvim")) + "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 > + let $NVIM_TUI_ENABLE_TRUE_COLOR=1 + endif + "For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 > + "Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd > + " < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 > + if (has("termguicolors")) + set termguicolors + endif + endif + ``` + +3. Add the following to your `~/.vimrc` (below any lines you may have added in steps 1 and 2): + + ```vim + syntax on + colorscheme onedark + ``` + +4. Installing the [sheerun/vim-polyglot](https://github.com/sheerun/vim-polyglot) plug-in is recommended for improved syntax highlighting for various languages, but is not required. + +## Options + +**Note:** All options should be set **before** the `colorscheme onedark` line in your `~/.vimrc`. + +- `g:onedark_hide_endofbuffer`: Set to `1` if you want to hide end-of-buffer filler lines (~) for a cleaner look; `0` otherwise (the default). + +- `g:onedark_termcolors` **(see [Troubleshooting](#troubleshooting) (below) for more information about this option)**: Set to `256` for 256-color terminals (the default), or set to `16` to use your terminal emulator's native 16 colors. + +- `g:onedark_terminal_italics`: Set to `1` if your terminal emulator supports italics; `0` otherwise (the default). + +## lightline.vim Colorscheme + +![lightline-onedark.vim Preview](https://raw.github.com/joshdick/onedark.vim/main/img/preview_lightline.png) + +This repository includes a companion [lightline.vim](https://github.com/itchyny/lightline.vim) colorscheme for use with onedark.vim. + +The lightline.vim colorscheme: + +- Depends on `autoload/onedark.vim` for its colors, and must therefore be used in conjunction with it. +- Works with both color modes available in onedark.vim (16 or 256 colors), as specified in the configuration for onedark.vim. + +### Installation + +(These instructions assume that lightline.vim and onedark.vim are already installed and configured to your liking.) + +Place `onedark.vim/autoload/lightline/colorscheme/onedark.vim` in your `~/.vim/autoload/lightline/colorscheme/` directory either manually or by using your Vim plug-in manager of choice, then add the following lines to your `~/.vimrc` (or merge them into your existing lightline.vim configuration): + +```vim +let g:lightline = { + \ 'colorscheme': 'onedark', + \ } +``` + +## vim-airline Theme + +![airline-onedark.vim Preview](https://raw.github.com/joshdick/onedark.vim/main/img/preview_airline.png) + +This repository includes a companion [vim-airline](https://github.com/vim-airline/vim-airline) theme for use with onedark.vim. + +The vim-airline theme: + +- Depends on `autoload/onedark.vim` for its colors, and must therefore be used in conjunction with it. +- Works with both color modes available in onedark.vim (16 or 256 colors), as specified in the configuration for onedark.vim. +- Is based on vim-airline's ["tomorrow" theme](https://github.com/vim-airline/vim-airline-themes/blob/master/autoload/airline/themes/tomorrow.vim). + +### Installation + +(These instructions assume that vim-airline and onedark.vim are already installed and configured to your liking.) + +Place `onedark.vim/autoload/airline/themes/onedark.vim` in your `~/.vim/autoload/airline/themes/` directory either manually or by using your Vim plug-in manager of choice, then add the following line to your `~/.vimrc`: + +```vim +let g:airline_theme='onedark' +``` + +## Troubleshooting + +### Why do the colors in terminal Vim look totally crazy? + +![Broken Colors](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/broken_colors.png) + +If Vim looks similar to the screenshot above, you have enabled Vim's 24-bit color terminal support, but your terminal doesn't support 24 bit color. Remove the relevant `~/.vimrc` configuration for enabling 24-bit color support to get things looking better. + +### Why do the colors in terminal Vim look slightly off/not like the preview image at the top of this README? + +If your terminal doesn't support 24-bit color as described in the [Installation](#installation) section of this README, or 24-bit color support is not always available everywhere you use your Vim configuration, colors will not look like they do in the preview image. + +However, you can use the `g:onedark_termcolors` option to control onedark.vim's fallback colors in situations where 24-bit color terminal support is not available. + +`g:onedark_termcolors` can be set to one of two values, `256` for 256-color mode (the default), or `16` for 16-color mode (which uses your terminal emulator's native 16 colors.) + +**When Vim/Neovim are configured to use 24-bit color, the `g:onedark_termcolors` option is ignored. However, `g:onedark_termcolors` can still coexist with 24-bit color configuration.** For instance, when tmux 2.1 or earlier and/or older Vim/Neovim versions that don't support 24-bit color are used, the `g:onedark_termcolors` option will take effect. + +- **256-color mode** is enabled by default with no additional configuration, but colors are less accurate since they are approximated using a 256-color palette. The background color will appear darker than in the preview image, and most other colors will appear brighter than in the preview image. If you don't want to change your terminal's color palette as described in the 16-color mode section below, and your terminal doesn't support 24-bit color, 256-color mode is your only option. + + Although 256-color mode is enabled by default (when not using 24-bit color as described above), you can explicitly enable it by adding the following line to your `~/.vimrc`: + + ```vim + let g:onedark_termcolors=256 + ``` + +- **16-color mode** is the preferred option, since its colors are more accurate than those of 256-color mode. However, you'll need to set your terminal emulator's color palette to this color scheme's custom 16-color palette, since 16-color mode will cause the color scheme to use your terminal emulator's native 16 colors. If you don't use the custom 16-color palette in your terminal emulator when 16-color mode is enabled, onedark.vim's colors will not display correctly in Vim. + + The canonical version of the 16-color palette is an [Xresources](https://en.wikipedia.org/wiki/X_resources) file located in this repository at `term/One Dark.Xresources`. Color schemes for various terminal emulators are also provided in `term/`. (The [iTerm2](https://iterm2.com/) color scheme works with iTerm2 versions 2.9.x and later.) You should be able to easily convert the Xresources color scheme for use with your terminal emulator of choice either by hand, or automatically by using [termcolors](https://github.com/stayradiated/termcolors). + + Assuming your terminal emulator is configured to use the custom 16-color palette as described above, add the following line to your `~/.vimrc` to enable 16-color mode: + + ```vim + let g:onedark_termcolors=16 + ``` + +### Why do all comments look like they're highlighted? + +![Broken Italics](https://raw.githubusercontent.com/joshdick/onedark.vim/main/img/broken_italics.png) + +If all comments look like the one in the screenshot above, you have enabled italics in onedark.vim by setting `g:onedark_terminal_italics=1` in your `~/.vimrc`, but your terminal isn't displaying italics correctly. You can either remove the option or [try to fix your terminal](https://github.com/joshdick/onedark.vim/issues/97#issuecomment-299719352). If you're using [iTerm2](http://iterm2.com) on macOS, you might need to [use a special TERMINFO](https://gist.github.com/sos4nt/3187620) to get italics working. + +### Why do colors look washed out when using [iTerm2](https://www.iterm2.com)? + +Make sure that in Preferences, Profiles -> [Active Profile] -> Colors -> Minimum Contrast is turned all the way down. See [#145](https://github.com/joshdick/onedark.vim/issues/145) for more information. + +## Miscellaneous + +### Customizing onedark.vim's look without forking the repository + +onedark.vim exposes `onedark#extend_highlight` and `onedark#set_highlight` functions that you can call from within your `~/.vimrc` in order to customize the look of onedark.vim. + +#### `onedark#extend_highlight` + +`onedark#extend_highlight` allows you to customize individual aspects of onedark.vim's existing highlight groups, overriding only the keys you provide. (To completely redefine/override an existing highlight group, see `onedark#set_highlight` below.) + +`onedark#extend_highlight`'s first argument should be the name of a highlight group, and its second argument should be **partial** style data. + +Place the following lines **before** the `colorscheme onedark` line in your `~/.vimrc`, then change the example overrides to suit your needs: + +```vim +if (has("autocmd")) + augroup colorextend + autocmd! + " Make `Function`s bold in GUI mode + autocmd ColorScheme * call onedark#extend_highlight("Function", { "gui": "bold" }) + " Override the `Statement` foreground color in 256-color mode + autocmd ColorScheme * call onedark#extend_highlight("Statement", { "fg": { "cterm": 128 } }) + " Override the `Identifier` background color in GUI mode + autocmd ColorScheme * call onedark#extend_highlight("Identifier", { "bg": { "gui": "#333333" } }) + augroup END +endif +``` + +#### `onedark#set_highlight` + +`onedark#set_highlight` allows you to completely redefine/override highlight groups of your choosing. + +`onedark#set_highlight`'s first argument should be the name of a highlight group, and its second argument should be **complete** style data. + +For example, to remove the background color only when running in terminals (outside GUI mode and for use in transparent terminals,) place the following lines **before** the `colorscheme onedark` line in your `~/.vimrc`: + +```vim +" onedark.vim override: Don't set a background color when running in a terminal; +" just use the terminal's background color +" `gui` is the hex color code used in GUI mode/nvim true-color mode +" `cterm` is the color code used in 256-color mode +" `cterm16` is the color code used in 16-color mode +if (has("autocmd") && !has("gui_running")) + augroup colorset + autocmd! + let s:white = { "gui": "#ABB2BF", "cterm": "145", "cterm16" : "7" } + autocmd ColorScheme * call onedark#set_highlight("Normal", { "fg": s:white }) " `bg` will not be styled since there is no `bg` setting + augroup END +endif +``` + +#### Global color overrides + +You can override colors across all highlights by adding color definitions to the `g:onedark_color_overrides` dictionary in your `~/.vimrc` like so: + +```vim +let g:onedark_color_overrides = { +\ "background": {"gui": "#2F343F", "cterm": "235", "cterm16": "0" }, +\ "purple": { "gui": "#C678DF", "cterm": "170", "cterm16": "5" } +\} +``` + +This also needs to be done **before** `colorscheme onedark`. + +More examples of highlight group names and style data can be found in onedark.vim's source code (`colors/onedark.vim` inside this repository). + +### tmux theme + +If you'd like a tmux theme that complements onedark.vim, [@odedlaz has you covered](https://github.com/odedlaz/tmux-onedark-theme). + +### Contributing + +If you'd like to contribute to onedark.vim, check out the [contribution guidelines](./CONTRIBUTING.md). + +### Relatives of onedark.vim + +Several other themes and projects have reused code and/or colors from this project, or were otherwise inspired by it. + +If onedark.vim isn't meeting your needs, try one of its relatives! + +- [drewtempelmeyer/palenight.vim](https://github.com/drewtempelmeyer/palenight.vim) +- [KeitaNakamura/neodark.vim](https://github.com/KeitaNakamura/neodark.vim) +- [base16-onedark.vim](https://github.com/chriskempson/base16-vim/blob/master/colors/base16-onedark.vim) + - Associated base16 scheme: [tilal6991/base16-onedark-scheme](https://github.com/tilal6991/base16-onedark-scheme) +- [rakr/vim-one](https://github.com/rakr/vim-one) +- For Neovim >= 0.5 with treesitter support: [navarasu/onedark.nvim](https://github.com/navarasu/onedark.nvim) or [monsonjeremy/onedark.nvim](https://github.com/monsonjeremy/onedark.nvim) +- Neovim-only Lua port: [ii14/onedark.nvim](https://github.com/ii14/onedark.nvim) + +### Preview images + +Preview images were taken using: + +- [iTerm2](https://iterm2.com) terminal emulator on macOS +- 13 pt. [PragmataPro Mono](http://www.fsd.it/fonts/pragmatapro.htm#.VlDa1q6rTOY) font +- [vim-polyglot](https://github.com/sheerun/vim-polyglot) plug-in diff --git a/.vim/colors/onedark/autoload/airline/themes/onedark.vim b/.vim/colors/onedark/autoload/airline/themes/onedark.vim new file mode 100755 index 0000000..65181dd --- /dev/null +++ b/.vim/colors/onedark/autoload/airline/themes/onedark.vim @@ -0,0 +1,130 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +" This is a [vim-airline](https://github.com/vim-airline/vim-airline) theme for use with +" the [onedark.vim](https://github.com/joshdick/onedark.vim) colorscheme. + +" It is based on vim-airline's ["tomorrow" theme](https://github.com/vim-airline/vim-airline-themes/blob/master/autoload/airline/themes/tomorrow.vim). +function! airline#themes#onedark#refresh() + let s:colors = onedark#GetColors() + + if get(g:, 'onedark_termcolors', 256) == 16 + let s:term_red = s:colors.red.cterm16 + let s:term_green = s:colors.green.cterm16 + let s:term_yellow = s:colors.yellow.cterm16 + let s:term_blue = s:colors.blue.cterm16 + let s:term_purple = s:colors.purple.cterm16 + let s:term_white = s:colors.white.cterm16 + let s:term_cursor_grey = s:colors.cursor_grey.cterm16 + let s:term_visual_grey = s:colors.visual_grey.cterm16 + else + let s:term_red = s:colors.red.cterm + let s:term_green = s:colors.green.cterm + let s:term_yellow = s:colors.yellow.cterm + let s:term_blue = s:colors.blue.cterm + let s:term_purple = s:colors.purple.cterm + let s:term_white = s:colors.white.cterm + let s:term_cursor_grey = s:colors.cursor_grey.cterm + let s:term_visual_grey = s:colors.visual_grey.cterm + endif + + let g:airline#themes#onedark#palette = {} + + let g:airline#themes#onedark#palette.accents = { + \ 'red': [ s:colors.red.gui, '', s:term_red, 0 ] + \ } + + let s:N1 = [ s:colors.cursor_grey.gui, s:colors.green.gui, s:term_cursor_grey, s:term_green ] + let s:N2 = [ s:colors.white.gui, s:colors.visual_grey.gui, s:term_white, s:term_visual_grey ] + let s:N3 = [ s:colors.green.gui, s:colors.cursor_grey.gui, s:term_green, s:term_cursor_grey ] + let g:airline#themes#onedark#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) + + let group = airline#themes#get_highlight('vimCommand') + let g:airline#themes#onedark#palette.normal_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + let s:I1 = [ s:colors.cursor_grey.gui, s:colors.blue.gui, s:term_cursor_grey, s:term_blue ] + let s:I2 = s:N2 + let s:I3 = [ s:colors.blue.gui, s:colors.cursor_grey.gui, s:term_blue, '' ] + let g:airline#themes#onedark#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) + let g:airline#themes#onedark#palette.insert_modified = g:airline#themes#onedark#palette.normal_modified + + let s:R1 = [ s:colors.cursor_grey.gui, s:colors.red.gui, s:term_cursor_grey, s:term_red ] + let s:R2 = s:N2 + let s:R3 = [ s:colors.red.gui, s:colors.cursor_grey.gui, s:term_red, '' ] + let g:airline#themes#onedark#palette.replace = airline#themes#generate_color_map(s:R1, s:R2, s:R3) + let g:airline#themes#onedark#palette.replace_modified = g:airline#themes#onedark#palette.normal_modified + + let s:V1 = [ s:colors.cursor_grey.gui, s:colors.purple.gui, s:term_cursor_grey, s:term_purple ] + let s:V2 = s:N2 + let s:V3 = [ s:colors.purple.gui, s:colors.cursor_grey.gui, s:term_purple, '' ] + let g:airline#themes#onedark#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) + let g:airline#themes#onedark#palette.visual_modified = g:airline#themes#onedark#palette.normal_modified + + let s:IA1 = [ s:colors.cursor_grey.gui, s:colors.white.gui, s:term_cursor_grey, s:term_white ] + let s:IA2 = [ s:colors.white.gui, s:colors.visual_grey.gui, s:term_white, s:term_visual_grey ] + let s:IA3 = s:N2 + let g:airline#themes#onedark#palette.inactive = airline#themes#generate_color_map(s:IA1, s:IA2, s:IA3) + let g:airline#themes#onedark#palette.inactive_modified = { + \ 'airline_c': [ group[0], '', group[2], '', '' ] + \ } + + " Warning/Error styling code from vim-airline's ["base16" theme](https://github.com/vim-airline/vim-airline-themes/blob/master/autoload/airline/themes/base16.vim) + + " Warnings + let s:WI = [ s:colors.cursor_grey.gui, s:colors.yellow.gui, s:term_cursor_grey, s:term_yellow ] + let g:airline#themes#onedark#palette.normal.airline_warning = [ + \ s:WI[0], s:WI[1], s:WI[2], s:WI[3] + \ ] + + let g:airline#themes#onedark#palette.normal_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.insert.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.insert_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.visual.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.visual_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.replace.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + let g:airline#themes#onedark#palette.replace_modified.airline_warning = + \ g:airline#themes#onedark#palette.normal.airline_warning + + " Errors + let s:ER = [ s:colors.cursor_grey.gui, s:colors.red.gui, s:term_cursor_grey, s:term_red ] + let g:airline#themes#onedark#palette.normal.airline_error = [ + \ s:ER[0], s:ER[1], s:ER[2], s:ER[3] + \ ] + + let g:airline#themes#onedark#palette.normal_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.insert.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.insert_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.visual.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.visual_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.replace.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + + let g:airline#themes#onedark#palette.replace_modified.airline_error = + \ g:airline#themes#onedark#palette.normal.airline_error + +endfunction + +call airline#themes#onedark#refresh() diff --git a/.vim/colors/onedark/autoload/lightline/colorscheme/onedark.vim b/.vim/colors/onedark/autoload/lightline/colorscheme/onedark.vim new file mode 100755 index 0000000..d04a501 --- /dev/null +++ b/.vim/colors/onedark/autoload/lightline/colorscheme/onedark.vim @@ -0,0 +1,58 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +" This is a [lightline.vim](https://github.com/itchyny/lightline.vim) colorscheme for use with +" the [onedark.vim](https://github.com/joshdick/onedark.vim) colorscheme. + +let s:colors = onedark#GetColors() + +if get(g:, 'onedark_termcolors', 256) == 16 + let s:term_red = s:colors.red.cterm16 + let s:term_green = s:colors.green.cterm16 + let s:term_yellow = s:colors.yellow.cterm16 + let s:term_blue = s:colors.blue.cterm16 + let s:term_purple = s:colors.purple.cterm16 + let s:term_white = s:colors.white.cterm16 + let s:term_cursor_grey = s:colors.cursor_grey.cterm16 + let s:term_visual_grey = s:colors.visual_grey.cterm16 +else + let s:term_red = s:colors.red.cterm + let s:term_green = s:colors.green.cterm + let s:term_yellow = s:colors.yellow.cterm + let s:term_blue = s:colors.blue.cterm + let s:term_purple = s:colors.purple.cterm + let s:term_white = s:colors.white.cterm + let s:term_cursor_grey = s:colors.cursor_grey.cterm + let s:term_visual_grey = s:colors.visual_grey.cterm +endif + +let s:red = [ s:colors.red.gui, s:term_red ] +let s:green = [ s:colors.green.gui, s:term_green ] +let s:yellow = [ s:colors.yellow.gui, s:term_yellow ] +let s:blue = [ s:colors.blue.gui, s:term_blue ] +let s:purple = [ s:colors.purple.gui, s:term_purple ] +let s:white = [ s:colors.white.gui, s:term_white ] +let s:cursor_grey = [ s:colors.cursor_grey.gui, s:term_cursor_grey ] +let s:visual_grey = [ s:colors.visual_grey.gui, s:term_visual_grey ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:cursor_grey, s:green ], [ s:white, s:visual_grey ] ] +let s:p.normal.right = [ [ s:cursor_grey, s:green ], [ s:white, s:visual_grey ] ] +let s:p.inactive.left = [ [ s:white, s:visual_grey ], [ s:white, s:visual_grey ] ] +let s:p.inactive.right = [ [ s:cursor_grey, s:white ], [ s:cursor_grey, s:white ] ] +let s:p.insert.left = [ [ s:cursor_grey, s:blue ], [ s:white, s:visual_grey ] ] +let s:p.insert.right = [ [ s:cursor_grey, s:blue ], [ s:white, s:visual_grey ] ] +let s:p.replace.left = [ [ s:cursor_grey, s:red ], [ s:white, s:visual_grey ] ] +let s:p.replace.right = [ [ s:cursor_grey, s:red ], [ s:white, s:visual_grey ] ] +let s:p.visual.left = [ [ s:cursor_grey, s:purple ], [ s:white, s:visual_grey ] ] +let s:p.visual.right = [ [ s:cursor_grey, s:purple ], [ s:white, s:visual_grey ] ] +let s:p.normal.middle = [ [ s:white, s:cursor_grey ] ] +let s:p.inactive.middle = [ [ s:white, s:visual_grey ] ] +let s:p.tabline.left = [ [ s:white, s:visual_grey ] ] +let s:p.tabline.tabsel = [ [ s:cursor_grey, s:white ] ] +let s:p.tabline.middle = [ [ s:white, s:cursor_grey ] ] +let s:p.tabline.right = [ [ s:white, s:visual_grey ] ] +let s:p.normal.error = [ [ s:cursor_grey, s:red ] ] +let s:p.normal.warning = [ [ s:cursor_grey, s:yellow ] ] + +let g:lightline#colorscheme#onedark#palette = lightline#colorscheme#flatten(s:p) + diff --git a/.vim/colors/onedark/autoload/onedark.vim b/.vim/colors/onedark/autoload/onedark.vim new file mode 100755 index 0000000..4630ff4 --- /dev/null +++ b/.vim/colors/onedark/autoload/onedark.vim @@ -0,0 +1,29 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +let s:overrides = get(g:, "onedark_color_overrides", {}) + +let s:colors = { + \ "red": get(s:overrides, "red", { "gui": "#E06C75", "cterm": "204", "cterm16": "1" }), + \ "dark_red": get(s:overrides, "dark_red", { "gui": "#BE5046", "cterm": "196", "cterm16": "9" }), + \ "green": get(s:overrides, "green", { "gui": "#98C379", "cterm": "114", "cterm16": "2" }), + \ "yellow": get(s:overrides, "yellow", { "gui": "#E5C07B", "cterm": "180", "cterm16": "3" }), + \ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "#D19A66", "cterm": "173", "cterm16": "11" }), + \ "blue": get(s:overrides, "blue", { "gui": "#61AFEF", "cterm": "39", "cterm16": "4" }), + \ "purple": get(s:overrides, "purple", { "gui": "#C678DD", "cterm": "170", "cterm16": "5" }), + \ "cyan": get(s:overrides, "cyan", { "gui": "#56B6C2", "cterm": "38", "cterm16": "6" }), + \ "white": get(s:overrides, "white", { "gui": "#ABB2BF", "cterm": "145", "cterm16": "15" }), + \ "black": get(s:overrides, "black", { "gui": "#282C34", "cterm": "235", "cterm16": "0" }), + \ "foreground": get(s:overrides, "foreground", { "gui": "#ABB2BF", "cterm": "145", "cterm16": "NONE" }), + \ "background": get(s:overrides, "background", { "gui": "#282C34", "cterm": "235", "cterm16": "NONE" }), + \ "comment_grey": get(s:overrides, "comment_grey", { "gui": "#5C6370", "cterm": "59", "cterm16": "7" }), + \ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "#4B5263", "cterm": "238", "cterm16": "8" }), + \ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "#2C323C", "cterm": "236", "cterm16": "0" }), + \ "visual_grey": get(s:overrides, "visual_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "8" }), + \ "menu_grey": get(s:overrides, "menu_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "7" }), + \ "special_grey": get(s:overrides, "special_grey", { "gui": "#3B4048", "cterm": "238", "cterm16": "7" }), + \ "vertsplit": get(s:overrides, "vertsplit", { "gui": "#3E4452", "cterm": "59", "cterm16": "7" }), + \} + +function! onedark#GetColors() + return s:colors +endfunction diff --git a/.vim/colors/onedark/build/build.js b/.vim/colors/onedark/build/build.js new file mode 100755 index 0000000..e251ccf --- /dev/null +++ b/.vim/colors/onedark/build/build.js @@ -0,0 +1,185 @@ +#!/usr/bin/env node + +const _ = require('lodash'); // ships with termcolors; only used because of termcolors customization +const termcolors = require('termcolors'); +const { readFileSync, writeFileSync } = require('fs'); +const { resolve } = require('path'); + +const baseColors = Object.freeze({ + red: { gui: '#E06C75', cterm: '204', cterm16: '1' }, // alternate cterm: 168 + dark_red: { gui: '#BE5046', cterm: '196', cterm16: '9' }, + green: { gui: '#98C379', cterm: '114', cterm16: '2' }, + yellow: { gui: '#E5C07B', cterm: '180', cterm16: '3' }, + dark_yellow: { gui: '#D19A66', cterm: '173', cterm16: '11' }, + blue: { gui: '#61AFEF', cterm: '39', cterm16: '4' }, // alternate cterm: 75 + purple: { gui: '#C678DD', cterm: '170', cterm16: '5' }, // alternate cterm: 176 + cyan: { gui: '#56B6C2', cterm: '38', cterm16: '6' }, // alternate cterm: 73 + white: { gui: '#ABB2BF', cterm: '145', cterm16: '15' }, + black: { gui: '#282C34', cterm: '235', cterm16: '0' } +}); + +const specialColors = Object.freeze({ + comment_grey: { gui: '#5C6370', cterm: '59', cterm16: '7' }, + gutter_fg_grey: { gui: '#4B5263', cterm: '238', cterm16: '8' }, + cursor_grey: { gui: '#2C323C', cterm: '236', cterm16: '0' }, + visual_grey: { gui: '#3E4452', cterm: '237', cterm16: '8' }, + menu_grey: { cterm16: '7' }, // vim theme handles gui/cterm values + special_grey: { gui: '#3B4048', cterm: '238', cterm16: '7' }, + vertsplit: { gui: '#3E4452', cterm: '59', cterm16: '7' } +}); + +const colors = Object.assign({}, baseColors, specialColors); + +const templateMap = Object.freeze({ + 'templates/autoload.template.vim': '../autoload/onedark.vim', + 'templates/One Dark.Xresources': '../term/One Dark.Xresources' +}); + +const shouldCheck = String(process.argv[2]).toLowerCase() === 'check'; + +const handleError = (message, cause) => { + console.error('Error:', message); + if (cause) console.error('Cause:', cause); + process.exit(-1); +}; + +console.log( + shouldCheck + ? 'Checking for inconsistencies between templates and existing output files...' + : 'Generating output files from templates...' +); + +Object.keys(templateMap).forEach(templateFilename => { + // Read the template + const templatePath = resolve(__dirname, templateFilename); + let templateText; + try { + templateText = readFileSync(templatePath, 'utf8'); + } catch (e) { + handleError(`Error reading template ${templatePath}`, e); + } + + // Compile the template + let template; + try { + template = _.template(templateText); + } catch (e) { + handleError(`Error compiling template ${templatePath}`, e); + } + + // Execute the template (generate the output) + let output; + try { + output = template(colors); + } catch (e) { + handleError(`Error running template ${templatePath}`, e); + } + + let outputPath = resolve(__dirname, templateMap[templateFilename]); + try { + const existingOutput = readFileSync(outputPath, 'utf8'); + // Only need to do something if the generated output differs from what's already on disk + if (output !== existingOutput) { + if (shouldCheck) { + // Check generated output against existing output file + handleError( + `Changes were made to ${templateMap[templateFilename]} that are inconsistent with its template (${templateFilename}).\nDo you need to [re]build?` + ); + } else { + // Overwrite existing output file + try { + writeFileSync(outputPath, output, 'utf8'); + } catch (e) { + handleError(`Error writing to output file ${outputPath}`, e); + } + } + } + } catch (e) { + handleError(`Error reading existing output file ${outputPath}`, e); + } +}); + +try { + // Use the Xresources theme as a color source since it was generated above via templating + const xresources = readFileSync(resolve(__dirname, '../term/One Dark.Xresources'), 'utf8'); + const terminalPalette = termcolors.xresources.import(xresources); + + let alacrittyTemplate, itermTemplate, kittyTemplate, konsoleTemplate, terminalAppTemplate; + + // Compile custom terminal color templates based on ones that ship with termcolors + try { + alacrittyTemplate = termcolors.export( + readFileSync(resolve(__dirname, 'templates/One Dark.alacritty')), + _.partialRight(_.mapValues, function (color) { + return color.toHex().slice(1); + }) + ); + + itermTemplate = termcolors.export( + // From termcolors/lib/formats/iterm.js + readFileSync(resolve(__dirname, 'templates/One Dark.itermcolors')), + _.partialRight(_.mapValues, function (color) { + return color.toAvgRgbArray(); + }) + ); + + kittyTemplate = termcolors.export( + readFileSync(resolve(__dirname, 'templates/One Dark.kitty')), + _.partialRight(_.mapValues, function (color) { + return color.toHex().slice(1); + }) + ); + + konsoleTemplate = termcolors.export( + // From termcolors/lib/formats/konsole.js + readFileSync(resolve(__dirname, 'templates/One Dark.colorscheme')), + _.partialRight(_.mapValues, function (color) { + return color.toRgbArray().join(); + }) + ); + + // From termcolors/lib/formats/terminal-app.js + const code = [ + Buffer.from( + '62706c6973743030d40102030405061516582476657273696f6e58246f626a65637473592461726368697665725424746f7012000186a0a307080f55246e756c6cd3090a0b0c0d0e554e535247425c4e53436f6c6f7253706163655624636c6173734f1027', + 'hex' + ), + Buffer.from( + '0010018002d2101112135a24636c6173736e616d655824636c6173736573574e53436f6c6f72a21214584e534f626a6563745f100f4e534b657965644172636869766572d1171854726f6f74800108111a232d32373b41484e5b628c8e9095a0a9b1b4bdcfd2d700000000000001010000000000000019000000000000000000000000000000d9', + 'hex' + ) + ]; + + terminalAppTemplate = termcolors.export( + readFileSync(resolve(__dirname, 'templates/One Dark.terminal')), + // From termcolors/lib/formats/terminal-app.js + _.partialRight(_.mapValues, function (color) { + var srgb = color.toAvgRgbArray(); + srgb = srgb + .map(function (n) { + return n.toFixed(10).toString(); + }) + .join(' '); + var output = code[0].toString('binary') + srgb + code[1].toString('binary'); + output = Buffer.from(output, 'binary').toString('base64'); + return output.match(/.{1,68}/g).join('\n\t'); + }) + ); + } catch (e) { + handleError('Error compiling terminal color template', e); + } + + try { + writeFileSync(resolve(__dirname, '../term/One Dark.alacritty'), alacrittyTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.itermcolors'), itermTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.kitty'), kittyTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.colorscheme'), konsoleTemplate(terminalPalette)); + writeFileSync(resolve(__dirname, '../term/One Dark.terminal'), terminalAppTemplate(terminalPalette)); + } catch (e) { + handleError('Error writing terminal color file', e); + } +} catch (e) { + handleError('Error reading Xresources terminal color file', e); +} + +console.log('Success!'); diff --git a/.vim/colors/onedark/build/templates/One Dark.Xresources b/.vim/colors/onedark/build/templates/One Dark.Xresources new file mode 100755 index 0000000..632d663 --- /dev/null +++ b/.vim/colors/onedark/build/templates/One Dark.Xresources @@ -0,0 +1,37 @@ +! special +*.foreground: <%=white.gui%> +*.background: <%=black.gui%> +*.cursorColor: <%=white.gui%> + +! black +*.color0: <%=cursor_grey.gui%> +*.color8: <%=visual_grey.gui%> + +! red +*.color1: <%=red.gui%> +*.color9: <%=red.gui%> + +! green +*.color2: <%=green.gui%> +*.color10: <%=green.gui%> + +! yellow +*.color3: <%=yellow.gui%> +*.color11: <%=yellow.gui%> + +! blue +*.color4: <%=blue.gui%> +*.color12: <%=blue.gui%> + +! magenta +*.color5: <%=purple.gui%> +*.color13: <%=purple.gui%> + +! cyan +*.color6: <%=cyan.gui%> +*.color14: <%=cyan.gui%> + +! white +*.color7: <%=comment_grey.gui%> +*.color15: <%=white.gui%> + diff --git a/.vim/colors/onedark/build/templates/One Dark.alacritty b/.vim/colors/onedark/build/templates/One Dark.alacritty new file mode 100755 index 0000000..bc64afd --- /dev/null +++ b/.vim/colors/onedark/build/templates/One Dark.alacritty @@ -0,0 +1,38 @@ +# Colors (One Dark) +colors: + # Default colors + primary: + foreground: '0x{{=c.foreground}}' + background: '0x{{=c.background}}' + + # Cursor colors + cursor: + text: '0x{{=c[0]}}' + cursor: '0x{{=c[7]}}' + + # Selection colors + selection: + text: CellForeground + background: '0x{{=c[8]}}' + + # Normal colors + normal: + black: '0x{{=c[0]}}' + red: '0x{{=c[1]}}' + green: '0x{{=c[2]}}' + yellow: '0x{{=c[3]}}' + blue: '0x{{=c[4]}}' + magenta: '0x{{=c[5]}}' + cyan: '0x{{=c[6]}}' + white: '0x{{=c[7]}}' + + # Bright colors + bright: + black: '0x{{=c[8]}}' + red: '0x{{=c[9]}}' + green: '0x{{=c[10]}}' + yellow: '0x{{=c[11]}}' + blue: '0x{{=c[12]}}' + magenta: '0x{{=c[13]}}' + cyan: '0x{{=c[14]}}' + white: '0x{{=c[15]}}' diff --git a/.vim/colors/onedark/build/templates/One Dark.colorscheme b/.vim/colors/onedark/build/templates/One Dark.colorscheme new file mode 100755 index 0000000..26cbe0b --- /dev/null +++ b/.vim/colors/onedark/build/templates/One Dark.colorscheme @@ -0,0 +1,96 @@ +[Background] +Color={{=c.background}} + +[BackgroundFaint] +Color={{=c.background}} + +[BackgroundIntense] +Color={{=c.background}} + +[Color0] +Color={{=c[0]}} + +[Color0Faint] +Color={{=c[0]}} + +[Color0Intense] +Color={{=c[8]}} + +[Color1] +Color={{=c[1]}} + +[Color1Faint] +Color={{=c[1]}} + +[Color1Intense] +Color={{=c[9]}} + +[Color2] +Color={{=c[2]}} + +[Color2Faint] +Color={{=c[2]}} + +[Color2Intense] +Color={{=c[10]}} + +[Color3] +Color={{=c[3]}} + +[Color3Faint] +Color={{=c[3]}} + +[Color3Intense] +Color={{=c[11]}} + +[Color4] +Color={{=c[4]}} + +[Color4Faint] +Color={{=c[4]}} + +[Color4Intense] +Color={{=c[12]}} + +[Color5] +Color={{=c[5]}} + +[Color5Faint] +Color={{=c[5]}} + +[Color5Intense] +Color={{=c[13]}} + +[Color6] +Color={{=c[6]}} + +[Color6Faint] +Color={{=c[6]}} + +[Color6Intense] +Color={{=c[14]}} + +[Color7] +Color={{=c[7]}} + +[Color7Faint] +Color={{=c[7]}} + +[Color7Intense] +Color={{=c[15]}} + +[Foreground] +Color={{=c.foreground}} + +[ForegroundFaint] +Color={{=c.foreground}} + +[ForegroundIntense] +Color={{=c.foreground}} + +[General] +Blur=false +ColorRandomization=false +Description=One Dark +Opacity=1 +Wallpaper= diff --git a/.vim/colors/onedark/build/templates/One Dark.itermcolors b/.vim/colors/onedark/build/templates/One Dark.itermcolors new file mode 100755 index 0000000..faa4104 --- /dev/null +++ b/.vim/colors/onedark/build/templates/One Dark.itermcolors @@ -0,0 +1,259 @@ + + + + + Ansi 0 Color + + Color Space + sRGB + Blue Component + {{=c[0][2]}} + Green Component + {{=c[0][1]}} + Red Component + {{=c[0][0]}} + + Ansi 1 Color + + Color Space + sRGB + Blue Component + {{=c[1][2]}} + Green Component + {{=c[1][1]}} + Red Component + {{=c[1][0]}} + + Ansi 10 Color + + Color Space + sRGB + Blue Component + {{=c[10][2]}} + Green Component + {{=c[10][1]}} + Red Component + {{=c[10][0]}} + + Ansi 11 Color + + Color Space + sRGB + Blue Component + {{=c[11][2]}} + Green Component + {{=c[11][1]}} + Red Component + {{=c[11][0]}} + + Ansi 12 Color + + Color Space + sRGB + Blue Component + {{=c[12][2]}} + Green Component + {{=c[12][1]}} + Red Component + {{=c[12][0]}} + + Ansi 13 Color + + Color Space + sRGB + Blue Component + {{=c[13][2]}} + Green Component + {{=c[13][1]}} + Red Component + {{=c[13][0]}} + + Ansi 14 Color + + Color Space + sRGB + Blue Component + {{=c[14][2]}} + Green Component + {{=c[14][1]}} + Red Component + {{=c[14][0]}} + + Ansi 15 Color + + Color Space + sRGB + Blue Component + {{=c[15][2]}} + Green Component + {{=c[15][1]}} + Red Component + {{=c[15][0]}} + + Ansi 2 Color + + Color Space + sRGB + Blue Component + {{=c[2][2]}} + Green Component + {{=c[2][1]}} + Red Component + {{=c[2][0]}} + + Ansi 3 Color + + Color Space + sRGB + Blue Component + {{=c[3][2]}} + Green Component + {{=c[3][1]}} + Red Component + {{=c[3][0]}} + + Ansi 4 Color + + Color Space + sRGB + Blue Component + {{=c[4][2]}} + Green Component + {{=c[4][1]}} + Red Component + {{=c[4][0]}} + + Ansi 5 Color + + Color Space + sRGB + Blue Component + {{=c[5][2]}} + Green Component + {{=c[5][1]}} + Red Component + {{=c[5][0]}} + + Ansi 6 Color + + Color Space + sRGB + Blue Component + {{=c[6][2]}} + Green Component + {{=c[6][1]}} + Red Component + {{=c[6][0]}} + + Ansi 7 Color + + Color Space + sRGB + Blue Component + {{=c[7][2]}} + Green Component + {{=c[7][1]}} + Red Component + {{=c[7][0]}} + + Ansi 8 Color + + Color Space + sRGB + Blue Component + {{=c[8][2]}} + Green Component + {{=c[8][1]}} + Red Component + {{=c[8][0]}} + + Ansi 9 Color + + Color Space + sRGB + Blue Component + {{=c[9][2]}} + Green Component + {{=c[9][1]}} + Red Component + {{=c[9][0]}} + + Background Color + + Color Space + sRGB + Blue Component + {{=c.background[2]}} + Green Component + {{=c.background[1]}} + Red Component + {{=c.background[0]}} + + Bold Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + Cursor Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + Cursor Text Color + + Color Space + sRGB + Blue Component + {{=c.background[2]}} + Green Component + {{=c.background[1]}} + Red Component + {{=c.background[0]}} + + Foreground Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + Selected Text Color + + Color Space + sRGB + Blue Component + {{=c.background[2]}} + Green Component + {{=c.background[1]}} + Red Component + {{=c.background[0]}} + + Selection Color + + Color Space + sRGB + Blue Component + {{=c.foreground[2]}} + Green Component + {{=c.foreground[1]}} + Red Component + {{=c.foreground[0]}} + + + diff --git a/.vim/colors/onedark/build/templates/One Dark.kitty b/.vim/colors/onedark/build/templates/One Dark.kitty new file mode 100755 index 0000000..ceb8ef1 --- /dev/null +++ b/.vim/colors/onedark/build/templates/One Dark.kitty @@ -0,0 +1,41 @@ +# Cursor +cursor #{{=c[7]}} +cursor_text_color #{{=c[0]}} + +# Special +foreground #{{=c.foreground}} +background #{{=c.background}} +selection_foreground #{{=c[0]}} +selection_background #{{=c[7]}} + +# Black +color0 #{{=c[0]}} +color8 #{{=c[8]}} + +# Red +color1 #{{=c[1]}} +color9 #{{=c[9]}} + +# Green +color2 #{{=c[2]}} +color10 #{{=c[10]}} + +# Yellow +color3 #{{=c[3]}} +color11 #{{=c[11]}} + +# Blue +color4 #{{=c[4]}} +color12 #{{=c[12]}} + +# Magenta +color5 #{{=c[5]}} +color13 #{{=c[13]}} + +# Cyan +color6 #{{=c[6]}} +color14 #{{=c[14]}} + +# White +color7 #{{=c[7]}} +color15 #{{=c[15]}} diff --git a/.vim/colors/onedark/build/templates/One Dark.terminal b/.vim/colors/onedark/build/templates/One Dark.terminal new file mode 100755 index 0000000..984831c --- /dev/null +++ b/.vim/colors/onedark/build/templates/One Dark.terminal @@ -0,0 +1,94 @@ + + + + + ANSIBlackColor + + {{=c[0]}} + + ANSIBlueColor + + {{=c[4]}} + + ANSIBrightBlackColor + + {{=c[8]}} + + ANSIBrightBlueColor + + {{=c[12]}} + + ANSIBrightCyanColor + + {{=c[14]}} + + ANSIBrightGreenColor + + {{=c[10]}} + + ANSIBrightMagentaColor + + {{=c[13]}} + + ANSIBrightRedColor + + {{=c[9]}} + + ANSIBrightWhiteColor + + {{=c[15]}} + + ANSIBrightYellowColor + + {{=c[11]}} + + ANSICyanColor + + {{=c[6]}} + + ANSIGreenColor + + {{=c[2]}} + + ANSIMagentaColor + + {{=c[5]}} + + ANSIRedColor + + {{=c[1]}} + + ANSIWhiteColor + + {{=c[7]}} + + ANSIYellowColor + + {{=c[3]}} + + BackgroundColor + + {{=c.background}} + + CursorColor + + {{=c.foreground}} + + SelectionColor + + {{=c[15]}} + + TextBoldColor + + {{=c.foreground}} + + TextColor + + {{=c.foreground}} + + name + One Dark + type + Window Settings + + diff --git a/.vim/colors/onedark/build/templates/autoload.template.vim b/.vim/colors/onedark/build/templates/autoload.template.vim new file mode 100755 index 0000000..204ecc6 --- /dev/null +++ b/.vim/colors/onedark/build/templates/autoload.template.vim @@ -0,0 +1,29 @@ +" [onedark.vim](https://github.com/joshdick/onedark.vim/) + +let s:overrides = get(g:, "onedark_color_overrides", {}) + +let s:colors = { + \ "red": get(s:overrides, "red", { "gui": "<%=red.gui%>", "cterm": "<%=red.cterm%>", "cterm16": "<%=red.cterm16%>" }), + \ "dark_red": get(s:overrides, "dark_red", { "gui": "<%=dark_red.gui%>", "cterm": "<%=dark_red.cterm%>", "cterm16": "<%=dark_red.cterm16%>" }), + \ "green": get(s:overrides, "green", { "gui": "<%=green.gui%>", "cterm": "<%=green.cterm%>", "cterm16": "<%=green.cterm16%>" }), + \ "yellow": get(s:overrides, "yellow", { "gui": "<%=yellow.gui%>", "cterm": "<%=yellow.cterm%>", "cterm16": "<%=yellow.cterm16%>" }), + \ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "<%=dark_yellow.gui%>", "cterm": "<%=dark_yellow.cterm%>", "cterm16": "<%=dark_yellow.cterm16%>" }), + \ "blue": get(s:overrides, "blue", { "gui": "<%=blue.gui%>", "cterm": "<%=blue.cterm%>", "cterm16": "<%=blue.cterm16%>" }), + \ "purple": get(s:overrides, "purple", { "gui": "<%=purple.gui%>", "cterm": "<%=purple.cterm%>", "cterm16": "<%=purple.cterm16%>" }), + \ "cyan": get(s:overrides, "cyan", { "gui": "<%=cyan.gui%>", "cterm": "<%=cyan.cterm%>", "cterm16": "<%=cyan.cterm16%>" }), + \ "white": get(s:overrides, "white", { "gui": "<%=white.gui%>", "cterm": "<%=white.cterm%>", "cterm16": "<%=white.cterm16%>" }), + \ "black": get(s:overrides, "black", { "gui": "<%=black.gui%>", "cterm": "<%=black.cterm%>", "cterm16": "<%=black.cterm16%>" }), + \ "foreground": get(s:overrides, "foreground", { "gui": "<%=white.gui%>", "cterm": "<%=white.cterm%>", "cterm16": "NONE" }), + \ "background": get(s:overrides, "background", { "gui": "<%=black.gui%>", "cterm": "<%=black.cterm%>", "cterm16": "NONE" }), + \ "comment_grey": get(s:overrides, "comment_grey", { "gui": "<%=comment_grey.gui%>", "cterm": "<%=comment_grey.cterm%>", "cterm16": "<%=comment_grey.cterm16%>" }), + \ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "<%=gutter_fg_grey.gui%>", "cterm": "<%=gutter_fg_grey.cterm%>", "cterm16": "<%=gutter_fg_grey.cterm16%>" }), + \ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "<%=cursor_grey.gui%>", "cterm": "<%=cursor_grey.cterm%>", "cterm16": "<%=cursor_grey.cterm16%>" }), + \ "visual_grey": get(s:overrides, "visual_grey", { "gui": "<%=visual_grey.gui%>", "cterm": "<%=visual_grey.cterm%>", "cterm16": "<%=visual_grey.cterm16%>" }), + \ "menu_grey": get(s:overrides, "menu_grey", { "gui": "<%=visual_grey.gui%>", "cterm": "<%=visual_grey.cterm%>", "cterm16": "<%=menu_grey.cterm16%>" }), + \ "special_grey": get(s:overrides, "special_grey", { "gui": "<%=special_grey.gui%>", "cterm": "<%=special_grey.cterm%>", "cterm16": "<%=special_grey.cterm16%>" }), + \ "vertsplit": get(s:overrides, "vertsplit", { "gui": "<%=vertsplit.gui%>", "cterm": "<%=vertsplit.cterm%>", "cterm16": "<%=vertsplit.cterm16%>" }), + \} + +function! onedark#GetColors() + return s:colors +endfunction diff --git a/.vim/colors/onedark/colors/onedark.vim b/.vim/colors/onedark/colors/onedark.vim new file mode 100755 index 0000000..2c552b8 --- /dev/null +++ b/.vim/colors/onedark/colors/onedark.vim @@ -0,0 +1,679 @@ +" vim:fdm=marker +" Vim Color File +" Name: onedark.vim +" Maintainer: https://github.com/joshdick/onedark.vim/ +" License: The MIT License (MIT) +" Based On: https://github.com/MaxSt/FlatColor/ + +" Companion statusline plugin and terminal themes are included with onedark.vim: +" * https://github.com/joshdick/onedark.vim#lightlinevim-colorscheme +" * https://github.com/joshdick/onedark.vim#vim-airline-theme +" * https://github.com/joshdick/onedark.vim/tree/main/term + +" Color Reference {{{ + +" The following colors were measured inside Atom using its built-in inspector. + +" +---------------------------------------------+ +" | Color Name | RGB | Hex | +" |--------------+--------------------+---------| +" | Black | rgb(40, 44, 52) | #282c34 | +" |--------------+--------------------+---------| +" | White | rgb(171, 178, 191) | #abb2bf | +" |--------------+--------------------+---------| +" | Light Red | rgb(224, 108, 117) | #e06c75 | +" |--------------+--------------------+---------| +" | Dark Red | rgb(190, 80, 70) | #be5046 | +" |--------------+--------------------+---------| +" | Green | rgb(152, 195, 121) | #98c379 | +" |--------------+--------------------+---------| +" | Light Yellow | rgb(229, 192, 123) | #e5c07b | +" |--------------+--------------------+---------| +" | Dark Yellow | rgb(209, 154, 102) | #d19a66 | +" |--------------+--------------------+---------| +" | Blue | rgb(97, 175, 239) | #61afef | +" |--------------+--------------------+---------| +" | Magenta | rgb(198, 120, 221) | #c678dd | +" |--------------+--------------------+---------| +" | Cyan | rgb(86, 182, 194) | #56b6c2 | +" |--------------+--------------------+---------| +" | Gutter Grey | rgb(76, 82, 99) | #4b5263 | +" |--------------+--------------------+---------| +" | Comment Grey | rgb(92, 99, 112) | #5c6370 | +" +---------------------------------------------+ + +" }}} + +" Initialization {{{ + +highlight clear + +if exists("syntax_on") + syntax reset +endif + +set t_Co=256 + +let g:colors_name="onedark" + +" Set to "256" for 256-color terminals, or +" set to "16" to use your terminal emulator's native colors +" (a 16-color palette for this color scheme is available; see +" < https://github.com/joshdick/onedark.vim/blob/main/README.md > +" for more information.) +if !exists("g:onedark_termcolors") + let g:onedark_termcolors = 256 +endif + +" Not all terminals support italics properly. If yours does, opt-in. +if !exists("g:onedark_terminal_italics") + let g:onedark_terminal_italics = 0 +endif + +" This function is based on one from FlatColor: https://github.com/MaxSt/FlatColor/ +" Which in turn was based on one found in hemisu: https://github.com/noahfrederick/vim-hemisu/ +let s:group_colors = {} " Cache of default highlight group settings, for later reference via `onedark#extend_highlight` +function! s:h(group, style, ...) + if (a:0 > 0) " Will be true if we got here from onedark#extend_highlight + let s:highlight = s:group_colors[a:group] + for style_type in ["fg", "bg", "sp"] + if (has_key(a:style, style_type)) + let l:default_style = (has_key(s:highlight, style_type) ? copy(s:highlight[style_type]) : { "cterm16": "NONE", "cterm": "NONE", "gui": "NONE" }) + let s:highlight[style_type] = extend(l:default_style, a:style[style_type]) + endif + endfor + if (has_key(a:style, "gui")) + let s:highlight.gui = a:style.gui + endif + else + let s:highlight = a:style + let s:group_colors[a:group] = s:highlight " Cache default highlight group settings + endif + + if g:onedark_terminal_italics == 0 + if has_key(s:highlight, "cterm") && s:highlight["cterm"] == "italic" + unlet s:highlight.cterm + endif + if has_key(s:highlight, "gui") && s:highlight["gui"] == "italic" + unlet s:highlight.gui + endif + endif + + if g:onedark_termcolors == 16 + let l:ctermfg = (has_key(s:highlight, "fg") ? s:highlight.fg.cterm16 : "NONE") + let l:ctermbg = (has_key(s:highlight, "bg") ? s:highlight.bg.cterm16 : "NONE") + else + let l:ctermfg = (has_key(s:highlight, "fg") ? s:highlight.fg.cterm : "NONE") + let l:ctermbg = (has_key(s:highlight, "bg") ? s:highlight.bg.cterm : "NONE") + endif + + execute "highlight" a:group + \ "guifg=" (has_key(s:highlight, "fg") ? s:highlight.fg.gui : "NONE") + \ "guibg=" (has_key(s:highlight, "bg") ? s:highlight.bg.gui : "NONE") + \ "guisp=" (has_key(s:highlight, "sp") ? s:highlight.sp.gui : "NONE") + \ "gui=" (has_key(s:highlight, "gui") ? s:highlight.gui : "NONE") + \ "ctermfg=" . l:ctermfg + \ "ctermbg=" . l:ctermbg + \ "cterm=" (has_key(s:highlight, "cterm") ? s:highlight.cterm : "NONE") +endfunction + +" public {{{ + +function! onedark#set_highlight(group, style) + call s:h(a:group, a:style) +endfunction + +function! onedark#extend_highlight(group, style) + call s:h(a:group, a:style, 1) +endfunction + +" }}} + +" }}} + +" Color Variables {{{ + +let s:colors = onedark#GetColors() + +let s:red = s:colors.red +let s:dark_red = s:colors.dark_red +let s:green = s:colors.green +let s:yellow = s:colors.yellow +let s:dark_yellow = s:colors.dark_yellow +let s:blue = s:colors.blue +let s:purple = s:colors.purple +let s:cyan = s:colors.cyan +let s:white = s:colors.white +let s:black = s:colors.black +let s:foreground = s:colors.foreground +let s:background = s:colors.background +let s:comment_grey = s:colors.comment_grey +let s:gutter_fg_grey = s:colors.gutter_fg_grey +let s:cursor_grey = s:colors.cursor_grey +let s:visual_grey = s:colors.visual_grey +let s:menu_grey = s:colors.menu_grey +let s:special_grey = s:colors.special_grey +let s:vertsplit = s:colors.vertsplit + +" }}} + +" Terminal Colors {{{ + +let g:terminal_ansi_colors = [ + \ s:black.gui, s:red.gui, s:green.gui, s:yellow.gui, + \ s:blue.gui, s:purple.gui, s:cyan.gui, s:comment_grey.gui, + \ s:visual_grey.gui, s:red.gui, s:green.gui, s:yellow.gui, + \ s:blue.gui, s:purple.gui, s:cyan.gui, s:white.gui +\] + +" }}} + +" Syntax Groups (descriptions and ordering from `:h w18`) {{{ + +call s:h("Comment", { "fg": s:comment_grey, "gui": "italic", "cterm": "italic" }) " any comment +call s:h("Constant", { "fg": s:cyan }) " any constant +call s:h("String", { "fg": s:green }) " a string constant: "this is a string" +call s:h("Character", { "fg": s:green }) " a character constant: 'c', '\n' +call s:h("Number", { "fg": s:dark_yellow }) " a number constant: 234, 0xff +call s:h("Boolean", { "fg": s:dark_yellow }) " a boolean constant: TRUE, false +call s:h("Float", { "fg": s:dark_yellow }) " a floating point constant: 2.3e10 +call s:h("Identifier", { "fg": s:red }) " any variable name +call s:h("Function", { "fg": s:blue }) " function name (also: methods for classes) +call s:h("Statement", { "fg": s:purple }) " any statement +call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc. +call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc. +call s:h("Label", { "fg": s:purple }) " case, default, etc. +call s:h("Operator", { "fg": s:purple }) " sizeof", "+", "*", etc. +call s:h("Keyword", { "fg": s:red }) " any other keyword +call s:h("Exception", { "fg": s:purple }) " try, catch, throw +call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor +call s:h("Include", { "fg": s:blue }) " preprocessor #include +call s:h("Define", { "fg": s:purple }) " preprocessor #define +call s:h("Macro", { "fg": s:purple }) " same as Define +call s:h("PreCondit", { "fg": s:yellow }) " preprocessor #if, #else, #endif, etc. +call s:h("Type", { "fg": s:yellow }) " int, long, char, etc. +call s:h("StorageClass", { "fg": s:yellow }) " static, register, volatile, etc. +call s:h("Structure", { "fg": s:yellow }) " struct, union, enum, etc. +call s:h("Typedef", { "fg": s:yellow }) " A typedef +call s:h("Special", { "fg": s:blue }) " any special symbol +call s:h("SpecialChar", { "fg": s:dark_yellow }) " special character in a constant +call s:h("Tag", {}) " you can use CTRL-] on this +call s:h("Delimiter", {}) " character that needs attention +call s:h("SpecialComment", { "fg": s:comment_grey }) " special things inside a comment +call s:h("Debug", {}) " debugging statements +call s:h("Underlined", { "gui": "underline", "cterm": "underline" }) " text that stands out, HTML links +call s:h("Ignore", {}) " left blank, hidden +call s:h("Error", { "fg": s:red }) " any erroneous construct +call s:h("Todo", { "fg": s:purple }) " anything that needs extra attention; mostly the keywords TODO FIXME and XXX + +" }}} + +" Highlighting Groups (descriptions and ordering from `:h highlight-groups`) {{{ +call s:h("ColorColumn", { "bg": s:cursor_grey }) " used for the columns set with 'colorcolumn' +call s:h("Conceal", {}) " placeholder characters substituted for concealed text (see 'conceallevel') +call s:h("Cursor", { "fg": s:black, "bg": s:blue }) " the character under the cursor +call s:h("CursorIM", {}) " like Cursor, but used when in IME mode +call s:h("CursorColumn", { "bg": s:cursor_grey }) " the screen column that the cursor is in when 'cursorcolumn' is set +if &diff + " Don't change the background color in diff mode + call s:h("CursorLine", { "gui": "underline" }) " the screen line that the cursor is in when 'cursorline' is set +else + call s:h("CursorLine", { "bg": s:cursor_grey }) " the screen line that the cursor is in when 'cursorline' is set +endif +call s:h("Directory", { "fg": s:blue }) " directory names (and other special names in listings) +call s:h("DiffAdd", { "bg": s:green, "fg": s:black }) " diff mode: Added line +call s:h("DiffChange", { "fg": s:yellow, "gui": "underline", "cterm": "underline" }) " diff mode: Changed line +call s:h("DiffDelete", { "bg": s:red, "fg": s:black }) " diff mode: Deleted line +call s:h("DiffText", { "bg": s:yellow, "fg": s:black }) " diff mode: Changed text within a changed line +if get(g:, 'onedark_hide_endofbuffer', 0) + " If enabled, will style end-of-buffer filler lines (~) to appear to be hidden. + call s:h("EndOfBuffer", { "fg": s:black }) " filler lines (~) after the last line in the buffer +endif +call s:h("ErrorMsg", { "fg": s:red }) " error messages on the command line +call s:h("VertSplit", { "fg": s:vertsplit }) " the column separating vertically split windows +call s:h("Folded", { "fg": s:comment_grey }) " line used for closed folds +call s:h("FoldColumn", {}) " 'foldcolumn' +call s:h("SignColumn", {}) " column where signs are displayed +call s:h("IncSearch", { "fg": s:yellow, "bg": s:comment_grey }) " 'incsearch' highlighting; also used for the text replaced with ":s///c" +call s:h("LineNr", { "fg": s:gutter_fg_grey }) " Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. +call s:h("CursorLineNr", {}) " Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. +call s:h("MatchParen", { "fg": s:blue, "gui": "underline", "cterm": "underline" }) " The character under the cursor or just before it, if it is a paired bracket, and its match. +call s:h("ModeMsg", {}) " 'showmode' message (e.g., "-- INSERT --") +call s:h("MoreMsg", {}) " more-prompt +call s:h("NonText", { "fg": s:special_grey }) " '~' and '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line). +call s:h("Normal", { "fg": s:foreground, "bg": s:background }) " normal text +call s:h("Pmenu", { "fg": s:white, "bg": s:menu_grey }) " Popup menu: normal item. +call s:h("PmenuSel", { "fg": s:cursor_grey, "bg": s:blue }) " Popup menu: selected item. +call s:h("PmenuSbar", { "bg": s:cursor_grey }) " Popup menu: scrollbar. +call s:h("PmenuThumb", { "bg": s:white }) " Popup menu: Thumb of the scrollbar. +call s:h("Question", { "fg": s:purple }) " hit-enter prompt and yes/no questions +call s:h("QuickFixLine", { "fg": s:black, "bg": s:yellow }) " Current quickfix item in the quickfix window. +call s:h("Search", { "fg": s:black, "bg": s:yellow }) " Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. +call s:h("SpecialKey", { "fg": s:special_grey }) " Meta and special keys listed with ":map", also for text used to show unprintable characters in the text, 'listchars'. Generally: text that is displayed differently from what it really is. +call s:h("SpellBad", { "fg": s:red, "gui": "underline", "cterm": "underline" }) " Word that is not recognized by the spellchecker. This will be combined with the highlighting used otherwise. +call s:h("SpellCap", { "fg": s:dark_yellow }) " Word that should start with a capital. This will be combined with the highlighting used otherwise. +call s:h("SpellLocal", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is used in another region. This will be combined with the highlighting used otherwise. +call s:h("SpellRare", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is hardly ever used. spell This will be combined with the highlighting used otherwise. +call s:h("StatusLine", { "fg": s:white, "bg": s:cursor_grey }) " status line of current window +call s:h("StatusLineNC", { "fg": s:comment_grey }) " status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. +call s:h("StatusLineTerm", { "fg": s:white, "bg": s:cursor_grey }) " status line of current :terminal window +call s:h("StatusLineTermNC", { "fg": s:comment_grey }) " status line of non-current :terminal window +call s:h("TabLine", { "fg": s:comment_grey }) " tab pages line, not active tab page label +call s:h("TabLineFill", {}) " tab pages line, where there are no labels +call s:h("TabLineSel", { "fg": s:white }) " tab pages line, active tab page label +call s:h("Terminal", { "fg": s:white, "bg": s:black }) " terminal window (see terminal-size-color) +call s:h("Title", { "fg": s:green }) " titles for output from ":set all", ":autocmd" etc. +call s:h("Visual", { "bg": s:visual_grey }) " Visual mode selection +call s:h("VisualNOS", { "bg": s:visual_grey }) " Visual mode selection when vim is "Not Owning the Selection". Only X11 Gui's gui-x11 and xterm-clipboard supports this. +call s:h("WarningMsg", { "fg": s:yellow }) " warning messages +call s:h("WildMenu", { "fg": s:black, "bg": s:blue }) " current match in 'wildmenu' completion + +" }}} + +" Termdebug highlighting for Vim 8.1+ {{{ + +" See `:h hl-debugPC` and `:h hl-debugBreakpoint`. +call s:h("debugPC", { "bg": s:special_grey }) " the current position +call s:h("debugBreakpoint", { "fg": s:black, "bg": s:red }) " a breakpoint + +" }}} + +" Language-Specific Highlighting {{{ + +" CSS +call s:h("cssAttrComma", { "fg": s:purple }) +call s:h("cssAttributeSelector", { "fg": s:green }) +call s:h("cssBraces", { "fg": s:white }) +call s:h("cssClassName", { "fg": s:dark_yellow }) +call s:h("cssClassNameDot", { "fg": s:dark_yellow }) +call s:h("cssDefinition", { "fg": s:purple }) +call s:h("cssFontAttr", { "fg": s:dark_yellow }) +call s:h("cssFontDescriptor", { "fg": s:purple }) +call s:h("cssFunctionName", { "fg": s:blue }) +call s:h("cssIdentifier", { "fg": s:blue }) +call s:h("cssImportant", { "fg": s:purple }) +call s:h("cssInclude", { "fg": s:white }) +call s:h("cssIncludeKeyword", { "fg": s:purple }) +call s:h("cssMediaType", { "fg": s:dark_yellow }) +call s:h("cssProp", { "fg": s:white }) +call s:h("cssPseudoClassId", { "fg": s:dark_yellow }) +call s:h("cssSelectorOp", { "fg": s:purple }) +call s:h("cssSelectorOp2", { "fg": s:purple }) +call s:h("cssTagName", { "fg": s:red }) + +" Fish Shell +call s:h("fishKeyword", { "fg": s:purple }) +call s:h("fishConditional", { "fg": s:purple }) + +" Go +call s:h("goDeclaration", { "fg": s:purple }) +call s:h("goBuiltins", { "fg": s:cyan }) +call s:h("goFunctionCall", { "fg": s:blue }) +call s:h("goVarDefs", { "fg": s:red }) +call s:h("goVarAssign", { "fg": s:red }) +call s:h("goVar", { "fg": s:purple }) +call s:h("goConst", { "fg": s:purple }) +call s:h("goType", { "fg": s:yellow }) +call s:h("goTypeName", { "fg": s:yellow }) +call s:h("goDeclType", { "fg": s:cyan }) +call s:h("goTypeDecl", { "fg": s:purple }) + +" HTML (keep consistent with Markdown, below) +call s:h("htmlArg", { "fg": s:dark_yellow }) +call s:h("htmlBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" }) +call s:h("htmlEndTag", { "fg": s:white }) +call s:h("htmlH1", { "fg": s:red }) +call s:h("htmlH2", { "fg": s:red }) +call s:h("htmlH3", { "fg": s:red }) +call s:h("htmlH4", { "fg": s:red }) +call s:h("htmlH5", { "fg": s:red }) +call s:h("htmlH6", { "fg": s:red }) +call s:h("htmlItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("htmlLink", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) +call s:h("htmlSpecialChar", { "fg": s:dark_yellow }) +call s:h("htmlSpecialTagName", { "fg": s:red }) +call s:h("htmlTag", { "fg": s:white }) +call s:h("htmlTagN", { "fg": s:red }) +call s:h("htmlTagName", { "fg": s:red }) +call s:h("htmlTitle", { "fg": s:white }) + +" JavaScript +call s:h("javaScriptBraces", { "fg": s:white }) +call s:h("javaScriptFunction", { "fg": s:purple }) +call s:h("javaScriptIdentifier", { "fg": s:purple }) +call s:h("javaScriptNull", { "fg": s:dark_yellow }) +call s:h("javaScriptNumber", { "fg": s:dark_yellow }) +call s:h("javaScriptRequire", { "fg": s:cyan }) +call s:h("javaScriptReserved", { "fg": s:purple }) +" https://github.com/pangloss/vim-javascript +call s:h("jsArrowFunction", { "fg": s:purple }) +call s:h("jsClassKeyword", { "fg": s:purple }) +call s:h("jsClassMethodType", { "fg": s:purple }) +call s:h("jsDocParam", { "fg": s:blue }) +call s:h("jsDocTags", { "fg": s:purple }) +call s:h("jsExport", { "fg": s:purple }) +call s:h("jsExportDefault", { "fg": s:purple }) +call s:h("jsExtendsKeyword", { "fg": s:purple }) +call s:h("jsFrom", { "fg": s:purple }) +call s:h("jsFuncCall", { "fg": s:blue }) +call s:h("jsFunction", { "fg": s:purple }) +call s:h("jsGenerator", { "fg": s:yellow }) +call s:h("jsGlobalObjects", { "fg": s:yellow }) +call s:h("jsImport", { "fg": s:purple }) +call s:h("jsModuleAs", { "fg": s:purple }) +call s:h("jsModuleWords", { "fg": s:purple }) +call s:h("jsModules", { "fg": s:purple }) +call s:h("jsNull", { "fg": s:dark_yellow }) +call s:h("jsOperator", { "fg": s:purple }) +call s:h("jsStorageClass", { "fg": s:purple }) +call s:h("jsSuper", { "fg": s:red }) +call s:h("jsTemplateBraces", { "fg": s:dark_red }) +call s:h("jsTemplateVar", { "fg": s:green }) +call s:h("jsThis", { "fg": s:red }) +call s:h("jsUndefined", { "fg": s:dark_yellow }) +" https://github.com/othree/yajs.vim +call s:h("javascriptArrowFunc", { "fg": s:purple }) +call s:h("javascriptClassExtends", { "fg": s:purple }) +call s:h("javascriptClassKeyword", { "fg": s:purple }) +call s:h("javascriptDocNotation", { "fg": s:purple }) +call s:h("javascriptDocParamName", { "fg": s:blue }) +call s:h("javascriptDocTags", { "fg": s:purple }) +call s:h("javascriptEndColons", { "fg": s:white }) +call s:h("javascriptExport", { "fg": s:purple }) +call s:h("javascriptFuncArg", { "fg": s:white }) +call s:h("javascriptFuncKeyword", { "fg": s:purple }) +call s:h("javascriptIdentifier", { "fg": s:red }) +call s:h("javascriptImport", { "fg": s:purple }) +call s:h("javascriptMethodName", { "fg": s:white }) +call s:h("javascriptObjectLabel", { "fg": s:white }) +call s:h("javascriptOpSymbol", { "fg": s:cyan }) +call s:h("javascriptOpSymbols", { "fg": s:cyan }) +call s:h("javascriptPropertyName", { "fg": s:green }) +call s:h("javascriptTemplateSB", { "fg": s:dark_red }) +call s:h("javascriptVariable", { "fg": s:purple }) + +" JSON +call s:h("jsonCommentError", { "fg": s:white }) +call s:h("jsonKeyword", { "fg": s:red }) +call s:h("jsonBoolean", { "fg": s:dark_yellow }) +call s:h("jsonNumber", { "fg": s:dark_yellow }) +call s:h("jsonQuote", { "fg": s:white }) +call s:h("jsonMissingCommaError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNoQuotesError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNumError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonString", { "fg": s:green }) +call s:h("jsonStringSQError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonSemicolonError", { "fg": s:red, "gui": "reverse" }) + +" LESS +call s:h("lessVariable", { "fg": s:purple }) +call s:h("lessAmpersandChar", { "fg": s:white }) +call s:h("lessClass", { "fg": s:dark_yellow }) + +" Markdown (keep consistent with HTML, above) +call s:h("markdownBlockquote", { "fg": s:comment_grey }) +call s:h("markdownBold", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" }) +call s:h("markdownCode", { "fg": s:green }) +call s:h("markdownCodeBlock", { "fg": s:green }) +call s:h("markdownCodeDelimiter", { "fg": s:green }) +call s:h("markdownH1", { "fg": s:red }) +call s:h("markdownH2", { "fg": s:red }) +call s:h("markdownH3", { "fg": s:red }) +call s:h("markdownH4", { "fg": s:red }) +call s:h("markdownH5", { "fg": s:red }) +call s:h("markdownH6", { "fg": s:red }) +call s:h("markdownHeadingDelimiter", { "fg": s:red }) +call s:h("markdownHeadingRule", { "fg": s:comment_grey }) +call s:h("markdownId", { "fg": s:purple }) +call s:h("markdownIdDeclaration", { "fg": s:blue }) +call s:h("markdownIdDelimiter", { "fg": s:purple }) +call s:h("markdownItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("markdownLinkDelimiter", { "fg": s:purple }) +call s:h("markdownLinkText", { "fg": s:blue }) +call s:h("markdownListMarker", { "fg": s:red }) +call s:h("markdownOrderedListMarker", { "fg": s:red }) +call s:h("markdownRule", { "fg": s:comment_grey }) +call s:h("markdownUrl", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) + +" Perl +call s:h("perlFiledescRead", { "fg": s:green }) +call s:h("perlFunction", { "fg": s:purple }) +call s:h("perlMatchStartEnd",{ "fg": s:blue }) +call s:h("perlMethod", { "fg": s:purple }) +call s:h("perlPOD", { "fg": s:comment_grey }) +call s:h("perlSharpBang", { "fg": s:comment_grey }) +call s:h("perlSpecialString",{ "fg": s:dark_yellow }) +call s:h("perlStatementFiledesc", { "fg": s:red }) +call s:h("perlStatementFlow",{ "fg": s:red }) +call s:h("perlStatementInclude", { "fg": s:purple }) +call s:h("perlStatementScalar",{ "fg": s:purple }) +call s:h("perlStatementStorage", { "fg": s:purple }) +call s:h("perlSubName",{ "fg": s:yellow }) +call s:h("perlVarPlain",{ "fg": s:blue }) + +" PHP +call s:h("phpVarSelector", { "fg": s:red }) +call s:h("phpOperator", { "fg": s:white }) +call s:h("phpParent", { "fg": s:white }) +call s:h("phpMemberSelector", { "fg": s:white }) +call s:h("phpType", { "fg": s:purple }) +call s:h("phpKeyword", { "fg": s:purple }) +call s:h("phpClass", { "fg": s:yellow }) +call s:h("phpUseClass", { "fg": s:white }) +call s:h("phpUseAlias", { "fg": s:white }) +call s:h("phpInclude", { "fg": s:purple }) +call s:h("phpClassExtends", { "fg": s:green }) +call s:h("phpDocTags", { "fg": s:white }) +call s:h("phpFunction", { "fg": s:blue }) +call s:h("phpFunctions", { "fg": s:cyan }) +call s:h("phpMethodsVar", { "fg": s:dark_yellow }) +call s:h("phpMagicConstants", { "fg": s:dark_yellow }) +call s:h("phpSuperglobals", { "fg": s:red }) +call s:h("phpConstants", { "fg": s:dark_yellow }) + +" Ruby +call s:h("rubyBlockParameter", { "fg": s:red}) +call s:h("rubyBlockParameterList", { "fg": s:red }) +call s:h("rubyClass", { "fg": s:purple}) +call s:h("rubyConstant", { "fg": s:yellow}) +call s:h("rubyControl", { "fg": s:purple }) +call s:h("rubyEscape", { "fg": s:red}) +call s:h("rubyFunction", { "fg": s:blue}) +call s:h("rubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInclude", { "fg": s:blue}) +call s:h("rubyIncluderubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInstanceVariable", { "fg": s:red}) +call s:h("rubyInterpolation", { "fg": s:cyan }) +call s:h("rubyInterpolationDelimiter", { "fg": s:red }) +call s:h("rubyInterpolationDelimiter", { "fg": s:red}) +call s:h("rubyRegexp", { "fg": s:cyan}) +call s:h("rubyRegexpDelimiter", { "fg": s:cyan}) +call s:h("rubyStringDelimiter", { "fg": s:green}) +call s:h("rubySymbol", { "fg": s:cyan}) + +" Sass +" https://github.com/tpope/vim-haml +call s:h("sassAmpersand", { "fg": s:red }) +call s:h("sassClass", { "fg": s:dark_yellow }) +call s:h("sassControl", { "fg": s:purple }) +call s:h("sassExtend", { "fg": s:purple }) +call s:h("sassFor", { "fg": s:white }) +call s:h("sassFunction", { "fg": s:cyan }) +call s:h("sassId", { "fg": s:blue }) +call s:h("sassInclude", { "fg": s:purple }) +call s:h("sassMedia", { "fg": s:purple }) +call s:h("sassMediaOperators", { "fg": s:white }) +call s:h("sassMixin", { "fg": s:purple }) +call s:h("sassMixinName", { "fg": s:blue }) +call s:h("sassMixing", { "fg": s:purple }) +call s:h("sassVariable", { "fg": s:purple }) +" https://github.com/cakebaker/scss-syntax.vim +call s:h("scssExtend", { "fg": s:purple }) +call s:h("scssImport", { "fg": s:purple }) +call s:h("scssInclude", { "fg": s:purple }) +call s:h("scssMixin", { "fg": s:purple }) +call s:h("scssSelectorName", { "fg": s:dark_yellow }) +call s:h("scssVariable", { "fg": s:purple }) + +" TeX +call s:h("texStatement", { "fg": s:purple }) +call s:h("texSubscripts", { "fg": s:dark_yellow }) +call s:h("texSuperscripts", { "fg": s:dark_yellow }) +call s:h("texTodo", { "fg": s:dark_red }) +call s:h("texBeginEnd", { "fg": s:purple }) +call s:h("texBeginEndName", { "fg": s:blue }) +call s:h("texMathMatcher", { "fg": s:blue }) +call s:h("texMathDelim", { "fg": s:blue }) +call s:h("texDelimiter", { "fg": s:dark_yellow }) +call s:h("texSpecialChar", { "fg": s:dark_yellow }) +call s:h("texCite", { "fg": s:blue }) +call s:h("texRefZone", { "fg": s:blue }) + +" TypeScript +call s:h("typescriptReserved", { "fg": s:purple }) +call s:h("typescriptEndColons", { "fg": s:white }) +call s:h("typescriptBraces", { "fg": s:white }) + +" XML +call s:h("xmlAttrib", { "fg": s:dark_yellow }) +call s:h("xmlEndTag", { "fg": s:red }) +call s:h("xmlTag", { "fg": s:red }) +call s:h("xmlTagName", { "fg": s:red }) + +" }}} + +" Plugin Highlighting {{{ + +" airblade/vim-gitgutter +call s:h("GitGutterAdd", { "fg": s:green }) +call s:h("GitGutterChange", { "fg": s:yellow }) +call s:h("GitGutterDelete", { "fg": s:red }) + +" dense-analysis/ale +call s:h("ALEError", { "fg": s:red, "gui": "underline", "cterm": "underline" }) +call s:h("ALEWarning", { "fg": s:yellow, "gui": "underline", "cterm": "underline"}) +call s:h("ALEInfo", { "gui": "underline", "cterm": "underline"}) + +" easymotion/vim-easymotion +call s:h("EasyMotionTarget", { "fg": s:red, "gui": "bold", "cterm": "bold" }) +call s:h("EasyMotionTarget2First", { "fg": s:yellow, "gui": "bold", "cterm": "bold" }) +call s:h("EasyMotionTarget2Second", { "fg": s:dark_yellow, "gui": "bold", "cterm": "bold" }) +call s:h("EasyMotionShade", { "fg": s:comment_grey }) + +" lewis6991/gitsigns.nvim +hi link GitSignsAdd GitGutterAdd +hi link GitSignsChange GitGutterChange +hi link GitSignsDelete GitGutterDelete + +" mhinz/vim-signify +hi link SignifySignAdd GitGutterAdd +hi link SignifySignChange GitGutterChange +hi link SignifySignDelete GitGutterDelete + +" neoclide/coc.nvim +call s:h("CocErrorSign", { "fg": s:red }) +call s:h("CocWarningSign", { "fg": s:yellow }) +call s:h("CocInfoSign", { "fg": s:blue }) +call s:h("CocHintSign", { "fg": s:cyan }) + +" neomake/neomake +call s:h("NeomakeErrorSign", { "fg": s:red }) +call s:h("NeomakeWarningSign", { "fg": s:yellow }) +call s:h("NeomakeInfoSign", { "fg": s:blue }) + +" plasticboy/vim-markdown (keep consistent with Markdown, above) +call s:h("mkdDelimiter", { "fg": s:purple }) +call s:h("mkdHeading", { "fg": s:red }) +call s:h("mkdLink", { "fg": s:blue }) +call s:h("mkdURL", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) + +" prabirshrestha/vim-lsp +call s:h("LspError", { "fg": s:red }) +call s:h("LspWarning", { "fg": s:yellow }) +call s:h("LspInformation", { "fg": s:blue }) +call s:h("LspHint", { "fg": s:cyan }) + +" tpope/vim-fugitive +call s:h("diffAdded", { "fg": s:green }) +call s:h("diffRemoved", { "fg": s:red }) + +" }}} + +" Git Highlighting {{{ + +call s:h("gitcommitComment", { "fg": s:comment_grey }) +call s:h("gitcommitUnmerged", { "fg": s:green }) +call s:h("gitcommitOnBranch", {}) +call s:h("gitcommitBranch", { "fg": s:purple }) +call s:h("gitcommitDiscardedType", { "fg": s:red }) +call s:h("gitcommitSelectedType", { "fg": s:green }) +call s:h("gitcommitHeader", {}) +call s:h("gitcommitUntrackedFile", { "fg": s:cyan }) +call s:h("gitcommitDiscardedFile", { "fg": s:red }) +call s:h("gitcommitSelectedFile", { "fg": s:green }) +call s:h("gitcommitUnmergedFile", { "fg": s:yellow }) +call s:h("gitcommitFile", {}) +call s:h("gitcommitSummary", { "fg": s:white }) +call s:h("gitcommitOverflow", { "fg": s:red }) +hi link gitcommitNoBranch gitcommitBranch +hi link gitcommitUntracked gitcommitComment +hi link gitcommitDiscarded gitcommitComment +hi link gitcommitSelected gitcommitComment +hi link gitcommitDiscardedArrow gitcommitDiscardedFile +hi link gitcommitSelectedArrow gitcommitSelectedFile +hi link gitcommitUnmergedArrow gitcommitUnmergedFile + +" }}} + +" Neovim-Specific Highlighting {{{ + +if has("nvim") + " Neovim terminal colors {{{ + let g:terminal_color_0 = s:black.gui + let g:terminal_color_1 = s:red.gui + let g:terminal_color_2 = s:green.gui + let g:terminal_color_3 = s:yellow.gui + let g:terminal_color_4 = s:blue.gui + let g:terminal_color_5 = s:purple.gui + let g:terminal_color_6 = s:cyan.gui + let g:terminal_color_7 = s:white.gui + let g:terminal_color_8 = s:visual_grey.gui + let g:terminal_color_9 = s:dark_red.gui + let g:terminal_color_10 = s:green.gui " No dark version + let g:terminal_color_11 = s:dark_yellow.gui + let g:terminal_color_12 = s:blue.gui " No dark version + let g:terminal_color_13 = s:purple.gui " No dark version + let g:terminal_color_14 = s:cyan.gui " No dark version + let g:terminal_color_15 = s:comment_grey.gui + let g:terminal_color_background = s:background.gui + let g:terminal_color_foreground = s:foreground.gui + " }}} + + " Neovim Diagnostics {{{ + call s:h("DiagnosticError", { "fg": s:red }) + call s:h("DiagnosticWarn", { "fg": s:yellow }) + call s:h("DiagnosticInfo", { "fg": s:blue }) + call s:h("DiagnosticHint", { "fg": s:cyan }) + call s:h("DiagnosticUnderlineError", { "fg": s:red, "gui": "underline", "cterm": "underline" }) + call s:h("DiagnosticUnderlineWarn", { "fg": s:yellow, "gui": "underline", "cterm": "underline" }) + call s:h("DiagnosticUnderlineInfo", { "fg": s:blue, "gui": "underline", "cterm": "underline" }) + call s:h("DiagnosticUnderlineHint", { "fg": s:cyan, "gui": "underline", "cterm": "underline" }) + " }}} + + " Neovim LSP (for versions < 0.5.1) {{{ + hi link LspDiagnosticsDefaultError DiagnosticError + hi link LspDiagnosticsDefaultWarning DiagnosticWarn + hi link LspDiagnosticsDefaultInformation DiagnosticInfo + hi link LspDiagnosticsDefaultHint DiagnosticHint + hi link LspDiagnosticsUnderlineError DiagnosticUnderlineError + hi link LspDiagnosticsUnderlineWarning DiagnosticUnderlineWarn + hi link LspDiagnosticsUnderlineInformation DiagnosticUnderlineInfo + hi link LspDiagnosticsUnderlineHint DiagnosticUnderlineHint + " }}} +endif + +" }}} + +" Must appear at the end of the file to work around this oddity: +" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark diff --git a/.vim/colors/onedark/img/broken_colors.png b/.vim/colors/onedark/img/broken_colors.png new file mode 100755 index 0000000..27a837b Binary files /dev/null and b/.vim/colors/onedark/img/broken_colors.png differ diff --git a/.vim/colors/onedark/img/broken_italics.png b/.vim/colors/onedark/img/broken_italics.png new file mode 100755 index 0000000..087304a Binary files /dev/null and b/.vim/colors/onedark/img/broken_italics.png differ diff --git a/.vim/colors/onedark/img/color_reference.png b/.vim/colors/onedark/img/color_reference.png new file mode 100755 index 0000000..ef2e3e3 Binary files /dev/null and b/.vim/colors/onedark/img/color_reference.png differ diff --git a/.vim/colors/onedark/img/preview_airline.png b/.vim/colors/onedark/img/preview_airline.png new file mode 100755 index 0000000..379470e Binary files /dev/null and b/.vim/colors/onedark/img/preview_airline.png differ diff --git a/.vim/colors/onedark/img/preview_lightline.png b/.vim/colors/onedark/img/preview_lightline.png new file mode 100755 index 0000000..5087e92 Binary files /dev/null and b/.vim/colors/onedark/img/preview_lightline.png differ diff --git a/.vim/colors/onedark/img/readme_header.png b/.vim/colors/onedark/img/readme_header.png new file mode 100755 index 0000000..f30dc55 Binary files /dev/null and b/.vim/colors/onedark/img/readme_header.png differ diff --git a/.vim/colors/onedark/package-lock.json b/.vim/colors/onedark/package-lock.json new file mode 100755 index 0000000..50f0c55 --- /dev/null +++ b/.vim/colors/onedark/package-lock.json @@ -0,0 +1,4610 @@ +{ + "name": "onedark.vim-builder", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "onedark.vim-builder", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "termcolors": "0.7.3" + }, + "devDependencies": { + "eslint": "^7.30.0", + "husky": "^6.0.0", + "lint-staged": "^11.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.3.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/colr": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "colr-convert": "^1.0.5" + } + }, + "node_modules/colr-convert": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot": { + "version": "1.1.3", + "engines": [ + "node >=0.2.6" + ], + "license": "MIT", + "bin": { + "dottojs": "bin/dot-packer" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.3.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", + "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/termcolors": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/termcolors/-/termcolors-0.7.3.tgz", + "integrity": "sha512-EFZ0oPAVRPkZ4ZuKTcMhHOFg7yb732vmOljUW5zAT6r6egAWO1qnCQSnCvTZwlWuobdWOh/I59ldUOZDwDP20Q==", + "dependencies": { + "colr": "^1.2.2", + "commander": "^4.0.1", + "concat-stream": "^2.0.0", + "dot": "^1.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.0", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "1.0.10", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.1" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "colr": { + "version": "1.2.2", + "requires": { + "colr-convert": "^1.0.5" + } + }, + "colr-convert": { + "version": "1.0.5" + }, + "commander": { + "version": "4.1.1" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "2.0.0", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot": { + "version": "1.1.3" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.30.0.tgz", + "integrity": "sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "husky": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz", + "integrity": "sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.0.0.tgz", + "integrity": "sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==", + "dev": true, + "requires": { + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "listr2": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.10.0.tgz", + "integrity": "sha512-eP40ZHihu70sSmqFNbNy2NL1YwImmlMmPh9WO5sLmPDleurMHt3n+SwEWNu2kzKScexZnkyFtc1VI0z/TGlmpw==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.1", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "prettier": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "readable-stream": { + "version": "3.6.0", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "regexpp": { + "version": "3.1.0", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1" + }, + "semver": { + "version": "7.3.4", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3" + }, + "string_decoder": { + "version": "1.3.0", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.padend": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", + "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "termcolors": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/termcolors/-/termcolors-0.7.3.tgz", + "integrity": "sha512-EFZ0oPAVRPkZ4ZuKTcMhHOFg7yb732vmOljUW5zAT6r6egAWO1qnCQSnCvTZwlWuobdWOh/I59ldUOZDwDP20Q==", + "requires": { + "colr": "^1.2.2", + "commander": "^4.0.1", + "concat-stream": "^2.0.0", + "dot": "^1.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19" + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2" + }, + "v8-compile-cache": { + "version": "2.2.0", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/.vim/colors/onedark/package.json b/.vim/colors/onedark/package.json new file mode 100755 index 0000000..1f69c32 --- /dev/null +++ b/.vim/colors/onedark/package.json @@ -0,0 +1,45 @@ +{ + "name": "onedark.vim-builder", + "version": "1.0.0", + "description": "Builds the onedark.vim Vim colorscheme and associated files", + "main": "build.js", + "scripts": { + "build": "node build/build.js", + "test": "npm run lint && node build/build.js check", + "prepare": "husky install", + "lint": "run-p eslint:check prettier:check", + "lint:fix": "run-s eslint:fix prettier:fix", + "eslint:check": "eslint '**/*.js'", + "eslint:fix": "eslint --fix '**/*.js'", + "prettier:check": "prettier --check '**/*.{js,json,md}'", + "prettier:fix": "prettier --write '**/*.{js,json,md}'" + }, + "author": { + "name": "Josh Dick", + "email": "josh@joshdick.net", + "url": "http://joshdick.net" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/joshdick/onedark.vim.git" + }, + "devDependencies": { + "eslint": "^7.30.0", + "husky": "^6.0.0", + "lint-staged": "^11.0.0", + "npm-run-all": "^4.1.5", + "prettier": "^2.3.2" + }, + "dependencies": { + "termcolors": "0.7.3" + }, + "lint-staged": { + "*.{js,json,md}": [ + "prettier --check" + ], + "*.{js}": [ + "eslint" + ] + } +} diff --git a/.vim/colors/onedark/term/One Dark.Xresources b/.vim/colors/onedark/term/One Dark.Xresources new file mode 100755 index 0000000..37aec79 --- /dev/null +++ b/.vim/colors/onedark/term/One Dark.Xresources @@ -0,0 +1,37 @@ +! special +*.foreground: #ABB2BF +*.background: #282C34 +*.cursorColor: #ABB2BF + +! black +*.color0: #2C323C +*.color8: #3E4452 + +! red +*.color1: #E06C75 +*.color9: #E06C75 + +! green +*.color2: #98C379 +*.color10: #98C379 + +! yellow +*.color3: #E5C07B +*.color11: #E5C07B + +! blue +*.color4: #61AFEF +*.color12: #61AFEF + +! magenta +*.color5: #C678DD +*.color13: #C678DD + +! cyan +*.color6: #56B6C2 +*.color14: #56B6C2 + +! white +*.color7: #5C6370 +*.color15: #ABB2BF + diff --git a/.vim/colors/onedark/term/One Dark.alacritty b/.vim/colors/onedark/term/One Dark.alacritty new file mode 100755 index 0000000..9d06197 --- /dev/null +++ b/.vim/colors/onedark/term/One Dark.alacritty @@ -0,0 +1,38 @@ +# Colors (One Dark) +colors: + # Default colors + primary: + foreground: '0xabb2bf' + background: '0x282c34' + + # Cursor colors + cursor: + text: '0x2c323c' + cursor: '0x5c6370' + + # Selection colors + selection: + text: CellForeground + background: '0x3e4452' + + # Normal colors + normal: + black: '0x2c323c' + red: '0xe06c75' + green: '0x98c379' + yellow: '0xe5c07b' + blue: '0x61afef' + magenta: '0xc678dd' + cyan: '0x56b6c2' + white: '0x5c6370' + + # Bright colors + bright: + black: '0x3e4452' + red: '0xe06c75' + green: '0x98c379' + yellow: '0xe5c07b' + blue: '0x61afef' + magenta: '0xc678dd' + cyan: '0x56b6c2' + white: '0xabb2bf' diff --git a/.vim/colors/onedark/term/One Dark.colorscheme b/.vim/colors/onedark/term/One Dark.colorscheme new file mode 100755 index 0000000..6f4bff5 --- /dev/null +++ b/.vim/colors/onedark/term/One Dark.colorscheme @@ -0,0 +1,96 @@ +[Background] +Color=40,44,52 + +[BackgroundFaint] +Color=40,44,52 + +[BackgroundIntense] +Color=40,44,52 + +[Color0] +Color=44,50,60 + +[Color0Faint] +Color=44,50,60 + +[Color0Intense] +Color=62,68,82 + +[Color1] +Color=224,108,117 + +[Color1Faint] +Color=224,108,117 + +[Color1Intense] +Color=224,108,117 + +[Color2] +Color=152,195,121 + +[Color2Faint] +Color=152,195,121 + +[Color2Intense] +Color=152,195,121 + +[Color3] +Color=229,192,123 + +[Color3Faint] +Color=229,192,123 + +[Color3Intense] +Color=229,192,123 + +[Color4] +Color=97,175,239 + +[Color4Faint] +Color=97,175,239 + +[Color4Intense] +Color=97,175,239 + +[Color5] +Color=198,120,221 + +[Color5Faint] +Color=198,120,221 + +[Color5Intense] +Color=198,120,221 + +[Color6] +Color=86,182,194 + +[Color6Faint] +Color=86,182,194 + +[Color6Intense] +Color=86,182,194 + +[Color7] +Color=92,99,112 + +[Color7Faint] +Color=92,99,112 + +[Color7Intense] +Color=171,178,191 + +[Foreground] +Color=171,178,191 + +[ForegroundFaint] +Color=171,178,191 + +[ForegroundIntense] +Color=171,178,191 + +[General] +Blur=false +ColorRandomization=false +Description=One Dark +Opacity=1 +Wallpaper= diff --git a/.vim/colors/onedark/term/One Dark.itermcolors b/.vim/colors/onedark/term/One Dark.itermcolors new file mode 100755 index 0000000..fa08006 --- /dev/null +++ b/.vim/colors/onedark/term/One Dark.itermcolors @@ -0,0 +1,259 @@ + + + + + Ansi 0 Color + + Color Space + sRGB + Blue Component + 0.23529411764705882 + Green Component + 0.19607843137254902 + Red Component + 0.17254901960784313 + + Ansi 1 Color + + Color Space + sRGB + Blue Component + 0.4588235294117647 + Green Component + 0.4235294117647059 + Red Component + 0.8784313725490196 + + Ansi 10 Color + + Color Space + sRGB + Blue Component + 0.4745098039215686 + Green Component + 0.7647058823529411 + Red Component + 0.596078431372549 + + Ansi 11 Color + + Color Space + sRGB + Blue Component + 0.4823529411764706 + Green Component + 0.7529411764705882 + Red Component + 0.8980392156862745 + + Ansi 12 Color + + Color Space + sRGB + Blue Component + 0.9372549019607843 + Green Component + 0.6862745098039216 + Red Component + 0.3803921568627451 + + Ansi 13 Color + + Color Space + sRGB + Blue Component + 0.8666666666666667 + Green Component + 0.47058823529411764 + Red Component + 0.7764705882352941 + + Ansi 14 Color + + Color Space + sRGB + Blue Component + 0.7607843137254902 + Green Component + 0.7137254901960784 + Red Component + 0.33725490196078434 + + Ansi 15 Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Ansi 2 Color + + Color Space + sRGB + Blue Component + 0.4745098039215686 + Green Component + 0.7647058823529411 + Red Component + 0.596078431372549 + + Ansi 3 Color + + Color Space + sRGB + Blue Component + 0.4823529411764706 + Green Component + 0.7529411764705882 + Red Component + 0.8980392156862745 + + Ansi 4 Color + + Color Space + sRGB + Blue Component + 0.9372549019607843 + Green Component + 0.6862745098039216 + Red Component + 0.3803921568627451 + + Ansi 5 Color + + Color Space + sRGB + Blue Component + 0.8666666666666667 + Green Component + 0.47058823529411764 + Red Component + 0.7764705882352941 + + Ansi 6 Color + + Color Space + sRGB + Blue Component + 0.7607843137254902 + Green Component + 0.7137254901960784 + Red Component + 0.33725490196078434 + + Ansi 7 Color + + Color Space + sRGB + Blue Component + 0.4392156862745098 + Green Component + 0.38823529411764707 + Red Component + 0.3607843137254902 + + Ansi 8 Color + + Color Space + sRGB + Blue Component + 0.3215686274509804 + Green Component + 0.26666666666666666 + Red Component + 0.24313725490196078 + + Ansi 9 Color + + Color Space + sRGB + Blue Component + 0.4588235294117647 + Green Component + 0.4235294117647059 + Red Component + 0.8784313725490196 + + Background Color + + Color Space + sRGB + Blue Component + 0.20392156862745098 + Green Component + 0.17254901960784313 + Red Component + 0.1568627450980392 + + Bold Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Cursor Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Cursor Text Color + + Color Space + sRGB + Blue Component + 0.20392156862745098 + Green Component + 0.17254901960784313 + Red Component + 0.1568627450980392 + + Foreground Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + Selected Text Color + + Color Space + sRGB + Blue Component + 0.20392156862745098 + Green Component + 0.17254901960784313 + Red Component + 0.1568627450980392 + + Selection Color + + Color Space + sRGB + Blue Component + 0.7490196078431373 + Green Component + 0.6980392156862745 + Red Component + 0.6705882352941176 + + + diff --git a/.vim/colors/onedark/term/One Dark.kitty b/.vim/colors/onedark/term/One Dark.kitty new file mode 100755 index 0000000..a0a1251 --- /dev/null +++ b/.vim/colors/onedark/term/One Dark.kitty @@ -0,0 +1,41 @@ +# Cursor +cursor #5c6370 +cursor_text_color #2c323c + +# Special +foreground #abb2bf +background #282c34 +selection_foreground #2c323c +selection_background #5c6370 + +# Black +color0 #2c323c +color8 #3e4452 + +# Red +color1 #e06c75 +color9 #e06c75 + +# Green +color2 #98c379 +color10 #98c379 + +# Yellow +color3 #e5c07b +color11 #e5c07b + +# Blue +color4 #61afef +color12 #61afef + +# Magenta +color5 #c678dd +color13 #c678dd + +# Cyan +color6 #56b6c2 +color14 #56b6c2 + +# White +color7 #5c6370 +color15 #abb2bf diff --git a/.vim/colors/onedark/term/One Dark.terminal b/.vim/colors/onedark/term/One Dark.terminal new file mode 100755 index 0000000..c5d681f --- /dev/null +++ b/.vim/colors/onedark/term/One Dark.terminal @@ -0,0 +1,199 @@ + + + + + ANSIBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjE3MjU0OTAxOTYgMC4xOTYwNzg0MzE0IDAuMjM1Mjk0MTE3NgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM4MDM5MjE1NjkgMC42ODYyNzQ1MDk4IDAuOTM3MjU0OTAyMAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlackColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjI0MzEzNzI1NDkgMC4yNjY2NjY2NjY3IDAuMzIxNTY4NjI3NQAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightBlueColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM4MDM5MjE1NjkgMC42ODYyNzQ1MDk4IDAuOTM3MjU0OTAyMAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightCyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjMzNzI1NDkwMjAgMC43MTM3MjU0OTAyIDAuNzYwNzg0MzEzNwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjU5NjA3ODQzMTQgMC43NjQ3MDU4ODI0IDAuNDc0NTA5ODAzOQAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljc3NjQ3MDU4ODIgMC40NzA1ODgyMzUzIDAuODY2NjY2NjY2NwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightRedColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg3ODQzMTM3MjUgMC40MjM1Mjk0MTE4IDAuNDU4ODIzNTI5NAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIBrightYellowColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg5ODAzOTIxNTcgMC43NTI5NDExNzY1IDAuNDgyMzUyOTQxMgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSICyanColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjMzNzI1NDkwMjAgMC43MTM3MjU0OTAyIDAuNzYwNzg0MzEzNwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIGreenColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjU5NjA3ODQzMTQgMC43NjQ3MDU4ODI0IDAuNDc0NTA5ODAzOQAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIMagentaColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljc3NjQ3MDU4ODIgMC40NzA1ODgyMzUzIDAuODY2NjY2NjY2NwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIRedColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg3ODQzMTM3MjUgMC40MjM1Mjk0MTE4IDAuNDU4ODIzNTI5NAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIWhiteColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjM2MDc4NDMxMzcgMC4zODgyMzUyOTQxIDAuNDM5MjE1Njg2MwAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + ANSIYellowColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + Ljg5ODAzOTIxNTcgMC43NTI5NDExNzY1IDAuNDgyMzUyOTQxMgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + BackgroundColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjE1Njg2Mjc0NTEgMC4xNzI1NDkwMTk2IDAuMjAzOTIxNTY4NgAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + CursorColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + SelectionColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + TextBoldColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + TextColor + + YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS + AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw + LjY3MDU4ODIzNTMgMC42OTgwMzkyMTU3IDAuNzQ5MDE5NjA3OAAQAYAC0hAREhNaJGNs + YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp + dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA + AAAZAAAAAAAAAAAAAAAAAAAA2Q== + + name + One Dark + type + Window Settings + + diff --git a/.vim/colors/palenight b/.vim/colors/palenight deleted file mode 160000 index 847fcf5..0000000 --- a/.vim/colors/palenight +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 847fcf5b1de2a1f9c28fdcc369d009996c6bf633 diff --git a/.vim/colors/palenight/LICENSE b/.vim/colors/palenight/LICENSE new file mode 100755 index 0000000..de06879 --- /dev/null +++ b/.vim/colors/palenight/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Joshua Dick + +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. + diff --git a/.vim/colors/palenight/README.md b/.vim/colors/palenight/README.md new file mode 100755 index 0000000..96fec72 --- /dev/null +++ b/.vim/colors/palenight/README.md @@ -0,0 +1,82 @@ +![palenight.vim][screenshot] + +A dark color scheme for Vim/Neovim based off the [Material Pale Night][materialLink] color scheme. Much of the work is based on the lovely [onedark.vim][onedark] color scheme. + +## Installation +Using [vim-plug][vimplug] (modify this to work with your Vim package manager of choice): + +```vim +Plug 'drewtempelmeyer/palenight.vim' +``` + +## Usage + +In your wonderfully organized Vim (`~/.vimrc`) or Neovim (`.config/nvim/init.vim`) configuration, place the following two lines: + +```vim +set background=dark +colorscheme palenight +``` + +To configure lightline, add the following line: + +```vim +let g:lightline = { 'colorscheme': 'palenight' } +``` + +To configure airline, add the following line: + +```vim +let g:airline_theme = "palenight" +``` + +### True Colors + +To provide the best user experience possible, I recommend enabling true colors. To experience the blissfulness of your editor's true colors, place this in your `.vimrc` or `~/.config/nvim/init.vim` file: + +```vim +if (has("nvim")) + "For Neovim 0.1.3 and 0.1.4 < https://github.com/neovim/neovim/pull/2198 > + let $NVIM_TUI_ENABLE_TRUE_COLOR=1 +endif + +"For Neovim > 0.1.5 and Vim > patch 7.4.1799 < https://github.com/vim/vim/commit/61be73bb0f965a895bfb064ea3e55476ac175162 > +"Based on Vim patch 7.4.1770 (`guicolors` option) < https://github.com/vim/vim/commit/8a633e3427b47286869aa4b96f2bfc1fe65b25cd > +" < https://github.com/neovim/neovim/wiki/Following-HEAD#20160511 > +if (has("termguicolors")) + set termguicolors +endif +``` + +### Italics + +Italics are a fantastic way to improve the appearance of your code. Italics will do what they can, but, as they say, "you can't polish a 💩." (Although MythBusters busted this). Digressing here, so place this into your config: + +```vim +" Italics for my favorite color scheme +let g:palenight_terminal_italics=1 +``` + +### Overriding Colors + +Overriding palenight's colors are supported through setting the +`g:palenight_color_overrides` variable. See [palenight.vim](./autoload/palenight.vim) +for a list of colors that may be overriden. You must provide `gui`, `cterm`, +and `cterm16` values for each. + +Example: Overriding the background color to pure black +```vim +let g:palenight_color_overrides = { +\ 'black': { 'gui': '#000000', "cterm": "0", "cterm16": "0" }, +\} +``` + +## Contributors + +[The lovely people that have contributed to palenight.vim](https://github.com/drewtempelmeyer/palenight.vim/graphs/contributors) + +[screenshot]: images/screenshot.png +[materialLink]: https://github.com/equinusocio/material-theme +[onedark]: https://github.com/joshdick/onedark.vim +[vimplug]: https://github.com/junegunn/vim-plug +[firaCode]: https://github.com/tonsky/FiraCode diff --git a/.vim/colors/palenight/autoload/airline/themes/palenight.vim b/.vim/colors/palenight/autoload/airline/themes/palenight.vim new file mode 100755 index 0000000..e7a6ddc --- /dev/null +++ b/.vim/colors/palenight/autoload/airline/themes/palenight.vim @@ -0,0 +1,127 @@ +scriptencoding utf-8 + +let g:airline#themes#palenight#palette = {} + +let s:colors = palenight#GetColors() + +function! s:wrap_opts(opts) + if g:palenight_terminal_italics == 0 + let i = index(a:opts, 'italic') + if i >= 0 + unlet a:opts[i] + endif + endif + + return join(a:opts, ",") +endfunction + +let s:airline_modified = [s:colors.green.gui, '', s:colors.green.cterm, '', s:wrap_opts(['italic'])] +let s:airline_warning = [s:colors.red.gui, s:colors.black.gui, s:colors.red.cterm, s:colors.black.cterm] +let s:airline_error = [s:colors.black.gui, s:colors.red.gui, s:colors.black.cterm, s:colors.red.cterm, s:wrap_opts(['bold'])] + +" --- +" Normal + +let s:airline_a_normal = [s:colors.black.gui, s:colors.blue_purple.gui, s:colors.black.cterm, s:colors.blue_purple.cterm] +let s:airline_b_normal = [s:colors.white.gui, s:colors.white_mask_3.gui, s:colors.white.cterm, s:colors.white_mask_3.cterm] +let s:airline_c_normal = [s:colors.white.gui, s:colors.white_mask_1.gui, s:colors.white.cterm, s:colors.white_mask_1.cterm, s:wrap_opts(['italic'])] +let g:airline#themes#palenight#palette.normal = airline#themes#generate_color_map(s:airline_a_normal, s:airline_b_normal, s:airline_c_normal) + +let g:airline#themes#palenight#palette.normal_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.normal.airline_warning = s:airline_warning +let g:airline#themes#palenight#palette.normal_modified.airline_warning = s:airline_warning +let g:airline#themes#palenight#palette.normal.airline_error = s:airline_error +let g:airline#themes#palenight#palette.normal_modified.airline_error = s:airline_error + +" --- +" Insert + +let s:airline_a_insert = [s:colors.black.gui, s:colors.green.gui, s:colors.black.cterm, s:colors.green.cterm] +let s:airline_b_insert = s:airline_b_normal +let s:airline_c_insert = s:airline_c_normal +let g:airline#themes#palenight#palette.insert = airline#themes#generate_color_map(s:airline_a_insert, s:airline_b_insert, s:airline_c_insert) + +let g:airline#themes#palenight#palette.insert_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.insert.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.insert_modified.airline_warning = g:airline#themes#palenight#palette.normal_modified.airline_warning +let g:airline#themes#palenight#palette.insert.airline_error = g:airline#themes#palenight#palette.normal.airline_error +let g:airline#themes#palenight#palette.insert_modified.airline_error = g:airline#themes#palenight#palette.normal_modified.airline_error + +" --- +" Replace + +let s:airline_a_replace = [s:colors.black.gui, s:colors.light_red.gui, s:colors.black.cterm, s:colors.light_red.cterm] +let s:airline_b_replace = s:airline_b_normal +let s:airline_c_replace = s:airline_c_normal +let g:airline#themes#palenight#palette.replace = airline#themes#generate_color_map(s:airline_a_replace, s:airline_b_replace, s:airline_c_replace) + +let g:airline#themes#palenight#palette.replace_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.replace.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.replace_modified.airline_warning = g:airline#themes#palenight#palette.normal_modified.airline_warning +let g:airline#themes#palenight#palette.replace.airline_error = g:airline#themes#palenight#palette.normal.airline_error +let g:airline#themes#palenight#palette.replace_modified.airline_error = g:airline#themes#palenight#palette.normal_modified.airline_error + +" --- +" Visual + +let s:airline_a_visual = [s:colors.black.gui, s:colors.yellow.gui, s:colors.black.cterm, s:colors.yellow.cterm] +let s:airline_b_visual = s:airline_b_normal +let s:airline_c_visual = s:airline_c_normal +let g:airline#themes#palenight#palette.visual = airline#themes#generate_color_map(s:airline_a_visual, s:airline_b_visual, s:airline_c_visual) + +let g:airline#themes#palenight#palette.visual_modified = { + \ 'airline_c': s:airline_modified, + \ } + +let g:airline#themes#palenight#palette.visual.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.visual_modified.airline_warning = g:airline#themes#palenight#palette.normal_modified.airline_warning +let g:airline#themes#palenight#palette.visual.airline_error = g:airline#themes#palenight#palette.normal.airline_error +let g:airline#themes#palenight#palette.visual_modified.airline_error = g:airline#themes#palenight#palette.normal_modified.airline_error + +" --- +" Inactive + +let s:airline_inactive = [ s:colors.comment_grey.gui, s:colors.white_mask_1.gui, s:colors.comment_grey.cterm, s:colors.white_mask_1.cterm ] +let g:airline#themes#palenight#palette.inactive = airline#themes#generate_color_map(s:airline_inactive, s:airline_inactive, s:airline_inactive) + +let g:airline#themes#palenight#palette.inactive_modified = { + \ 'airline_c': s:airline_modified, + \ } + +" --- +" Command line + +let s:airline_a_commandline = [s:colors.black.gui, s:colors.white.gui, s:colors.black.cterm, s:colors.white.cterm] +let s:airline_b_commandline = s:airline_b_normal +let s:airline_c_commandline = s:airline_c_normal +let g:airline#themes#palenight#palette.commandline = airline#themes#generate_color_map(s:airline_a_commandline, s:airline_b_commandline, s:airline_c_commandline) + +let g:airline#themes#palenight#palette.commandline.airline_warning = g:airline#themes#palenight#palette.normal.airline_warning +let g:airline#themes#palenight#palette.commandline.airline_error = g:airline#themes#palenight#palette.normal.airline_error + +" --- + +let g:airline#themes#palenight#palette.accents = { + \ 'red': [s:colors.red.gui, '', s:colors.red.cterm, ''] + \ } + +" --- +" Tabline + +let s:airline_tabsel = [s:colors.black.gui, s:colors.white_mask_11.gui, s:colors.black.cterm, s:colors.white_mask_11.cterm, s:wrap_opts(['bold'])] +let s:airline_tabfill = [s:colors.white.gui, s:colors.black.gui, s:colors.white.cterm, s:colors.black.cterm] +let g:airline#themes#palenight#palette.tabline = { + \ 'airline_tabsel': s:airline_tabsel, + \ 'airline_tabfill': s:airline_tabfill, + \ 'airline_tabmod': [s:colors.black.gui, s:colors.green.gui, s:colors.black.cterm, s:colors.green.cterm, s:wrap_opts(['bold', 'italic'])], + \ 'airline_tabhid': [s:colors.white.gui, s:colors.white_mask_1.gui, s:colors.white.cterm, s:colors.white_mask_1.cterm] + \ } diff --git a/.vim/colors/palenight/autoload/lightline/colorscheme/palenight.vim b/.vim/colors/palenight/autoload/lightline/colorscheme/palenight.vim new file mode 100755 index 0000000..3033861 --- /dev/null +++ b/.vim/colors/palenight/autoload/lightline/colorscheme/palenight.vim @@ -0,0 +1,48 @@ +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} + +let s:p_vertsplit = ["#181A1F", 59, 15] +let s:p_special_grey = ["#3B4048", 238, 15] +let s:p_menu_grey = ["#3E4452", 237, 8] +let s:p_cursor_grey = ["#2C323C", 236, 8] +let s:p_gutter_fg_grey = ["#4B5263", 238, 15] +let s:p_blue = ["#82b1ff", 39, 4] +let s:p_dark_red = ["#BE5046", 196, 9] +let s:p_white = ["#bfc7d5", 145, 7] +let s:p_green = ["#C3E88D", 114, 2] +let s:p_purple = ["#c792ea", 170, 5] +let s:p_yellow = ["#ffcb6b", 180, 3] +let s:p_light_red = ["#ff869a", 204, 1] +let s:p_red = ["#ff5370", 204, 1] +let s:p_dark_yellow = ["#F78C6C", 173, 11] +let s:p_cyan = ["#89DDFF", 38, 6] +let s:p_comment_grey = ["#697098", 59, 15] +let s:p_black = ["#292D3E", 235, 0] + +let s:p.normal.left = [ [ s:p_black, s:p_purple ], [ s:p_purple, s:p_menu_grey ] ] +let s:p.normal.right = copy(s:p.normal.left) +let s:p.normal.middle = [ [ s:p_comment_grey, s:p_black ] ] +let s:p.normal.warning = [ [ s:p_black, s:p_yellow ] ] +let s:p.normal.error = [ [ s:p_black, s:p_red ] ] + +let s:p.insert.left = [ [ s:p_black, s:p_blue ], [ s:p_blue, s:p_menu_grey ] ] +let s:p.insert.right = copy(s:p.insert.left) +let s:p.insert.middle = copy(s:p.normal.middle) + +let s:p.visual.left = [ [ s:p_black, s:p_cyan ], [ s:p_cyan, s:p_menu_grey ] ] +let s:p.visual.right = copy(s:p.visual.left) +let s:p.visual.middle = copy(s:p.normal.middle) + +let s:p.replace.left = [ [ s:p_black, s:p_green ], [ s:p_green, s:p_menu_grey ] ] +let s:p.replace.right = copy(s:p.replace.left) +let s:p.replace.middle = copy(s:p.normal.middle) + +let s:p.tabline.left = [ [ s:p_yellow, s:p_menu_grey ] ] +let s:p.tabline.right = [ [ s:p_black, s:p_yellow ] ] +let s:p.tabline.middle = [ [ s:p_black, s:p_menu_grey ] ] +let s:p.tabline.tabsel = copy(s:p.tabline.right) + +let s:p.inactive.left = [ [ s:p_black, s:p_menu_grey ], [ s:p_black, s:p_menu_grey ] ] +let s:p.inactive.right = copy(s:p.inactive.left) +let s:p.inactive.middle = [ [ s:p_black, s:p_menu_grey ] ] + +let g:lightline#colorscheme#palenight#palette = lightline#colorscheme#flatten(s:p) diff --git a/.vim/colors/palenight/autoload/palenight.vim b/.vim/colors/palenight/autoload/palenight.vim new file mode 100755 index 0000000..8468bac --- /dev/null +++ b/.vim/colors/palenight/autoload/palenight.vim @@ -0,0 +1,34 @@ +let s:overrides = get(g:, "palenight_color_overrides", {}) + +" white_mask_: Color of a white mask overlayed on top of +" `s:colors.black`, where `number * 12` is the alpha value of the white mask + +let s:colors = { + \ "red": get(s:overrides, "red", { "gui": "#ff5370", "cterm": "204", "cterm16": "1" }), + \ "light_red": get(s:overrides, "light_red", { "gui": "#ff869a", "cterm": "204", "cterm16": "1" }), + \ "dark_red": get(s:overrides, "dark_red", { "gui": "#BE5046", "cterm": "196", "cterm16": "9" }), + \ "green": get(s:overrides, "green", { "gui": "#C3E88D", "cterm": "114", "cterm16": "2" }), + \ "yellow": get(s:overrides, "yellow", { "gui": "#ffcb6b", "cterm": "180", "cterm16": "3" }), + \ "dark_yellow": get(s:overrides, "dark_yellow", { "gui": "#F78C6C", "cterm": "173", "cterm16": "11" }), + \ "blue": get(s:overrides, "blue", { "gui": "#82b1ff", "cterm": "39", "cterm16": "4" }), + \ "purple": get(s:overrides, "purple", { "gui": "#c792ea", "cterm": "170", "cterm16": "5" }), + \ "blue_purple": get(s:overrides, "blue_purple", { "gui": "#939ede", "cterm": "39", "cterm16": "4"}), + \ "cyan": get(s:overrides, "cyan", { "gui": "#89DDFF", "cterm": "38", "cterm16": "6" }), + \ "white": get(s:overrides, "white", { "gui": "#bfc7d5", "cterm": "145", "cterm16": "7" }), + \ "black": get(s:overrides, "black", { "gui": "#292D3E", "cterm": "235", "cterm16": "0" }), + \ "visual_black": get(s:overrides, "visual_black", { "gui": "NONE", "cterm": "NONE", "cterm16": "0" }), + \ "comment_grey": get(s:overrides, "comment_grey", { "gui": "#697098", "cterm": "59", "cterm16": "15" }), + \ "gutter_fg_grey": get(s:overrides, "gutter_fg_grey", { "gui": "#4B5263", "cterm": "238", "cterm16": "15" }), + \ "cursor_grey": get(s:overrides, "cursor_grey", { "gui": "#2C323C", "cterm": "236", "cterm16": "8" }), + \ "visual_grey": get(s:overrides, "visual_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "15" }), + \ "menu_grey": get(s:overrides, "menu_grey", { "gui": "#3E4452", "cterm": "237", "cterm16": "8" }), + \ "special_grey": get(s:overrides, "special_grey", { "gui": "#3B4048", "cterm": "238", "cterm16": "15" }), + \ "vertsplit": get(s:overrides, "vertsplit", { "gui": "#181A1F", "cterm": "59", "cterm16": "15" }), + \ "white_mask_1": get(s:overrides, "white_mask_1", { "gui": "#333747", "cterm": "237", "cterm16": "15" }), + \ "white_mask_3": get(s:overrides, "white_mask_3", { "gui": "#474b59", "cterm": "238", "cterm16": "15" }), + \ "white_mask_11": get(s:overrides, "white_mask_11", { "gui": "#989aa2", "cterm": "238", "cterm16": "15" }) + \} + +function! palenight#GetColors() + return s:colors +endfunction diff --git a/.vim/colors/palenight/colors/palenight.vim b/.vim/colors/palenight/colors/palenight.vim new file mode 100755 index 0000000..b5b4a0f --- /dev/null +++ b/.vim/colors/palenight/colors/palenight.vim @@ -0,0 +1,585 @@ +" vim:fdm=marker +" Vim Color File +" Name: palenight.vim +" Maintainer: https://github.com/drewtempelmeyer/palenight.vim +" License: The MIT License (MIT) +" Based On: https://github.com/joshdick/onedark.vim + +" Initialization {{{ + +highlight clear + +if exists("syntax_on") + syntax reset +endif + +set t_Co=256 + +let g:colors_name="palenight" + +" Set to "256" for 256-color terminals, or +" set to "16" to use your terminal emulator's native colors +" (a 16-color palette for this color scheme is available; see +" < https://github.com/joshdick/onedark.vim/blob/master/README.md > +" for more information.) +if !exists("g:palenight_termcolors") + let g:palenight_termcolors = 256 +endif + +" Not all terminals support italics properly. If yours does, opt-in. +if !exists("g:palenight_terminal_italics") + let g:palenight_terminal_italics = 0 +endif + +" This function is based on one from FlatColor: https://github.com/MaxSt/FlatColor/ +" Which in turn was based on one found in hemisu: https://github.com/noahfrederick/vim-hemisu/ +function! s:h(group, style) + if g:palenight_terminal_italics == 0 + if has_key(a:style, "cterm") && a:style["cterm"] == "italic" + unlet a:style.cterm + endif + if has_key(a:style, "gui") && a:style["gui"] == "italic" + unlet a:style.gui + endif + endif + if g:palenight_termcolors == 16 + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm16 : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm16 : "NONE") + else + let l:ctermfg = (has_key(a:style, "fg") ? a:style.fg.cterm : "NONE") + let l:ctermbg = (has_key(a:style, "bg") ? a:style.bg.cterm : "NONE") + endif + execute "highlight" a:group + \ "guifg=" (has_key(a:style, "fg") ? a:style.fg.gui : "NONE") + \ "guibg=" (has_key(a:style, "bg") ? a:style.bg.gui : "NONE") + \ "guisp=" (has_key(a:style, "sp") ? a:style.sp.gui : "NONE") + \ "gui=" (has_key(a:style, "gui") ? a:style.gui : "NONE") + \ "ctermfg=" . l:ctermfg + \ "ctermbg=" . l:ctermbg + \ "cterm=" (has_key(a:style, "cterm") ? a:style.cterm : "NONE") +endfunction + +" public {{{ + +function! palenight#set_highlight(group, style) + call s:h(a:group, a:style) +endfunction + +" }}} + +" }}} + +" Color Variables {{{ + +let s:colors = palenight#GetColors() + +let s:red = s:colors.red +let s:light_red = s:colors.light_red +let s:dark_red = s:colors.dark_red +let s:green = s:colors.green +let s:yellow = s:colors.yellow +let s:dark_yellow = s:colors.dark_yellow +let s:blue = s:colors.blue +let s:purple = s:colors.purple +let s:blue_purple = s:colors.blue_purple +let s:cyan = s:colors.cyan +let s:white = s:colors.white +let s:black = s:colors.black +let s:visual_black = s:colors.visual_black " Black out selected text in 16-color visual mode +let s:comment_grey = s:colors.comment_grey +let s:gutter_fg_grey = s:colors.gutter_fg_grey +let s:cursor_grey = s:colors.cursor_grey +let s:visual_grey = s:colors.visual_grey +let s:menu_grey = s:colors.menu_grey +let s:special_grey = s:colors.special_grey +let s:vertsplit = s:colors.vertsplit +let s:white_mask_3 = s:colors.white_mask_3 + +" }}} + +" Syntax Groups (descriptions and ordering from `:h w18`) {{{ + +call s:h("Comment", { "fg": s:comment_grey, "gui": "italic", "cterm": "italic" }) " any comment +call s:h("Constant", { "fg": s:cyan }) " any constant +call s:h("String", { "fg": s:green }) " a string constant: "this is a string" +call s:h("Character", { "fg": s:green }) " a character constant: 'c', '\n' +call s:h("Number", { "fg": s:dark_yellow }) " a number constant: 234, 0xff +call s:h("Boolean", { "fg": s:red }) " a boolean constant: TRUE, false +call s:h("Float", { "fg": s:dark_yellow }) " a floating point constant: 2.3e10 +call s:h("Identifier", { "fg": s:red }) " any variable name +call s:h("Function", { "fg": s:blue }) " function name (also: methods for classes) +call s:h("Statement", { "fg": s:purple }) " any statement +call s:h("Conditional", { "fg": s:purple }) " if, then, else, endif, switch, etc. +call s:h("Repeat", { "fg": s:purple }) " for, do, while, etc. +call s:h("Label", { "fg": s:purple }) " case, default, etc. +call s:h("Operator", { "fg": s:cyan }) " sizeof", "+", "*", etc. +call s:h("Keyword", { "fg": s:red }) " any other keyword +call s:h("Exception", { "fg": s:purple }) " try, catch, throw +call s:h("PreProc", { "fg": s:yellow }) " generic Preprocessor +call s:h("Include", { "fg": s:blue }) " preprocessor #include +call s:h("Define", { "fg": s:purple }) " preprocessor #define +call s:h("Macro", { "fg": s:purple }) " same as Define +call s:h("PreCondit", { "fg": s:yellow }) " preprocessor #if, #else, #endif, etc. +call s:h("Type", { "fg": s:yellow }) " int, long, char, etc. +call s:h("StorageClass", { "fg": s:yellow }) " static, register, volatile, etc. +call s:h("Structure", { "fg": s:yellow }) " struct, union, enum, etc. +call s:h("Typedef", { "fg": s:yellow }) " A typedef +call s:h("Special", { "fg": s:blue }) " any special symbol +call s:h("SpecialChar", {}) " special character in a constant +call s:h("Tag", {}) " you can use CTRL-] on this +call s:h("Delimiter", {}) " character that needs attention +call s:h("SpecialComment", { "fg": s:comment_grey }) " special things inside a comment +call s:h("Debug", {}) " debugging statements +call s:h("Underlined", { "gui": "underline", "cterm": "underline" }) " text that stands out, HTML links +call s:h("Ignore", {}) " left blank, hidden +call s:h("Error", { "fg": s:red }) " any erroneous construct +call s:h("Todo", { "fg": s:purple }) " anything that needs extra attention; mostly the keywords TODO FIXME and XXX + +" }}} + +" Highlighting Groups (descriptions and ordering from `:h hitest.vim`) {{{ + +call s:h("ColorColumn", { "bg": s:cursor_grey }) " used for the columns set with 'colorcolumn' +call s:h("Conceal", {}) " placeholder characters substituted for concealed text (see 'conceallevel') +call s:h("Cursor", { "fg": s:black, "bg": s:blue }) " the character under the cursor +call s:h("CursorIM", {}) " like Cursor, but used when in IME mode +call s:h("CursorColumn", { "bg": s:cursor_grey }) " the screen column that the cursor is in when 'cursorcolumn' is set +call s:h("CursorLine", { "bg": s:cursor_grey }) " the screen line that the cursor is in when 'cursorline' is set +call s:h("Directory", { "fg": s:blue }) " directory names (and other special names in listings) +call s:h("DiffAdd", { "bg": s:green, "fg": s:black }) " diff mode: Added line +call s:h("DiffChange", { "bg": s:yellow, "fg": s:black }) " diff mode: Changed line +call s:h("DiffDelete", { "bg": s:red, "fg": s:black }) " diff mode: Deleted line +call s:h("DiffText", { "bg": s:black, "fg": s:yellow }) " diff mode: Changed text within a changed line +call s:h("ErrorMsg", { "fg": s:red }) " error messages on the command line +call s:h("VertSplit", { "fg": s:vertsplit }) " the column separating vertically split windows +call s:h("Folded", { "bg": s:cursor_grey, "fg": s:comment_grey }) " line used for closed folds +call s:h("FoldColumn", {}) " 'foldcolumn' +call s:h("SignColumn", {}) " column where signs are displayed +call s:h("IncSearch", { "fg": s:yellow, "bg": s:comment_grey }) " 'incsearch' highlighting; also used for the text replaced with ":s///c" +call s:h("LineNr", { "fg": s:gutter_fg_grey }) " Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. +call s:h("CursorLineNr", {}) " Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. +call s:h("MatchParen", { "fg": s:blue, "gui": "underline" }) " The character under the cursor or just before it, if it is a paired bracket, and its match. +call s:h("ModeMsg", {}) " 'showmode' message (e.g., "-- INSERT --") +call s:h("MoreMsg", {}) " more-prompt +call s:h("NonText", { "fg": s:special_grey }) " '~' and '@' at the end of the window, characters from 'showbreak' and other characters that do not really exist in the text (e.g., ">" displayed when a double-wide character doesn't fit at the end of the line). +call s:h("Normal", { "fg": s:white, "bg": s:black }) " normal text +call s:h("Pmenu", { "bg": s:menu_grey }) " Popup menu: normal item. +call s:h("PmenuSel", { "fg": s:black, "bg": s:blue }) " Popup menu: selected item. +call s:h("PmenuSbar", { "bg": s:special_grey }) " Popup menu: scrollbar. +call s:h("PmenuThumb", { "bg": s:white }) " Popup menu: Thumb of the scrollbar. +call s:h("Question", { "fg": s:purple }) " hit-enter prompt and yes/no questions +call s:h("Search", { "fg": s:black, "bg": s:yellow }) " Last search pattern highlighting (see 'hlsearch'). Also used for highlighting the current line in the quickfix window and similar items that need to stand out. +call s:h("SpecialKey", { "fg": s:special_grey }) " Meta and special keys listed with ":map", also for text used to show unprintable characters in the text, 'listchars'. Generally: text that is displayed differently from what it really is. +call s:h("SpellBad", { "fg": s:red, "gui": "underline", "cterm": "underline" }) " Word that is not recognized by the spellchecker. This will be combined with the highlighting used otherwise. +call s:h("SpellCap", { "fg": s:dark_yellow }) " Word that should start with a capital. This will be combined with the highlighting used otherwise. +call s:h("SpellLocal", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is used in another region. This will be combined with the highlighting used otherwise. +call s:h("SpellRare", { "fg": s:dark_yellow }) " Word that is recognized by the spellchecker as one that is hardly ever used. spell This will be combined with the highlighting used otherwise. +call s:h("StatusLine", { "fg": s:white, "bg": s:cursor_grey }) " status line of current window +call s:h("StatusLineNC", { "fg": s:comment_grey }) " status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. +call s:h("TabLine", { "fg": s:comment_grey }) " tab pages line, not active tab page label +call s:h("TabLineFill", {}) " tab pages line, where there are no labels +call s:h("TabLineSel", { "fg": s:white }) " tab pages line, active tab page label +call s:h("Title", { "fg": s:green }) " titles for output from ":set all", ":autocmd" etc. +call s:h("Visual", { "fg": s:visual_black, "bg": s:visual_grey }) " Visual mode selection +call s:h("VisualNOS", { "bg": s:visual_grey }) " Visual mode selection when vim is "Not Owning the Selection". Only X11 Gui's gui-x11 and xterm-clipboard supports this. +call s:h("WarningMsg", { "fg": s:yellow }) " warning messages +call s:h("WildMenu", { "fg": s:black, "bg": s:blue }) " current match in 'wildmenu' completion + +" }}} + +" Language-Specific Highlighting {{{ + +" Dockerfile +call s:h("dockerfileKeyword", { "fg": s:purple }) + +" Shell +call s:h("shSet", { "fg": s:cyan }) +call s:h("shSetOption", { "fg": s:white }) +call s:h("shStatement", { "fg": s:cyan }) +call s:h("shFunctionKey", { "fg": s:purple }) + +" CSS +call s:h("cssAttrComma", { "fg": s:purple }) +call s:h("cssAttributeSelector", { "fg": s:green }) +call s:h("cssBraces", { "fg": s:white }) +call s:h("cssClassName", { "fg": s:dark_yellow }) +call s:h("cssClassNameDot", { "fg": s:dark_yellow }) +call s:h("cssDefinition", { "fg": s:purple }) +call s:h("cssFontAttr", { "fg": s:dark_yellow }) +call s:h("cssFontDescriptor", { "fg": s:purple }) +call s:h("cssFunctionName", { "fg": s:blue }) +call s:h("cssIdentifier", { "fg": s:blue }) +call s:h("cssImportant", { "fg": s:purple }) +call s:h("cssInclude", { "fg": s:white }) +call s:h("cssIncludeKeyword", { "fg": s:purple }) +call s:h("cssMediaType", { "fg": s:dark_yellow }) +call s:h("cssProp", { "fg": s:white }) +call s:h("cssPseudoClassId", { "fg": s:dark_yellow }) +call s:h("cssSelectorOp", { "fg": s:purple }) +call s:h("cssSelectorOp2", { "fg": s:purple }) +call s:h("cssTagName", { "fg": s:red }) + +" Go +call s:h("goDeclaration", { "fg": s:purple }) + +" HTML +call s:h("htmlTitle", { "fg": s:white }) +call s:h("htmlArg", { "fg": s:yellow }) +call s:h("htmlEndTag", { "fg": s:cyan }) +call s:h("htmlH1", { "fg": s:white }) +call s:h("htmlLink", { "fg": s:purple }) +call s:h("htmlSpecialChar", { "fg": s:dark_yellow }) +call s:h("htmlSpecialTagName", { "fg": s:red }) +call s:h("htmlTag", { "fg": s:cyan }) +call s:h("htmlTagName", { "fg": s:red }) + +" Coffeescript +call s:h("coffeeExtendedOp", { "fg": s:purple }) + +" JavaScript +call s:h("javaScriptBraces", { "fg": s:white }) +call s:h("javaScriptFunction", { "fg": s:purple }) +call s:h("javaScriptIdentifier", { "fg": s:purple }) +call s:h("javaScriptNull", { "fg": s:dark_yellow }) +call s:h("javaScriptNumber", { "fg": s:dark_yellow }) +call s:h("javaScriptRequire", { "fg": s:cyan }) +call s:h("javaScriptReserved", { "fg": s:purple }) +" https://github.com/pangloss/vim-javascript +call s:h("jsArrowFunction", { "fg": s:purple }) +call s:h("jsClassKeyword", { "fg": s:purple }) +call s:h("jsClassDefinition", { "fg": s:yellow }) +call s:h("jsClassMethodType", { "fg": s:purple }) +call s:h("jsClassFuncName", { "fg": s:blue }) +call s:h("jsDestructuringBlock", { "fg": s:blue }) +call s:h("jsDocParam", { "fg": s:blue }) +call s:h("jsDocTags", { "fg": s:purple }) +call s:h("jsExport", { "fg": s:purple }) +call s:h("jsExportDefault", { "fg": s:red }) +call s:h("jsExtendsKeyword", { "fg": s:purple }) +call s:h("jsConditional", { "fg": s:purple }) +call s:h("jsOperator", { "fg": s:purple }) +call s:h("jsFrom", { "fg": s:purple }) +call s:h("jsFuncArgs", { "fg": s:blue }) +call s:h("jsFuncCall", { "fg": s:blue }) +call s:h("jsFuncName", { "fg": s:blue }) +call s:h("jsObjectProp", { "fg": s:cyan }) +call s:h("jsFunction", { "fg": s:purple }) +call s:h("jsGenerator", { "fg": s:yellow }) +call s:h("jsGlobalObjects", { "fg": s:yellow }) +call s:h("jsImport", { "fg": s:purple }) +call s:h("jsModuleAs", { "fg": s:purple }) +call s:h("jsModuleWords", { "fg": s:purple }) +call s:h("jsModuleKeyword", { "fg": s:blue }) +call s:h("jsModules", { "fg": s:purple }) +call s:h("jsNull", { "fg": s:dark_yellow }) +call s:h("jsStorageClass", { "fg": s:purple }) +call s:h("jsSuper", { "fg": s:red }) +call s:h("jsTemplateBraces", { "fg": s:dark_red }) +call s:h("jsTemplateVar", { "fg": s:green }) +call s:h("jsThis", { "fg": s:red }) +call s:h("jsUndefined", { "fg": s:dark_yellow }) +" call s:h("jsVariableDef", { "fg": s:blue }) +" https://github.com/othree/yajs.vim +call s:h("javascriptArrowFunc", { "fg": s:purple }) +call s:h("javascriptClassExtends", { "fg": s:purple }) +call s:h("javascriptClassKeyword", { "fg": s:purple }) +call s:h("javascriptDocNotation", { "fg": s:purple }) +call s:h("javascriptDocParamName", { "fg": s:blue }) +call s:h("javascriptDocTags", { "fg": s:purple }) +call s:h("javascriptEndColons", { "fg": s:white }) +call s:h("javascriptExport", { "fg": s:purple }) +call s:h("javascriptFuncArg", { "fg": s:white }) +call s:h("javascriptFuncKeyword", { "fg": s:purple }) +call s:h("javascriptIdentifier", { "fg": s:red }) +call s:h("javascriptImport", { "fg": s:purple }) +call s:h("javascriptMethodName", { "fg": s:white }) +call s:h("javascriptObjectLabel", { "fg": s:white }) +call s:h("javascriptOpSymbol", { "fg": s:cyan }) +call s:h("javascriptOpSymbols", { "fg": s:cyan }) +call s:h("javascriptPropertyName", { "fg": s:green }) +call s:h("javascriptTemplateSB", { "fg": s:dark_red }) +call s:h("javascriptVariable", { "fg": s:purple }) + +" JSON +call s:h("jsonCommentError", { "fg": s:white }) +call s:h("jsonKeyword", { "fg": s:blue }) +call s:h("jsonBoolean", { "fg": s:red }) +call s:h("jsonNumber", { "fg": s:dark_yellow }) +call s:h("jsonQuote", { "fg": s:white }) +call s:h("jsonMissingCommaError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNoQuotesError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonNumError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonString", { "fg": s:green }) +call s:h("jsonStringSQError", { "fg": s:red, "gui": "reverse" }) +call s:h("jsonSemicolonError", { "fg": s:red, "gui": "reverse" }) + +" Markdown +call s:h("markdownCode", { "fg": s:green }) +call s:h("markdownLinkReference", { "fg": s:comment_grey }) +call s:h("markdownJekyllFrontMatter", { "fg": s:comment_grey }) +call s:h("markdownCodeBlock", { "fg": s:green }) +call s:h("markdownCodeDelimiter", { "fg": s:green }) +call s:h("markdownHeadingDelimiter", { "fg": s:red }) +call s:h("markdownRule", { "fg": s:comment_grey }) +call s:h("markdownHeadingRule", { "fg": s:comment_grey }) +call s:h("htmlH1", { "fg": s:blue }) +call s:h("htmlH2", { "fg": s:blue }) +call s:h("htmlH3", { "fg": s:blue }) +call s:h("htmlH4", { "fg": s:blue }) +call s:h("htmlH5", { "fg": s:blue }) +call s:h("htmlH6", { "fg": s:blue }) +call s:h("mkdDelimiter", { "fg": s:cyan }) +call s:h("markdownId", { "fg": s:purple }) +call s:h("markdownBlockquote", { "fg": s:comment_grey }) +call s:h("markdownItalic", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("mkdBold", { "fg": s:yellow, "gui": "bold", "cterm": "bold" }) +call s:h("mkdInlineURL", { "fg": s:light_red }) +call s:h("mkdListItem", { "fg": s:yellow }) +call s:h("markdownOrderedListMarker", { "fg": s:red }) +call s:h("markdownIdDeclaration", { "fg": s:blue }) +call s:h("mkdLink", { "fg": s:white }) +call s:h("markdownLinkDelimiter", { "fg": s:white }) +call s:h("mkdURL", { "fg": s:light_red }) + +" Ruby +call s:h("rubyAccess", { "fg": s:cyan }) +call s:h("rubyBlockParameter", { "fg": s:yellow}) +call s:h("rubyBlockParameterList", { "fg": s:white }) +call s:h("rubyBoolean", { "fg": s:red }) +call s:h("rubyCapitalizedMethod", { "fg": s:blue}) +call s:h("rubyClass", { "fg": s:purple}) +call s:h("rubyClassName", { "fg": s:yellow }) +call s:h("rubyConstant", { "fg": s:yellow }) +call s:h("rubyControl", { "fg": s:purple }) +call s:h("rubyEscape", { "fg": s:red}) +call s:h("rubyFunction", { "fg": s:blue}) +call s:h("rubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInclude", { "fg": s:cyan}) +call s:h("rubyIncluderubyGlobalVariable", { "fg": s:red}) +call s:h("rubyInstanceVariable", { "fg": s:red}) +call s:h("rubyInterpolation", { "fg": s:cyan }) +call s:h("rubyInterpolationDelimiter", { "fg": s:red }) +call s:h("rubyModuleName", { "fg": s:white }) +call s:h("rubyKeyword", { "fg": s:purple }) +call s:h("rubyKeywordAsMethod", { "fg": s:cyan}) +call s:h("rubyOperator", { "fg": s:purple }) +call s:h("rubyPredefinedConstant", { "fg": s:yellow}) +call s:h("rubyPseudoVariable", { "fg": s:blue }) +call s:h("rubyRegexp", { "fg": s:white}) +call s:h("rubyRegexpDelimiter", { "fg": s:cyan}) +call s:h("rubySharpBang", { "fg": s:comment_grey}) +call s:h("rubyStringDelimiter", { "fg": s:green}) +call s:h("rubySymbol", { "fg": s:blue}) + +" ERb +call s:h("erubyDelimiter", { "fg": s:red }) + +" Rails +call s:h("railsAssetPreProc", { "fg": s:comment_grey }) +call s:h("railsAssetInclude", { "fg": s:comment_grey }) +call s:h("railsAssetIncluded", { "fg": s:comment_grey }) +call s:h("rubyRailsMethod", { "fg": s:blue }) +call s:h("rubyRailsFilterMethod", { "fg": s:cyan }) +call s:h("rubyRailsRenderMethod", { "fg": s:cyan }) +call s:h("rubyRailsARAssociationMethod", { "fg": s:cyan }) +call s:h("rubyRailsHelperMethod", { "fg": s:cyan }) + +" RSpec +call s:h("rspecGroupMethods", { "fg": s:white }) +call s:h("rspecBeforeAndAfter", { "fg": s:white }) + +" CSS +call s:h("cssColor", { "fg": s:dark_yellow }) +call s:h("cssCommonAttr", { "fg": s:blue }) +call s:h("cssProp", { "fg": s:cyan }) +call s:h("cssSelectorOp", { "fg": s:white }) +call s:h("cssUnitDecorators", { "fg": s:yellow }) + +" Sass +" https://github.com/tpope/vim-haml +call s:h("sassAmpersand", { "fg": s:red }) +call s:h("sassClass", { "fg": s:dark_yellow }) +call s:h("sassControl", { "fg": s:purple }) +call s:h("sassExtend", { "fg": s:purple }) +call s:h("sassFor", { "fg": s:white }) +call s:h("sassFunction", { "fg": s:cyan }) +call s:h("sassId", { "fg": s:blue }) +call s:h("sassInclude", { "fg": s:purple }) +call s:h("sassMedia", { "fg": s:purple }) +call s:h("sassMediaOperators", { "fg": s:white }) +call s:h("sassMixin", { "fg": s:purple }) +call s:h("sassMixinName", { "fg": s:blue }) +call s:h("sassMixing", { "fg": s:purple }) +call s:h("sassVariable", { "fg": s:dark_yellow }) +" https://github.com/cakebaker/scss-syntax.vim +call s:h("scssExtend", { "fg": s:purple }) +call s:h("scssExtendedSelector", { "fg": s:dark_yellow }) +call s:h("scssFunctionName", { "fg": s:cyan }) +call s:h("scssImport", { "fg": s:purple }) +call s:h("scssInclude", { "fg": s:purple }) +call s:h("scssMixin", { "fg": s:purple }) +call s:h("scssMixinName", { "fg": s:blue }) +call s:h("scssSelectorName", { "fg": s:yellow }) +call s:h("scssVariable", { "fg": s:dark_yellow }) + +" TypeScript +call s:h("typescriptReserved", { "fg": s:purple }) +call s:h("typescriptEndColons", { "fg": s:white }) +call s:h("typescriptBraces", { "fg": s:white }) + +" XML +call s:h("xmlAttrib", { "fg": s:yellow }) +call s:h("xmlEndTag", { "fg": s:red }) +call s:h("xmlTag", { "fg": s:red }) +call s:h("xmlTagName", { "fg": s:red }) + +" PHP +call s:h("phpInclude", { "fg": s:purple }) +call s:h("phpClass", { "fg": s:yellow }) +call s:h("phpClasses", { "fg": s:yellow }) +call s:h("phpFunction", { "fg": s:blue }) +call s:h("phpType", { "fg": s:purple }) +call s:h("phpKeyword", { "fg": s:purple }) +call s:h("phpVarSelector", { "fg": s:white }) +call s:h("phpIdentifier", { "fg": s:white }) +call s:h("phpMethod", { "fg": s:blue }) +call s:h("phpBoolean", { "fg": s:blue }) +call s:h("phpParent", { "fg": s:white }) +call s:h("phpOperator", { "fg": s:purple }) +call s:h("phpRegion", { "fg": s:purple }) +call s:h("phpUseNamespaceSeparator", { "fg": s:white }) +call s:h("phpClassNamespaceSeparator", { "fg": s:white }) +call s:h("phpDocTags", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) +call s:h("phpDocParam", { "fg": s:purple, "gui": "italic", "cterm": "italic" }) + +" Dart +call s:h("dartLibrary", { "fg": s:purple}) +call s:h("dartTypedef", { "fg": s:purple}) +call s:h("dartClassDecl", { "fg": s:purple}) +call s:h("dartCoreType", { "fg": s:purple}) +call s:h("dartStorageClass", { "fg": s:purple}) +call s:h("dartOperator", { "fg": s:purple}) +call s:h("dartMetadata", { "fg": s:purple}) +call s:h("dartKeyword", { "fg": s:purple}) + +" }}} + +" Plugin Highlighting {{{ + +" airblade/vim-gitgutter +hi link GitGutterAdd SignifySignAdd +hi link GitGutterChange SignifySignChange +hi link GitGutterDelete SignifySignDelete + +" mhinz/vim-signify +call s:h("SignifySignAdd", { "fg": s:green }) +call s:h("SignifySignChange", { "fg": s:yellow }) +call s:h("SignifySignDelete", { "fg": s:red }) + +" neomake/neomake +call s:h("NeomakeWarningSign", { "fg": s:yellow }) +call s:h("NeomakeErrorSign", { "fg": s:red }) +call s:h("NeomakeInfoSign", { "fg": s:blue }) + +" tpope/vim-fugitive +call s:h("diffAdded", { "fg": s:green }) +call s:h("diffRemoved", { "fg": s:red }) + +" liuchengxu/vista.vim +call s:h("VistaBracket", { "fg": s:purple }) +call s:h("VistaChildrenNr", { "fg": s:dark_yellow }) +call s:h("VistaScope", { "fg": s:blue_purple }) +call s:h("VistaTag", { "fg": s:purple }) +call s:h("VistaPrefix", { "fg": s:blue_purple }) +call s:h("VistaParenthesis", { "fg": s:purple }) +call s:h("VistaColon", { "fg": s:cyan }) +call s:h("VistaIcon", { "fg": s:cyan }) +call s:h("VistaLineNr", { "fg": s:comment_grey }) +call s:h("VistaArgs", { "fg": s:comment_grey }) +call s:h("VistaKind", { "fg": s:comment_grey }) +call s:h("VistaScopeKind", { "fg": s:yellow }) + +" termdebug +call s:h("debugBreakpoint", { "fg": s:blue_purple }) +call s:h("debugPC", { "bg": s:blue_purple, "fg": s:black }) + +" davidhalter/jedi-vim +call s:h("jediFunction", { "bg": s:white_mask_3, "fg": s:white }) +call s:h("jediFat", { "bg": s:white_mask_3, "fg": s:blue , "gui": "bold,underline" }) + +" }}} + +" Git Highlighting {{{ + +call s:h("gitcommitComment", { "fg": s:comment_grey }) +call s:h("gitcommitUnmerged", { "fg": s:green }) +call s:h("gitcommitOnBranch", {}) +call s:h("gitcommitBranch", { "fg": s:purple }) +call s:h("gitcommitDiscardedType", { "fg": s:red }) +call s:h("gitcommitSelectedType", { "fg": s:green }) +call s:h("gitcommitHeader", {}) +call s:h("gitcommitUntrackedFile", { "fg": s:cyan }) +call s:h("gitcommitDiscardedFile", { "fg": s:red }) +call s:h("gitcommitSelectedFile", { "fg": s:green }) +call s:h("gitcommitUnmergedFile", { "fg": s:yellow }) +call s:h("gitcommitFile", {}) +call s:h("gitcommitSummary", { "fg": s:white }) +call s:h("gitcommitOverflow", { "fg": s:red }) +hi link gitcommitNoBranch gitcommitBranch +hi link gitcommitUntracked gitcommitComment +hi link gitcommitDiscarded gitcommitComment +hi link gitcommitSelected gitcommitComment +hi link gitcommitDiscardedArrow gitcommitDiscardedFile +hi link gitcommitSelectedArrow gitcommitSelectedFile +hi link gitcommitUnmergedArrow gitcommitUnmergedFile + +" }}} + +" Setup Terminal Colors {{{ + +if has("nvim") + let g:terminal_color_0 = s:black.gui + let g:terminal_color_1 = s:red.gui + let g:terminal_color_2 = s:green.gui + let g:terminal_color_3 = s:yellow.gui + let g:terminal_color_4 = s:blue.gui + let g:terminal_color_5 = s:purple.gui + let g:terminal_color_6 = s:cyan.gui + let g:terminal_color_7 = s:white.gui + let g:terminal_color_8 = s:visual_grey.gui + let g:terminal_color_9 = s:dark_red.gui + let g:terminal_color_10 = s:green.gui " No dark version + let g:terminal_color_11 = s:dark_yellow.gui + let g:terminal_color_12 = s:blue.gui " No dark version + let g:terminal_color_13 = s:purple.gui " No dark version + let g:terminal_color_14 = s:cyan.gui " No dark version + let g:terminal_color_15 = s:comment_grey.gui + let g:terminal_color_background = g:terminal_color_0 + let g:terminal_color_foreground = g:terminal_color_7 +elseif has('terminal') + let g:terminal_ansi_colors = [ + \ s:black.gui, + \ s:red.gui, + \ s:green.gui, + \ s:yellow.gui, + \ s:blue.gui, + \ s:purple.gui, + \ s:cyan.gui, + \ s:white.gui, + \ s:visual_grey.gui, + \ s:dark_red.gui, + \ s:green.gui, + \ s:dark_yellow.gui, + \ s:blue.gui, + \ s:purple.gui, + \ s:cyan.gui, + \ s:white.gui + \ ] +endif + +" }}} + +" Must appear at the end of the file to work around this oddity: +" https://groups.google.com/forum/#!msg/vim_dev/afPqwAFNdrU/nqh6tOM87QUJ +set background=dark + diff --git a/.vim/colors/palenight/images/screenshot.png b/.vim/colors/palenight/images/screenshot.png new file mode 100755 index 0000000..8bbf76d Binary files /dev/null and b/.vim/colors/palenight/images/screenshot.png differ diff --git a/.vim/colors/vim-janah b/.vim/colors/vim-janah deleted file mode 160000 index 3b8ae97..0000000 --- a/.vim/colors/vim-janah +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3b8ae976987b6ade2abeac25f0208e8bc90d7138 diff --git a/.vim/colors/vim-janah/README.md b/.vim/colors/vim-janah/README.md new file mode 100755 index 0000000..376fae1 --- /dev/null +++ b/.vim/colors/vim-janah/README.md @@ -0,0 +1,22 @@ +A dark colorscheme for Vim. + +- works with 256 color terminals and GUI +- supports [Neovim](https://github.com/neovim/neovim)'s new highlight groups +- supports highlighting groups for these plugins: [vim-startify](https://github.com/mhinz/vim-startify) | +[vim-signify](https://github.com/mhinz/vim-signify) | +[vim-rfc](https://github.com/mhinz/vim-rfc) | +[vim-easymotion](https://github.com/easymotion/vim-easymotion) + +![Janah in action](https://raw.githubusercontent.com/mhinz/vim-janah/master/janah.png) + +__NOTE__: No background color will be set if used in a terminal emulator. If +the colorscheme doesn't look good with your terminal's default background +color, put this in your vimrc: + +```vim +autocmd ColorScheme janah highlight Normal ctermbg=235 +colorscheme janah +``` + +If you set `'background'` in your vimrc, make sure to do that before setting +the above, because of a [Vim bug](https://github.com/mhinz/vim-janah/issues/2). diff --git a/.vim/colors/vim-janah/colors/janah.vim b/.vim/colors/vim-janah/colors/janah.vim new file mode 100755 index 0000000..1ba2e47 --- /dev/null +++ b/.vim/colors/vim-janah/colors/janah.vim @@ -0,0 +1,148 @@ +" vim: et sw=2 sts=2 + +" Plugin: https://github.com/mhinz/vim-janah +" Description: A 256 colors colorscheme for Vim. +" Maintainer: Marco Hinz + +highlight clear + +if exists('syntax_on') + syntax reset +endif + +highlight Normal guifg=#dadada ctermfg=253 guibg=#262626 gui=NONE cterm=NONE + +" Misc {{{1 + +highlight Comment guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Constant guifg=#87dfdf ctermfg=116 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Directory guifg=#ffaf87 ctermfg=216 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight EndOfBuffer guifg=#262626 ctermfg=235 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Identifier guifg=#ffaf87 ctermfg=216 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight MatchParen guifg=#df005f ctermfg=161 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight NonText guifg=#ff00af ctermfg=199 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight Number guifg=#87dfdf ctermfg=116 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight PreProc guifg=#ffdfaf ctermfg=223 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Special guifg=#dfafaf ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight SpecialKey guifg=#3a3a3a ctermfg=237 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Statement guifg=#afdf87 ctermfg=150 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight String guifg=#87afdf ctermfg=110 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Title guifg=#afff87 ctermfg=156 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Todo guifg=#ffdfaf ctermfg=223 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight Type guifg=#87dfaf ctermfg=115 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight VertSplit guifg=#3a3a3a ctermfg=237 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE +highlight WildMenu guifg=#df005f ctermfg=161 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold + +" Cursor lines {{{1 + +highlight CursorColumn ctermfg=NONE guibg=#303030 ctermbg=236 gui=NONE cterm=NONE +highlight CursorLine ctermfg=NONE guibg=#303030 ctermbg=236 gui=NONE cterm=NONE + +" Tabline {{{1 + +highlight TabLine guifg=#808080 ctermfg=244 guibg=#303030 ctermbg=236 gui=NONE cterm=NONE +highlight TabLineFill guifg=#dfdfaf ctermfg=187 guibg=#303030 ctermbg=236 gui=NONE cterm=NONE +highlight TabLineSel guifg=#e4e4e4 ctermfg=254 guibg=#303030 ctermbg=236 gui=bold cterm=bold + +" Statusline {{{1 + +highlight StatusLine guifg=#e4e4e4 ctermfg=254 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE +highlight StatusLineNC guifg=#808080 ctermfg=244 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +" Number column {{{1 + +highlight CursorLineNr guifg=#878787 ctermfg=102 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE +highlight LineNr guifg=#878787 ctermfg=102 guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +" Color column {{{1 + +highlight ColorColumn ctermfg=NONE guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +" Diff & Signs {{{1 + +highlight SignColumn ctermfg=NONE guibg=#3a3a3a ctermbg=237 gui=NONE cterm=NONE + +highlight DiffAdd guifg=#87ff5f ctermfg=119 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight DiffDelete guifg=#df5f5f ctermfg=167 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight DiffChange guifg=#ffff5f ctermfg=227 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight DiffText guifg=#ff5f5f ctermfg=203 guibg=#5f0000 ctermbg=52 gui=bold cterm=bold + +" Folds {{{1 + +highlight FoldColumn ctermfg=102 ctermbg=237 cterm=NONE guifg=#878787 guibg=#3a3a3a gui=NONE +highlight Folded ctermfg=102 ctermbg=237 cterm=NONE guifg=#878787 guibg=#3a3a3a gui=NONE + +" Search {{{1 + +highlight IncSearch guifg=#c0c0c0 ctermfg=7 guibg=#005fff ctermbg=27 gui=NONE cterm=NONE +highlight Search guifg=#c0c0c0 ctermfg=7 guibg=#df005f ctermbg=161 gui=NONE cterm=NONE + +" Messages {{{1 + +highlight Error guifg=#eeeeee ctermfg=255 guibg=#df0000 ctermbg=160 gui=NONE cterm=NONE +highlight ErrorMsg guifg=#eeeeee ctermfg=255 guibg=#df0000 ctermbg=160 gui=NONE cterm=NONE +highlight ModeMsg guifg=#afff87 ctermfg=156 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight MoreMsg guifg=#c0c0c0 ctermfg=7 guibg=#005fdf ctermbg=26 gui=NONE cterm=NONE +highlight WarningMsg guifg=#c0c0c0 ctermfg=7 guibg=#005fdf ctermbg=26 gui=NONE cterm=NONE + +" Visual {{{1 + +highlight Visual guifg=#c0c0c0 ctermfg=7 guibg=#005f87 ctermbg=24 gui=NONE cterm=NONE +highlight VisualNOS guifg=#c0c0c0 ctermfg=7 guibg=#5f5f87 ctermbg=60 gui=NONE cterm=NONE + +" Pmenu {{{1 + +highlight Pmenu guifg=#e4e4e4 ctermfg=254 guibg=#262626 ctermbg=235 gui=NONE cterm=NONE +highlight PmenuSbar ctermfg=NONE guibg=#444444 ctermbg=238 gui=NONE cterm=NONE +highlight PmenuSel guifg=#df5f5f ctermfg=167 guibg=#444444 ctermbg=238 gui=bold cterm=bold +highlight PmenuThumb ctermfg=NONE guibg=#df5f5f ctermbg=167 gui=NONE cterm=NONE + +" Spell {{{1 +highlight SpellBad guifg=#c0c0c0 ctermfg=7 guibg=#df5f5f ctermbg=167 gui=NONE cterm=NONE +highlight SpellCap guifg=#c0c0c0 ctermfg=7 guibg=#005fdf ctermbg=26 gui=NONE cterm=NONE +highlight SpellLocal guifg=#c0c0c0 ctermfg=7 guibg=#8700af ctermbg=91 gui=NONE cterm=NONE +highlight SpellRare guifg=#c0c0c0 ctermfg=7 guibg=#00875f ctermbg=29 gui=NONE cterm=NONE + +" Quickfix {{{1 +highlight qfLineNr ctermfg=238 ctermbg=NONE cterm=NONE guifg=#444444 guibg=NONE gui=NONE +highlight qfSeparator ctermfg=243 ctermbg=NONE cterm=NONE guifg=#767676 guibg=NONE gui=NONE + +" Plugin: vim-easymotion {{{1 +highlight EasyMotionTarget guifg=#ffff5f ctermfg=227 guibg=NONE ctermbg=NONE gui=bold cterm=bold +highlight EasyMotionTarget2First guifg=#df005f ctermfg=161 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight EasyMotionTarget2Second guifg=#ffff5f ctermfg=227 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Plugin: vim-rfc {{{1 +highlight RFCType guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight RFCID guifg=#ffaf5f ctermfg=215 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight RFCTitle guifg=#eeeeee ctermfg=255 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight RFCDelim guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Plugin: vim-signify {{{1 +highlight SignifySignAdd guifg=#87ff5f ctermfg=119 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold +highlight SignifySignDelete guifg=#df5f5f ctermfg=167 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold +highlight SignifySignChange guifg=#ffff5f ctermfg=227 guibg=#3a3a3a ctermbg=237 gui=bold cterm=bold + +" Plugin: vim-startify {{{1 +highlight StartifyBracket guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyFile guifg=#eeeeee ctermfg=255 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyFooter guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyHeader guifg=#87df87 ctermfg=114 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyNumber guifg=#ffaf5f ctermfg=215 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifyPath guifg=#8a8a8a ctermfg=245 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySection guifg=#dfafaf ctermfg=181 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySelect guifg=#5fdfff ctermfg=81 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySlash guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE +highlight StartifySpecial guifg=#585858 ctermfg=240 guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" Neovim {{{1 + +highlight TermCursor ctermfg=NONE guibg=#ff00af ctermbg=199 gui=NONE cterm=NONE +highlight TermCursorNC ctermfg=NONE guibg=NONE ctermbg=NONE gui=NONE cterm=NONE + +" HTML {{{1 + +highlight link htmlTagN htmlTagName + + +let g:colors_name = 'janah' diff --git a/.vim/colors/vim-janah/janah.png b/.vim/colors/vim-janah/janah.png new file mode 100755 index 0000000..566a9c4 Binary files /dev/null and b/.vim/colors/vim-janah/janah.png differ diff --git a/.vim/colors/vim-monokai b/.vim/colors/vim-monokai deleted file mode 160000 index ae77538..0000000 --- a/.vim/colors/vim-monokai +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ae7753878f8740fbdb2cef5617911ef83255349b diff --git a/.vim/colors/vim-monokai/LICENSE.txt b/.vim/colors/vim-monokai/LICENSE.txt new file mode 100755 index 0000000..db80871 --- /dev/null +++ b/.vim/colors/vim-monokai/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2009-2016 Marcin Kulik + +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. diff --git a/.vim/colors/vim-monokai/README.md b/.vim/colors/vim-monokai/README.md new file mode 100755 index 0000000..2c15ac7 --- /dev/null +++ b/.vim/colors/vim-monokai/README.md @@ -0,0 +1,15 @@ +# vim-monokai + +Monokai color scheme for Vim converted with [coloration](https://github.com/sickill/coloration) from Textmate theme with the same name. + +## Screenshots + +![Monokai in Vim](https://i.imgur.com/NPX2MXM.png) + + +## Installation + +Put `monokai.vim` file in your `~/.vim/colors/` directory and add the following line to your `~/.vimrc`: + + syntax enable + colorscheme monokai diff --git a/.vim/colors/vim-monokai/colors/monokai.vim b/.vim/colors/vim-monokai/colors/monokai.vim new file mode 100755 index 0000000..1b4f167 --- /dev/null +++ b/.vim/colors/vim-monokai/colors/monokai.vim @@ -0,0 +1,109 @@ +" Vim color file +" Converted from Textmate theme Monokai using Coloration v0.3.2 (http://github.com/sickill/coloration) + +set background=dark +highlight clear + +if exists("syntax_on") + syntax reset +endif + +set t_Co=256 +let g:colors_name = "monokai" + +hi Cursor ctermfg=235 ctermbg=231 cterm=NONE guifg=#272822 guibg=#f8f8f0 gui=NONE +hi Visual ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#49483e gui=NONE +hi CursorLine ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi CursorColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi ColorColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi LineNr ctermfg=102 ctermbg=237 cterm=NONE guifg=#90908a guibg=#3c3d37 gui=NONE +hi VertSplit ctermfg=241 ctermbg=241 cterm=NONE guifg=#64645e guibg=#64645e gui=NONE +hi MatchParen ctermfg=197 ctermbg=NONE cterm=underline guifg=#f92672 guibg=NONE gui=underline +hi StatusLine ctermfg=231 ctermbg=241 cterm=bold guifg=#f8f8f2 guibg=#64645e gui=bold +hi StatusLineNC ctermfg=231 ctermbg=241 cterm=NONE guifg=#f8f8f2 guibg=#64645e gui=NONE +hi Pmenu ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi PmenuSel ctermfg=NONE ctermbg=59 cterm=NONE guifg=NONE guibg=#49483e gui=NONE +hi IncSearch term=reverse cterm=reverse ctermfg=193 ctermbg=16 gui=reverse guifg=#C4BE89 guibg=#000000 +hi Search term=reverse cterm=NONE ctermfg=231 ctermbg=24 gui=NONE guifg=#f8f8f2 guibg=#204a87 +hi Directory ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Folded ctermfg=242 ctermbg=235 cterm=NONE guifg=#75715e guibg=#272822 gui=NONE +hi SignColumn ctermfg=NONE ctermbg=237 cterm=NONE guifg=NONE guibg=#3c3d37 gui=NONE +hi Normal ctermfg=231 ctermbg=235 cterm=NONE guifg=#f8f8f2 guibg=#272822 gui=NONE +hi Boolean ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Character ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Comment ctermfg=242 ctermbg=NONE cterm=NONE guifg=#75715e guibg=NONE gui=NONE +hi Conditional ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Constant ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi Define ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi DiffAdd ctermfg=231 ctermbg=64 cterm=bold guifg=#f8f8f2 guibg=#46830c gui=bold +hi DiffDelete ctermfg=88 ctermbg=NONE cterm=NONE guifg=#8b0807 guibg=NONE gui=NONE +hi DiffChange ctermfg=NONE ctermbg=NONE cterm=NONE guifg=#f8f8f2 guibg=#243955 gui=NONE +hi DiffText ctermfg=231 ctermbg=24 cterm=bold guifg=#f8f8f2 guibg=#204a87 gui=bold +hi ErrorMsg ctermfg=231 ctermbg=197 cterm=NONE guifg=#f8f8f0 guibg=#f92672 gui=NONE +hi WarningMsg ctermfg=231 ctermbg=197 cterm=NONE guifg=#f8f8f0 guibg=#f92672 gui=NONE +hi Float ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Function ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi Identifier ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi Keyword ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Label ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi NonText ctermfg=59 ctermbg=236 cterm=NONE guifg=#49483e guibg=#31322c gui=NONE +hi Number ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi Operator ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi PreProc ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Special ctermfg=231 ctermbg=NONE cterm=NONE guifg=#f8f8f2 guibg=NONE gui=NONE +hi SpecialComment ctermfg=242 ctermbg=NONE cterm=NONE guifg=#75715e guibg=NONE gui=NONE +hi SpecialKey ctermfg=59 ctermbg=237 cterm=NONE guifg=#49483e guibg=#3c3d37 gui=NONE +hi Statement ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi StorageClass ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi String ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi Tag ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Title ctermfg=231 ctermbg=NONE cterm=bold guifg=#f8f8f2 guibg=NONE gui=bold +hi Todo ctermfg=95 ctermbg=NONE cterm=inverse,bold guifg=#75715e guibg=NONE gui=inverse,bold +hi Type ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline guifg=NONE guibg=NONE gui=underline +hi rubyClass ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyFunction ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi rubyInterpolationDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubySymbol ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi rubyConstant ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi rubyStringDelimiter ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi rubyBlockParameter ctermfg=208 ctermbg=NONE cterm=NONE guifg=#fd971f guibg=NONE gui=italic +hi rubyInstanceVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyInclude ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyGlobalVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyRegexp ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi rubyRegexpDelimiter ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi rubyEscape ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi rubyControl ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyClassVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyOperator ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyException ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi rubyPseudoVariable ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi rubyRailsUserClass ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi rubyRailsARAssociationMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi rubyRailsARMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi rubyRailsRenderMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi rubyRailsMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi erubyDelimiter ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi erubyComment ctermfg=95 ctermbg=NONE cterm=NONE guifg=#75715e guibg=NONE gui=NONE +hi erubyRailsMethod ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi htmlTag ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi htmlEndTag ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi htmlTagName ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlArg ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi htmlSpecialChar ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi javaScriptFunction ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=italic +hi javaScriptRailsFunction ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi javaScriptBraces ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi yamlKey ctermfg=197 ctermbg=NONE cterm=NONE guifg=#f92672 guibg=NONE gui=NONE +hi yamlAnchor ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi yamlAlias ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE +hi yamlDocumentHeader ctermfg=186 ctermbg=NONE cterm=NONE guifg=#e6db74 guibg=NONE gui=NONE +hi cssURL ctermfg=208 ctermbg=NONE cterm=NONE guifg=#fd971f guibg=NONE gui=italic +hi cssFunctionName ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi cssColor ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi cssPseudoClassId ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi cssClassName ctermfg=148 ctermbg=NONE cterm=NONE guifg=#a6e22e guibg=NONE gui=NONE +hi cssValueLength ctermfg=141 ctermbg=NONE cterm=NONE guifg=#ae81ff guibg=NONE gui=NONE +hi cssCommonAttr ctermfg=81 ctermbg=NONE cterm=NONE guifg=#66d9ef guibg=NONE gui=NONE +hi cssBraces ctermfg=NONE ctermbg=NONE cterm=NONE guifg=NONE guibg=NONE gui=NONE