Home

Awesome

🏙 Tokyo Night

A dark and light Neovim theme written in Lua ported from the Visual Studio Code TokyoNight theme. Includes extra themes for Kitty, Alacritty, iTerm and Fish.

<table width="100%"> <tr> <th>Moon</th> <th>Storm</th> </tr> <tr> <td width="50%"> <img src="https://user-images.githubusercontent.com/292349/190951628-10ba28a1-57ff-4479-8eab-47400a402242.png" /> </td> <td width="50%"> <img src="https://user-images.githubusercontent.com/292349/115295095-3a9e5080-a10e-11eb-9aed-6054488c46ce.png" /> </td> </tr> <tr> <th>Night</th> <th>Day</th> </tr> <tr> <td width="50%"> <img src="https://user-images.githubusercontent.com/292349/115295327-7afdce80-a10e-11eb-89b3-2591262bf95a.png" /> </td> <td width="50%"> <img src="https://user-images.githubusercontent.com/292349/115996270-78c6c480-a593-11eb-8ed0-7d1400b058f5.png" /> </td> </tr> </table>

✨ Features

<details> <summary>🎨 Supported Plugins</summary> <!-- plugins:start -->
PluginSource
aerial.nvimaerial
aleale
alpha-nvimalpha
barbar.nvimbarbar
blink.cmpblink
bufferline.nvimbufferline
nvim-cmpcmp
copilot.luacopilot
nvim-dapdap
dashboard-nvimdashboard
flash.nvimflash
fzf-luafzf
vim-gitguttergitgutter
gitsigns.nvimgitsigns
glyph-palette.vimglyph-palette
grug-far.nvimgrug-far
headlines.nvimheadlines
hop.nvimhop
vim-illuminateilluminate
indent-blankline.nvimindent-blankline
indentmini.nvimindentmini
lazy.nvimlazy
leap.nvimleap
lspsaga.nvimlspsaga
mini.animatemini_animate
mini.cluemini_clue
mini.completionmini_completion
mini.cursorwordmini_cursorword
mini.depsmini_deps
mini.diffmini_diff
mini.filesmini_files
mini.hipatternsmini_hipatterns
mini.iconsmini_icons
mini.indentscopemini_indentscope
mini.jumpmini_jump
mini.mapmini_map
mini.notifymini_notify
mini.operatorsmini_operators
mini.pickmini_pick
mini.startermini_starter
mini.statuslinemini_statusline
mini.surroundmini_surround
mini.tablinemini_tabline
mini.testmini_test
mini.trailspacemini_trailspace
nvim-navicnavic
neo-tree.nvimneo-tree
neogitneogit
neotestneotest
noice.nvimnoice
nvim-notifynotify
nvim-tree.luanvim-tree
octo.nvimocto
rainbow-delimiters.nvimrainbow
render-markdown.nvimrender-markdown
nvim-scrollbarscrollbar
vim-sneaksneak
telescope.nvimtelescope
nvim-treesitter-contexttreesitter-context
trouble.nvimtrouble
vimwikivimwiki
which-key.nvimwhich-key
yanky.nvimyanky
<!-- plugins:end --> </details> <details> <summary>🍭 Extras</summary> <!-- extras:start -->
ToolExtra
Aercextras/aerc
Alacrittyextras/alacritty
Deltaextras/delta
Dunstextras/dunst
Fishextras/fish
Fish Themesextras/fish_themes
Footextras/foot
Fuzzelextras/fuzzel
Fzfextras/fzf
Ghosttyextras/ghostty
GitUIextras/gitui
GNOME Terminalextras/gnome_terminal
Helixextras/helix
iTermextras/iterm
Kittyextras/kitty
Lazygitextras/lazygit
Lua Table for testingextras/lua
Prismextras/prism
process-composeextras/process_compose
Slackextras/slack
Spotify Playerextras/spotify_player
Sublime Textextras/sublime
Terminatorextras/terminator
Termuxextras/termux
Tilixextras/tilix
Tmuxextras/tmux
Vimextras/vim
Vimiumextras/vimium
WezTermextras/wezterm
Windows Terminalextras/windows_terminal
Xfce Terminalextras/xfceterm
Xresourcesextras/xresources
Yaziextras/yazi
Zathuraextras/zathura
Zellijextras/zellij
<!-- extras:end --> </details>

⚡️ Requirements

📦 Installation

Install the theme with your preferred package manager, such as folke/lazy.nvim:

{
  "folke/tokyonight.nvim",
  lazy = false,
  priority = 1000,
  opts = {},
}

🚀 Usage

vim.cmd[[colorscheme tokyonight]]
colorscheme tokyonight

" There are also colorschemes for the different styles.
colorscheme tokyonight-night
colorscheme tokyonight-storm
colorscheme tokyonight-day
colorscheme tokyonight-moon

Some plugins need extra configuration to work with TokyoNight.

<details> <summary>Click here for more details</summary>

Barbecue

-- Lua
require('barbecue').setup {
  -- ... your barbecue config
  theme = 'tokyonight',
  -- ... your barbecue config
}

Lualine

-- Lua
require('lualine').setup {
  options = {
    -- ... your lualine config
    theme = 'tokyonight'
    -- ... your lualine config
  }
}

Lightline

" Vim Script
let g:lightline = {'colorscheme': 'tokyonight'}
</details>

⚙️ Configuration

