linefly is a simple, fast and informative pure-Lua statusline
for Neovim.
linefly provides a number of useful builtin components:
- Git changes (via Gitsigns plugin if installed)
- Diagnostic status
- Attached LSP client namess
- On-going LSP progress (Neovim
0.10
or greater required) - Macro-recording status (useful when
set cmdheight=0
) - Current search count (useful when
set cmdheight=0
) - Spell status (useful when
set cmdheight=0
) - Indent status (tabs or spaces and their associated width)
linefly also provides optional tabline
and winbar
support when the
appropriate settings are enabled; refer to
tabline
and
winbar
.
linefly will adapt it's colors to the colorscheme currently in effect. Colors can also be customized if desired.
Lastly, linefly is a lean statusline
plugin clocking in at about 800 lines
of Lua code. For comparison, the
lualine,
lightline and
airline plugins contain over
8,200, 3,600 and 7,300 lines of code respectively. In fairness, the latter
plugins are more featureful, configurable and visually pleasing.
statusline
plugin if layout flexibility is desired.
The above screenshots are using the moonfly colorscheme and the Iosevka font with Git changes, Diagnostics and indent-status enabled.
A startup comparison of linefly against various popular statusline
plugins, with their out-of-the-box defaults, on a clean and minimal Neovim setup
with the moonfly colorscheme.
The Neovim startup times in the following table are provived by the
dstein64/vim-startuptime plugin.
Startup times are the average of five consecutive runs. Note, stock
is run
without any statusline
plugin.
stock | linefly | lualine | lightline | airline |
---|---|---|---|---|
18.0ms | 18.9ms | 23.2ms | 22.0ms | 76.0ms |
Startup times as of March 2024 on my system; performance on other systems will vary.
linefly requires Neovim 0.9, or later.
Lastly, please make sure that the laststatus
option is set to either: 1
, 2
or 3
.
Install bluz71/nvim-linefly with your preferred plugin manager.
{ 'bluz71/nvim-linefly' },
Please do not lazy-load linefly.
The linefly layout consists of three groupings: the left-side, middle and right-side as follows:
+-------------------------------------------------+
| A | B | C | D | E M U | V | W | X | Y | Z |
+-------------------------------------------------+
Section | Purpose |
---|---|
A* |
Mode status (normal, insert, visual, command and replace modes) |
B | Filename (refer below for details) |
C* |
Git branch name (if applicable) |
D* |
Plugins notification (git, diagnostic and session status) |
E | Active buffer-attached LSP client names |
M | LSP progress status |
U | showcmd content if showcmdloc=statusline |
V* |
Optional macro-recording status |
W | Optional search count and spell status |
X | Current position |
Y* |
Total lines and current location as percentage |
Z | Optional indent status (spaces and tabs shift width) |
Sections marked with a *
are linked to a highlight group and are colored,
refer to the next section for details.
Sections C, D, U, V & W will not be displayed when the statusline
width is
less than 80 columns.
Section E, active buffer-attached LSP client names, will only be displayed when
the statusline
width is greater than or equal to 120 columns.
Section M, LSP progress status, will only be displayed when a global
statusline
is in effect and the statusline
width is greater than or equal to
120 columns.
Note, filenames will be displayed as follows:
-
Pathless filenames for files in the current working directory
-
Relative paths in preference to absolute paths for files not in the current working directory
-
~
-style home directory paths in preference to absolute paths -
Possibly shortened, for example
foo/bar/bazz/hello.txt
will be displayed asf/b/b/hello.txt
whenstatusline
width is less than 120 columns. -
Possibly trimmed. A maximum of four path components will be displayed for a filename; if a filename is more deeply nested then only the four most significant components, including the filename, will be displayed with an ellipsis prefix symbol used to indicate path trimming.
Sections marked with *
in the previous section are linked to the following
custom highlight groups with their associated fallbacks if the current
colorscheme does not support linefly.
Segment | Custom Highlight Group | Synthesized Highlight Fallback |
---|---|---|
Normal Mode | LineflyNormal |
Directory |
Insert Mode | LineflyInsert |
String |
Visual Mode | LineflyVisual |
Statement |
Command Mode | LineflyCommand |
WarningMsg |
Replace Mode | LineflyReplace |
Error |
Note, the following dark colorschemes support linefly, either within the colorscheme (moonfly & nightfly) or within this plugin (all others):
Lastly, if the fallback colors do not suit then it is very easy to override with your own highlights.
🎁 Here is a simple example of customized linefly colors. Save the
following at the end of your initialization file after setting your
colorscheme
.
local highlight = vim.api.nvim_set_hl
highlight(0, "LineflyNormal", { link = "DiffChange" })
highlight(0, "LineflyInsert", { link = "WildMenu" })
highlight(0, "LineflyVisual", { link = "IncSearch" })
highlight(0, "LineflyCommand", { link = "WildMenu" })
highlight(0, "LineflyReplace", { link = "ErrorMsg" })
Default option values:
vim.g.linefly_options = {
separator_symbol = "⎪",
progress_symbol = "↓",
active_tab_symbol = "▪",
git_branch_symbol = "",
error_symbol = "E",
warning_symbol = "W",
information_symbol = "I",
ellipsis_symbol = "…",
tabline = false,
winbar = false,
with_file_icon = true,
with_git_branch = true,
with_git_status = true,
with_diagnostic_status = true,
with_session_status = true,
with_attached_clients = true,
with_lsp_status = false,
with_macro_status = false,
with_search_count = false,
with_spell_status = false,
with_indent_status = false,
}
The separator_symbol
option specifies which character symbol to use for
segment separators in the statusline
.
By default, the ⎪
character (Unicode U+23AA
) will be displayed.
To specify your own separator symbol please add the following to your initialization file:
vim.g.linefly_options = {
separator_symbol = '<<SYMBOL-OF-YOUR-CHOOSING>>'
}
The progress_symbol
option specifies which character symbol to use to
indicate location-as-percentage in the statusline
.
By default, the ↓
character (Unicode U+2193
) will be displayed.
To specify your own progress symbol, or no symbol at all, please add the following to your initialization file:
vim.g.linefly_options = {
progress_symbol = '<<SYMBOL-OF-YOUR-CHOOSING-OR-EMPTY>>'
}
The active_tab_symbol
option specifies which character symbol to use to
signify the active tab in the tabline
.
By default, the ▪
character (Unicode U+25AA
) will be displayed.
To specify your own active tab symbol please add the following to your initialization file:
vim.g.linefly_options = {
active_tab_symbol = '<<SYMBOL-OF-YOUR-CHOOSING>>'
}
The git_branch_symbol
option specifies which character symbol to use when
displaying Git branch details.
By default, the
character (Powerline U+E0A0
) will be displayed. Many
modern monospace fonts will contain that character.
To specify your own Git branch symbol, or no symbol at all, please add the following to your initialization file:
vim.g.linefly_options = {
git_branch_symbol = '<<SYMBOL-OF-YOUR-CHOOSING-OR-EMPTY>>'
}
The error_symbol
option specifies which character symbol to use when
displaying Diagnostic errors.
By default, the E
character will be displayed.
To specify your own error symbol please add the following to your initialization file:
vim.g.linefly_options = {
error_symbol = '<<SYMBOL-OF-YOUR-CHOOSING>>'
}
The warning_symbol
option specifies which character symbol to use when
displaying Diagnostic warnings.
By default, the W
character will be displayed.
To specify your own warning symbol please add the following to your initialization file:
vim.g.linefly_options = {
warning_symbol = '<<SYMBOL-OF-YOUR-CHOOSING>>'
}
The information_symbol
option specifies which character symbol to use when
displaying Diagnostic
information.
By default, the I
character will be displayed.
To specify your own information symbol please add the following to your initialization file:
vim.g.linefly_options = {
information_symbol = '<<SYMBOL-OF-YOUR-CHOOSING>>'
}
The ellipsis_symbol
option specifies which character symbol to use when
indicating truncation, for example, deeply nested path truncation.
By default, the …
character will be displayed.
To specify your own ellipsis symbol please add the following to your initialization file:
vim.g.linefly_options = {
ellipsis_symbol = '<<SYMBOL-OF-YOUR-CHOOSING>>'
}
The tabline
option specifies whether to let this plugin manage the Neovim
tabline
in addition to the statusline
.
By default, Neovim tabline
management will not be undertaken.
If enabled, linefly will render a simple numbered, and clickable,
window-space layout in the tabline
; note, no buffers will be displayed in
the tabline
since there are many plugins that already provide that
capability.
To enable tabline
support please add the following to your initialization
file:
vim.g.linefly_options = {
tabline = true,
}
💡 Mappings, such as the following, may be useful to quickly switch between the numbered window-spaces:
local map = vim.keymap.set
map("n", "<Leader>1", "1gt")
map("n", "<Leader>2", "2gt")
map("n", "<Leader>3", "3gt")
map("n", "<Leader>4", "4gt")
map("n", "<Leader>5", "5gt")
map("n", "<Leader>6", "6gt")
map("n", "<Leader>7", "7gt")
map("n", "<Leader>8", "8gt")
map("n", "<Leader>9", "9gt")
A screenshot of the tabline
:
The winbar
option specifies whether to display a window bar at the top of
each window.
By default, window bars will not be displayed.
Displaying a window bar is recommended when the global statusline is enabled
via set laststatus=3
; the winbar
will then display the file name at the
top of each window to disambiguate splits. Also, if there is only one window
in the current tab then a winbar
will not be displayed (it won't be needed).
To enable the winbar
feature please add the following to your initialization
file:
vim.g.linefly_options = {
winbar = true,
}
The with_file_icon
option specifies whether a filetype icon, from a Nerd
Font, will be displayed prior to the filename in the statusline
(and
optional winbar
).
Note, a Nerd Font must be active and the nvim-web-devicons plugin must also be installed and active.
By default, a filetype icon will be displayed if possible.
To disable the display of a filetype icon please add the following to your initialization file:
vim.g.linefly_options = {
with_file_icon = false,
}
The with_git_branch
option specifies whether to display Git branch details
in the statusline
.
By default, Git branches will be displayed in the statusline
.
To disable the display of Git branches in the statusline
please add the
following to your initialization file:
vim.g.linefly_options = {
with_git_branch = false,
}
The with_git_status
option specifies whether to display
Gitsigns of the current buffer
in the statusline
.
By default, the Git status will be displayed if the plugin is loaded.
To disable the display of Git status in the statusline
please add the
following to your initialization file:
vim.g.linefly_options = {
with_git_status = false,
}
linefly supports Diagnostics.
The with_diagnostic_status
option specifies whether to indicate the presence
of the diagnostics in the current buffer.
By default, diagnostics will be displayed if the nvim-lspconfig plugin is loaded.
If diagnostic display is not wanted then please add the following to your initialization file:
vim.g.linefly_options = {
with_diagnostic_status = false,
}
The with_session_status
option specifies whether to display
vim-obsession,
posession.nvim or
nvim-possession session
details in the statusline
.
By default, session details will be displayed if one of those plugins is loaded.
To disable the display of session details in the statusline
please add the
following to your initialization file:
vim.g.linefly_options = {
with_session_status = false,
}
The with_attached_clients
option specifies whether to display all active
buffer-attached language servers and linters in the statusline
.
Note, linter names are derived from the nvim-lint plugin, if active.
By default, attached clients will be displayed.
To disable the display of attached clients in the statusline
please add the
following to your initialization file:
vim.g.linefly_options = {
with_attached_clients = false,
}
The with_lsp_status
option specifies whether to display LSP progress status
in the statusline
if global statusline
is in effect (:set laststatus=3
).
By default, LSP progress status will not be displayed.
Note, this option requires Neovim 0.10
or greater.
To enable the display of LSP progress status in the statusline
please add the
following to your initialization file:
vim.g.linefly_options = {
with_lsp_status = true,
}
The with_macro_status
option specifies whether to display macro-recording
status in the statusline
. This option is especially useful if cmdheight
is
set to 0
.
By default, macro-recording status will not be displayed.
To enable the display of macro-recording status in the statusline
please add
the following to your initialization file:
vim.g.linefly_options = {
with_macro_status = true,
}
The with_search_count
option specifies whether to display the search count
in the statusline
. This option is especially useful if cmdheight
is set to
0
.
By default, search count will not be displayed.
To enable the display of the search count in the statusline
please add the
following to your initialization file:
vim.g.linefly_options = {
with_search_count = true,
}
Note, the search count is only displayed when the hlsearch
option is set and
the search count result is not zero.
The with_spell_status
option specifies whether to display the spell status
in the statusline
. This option is especially useful if cmdheight
is set to
0
.
By default, spell status will not be displayed.
To enable spell status in the statusline
please add the following to your
initialization file:
vim.g.linefly_options = {
with_spell_status = true,
}
The with_indent_status
option specifies whether to display the indentation
status as the last component in the statusline
.
By default, indentation status will not be displayed.
Note, if the expandtab
option is set, for the current buffer, then tab stop
will be displayed, for example Tab:4
(tab equals four spaces); if on the
other hand noexpandtab
option is set then shift width will be displayed
instead, for example Spc:2
('spc' short for 'space').
To enable indentation status please add the following to your initialization file:
vim.g.linefly_options = {
with_indent_status = true,
}