Home

Awesome

moonfly

moonfly is a dark charcoal theme for modern Neovim and classic Vim.

Note, all moonfly highlights in Neovim are implemented in Lua, whilst highlights in Vim are implemented in legacy Vimscript.

:point_right: I maintain another dark theme named nightfly which may be of interest.

Screenshot

screenshot

Styled Features & Plugins

Neovim-only:

Neovim & Vim compatible:

Vim-only:

:zap: Requirements

moonfly is now a GUI-only colorscheme.

A GUI client or a modern terminal version of Vim or Neovim in a true-color terminal is required. Details about true-color terminals are listed here.

moonfly explicitly no longer supports the 256 color cterm version of Vim or Neovim except via the legacy cterm-compat branch.

Installation

Install the bluz71/vim-moonfly-colors colorscheme with your preferred plugin manager.

lazy.nvim:

{ "bluz71/vim-moonfly-colors", name = "moonfly", lazy = false, priority = 1000 },

vim-plug:

Plug 'bluz71/vim-moonfly-colors', { 'as': 'moonfly' }

Usage

Enable the colorscheme after the plugin declaration.

" Vimscript initialization file
colorscheme moonfly
-- Lua initialization file
vim.cmd [[colorscheme moonfly]]

Statusline

let g:lightline = { 'colorscheme': 'moonfly' }

:wrench: Options

OptionDefault State
moonflyCursorColorDisabled
moonflyItalicsEnabled
moonflyNormalFloatDisabled
moonflyTerminalColorsEnabled
moonflyTransparentDisabled
moonflyUndercurlsEnabled
moonflyUnderlineMatchParenDisabled
moonflyVirtualTextColorDisabled
moonflyWinSeparator1

moonflyCursorColor

The moonflyCursorColor option specifies whether to color the cursor or not. By default the cursor will NOT be colored. If you prefer a colored cursor then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyCursorColor = v:true
-- Lua initialization file
vim.g.moonflyCursorColor = true

moonflyItalics

The moonflyItalics option specifies whether to use italics for comments and certain HTML elements in GUI versions of Vim. By default this option is enabled. If you do not like the appearance of italics then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyItalics = v:false
-- Lua initialization file
vim.g.moonflyItalics = false

moonflyNormalFloat

The moonflyNormalFloat option specifies whether to use moonfly background and foreground colors in Neovim floating windows. By default this option is disabled, hence, Neovim floating windows will usually be styled with popup menu colors. If you would like to use moonfly colors instead then add the following to your configuration:

" Vimscript initialization file
let g:moonflyNormalFloat = v:true
-- Lua initialization file
vim.g.moonflyNormalFloat = true

:bulb: If the above option is set then it is highly recommended to enable floating window borders to distinguish between the edit and floating windows in Neovim's LSP client, for example:

  vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(
    vim.lsp.handlers.hover, {
      border = "single"
    }
  )
  vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(
    vim.lsp.handlers.signatureHelp, {
      border = "single"
    }
  )
  vim.diagnostic.config({ float = { border = "single" } })

:bulb: Likewise, nvim-cmp may be configured as follows for nicer display when g:moonflyNormalFloat is enabled:

local winhighlight = {
  winhighlight = "Normal:NormalFloat,FloatBorder:FloatBorder,CursorLine:PmenuSel",
}
require('cmp').setup({
  window = {
    completion = cmp.config.window.bordered(winhighlight),
    documentation = cmp.config.window.bordered(winhighlight),
  }
})

moonflyTerminalColors

The moonflyTerminalColors option specifies whether to use the moonfly color palette in :terminal windows when termguicolors is set. By default this option is enabled. If you prefer not to use the moonfly color palette for the first 16 terminal colors then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyTerminalColors = v:false
-- Lua initialization file
vim.g.moonflyTerminalColors = false

moonflyTransparent

The moonflyTransparent option specifies whether to use an opaque or transparent background in GUI versions of Vim. By default this option is disabled. If you would like a transparent background then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyTransparent = v:true
-- Lua initialization file
vim.g.moonflyTransparent = true

moonflyUndercurls

The moonflyUndercurls option specifies whether to use undercurls for spelling and linting errors in GUI versions of Vim, including terminal Vim with termguicolors set. By default this option is enabled. If you do not like the appearance of undercurls then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyUndercurls = v:false
-- Lua initialization file
vim.g.moonflyUndercurls = false

moonflyUnderlineMatchParen

