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.
nvim-libmodal/README.md

341 lines
9.6 KiB
Markdown

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

# nvim-libmodal
This is a rewrite of [vim-libmodal](https://github.com/Iron-E/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](#FAQ)).
## Installation
Either use `packadd` or any package manager. I recommend using [lazy.nvim](https://github.com/folke/lazy.nvim).
### Requirements
* Neovim 0.7+.
* `vim-libmodal` is _not_ installed.
### Examples
#### lazy.nvim
```lua
{'Iron-E/nvim-libmodal',
lazy = true, -- don't load until necessary
version = '^3.0', -- OPTIONAL: unsubscribe from breaking changes
},
```
#### packer.nvim
```lua
return require('packer').startup {function(use)
use 'Iron-E/nvim-libmodal'
end}
```
## Usage
The following plugins have been constructed using `nvim-libmodal`:
* [`nvim-bufmode`](https://github.com/Iron-E/nvim-bufmode)
* [`nvim-marktext`](https://github.com/Iron-E/nvim-marktext)
* [`nvim-tabmode`](https://github.com/Iron-E/nvim-tabmode)
The following samples have been constructed using `nvim-libmodal`:
* [`mode-codedoc`](https://gitlab.com/Iron_E/dotfiles/-/blob/master/.config/nvim/lua/mode-codedoc.lua)
* [The Official Lua Examples](https://github.com/Iron-E/nvim-libmodal/tree/master/examples/lua)
* [The Official Vimscript Examples](https://github.com/Iron-E/nvim-libmodal/tree/master/examples)
See [docs](./doc) 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](https://gitlab.com/Iron_E/dotfiles/-/blob/78e17b41cadd1660f8d3506ffce093437eb80aae/.config/nvim/lua/plugin/feline.lua#L134-160)
#### galaxyline.nvim
See my configuration for `galaxyline.nvim` [here](https://gitlab.com/Iron_E/dotfiles/-/blob/edf3e1c9779bbc81002832bb03ec875dc86cc16b/.config/nvim/lua/plugin/galaxyline.lua#L140-163).
#### 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.
* `call libmodal#Prompt('FOO', funcref('bar'), baz)` in Vimscript.
* Lua does not support passing `funcref`s from Vimscript. Try using the Lua interface instead.