From 7787b7ade08fb01cdbbc27a89b00761799c619ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Sat, 20 Mar 2021 19:16:28 +0100 Subject: [PATCH 01/35] Add initial colorscheme --- colors/monotone.vim | 3 + lua/lush_theme/monotone.lua | 286 ++++++++++++++++++++++++++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 colors/monotone.vim create mode 100644 lua/lush_theme/monotone.lua diff --git a/colors/monotone.vim b/colors/monotone.vim new file mode 100644 index 0000000..10835dd --- /dev/null +++ b/colors/monotone.vim @@ -0,0 +1,3 @@ +let g:colors_name = 'monotone' + +lua require('lush')(require('lush_theme.monotone')) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua new file mode 100644 index 0000000..3eee56f --- /dev/null +++ b/lua/lush_theme/monotone.lua @@ -0,0 +1,286 @@ +-- +-- m o n o t o n e +-- +-- +-- Copyright 2021 Kim Silkebækken +-- +-- 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. +-- +-- +-- Lua configuration example: +-- +-- vim.g.monotone_h = 85 +-- vim.g.monotone_s = 0 +-- vim.g.monotone_l = 50 +-- vim.g.monotone_contrast = 100 +-- vim.g.monotone_true_monotone = true +-- vim.o.background = 'light' +-- + +local lush = require('lush') +local hsl = lush.hsl + +-- Config options +local opt = { + bg = vim.o.background, + color = hsl( + tonumber(vim.g.monotone_h) or 15, + tonumber(vim.g.monotone_s) or 5, + (tonumber(vim.g.monotone_l) or 50) + 35 + ), + contrast = (tonumber(vim.g.monotone_contrast) or 105) / 100, + true_monotone = vim.g.monotone_true_monotone or false, +} + +-- Handle dark/light background color +local offset_fn = 'lighten' +if opt.bg == 'light' then + opt.color = opt.color.darken(50) + offset_fn = 'darken' +end + +-- Monochrome shades +local shade = function(color, offset) + return color[offset_fn](offset * opt.contrast) +end +local s = { -22, -32, -46, -55, -69, -75, -88, normal = 0, inv = 100 } +for k, v in pairs(s) do + s[k] = shade(opt.color, v) +end + +-- Highlight colors +local red = shade(hsl(5, 90, s.normal.l), -25) +local yellow = shade(hsl(32, 100, s.normal.l), -25) +local blue = shade(hsl(205, 85, s.normal.l), -20) +local green = shade(hsl(90, 40, s.normal.l), -40) +local eob = shade(hsl(240, 30, s.normal.l), -40) +local nt = shade(hsl(330, 30, s.normal.l), -50) + +if opt.true_monotone then + -- Disable all colors + red = s[3] + yellow = s[2] + blue = s[1] + green = s[4] + eob = s[4] + nt = s[4] +end + +local hl1 = red +local hl2 = yellow +local hl3 = blue + +return lush(function() + return { + Normal { fg = s.normal, bg = s[7] }, -- Normal text + + SyntaxError { sp = red, gui = 'undercurl' }, + SyntaxWarning { sp = yellow, gui = 'undercurl' }, + SyntaxInfo { sp = blue, gui = 'undercurl' }, + SyntaxHint { sp = green, gui = 'undercurl' }, + + Comment { fg = s[4], gui = 'italic' }, -- any comment + ColorColumn { bg = s[6] }, -- used for the columns set with 'colorcolumn' + Conceal { }, -- placeholder characters substituted for concealed text (see 'conceallevel') + Cursor { bg = hl1 }, -- character under the cursor + CursorI { bg = s.inv }, -- insert cursor TODO make this based on other colors + CursorR { bg = hl2 }, -- replace cursor + CursorO { bg = hl3 }, -- operator-pending cursor + -- lCursor { }, -- the character under the cursor when |language-mapping| is used (see 'guicursor') + -- CursorIM { }, -- like Cursor, but used when in IME mode |CursorIM| + -- CursorColumn { }, -- Screen-column at the cursor, when 'cursorcolumn' is set. + CursorLine { bg = Normal.bg[offset_fn](5) }, -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. + Directory { }, -- directory names (and other special names in listings) + DiffAdd { fg = green }, -- diff mode: Added line |diff.txt| + DiffChange { fg = yellow }, -- diff mode: Changed line |diff.txt| + DiffDelete { fg = red }, -- diff mode: Deleted line |diff.txt| + DiffText { fg = s[6], bg = red }, -- diff mode: Changed text within a changed line |diff.txt| + EndOfBuffer { fg = eob }, -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. + -- TermCursor { }, -- cursor in a focused terminal + -- TermCursorNC { }, -- cursor in an unfocused terminal + Error { fg = hl1, gui = 'bold' }, -- (preferred) any erroneous construct + ErrorMsg { Error }, -- error messages on the command line + VertSplit { fg = s[1] }, -- the column separating vertically split windows + Folded { fg = s.normal, bg = s[5], gui = 'italic' }, -- line used for closed folds + FoldColumn { }, -- 'foldcolumn' + SignColumn { }, -- column where |signs| are displayed + IncSearch { fg = s[7], bg = hl3 }, -- 'incsearch' highlighting; also used for the text replaced with ":s///c" + Substitute { }, -- |:substitute| replacement text highlighting + LineNr { fg = s[1] }, -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + CursorLineNr { fg = s[1] }, -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. + MatchParen { fg = s[7], bg = hl2 }, -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| + ParenMatch { MatchParen }, + ModeMsg { }, -- 'showmode' message (e.g., "-- INSERT -- ") + MsgArea { }, -- Area for messages and cmdline + MsgSeparator { }, -- Separator for scrolled messages, `msgsep` flag of 'display' + MoreMsg { fg = hl3, gui = 'bold' }, -- |more-prompt| + NonText { fg = nt }, -- '@' 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). See also |hl-EndOfBuffer|. + NormalFloat { }, -- Normal text in floating windows. + NormalNC { }, -- Normal text in non-current windows + Pmenu { fg = s[1], bg = s[6] }, -- Popup menu: Normal item. + PmenuSel { fg = s[6], bg = s[1] }, -- Popup menu: selected item. + PmenuSbar { bg = s[6] }, -- Popup menu: scrollbar. + PmenuThumb { bg = s[6] }, -- Popup menu: Thumb of the scrollbar. + Question { }, -- |hit-enter| prompt and yes/no questions + QuickFixLine { }, -- Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. + Search { fg = s[7], bg = hl2 }, -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. + SpecialKey { gui = 'bold' }, -- Unprintable characters: text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| + SpellBad { SyntaxError }, -- Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. + SpellCap { SyntaxInfo }, -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. + SpellLocal { SyntaxHint }, -- Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. + SpellRare { SyntaxWarning }, -- Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. + StatusLine { fg = s[1], gui = 'underline' }, -- status line of current window + StatusLineNC { fg = s[3], gui = 'underline' }, -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. + TabLine { fg = s[3] }, -- tab pages line, not active tab page label + TabLineFill { fg = s[3] }, -- tab pages line, where there are no labels + TabLineSel { fg = s[1], gui = 'bold' }, -- tab pages line, active tab page label + Title { gui = 'bold' }, -- titles for output from ":set all", ":autocmd" etc. + Visual { fg = s[7], bg = s.normal }, -- Visual mode selection + VisualNOS { }, -- Visual mode selection when vim is "Not Owning the Selection". + Warning { fg = hl2, gui = 'bold' }, -- warning messages + WarningMsg { Warning }, -- warning messages + Whitespace { fg = s[6] }, -- "nbsp", "space", "tab" and "trail" in 'listchars' + WildMenu { fg = s[6], fg = s.normal }, -- current match in 'wildmenu' completion + + Constant { }, -- (preferred) any constant + String { fg = s[2] }, -- a string constant: "this is a string" + Character { }, -- a character constant: 'c', '\n' + Number { }, -- a number constant: 234, 0xff + Boolean { gui = 'italic' }, -- a boolean constant: TRUE, false + Float { }, -- a floating point constant: 2.3e10 + + Identifier { gui = 'italic' }, -- (preferred) any variable name + Function { gui = 'bold' }, -- function name (also: methods for classes) + + Statement { gui = 'bold,italic' }, -- (preferred) any statement + Conditional { }, -- if, then, else, endif, switch, etc. + Repeat { }, -- for, do, while, etc. + Label { }, -- case, default, etc. + Operator { }, -- "sizeof", "+", "*", etc. + Keyword { gui = 'italic' }, -- any other keyword + Exception { }, -- try, catch, throw + + PreProc { }, -- (preferred) generic Preprocessor + Include { gui = 'italic' }, -- preprocessor #include + Define { }, -- preprocessor #define + Macro { }, -- same as Define + PreCondit { }, -- preprocessor #if, #else, #endif, etc. + + Type { gui = 'bold' }, -- (preferred) int, long, char, etc. + StorageClass { }, -- static, register, volatile, etc. + Structure { }, -- struct, union, enum, etc. + Typedef { }, -- A typedef + + Special { }, -- (preferred) any special symbol + SpecialChar { }, -- special character in a constant + Tag { }, -- you can use CTRL-] on this + Delimiter { fg = s[1] }, -- character that needs attention + SpecialComment { }, -- special things inside a comment + Debug { }, -- debugging statements + + Underlined { gui = 'underline' }, -- (preferred) text that stands out, HTML links + Bold { gui = 'bold' }, + Italic { gui = 'italic' }, + + -- Ignore { }, -- (preferred) left blank, hidden |hl-Ignore| + + Todo { fg = hl2, gui = 'bold,italic' }, -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX + + -- LspReferenceText { }, -- used for highlighting "text" references + -- LspReferenceRead { }, -- used for highlighting "read" references + -- LspReferenceWrite { }, -- used for highlighting "write" references + + LspDiagnosticsDefaultError { fg = red }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultWarning { fg = yellow }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultInformation { fg = blue }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultHint { fg = green }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + + -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text + -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text + -- LspDiagnosticsVirtualTextInformation { }, -- Used for "Information" diagnostic virtual text + -- LspDiagnosticsVirtualTextHint { }, -- Used for "Hint" diagnostic virtual text + + LspDiagnosticsUnderlineError { SyntaxError }, -- Used to underline "Error" diagnostics + LspDiagnosticsUnderlineWarning { SyntaxWarning }, -- Used to underline "Warning" diagnostics + LspDiagnosticsUnderlineInformation { SyntaxInfo }, -- Used to underline "Information" diagnostics + LspDiagnosticsUnderlineHint { SyntaxHint }, -- Used to underline "Hint" diagnostics + + -- LspDiagnosticsFloatingError { }, -- Used to color "Error" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingWarning { }, -- Used to color "Warning" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingInformation { }, -- Used to color "Information" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingHint { }, -- Used to color "Hint" diagnostic messages in diagnostics float + + -- LspDiagnosticsSignError { }, -- Used for "Error" signs in sign column + -- LspDiagnosticsSignWarning { }, -- Used for "Warning" signs in sign column + -- LspDiagnosticsSignInformation { }, -- Used for "Information" signs in sign column + -- LspDiagnosticsSignHint { }, -- Used for "Hint" signs in sign column + + -- TSAnnotation { }; -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. + -- TSAttribute { }; -- (unstable) TODO: docs + -- TSBoolean { }; -- For booleans. + -- TSCharacter { }; -- For characters. + -- TSComment { }; -- For comment blocks. + -- TSConstructor { }; -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. + -- TSConditional { }; -- For keywords related to conditionnals. + TSConstant { gui = 'underline' }; -- For constants + -- TSConstBuiltin { }; -- For constant that are built in the language: `nil` in Lua. + -- TSConstMacro { }; -- For constants that are defined by macros: `NULL` in C. + -- TSError { }; -- For syntax/parser errors. + -- TSException { }; -- For exception related keywords. + -- TSField { }; -- For fields. + -- TSFloat { }; -- For floats. + -- TSFunction { }; -- For function (calls and definitions). + -- TSFuncBuiltin { }; -- For builtin functions: `table.insert` in Lua. + -- TSFuncMacro { }; -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. + -- TSInclude { }; -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. + -- TSKeyword { }; -- For keywords that don't fall in previous categories. + -- TSKeywordFunction { }; -- For keywords used to define a fuction. + -- TSLabel { }; -- For labels: `label:` in C and `:label:` in Lua. + -- TSMethod { }; -- For method calls and definitions. + -- TSNamespace { }; -- For identifiers referring to modules and namespaces. + -- TSNone { }; -- TODO: docs + -- TSNumber { }; -- For all numbers + -- TSOperator { }; -- For any operator: `+`, but also `->` and `*` in C. + -- TSParameter { }; -- For parameters of a function. + -- TSParameterReference { }; -- For references to parameters of a function. + TSProperty { gui = 'italic' }; -- Same as `TSField`. + -- TSPunctDelimiter { }; -- For delimiters ie: `.` + -- TSPunctBracket { }; -- For brackets and parens. + -- TSPunctSpecial { }; -- For special punctutation that does not fall in the catagories before. + -- TSRepeat { }; -- For keywords related to loops. + -- TSString { }; -- For strings. + TSStringRegex { fg = s[1], gui = 'italic' }; -- For regexes. + TSStringEscape { fg = s.normal, gui = 'bold' }; -- For escape characters within a string. + -- TSSymbol { }; -- For identifiers referring to symbols or atoms. + -- TSType { }; -- For types. + -- TSTypeBuiltin { }; -- For builtin types. + -- TSVariable { }; -- Any variable name that does not have another highlight. + -- TSVariableBuiltin { }; -- Variable names that are defined by the languages, like `this` or `self`. + + -- TSTag { }; -- Tags like html tag names. + -- TSTagDelimiter { }; -- Tag delimiter like `<` `>` `/` + -- TSText { }; -- For strings considered text in a markup language. + -- TSEmphasis { }; -- For text to be represented with emphasis. + -- TSUnderline { }; -- For text to be represented with an underline. + -- TSStrike { }; -- For strikethrough text. + -- TSTitle { }; -- Text that is part of a title. + -- TSLiteral { }; -- Literal text. + -- TSURI { }; -- Any URI like a link or email. + } +end) From 047840658be97db04dcc047fd5af9c7a335bf8d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Sat, 20 Mar 2021 19:34:06 +0100 Subject: [PATCH 02/35] Add README and license --- LICENSE | 19 +++++++++++++++++++ README.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..06ad0de --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright 2021 Kim Silkebækken + +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/README.md b/README.md new file mode 100644 index 0000000..51f60c0 --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# m o n o t o n e + +Another monochrome vim colorscheme. Inspired by various +[other](https://github.com/ewilazarus/preto) +[monochrome](https://github.com/pbrisbin/vim-colors-off) +[colorschemes](https://github.com/fxn/vim-monochrome). + +Monotone is a middle ground between a regular colorscheme and [no syntax +highlighting at all](https://www.kyleisom.net/blog/2012/10/17/syntax-off/). The +colorscheme differentiates comments, strings and keywords with different +weights and shades of gray. It emphasizes errors, warnings and search +highlighting as shown in the screenshots below. + +This is a neovim-specific version of +[vim-monotone](https://github.com/Lokaltog/vim-monotone) based on +[lush.nvim](https://github.com/rktjmp/lush.nvim). This version includes full +support for both dark and light `background`. + +## Installation + +Monotone depends on [lush.nvim](https://github.com/rktjmp/lush.nvim). Example using packer.nvim: + +``` +require('packer').startup(function() + -- ... + use 'rktjmp/lush.nvim' + use 'Lokaltog/monotone.nvim' + -- ... +end) + +api.nvim_command 'colorscheme monotone' +``` + +## Customization + +The theme color may be customized by setting HSL values with +`g:monotone_[hsl]`. + +You may adjust the colorscheme contrast to your liking by setting +`g:monotone_contrast`. + +The default contrast factor is 105. Recommended values are between 90 and 110. + +## Configuration example + +``` +vim.g.monotone_h = 85 +vim.g.monotone_s = 30 +vim.g.monotone_l = 50 +vim.g.monotone_contrast = 110 +vim.g.monotone_true_monotone = true +vim.o.background = 'light' +``` From 545e8a5516ab1fff3f2b90d1e3ee3923da7fbec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Wed, 16 Jun 2021 07:28:51 +0200 Subject: [PATCH 03/35] Update highlighting --- lua/lush_theme/monotone.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 3eee56f..8801233 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -26,7 +26,7 @@ -- Lua configuration example: -- -- vim.g.monotone_h = 85 --- vim.g.monotone_s = 0 +-- vim.g.monotone_s = 30 -- vim.g.monotone_l = 50 -- vim.g.monotone_contrast = 100 -- vim.g.monotone_true_monotone = true @@ -173,7 +173,7 @@ return lush(function() Repeat { }, -- for, do, while, etc. Label { }, -- case, default, etc. Operator { }, -- "sizeof", "+", "*", etc. - Keyword { gui = 'italic' }, -- any other keyword + Keyword { }, -- any other keyword Exception { }, -- try, catch, throw PreProc { }, -- (preferred) generic Preprocessor @@ -206,10 +206,10 @@ return lush(function() -- LspReferenceRead { }, -- used for highlighting "read" references -- LspReferenceWrite { }, -- used for highlighting "write" references - LspDiagnosticsDefaultError { fg = red }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - LspDiagnosticsDefaultWarning { fg = yellow }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - LspDiagnosticsDefaultInformation { fg = blue }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - LspDiagnosticsDefaultHint { fg = green }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultError { fg = red, bg = shade(red, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultWarning { fg = yellow, bg = shade(yellow, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultInformation { fg = blue, bg = shade(blue, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + LspDiagnosticsDefaultHint { fg = green, bg = shade(green, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text From a8817d1c3611ab11341d5c42d6137cfea4d2abed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Sat, 9 Oct 2021 20:55:38 +0200 Subject: [PATCH 04/35] Update LSP highlighting groups for nvim 0.5+ --- lua/lush_theme/monotone.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 8801233..650ab86 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -206,20 +206,20 @@ return lush(function() -- LspReferenceRead { }, -- used for highlighting "read" references -- LspReferenceWrite { }, -- used for highlighting "write" references - LspDiagnosticsDefaultError { fg = red, bg = shade(red, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - LspDiagnosticsDefaultWarning { fg = yellow, bg = shade(yellow, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - LspDiagnosticsDefaultInformation { fg = blue, bg = shade(blue, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - LspDiagnosticsDefaultHint { fg = green, bg = shade(green, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticError { fg = red, bg = shade(red, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticWarn { fg = yellow, bg = shade(yellow, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticInfo { fg = blue, bg = shade(blue, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticHint { fg = green, bg = shade(green, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text -- LspDiagnosticsVirtualTextInformation { }, -- Used for "Information" diagnostic virtual text -- LspDiagnosticsVirtualTextHint { }, -- Used for "Hint" diagnostic virtual text - LspDiagnosticsUnderlineError { SyntaxError }, -- Used to underline "Error" diagnostics - LspDiagnosticsUnderlineWarning { SyntaxWarning }, -- Used to underline "Warning" diagnostics - LspDiagnosticsUnderlineInformation { SyntaxInfo }, -- Used to underline "Information" diagnostics - LspDiagnosticsUnderlineHint { SyntaxHint }, -- Used to underline "Hint" diagnostics + DiagnosticUnderlineError { SyntaxError }, -- Used to underline "Error" diagnostics + DiagnosticUnderlineWarn { SyntaxWarning }, -- Used to underline "Warning" diagnostics + DiagnosticUnderlineInfo { SyntaxInfo }, -- Used to underline "Information" diagnostics + DiagnosticUnderlineHint { SyntaxHint }, -- Used to underline "Hint" diagnostics -- LspDiagnosticsFloatingError { }, -- Used to color "Error" diagnostic messages in diagnostics float -- LspDiagnosticsFloatingWarning { }, -- Used to color "Warning" diagnostic messages in diagnostics float From 956e1685922ce669ea1c28a1e8cad5e0c4b10107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Thu, 14 Oct 2021 11:11:57 +0200 Subject: [PATCH 05/35] feat!: normalize shades and increase default contrast Decrease contrast to simulate the old default settings. --- lua/lush_theme/monotone.lua | 411 ++++++++++++++++++------------------ 1 file changed, 206 insertions(+), 205 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 650ab86..f4cb086 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -33,53 +33,49 @@ -- vim.o.background = 'light' -- -local lush = require('lush') +local lush = require("lush") local hsl = lush.hsl -- Config options local opt = { - bg = vim.o.background, - color = hsl( - tonumber(vim.g.monotone_h) or 15, - tonumber(vim.g.monotone_s) or 5, - (tonumber(vim.g.monotone_l) or 50) + 35 - ), - contrast = (tonumber(vim.g.monotone_contrast) or 105) / 100, - true_monotone = vim.g.monotone_true_monotone or false, + bg = vim.o.background, + color = hsl(tonumber(vim.g.monotone_h) or 15, tonumber(vim.g.monotone_s) or 5, (tonumber(vim.g.monotone_l) or 50)), + contrast = (tonumber(vim.g.monotone_contrast) or 100) / 100, + true_monotone = vim.g.monotone_true_monotone or false, } -- Handle dark/light background color -local offset_fn = 'lighten' -if opt.bg == 'light' then - opt.color = opt.color.darken(50) - offset_fn = 'darken' +local offset_fn = "lighten" +if opt.bg == "light" then + opt.color = opt.color.darken(50) + offset_fn = "darken" end -- Monochrome shades local shade = function(color, offset) - return color[offset_fn](offset * opt.contrast) + return color[offset_fn](offset * opt.contrast) end -local s = { -22, -32, -46, -55, -69, -75, -88, normal = 0, inv = 100 } +local s = { 50, 20, 10, 0, -10, -25, -45, -60, inv = -100, normal = 100 } for k, v in pairs(s) do - s[k] = shade(opt.color, v) + s[k] = shade(opt.color, v) end -- Highlight colors -local red = shade(hsl(5, 90, s.normal.l), -25) -local yellow = shade(hsl(32, 100, s.normal.l), -25) -local blue = shade(hsl(205, 85, s.normal.l), -20) -local green = shade(hsl(90, 40, s.normal.l), -40) -local eob = shade(hsl(240, 30, s.normal.l), -40) +local red = shade(hsl(2, 100, s.normal.l), -35) +local yellow = shade(hsl(32, 100, s.normal.l), -35) +local blue = shade(hsl(205, 85, s.normal.l), -35) +local green = shade(hsl(90, 40, s.normal.l), -35) +local eob = shade(hsl(240, 30, s.normal.l), -45) local nt = shade(hsl(330, 30, s.normal.l), -50) if opt.true_monotone then - -- Disable all colors - red = s[3] - yellow = s[2] - blue = s[1] - green = s[4] - eob = s[4] - nt = s[4] + -- Disable all colors + red = s[3] + yellow = s[2] + blue = s[1] + green = s[4] + eob = s[4] + nt = s[4] end local hl1 = red @@ -87,200 +83,205 @@ local hl2 = yellow local hl3 = blue return lush(function() - return { - Normal { fg = s.normal, bg = s[7] }, -- Normal text + return { + Normal({ fg = s.normal, bg = s.inv }), -- Normal text - SyntaxError { sp = red, gui = 'undercurl' }, - SyntaxWarning { sp = yellow, gui = 'undercurl' }, - SyntaxInfo { sp = blue, gui = 'undercurl' }, - SyntaxHint { sp = green, gui = 'undercurl' }, + SyntaxError({ sp = red, gui = "undercurl" }), + SyntaxWarning({ sp = yellow, gui = "undercurl" }), + SyntaxInfo({ sp = blue, gui = "undercurl" }), + SyntaxHint({ sp = green, gui = "undercurl" }), - Comment { fg = s[4], gui = 'italic' }, -- any comment - ColorColumn { bg = s[6] }, -- used for the columns set with 'colorcolumn' - Conceal { }, -- placeholder characters substituted for concealed text (see 'conceallevel') - Cursor { bg = hl1 }, -- character under the cursor - CursorI { bg = s.inv }, -- insert cursor TODO make this based on other colors - CursorR { bg = hl2 }, -- replace cursor - CursorO { bg = hl3 }, -- operator-pending cursor - -- lCursor { }, -- the character under the cursor when |language-mapping| is used (see 'guicursor') - -- CursorIM { }, -- like Cursor, but used when in IME mode |CursorIM| - -- CursorColumn { }, -- Screen-column at the cursor, when 'cursorcolumn' is set. - CursorLine { bg = Normal.bg[offset_fn](5) }, -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. - Directory { }, -- directory names (and other special names in listings) - DiffAdd { fg = green }, -- diff mode: Added line |diff.txt| - DiffChange { fg = yellow }, -- diff mode: Changed line |diff.txt| - DiffDelete { fg = red }, -- diff mode: Deleted line |diff.txt| - DiffText { fg = s[6], bg = red }, -- diff mode: Changed text within a changed line |diff.txt| - EndOfBuffer { fg = eob }, -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. - -- TermCursor { }, -- cursor in a focused terminal - -- TermCursorNC { }, -- cursor in an unfocused terminal - Error { fg = hl1, gui = 'bold' }, -- (preferred) any erroneous construct - ErrorMsg { Error }, -- error messages on the command line - VertSplit { fg = s[1] }, -- the column separating vertically split windows - Folded { fg = s.normal, bg = s[5], gui = 'italic' }, -- line used for closed folds - FoldColumn { }, -- 'foldcolumn' - SignColumn { }, -- column where |signs| are displayed - IncSearch { fg = s[7], bg = hl3 }, -- 'incsearch' highlighting; also used for the text replaced with ":s///c" - Substitute { }, -- |:substitute| replacement text highlighting - LineNr { fg = s[1] }, -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. - CursorLineNr { fg = s[1] }, -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. - MatchParen { fg = s[7], bg = hl2 }, -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| - ParenMatch { MatchParen }, - ModeMsg { }, -- 'showmode' message (e.g., "-- INSERT -- ") - MsgArea { }, -- Area for messages and cmdline - MsgSeparator { }, -- Separator for scrolled messages, `msgsep` flag of 'display' - MoreMsg { fg = hl3, gui = 'bold' }, -- |more-prompt| - NonText { fg = nt }, -- '@' 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). See also |hl-EndOfBuffer|. - NormalFloat { }, -- Normal text in floating windows. - NormalNC { }, -- Normal text in non-current windows - Pmenu { fg = s[1], bg = s[6] }, -- Popup menu: Normal item. - PmenuSel { fg = s[6], bg = s[1] }, -- Popup menu: selected item. - PmenuSbar { bg = s[6] }, -- Popup menu: scrollbar. - PmenuThumb { bg = s[6] }, -- Popup menu: Thumb of the scrollbar. - Question { }, -- |hit-enter| prompt and yes/no questions - QuickFixLine { }, -- Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. - Search { fg = s[7], bg = hl2 }, -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. - SpecialKey { gui = 'bold' }, -- Unprintable characters: text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| - SpellBad { SyntaxError }, -- Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. - SpellCap { SyntaxInfo }, -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. - SpellLocal { SyntaxHint }, -- Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. - SpellRare { SyntaxWarning }, -- Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. - StatusLine { fg = s[1], gui = 'underline' }, -- status line of current window - StatusLineNC { fg = s[3], gui = 'underline' }, -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. - TabLine { fg = s[3] }, -- tab pages line, not active tab page label - TabLineFill { fg = s[3] }, -- tab pages line, where there are no labels - TabLineSel { fg = s[1], gui = 'bold' }, -- tab pages line, active tab page label - Title { gui = 'bold' }, -- titles for output from ":set all", ":autocmd" etc. - Visual { fg = s[7], bg = s.normal }, -- Visual mode selection - VisualNOS { }, -- Visual mode selection when vim is "Not Owning the Selection". - Warning { fg = hl2, gui = 'bold' }, -- warning messages - WarningMsg { Warning }, -- warning messages - Whitespace { fg = s[6] }, -- "nbsp", "space", "tab" and "trail" in 'listchars' - WildMenu { fg = s[6], fg = s.normal }, -- current match in 'wildmenu' completion + Comment({ fg = s[6], gui = "italic" }), -- any comment + ColorColumn({ bg = s[6] }), -- used for the columns set with 'colorcolumn' + Conceal({}), -- placeholder characters substituted for concealed text (see 'conceallevel') + Cursor({ bg = hl1 }), -- character under the cursor + CursorI({ bg = hl1 }), -- insert cursor TODO make this based on other colors + CursorR({ bg = hl2 }), -- replace cursor + CursorO({ bg = hl3 }), -- operator-pending cursor + -- lCursor { }, -- the character under the cursor when |language-mapping| is used (see 'guicursor') + -- CursorIM { }, -- like Cursor, but used when in IME mode |CursorIM| + -- CursorColumn { }, -- Screen-column at the cursor, when 'cursorcolumn' is set. + CursorLine({ bg = Normal.bg[offset_fn](5) }), -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. + Directory({}), -- directory names (and other special names in listings) + DiffAdd({ fg = green }), -- diff mode: Added line |diff.txt| + DiffChange({ fg = yellow }), -- diff mode: Changed line |diff.txt| + DiffDelete({ fg = red }), -- diff mode: Deleted line |diff.txt| + DiffText({ fg = s.inv, bg = red }), -- diff mode: Changed text within a changed line |diff.txt| + EndOfBuffer({ fg = eob }), -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. + -- TermCursor { }, -- cursor in a focused terminal + -- TermCursorNC { }, -- cursor in an unfocused terminal + Error({ fg = hl1, gui = "bold" }), -- (preferred) any erroneous construct + ErrorMsg({ Error }), -- error messages on the command line + VertSplit({ fg = s[1] }), -- the column separating vertically split windows + Folded({ fg = s.normal, bg = s[5], gui = "italic" }), -- line used for closed folds + FoldColumn({}), -- 'foldcolumn' + SignColumn({}), -- column where |signs| are displayed + IncSearch({ fg = s.inv, bg = hl3 }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" + Substitute({}), -- |:substitute| replacement text highlighting + LineNr({ fg = s[1] }), -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + CursorLineNr({ fg = s[1] }), -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. + MatchParen({ fg = s.inv, bg = hl2 }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| + ParenMatch({ MatchParen }), + ModeMsg({}), -- 'showmode' message (e.g., "-- INSERT -- ") + MsgArea({}), -- Area for messages and cmdline + MsgSeparator({}), -- Separator for scrolled messages, `msgsep` flag of 'display' + MoreMsg({ fg = hl3, gui = "bold" }), -- |more-prompt| + NonText({ fg = nt }), -- '@' 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). See also |hl-EndOfBuffer|. + NormalFloat({}), -- Normal text in floating windows. + NormalNC({}), -- Normal text in non-current windows + Pmenu({ fg = s[1], bg = s[8] }), -- Popup menu: Normal item. + PmenuSel({ fg = s.inv, bg = s.normal }), -- Popup menu: selected item. + PmenuSbar({ bg = s[8] }), -- Popup menu: scrollbar. + PmenuThumb({ bg = s[3] }), -- Popup menu: Thumb of the scrollbar. + Question({}), -- |hit-enter| prompt and yes/no questions + QuickFixLine({}), -- Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. + Search({ fg = s.inv, bg = hl2 }), -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. + SpecialKey({ gui = "bold" }), -- Unprintable characters: text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| + SpellBad({ SyntaxError }), -- Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. + SpellCap({ SyntaxInfo }), -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. + SpellLocal({ SyntaxHint }), -- Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. + SpellRare({ SyntaxWarning }), -- Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. + StatusLine({ fg = s[1], gui = "underline" }), -- status line of current window + StatusLineNC({ fg = s[3], gui = "underline" }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. + TabLine({ fg = s[3] }), -- tab pages line, not active tab page label + TabLineFill({ fg = s[3] }), -- tab pages line, where there are no labels + TabLineSel({ fg = s[1], gui = "bold" }), -- tab pages line, active tab page label + Title({ gui = "bold" }), -- titles for output from ":set all", ":autocmd" etc. + Visual({ fg = s.inv, bg = s.normal }), -- Visual mode selection + VisualNOS({}), -- Visual mode selection when vim is "Not Owning the Selection". + Warning({ fg = hl2, gui = "bold" }), -- warning messages + WarningMsg({ Warning }), -- warning messages + Whitespace({ fg = s[7] }), -- "nbsp", "space", "tab" and "trail" in 'listchars' + WildMenu({ fg = s[6], fg = s.normal }), -- current match in 'wildmenu' completion - Constant { }, -- (preferred) any constant - String { fg = s[2] }, -- a string constant: "this is a string" - Character { }, -- a character constant: 'c', '\n' - Number { }, -- a number constant: 234, 0xff - Boolean { gui = 'italic' }, -- a boolean constant: TRUE, false - Float { }, -- a floating point constant: 2.3e10 + Constant({}), -- (preferred) any constant + String({ fg = s[2] }), -- a string constant: "this is a string" + Character({}), -- a character constant: 'c', '\n' + Number({}), -- a number constant: 234, 0xff + Boolean({ gui = "italic" }), -- a boolean constant: TRUE, false + Float({}), -- a floating point constant: 2.3e10 - Identifier { gui = 'italic' }, -- (preferred) any variable name - Function { gui = 'bold' }, -- function name (also: methods for classes) + Identifier({ gui = "italic" }), -- (preferred) any variable name + Function({ gui = "bold" }), -- function name (also: methods for classes) - Statement { gui = 'bold,italic' }, -- (preferred) any statement - Conditional { }, -- if, then, else, endif, switch, etc. - Repeat { }, -- for, do, while, etc. - Label { }, -- case, default, etc. - Operator { }, -- "sizeof", "+", "*", etc. - Keyword { }, -- any other keyword - Exception { }, -- try, catch, throw + Statement({ gui = "bold,italic" }), -- (preferred) any statement + Conditional({}), -- if, then, else, endif, switch, etc. + Repeat({}), -- for, do, while, etc. + Label({}), -- case, default, etc. + Operator({}), -- "sizeof", "+", "*", etc. + Keyword({}), -- any other keyword + Exception({}), -- try, catch, throw - PreProc { }, -- (preferred) generic Preprocessor - Include { gui = 'italic' }, -- preprocessor #include - Define { }, -- preprocessor #define - Macro { }, -- same as Define - PreCondit { }, -- preprocessor #if, #else, #endif, etc. + PreProc({}), -- (preferred) generic Preprocessor + Include({ gui = "italic" }), -- preprocessor #include + Define({}), -- preprocessor #define + Macro({}), -- same as Define + PreCondit({}), -- preprocessor #if, #else, #endif, etc. - Type { gui = 'bold' }, -- (preferred) int, long, char, etc. - StorageClass { }, -- static, register, volatile, etc. - Structure { }, -- struct, union, enum, etc. - Typedef { }, -- A typedef + Type({ gui = "bold" }), -- (preferred) int, long, char, etc. + StorageClass({}), -- static, register, volatile, etc. + Structure({}), -- struct, union, enum, etc. + Typedef({}), -- A typedef - Special { }, -- (preferred) any special symbol - SpecialChar { }, -- special character in a constant - Tag { }, -- you can use CTRL-] on this - Delimiter { fg = s[1] }, -- character that needs attention - SpecialComment { }, -- special things inside a comment - Debug { }, -- debugging statements + Special({}), -- (preferred) any special symbol + SpecialChar({}), -- special character in a constant + Tag({}), -- you can use CTRL-] on this + Delimiter({ fg = s[1] }), -- character that needs attention + SpecialComment({}), -- special things inside a comment + Debug({}), -- debugging statements - Underlined { gui = 'underline' }, -- (preferred) text that stands out, HTML links - Bold { gui = 'bold' }, - Italic { gui = 'italic' }, + Underlined({ gui = "underline" }), -- (preferred) text that stands out, HTML links + Bold({ gui = "bold" }), + Italic({ gui = "italic" }), - -- Ignore { }, -- (preferred) left blank, hidden |hl-Ignore| + -- Ignore { }, -- (preferred) left blank, hidden |hl-Ignore| - Todo { fg = hl2, gui = 'bold,italic' }, -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX + Todo({ fg = hl2, gui = "bold,italic" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX - -- LspReferenceText { }, -- used for highlighting "text" references - -- LspReferenceRead { }, -- used for highlighting "read" references - -- LspReferenceWrite { }, -- used for highlighting "write" references + -- LspReferenceText { }, -- used for highlighting "text" references + -- LspReferenceRead { }, -- used for highlighting "read" references + -- LspReferenceWrite { }, -- used for highlighting "write" references - DiagnosticError { fg = red, bg = shade(red, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticWarn { fg = yellow, bg = shade(yellow, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticInfo { fg = blue, bg = shade(blue, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticHint { fg = green, bg = shade(green, -78) }, -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticError({ fg = red, bg = shade(red, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticWarn({ fg = yellow, bg = shade(yellow, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticInfo({ fg = blue, bg = shade(blue, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticHint({ fg = green, bg = shade(green, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text - -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text - -- LspDiagnosticsVirtualTextInformation { }, -- Used for "Information" diagnostic virtual text - -- LspDiagnosticsVirtualTextHint { }, -- Used for "Hint" diagnostic virtual text + DiagnosticLineError({ bg = shade(red, -78) }), + DiagnosticLineWarn({ bg = shade(yellow, -78) }), + DiagnosticLineInfo({ bg = shade(blue, -78) }), + DiagnosticLineHint({ bg = shade(green, -78) }), - DiagnosticUnderlineError { SyntaxError }, -- Used to underline "Error" diagnostics - DiagnosticUnderlineWarn { SyntaxWarning }, -- Used to underline "Warning" diagnostics - DiagnosticUnderlineInfo { SyntaxInfo }, -- Used to underline "Information" diagnostics - DiagnosticUnderlineHint { SyntaxHint }, -- Used to underline "Hint" diagnostics + -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text + -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text + -- LspDiagnosticsVirtualTextInformation { }, -- Used for "Information" diagnostic virtual text + -- LspDiagnosticsVirtualTextHint { }, -- Used for "Hint" diagnostic virtual text - -- LspDiagnosticsFloatingError { }, -- Used to color "Error" diagnostic messages in diagnostics float - -- LspDiagnosticsFloatingWarning { }, -- Used to color "Warning" diagnostic messages in diagnostics float - -- LspDiagnosticsFloatingInformation { }, -- Used to color "Information" diagnostic messages in diagnostics float - -- LspDiagnosticsFloatingHint { }, -- Used to color "Hint" diagnostic messages in diagnostics float + DiagnosticUnderlineError({ SyntaxError }), -- Used to underline "Error" diagnostics + DiagnosticUnderlineWarn({ SyntaxWarning }), -- Used to underline "Warning" diagnostics + DiagnosticUnderlineInfo({ SyntaxInfo }), -- Used to underline "Information" diagnostics + DiagnosticUnderlineHint({ SyntaxHint }), -- Used to underline "Hint" diagnostics - -- LspDiagnosticsSignError { }, -- Used for "Error" signs in sign column - -- LspDiagnosticsSignWarning { }, -- Used for "Warning" signs in sign column - -- LspDiagnosticsSignInformation { }, -- Used for "Information" signs in sign column - -- LspDiagnosticsSignHint { }, -- Used for "Hint" signs in sign column + -- LspDiagnosticsFloatingError { }, -- Used to color "Error" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingWarning { }, -- Used to color "Warning" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingInformation { }, -- Used to color "Information" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingHint { }, -- Used to color "Hint" diagnostic messages in diagnostics float - -- TSAnnotation { }; -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. - -- TSAttribute { }; -- (unstable) TODO: docs - -- TSBoolean { }; -- For booleans. - -- TSCharacter { }; -- For characters. - -- TSComment { }; -- For comment blocks. - -- TSConstructor { }; -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. - -- TSConditional { }; -- For keywords related to conditionnals. - TSConstant { gui = 'underline' }; -- For constants - -- TSConstBuiltin { }; -- For constant that are built in the language: `nil` in Lua. - -- TSConstMacro { }; -- For constants that are defined by macros: `NULL` in C. - -- TSError { }; -- For syntax/parser errors. - -- TSException { }; -- For exception related keywords. - -- TSField { }; -- For fields. - -- TSFloat { }; -- For floats. - -- TSFunction { }; -- For function (calls and definitions). - -- TSFuncBuiltin { }; -- For builtin functions: `table.insert` in Lua. - -- TSFuncMacro { }; -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. - -- TSInclude { }; -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. - -- TSKeyword { }; -- For keywords that don't fall in previous categories. - -- TSKeywordFunction { }; -- For keywords used to define a fuction. - -- TSLabel { }; -- For labels: `label:` in C and `:label:` in Lua. - -- TSMethod { }; -- For method calls and definitions. - -- TSNamespace { }; -- For identifiers referring to modules and namespaces. - -- TSNone { }; -- TODO: docs - -- TSNumber { }; -- For all numbers - -- TSOperator { }; -- For any operator: `+`, but also `->` and `*` in C. - -- TSParameter { }; -- For parameters of a function. - -- TSParameterReference { }; -- For references to parameters of a function. - TSProperty { gui = 'italic' }; -- Same as `TSField`. - -- TSPunctDelimiter { }; -- For delimiters ie: `.` - -- TSPunctBracket { }; -- For brackets and parens. - -- TSPunctSpecial { }; -- For special punctutation that does not fall in the catagories before. - -- TSRepeat { }; -- For keywords related to loops. - -- TSString { }; -- For strings. - TSStringRegex { fg = s[1], gui = 'italic' }; -- For regexes. - TSStringEscape { fg = s.normal, gui = 'bold' }; -- For escape characters within a string. - -- TSSymbol { }; -- For identifiers referring to symbols or atoms. - -- TSType { }; -- For types. - -- TSTypeBuiltin { }; -- For builtin types. - -- TSVariable { }; -- Any variable name that does not have another highlight. - -- TSVariableBuiltin { }; -- Variable names that are defined by the languages, like `this` or `self`. + DiagnosticSignError({ fg = red, bg = shade(red, -78) }), -- Used for "Error" signs in sign column + DiagnosticSignWarning({ fg = yellow, bg = shade(yellow, -78) }), -- Used for "Warning" signs in sign column + DiagnosticSignInformation({ fg = blue, bg = shade(blue, -78) }), -- Used for "Information" signs in sign column + DiagnosticSignHint({ fg = green, bg = shade(green, -78) }), -- Used for "Hint" signs in sign column - -- TSTag { }; -- Tags like html tag names. - -- TSTagDelimiter { }; -- Tag delimiter like `<` `>` `/` - -- TSText { }; -- For strings considered text in a markup language. - -- TSEmphasis { }; -- For text to be represented with emphasis. - -- TSUnderline { }; -- For text to be represented with an underline. - -- TSStrike { }; -- For strikethrough text. - -- TSTitle { }; -- Text that is part of a title. - -- TSLiteral { }; -- Literal text. - -- TSURI { }; -- Any URI like a link or email. - } + -- TSAnnotation { }; -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. + -- TSAttribute { }; -- (unstable) TODO: docs + -- TSBoolean { }; -- For booleans. + -- TSCharacter { }; -- For characters. + -- TSComment { }; -- For comment blocks. + -- TSConstructor { }; -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. + -- TSConditional { }; -- For keywords related to conditionnals. + TSConstant({ gui = "underline" }), -- For constants + -- TSConstBuiltin { }; -- For constant that are built in the language: `nil` in Lua. + -- TSConstMacro { }; -- For constants that are defined by macros: `NULL` in C. + -- TSError { }; -- For syntax/parser errors. + -- TSException { }; -- For exception related keywords. + -- TSField { }; -- For fields. + -- TSFloat { }; -- For floats. + -- TSFunction { }; -- For function (calls and definitions). + -- TSFuncBuiltin { }; -- For builtin functions: `table.insert` in Lua. + -- TSFuncMacro { }; -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. + -- TSInclude { }; -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. + -- TSKeyword { }; -- For keywords that don't fall in previous categories. + -- TSKeywordFunction { }; -- For keywords used to define a fuction. + -- TSLabel { }; -- For labels: `label:` in C and `:label:` in Lua. + -- TSMethod { }; -- For method calls and definitions. + -- TSNamespace { }; -- For identifiers referring to modules and namespaces. + -- TSNone { }; -- TODO: docs + -- TSNumber { }; -- For all numbers + -- TSOperator { }; -- For any operator: `+`, but also `->` and `*` in C. + -- TSParameter { }; -- For parameters of a function. + -- TSParameterReference { }; -- For references to parameters of a function. + TSProperty({ gui = "italic" }), -- Same as `TSField`. + -- TSPunctDelimiter { }; -- For delimiters ie: `.` + -- TSPunctBracket { }; -- For brackets and parens. + -- TSPunctSpecial { }; -- For special punctutation that does not fall in the catagories before. + -- TSRepeat { }; -- For keywords related to loops. + -- TSString { }; -- For strings. + TSStringRegex({ fg = s[1], gui = "italic" }), -- For regexes. + TSStringEscape({ fg = s.normal, gui = "bold" }), -- For escape characters within a string. + -- TSSymbol { }; -- For identifiers referring to symbols or atoms. + -- TSType { }; -- For types. + -- TSTypeBuiltin { }; -- For builtin types. + -- TSVariable { }; -- Any variable name that does not have another highlight. + -- TSVariableBuiltin { }; -- Variable names that are defined by the languages, like `this` or `self`. + + -- TSTag { }; -- Tags like html tag names. + -- TSTagDelimiter { }; -- Tag delimiter like `<` `>` `/` + -- TSText { }; -- For strings considered text in a markup language. + -- TSEmphasis { }; -- For text to be represented with emphasis. + -- TSUnderline { }; -- For text to be represented with an underline. + -- TSStrike { }; -- For strikethrough text. + -- TSTitle { }; -- Text that is part of a title. + -- TSLiteral { }; -- Literal text. + -- TSURI { }; -- Any URI like a link or email. + } end) From 33d2f6938e5a44b831d8b65ec35f67fc14c015db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Thu, 14 Oct 2021 11:26:24 +0200 Subject: [PATCH 06/35] fix: remove unused highlight groups --- lua/lush_theme/monotone.lua | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index f4cb086..3a26135 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -207,11 +207,6 @@ return lush(function() DiagnosticInfo({ fg = blue, bg = shade(blue, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) DiagnosticHint({ fg = green, bg = shade(green, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticLineError({ bg = shade(red, -78) }), - DiagnosticLineWarn({ bg = shade(yellow, -78) }), - DiagnosticLineInfo({ bg = shade(blue, -78) }), - DiagnosticLineHint({ bg = shade(green, -78) }), - -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text -- LspDiagnosticsVirtualTextInformation { }, -- Used for "Information" diagnostic virtual text From dfeba97cb5c0443f7f7d7c9e3710995bca490be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Sat, 16 Oct 2021 23:20:27 +0200 Subject: [PATCH 07/35] feat: tuned colors --- lua/lush_theme/monotone.lua | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 3a26135..0051efd 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -55,18 +55,18 @@ end local shade = function(color, offset) return color[offset_fn](offset * opt.contrast) end -local s = { 50, 20, 10, 0, -10, -25, -45, -60, inv = -100, normal = 100 } +local s = { 50, 20, 10, 0, -10, -25, -45, -60, -88, inv = -100, normal = 100 } for k, v in pairs(s) do s[k] = shade(opt.color, v) end -- Highlight colors -local red = shade(hsl(2, 100, s.normal.l), -35) -local yellow = shade(hsl(32, 100, s.normal.l), -35) -local blue = shade(hsl(205, 85, s.normal.l), -35) -local green = shade(hsl(90, 40, s.normal.l), -35) -local eob = shade(hsl(240, 30, s.normal.l), -45) -local nt = shade(hsl(330, 30, s.normal.l), -50) +local red = shade(hsl(2, 90, s.normal.l), -35) +local yellow = shade(hsl(32, 70, s.normal.l), -35) +local blue = shade(hsl(205, 55, s.normal.l), -35) +local green = shade(hsl(90, 35, s.normal.l), -35) +local eob = shade(hsl(240, 35, s.normal.l), -45) +local nt = shade(hsl(330, 35, s.normal.l), -50) if opt.true_monotone then -- Disable all colors @@ -111,7 +111,7 @@ return lush(function() -- TermCursor { }, -- cursor in a focused terminal -- TermCursorNC { }, -- cursor in an unfocused terminal Error({ fg = hl1, gui = "bold" }), -- (preferred) any erroneous construct - ErrorMsg({ Error }), -- error messages on the command line + ErrorMsg({ fg = s.inv, bg = hl1, gui = "bold" }), -- error messages on the command line VertSplit({ fg = s[1] }), -- the column separating vertically split windows Folded({ fg = s.normal, bg = s[5], gui = "italic" }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' @@ -120,7 +120,7 @@ return lush(function() Substitute({}), -- |:substitute| replacement text highlighting LineNr({ fg = s[1] }), -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. CursorLineNr({ fg = s[1] }), -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. - MatchParen({ fg = s.inv, bg = hl2 }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| + MatchParen({ fg = red, bg = shade(red, -78), gui = "bold,italic" }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| ParenMatch({ MatchParen }), ModeMsg({}), -- 'showmode' message (e.g., "-- INSERT -- ") MsgArea({}), -- Area for messages and cmdline @@ -202,6 +202,9 @@ return lush(function() -- LspReferenceRead { }, -- used for highlighting "read" references -- LspReferenceWrite { }, -- used for highlighting "write" references + IndentBlanklineChar({ fg = s[8] }), + IndentBlanklineContextChar({ fg = nt }), + DiagnosticError({ fg = red, bg = shade(red, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) DiagnosticWarn({ fg = yellow, bg = shade(yellow, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) DiagnosticInfo({ fg = blue, bg = shade(blue, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) @@ -222,10 +225,10 @@ return lush(function() -- LspDiagnosticsFloatingInformation { }, -- Used to color "Information" diagnostic messages in diagnostics float -- LspDiagnosticsFloatingHint { }, -- Used to color "Hint" diagnostic messages in diagnostics float - DiagnosticSignError({ fg = red, bg = shade(red, -78) }), -- Used for "Error" signs in sign column - DiagnosticSignWarning({ fg = yellow, bg = shade(yellow, -78) }), -- Used for "Warning" signs in sign column - DiagnosticSignInformation({ fg = blue, bg = shade(blue, -78) }), -- Used for "Information" signs in sign column - DiagnosticSignHint({ fg = green, bg = shade(green, -78) }), -- Used for "Hint" signs in sign column + DiagnosticSignError({ fg = red, bg = shade(red, -84) }), -- Used for "Error" signs in sign column + DiagnosticSignWarning({ fg = yellow, bg = shade(yellow, -84) }), -- Used for "Warning" signs in sign column + DiagnosticSignInformation({ fg = blue, bg = shade(blue, -84) }), -- Used for "Information" signs in sign column + DiagnosticSignHint({ fg = green, bg = shade(green, -84) }), -- Used for "Hint" signs in sign column -- TSAnnotation { }; -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. -- TSAttribute { }; -- (unstable) TODO: docs From 0e9a76a4da4b8dc116d28fa13c1288ff9199dd9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Wed, 8 Dec 2021 10:25:40 +0100 Subject: [PATCH 08/35] feat: minor contrast change, changed float colors --- lua/lush_theme/monotone.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 0051efd..17ad3a4 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -55,7 +55,7 @@ end local shade = function(color, offset) return color[offset_fn](offset * opt.contrast) end -local s = { 50, 20, 10, 0, -10, -25, -45, -60, -88, inv = -100, normal = 100 } +local s = { 50, 20, 10, 0, -10, -25, -45, -60, -70, inv = -100, normal = 100 } for k, v in pairs(s) do s[k] = shade(opt.color, v) end @@ -113,7 +113,7 @@ return lush(function() Error({ fg = hl1, gui = "bold" }), -- (preferred) any erroneous construct ErrorMsg({ fg = s.inv, bg = hl1, gui = "bold" }), -- error messages on the command line VertSplit({ fg = s[1] }), -- the column separating vertically split windows - Folded({ fg = s.normal, bg = s[5], gui = "italic" }), -- line used for closed folds + Folded({ fg = s[3], bg = s[9], gui = "italic" }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' SignColumn({}), -- column where |signs| are displayed IncSearch({ fg = s.inv, bg = hl3 }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" @@ -127,7 +127,7 @@ return lush(function() MsgSeparator({}), -- Separator for scrolled messages, `msgsep` flag of 'display' MoreMsg({ fg = hl3, gui = "bold" }), -- |more-prompt| NonText({ fg = nt }), -- '@' 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). See also |hl-EndOfBuffer|. - NormalFloat({}), -- Normal text in floating windows. + NormalFloat({ bg = s[9], fg = s[2] }), -- Normal text in floating windows. NormalNC({}), -- Normal text in non-current windows Pmenu({ fg = s[1], bg = s[8] }), -- Popup menu: Normal item. PmenuSel({ fg = s.inv, bg = s.normal }), -- Popup menu: selected item. @@ -141,8 +141,8 @@ return lush(function() SpellCap({ SyntaxInfo }), -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. SpellLocal({ SyntaxHint }), -- Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. SpellRare({ SyntaxWarning }), -- Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. - StatusLine({ fg = s[1], gui = "underline" }), -- status line of current window - StatusLineNC({ fg = s[3], gui = "underline" }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. + StatusLine({ fg = s[1], bg = s[8] }), -- status line of current window + StatusLineNC({ fg = s[3], bg = s[9] }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. TabLine({ fg = s[3] }), -- tab pages line, not active tab page label TabLineFill({ fg = s[3] }), -- tab pages line, where there are no labels TabLineSel({ fg = s[1], gui = "bold" }), -- tab pages line, active tab page label @@ -154,7 +154,7 @@ return lush(function() Whitespace({ fg = s[7] }), -- "nbsp", "space", "tab" and "trail" in 'listchars' WildMenu({ fg = s[6], fg = s.normal }), -- current match in 'wildmenu' completion - Constant({}), -- (preferred) any constant + Constant({ gui = "underline", sp = "fg" }), -- (preferred) any constant String({ fg = s[2] }), -- a string constant: "this is a string" Character({}), -- a character constant: 'c', '\n' Number({}), -- a number constant: 234, 0xff @@ -237,7 +237,7 @@ return lush(function() -- TSComment { }; -- For comment blocks. -- TSConstructor { }; -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. -- TSConditional { }; -- For keywords related to conditionnals. - TSConstant({ gui = "underline" }), -- For constants + TSConstant({ gui = "underline", sp = "fg" }), -- For constants -- TSConstBuiltin { }; -- For constant that are built in the language: `nil` in Lua. -- TSConstMacro { }; -- For constants that are defined by macros: `NULL` in C. -- TSError { }; -- For syntax/parser errors. From 32b906d8c0ee248d086a7f2a808a4d89fb997d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20Silkeb=C3=A6kken?= Date: Sun, 19 Dec 2021 21:21:35 +0100 Subject: [PATCH 09/35] feat: add various plugin highlighting groups --- lua/lush_theme/monotone.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 17ad3a4..3cfa621 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -198,9 +198,9 @@ return lush(function() Todo({ fg = hl2, gui = "bold,italic" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX - -- LspReferenceText { }, -- used for highlighting "text" references - -- LspReferenceRead { }, -- used for highlighting "read" references - -- LspReferenceWrite { }, -- used for highlighting "write" references + LspReferenceText({ gui = "underline", sp = blue }), -- used for highlighting "text" references + LspReferenceRead({ gui = "underline", sp = s.normal }), -- used for highlighting "read" references + LspReferenceWrite({ gui = "underline", sp = green }), -- used for highlighting "write" references IndentBlanklineChar({ fg = s[8] }), IndentBlanklineContextChar({ fg = nt }), @@ -281,5 +281,8 @@ return lush(function() -- TSTitle { }; -- Text that is part of a title. -- TSLiteral { }; -- Literal text. -- TSURI { }; -- Any URI like a link or email. + + IndentBlankLineContextStart({ gui = "underline", sp = nt }), + TreesitterContext({ fg = s[3], gui = "italic" }), } end) From 8fc56f0aeca6cc2a02743669545653abc37a21d4 Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 01:32:49 +0300 Subject: [PATCH 10/35] Dirty colorscheme tuning --- lua/lush_theme/monotone.lua | 211 +++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 97 deletions(-) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/monotone.lua index 3cfa621..96987db 100644 --- a/lua/lush_theme/monotone.lua +++ b/lua/lush_theme/monotone.lua @@ -25,26 +25,30 @@ -- -- Lua configuration example: -- --- vim.g.monotone_h = 85 --- vim.g.monotone_s = 30 --- vim.g.monotone_l = 50 --- vim.g.monotone_contrast = 100 --- vim.g.monotone_true_monotone = true --- vim.o.background = 'light' + vim.o.background = 'dark' + + vim.g.monotone_h = 0 + vim.g.monotone_s = 0 + vim.g.monotone_l = 70 + vim.g.monotone_contrast = 120 -- local lush = require("lush") local hsl = lush.hsl -- Config options + local opt = { bg = vim.o.background, - color = hsl(tonumber(vim.g.monotone_h) or 15, tonumber(vim.g.monotone_s) or 5, (tonumber(vim.g.monotone_l) or 50)), contrast = (tonumber(vim.g.monotone_contrast) or 100) / 100, - true_monotone = vim.g.monotone_true_monotone or false, + color = hsl( + tonumber(vim.g.monotone_h) or 15, + tonumber(vim.g.monotone_s) or 5, + tonumber(vim.g.monotone_l) or 50), } -- Handle dark/light background color + local offset_fn = "lighten" if opt.bg == "light" then opt.color = opt.color.darken(50) @@ -52,143 +56,141 @@ if opt.bg == "light" then end -- Monochrome shades + local shade = function(color, offset) return color[offset_fn](offset * opt.contrast) end -local s = { 50, 20, 10, 0, -10, -25, -45, -60, -70, inv = -100, normal = 100 } +local s = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } --, inv = -100, normal = 100 } for k, v in pairs(s) do s[k] = shade(opt.color, v) end +s.normal = hsl("#cdcdcd") +s.inv = hsl("#383838") + -- Highlight colors -local red = shade(hsl(2, 90, s.normal.l), -35) -local yellow = shade(hsl(32, 70, s.normal.l), -35) -local blue = shade(hsl(205, 55, s.normal.l), -35) -local green = shade(hsl(90, 35, s.normal.l), -35) -local eob = shade(hsl(240, 35, s.normal.l), -45) -local nt = shade(hsl(330, 35, s.normal.l), -50) -if opt.true_monotone then - -- Disable all colors - red = s[3] - yellow = s[2] - blue = s[1] - green = s[4] - eob = s[4] - nt = s[4] -end +local red = hsl("#ff5111") +local yellow = hsl("#ffc812") +local yellow2 = hsl("#ffd700") -local hl1 = red -local hl2 = yellow -local hl3 = blue +local green = hsl("#4e9a06") +local white = hsl("#ffffff") +local eob = s[4] +local nt = s[4] + +---@diagnostic disable: undefined-global return lush(function() return { Normal({ fg = s.normal, bg = s.inv }), -- Normal text - SyntaxError({ sp = red, gui = "undercurl" }), - SyntaxWarning({ sp = yellow, gui = "undercurl" }), - SyntaxInfo({ sp = blue, gui = "undercurl" }), - SyntaxHint({ sp = green, gui = "undercurl" }), + SyntaxError({ fg = red, gui = "underline" }), + SyntaxWarning({ fg = yellow, gui = "underline" }), + SyntaxInfo({ fg = yellow, gui = "underline" }), + SyntaxHint({ fg = green, gui = "underline" }), - Comment({ fg = s[6], gui = "italic" }), -- any comment + Comment({ fg = s[6] }), -- any comment ColorColumn({ bg = s[6] }), -- used for the columns set with 'colorcolumn' Conceal({}), -- placeholder characters substituted for concealed text (see 'conceallevel') - Cursor({ bg = hl1 }), -- character under the cursor - CursorI({ bg = hl1 }), -- insert cursor TODO make this based on other colors - CursorR({ bg = hl2 }), -- replace cursor - CursorO({ bg = hl3 }), -- operator-pending cursor + Cursor({ fg = s.inv, bg = yellow }), -- character under the cursor + -- CursorI({}), -- insert cursor TODO make this based on other colors + -- CursorR({}), -- replace cursor + -- CursorO({}), -- operator-pending cursor -- lCursor { }, -- the character under the cursor when |language-mapping| is used (see 'guicursor') -- CursorIM { }, -- like Cursor, but used when in IME mode |CursorIM| -- CursorColumn { }, -- Screen-column at the cursor, when 'cursorcolumn' is set. - CursorLine({ bg = Normal.bg[offset_fn](5) }), -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. + CursorLine({ bg = Normal.bg[offset_fn](2) }), -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. Directory({}), -- directory names (and other special names in listings) - DiffAdd({ fg = green }), -- diff mode: Added line |diff.txt| - DiffChange({ fg = yellow }), -- diff mode: Changed line |diff.txt| + DiffAdd({ fg = green, gui = "bold" }), -- diff mode: Added line |diff.txt| + DiffChange({ fg = yellow, gui = "bold" }), -- diff mode: Changed line |diff.txt| DiffDelete({ fg = red }), -- diff mode: Deleted line |diff.txt| - DiffText({ fg = s.inv, bg = red }), -- diff mode: Changed text within a changed line |diff.txt| + DiffText({ fg = white, bg = red }), -- diff mode: Changed text within a changed line |diff.txt| EndOfBuffer({ fg = eob }), -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. -- TermCursor { }, -- cursor in a focused terminal -- TermCursorNC { }, -- cursor in an unfocused terminal - Error({ fg = hl1, gui = "bold" }), -- (preferred) any erroneous construct - ErrorMsg({ fg = s.inv, bg = hl1, gui = "bold" }), -- error messages on the command line - VertSplit({ fg = s[1] }), -- the column separating vertically split windows - Folded({ fg = s[3], bg = s[9], gui = "italic" }), -- line used for closed folds + Error({ fg = red, gui = "bold" }), -- (preferred) any erroneous construct + ErrorMsg({ fg = red, gui = "bold" }), -- error messages on the command line + VertSplit({ fg = s[8] }), -- the column separating vertically split windows + Folded({ fg = s[3], bg = s[9] }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' SignColumn({}), -- column where |signs| are displayed - IncSearch({ fg = s.inv, bg = hl3 }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" + IncSearch({ fg = s.inv, bg = yellow }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" Substitute({}), -- |:substitute| replacement text highlighting - LineNr({ fg = s[1] }), -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + LineNr({ fg = s[6] }), -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. CursorLineNr({ fg = s[1] }), -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. - MatchParen({ fg = red, bg = shade(red, -78), gui = "bold,italic" }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| + MatchParen({ fg = yellow2, gui = "underline" }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| ParenMatch({ MatchParen }), ModeMsg({}), -- 'showmode' message (e.g., "-- INSERT -- ") MsgArea({}), -- Area for messages and cmdline MsgSeparator({}), -- Separator for scrolled messages, `msgsep` flag of 'display' - MoreMsg({ fg = hl3, gui = "bold" }), -- |more-prompt| + MoreMsg({ fg = yellow, gui = "bold" }), -- |more-prompt| NonText({ fg = nt }), -- '@' 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). See also |hl-EndOfBuffer|. - NormalFloat({ bg = s[9], fg = s[2] }), -- Normal text in floating windows. + NormalFloat({ bg = s[7], fg = s[1] }), -- Normal text in floating windows. NormalNC({}), -- Normal text in non-current windows - Pmenu({ fg = s[1], bg = s[8] }), -- Popup menu: Normal item. + Pmenu({NormalFloat}), -- Popup menu: Normal item. PmenuSel({ fg = s.inv, bg = s.normal }), -- Popup menu: selected item. - PmenuSbar({ bg = s[8] }), -- Popup menu: scrollbar. + PmenuSbar({ bg = s[6] }), -- Popup menu: scrollbar. PmenuThumb({ bg = s[3] }), -- Popup menu: Thumb of the scrollbar. Question({}), -- |hit-enter| prompt and yes/no questions QuickFixLine({}), -- Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. - Search({ fg = s.inv, bg = hl2 }), -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. + Search({ fg = s.inv, bg = yellow }), -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. SpecialKey({ gui = "bold" }), -- Unprintable characters: text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| SpellBad({ SyntaxError }), -- Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. SpellCap({ SyntaxInfo }), -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. SpellLocal({ SyntaxHint }), -- Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. SpellRare({ SyntaxWarning }), -- Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. - StatusLine({ fg = s[1], bg = s[8] }), -- status line of current window - StatusLineNC({ fg = s[3], bg = s[9] }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. + StatusLine({ fg = s.normal, bg = s.inv }), -- status line of current window + -- StatusLine({ fg = s[1], bg = s[8] }), -- status line of current window + StatusLineNC({ fg = s[6], bg = s.inv }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. TabLine({ fg = s[3] }), -- tab pages line, not active tab page label TabLineFill({ fg = s[3] }), -- tab pages line, where there are no labels TabLineSel({ fg = s[1], gui = "bold" }), -- tab pages line, active tab page label Title({ gui = "bold" }), -- titles for output from ":set all", ":autocmd" etc. Visual({ fg = s.inv, bg = s.normal }), -- Visual mode selection VisualNOS({}), -- Visual mode selection when vim is "Not Owning the Selection". - Warning({ fg = hl2, gui = "bold" }), -- warning messages + Warning({ fg = yellow, gui = "bold" }), -- warning messages WarningMsg({ Warning }), -- warning messages Whitespace({ fg = s[7] }), -- "nbsp", "space", "tab" and "trail" in 'listchars' - WildMenu({ fg = s[6], fg = s.normal }), -- current match in 'wildmenu' completion + WildMenu({ fg = s[6], bg = s.normal }), -- current match in 'wildmenu' completion - Constant({ gui = "underline", sp = "fg" }), -- (preferred) any constant - String({ fg = s[2] }), -- a string constant: "this is a string" - Character({}), -- a character constant: 'c', '\n' - Number({}), -- a number constant: 234, 0xff - Boolean({ gui = "italic" }), -- a boolean constant: TRUE, false - Float({}), -- a floating point constant: 2.3e10 + Constant({ fg = yellow2 }), -- (preferred) any constant + -- String({ fg = s[2] }), -- a string constant: "this is a string" + -- Character({}), -- a character constant: 'c', '\n' + -- Number({}), -- a number constant: 234, 0xff + -- Boolean({}), -- a boolean constant: TRUE, false + -- Float({}), -- a floating point constant: 2.3e10 - Identifier({ gui = "italic" }), -- (preferred) any variable name - Function({ gui = "bold" }), -- function name (also: methods for classes) + Identifier({ fg = yellow }), -- (preferred) any variable name + -- Identifier({ fg = white }), -- (preferred) any variable name + -- Function({}), -- function name (also: methods for classes) - Statement({ gui = "bold,italic" }), -- (preferred) any statement - Conditional({}), -- if, then, else, endif, switch, etc. - Repeat({}), -- for, do, while, etc. - Label({}), -- case, default, etc. - Operator({}), -- "sizeof", "+", "*", etc. - Keyword({}), -- any other keyword - Exception({}), -- try, catch, throw + Statement({ fg = white }), -- (preferred) any statement + -- Conditional({}), -- if, then, else, endif, switch, etc. + -- Repeat({}), -- for, do, while, etc. + -- Label({}), -- case, default, etc. + -- Operator({}), -- "sizeof", "+", "*", etc. + -- Keyword({}), -- any other keyword + -- Exception({}), -- try, catch, throw PreProc({}), -- (preferred) generic Preprocessor - Include({ gui = "italic" }), -- preprocessor #include - Define({}), -- preprocessor #define - Macro({}), -- same as Define - PreCondit({}), -- preprocessor #if, #else, #endif, etc. + -- Include({}), -- preprocessor #include + -- Define({}), -- preprocessor #define + -- Macro({}), -- same as Define + -- PreCondit({}), -- preprocessor #if, #else, #endif, etc. - Type({ gui = "bold" }), -- (preferred) int, long, char, etc. + Type({}), -- (preferred) int, long, char, etc. StorageClass({}), -- static, register, volatile, etc. Structure({}), -- struct, union, enum, etc. Typedef({}), -- A typedef - Special({}), -- (preferred) any special symbol - SpecialChar({}), -- special character in a constant - Tag({}), -- you can use CTRL-] on this - Delimiter({ fg = s[1] }), -- character that needs attention - SpecialComment({}), -- special things inside a comment - Debug({}), -- debugging statements + -- Special({ fg = yellow2 }), -- (preferred) any special symbol + Special({ fg = white }), -- (preferred) any special symbol + -- SpecialChar({}), -- special character in a constant + -- Tag({}), -- you can use CTRL-] on this + -- Delimiter({ fg = s[1] }), -- character that needs attention + -- SpecialComment({}), -- special things inside a comment + -- Debug({}), -- debugging statements Underlined({ gui = "underline" }), -- (preferred) text that stands out, HTML links Bold({ gui = "bold" }), @@ -196,19 +198,19 @@ return lush(function() -- Ignore { }, -- (preferred) left blank, hidden |hl-Ignore| - Todo({ fg = hl2, gui = "bold,italic" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX + Todo({ fg = yellow, gui = "bold" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX - LspReferenceText({ gui = "underline", sp = blue }), -- used for highlighting "text" references - LspReferenceRead({ gui = "underline", sp = s.normal }), -- used for highlighting "read" references - LspReferenceWrite({ gui = "underline", sp = green }), -- used for highlighting "write" references + LspReferenceText({ gui = "underline", fg = yellow }), -- used for highlighting "text" references + LspReferenceRead({ gui = "underline", fg = yellow }), -- used for highlighting "read" references + LspReferenceWrite({ gui = "underline", fg = green }), -- used for highlighting "write" references IndentBlanklineChar({ fg = s[8] }), IndentBlanklineContextChar({ fg = nt }), - DiagnosticError({ fg = red, bg = shade(red, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticWarn({ fg = yellow, bg = shade(yellow, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticInfo({ fg = blue, bg = shade(blue, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticHint({ fg = green, bg = shade(green, -78) }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticError({ fg = red }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticWarn({ fg = yellow }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticInfo({ fg = yellow }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticHint({ fg = green }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text @@ -225,10 +227,10 @@ return lush(function() -- LspDiagnosticsFloatingInformation { }, -- Used to color "Information" diagnostic messages in diagnostics float -- LspDiagnosticsFloatingHint { }, -- Used to color "Hint" diagnostic messages in diagnostics float - DiagnosticSignError({ fg = red, bg = shade(red, -84) }), -- Used for "Error" signs in sign column - DiagnosticSignWarning({ fg = yellow, bg = shade(yellow, -84) }), -- Used for "Warning" signs in sign column - DiagnosticSignInformation({ fg = blue, bg = shade(blue, -84) }), -- Used for "Information" signs in sign column - DiagnosticSignHint({ fg = green, bg = shade(green, -84) }), -- Used for "Hint" signs in sign column + DiagnosticSignError({ fg = red }), -- Used for "Error" signs in sign column + DiagnosticSignWarning({ fg = yellow }), -- Used for "Warning" signs in sign column + DiagnosticSignInformation({ fg = s.normal }), -- Used for "Information" signs in sign column + DiagnosticSignHint({ fg = green }), -- Used for "Hint" signs in sign column -- TSAnnotation { }; -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. -- TSAttribute { }; -- (unstable) TODO: docs @@ -258,13 +260,13 @@ return lush(function() -- TSOperator { }; -- For any operator: `+`, but also `->` and `*` in C. -- TSParameter { }; -- For parameters of a function. -- TSParameterReference { }; -- For references to parameters of a function. - TSProperty({ gui = "italic" }), -- Same as `TSField`. + TSProperty({}), -- Same as `TSField`. -- TSPunctDelimiter { }; -- For delimiters ie: `.` -- TSPunctBracket { }; -- For brackets and parens. -- TSPunctSpecial { }; -- For special punctutation that does not fall in the catagories before. -- TSRepeat { }; -- For keywords related to loops. -- TSString { }; -- For strings. - TSStringRegex({ fg = s[1], gui = "italic" }), -- For regexes. + TSStringRegex({ fg = s[1] }), -- For regexes. TSStringEscape({ fg = s.normal, gui = "bold" }), -- For escape characters within a string. -- TSSymbol { }; -- For identifiers referring to symbols or atoms. -- TSType { }; -- For types. @@ -283,6 +285,21 @@ return lush(function() -- TSURI { }; -- Any URI like a link or email. IndentBlankLineContextStart({ gui = "underline", sp = nt }), - TreesitterContext({ fg = s[3], gui = "italic" }), + TreesitterContext({ fg = s[3] }), + + -- Lightspeed + + LightspeedGreyWash({ Comment }), + LightspeedLabel({ fg = white }), + LightspeedOverlapped({ fg = white.darken(15), gui = "underline" }), + LightspeedLabelDistant({ fg = yellow, gui = "underline" }), + LightspeedLabelDistantOverlapped({ fg = yellow.darken(15), gui = "underline" }), + LightspeedShortcut({ fg = yellow }), + LightspeedShortcutOverlapped({ LightspeedShortcut }), + LightspeedMaskedChar({ fg = s.normal, gui = "none" }), + LightspeedUnlabeledMatch({ fg = s.normal, gui = "bold" }), + LightspeedOneCharMatch({ LightspeedShortcut, gui = "none" }), + LightspeedUniqueChar({ LightspeedUnlabeledMatch }), + LightspeedPendingOpArea({ LightspeedShortcut, gui = "underline" }), } end) From 6a9aac70bff1a22b6df6dc79ba975e4535bcb30a Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 01:41:36 +0300 Subject: [PATCH 11/35] Rename theme files --- colors/desolate.vim | 3 +++ colors/monotone.vim | 3 --- lua/lush_theme/{monotone.lua => desolate.lua} | 0 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 colors/desolate.vim delete mode 100644 colors/monotone.vim rename lua/lush_theme/{monotone.lua => desolate.lua} (100%) diff --git a/colors/desolate.vim b/colors/desolate.vim new file mode 100644 index 0000000..1986564 --- /dev/null +++ b/colors/desolate.vim @@ -0,0 +1,3 @@ +let g:colors_name = 'desolate' + +lua require('lush')(require('lush_theme.desolate')) diff --git a/colors/monotone.vim b/colors/monotone.vim deleted file mode 100644 index 10835dd..0000000 --- a/colors/monotone.vim +++ /dev/null @@ -1,3 +0,0 @@ -let g:colors_name = 'monotone' - -lua require('lush')(require('lush_theme.monotone')) diff --git a/lua/lush_theme/monotone.lua b/lua/lush_theme/desolate.lua similarity index 100% rename from lua/lush_theme/monotone.lua rename to lua/lush_theme/desolate.lua From 34aeb3185bdcea736f5f8460540a658f325744ed Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 02:05:44 +0300 Subject: [PATCH 12/35] Update license --- LICENSE | 1 + lua/lush_theme/desolate.lua | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 06ad0de..5807aa4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,4 @@ +Copyright 2022 He4eT Copyright 2021 Kim Silkebækken Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 96987db..4157328 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -1,7 +1,6 @@ +-- desolate.nvim -- --- m o n o t o n e --- --- +-- Copyright 2022 He4eT -- Copyright 2021 Kim Silkebækken -- -- Permission is hereby granted, free of charge, to any person obtaining a copy From faa9265beea81fc938d2a395c60fcec92bc0771e Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 04:00:31 +0300 Subject: [PATCH 13/35] Extract colors --- lua/lush_theme/desolate.lua | 357 ++++++++++++++++++------------------ 1 file changed, 179 insertions(+), 178 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 4157328..f53b147 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -20,54 +20,20 @@ -- 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. --- --- --- Lua configuration example: --- - vim.o.background = 'dark' - vim.g.monotone_h = 0 - vim.g.monotone_s = 0 - vim.g.monotone_l = 70 - vim.g.monotone_contrast = 120 --- +vim.o.background = 'dark' + +vim.g.monotone_h = 0 +vim.g.monotone_s = 0 +vim.g.monotone_l = 70 +vim.g.monotone_contrast = 120 local lush = require("lush") local hsl = lush.hsl --- Config options - -local opt = { - bg = vim.o.background, - contrast = (tonumber(vim.g.monotone_contrast) or 100) / 100, - color = hsl( - tonumber(vim.g.monotone_h) or 15, - tonumber(vim.g.monotone_s) or 5, - tonumber(vim.g.monotone_l) or 50), -} - --- Handle dark/light background color - local offset_fn = "lighten" -if opt.bg == "light" then - opt.color = opt.color.darken(50) - offset_fn = "darken" -end --- Monochrome shades - -local shade = function(color, offset) - return color[offset_fn](offset * opt.contrast) -end -local s = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } --, inv = -100, normal = 100 } -for k, v in pairs(s) do - s[k] = shade(opt.color, v) -end - -s.normal = hsl("#cdcdcd") -s.inv = hsl("#383838") - --- Highlight colors +-- local red = hsl("#ff5111") local yellow = hsl("#ffc812") @@ -76,95 +42,129 @@ local yellow2 = hsl("#ffd700") local green = hsl("#4e9a06") local white = hsl("#ffffff") -local eob = s[4] -local nt = s[4] +-- Config options + +local opt = { + contrast = (tonumber(vim.g.monotone_contrast) or 100) / 100, + base_color = hsl( + tonumber(vim.g.monotone_h) or 15, + tonumber(vim.g.monotone_s) or 5, + tonumber(vim.g.monotone_l) or 50), +} + +-- Monochrome shades + +local colors = {} + +local shade = function(base_color, contrast, offset) + return base_color[offset_fn](contrast * offset) +end + +local offsets = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } +for i, offset in pairs(offsets) do + colors[i] = shade(opt.base_color, opt.contrast, offset) +end + +colors.fg = hsl("#cdcdcd") +colors.bg = hsl("#383838") + +-- Highlight colors + +colors.error = red +colors.warning = yellow +colors.success = green +colors.info = white + +colors.constant = yellow2 +colors.identifier = yellow +colors.statement = white + +colors.nt = colors[4] ---@diagnostic disable: undefined-global return lush(function() return { - Normal({ fg = s.normal, bg = s.inv }), -- Normal text + Normal({ fg = colors.fg, bg = colors.bg }), -- Normal text - SyntaxError({ fg = red, gui = "underline" }), - SyntaxWarning({ fg = yellow, gui = "underline" }), - SyntaxInfo({ fg = yellow, gui = "underline" }), - SyntaxHint({ fg = green, gui = "underline" }), + SyntaxError({ fg = colors.error, gui = "underline" }), + SyntaxWarning({ fg = colors.warning, gui = "underline" }), + SyntaxInfo({ fg = colors.info, gui = "underline" }), + SyntaxHint({ fg = colors.success, gui = "underline" }), - Comment({ fg = s[6] }), -- any comment - ColorColumn({ bg = s[6] }), -- used for the columns set with 'colorcolumn' + Comment({ fg = colors[6] }), -- any comment + ColorColumn({ bg = colors[6] }), -- used for the columns set with 'colorcolumn' Conceal({}), -- placeholder characters substituted for concealed text (see 'conceallevel') - Cursor({ fg = s.inv, bg = yellow }), -- character under the cursor + Cursor({ fg = colors.bg, bg = colors.identifier }), -- character under the cursor -- CursorI({}), -- insert cursor TODO make this based on other colors -- CursorR({}), -- replace cursor -- CursorO({}), -- operator-pending cursor - -- lCursor { }, -- the character under the cursor when |language-mapping| is used (see 'guicursor') - -- CursorIM { }, -- like Cursor, but used when in IME mode |CursorIM| - -- CursorColumn { }, -- Screen-column at the cursor, when 'cursorcolumn' is set. + -- lCursor({}), -- the character under the cursor when |language-mapping| is used (see 'guicursor') + -- CursorIM({}), -- like Cursor, but used when in IME mode |CursorIM| + -- CursorColumn({}), -- Screen-column at the cursor, when 'cursorcolumn' is set. CursorLine({ bg = Normal.bg[offset_fn](2) }), -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. - Directory({}), -- directory names (and other special names in listings) - DiffAdd({ fg = green, gui = "bold" }), -- diff mode: Added line |diff.txt| - DiffChange({ fg = yellow, gui = "bold" }), -- diff mode: Changed line |diff.txt| - DiffDelete({ fg = red }), -- diff mode: Deleted line |diff.txt| - DiffText({ fg = white, bg = red }), -- diff mode: Changed text within a changed line |diff.txt| - EndOfBuffer({ fg = eob }), -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. - -- TermCursor { }, -- cursor in a focused terminal - -- TermCursorNC { }, -- cursor in an unfocused terminal - Error({ fg = red, gui = "bold" }), -- (preferred) any erroneous construct - ErrorMsg({ fg = red, gui = "bold" }), -- error messages on the command line - VertSplit({ fg = s[8] }), -- the column separating vertically split windows - Folded({ fg = s[3], bg = s[9] }), -- line used for closed folds + Directory({ fg = colors.info }), -- directory names (and other special names in listings) + DiffAdd({ fg = colors.success }), -- diff mode: Added line |diff.txt| + DiffChange({ fg = colors.warning }), -- diff mode: Changed line |diff.txt| + DiffDelete({ fg = colors.error }), -- diff mode: Deleted line |diff.txt| + DiffText({ fg = colors.info, bg = colors.error }), -- diff mode: Changed text within a changed line |diff.txt| + -- EndOfBuffer({}), -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. + -- TermCursor({}), -- cursor in a focused terminal + -- TermCursorNC({}), -- cursor in an unfocused terminal + Error({ fg = colors.error }), -- (preferred) any erroneous construct + ErrorMsg({ fg = colors.error }), -- error messages on the command line + VertSplit({ fg = colors[8] }), -- the column separating vertically split windows + Folded({ fg = colors[3], bg = colors[9] }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' SignColumn({}), -- column where |signs| are displayed - IncSearch({ fg = s.inv, bg = yellow }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" - Substitute({}), -- |:substitute| replacement text highlighting - LineNr({ fg = s[6] }), -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. - CursorLineNr({ fg = s[1] }), -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. - MatchParen({ fg = yellow2, gui = "underline" }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| + IncSearch({ fg = colors.bg, bg = colors.identifier }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" + -- Substitute({}), -- |:substitute| replacement text highlighting + LineNr({ fg = colors[6] }), -- Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + CursorLineNr({ fg = colors[1] }), -- Like LineNr when 'cursorline' or 'relativenumber' is set for the cursor line. + MatchParen({ fg = colors.constant, gui = "underline" }), -- The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| ParenMatch({ MatchParen }), ModeMsg({}), -- 'showmode' message (e.g., "-- INSERT -- ") MsgArea({}), -- Area for messages and cmdline MsgSeparator({}), -- Separator for scrolled messages, `msgsep` flag of 'display' - MoreMsg({ fg = yellow, gui = "bold" }), -- |more-prompt| - NonText({ fg = nt }), -- '@' 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). See also |hl-EndOfBuffer|. - NormalFloat({ bg = s[7], fg = s[1] }), -- Normal text in floating windows. + MoreMsg({ fg = colors.identifier, gui = "bold" }), -- |more-prompt| + NonText({ fg = colors.nt }), -- '@' 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). See also |hl-EndOfBuffer|. + NormalFloat({ bg = colors[7], fg = colors[1] }), -- Normal text in floating windows. NormalNC({}), -- Normal text in non-current windows Pmenu({NormalFloat}), -- Popup menu: Normal item. - PmenuSel({ fg = s.inv, bg = s.normal }), -- Popup menu: selected item. - PmenuSbar({ bg = s[6] }), -- Popup menu: scrollbar. - PmenuThumb({ bg = s[3] }), -- Popup menu: Thumb of the scrollbar. + PmenuSel({ fg = colors.bg, bg = colors.fg }), -- Popup menu: selected item. + PmenuSbar({ bg = colors[6] }), -- Popup menu: scrollbar. + PmenuThumb({ bg = colors[3] }), -- Popup menu: Thumb of the scrollbar. Question({}), -- |hit-enter| prompt and yes/no questions QuickFixLine({}), -- Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. - Search({ fg = s.inv, bg = yellow }), -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. + Search({ fg = colors.bg, bg = colors.identifier }), -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. SpecialKey({ gui = "bold" }), -- Unprintable characters: text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| SpellBad({ SyntaxError }), -- Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. SpellCap({ SyntaxInfo }), -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. SpellLocal({ SyntaxHint }), -- Word that is recognized by the spellchecker as one that is used in another region. |spell| Combined with the highlighting used otherwise. SpellRare({ SyntaxWarning }), -- Word that is recognized by the spellchecker as one that is hardly ever used. |spell| Combined with the highlighting used otherwise. - StatusLine({ fg = s.normal, bg = s.inv }), -- status line of current window - -- StatusLine({ fg = s[1], bg = s[8] }), -- status line of current window - StatusLineNC({ fg = s[6], bg = s.inv }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. - TabLine({ fg = s[3] }), -- tab pages line, not active tab page label - TabLineFill({ fg = s[3] }), -- tab pages line, where there are no labels - TabLineSel({ fg = s[1], gui = "bold" }), -- tab pages line, active tab page label + StatusLine({ fg = colors.fg, bg = colors.bg }), -- status line of current window + StatusLineNC({ fg = colors[6], bg = colors.bg }), -- status lines of not-current windows Note: if this is equal to "StatusLine" Vim will use "^^^" in the status line of the current window. + TabLine({ fg = colors[3] }), -- tab pages line, not active tab page label + TabLineFill({ fg = colors[3] }), -- tab pages line, where there are no labels + TabLineSel({ fg = colors[1], gui = "bold" }), -- tab pages line, active tab page label Title({ gui = "bold" }), -- titles for output from ":set all", ":autocmd" etc. - Visual({ fg = s.inv, bg = s.normal }), -- Visual mode selection - VisualNOS({}), -- Visual mode selection when vim is "Not Owning the Selection". - Warning({ fg = yellow, gui = "bold" }), -- warning messages + Visual({ fg = colors.bg, bg = colors.fg }), -- Visual mode selection + -- VisualNOS({}), -- Visual mode selection when vim is "Not Owning the Selection". + Warning({ fg = colors.warning }), -- warning messages WarningMsg({ Warning }), -- warning messages - Whitespace({ fg = s[7] }), -- "nbsp", "space", "tab" and "trail" in 'listchars' - WildMenu({ fg = s[6], bg = s.normal }), -- current match in 'wildmenu' completion + Whitespace({ fg = colors[7] }), -- "nbsp", "space", "tab" and "trail" in 'listchars' + WildMenu({ fg = colors[6], bg = colors.fg }), -- current match in 'wildmenu' completion - Constant({ fg = yellow2 }), -- (preferred) any constant - -- String({ fg = s[2] }), -- a string constant: "this is a string" + Constant({ fg = colors.constant }), -- (preferred) any constant + -- String({}), -- a string constant: "this is a string" -- Character({}), -- a character constant: 'c', '\n' -- Number({}), -- a number constant: 234, 0xff -- Boolean({}), -- a boolean constant: TRUE, false -- Float({}), -- a floating point constant: 2.3e10 - Identifier({ fg = yellow }), -- (preferred) any variable name - -- Identifier({ fg = white }), -- (preferred) any variable name + Identifier({ fg = colors.identifier }), -- (preferred) any variable name -- Function({}), -- function name (also: methods for classes) - Statement({ fg = white }), -- (preferred) any statement + Statement({ fg = colors.statement }), -- (preferred) any statement -- Conditional({}), -- if, then, else, endif, switch, etc. -- Repeat({}), -- for, do, while, etc. -- Label({}), -- case, default, etc. @@ -183,11 +183,10 @@ return lush(function() Structure({}), -- struct, union, enum, etc. Typedef({}), -- A typedef - -- Special({ fg = yellow2 }), -- (preferred) any special symbol - Special({ fg = white }), -- (preferred) any special symbol + Special({ fg = colors.statement }), -- (preferred) any special symbol -- SpecialChar({}), -- special character in a constant -- Tag({}), -- you can use CTRL-] on this - -- Delimiter({ fg = s[1] }), -- character that needs attention + -- Delimiter({}), -- character that needs attention -- SpecialComment({}), -- special things inside a comment -- Debug({}), -- debugging statements @@ -195,108 +194,110 @@ return lush(function() Bold({ gui = "bold" }), Italic({ gui = "italic" }), - -- Ignore { }, -- (preferred) left blank, hidden |hl-Ignore| + -- Ignore({}), -- (preferred) left blank, hidden |hl-Ignore| - Todo({ fg = yellow, gui = "bold" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX + Todo({ fg = colors.identifier, gui = "bold" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX - LspReferenceText({ gui = "underline", fg = yellow }), -- used for highlighting "text" references - LspReferenceRead({ gui = "underline", fg = yellow }), -- used for highlighting "read" references - LspReferenceWrite({ gui = "underline", fg = green }), -- used for highlighting "write" references + LspReferenceText({ gui = "underline", fg = colors.statement }), -- used for highlighting "text" references + LspReferenceRead({ gui = "underline", fg = colors.statement }), -- used for highlighting "read" references + LspReferenceWrite({ gui = "underline", fg = colors.success }), -- used for highlighting "write" references - IndentBlanklineChar({ fg = s[8] }), - IndentBlanklineContextChar({ fg = nt }), + IndentBlanklineChar({ fg = colors[8] }), + IndentBlanklineContextChar({ fg = colors.nt }), - DiagnosticError({ fg = red }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticWarn({ fg = yellow }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticInfo({ fg = yellow }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - DiagnosticHint({ fg = green }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticError({ fg = colors.error }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticWarn({ fg = colors.warning }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticInfo({ fg = colors.info }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) + DiagnosticHint({ fg = colors.success }), -- Used as the base highlight group. Other LspDiagnostic highlights link to this by default (except Underline) - -- LspDiagnosticsVirtualTextError { }, -- Used for "Error" diagnostic virtual text - -- LspDiagnosticsVirtualTextWarning { }, -- Used for "Warning" diagnostic virtual text - -- LspDiagnosticsVirtualTextInformation { }, -- Used for "Information" diagnostic virtual text - -- LspDiagnosticsVirtualTextHint { }, -- Used for "Hint" diagnostic virtual text + -- LspDiagnosticsVirtualTextError({}), -- Used for "Error" diagnostic virtual text + -- LspDiagnosticsVirtualTextWarning({}), -- Used for "Warning" diagnostic virtual text + -- LspDiagnosticsVirtualTextInformation({}), -- Used for "Information" diagnostic virtual text + -- LspDiagnosticsVirtualTextHint({}), -- Used for "Hint" diagnostic virtual text DiagnosticUnderlineError({ SyntaxError }), -- Used to underline "Error" diagnostics DiagnosticUnderlineWarn({ SyntaxWarning }), -- Used to underline "Warning" diagnostics DiagnosticUnderlineInfo({ SyntaxInfo }), -- Used to underline "Information" diagnostics DiagnosticUnderlineHint({ SyntaxHint }), -- Used to underline "Hint" diagnostics - -- LspDiagnosticsFloatingError { }, -- Used to color "Error" diagnostic messages in diagnostics float - -- LspDiagnosticsFloatingWarning { }, -- Used to color "Warning" diagnostic messages in diagnostics float - -- LspDiagnosticsFloatingInformation { }, -- Used to color "Information" diagnostic messages in diagnostics float - -- LspDiagnosticsFloatingHint { }, -- Used to color "Hint" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingError({}), -- Used to color "Error" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingWarning({}), -- Used to color "Warning" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingInformation({}), -- Used to color "Information" diagnostic messages in diagnostics float + -- LspDiagnosticsFloatingHint({}), -- Used to color "Hint" diagnostic messages in diagnostics float - DiagnosticSignError({ fg = red }), -- Used for "Error" signs in sign column - DiagnosticSignWarning({ fg = yellow }), -- Used for "Warning" signs in sign column - DiagnosticSignInformation({ fg = s.normal }), -- Used for "Information" signs in sign column - DiagnosticSignHint({ fg = green }), -- Used for "Hint" signs in sign column + DiagnosticSignError({ fg = colors.error }), -- Used for "Error" signs in sign column + DiagnosticSignWarning({ fg = colors.warning }), -- Used for "Warning" signs in sign column + DiagnosticSignInformation({ fg = colors.info }), -- Used for "Information" signs in sign column + DiagnosticSignHint({ fg = colors.success }), -- Used for "Hint" signs in sign column - -- TSAnnotation { }; -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. - -- TSAttribute { }; -- (unstable) TODO: docs - -- TSBoolean { }; -- For booleans. - -- TSCharacter { }; -- For characters. - -- TSComment { }; -- For comment blocks. - -- TSConstructor { }; -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. - -- TSConditional { }; -- For keywords related to conditionnals. - TSConstant({ gui = "underline", sp = "fg" }), -- For constants - -- TSConstBuiltin { }; -- For constant that are built in the language: `nil` in Lua. - -- TSConstMacro { }; -- For constants that are defined by macros: `NULL` in C. - -- TSError { }; -- For syntax/parser errors. - -- TSException { }; -- For exception related keywords. - -- TSField { }; -- For fields. - -- TSFloat { }; -- For floats. - -- TSFunction { }; -- For function (calls and definitions). - -- TSFuncBuiltin { }; -- For builtin functions: `table.insert` in Lua. - -- TSFuncMacro { }; -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. - -- TSInclude { }; -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. - -- TSKeyword { }; -- For keywords that don't fall in previous categories. - -- TSKeywordFunction { }; -- For keywords used to define a fuction. - -- TSLabel { }; -- For labels: `label:` in C and `:label:` in Lua. - -- TSMethod { }; -- For method calls and definitions. - -- TSNamespace { }; -- For identifiers referring to modules and namespaces. - -- TSNone { }; -- TODO: docs - -- TSNumber { }; -- For all numbers - -- TSOperator { }; -- For any operator: `+`, but also `->` and `*` in C. - -- TSParameter { }; -- For parameters of a function. - -- TSParameterReference { }; -- For references to parameters of a function. + -- Treesitter + + -- TSAnnotation({}); -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. + -- TSAttribute({}); -- (unstable) TODO: docs + -- TSBoolean({}); -- For booleans. + -- TSCharacter({}); -- For characters. + -- TSComment({}); -- For comment blocks. + -- TSConstructor({}); -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. + -- TSConditional({}); -- For keywords related to conditionnals. + -- TSConstant({}), -- For constants + -- TSConstBuiltin({}); -- For constant that are built in the language: `nil` in Lua. + -- TSConstMacro({}); -- For constants that are defined by macros: `NULL` in C. + -- TSError({}); -- For syntax/parser errors. + -- TSException({}); -- For exception related keywords. + -- TSField({}); -- For fields. + -- TSFloat({}); -- For floats. + -- TSFunction({}); -- For function (calls and definitions). + -- TSFuncBuiltin({}); -- For builtin functions: `table.insert` in Lua. + -- TSFuncMacro({}); -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. + -- TSInclude({}); -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. + -- TSKeyword({}); -- For keywords that don't fall in previous categories. + -- TSKeywordFunction({}); -- For keywords used to define a fuction. + -- TSLabel({}); -- For labels: `label:` in C and `:label:` in Lua. + -- TSMethod({}); -- For method calls and definitions. + -- TSNamespace({}); -- For identifiers referring to modules and namespaces. + -- TSNone({}); -- TODO: docs + -- TSNumber({}); -- For all numbers + -- TSOperator({}); -- For any operator: `+`, but also `->` and `*` in C. + -- TSParameter({}); -- For parameters of a function. + -- TSParameterReference({}); -- For references to parameters of a function. TSProperty({}), -- Same as `TSField`. - -- TSPunctDelimiter { }; -- For delimiters ie: `.` - -- TSPunctBracket { }; -- For brackets and parens. - -- TSPunctSpecial { }; -- For special punctutation that does not fall in the catagories before. - -- TSRepeat { }; -- For keywords related to loops. - -- TSString { }; -- For strings. - TSStringRegex({ fg = s[1] }), -- For regexes. - TSStringEscape({ fg = s.normal, gui = "bold" }), -- For escape characters within a string. - -- TSSymbol { }; -- For identifiers referring to symbols or atoms. - -- TSType { }; -- For types. - -- TSTypeBuiltin { }; -- For builtin types. - -- TSVariable { }; -- Any variable name that does not have another highlight. - -- TSVariableBuiltin { }; -- Variable names that are defined by the languages, like `this` or `self`. + -- TSPunctDelimiter({}); -- For delimiters ie: `.` + -- TSPunctBracket({}); -- For brackets and parens. + -- TSPunctSpecial({}); -- For special punctutation that does not fall in the catagories before. + -- TSRepeat({}); -- For keywords related to loops. + -- TSString({}); -- For strings. + TSStringRegex({ fg = colors[1] }), -- For regexes. + TSStringEscape({ fg = colors.fg, gui = "bold" }), -- For escape characters within a string. + -- TSSymbol({}); -- For identifiers referring to symbols or atoms. + -- TSType({}); -- For types. + -- TSTypeBuiltin({}); -- For builtin types. + -- TSVariable({}); -- Any variable name that does not have another highlight. + -- TSVariableBuiltin({}); -- Variable names that are defined by the languages, like `this` or `self`. - -- TSTag { }; -- Tags like html tag names. - -- TSTagDelimiter { }; -- Tag delimiter like `<` `>` `/` - -- TSText { }; -- For strings considered text in a markup language. - -- TSEmphasis { }; -- For text to be represented with emphasis. - -- TSUnderline { }; -- For text to be represented with an underline. - -- TSStrike { }; -- For strikethrough text. - -- TSTitle { }; -- Text that is part of a title. - -- TSLiteral { }; -- Literal text. - -- TSURI { }; -- Any URI like a link or email. + -- TSTag({}); -- Tags like html tag names. + -- TSTagDelimiter({}); -- Tag delimiter like `<` `>` `/` + -- TSText({}); -- For strings considered text in a markup language. + -- TSEmphasis({}); -- For text to be represented with emphasis. + -- TSUnderline({}); -- For text to be represented with an underline. + -- TSStrike({}); -- For strikethrough text. + -- TSTitle({}); -- Text that is part of a title. + -- TSLiteral({}); -- Literal text. + -- TSURI({}); -- Any URI like a link or email. - IndentBlankLineContextStart({ gui = "underline", sp = nt }), - TreesitterContext({ fg = s[3] }), + IndentBlankLineContextStart({ gui = "underline", sp = colors.nt }), + TreesitterContext({ fg = colors[3] }), -- Lightspeed LightspeedGreyWash({ Comment }), - LightspeedLabel({ fg = white }), - LightspeedOverlapped({ fg = white.darken(15), gui = "underline" }), - LightspeedLabelDistant({ fg = yellow, gui = "underline" }), - LightspeedLabelDistantOverlapped({ fg = yellow.darken(15), gui = "underline" }), - LightspeedShortcut({ fg = yellow }), + LightspeedLabel({ fg = colors.statement }), + LightspeedOverlapped({ fg = colors.statement.darken(15), gui = "underline" }), + LightspeedLabelDistant({ fg = colors.identifier, gui = "underline" }), + LightspeedLabelDistantOverlapped({ fg = colors.identifier.darken(15), gui = "underline" }), + LightspeedShortcut({ fg = colors.identifier }), LightspeedShortcutOverlapped({ LightspeedShortcut }), - LightspeedMaskedChar({ fg = s.normal, gui = "none" }), - LightspeedUnlabeledMatch({ fg = s.normal, gui = "bold" }), + LightspeedMaskedChar({ fg = colors.fg, gui = "none" }), + LightspeedUnlabeledMatch({ fg = colors.fg, gui = "bold" }), LightspeedOneCharMatch({ LightspeedShortcut, gui = "none" }), LightspeedUniqueChar({ LightspeedUnlabeledMatch }), LightspeedPendingOpArea({ LightspeedShortcut, gui = "underline" }), From 9f211ec44fc63f177038edc0386f33abac1f7a3e Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 04:21:48 +0300 Subject: [PATCH 14/35] Unify the indentation --- lua/lush_theme/desolate.lua | 143 ++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 73 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index f53b147..23054f3 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -21,8 +21,6 @@ -- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -- IN THE SOFTWARE. -vim.o.background = 'dark' - vim.g.monotone_h = 0 vim.g.monotone_s = 0 vim.g.monotone_l = 70 @@ -42,9 +40,9 @@ local yellow2 = hsl("#ffd700") local green = hsl("#4e9a06") local white = hsl("#ffffff") --- Config options +-- Config params -local opt = { +local params = { contrast = (tonumber(vim.g.monotone_contrast) or 100) / 100, base_color = hsl( tonumber(vim.g.monotone_h) or 15, @@ -62,7 +60,7 @@ end local offsets = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } for i, offset in pairs(offsets) do - colors[i] = shade(opt.base_color, opt.contrast, offset) + colors[i] = shade(params.base_color, params.contrast, offset) end colors.fg = hsl("#cdcdcd") @@ -129,7 +127,7 @@ return lush(function() NonText({ fg = colors.nt }), -- '@' 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). See also |hl-EndOfBuffer|. NormalFloat({ bg = colors[7], fg = colors[1] }), -- Normal text in floating windows. NormalNC({}), -- Normal text in non-current windows - Pmenu({NormalFloat}), -- Popup menu: Normal item. + Pmenu({ NormalFloat }), -- Popup menu: Normal item. PmenuSel({ fg = colors.bg, bg = colors.fg }), -- Popup menu: selected item. PmenuSbar({ bg = colors[6] }), -- Popup menu: scrollbar. PmenuThumb({ bg = colors[3] }), -- Popup menu: Thumb of the scrollbar. @@ -155,40 +153,40 @@ return lush(function() WildMenu({ fg = colors[6], bg = colors.fg }), -- current match in 'wildmenu' completion Constant({ fg = colors.constant }), -- (preferred) any constant - -- String({}), -- a string constant: "this is a string" - -- Character({}), -- a character constant: 'c', '\n' - -- Number({}), -- a number constant: 234, 0xff - -- Boolean({}), -- a boolean constant: TRUE, false - -- Float({}), -- a floating point constant: 2.3e10 + -- String({}), -- a string constant: "this is a string" + -- Character({}), -- a character constant: 'c', '\n' + -- Number({}), -- a number constant: 234, 0xff + -- Boolean({}), -- a boolean constant: TRUE, false + -- Float({}), -- a floating point constant: 2.3e10 Identifier({ fg = colors.identifier }), -- (preferred) any variable name -- Function({}), -- function name (also: methods for classes) Statement({ fg = colors.statement }), -- (preferred) any statement - -- Conditional({}), -- if, then, else, endif, switch, etc. - -- Repeat({}), -- for, do, while, etc. - -- Label({}), -- case, default, etc. + -- Conditional({}), -- if, then, else, endif, switch, etc. + -- Repeat({}), -- for, do, while, etc. + -- Label({}), -- case, default, etc. -- Operator({}), -- "sizeof", "+", "*", etc. - -- Keyword({}), -- any other keyword - -- Exception({}), -- try, catch, throw + -- Keyword({}), -- any other keyword + -- Exception({}), -- try, catch, throw PreProc({}), -- (preferred) generic Preprocessor - -- Include({}), -- preprocessor #include - -- Define({}), -- preprocessor #define - -- Macro({}), -- same as Define - -- PreCondit({}), -- preprocessor #if, #else, #endif, etc. + -- Include({}), -- preprocessor #include + -- Define({}), -- preprocessor #define + -- Macro({}), -- same as Define + -- PreCondit({}), -- preprocessor #if, #else, #endif, etc. Type({}), -- (preferred) int, long, char, etc. StorageClass({}), -- static, register, volatile, etc. - Structure({}), -- struct, union, enum, etc. - Typedef({}), -- A typedef + Structure({}), -- struct, union, enum, etc. + Typedef({}), -- A typedef Special({ fg = colors.statement }), -- (preferred) any special symbol - -- SpecialChar({}), -- special character in a constant - -- Tag({}), -- you can use CTRL-] on this - -- Delimiter({}), -- character that needs attention + -- SpecialChar({}), -- special character in a constant + -- Tag({}), -- you can use CTRL-] on this + -- Delimiter({}), -- character that needs attention -- SpecialComment({}), -- special things inside a comment - -- Debug({}), -- debugging statements + -- Debug({}), -- debugging statements Underlined({ gui = "underline" }), -- (preferred) text that stands out, HTML links Bold({ gui = "bold" }), @@ -232,57 +230,56 @@ return lush(function() -- Treesitter - -- TSAnnotation({}); -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. - -- TSAttribute({}); -- (unstable) TODO: docs - -- TSBoolean({}); -- For booleans. - -- TSCharacter({}); -- For characters. - -- TSComment({}); -- For comment blocks. - -- TSConstructor({}); -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. - -- TSConditional({}); -- For keywords related to conditionnals. + -- TSAnnotation({}), -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. + -- TSAttribute({}), -- (unstable) TODO: docs + -- TSBoolean({}), -- For booleans. + -- TSCharacter({}), -- For characters. + -- TSComment({}), -- For comment blocks. + -- TSConstructor({}), -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. + -- TSConditional({}), -- For keywords related to conditionnals. -- TSConstant({}), -- For constants - -- TSConstBuiltin({}); -- For constant that are built in the language: `nil` in Lua. - -- TSConstMacro({}); -- For constants that are defined by macros: `NULL` in C. - -- TSError({}); -- For syntax/parser errors. - -- TSException({}); -- For exception related keywords. - -- TSField({}); -- For fields. - -- TSFloat({}); -- For floats. - -- TSFunction({}); -- For function (calls and definitions). - -- TSFuncBuiltin({}); -- For builtin functions: `table.insert` in Lua. - -- TSFuncMacro({}); -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. - -- TSInclude({}); -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. - -- TSKeyword({}); -- For keywords that don't fall in previous categories. - -- TSKeywordFunction({}); -- For keywords used to define a fuction. - -- TSLabel({}); -- For labels: `label:` in C and `:label:` in Lua. - -- TSMethod({}); -- For method calls and definitions. - -- TSNamespace({}); -- For identifiers referring to modules and namespaces. - -- TSNone({}); -- TODO: docs - -- TSNumber({}); -- For all numbers - -- TSOperator({}); -- For any operator: `+`, but also `->` and `*` in C. - -- TSParameter({}); -- For parameters of a function. - -- TSParameterReference({}); -- For references to parameters of a function. + -- TSConstBuiltin({}), -- For constant that are built in the language: `nil` in Lua. + -- TSConstMacro({}), -- For constants that are defined by macros: `NULL` in C. + -- TSError({}), -- For syntax/parser errors. + -- TSException({}), -- For exception related keywords. + -- TSField({}), -- For fields. + -- TSFloat({}), -- For floats. + -- TSFunction({}), -- For function (calls and definitions). + -- TSFuncBuiltin({}), -- For builtin functions: `table.insert` in Lua. + -- TSFuncMacro({}), -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. + -- TSInclude({}), -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. + -- TSKeyword({}), -- For keywords that don't fall in previous categories. + -- TSKeywordFunction({}), -- For keywords used to define a fuction. + -- TSLabel({}), -- For labels: `label:` in C and `:label:` in Lua. + -- TSMethod({}), -- For method calls and definitions. + -- TSNamespace({}), -- For identifiers referring to modules and namespaces. + -- TSNone({}), -- TODO: docs + -- TSNumber({}), -- For all numbers + -- TSOperator({}), -- For any operator: `+`, but also `->` and `*` in C. + -- TSParameter({}), -- For parameters of a function. + -- TSParameterReference({}), -- For references to parameters of a function. TSProperty({}), -- Same as `TSField`. - -- TSPunctDelimiter({}); -- For delimiters ie: `.` - -- TSPunctBracket({}); -- For brackets and parens. - -- TSPunctSpecial({}); -- For special punctutation that does not fall in the catagories before. - -- TSRepeat({}); -- For keywords related to loops. - -- TSString({}); -- For strings. + -- TSPunctDelimiter({}), -- For delimiters ie: `.` + -- TSPunctBracket({}), -- For brackets and parens. + -- TSPunctSpecial({}), -- For special punctutation that does not fall in the catagories before. + -- TSRepeat({}), -- For keywords related to loops. + -- TSString({}), -- For strings. TSStringRegex({ fg = colors[1] }), -- For regexes. TSStringEscape({ fg = colors.fg, gui = "bold" }), -- For escape characters within a string. - -- TSSymbol({}); -- For identifiers referring to symbols or atoms. - -- TSType({}); -- For types. - -- TSTypeBuiltin({}); -- For builtin types. - -- TSVariable({}); -- Any variable name that does not have another highlight. - -- TSVariableBuiltin({}); -- Variable names that are defined by the languages, like `this` or `self`. - - -- TSTag({}); -- Tags like html tag names. - -- TSTagDelimiter({}); -- Tag delimiter like `<` `>` `/` - -- TSText({}); -- For strings considered text in a markup language. - -- TSEmphasis({}); -- For text to be represented with emphasis. - -- TSUnderline({}); -- For text to be represented with an underline. - -- TSStrike({}); -- For strikethrough text. - -- TSTitle({}); -- Text that is part of a title. - -- TSLiteral({}); -- Literal text. - -- TSURI({}); -- Any URI like a link or email. + -- TSSymbol({}), -- For identifiers referring to symbols or atoms. + -- TSType({}), -- For types. + -- TSTypeBuiltin({}), -- For builtin types. + -- TSVariable({}), -- Any variable name that does not have another highlight. + -- TSVariableBuiltin({}), -- Variable names that are defined by the languages, like `this` or `self`. + -- TSTag({}), -- Tags like html tag names. + -- TSTagDelimiter({}), -- Tag delimiter like `<` `>` `/` + -- TSText({}), -- For strings considered text in a markup language. + -- TSEmphasis({}), -- For text to be represented with emphasis. + -- TSUnderline({}), -- For text to be represented with an underline. + -- TSStrike({}), -- For strikethrough text. + -- TSTitle({}), -- Text that is part of a title. + -- TSLiteral({}), -- Literal text. + -- TSURI({}), -- Any URI like a link or email. IndentBlankLineContextStart({ gui = "underline", sp = colors.nt }), TreesitterContext({ fg = colors[3] }), From 48d950c771aa94d0683978d5f56c06bbc9f1079d Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 19:16:05 +0300 Subject: [PATCH 15/35] Add customization options --- lua/lush_theme/desolate.lua | 72 ++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 23054f3..da46073 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -21,64 +21,62 @@ -- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -- IN THE SOFTWARE. -vim.g.monotone_h = 0 -vim.g.monotone_s = 0 -vim.g.monotone_l = 70 -vim.g.monotone_contrast = 120 - local lush = require("lush") local hsl = lush.hsl local offset_fn = "lighten" --- - -local red = hsl("#ff5111") -local yellow = hsl("#ffc812") -local yellow2 = hsl("#ffd700") - -local green = hsl("#4e9a06") -local white = hsl("#ffffff") - -- Config params local params = { - contrast = (tonumber(vim.g.monotone_contrast) or 100) / 100, + contrast = (tonumber(vim.g.desolate_contrast) or 120) / 100, base_color = hsl( - tonumber(vim.g.monotone_h) or 15, - tonumber(vim.g.monotone_s) or 5, - tonumber(vim.g.monotone_l) or 50), + tonumber(vim.g.desolate_h) or 0, + tonumber(vim.g.desolate_s) or 0, + tonumber(vim.g.desolate_l) or 70), + + fg = vim.g.desolate_fg or "#cdcdcd", + bg = vim.g.desolate_bg or "#383838", + + constant = vim.g.desolate_constant or "#ffd700", + identifier = vim.g.desolate_identifier or "#ffc812", + statement = vim.g.desolate_statement or "#ffffff", + + error = vim.g.desolate_error or "#ff5111", + warning = vim.g.desolate_warning or "#ffc812", + success = vim.g.desolate_success or "#4e9a06", + info = vim.g.desolate_info or "#ffffff", +} + +-- Main colors + +local colors = { + nt = params.base_color, + + fg = hsl(params.fg), + bg = hsl(params.bg), + + constant = hsl(params.constant), + identifier = hsl(params.identifier), + statement = hsl(params.statement), + + error = hsl(params.error), + warning = hsl(params.warning), + success = hsl(params.success), + info = hsl(params.info), } -- Monochrome shades -local colors = {} - +local offsets = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } local shade = function(base_color, contrast, offset) return base_color[offset_fn](contrast * offset) end -local offsets = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } for i, offset in pairs(offsets) do colors[i] = shade(params.base_color, params.contrast, offset) end -colors.fg = hsl("#cdcdcd") -colors.bg = hsl("#383838") - --- Highlight colors - -colors.error = red -colors.warning = yellow -colors.success = green -colors.info = white - -colors.constant = yellow2 -colors.identifier = yellow -colors.statement = white - -colors.nt = colors[4] - ---@diagnostic disable: undefined-global return lush(function() return { From dc047bef1b9b4f4a575c886cc88d8da25f8c4a67 Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 19:17:20 +0300 Subject: [PATCH 16/35] Add FloatBorder colors --- lua/lush_theme/desolate.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index da46073..56a6a93 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -124,6 +124,7 @@ return lush(function() MoreMsg({ fg = colors.identifier, gui = "bold" }), -- |more-prompt| NonText({ fg = colors.nt }), -- '@' 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). See also |hl-EndOfBuffer|. NormalFloat({ bg = colors[7], fg = colors[1] }), -- Normal text in floating windows. + FloatBorder({ NormalFloat }), -- Borders in floating windows. NormalNC({}), -- Normal text in non-current windows Pmenu({ NormalFloat }), -- Popup menu: Normal item. PmenuSel({ fg = colors.bg, bg = colors.fg }), -- Popup menu: selected item. From 86b8209b9b93ee94e9a94d2cd0069cb43bde12e8 Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 20:25:40 +0300 Subject: [PATCH 17/35] Update README.md --- README.md | 81 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 51f60c0..6b036bb 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,74 @@ -# m o n o t o n e +# desolate.nvim -Another monochrome vim colorscheme. Inspired by various -[other](https://github.com/ewilazarus/preto) -[monochrome](https://github.com/pbrisbin/vim-colors-off) -[colorschemes](https://github.com/fxn/vim-monochrome). - -Monotone is a middle ground between a regular colorscheme and [no syntax -highlighting at all](https://www.kyleisom.net/blog/2012/10/17/syntax-off/). The -colorscheme differentiates comments, strings and keywords with different -weights and shades of gray. It emphasizes errors, warnings and search -highlighting as shown in the screenshots below. - -This is a neovim-specific version of -[vim-monotone](https://github.com/Lokaltog/vim-monotone) based on -[lush.nvim](https://github.com/rktjmp/lush.nvim). This version includes full -support for both dark and light `background`. +Another not-so-colorful neovim colorscheme based on +[m o n o t o n e](https://github.com/Lokaltog/monotone.nvim). ## Installation -Monotone depends on [lush.nvim](https://github.com/rktjmp/lush.nvim). Example using packer.nvim: +This colorscheme depends on [lush.nvim](https://github.com/rktjmp/lush.nvim). Example using packer.nvim: ``` require('packer').startup(function() -- ... use 'rktjmp/lush.nvim' - use 'Lokaltog/monotone.nvim' + use 'He4eT/desolate.nvim' -- ... end) -api.nvim_command 'colorscheme monotone' +vim.cmd [[colorscheme desolate]] ``` ## Customization -The theme color may be customized by setting HSL values with -`g:monotone_[hsl]`. +The background and normal text colors can be configured with: +``` +vim.g.desolate_bg +vim.g.desolate_fg +``` -You may adjust the colorscheme contrast to your liking by setting -`g:monotone_contrast`. +Accent colors may be defined by setting: +``` +vim.g.desolate_constant +vim.g.desolate_identifier +vim.g.desolate_statement +``` -The default contrast factor is 105. Recommended values are between 90 and 110. +Colors for error, warning, success and info messages: +``` +vim.g.desolate_error +vim.g.desolate_warning +vim.g.desolate_success +vim.g.desolate_info +``` + +The base color may be customized by setting HSL values with: +``` +vim.g.desolate_[hsl] +``` + +Also you may slightly adjust the colorscheme contrast to your liking by setting: +``` +vim.g.desolate_contrast +``` ## Configuration example +### Default settings ``` -vim.g.monotone_h = 85 -vim.g.monotone_s = 30 -vim.g.monotone_l = 50 -vim.g.monotone_contrast = 110 -vim.g.monotone_true_monotone = true -vim.o.background = 'light' +vim.g.desolate_h = 0 +vim.g.desolate_s = 0 +vim.g.desolate_l = 70 +vim.g.desolate_contrast = 120 + +vim.g.desolate_fg = '#cdcdcd' +vim.g.desolate_bg = '#383838' + +vim.g.desolate_constant = '#ffd700' +vim.g.desolate_identifier = '#ffc812' +vim.g.desolate_statement = '#ffffff' + +vim.g.desolate_error = '#ff5111' +vim.g.desolate_warning = '#ffc812' +vim.g.desolate_success = '#4e9a06' +vim.g.desolate_info = '#ffffff' ``` From 1084b21ff5567572490c43b402f5d3fb4348849d Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 12 Jul 2022 22:29:43 +0500 Subject: [PATCH 18/35] Specify the language for the examples --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6b036bb..7b75e09 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Another not-so-colorful neovim colorscheme based on This colorscheme depends on [lush.nvim](https://github.com/rktjmp/lush.nvim). Example using packer.nvim: -``` +```lua require('packer').startup(function() -- ... use 'rktjmp/lush.nvim' @@ -21,20 +21,20 @@ vim.cmd [[colorscheme desolate]] ## Customization The background and normal text colors can be configured with: -``` +```lua vim.g.desolate_bg vim.g.desolate_fg ``` Accent colors may be defined by setting: -``` +```lua vim.g.desolate_constant vim.g.desolate_identifier vim.g.desolate_statement ``` Colors for error, warning, success and info messages: -``` +```lua vim.g.desolate_error vim.g.desolate_warning vim.g.desolate_success @@ -42,19 +42,19 @@ vim.g.desolate_info ``` The base color may be customized by setting HSL values with: -``` +```lua vim.g.desolate_[hsl] ``` Also you may slightly adjust the colorscheme contrast to your liking by setting: -``` +```lua vim.g.desolate_contrast ``` ## Configuration example ### Default settings -``` +```lua vim.g.desolate_h = 0 vim.g.desolate_s = 0 vim.g.desolate_l = 70 From 6625b187951495c376804cd7abab3c721d461903 Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 20:31:56 +0300 Subject: [PATCH 19/35] Add screenshot with default colors --- screenshots/default.png | Bin 0 -> 91799 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshots/default.png diff --git a/screenshots/default.png b/screenshots/default.png new file mode 100644 index 0000000000000000000000000000000000000000..a59f877504a77ec33ac4cf9bbf49866414db1220 GIT binary patch literal 91799 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≦$j@b^`~j}4=ul}c-j_ak}!r79N{|QQ?FgymQAcV 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 INA Date: Tue, 12 Jul 2022 22:34:29 +0500 Subject: [PATCH 20/35] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7b75e09..3487199 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,9 @@ vim.g.desolate_contrast ## Configuration example ### Default settings + +![Default colors](screenshots/default.png) + ```lua vim.g.desolate_h = 0 vim.g.desolate_s = 0 From 7eac25a465289de60c2dbcd3767005362758d334 Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 12 Jul 2022 21:14:13 +0300 Subject: [PATCH 21/35] Add screenshot with Evangelion Unit-01 colors --- screenshots/evangelion_unit_01.png | Bin 0 -> 90184 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshots/evangelion_unit_01.png diff --git a/screenshots/evangelion_unit_01.png b/screenshots/evangelion_unit_01.png new file mode 100644 index 0000000000000000000000000000000000000000..7ecc6d14bceb5bd7a6fdcfb9f5fa8133e229c2a4 GIT binary patch literal 90184 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 mdPXOU{k?Xt|9!!#y Date: Tue, 12 Jul 2022 23:19:45 +0500 Subject: [PATCH 22/35] Update README.md --- README.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3487199..0863649 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ vim.g.desolate_contrast ## Configuration example -### Default settings +### Default colors ![Default colors](screenshots/default.png) @@ -75,3 +75,20 @@ vim.g.desolate_warning = '#ffc812' vim.g.desolate_success = '#4e9a06' vim.g.desolate_info = '#ffffff' ``` +### Sketchy Evangelion Unit-01 colors + +![Sketchy Evangelion Unit-01 colors](screenshots/evangelion_unit_01.png) + +```lua +vim.g.desolate_h = 210 +vim.g.desolate_s = 80 +vim.g.desolate_l = 120 +vim.g.desolate_contrast = 100 + +vim.g.desolate_fg = '#9747ff' +vim.g.desolate_bg = '#44335c' + +vim.g.desolate_constant = '#66ff66' +vim.g.desolate_identifier = '#15f4ee' +vim.g.desolate_statement = '#e13dc0' +``` From 775eaf2693d4eb011f6e6fe57b20aab4d59b7d75 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 12 Jul 2022 23:32:02 +0500 Subject: [PATCH 23/35] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0863649..8819e9b 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ require('packer').startup(function() -- ... end) +-- Put your custom settings here + vim.cmd [[colorscheme desolate]] ``` From 34605fed0a4475c005fda76fdb2443d0ef689a42 Mon Sep 17 00:00:00 2001 From: He4eT Date: Mon, 7 Nov 2022 11:49:36 +0300 Subject: [PATCH 24/35] Turn off underlines --- lua/lush_theme/desolate.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 56a6a93..e2afa63 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -82,10 +82,10 @@ return lush(function() return { Normal({ fg = colors.fg, bg = colors.bg }), -- Normal text - SyntaxError({ fg = colors.error, gui = "underline" }), - SyntaxWarning({ fg = colors.warning, gui = "underline" }), - SyntaxInfo({ fg = colors.info, gui = "underline" }), - SyntaxHint({ fg = colors.success, gui = "underline" }), + SyntaxError({ fg = colors.error }), + SyntaxWarning({ fg = colors.warning }), + SyntaxInfo({ fg = colors.info }), + SyntaxHint({ fg = colors.success }), Comment({ fg = colors[6] }), -- any comment ColorColumn({ bg = colors[6] }), -- used for the columns set with 'colorcolumn' @@ -195,9 +195,9 @@ return lush(function() Todo({ fg = colors.identifier, gui = "bold" }), -- (preferred) anything that needs extra attention; mostly the keywords TODO FIXME and XXX - LspReferenceText({ gui = "underline", fg = colors.statement }), -- used for highlighting "text" references - LspReferenceRead({ gui = "underline", fg = colors.statement }), -- used for highlighting "read" references - LspReferenceWrite({ gui = "underline", fg = colors.success }), -- used for highlighting "write" references + LspReferenceText({ fg = colors.statement }), -- used for highlighting "text" references + LspReferenceRead({ fg = colors.statement }), -- used for highlighting "read" references + LspReferenceWrite({ fg = colors.success }), -- used for highlighting "write" references IndentBlanklineChar({ fg = colors[8] }), IndentBlanklineContextChar({ fg = colors.nt }), From 0033224767cee5fd7dbf489f4747437d2ece20fb Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 7 Mar 2023 22:54:24 +0300 Subject: [PATCH 25/35] Backport monotone defaults --- lua/lush_theme/desolate.lua | 100 ++++++++++++++++++++++++------------ 1 file changed, 68 insertions(+), 32 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index e2afa63..519b571 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -24,59 +24,90 @@ local lush = require("lush") local hsl = lush.hsl -local offset_fn = "lighten" - -- Config params local params = { - contrast = (tonumber(vim.g.desolate_contrast) or 120) / 100, + contrast = (tonumber(vim.g.desolate_contrast) or 110) / 100, base_color = hsl( - tonumber(vim.g.desolate_h) or 0, - tonumber(vim.g.desolate_s) or 0, - tonumber(vim.g.desolate_l) or 70), + tonumber(vim.g.desolate_h) or 15, + tonumber(vim.g.desolate_s) or 5, + tonumber(vim.g.desolate_l) or 50), - fg = vim.g.desolate_fg or "#cdcdcd", - bg = vim.g.desolate_bg or "#383838", + fg = vim.g.desolate_fg, + bg = vim.g.desolate_bg, - constant = vim.g.desolate_constant or "#ffd700", - identifier = vim.g.desolate_identifier or "#ffc812", - statement = vim.g.desolate_statement or "#ffffff", + constant = vim.g.desolate_constant, + identifier = vim.g.desolate_identifier, + statement = vim.g.desolate_statement, - error = vim.g.desolate_error or "#ff5111", - warning = vim.g.desolate_warning or "#ffc812", - success = vim.g.desolate_success or "#4e9a06", - info = vim.g.desolate_info or "#ffffff", + error = vim.g.desolate_error or '#ff0000', + warning = vim.g.desolate_warning or '#ffff00', + success = vim.g.desolate_success or '#00ff00', + info = vim.g.desolate_info or '#0000ff', } +-- Offset function + +local offset_fn = "lighten" +if vim.o.background == "light" then + offset_fn = "darken" + params.base_color = params.base_color.darken(50) +end + -- Main colors -local colors = { - nt = params.base_color, - - fg = hsl(params.fg), - bg = hsl(params.bg), - - constant = hsl(params.constant), - identifier = hsl(params.identifier), - statement = hsl(params.statement), - - error = hsl(params.error), - warning = hsl(params.warning), - success = hsl(params.success), - info = hsl(params.info), -} +local colors = {} -- Monochrome shades -local offsets = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } local shade = function(base_color, contrast, offset) return base_color[offset_fn](contrast * offset) end +local offsets = { 50, 20, 10, 0, -10, -25, -45, -60, -70 } for i, offset in pairs(offsets) do colors[i] = shade(params.base_color, params.contrast, offset) end +-- Logical colors + +local useHex = function(hexColor, fallback) + if hexColor then + return hsl(hexColor) + else + return fallback + end +end + +colors.nt = params.base_color + +colors.fg = useHex( + params.fg, + shade(params.base_color, params.contrast, 100)) + +colors.bg = useHex( + params.bg, + shade(params.base_color, params.contrast, -100)) + +colors.constant = useHex( + params.constant, + colors[0]) + +colors.identifier = useHex( + params.identifier, + colors[1]) + +colors.statement = useHex( + params.statement, + colors[2]) + +colors.error = hsl(params.error) +colors.warning = hsl(params.warning) +colors.success = hsl(params.success) +colors.info = hsl(params.info) + +-- Highlights + ---@diagnostic disable: undefined-global return lush(function() return { @@ -284,7 +315,6 @@ return lush(function() TreesitterContext({ fg = colors[3] }), -- Lightspeed - LightspeedGreyWash({ Comment }), LightspeedLabel({ fg = colors.statement }), LightspeedOverlapped({ fg = colors.statement.darken(15), gui = "underline" }), @@ -297,5 +327,11 @@ return lush(function() LightspeedOneCharMatch({ LightspeedShortcut, gui = "none" }), LightspeedUniqueChar({ LightspeedUnlabeledMatch }), LightspeedPendingOpArea({ LightspeedShortcut, gui = "underline" }), + + -- Leap + LeapBackdrop({ Comment }), + LeapLabelPrimary({ Identifier }), + LeapMatch({ Constant }), + LeapLabelSecondary({ Statement }), } end) From c8085ddcb4a8244f716d878728a0fa0a5630376f Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 7 Mar 2023 23:38:33 +0300 Subject: [PATCH 26/35] Update README.md --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8819e9b..213ba48 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ +![Default colors](screenshots/default.png) + # desolate.nvim -Another not-so-colorful neovim colorscheme based on +Another customizable and not-so-colorful neovim colorscheme based on [m o n o t o n e](https://github.com/Lokaltog/monotone.nvim). ## Installation @@ -10,8 +12,7 @@ This colorscheme depends on [lush.nvim](https://github.com/rktjmp/lush.nvim). Ex ```lua require('packer').startup(function() -- ... - use 'rktjmp/lush.nvim' - use 'He4eT/desolate.nvim' + use { 'He4eT/desolate.nvim', requires = { 'rktjmp/lush.nvim' } } -- ... end) @@ -22,6 +23,8 @@ vim.cmd [[colorscheme desolate]] ## Customization +I recommend that you first set the background color, adjust the HSL, and then pick accents for the statements, identifiers and constants. + The background and normal text colors can be configured with: ```lua vim.g.desolate_bg @@ -83,8 +86,8 @@ vim.g.desolate_info = '#ffffff' ```lua vim.g.desolate_h = 210 -vim.g.desolate_s = 80 -vim.g.desolate_l = 120 +vim.g.desolate_s = 55 +vim.g.desolate_l = 60 vim.g.desolate_contrast = 100 vim.g.desolate_fg = '#9747ff' From 7872623387208c076b6d0d30a9ee943e147206ca Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 8 Mar 2023 13:23:13 +0500 Subject: [PATCH 27/35] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 213ba48..3f2cd8b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -![Default colors](screenshots/default.png) - # desolate.nvim Another customizable and not-so-colorful neovim colorscheme based on [m o n o t o n e](https://github.com/Lokaltog/monotone.nvim). +![Default colors](screenshots/default.png) + ## Installation This colorscheme depends on [lush.nvim](https://github.com/rktjmp/lush.nvim). Example using packer.nvim: From 5bf06c998bc97927c55ce205d24baec611d874df Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 9 Mar 2023 05:40:23 +0500 Subject: [PATCH 28/35] Update README.md --- README.md | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 3f2cd8b..ebee6b0 100644 --- a/README.md +++ b/README.md @@ -31,24 +31,11 @@ vim.g.desolate_bg vim.g.desolate_fg ``` -Accent colors may be defined by setting: -```lua -vim.g.desolate_constant -vim.g.desolate_identifier -vim.g.desolate_statement -``` - -Colors for error, warning, success and info messages: -```lua -vim.g.desolate_error -vim.g.desolate_warning -vim.g.desolate_success -vim.g.desolate_info -``` - The base color may be customized by setting HSL values with: ```lua -vim.g.desolate_[hsl] +vim.g.desolate_h +vim.g.desolate_s +vim.g.desolate_l ``` Also you may slightly adjust the colorscheme contrast to your liking by setting: @@ -56,6 +43,21 @@ Also you may slightly adjust the colorscheme contrast to your liking by setting: vim.g.desolate_contrast ``` +Accent colors may be defined by setting: +```lua +vim.g.desolate_statement +vim.g.desolate_identifier +vim.g.desolate_constant +``` + +Colors for error, warning, success and info messages (you can use colors from your terminal): +```lua +vim.g.desolate_error +vim.g.desolate_warning +vim.g.desolate_success +vim.g.desolate_info +``` + ## Configuration example ### Default colors From d29d7130f783b3f7ce7341db51e34d9634822918 Mon Sep 17 00:00:00 2001 From: He4eT Date: Wed, 8 Mar 2023 14:41:19 +0300 Subject: [PATCH 29/35] Add dirty fix for Typescript hover popup --- lua/lush_theme/desolate.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 519b571..608271e 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -333,5 +333,8 @@ return lush(function() LeapLabelPrimary({ Identifier }), LeapMatch({ Constant }), LeapLabelSecondary({ Statement }), + + -- Dirty fixes + typescriptParens({ NormalFloat }) } end) From bec38cf4cb098842e43af0d68a9b39166f34817f Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 11 Jul 2023 02:22:12 +0300 Subject: [PATCH 30/35] Tune fzf-lua colors --- lua/lush_theme/desolate.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 608271e..4891ea7 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -334,6 +334,10 @@ return lush(function() LeapMatch({ Constant }), LeapLabelSecondary({ Statement }), + -- Fzf-lua + FzfLuaHeaderBind({ Statement }), + FzfLuaHeaderText({ Identifier }), + -- Dirty fixes typescriptParens({ NormalFloat }) } From b87fff48ccb2c443b90c83b0115d60a7aaa56904 Mon Sep 17 00:00:00 2001 From: He4eT Date: Tue, 11 Jul 2023 02:24:14 +0300 Subject: [PATCH 31/35] Tune fzf-lua colors --- lua/lush_theme/desolate.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 4891ea7..de55e01 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -335,8 +335,8 @@ return lush(function() LeapLabelSecondary({ Statement }), -- Fzf-lua - FzfLuaHeaderBind({ Statement }), - FzfLuaHeaderText({ Identifier }), + FzfLuaHeaderBind({ Identifier }), + FzfLuaHeaderText({ Statement }), -- Dirty fixes typescriptParens({ NormalFloat }) From 460602427d4a7a35364790e520cf032e5d78cb60 Mon Sep 17 00:00:00 2001 From: He4eT Date: Sat, 22 Jun 2024 23:23:26 +0200 Subject: [PATCH 32/35] Adapt to Neovim 0.10 --- lua/lush_theme/desolate.lua | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index de55e01..48626e6 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -111,7 +111,11 @@ colors.info = hsl(params.info) ---@diagnostic disable: undefined-global return lush(function() return { + -- :h highlight-gui + Normal({ fg = colors.fg, bg = colors.bg }), -- Normal text + -- WinSeparator({ fg = colors[8] }), + WinSeparator({ fg = Normal.bg[offset_fn](2) }), -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. SyntaxError({ fg = colors.error }), SyntaxWarning({ fg = colors.warning }), @@ -137,10 +141,13 @@ return lush(function() -- EndOfBuffer({}), -- filler lines (~) after the end of the buffer. By default, this is highlighted like |hl-NonText|. -- TermCursor({}), -- cursor in a focused terminal -- TermCursorNC({}), -- cursor in an unfocused terminal + Added({ fg = colors.success }), + Changed({ fg = colors.warning }), + Removed({ fg = colors.error }), Error({ fg = colors.error }), -- (preferred) any erroneous construct ErrorMsg({ fg = colors.error }), -- error messages on the command line VertSplit({ fg = colors[8] }), -- the column separating vertically split windows - Folded({ fg = colors[3], bg = colors[9] }), -- line used for closed folds + Folded({ fg = colors[9], bg = colors[3] }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' SignColumn({}), -- column where |signs| are displayed IncSearch({ fg = colors.bg, bg = colors.identifier }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" @@ -164,6 +171,7 @@ return lush(function() Question({}), -- |hit-enter| prompt and yes/no questions QuickFixLine({}), -- Current |quickfix| item in the quickfix window. Combined with |hl-CursorLine| when the cursor is there. Search({ fg = colors.bg, bg = colors.identifier }), -- Last search pattern highlighting (see 'hlsearch'). Also used for similar items that need to stand out. + CurSearch({ fg = colors.bg, bg = colors.constant }), -- Search pattern under the cursor SpecialKey({ gui = "bold" }), -- Unprintable characters: text displayed differently from what it really is. But not 'listchars' whitespace. |hl-Whitespace| SpellBad({ SyntaxError }), -- Word that is not recognized by the spellchecker. |spell| Combined with the highlighting used otherwise. SpellCap({ SyntaxInfo }), -- Word that should start with a capital. |spell| Combined with the highlighting used otherwise. @@ -182,15 +190,17 @@ return lush(function() Whitespace({ fg = colors[7] }), -- "nbsp", "space", "tab" and "trail" in 'listchars' WildMenu({ fg = colors[6], bg = colors.fg }), -- current match in 'wildmenu' completion + -- :h group-name + Constant({ fg = colors.constant }), -- (preferred) any constant - -- String({}), -- a string constant: "this is a string" - -- Character({}), -- a character constant: 'c', '\n' - -- Number({}), -- a number constant: 234, 0xff - -- Boolean({}), -- a boolean constant: TRUE, false - -- Float({}), -- a floating point constant: 2.3e10 + String({ Constant }), -- a string constant: "this is a string" + -- Character({ Constant }), -- a character constant: 'c', '\n' + -- Number({ Constant }), -- a number constant: 234, 0xff + -- Boolean({ Constant }), -- a boolean constant: TRUE, false + -- Float({ Constant }), -- a floating point constant: 2.3e10 Identifier({ fg = colors.identifier }), -- (preferred) any variable name - -- Function({}), -- function name (also: methods for classes) + Function({ Identifier }), -- function name (also: methods for classes) Statement({ fg = colors.statement }), -- (preferred) any statement -- Conditional({}), -- if, then, else, endif, switch, etc. From ba2c186626b906af83bf7bfb4992ccfc32b3ea11 Mon Sep 17 00:00:00 2001 From: He4eT Date: Sun, 23 Jun 2024 01:29:17 +0200 Subject: [PATCH 33/35] Update variables color --- lua/lush_theme/desolate.lua | 64 +++++-------------------------------- 1 file changed, 8 insertions(+), 56 deletions(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 48626e6..f9a8a65 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -109,12 +109,16 @@ colors.info = hsl(params.info) -- Highlights ---@diagnostic disable: undefined-global -return lush(function() +return lush(function(injected_functions) + local sym = injected_functions.sym return { + -- :h treesitter-highlight + + sym("@variable") { fg = colors.identifier }, + -- :h highlight-gui Normal({ fg = colors.fg, bg = colors.bg }), -- Normal text - -- WinSeparator({ fg = colors[8] }), WinSeparator({ fg = Normal.bg[offset_fn](2) }), -- Screen-line at the cursor, when 'cursorline' is set. Low-priority if foreground (ctermfg OR guifg) is not set. SyntaxError({ fg = colors.error }), @@ -122,6 +126,7 @@ return lush(function() SyntaxInfo({ fg = colors.info }), SyntaxHint({ fg = colors.success }), + Operator({ fg = colors.statement }), Comment({ fg = colors[6] }), -- any comment ColorColumn({ bg = colors[6] }), -- used for the columns set with 'colorcolumn' Conceal({}), -- placeholder characters substituted for concealed text (see 'conceallevel') @@ -147,7 +152,7 @@ return lush(function() Error({ fg = colors.error }), -- (preferred) any erroneous construct ErrorMsg({ fg = colors.error }), -- error messages on the command line VertSplit({ fg = colors[8] }), -- the column separating vertically split windows - Folded({ fg = colors[9], bg = colors[3] }), -- line used for closed folds + Folded({ fg = colors[3], bg = colors[3] }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' SignColumn({}), -- column where |signs| are displayed IncSearch({ fg = colors.bg, bg = colors.identifier }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" @@ -268,59 +273,6 @@ return lush(function() DiagnosticSignInformation({ fg = colors.info }), -- Used for "Information" signs in sign column DiagnosticSignHint({ fg = colors.success }), -- Used for "Hint" signs in sign column - -- Treesitter - - -- TSAnnotation({}), -- For C++/Dart attributes, annotations that can be attached to the code to denote some kind of meta information. - -- TSAttribute({}), -- (unstable) TODO: docs - -- TSBoolean({}), -- For booleans. - -- TSCharacter({}), -- For characters. - -- TSComment({}), -- For comment blocks. - -- TSConstructor({}), -- For constructor calls and definitions: ` { }` in Lua, and Java constructors. - -- TSConditional({}), -- For keywords related to conditionnals. - -- TSConstant({}), -- For constants - -- TSConstBuiltin({}), -- For constant that are built in the language: `nil` in Lua. - -- TSConstMacro({}), -- For constants that are defined by macros: `NULL` in C. - -- TSError({}), -- For syntax/parser errors. - -- TSException({}), -- For exception related keywords. - -- TSField({}), -- For fields. - -- TSFloat({}), -- For floats. - -- TSFunction({}), -- For function (calls and definitions). - -- TSFuncBuiltin({}), -- For builtin functions: `table.insert` in Lua. - -- TSFuncMacro({}), -- For macro defined fuctions (calls and definitions): each `macro_rules` in Rust. - -- TSInclude({}), -- For includes: `#include` in C, `use` or `extern crate` in Rust, or `require` in Lua. - -- TSKeyword({}), -- For keywords that don't fall in previous categories. - -- TSKeywordFunction({}), -- For keywords used to define a fuction. - -- TSLabel({}), -- For labels: `label:` in C and `:label:` in Lua. - -- TSMethod({}), -- For method calls and definitions. - -- TSNamespace({}), -- For identifiers referring to modules and namespaces. - -- TSNone({}), -- TODO: docs - -- TSNumber({}), -- For all numbers - -- TSOperator({}), -- For any operator: `+`, but also `->` and `*` in C. - -- TSParameter({}), -- For parameters of a function. - -- TSParameterReference({}), -- For references to parameters of a function. - TSProperty({}), -- Same as `TSField`. - -- TSPunctDelimiter({}), -- For delimiters ie: `.` - -- TSPunctBracket({}), -- For brackets and parens. - -- TSPunctSpecial({}), -- For special punctutation that does not fall in the catagories before. - -- TSRepeat({}), -- For keywords related to loops. - -- TSString({}), -- For strings. - TSStringRegex({ fg = colors[1] }), -- For regexes. - TSStringEscape({ fg = colors.fg, gui = "bold" }), -- For escape characters within a string. - -- TSSymbol({}), -- For identifiers referring to symbols or atoms. - -- TSType({}), -- For types. - -- TSTypeBuiltin({}), -- For builtin types. - -- TSVariable({}), -- Any variable name that does not have another highlight. - -- TSVariableBuiltin({}), -- Variable names that are defined by the languages, like `this` or `self`. - -- TSTag({}), -- Tags like html tag names. - -- TSTagDelimiter({}), -- Tag delimiter like `<` `>` `/` - -- TSText({}), -- For strings considered text in a markup language. - -- TSEmphasis({}), -- For text to be represented with emphasis. - -- TSUnderline({}), -- For text to be represented with an underline. - -- TSStrike({}), -- For strikethrough text. - -- TSTitle({}), -- Text that is part of a title. - -- TSLiteral({}), -- Literal text. - -- TSURI({}), -- Any URI like a link or email. - IndentBlankLineContextStart({ gui = "underline", sp = colors.nt }), TreesitterContext({ fg = colors[3] }), From f68e20af9b4ed4ea4735402ccf1df74dc97eb45a Mon Sep 17 00:00:00 2001 From: He4eT Date: Sun, 23 Jun 2024 02:47:56 +0200 Subject: [PATCH 34/35] Update Folded colors --- lua/lush_theme/desolate.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index f9a8a65..456cb4e 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -152,7 +152,7 @@ return lush(function(injected_functions) Error({ fg = colors.error }), -- (preferred) any erroneous construct ErrorMsg({ fg = colors.error }), -- error messages on the command line VertSplit({ fg = colors[8] }), -- the column separating vertically split windows - Folded({ fg = colors[3], bg = colors[3] }), -- line used for closed folds + Folded({ fg = colors[3], bg = colors[7] }), -- line used for closed folds FoldColumn({}), -- 'foldcolumn' SignColumn({}), -- column where |signs| are displayed IncSearch({ fg = colors.bg, bg = colors.identifier }), -- 'incsearch' highlighting; also used for the text replaced with ":s///c" From 08c59bb2d9e805b206e8128a698bb839a189f1ae Mon Sep 17 00:00:00 2001 From: He4eT Date: Sat, 13 Jul 2024 02:32:44 +0200 Subject: [PATCH 35/35] Follow up the leap.nvim updates --- lua/lush_theme/desolate.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/lush_theme/desolate.lua b/lua/lush_theme/desolate.lua index 456cb4e..31d4f5f 100644 --- a/lua/lush_theme/desolate.lua +++ b/lua/lush_theme/desolate.lua @@ -292,6 +292,7 @@ return lush(function(injected_functions) -- Leap LeapBackdrop({ Comment }), + LeapLabel({ Identifier }), LeapLabelPrimary({ Identifier }), LeapMatch({ Constant }), LeapLabelSecondary({ Statement }),