The moonflyUnderlineMatchParen option specifies whether to underline matching parentheses. By default this option is disabled. If you want to underline matching parentheses then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyUnderlineMatchParen = v:true
-- Lua initialization file
vim.g.moonflyUnderlineMatchParen = true

moonflyVirtualTextColor

The moonflyVirtualTextColor option specifies whether to display diagnostic virtual text in color. By default this option is disabled. If you want to display diagnostic virtual text in color then add the following to your initialization file:

" Vimscript initialization file
let g:moonflyVirtualTextColor = v:true
-- Lua initialization file
vim.g.moonflyVirtualTextColor = true

moonflyWinSeparator

The moonflyWinSeparator option specifies the style of window separators:

For example, if line separators are desired then add the following to your configuration:

" Vimscript initialization file
let g:moonflyWinSeparator = 2
-- Lua initialization file
vim.g.moonflyWinSeparator = 2

:gift: If using Neovim 0.7 (or later), the following configuration will improve the look of line separators (if option 2 has been chosen) by selecting thicker characters for the separators:

" Vimscript initialization file
set fillchars=horiz:━,horizup:┻,horizdown:┳,vert:┃,vertleft:┨,vertright:┣,verthoriz:╋
-- Lua initialization file
vim.opt.fillchars = { horiz = '━', horizup = '┻', horizdown = '┳', vert = '┃', vertleft = '┫', vertright = '┣', verthoriz = '╋', }

Overriding Highlights

If a certain highlight of this theme does not suit then it is recommended to use an autocmd to override that desired highlight.

For example, if one wishes to highlight functions in bold then simply add the following to your initialization file prior to setting the colorscheme:

" Vimscript initialization file
augroup CustomHighlight
    autocmd!
    autocmd ColorScheme moonfly highlight Function guifg=#74b2ff gui=bold
augroup END
-- Lua initialization file
local custom_highlight = vim.api.nvim_create_augroup("CustomHighlight", {})
vim.api.nvim_create_autocmd("ColorScheme", {
  pattern = "moonfly",
  callback = function()
    vim.api.nvim_set_hl(0, "Function", { fg = "#74b2ff", bold = true })
  end,
  group = custom_highlight,
})

Palette & Custom Colors (Neovim Only)

The palette field returns a table of internal theme colors; useful for constructing custom statuslines and the like.

require("moonfly").palette

Meanwhile the custom_colors function allows customization of individual theme colors. This needs to occur prior to invoking the colorscheme. The full list of available colors is provided by the palette field.

  require("moonfly").custom_colors({
    bg = "#121212",
    violet = "#ff74b8",
  })
  vim.cmd([[colorscheme moonfly]])

True Color Terminals

Many modern terminals support 24-bit true colors. Current versions of Vim & Neovim, on such terminals, support true colors when the termguicolors option is enabled.

On terminals that support true colors, and when termguicolors is set, the moonfly colorscheme will not require any terminal configuration to emit the correct theme colors.

For the true color moonfly colorscheme to display correctly inside tmux the following setting will usually be required in ~/.tmux.conf:

set -ga terminal-overrides ',xterm-256color:Tc'

Vim, as against Neovim, inside tmux, will also require the following settings be added to the ~/.vimrc file:

let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"

Extra Themes

A collection of moonfly-flavoured themes are provided:

For other terminals please configure appropriately with the following colors:

TypeCategoryValueColor
BackgroundBackground#080808background
ForegroundForeground#bdbdbdbackground
BoldBold#eeeeeebackground
CursorCursor#9e9e9ebackground
Cursor TextCursor Text#080808background
SelectionSelection#b2ceeebackground
Selection TextSelection Text#080808background
Color 1Black (normal)#323437background
Color 2Red (normal)#ff5454background
Color 3Green (normal)#8cc85fbackground
Color 4Yellow (normal)#e3c78abackground
Color 5Blue (normal)#80a0ffbackground
Color 6Purple (normal)#cf87e8background
Color 7Cyan (normal)#79dac8background
Color 8White (normal)#c6c6c6background
Color 9Black (bright)#949494background
Color 10Red (bright)#ff5189background
Color 11Green (bright)#36c692background
Color 12Yellow (bright)#c6c684background
Color 13Blue (bright)#74b2ffbackground
Color 14Purple (bright)#ae81ffbackground
Color 15Cyan (bright)#85dc85background
Color 16White (bright)#e4e4e4background

Sponsor

Ko-fi

License

License: MIT