[!IMPORTANT] Set the configuration BEFORE loading the color scheme with colorscheme tokyonight.

The theme offers four styles: storm, moon, night, and day.

The day style is used when { style = "day" } is passed to setup(options) or when vim.o.background = "light".

TokyoNight uses the default options, unless setup is explicitly called.

<details> <summary>Default Options</summary> <!-- config:start -->
---@class tokyonight.Config
---@field on_colors fun(colors: ColorScheme)
---@field on_highlights fun(highlights: tokyonight.Highlights, colors: ColorScheme)
M.defaults = {
  style = "moon", -- The theme comes in three styles, `storm`, a darker variant `night` and `day`
  light_style = "day", -- The theme is used when the background is set to light
  transparent = false, -- Enable this to disable setting the background color
  terminal_colors = true, -- Configure the colors used when opening a `:terminal` in Neovim
  styles = {
    -- Style to be applied to different syntax groups
    -- Value is any valid attr-list value for `:help nvim_set_hl`
    comments = { italic = true },
    keywords = { italic = true },
    functions = {},
    variables = {},
    -- Background styles. Can be "dark", "transparent" or "normal"
    sidebars = "dark", -- style for sidebars, see below
    floats = "dark", -- style for floating windows
  },
  day_brightness = 0.3, -- Adjusts the brightness of the colors of the **Day** style. Number between 0 and 1, from dull to vibrant colors
  dim_inactive = false, -- dims inactive windows
  lualine_bold = false, -- When `true`, section headers in the lualine theme will be bold

  --- You can override specific color groups to use other groups or a hex color
  --- function will be called with a ColorScheme table
  ---@param colors ColorScheme
  on_colors = function(colors) end,

  --- You can override specific highlights to use other groups or a hex color
  --- function will be called with a Highlights and ColorScheme table
  ---@param highlights tokyonight.Highlights
  ---@param colors ColorScheme
  on_highlights = function(highlights, colors) end,

  cache = true, -- When set to true, the theme will be cached for better performance

  ---@type table<string, boolean|{enabled:boolean}>
  plugins = {
    -- enable all plugins when not using lazy.nvim
    -- set to false to manually enable/disable plugins
    all = package.loaded.lazy == nil,
    -- uses your plugin manager to automatically enable needed plugins
    -- currently only lazy.nvim is supported
    auto = true,
    -- add any plugins here that you want to enable
    -- for all possible plugins, see:
    --   * https://github.com/folke/tokyonight.nvim/tree/main/lua/tokyonight/groups
    -- telescope = true,
  },
}
<!-- config:end --> </details>

🪓 Overriding Colors & Highlight Groups

How the highlight groups are calculated:

  1. colors are determined based on your configuration, with the ability to override them using config.on_colors(colors).
  2. These colors are utilized to generate the highlight groups.
  3. config.on_highlights(highlights, colors) can be used to override highlight groups.

For default values of colors and highlights, please consult the storm, moon, night, and day themes.

<details> <summary>Settings & Changing Colors</summary>
require("tokyonight").setup({
  -- use the night style
  style = "night",
  -- disable italic for functions
  styles = {
    functions = {}
  },
  -- Change the "hint" color to the "orange" color, and make the "error" color bright red
  on_colors = function(colors)
    colors.hint = colors.orange
    colors.error = "#ff0000"
  end
})
</details> <details> <summary>Borderless Telescope</summary>
require("tokyonight").setup({
  on_highlights = function(hl, c)
    local prompt = "#2d3149"
    hl.TelescopeNormal = {
      bg = c.bg_dark,
      fg = c.fg_dark,
    }
    hl.TelescopeBorder = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
    hl.TelescopePromptNormal = {
      bg = prompt,
    }
    hl.TelescopePromptBorder = {
      bg = prompt,
      fg = prompt,
    }
    hl.TelescopePromptTitle = {
      bg = prompt,
      fg = prompt,
    }
    hl.TelescopePreviewTitle = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
    hl.TelescopeResultsTitle = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
  end,
})
</details> <details> <summary>Fix <code>undercurls</code> in Tmux</summary>

To have undercurls show up and in color, add the following to your Tmux configuration file:

# Undercurl
set -g default-terminal "${TERM}"
set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm'  # undercurl support
set -as terminal-overrides ',*:Setulc=\E[58::2::::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m'  # underscore colours - needs tmux-3.0
</details>

🍭 Extras

Extra color configs for Kitty, Alacritty, Fish, WezTerm, iTerm and foot can be found in extras. To use them, refer to their respective documentation.

image

You can easily use the color palette for other plugins inside your Neovim configuration:

local colors = require("tokyonight.colors").setup() -- pass in any of the config options as explained above
local util = require("tokyonight.util")

aplugin.background = colors.bg_dark
aplugin.my_error = util.lighten(colors.red1, 0.3) -- number between 0 and 1. 0 results in white, 1 results in red1

🔥 Contributing

Pull requests are welcome.

For the extras, we use a simple template system that can be used to generate themes for the different styles.

How to add a new extra template:

  1. Create a file like lua/tokyonight/extra/cool-app.lua.

  2. Add the name and output file extension to the extras table in lua/tokyonight/extra/init.lua.

  3. Run the following command to generate new extra themes from the tokyonight plugin directory:

    ./scripts/build
    
  4. Check the newly created themes in the extra/ directory. Please DO NOT commit them, as they are already automatically built by the CI.