Code Monkey home page Code Monkey logo

cobalt.nvim's Introduction

cobalt.nvim

This is a work in progress port of the classic blue theme from TextMate. There are many great themes for Neovim out there, but I've not yet found one as easy on the eyes as this.

Features

  • Extensive support for TreeSitter syntax highlighting, and many popular plugins
  • Compilation to lua byte code for super fast startup times

Installation/usage:

Download with your favorite package manager:

lazy.nvim:

 {
     "wurli/cobalt.nvim"
     config = function()
         vim.cmd[[colorscheme cobalt]]
     end
 }

Configuration

There is no need to call setup if you are ok with the defaults.

-- Default options:
require('cobalt').setup({
    compile = false,              -- enable compiling the colorscheme
    undercurl = true,             -- enable undercurls
    commentStyle = { italic = true },
    functionStyle = {},
    keywordStyle = { italic = true},
    statementStyle = { bold = true },
    typeStyle = {},
    transparent = false,          -- do not set background color
    dimInactive = false,          -- dim inactive window `:h hl-NormalNC`
    terminalColors = true,        -- define vim.g.terminal_color_{0,17}
    colors = {                    -- add/modify theme and palette colors
        palette = {},
        theme = { default = {} }, -- Default is the only theme for now
    },
    overrides = function(colors)  -- add/modify highlights
        return {}
    end,
    theme = "classic",            -- Load "wave" theme when 'background' option is not set
    background = {                -- map the value of 'background' option to a theme
        dark = "classic",         -- try "dragon" !
        light = "lotus"
    },
})

-- setup must be called before loading
vim.cmd("colorscheme cobalt")

NOTE 1: If you enable compilation, make sure to run :CobaltCompile command every time you make changes to your config.

" 1. Modify your config
" 2. Restart nvim
" 3. Run this command:
:CobaltCompile

NOTE 2: Cobalt adjusts to the value of some options. Make sure that the options 'laststatus' and 'cmdheight' are set before calling setup.

Customization

In cobalt, there are two kinds of colors: PaletteColors and ThemeColors; PaletteColors are defined directly as RGB Hex strings, and have arbitrary names that recall their actual color. Conversely, ThemeColors are named and grouped semantically on the basis of their actual function.

In short, a palette defines all the available colors, while a theme maps the PaletteColors to specific ThemeColors and the same palette color may be assigned to multiple theme colors.

You can change both theme or palette colors using config.colors. All the palette color names can be found here, while their usage by each theme can be found here.

require('cobalt').setup({ 
    ..., 
    colors = { 
        palette = { 
            -- change all usages of these colors 
            MintyFresh = "#3AD900", -- string
            SereneSky  = "#0088FF", -- comment
        }, 
        theme = { 
            -- change specific usages for a certain theme, or for all of them 
            default = { 
                ui = { 
                    float = { 
                        bg = "none", 
                    }, 
                }, 
            }, 
        } 
    }, 
    ... 
}) 

You can conveniently add/modify hlgroups using the config.overrides option. Supported keywords are the same for :h nvim_set_hl {val} parameter.

require('cobalt').setup({
    ...,
    overrides = function(colors)
        return {
            -- Assign a static color to strings
            String = { fg = colors.palette.PaleBlue, italic = true },
            -- theme colors will update dynamically when you change theme!
            SomePluginHl = { fg = colors.theme.syn.type, bold = true },
        }
    end,
    ...
})

Transparent Floating Windows

This will make floating windows look nicer with default borders.

overrides = function(colors)
    local theme = colors.theme
    return {
        NormalFloat = { bg = "none" },
        FloatBorder = { bg = "none" },
        FloatTitle = { bg = "none" },

        -- Save an hlgroup with dark background and dimmed foreground
        -- so that you can use it where your still want darker windows.
        -- E.g.: autocmd TermOpen * setlocal winhighlight=Normal:NormalDark
        NormalDark = { fg = theme.ui.fg_dim, bg = theme.ui.bg_m3 },

        -- Popular plugins that open floats will link to NormalFloat by default;
        -- set their background accordingly if you wish to keep them dark and borderless
        LazyNormal = { bg = theme.ui.bg_m3, fg = theme.ui.fg_dim },
        MasonNormal = { bg = theme.ui.bg_m3, fg = theme.ui.fg_dim },
    }
end,

If you'd like to keep the floating windows darker, but you're unhappy with how borders are rendered, consider using characters that are drawn at the edges of the box:

{ "๐Ÿญฝ", "โ–”", "๐Ÿญพ", "โ–•", "๐Ÿญฟ", "โ–", "๐Ÿญผ", "โ–" }

Borderless Telescope

Block-like modern Telescope UI

overrides = function(colors)
    local theme = colors.theme
    return {
        TelescopeTitle = { fg = theme.ui.special, bold = true },
        TelescopePromptNormal = { bg = theme.ui.bg_m2 },
        TelescopePromptBorder = { fg = theme.ui.bg_m2, bg = theme.ui.bg_m2 },
        TelescopeResultsNormal = { fg = theme.ui.fg, bg = theme.ui.bg_m1 },
        TelescopeResultsBorder = { fg = theme.ui.bg_m1, bg = theme.ui.bg_m1 },
        TelescopePreviewNormal = { bg = theme.ui.bg_p2 },
        TelescopePreviewBorder = { bg = theme.ui.bg_p2, fg = theme.ui.bg_p2 },
    }
end,

Dark completion (popup) menu

More uniform colors for the popup menu.

overrides = function(colors)
    local theme = colors.theme
    return {
        Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 },  -- add `blend = vim.o.pumblend` to enable transparency
        PmenuSel = { fg = "NONE", bg = theme.ui.bg_p2 },
        PmenuSbar = { bg = theme.ui.bg_m1 },
        PmenuThumb = { bg = theme.ui.bg_p2 },
    }
end,

Acknowledgements

The implementation of this plugin is based on the Kanagawa theme by Tommaso Laurenzi.

cobalt.nvim's People

Contributors

wurli avatar

Stargazers

Justin Speers avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.