Home

Awesome

nvim-libmodal

This is a rewrite of vim-libmodal using Neovim's Lua API. This project aims to be cross-compatable with vim-libmodal— with a few notable exceptions (see the FAQ).

Installation

Either use packadd or any package manager. I recommend using lazy.nvim.

Requirements

Examples

lazy.nvim

{'Iron-E/nvim-libmodal',
  lazy = true, -- don't load until necessary
  version = '^3.0', -- OPTIONAL: unsubscribe from breaking changes
},

packer.nvim

return require('packer').startup {function(use)
  use 'Iron-E/nvim-libmodal'
end}

Usage

The following plugins have been constructed using nvim-libmodal:

The following samples have been constructed using nvim-libmodal:

See docs for more information.

Statusline

You can add libmodal modes to your status line. Here are a few examples of how to integrate with existing plugins.

feline.nvim

See my configuration for feline.nvim here

galaxyline.nvim

See my configuration for galaxyline.nvim here.

heirline.nvim

<details> <summary>An example config</summary> <pre lang = "lua"> -- Defined in https://github.com/Iron-E/nvim-highlite local BLACK = '#202020' local BLUE = '#7766ff' local CYAN = '#33dbc3' local GRAY_DARK = '#353535' local GRAY_LIGHT = '#c0c0c0' local GREEN = '#22ff22' local GREEN_LIGHT = '#99ff99' local ICE = '#95c5ff' local ORANGE = '#ff8900' local ORANGE_LIGHT = '#f0af00' local PINK = '#ffa6ff' local PINK_LIGHT = '#ffb7b7' local PURPLE = '#cf55f0' local PURPLE_LIGHT = '#af60af' local RED = '#ee4a59' local RED_DARK = '#a80000' local RED_LIGHT = '#ff4090' local TAN = '#f4c069' local TEAL = '#60afff' local TURQOISE = '#2bff99' local YELLOW = '#f0df33'   require('heirline').setup({statusline = { { hl = function(self) vim.api.nvim_set_hl(0, self.group, {bold = true, fg = self.color}) return self.group end, init = function(self) if vim.g.libmodalActiveModeName then self.name = vim.g.libmodalActiveModeName self.color = self.modes[self.name] else local current_mode = self.modes[vim.api.nvim_get_mode().mode]   self.name = current_mode[1] self.color = current_mode[2] end   if not self.once then vim.api.nvim_create_autocmd('ModeChanged', {command = 'redrawstatus', pattern = '*:*o'}) self.once = true end end, provider = function(self) return '▊ ' .. self.name .. ' ' end, static = { -- {{{ group = 'HeirlineViMode', modes = { ['c'] = {'COMMAND-LINE', RED}, ['ce'] = {'NORMAL EX', RED_DARK}, ['cv'] = {'EX', RED_LIGHT}, ['i'] = {'INSERT', GREEN}, ['ic'] = {'INS-COMPLETE', GREEN_LIGHT}, ['n'] = {'NORMAL', PURPLE_LIGHT}, ['no'] = {'OPERATOR-PENDING', PURPLE}, ['r'] = {'HIT-ENTER', CYAN}, ['r?'] = {':CONFIRM', CYAN}, ['rm'] = {'--MORE', ICE}, ['R'] = {'REPLACE', PINK}, ['Rv'] = {'VIRTUAL', PINK_LIGHT}, ['s'] = {'SELECT', TURQOISE}, ['S'] = {'SELECT', TURQOISE}, [''] = {'SELECT', TURQOISE}, ['t'] = {'TERMINAL', ORANGE}, ['v'] = {'VISUAL', BLUE}, ['V'] = {'VISUAL LINE', BLUE}, [''] = {'VISUAL BLOCK', BLUE}, ['!'] = {'SHELL', YELLOW},   -- libmodal ['BUFFERS'] = TEAL, ['TABLES'] = ORANGE_LIGHT, ['TABS'] = TAN, } }, -- }}} update = 'ModeChanged', }, }}) </pre> </details>

lualine.nvim

