nvim-libmodal/README.md

9.6 KiB
Raw Blame History

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

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.