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
- Neovim 0.7+.
vim-libmodal
is not installed.
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
:
require 'libmodal'
in Lua.vim-libmodal
does not support interacting with it through Lua, you must use the Vimscript interface.
The following is a list of expressions that work in vim-libmodal
but not nvim-libmodal
:
call libmodal#Enter('FOO', funcref('bar'), baz)
in Vimscript.- Lua does not support passing
funcref
s from Vimscript. Try using the Lua interface instead.
- Lua does not support passing
call libmodal#Prompt('FOO', funcref('bar'), baz)
in Vimscript.- Lua does not support passing
funcref
s from Vimscript. Try using the Lua interface instead.
- Lua does not support passing