diff --git a/README.md b/README.md index ad881af..46e0d71 100644 --- a/README.md +++ b/README.md @@ -1 +1,340 @@ -# lualine.nvim \ No newline at end of file +# lualine.nvim +A blazing fast and easy to configure neovim statusline written in pure lua. + +`lualine.nvim` requires neovim 0.5 +## Screenshots + +| normal | insert | visual | replace | +| :---------------------------------------- | :-------------------------------------: | -------------------------------------: | -------------------------------------: | +| ![normal](./screenshots/normal.png) | ![normal](./screenshots/insert.png) | ![normal](./screenshots/visual.png) | ![normal](./screenshots/replace.png) | + +## Performance compared to other plugins +Unlike other statusline plugins lualine loads only defined components, nothing else. + +Startup time performance measured with an amazing plugin [tweekmonster/startuptime.vim](https://github.com/tweekmonster/startuptime.vim) + +| clean vimrc | lualine | airline | lightline | +| :------------- | :----------: | -----------: | -----------: | +| 8.943 ms | 9.034 ms | 13.425 ms | 11.463 ms | + + +## Installation +### [vim-plug](https://github.com/junegunn/vim-plug) +```vim +Plug 'hoob3rt/lualine.nvim' +" If you want to have icons in your statusline choose one of these +Plug 'kyazdani42/nvim-web-devicons' +Plug 'ryanoasis/vim-devicons' +``` +### [packer.nvim](https://github.com/wbthomason/packer.nvim) +```lua +use { + 'hoob3rt/lualine.nvim', + requires = {'kyazdani42/nvim-web-devicons', opt = true} +} +``` + +## Usage and customization +Lualine has sections as shown below. + +``` ++-------------------------------------------------+ +| A | B | C X | Y | Z | ++-------------------------------------------------+ +``` + +Each sections holds it's components e.g. current vim's mode. +Colorscheme of sections is mirrored, meaning section `A` will have the same colorscheme as section `Z` etc. + +### Starting lualine +```lua +local lualine = require('lualine') +lualine.status() +``` +### Setting a theme +```lua +lualine.theme = 'gruvbox' +``` + +
+Available themes + +* gruvbox + +Please create a pr if you managed to port a popular theme before me +
+ +### Changing separator in section +Lualine defines a separator between components in given section, the default +separator is `|`. You can change the separator this way: + +```lua +lualine.separator = '|' +``` + +or disable it + +```lua +lualine.separator = '' +``` + +### Changing components in lualine sections + +
+Lualine defaults + +```lua +lualine.sections = { + lualine_a = { 'mode' }, + lualine_b = { 'branch' }, + lualine_c = { 'filename' }, + lualine_x = { 'encoding', 'fileformat', 'filetype' }, + lualine_y = { 'progress' }, + lualine_z = { 'location' }, + lualine_diagnostics = { } +} + +lualine.inactiveSections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } +} +``` + +
+ +
+Available components + +* branch +* encoding +* fileformat +* filename +* filetype +* location +* mode +* progress + +
+ +
+Using custom functions as lualine component + +You can define a custom function as a lualine component + +```lua +local function hello() + return [[hello world]] +end +lualine.sections = { lualine_a = { hello } } +``` + +
+ +### Loading plugin extensions +Lualine extensions change statusline appearance for a window/buffer with a plugin loaded e.g. [junegunn/fzf.vim](https://github.com/junegunn/fzf.vim) + +By default no plugin extension are loaded to improve performance. If you are using a plugin which is supported you can load it this way: +```lua +lualine.extensions = { 'fzf' } +``` + +
+Available extensions + +* fzf + +Please create a pr if you managed to create an extension before me +
+ +### Full config example using [packer.nvim](https://github.com/wbthomason/packer.nvim) + +
+packer config + +```lua + use { + 'hoob3rt/lualine.nvim', + requires = {'kyazdani42/nvim-web-devicons', opt = true}, + config = function() + local lualine = require('lualine') + lualine.theme = 'gruvbox' + lualine.separator = '|' + lualine.sections = { + lualine_a = { 'mode' }, + lualine_b = { 'branch' }, + lualine_c = { 'filename' }, + lualine_x = { 'encoding', 'fileformat', 'filetype' }, + lualine_y = { 'progress' }, + lualine_z = { 'location' }, + lualine_diagnostics = { } + } + lualine.inactiveSections = { + lualine_a = { }, + lualine_b = { }, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = { }, + lualine_z = { } + } + lualine.extensions = { 'fzf' } + lualine.status() + end + } +``` + +
+ +### Defining custom themes + + +
+Theme example + +To create a custom theme you need to define a colorscheme for each of vim's modes. Each mode has a `fg` and `bg` field for every lualine section. +This is really easy in lua. Here is and example of a gruvbox theme. + +```lua +local gruvbox = { } + +local colors = { + black = "#282828", + white = '#ebdbb2', + red = '#fb4934', + green = '#b8bb26', + blue = '#83a598', + yellow = '#fe8019', + + gray = '#a89984', + darkgray = '#3c3836', + + lightgray = '#504945', + inactivegray = '#7c6f64', +} + +gruvbox.normal = { + a = { + bg = colors.gray, + fg = colors.black, + }, + b = { + bg = colors.lightgray, + fg = colors.white, + }, + c = { + bg = colors.darkgray, + fg = colors.gray + } +} + +gruvbox.insert = { + a = { + bg = colors.blue, + fg = colors.black, + }, + b = { + bg = colors.lightgray, + fg = colors.white, + }, + c = { + bg = colors.lightgray, + fg = colors.white + } +} + + +gruvbox.visual = { + a = { + bg = colors.yellow, + fg = colors.black, + }, + b = { + bg = colors.lightgray, + fg = colors.white, + }, + c = { + bg = colors.inactivegray, + fg = colors.black + }, +} + +gruvbox.replace = { + a = { + bg = colors.red, + fg = colors.black, + }, + b = { + bg = colors.lightgray, + fg = colors.white, + }, + c = { + bg = colors.black, + fg = colors.white + }, +} + +gruvbox.command = { + a = { + bg = colors.green, + fg = colors.black, + }, + b = { + bg = colors.lightgray, + fg = colors.white, + }, + c = { + bg = colors.inactivegray, + fg = colors.black + }, +} + +gruvbox.terminal = gruvbox.normal + +gruvbox.inactive = { + a = { + bg = colors.darkgray, + fg = colors.gray, + }, + b = { + bg = colors.darkgray, + fg = colors.gray, + }, + c = { + bg = colors.darkgray, + fg = colors.gray + }, +} + +lualine.theme = gruvbox +``` + +
+ +## TODO's +Please create an issue/ pr if you want to see more functionality implemented +- General + - [ ] create doc file +- Icons usage + - [x] [ryanoasis/vim-devicons](https://github.com/ryanoasis/vim-devicons) + - [x] [kyazdani42/nvim-web-devicons](https://github.com/kyazdani42/nvim-web-devicons) +- Plugin Extensions + - [x] [junegunn/fzf.vim](https://github.com/junegunn/fzf.vim) + - [ ] [tpope/vim-fugitive](https://github.com/tpope/vim-fugitive) + - [ ] [junegunn/goyo.vim](https://github.com/junegunn/goyo.vim) + - [ ] [preservim/nerdtree](https://github.com/preservim/nerdtree) + - [ ] [kyazdani42/nvim-tree.lua](https://github.com/kyazdani42/nvim-tree.lua) + - [ ] [ms-jpq/chadtree](https://github.com/ms-jpq/chadtree) + - [ ] [liuchengxu/vista.vim](https://github.com/liuchengxu/vista.vim) + - [ ] [preservim/tagbar](https://github.com/preservim/tagbar) +- Plugin Components + - [ ] [vim-signify](https://github.com/mhinz/vim-signify) +- Diagnostics + - [ ] nvim-lsp status support + - [ ] [coc.nvim](https://github.com/neoclide/coc.nvim) + - [ ] [dense-analysis/ale](https://github.com/dense-analysis/ale) +- Themes + - [ ] support for `notermguicolors` + - [ ] nord theme diff --git a/screenshots/command.png b/screenshots/command.png new file mode 100644 index 0000000..e83fcda Binary files /dev/null and b/screenshots/command.png differ diff --git a/screenshots/insert.png b/screenshots/insert.png new file mode 100644 index 0000000..43a55f6 Binary files /dev/null and b/screenshots/insert.png differ diff --git a/screenshots/normal.png b/screenshots/normal.png new file mode 100644 index 0000000..750a12a Binary files /dev/null and b/screenshots/normal.png differ diff --git a/screenshots/replace.png b/screenshots/replace.png new file mode 100644 index 0000000..b2c5eaf Binary files /dev/null and b/screenshots/replace.png differ diff --git a/screenshots/visual.png b/screenshots/visual.png new file mode 100644 index 0000000..30866b2 Binary files /dev/null and b/screenshots/visual.png differ