You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Go to file
Frank O'Brien e3a4b66027
extracted functionality for removing mapping from existing mapping to new function, used this function on exit instead of :unmap
1 year ago
autoload merge!: cleanup the plugin 2 years ago
doc docs(libmodal): update event listings 1 year ago
examples fix(examples): unset `fooModeExit` before first run 1 year ago
lua/libmodal extracted functionality for removing mapping from existing mapping to new function, used this function on exit instead of :unmap 1 year ago
plugin perf: general improvements 1 year ago
.gitignore Update imports 4 years ago
LICENSE.md Add license 4 years ago
README.md docs(README): fix keycodes morphed into unicode 1 year ago

README.md

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

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

An example config
-- 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',
  },
}})
  

lualine.nvim

An example config
-- 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,
}}}}
  

staline.nvim

An example config
--[[/* 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,
  }},
})
  

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 funcrefs from Vimscript. Try using the Lua interface instead.
  • call libmodal#Prompt('FOO', funcref('bar'), baz) in Vimscript.
    • Lua does not support passing funcrefs from Vimscript. Try using the Lua interface instead.