<details> <summary>An example config</summary> <pre lang = "lua"> -- Defined in https://github.com/Iron-E/nvim-highlite local BLUE = '#7766ff' local CYAN = '#33dbc3' local GREEN = '#22ff22' local GREEN_LIGHT = '#99ff99' local ICE = '#95c5ff' local ORANGE = '#ff8900' local ORANGE_LIGHT = '#f0af00' local PINK = '#ffa6ff' local PINK_LIGHT = '#ffb7b7' local PURPLE = '#cf55f0' local PURPLE_LIGHT = '#af60af' local RED = '#ee4a59' local RED_DARK = '#a80000' local RED_LIGHT = '#ff4090' local TAN = '#f4c069' local TEAL = '#60afff' local TURQOISE = '#2bff99' local YELLOW = '#f0df33'   local MODES = { -- {{{ ['c'] = {'COMMAND-LINE', RED}, ['ce'] = {'NORMAL EX', RED_DARK}, ['cv'] = {'EX', RED_LIGHT}, ['i'] = {'INSERT', GREEN}, ['ic'] = {'INS-COMPLETE', GREEN_LIGHT}, ['n'] = {'NORMAL', PURPLE_LIGHT}, ['no'] = {'OPERATOR-PENDING', PURPLE}, ['r'] = {'HIT-ENTER', CYAN}, ['r?'] = {':CONFIRM', CYAN}, ['rm'] = {'--MORE', ICE}, ['R'] = {'REPLACE', PINK}, ['Rv'] = {'VIRTUAL', PINK_LIGHT}, ['s'] = {'SELECT', TURQOISE}, ['S'] = {'SELECT', TURQOISE}, [''] = {'SELECT', TURQOISE}, ['t'] = {'TERMINAL', ORANGE}, ['v'] = {'VISUAL', BLUE}, ['V'] = {'VISUAL LINE', BLUE}, [''] = {'VISUAL BLOCK', BLUE}, ['!'] = {'SHELL', YELLOW},   -- libmodal ['BUFFERS'] = TEAL, ['TABLES'] = ORANGE_LIGHT, ['TABS'] = TAN, } -- }}}   local MODE_HL_GROUP = 'LualineViMode'   --[[/* FELINE CONFIG */]]   vim.api.nvim_create_autocmd('ModeChanged', {callback = function() require('lualine').refresh {scope = 'window', place = {'statusline'}} end})   require('lualine').setup {sections = {lualine_a = {{ function() -- auto change color according the vim mode local mode_color, mode_name   if vim.g.libmodalActiveModeName then mode_name = vim.g.libmodalActiveModeName mode_color = MODES[mode_name] else local current_mode = MODES[vim.api.nvim_get_mode().mode]   mode_name = current_mode[1] mode_color = current_mode[2] end   vim.api.nvim_set_hl(0, MODE_HL_GROUP, {fg = mode_color, bold = true})   return mode_name..' ' end, icon = {'▊', align = 'left'}, color = MODE_HL_GROUP, padding = 0, }}}} </pre> </details>

staline.nvim

<details> <summary>An example config</summary> <pre lang = "lua"> --[[/* CONSTANTS */]]   -- Defined in https://github.com/Iron-E/nvim-highlite local BLUE = '#7766ff' local CYAN = '#33dbc3' local GREEN = '#22ff22' local GREEN_LIGHT = '#99ff99' local ICE = '#95c5ff' local ORANGE = '#ff8900' local ORANGE_LIGHT = '#f0af00' local PINK = '#ffa6ff' local PINK_LIGHT = '#ffb7b7' local PURPLE = '#cf55f0' local PURPLE_LIGHT = '#af60af' local RED = '#ee4a59' local RED_DARK = '#a80000' local RED_LIGHT = '#ff4090' local TAN = '#f4c069' local TEAL = '#60afff' local TURQOISE = '#2bff99' local YELLOW = '#f0df33'   local MODES = { -- {{{ ['c'] = {'COMMAND-LINE', RED}, ['ce'] = {'NORMAL EX', RED_DARK}, ['cv'] = {'EX', RED_LIGHT}, ['i'] = {'INSERT', GREEN}, ['ic'] = {'INS-COMPLETE', GREEN_LIGHT}, ['n'] = {'NORMAL', PURPLE_LIGHT}, ['no'] = {'OPERATOR-PENDING', PURPLE}, ['r'] = {'HIT-ENTER', CYAN}, ['r?'] = {':CONFIRM', CYAN}, ['rm'] = {'--MORE', ICE}, ['R'] = {'REPLACE', PINK}, ['Rv'] = {'VIRTUAL', PINK_LIGHT}, ['s'] = {'SELECT', TURQOISE}, ['S'] = {'SELECT', TURQOISE}, [''] = {'SELECT', TURQOISE}, ['t'] = {'TERMINAL', ORANGE}, ['v'] = {'VISUAL', BLUE}, ['V'] = {'VISUAL LINE', BLUE}, [''] = {'VISUAL BLOCK', BLUE}, ['!'] = {'SHELL', YELLOW},   -- libmodal ['BUFFERS'] = TEAL, ['TABLES'] = ORANGE_LIGHT, ['TABS'] = TAN, } -- }}}   local MODE_HL_GROUP = 'StalineViMode'   --[[/* FELINE CONFIG */]]   vim.api.nvim_set_hl(0, MODE_HL_GROUP, {}) require('staline').setup( { mode_colors = {}, mode_icons = {}, sections = {left = { function() local mode_color, mode_name   if vim.g.libmodalActiveModeName then mode_name = vim.g.libmodalActiveModeName mode_color = MODES[mode_name] else local current_mode = MODES[vim.api.nvim_get_mode().mode]   mode_name = current_mode[1] mode_color = current_mode[2] end   vim.api.nvim_set_hl(0, MODE_HL_GROUP, {bold = true, fg = mode_color}) return {MODE_HL_GROUP, mode_name} end, }}, }) </pre> </details>

FAQ

nvim-libmodal vs. vim-libmodal

The following is a list of expressions that work in nvim-libmodal but not vim-libmodal:

The following is a list of expressions that work in vim-libmodal but not nvim-libmodal: