Giter Site home page Giter Site logo

nvim-linefly's Introduction

linefly

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.

⚠️ linefly has a predominantly fixed layout, this will not be an appropriate statusline plugin if layout flexibility is desired.

Screenshots

normal insert visual command replace

The above screenshots are using the moonfly colorscheme and the Iosevka font with Git changes, Diagnostics and indent-status enabled.

Statusline Startup Comparison

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.

Modules And Plugins supported

⚡ Requirements

linefly requires Neovim 0.8, or later.

linefly also requires a GUI capable version Neovim with an appropriate colorscheme set. A GUI client, or Neovim with the termguicolors option enabled in a true-color terminal, is required.

Lastly, please make sure that the laststatus option is set to either: 1, 2 or 3.

Installation

Install bluz71/nvim-linefly with your preferred plugin manager.

lazy.nvim:

{ 'bluz71/nvim-linefly' },

Please do not lazy-load linefly.

Layout And Default Colors

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 as f/b/b/hello.txt when statusline 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.

Highlight Groups And Colors

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" })

🔧 Options

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_macro_status = false,
  with_search_count = false,
  with_spell_status = false,
  with_indent_status = false,
}
Option Option Option
separator_symbol progress_symbol active_tab_symbol
git_branch_symbol
error_symbol warning_symbol information_symbol
ellipsis_symbol
tabline winbar
with_file_icon with_git_branch with_git_status
with_diagnostic_status with_session_status with_attached_clients
with_lsp_status with_macro_status with_search_count
with_spell_status with_indent_status

separator_symbol

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>>'
}

progress_symbol

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>>'
}

active_tab_symbol

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>>'
}

git_branch_symbol

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>>'
}

error_symbol

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>>'
}

warning_symbol

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>>'
}

information_symbol

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>>'
}

ellipsis_symbol

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>>'
}

tabline

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:

tabline


winbar

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,
}

with_file_icon

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,
}

with_git_branch

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,
}

with_git_status

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,
}

with_diagnostic_status

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,
}

with_session_status

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,
}

with_attached_clients

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,
}

with_lsp_status

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 be displayed.

Note, this option requires Neovim 0.10 or greater.

To disable the display of LSP progress status in the statusline please add the following to your initialization file:

vim.g.linefly_options = {
  with_lsp_status = false,
}

with_macro_status

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,
}

with_search_count

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.


with_spell_status

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,
}

with_indent_status

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,
}

Sponsor

Ko-fi

License

License: MIT

nvim-linefly's People

Contributors

bluz71 avatar bobbleclank avatar hugoh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

hugoh bobbleclank

nvim-linefly's Issues

Add `showcmd` to the statusline.

Add showcmd to the statusline potentially when showcmdloc=statusline.

I noticed in #5 this functionality was mentioned, but it does not show up in when i load the plugin.

Quickfix issue

Seems the plugin doesn't handle the special case of quickfix and probably location lists.

With the default status line I can see the quickfix title:

20230323_17h03m33s_grim

while with linefly there is simply no title:

20230323_17h04m46s_grim

Aside from that, do you think it could be possible to add a setting to disable the mode status ? (normal, visual, etc..)

Thanks for the plugin!

[BUG] nvim-dap-ui window names

Thank you so much for this plugin!

Description

nvim-dap-ui windows lose their original names

image

image

Reproducible steps

for _, name in ipairs({ "config", "data", "state", "cache" }) do
  vim.env[("XDG_%s_HOME"):format(name:upper())] = "/tmp/nvim-debug-issue/" .. name
end

vim.g.mapleader = " "

local plugins = {
  {
    "rcarriga/nvim-dap-ui",
    dependencies = "mfussenegger/nvim-dap",
    lazy = false,
    keys = {
      {
        "<leader>du",
        function() require("dapui").toggle() end,
        desc = "Toggle Debugger UI",
      },
    },
    config = true,
  },

  {
    "bluz71/nvim-linefly",
    enabled = true
  },
}

--------------------------------------------------------------------------------

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable",
    lazypath,
  })
end
vim.opt.runtimepath:prepend(lazypath)
require("lazy").setup(plugins)
  1. copy the previous snippet in a file, lets say debug-issue.lua
  2. open with nvim --clean +'so debug-issue.lua'. Don't worry, it won't mess up with your home directory (see line 2)
  3. press <leader>du to bring the nvim-dap-ui windows

You will notice the issue with window names

(then, if you change enabled = false on line 24 you will see the window names as expected)

btw, I love that this plugin renames the tabs to Tab:1 💖 nice touch!

Error: <n unknown "" element was received. This can happen if the remote process closed or ended abnormally.

When I installed linefly this error appears in the statusline. Maybe another plugin is causing this?

Here is my packer.lua:

-- This file can be loaded by calling `lua require('plugins')` from your init.vim

-- Only required if you have packer configured as `opt`
vim.cmd.packadd('packer.nvim')

return require('packer').startup(function(use)
    -- Packer can manage itself
    use 'wbthomason/packer.nvim'

    use {
        'nvim-telescope/telescope.nvim', tag = '0.1.0',
        -- or                            , branch = '0.1.x',
        requires = { { 'nvim-lua/plenary.nvim' } }
    }

    use({
        'rose-pine/neovim',
        as = 'rose-pine',
        config = function()
            vim.cmd('colorscheme rose-pine')
        end
    })

    use({ 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' })
    use('nvim-treesitter/playground')
    use('theprimeagen/harpoon')
    use('mbbill/undotree')
    use('tpope/vim-fugitive')

    use {
        'VonHeikemen/lsp-zero.nvim',
        requires = {
            -- LSP Support
            { 'neovim/nvim-lspconfig' },
            { 'williamboman/mason.nvim' },
            { 'williamboman/mason-lspconfig.nvim' },

            -- Autocompletion
            { 'hrsh7th/nvim-cmp' },
            { 'hrsh7th/cmp-buffer' },
            { 'hrsh7th/cmp-path' },
            { 'saadparwaiz1/cmp_luasnip' },
            { 'hrsh7th/cmp-nvim-lsp' },
            { 'hrsh7th/cmp-nvim-lua' },

            -- Snippets
            { 'L3MON4D3/LuaSnip' },
            { 'rafamadriz/friendly-snippets' },
        }
    }

    use("folke/zen-mode.nvim")
    use("windwp/nvim-ts-autotag")
    use {
        "windwp/nvim-autopairs",
        config = function() require("nvim-autopairs").setup {} end
    }
    use {
        's1n7ax/nvim-terminal',
        config = function()
            vim.o.hidden = true
            require('nvim-terminal').setup()
        end,
    }
    use {
        "nvim-neo-tree/neo-tree.nvim",
        branch = "v2.x",
        requires = {
            "nvim-lua/plenary.nvim",
            "nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
            "MunifTanjim/nui.nvim",
        }
    }
    use 'bluz71/nvim-linefly'
end)

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.