diff --git a/README.md b/README.md index 3c5f51c..cfbeea7 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,15 @@ This template's focus is on compatability with [semantic highlighting](https://medium.com/@evnbr/coding-in-color-3a6db2743a1e). +It provides a large supply of defaults for plugins and programming languages as a result of defining a smaller set of "categorical" highlights (you can read more about this at Neovim's `group-name` help page). + # Prerequisites 1. Neovim 0.5+ # Usage -Usage is simple. This repository should be cloned with `git clone https://github.com/Iron-E/nvim-highlite`, and then: +This repository should be cloned with `git clone https://github.com/Iron-E/nvim-highlite`, and then: 1. Rename `lua/highlite/` to `lua//`. 2. Follow the directions in [lua/``/init.lua](lua/highlite/init.lua). diff --git a/lua/highlite/colorscheme.lua b/lua/highlite/colorscheme.lua index 76142d2..fa1dba6 100644 --- a/lua/highlite/colorscheme.lua +++ b/lua/highlite/colorscheme.lua @@ -1,93 +1,96 @@ --[[ NOTHING IN THIS FILE NEEDS TO BE EDITED BY THE USER. ]] -return function(name, Normal, highlights, terminal_ansi_colors) - -- Clear the highlighting. - vim.cmd('hi clear') +-- Clear the highlighting. +vim.cmd('hi clear') - -- If the syntax has been enabled, reset it. - if vim.fn.exists('syntax_on') then vim.cmd('syntax reset') end +vim.o.background = 'dark' +vim.g.indent_guides_auto_colors = 0 - -- Set the name of the current colorscheme. - vim.g.colors_name = string.lower(name) +-- If the syntax has been enabled, reset it. +if vim.fn.exists('syntax_on') then vim.cmd('syntax reset') end - -- Determine which set of colors to use. - local use_hex_and_256 = string.find(vim.fn.expand('$TERM'), '256') - or vim.g.t_Co >= 256 - or vim.fn.has("gui_running") +-- Determine which set of colors to use. +local use_hex_and_256 = string.find(vim.fn.expand('$TERM'), '256') + or vim.g.t_Co >= 256 + or vim.fn.has("gui_running") - -- If we aren't using the hex and 256 colorset, then set the &t_Co variable to 16. - if not use_hex_and_256 then vim.g.t_Co = 16 end +-- If we aren't using the hex and 256 colorset, then set the &t_Co variable to 16. +if not use_hex_and_256 then vim.g.t_Co = 16 end - -- These are constants for the indexes in the colors that were defined before. - local BIT_16 = 3 - local BIT_256 = 2 - local HEX = 1 +-- These are constants for the indexes in the colors that were defined before. +local BIT_16 = 3 +local BIT_256 = 2 +local HEX = 1 - -- Get the color value of a color variable, or "NONE" as a default. - local function get(color, index) - if type(color) == 'table' and color[index] then - return color[index] - elseif type(color) == 'string' then - return color - else - return "NONE" +-- Get the color value of a color variable, or "NONE" as a default. +local function get(color, index) + if type(color) == 'table' and color[index] then + return color[index] + elseif type(color) == 'string' then + return color + else + return "NONE" + end +end + +-- Generate a `:highlight` command from a group and some attributes. +local function highlight(highlight_group, attributes) -- {{{ † + local highlight_cmd = {'hi! ', highlight_group} + local link = attributes.link + + -- If the `highlight_group` is a link to another group. + if attributes.link then + highlight_cmd[3] = highlight_cmd[2] .. ' ' + highlight_cmd[2] = 'link ' + highlight_cmd[4] = attributes.link + else -- the `highlight_group` is uniquely defined. + local bg = attributes.bg + local fg = attributes.fg + local style = attributes.style + + -- If using hex and 256-bit colors, then populate the gui* and cterm* args. + if use_hex_and_256 then highlight_cmd[#highlight_cmd + 1] = + ' ctermbg=' .. get(bg, BIT_256) + .. ' ctermfg=' .. get(fg, BIT_256) + .. ' guibg=' .. get(bg, HEX) + .. ' guifg=' .. get(fg, HEX) + -- If using 16-bit colors, just populate the cterm* args. + else highlight_cmd[#highlight_cmd + 1] = + ' ctermbg=' .. get(bg, BIT_16) + .. ' ctermfg=' .. get(fg, BIT_16) + end + + -- This function appends `selected_attributes` to the end of the `highlight_cmd`. + local function append_style(selected_attributes) + highlight_cmd[#highlight_cmd + 1] = ' cterm=' .. selected_attributes + + -- If we're using hex populate the gui* attr args. + if use_hex_and_256 then highlight_cmd[#highlight_cmd + 1] = + ' gui=' .. selected_attributes + end + end + + if type(style) == 'table' then + -- Concat all of the entries together with a comma between. + local style_all = table.concat(style, ',') + + -- There will always be a cterm attr arg. + append_style(style_all) + + -- There won't always be a `guisp`. + if style.color then highlight_cmd[#highlight_cmd + 1] = + ' guisp=' .. get(style.color, HEX) + end + else append_style(style) end end - -- Generate a `:highlight` command from a group and some attributes. - local function highlight(highlight_group, attributes) -- {{{ † - local highlight_cmd = {'hi! ', highlight_group} - local link = attributes.link + vim.cmd(table.concat(highlight_cmd)) +end --}}} ‡ - -- If the `highlight_group` is a link to another group. - if attributes.link then - highlight_cmd[3] = highlight_cmd[2] .. ' ' - highlight_cmd[2] = 'link ' - highlight_cmd[4] = attributes.link - else -- the `highlight_group` is uniquely defined. - local bg = attributes.bg - local fg = attributes.fg - local style = attributes.style - - -- If using hex and 256-bit colors, then populate the gui* and cterm* args. - if use_hex_and_256 then highlight_cmd[#highlight_cmd + 1] = - ' ctermbg=' .. get(bg, BIT_256) - .. ' ctermfg=' .. get(fg, BIT_256) - .. ' guibg=' .. get(bg, HEX) - .. ' guifg=' .. get(fg, HEX) - -- If using 16-bit colors, just populate the cterm* args. - else highlight_cmd[#highlight_cmd + 1] = - ' ctermbg=' .. get(bg, BIT_16) - .. ' ctermfg=' .. get(fg, BIT_16) - end - - -- This function appends `selected_attributes` to the end of the `highlight_cmd`. - function append_style(selected_attributes) - highlight_cmd[#highlight_cmd + 1] = ' cterm=' .. selected_attributes - - -- If we're using hex populate the gui* attr args. - if use_hex_and_256 then highlight_cmd[#highlight_cmd + 1] = - ' gui=' .. selected_attributes - end - end - - if type(style) == 'table' then - -- Concat all of the entries together with a comma between. - local style_all = table.concat(style, ',') - - -- There will always be a cterm attr arg. - append_style(style_all) - - -- There won't always be a `guisp`. - if style.color then highlight_cmd[#highlight_cmd + 1] = - ' guisp=' .. get(style.color, HEX) - end - else append_style(style) - end - end - - vim.cmd(table.concat(highlight_cmd)) - end --}}} ‡ +return function(name, Normal, highlights, terminal_ansi_colors) + -- Set the name of the current colorscheme. + vim.g.colors_name = string.lower(name) -- Highlight the baseline. highlight('Normal', Normal) @@ -101,7 +104,4 @@ return function(name, Normal, highlights, terminal_ansi_colors) for index, color in ipairs(terminal_ansi_colors) do vim.g['terminal_color_' .. index] = color[HEX] end - - vim.o.background = 'dark' - vim.g.indent_guides_auto_colors = 0 end diff --git a/lua/highlite/init.lua b/lua/highlite/init.lua index 19e95fd..19fabbf 100644 --- a/lua/highlite/init.lua +++ b/lua/highlite/init.lua @@ -65,6 +65,8 @@ local name = 'highlite' If your colors are defined correctly, the resulting colorscheme is guaranteed to work in GVim (Windows/Linux), MacVim (MacOS), and any properly set up terminal emulator. + + NOTE: |Replace-mode| will probably be useful here. ]] local black = {'#202020', 0, 'black'} @@ -164,6 +166,14 @@ local purple_dark = {'#c700ff', 38, 'darkmagenta'} remove any if you want a working colorscheme. Most of them are described under :help highlight-default, the others are taken from :help group-name. Both help sections are good reads, by the way. + + NOTE: |Replace-mode| will probably be useful here. + + NOTE: /As long as you do not remove any highlight groups or colors/, you can safely + ignore any highlight groups that are `link`ed others. + For example, programming languages almost exclusively link to the 1st + and 2nd sections, so as long as you define everything there you will automatically + be defining the rest of the highlights. ]] --[[ DO NOT EDIT THESE. You can use them instead of string literals. ]] @@ -222,7 +232,7 @@ local highlights = { SpecialChar = {link='Character' }, SpecialKey = {link='Character' }, Tag = {link='Underlined' }, - Delimiter = {bg=NONE, fg=gray, style=NONE }, + Delimiter = {link='Normal' }, SpecialComment = {bg=NONE, fg=gray, style={'bold', 'nocombine'}}, Debug = {link='WarningMsg' }, @@ -380,20 +390,21 @@ local highlights = { makeSpecTarget = {link='Type' }, --[[ 4.3.13. Markdown ]] - markdownH1 = {bg=NONE, fg=green_dark, style='bold' }, - markdownH2 = {bg=NONE, fg=red_light, style='bold' }, - markdownH3 = {bg=NONE, fg=green, style='bold' }, - markdownH4 = {bg=NONE, fg=magenta, style='bold' }, - markdownH5 = {bg=NONE, fg=orange, style='bold' }, - markdownH6 = {bg=NONE, fg=yellow, style='bold' }, - htmlBold = {link='mkdBold' }, - htmlItalic = {link='mkdItalic' }, - mkdBold = {bg=NONE, fg='green', style='bold' }, - mkdCode = {link='Comment' }, - mkdCodeDelimiter = {link='Delimiter' }, - mkdItalic = {bg=NONE, fg=green, style='italic'}, - mkdListItem = {link='Special' }, - texMathZoneY = {link='String' }, + markdownH1 = {bg=NONE, fg=green_dark, style='bold' }, + markdownH2 = {bg=NONE, fg=red_light, style='bold' }, + markdownH3 = {bg=NONE, fg=green, style='bold' }, + markdownH4 = {bg=NONE, fg=magenta, style='bold' }, + markdownH5 = {bg=NONE, fg=orange, style='bold' }, + markdownH6 = {bg=NONE, fg=yellow, style='bold' }, + htmlBold = {link='mkdBold' }, + htmlItalic = {link='mkdItalic' }, + mkdBold = {bg=NONE, fg='green', style='bold' }, + mkdCode = {link='Comment' }, + mkdCodeDelimiter = {link='Delimiter' }, + mkdItalic = {bg=NONE, fg=green, style='italic'}, + mkdListItem = {link='Special' }, + mkdNonListItemBlock = {bg=NONE, fg=gray, style=NONE }, + texMathZoneY = {link='String' }, --[[ 4.3.20. Python ]] pythonBrackets = {link='Delimiter' },