Skip to content

IkaSek/nvim-libmodal-hotfix

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

Create new "modes" for Neovim!

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Lua 97.5%
  • Vim Script 2.5%