diff --git a/doc/libmodal-lua.txt b/doc/libmodal-lua.txt index 4af4a77..aaefacf 100644 --- a/doc/libmodal-lua.txt +++ b/doc/libmodal-lua.txt @@ -1,231 +1,258 @@ *libmodal-lua.txt* Create modes for Neovim – Lua Referenc *libmodal-lua* -*nvim-libmodal-lua* +*libmodal-dev* -1. libmodal ............................. |libmodal-lua-libmodal| -2. libmodal.mode ........................ |libmodal-lua-mode| -2.1. libmodal.mode.ParseTable ............. |libmodal-lua-parsetable| -3. libmodal.prompt ...................... |libmodal-lua-prompt| -4. libmodal.utils ....................... |libmodal-lua-utils| -4.1. libmodal.utils.api ................... |libmodal-lua-api| -4.2. libmodal.utils.Indicator ............. |libmodal-lua-indicator| -4.3. libmodal.utils.Indicator.Entry ....... |libmodal-lua-entry| -4.4. libmodal.utils.vars .................. |libmodal-lua-vars| -4.5. libmodal.utils.WindowState ........... |libmodal-lua-windowstate| +============================================================================= +0. Table of Contents *libmodal-lua-toc* +1. `libmodal` ............................. |libmodal-lua-libmodal| +2. `libmodal.base.globals` ................ |libmodal-lua-globals| +3. `libmodal.mode.ParseTable` ............. |libmodal-lua-ParseTable| +4. `libmodal.utils` ....................... |libmodal-lua-utils| +4.1. `libmodal.utils.api` ................... |libmodal-lua-api| +4.2. `libmodal.utils.Help` .................. |libmodal-lua-Help| +4.3. `libmodal.utils.Indicator` ............. |libmodal-lua-Indicator| +4.3.1. `libmodal.utils.Indicator.Entry` ....... |libmodal-lua-Entry| +4.4. `libmodal.utils.vars` .................. |libmodal-lua-vars| +4.5. `libmodal.utils.WindowState` ........... |libmodal-lua-Windowstate| -============================================================================ +============================================================================== +1. `libmodal` *libmodal-lua-libmodal* ---[[ - /* - * MODULE `libmodal` - */ ---]] +Modules: ~ -libmodal = require('libmodal/src') -libmodal.mode = require('libmodal/src/mode') -libmodal.prompt = require('libmodal/src/prompt') -libmodal.utils = require('libmodal/src/utils') +* `libmodal` + * `libmodal.base` + * `libmodal.base.globals` + * `libmodal.mode` + * `libmodal.mode.ParseTable` + * `libmodal.prompt` + * `libmodal.utils` + * `libmodal.utils.api` + * `libmodal.utils.Help` + * `libmodal.utils.Indicator` + * `libmodal.utils.vars` + * `libmodal.utils.WindowState` ---[[ - /* - * MODULE `libmodal.mode` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] +============================================================================== +2. `libmodal.base.globals` *libmodal-lua-globals* -mode.ParseTable = require('libmodal/src/mode/ParseTable') +TODO. -local _TIMEOUT_CHAR = 'ø' -local _TIMEOUT_NR = string.byte(_TIMEOUT_CHAR) -local _TIMEOUT_LEN = api.nvim_get_option('timeoutlen') +============================================================================== +3. `libmodal.mode.ParseTable` *libmodal-lua-ParseTable* -======================== ---[[ SUMMARY: - * Enter a mode. -]] ---[[ PARAMS: - * `args[1]` => the mode name. - * `args[2]` => the mode callback, or mode combo table. - * `args[3]` => optional exit supresion flag. -]] ------------------------- -function mode.enter(...) +A `ParseTable` is a pseudo-parse tree of a given user collection of +keybinding:expression pairs. ---[[ - /* - * MODULE `libmodal.mode.ParseTable` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] +See: |libmodal-mode| for more information. --- The number corresponding to in vim. -ParseTable.CR = 13 +Variables ~ + *libmodal-lua-ParseTable-variables* -================================== ---[[ SUMMARY: - * Create a new parse table from a user-defined table. -]] ---[[ PARAMS: - * `userTable` => the table of combos defined by the user. -]] ----------------------------------- -function ParseTable.new(userTable) +`ParseTable`.CR *libmodal-lua-ParseTable-CR* -================================ ---[[ SUMMARY: - * Get a value from this `ParseTable`. -]] ---[[ PARAMS: - * `key` => the PARSED key to get. -]] ---[[ - * `function` => when `key` is a full match. - * `table` => when the `key` partially mathes. - * `false` => when `key` is not ANYWHERE. -]] --------------------------------- -function parseTable:get(keyDict) + The character number for . -======================================== ---[[ SUMMARY: - * Put `value` into the parse tree as `key`. -]] ---[[ PARAMS: - * `key` => the key that `value` is reffered to by. - * `value` => the value to store as `key`. -]] ----------------------------------------- -function parseTable:parsePut(key, value) + Value: ~ + 13 -============================================= ---[[ SUMMARY: - * Create the union of `self` and `tableToUnite` -]] ---[[ PARAMS: - * `tableToUnite` => the table to unite with `self.` -]] ---------------------------------------------- -function parseTable:parsePutAll(tableToUnite) ---[[ - /* - * MODULE `libmodal.prompt` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] +Functions ~ + *libmodal-lua-ParseTable-functions* -========================== ---[[ SUMMARY: - * Enter a prompt. -]] ---[[ PARAMS: - * `args[1]` => the prompt name. - * `args[2]` => the prompt callback, or mode command table. - * `args[3]` => a completions table. -]] --------------------------- -function prompt.enter(...) +`ParseTable`.new({userTable}) *libmodal-lua-ParseTable.new()* ---[[ - /* - * MODULE `libmodal.utils` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] + Create a new `ParseTable` from a user-defined `table` of combos. -local utils = {} -utils.api = require('libmodal/src/utils/api') -utils.Indicator = require('libmodal/src/utils/Indicator') -utils.vars = require('libmodal/src/utils/vars') -utils.WindowState = require('libmodal/src/utils/WindowState') + All keys of a `ParseTable` are numbers of characters. ---[[ - /* - * FUNCTIONS - */ ---]] + Parameters: ~ + {userTable} the table of combos defined by the user (see + `libmodal.mode.enter()`) -==================================== ---[[ SUMMARY: - * Show a default help table with `commands` and vim expressions. -]] ---[[ PARAMS: - * `commands` => the table of commands to vim expressions. -]] ------------------------------------- -function utils.commandHelp(commands) + Return: ~ + A new `ParseTable`. + Example: ~ +> + local libmodal = require('libmodal') + local userTable = { + ['zf'] = "echo 'Hello!'" + ['zfo'] = "tabnew" + } -================================== ---[[ SUMMARY: - * Show an error from `pcall()`. -]] ---[[ PARAMS: - `pcallErr` => the error generated by `pcall()`. -]] ----------------------------------- -function utils.showError(pcallErr) + local parseTable = libmodal.mode.ParseTable.new(userTable) + print(vim.inspect(parseTable)) +< ---[[ - /* - * MODULE `libmodal.utils.api` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] + See Also: ~ + |char2nr|, |nr2char| For character to number conversion and vice + versa. -local api = vim.api + |libmodal-mode| For information about {userTable}. -======================== ---[[ SUMMARY: - * Make vim ring the visual/audio bell, if it is enabled. -]] ------------------------- -function api.nvim_bell() -=========================== ---[[ SUMMARY: - * Echo a string to Vim. -]] ---[[ PARAMS: - * `str` => the string to echo. -]] ---------------------------- -function api.nvim_echo(str) +`self`:get({keyDict}) *libmodal-lua-ParseTable.get()* -==================================== ---[[ SUMMARY: - * Check whether or not some variable exists. -]] ---[[ PARAMS: - * `scope` => The scope of the variable (i.e. `g`, `l`, etc.) - * `var` => the variable to check for. -]] ------------------------------------- -function api.nvim_exists(scope, var) + Get a value from an instance of `ParseTable`. -========================= ---[[ SUMMARY: - * Gets one character of user input, as a number. -]] ---[[ REMARKS: - * This could also be: - ```lua - local cmd = { - '"while 1"', - '"let c = getchar(0)"', - '"if empty(c)"', - '"sleep 20m"', - '"else"', - '"echo c"', - '"break"', - '"endif"', - '"endwhile"' - } + Parameters: ~ + {keyDict} a string of key characters as bytes. - return tonumber(vim.api.nvim_call_function("execute",cmd)) - ``` - However, I'm not sure if it would accidentally affect text. -]] -------------------------- -function api.nvim_input() + Return: ~ + A `function` {keyDict} is a full match. + A `table` the {keyDict} partially matches. + * `false` {keyDict} is not ANYWHERE. + + Example: ~ +> + -- Simulate user input. + local userInput = {122, 102} -- {'z', 'f'} + + -- Create a dummy `ParseTable`. + local parseTable = libmodal.mode.ParseTable.new({ + ['zfo'] = 'echo "Hello!"' + }) + -- Inspect it. + print(vim.inspect(parseTable)) + + -- this will return a `table` + local tbl = parseTable:get(userInput) + -- Inspect it to show the difference. + print(vim.inspect(tbl)) +< + + +`self`:parsePut({key}, {value}) *libmodal-lua-ParseTable.parsePut()* + + Put `value` into the parse tree as `key`. + + Parameters: ~ + {key} the key that {value} is reffered to by. A `char`, not a + `byte`. + + {value} the value to store as {key}. A `string` to |execute|. + + Example: ~ +> + -- Create a dummy `ParseTable`. + local parseTable = libmodal.mode.ParseTable.new({ + ['zfo'] = 'echo "Hello!"' + }) + -- Inspect it. + print(vim.inspect(parseTable)) + + -- this will return a `table` + parseTable:parsePut({'zfc', 'split'}) + -- Inspect it to show the difference. + print(vim.inspect(parseTable)) +< + + See also: ~ + |libmodal-lua-parsetable-parseputall| for how to put multiple {key}s + and {value}s at a time. + + +`self`:parsePutAll({tableToUnite}) *libmodal-lua-ParseTable.parsePutAll()* + + Create the union of `self` and `tableToUnite` + + Interally calls |libmodal-lua-parsetable-parseput| on every key:value pair + in {tableToUnite}. + + Parameters: ~ + {tableToUnite} the table to unite with `self.` + + Example: ~ +> + -- Create an empty `ParseTable`. + local parseTable = libmodal.mode.ParseTable.new({}) + -- Create some dummy keybindings. + local unparsedUserKeybinds = { + ['zfo'] = 'echo "Hello!"', + ['zfc'] = 'split' + } + + -- Add the dummy keybindings. + parseTable:parsePut(unparsedUserKeybinds) + + -- Inspect it to show the difference. + print(vim.inspect(parseTable)) +< + + See also: ~ + |libmodal-lua-parsetable-parseput| For more information on + {tableToUnite}. + +============================================================================= +4. `libmodal.utils` *libmodal-lua-utils* + +Provides extra utilities to the |libmodal| library. + +Functions ~ + +`utils`.showError({pcallErr}) *libmodal-lua-utils.showError* + + Show an error from `pcall()`. + + Parameters: ~ + {pcallErr} the error generated by `pcall()`. + +============================================================================= +4.1. `libmodal.utils.api` *libmodal-lua-api* + +Functions ~ + +`api`.nvim_bell() *libmodal-lua-api.nvim_bell()* + + Make vim ring the visual/audio bell, if it is enabled. + + See also: ~ + 'belloff' For bell settings. + 'errorbells' For bell settings. + 'visualbell' For bell settings. + + +`api`.nvim_exists({scope}, {var}) *libmodal-lua-api.nvim_exists()* + + Check whether or not some |variable| exists. + + Parameters: ~ + {scope} The scope of the |variable| (i.e. `g:`, `l:`, etc.) + {var} The |variable| to check for. + + Example: ~ +> + local libmodal = require('libmodal') + libmodal.utils.api.nvim_command('unlet g:foo') + -- Note that the colon should not go after the scope identifier. + print(libmodal.utils.api.nvim_exists('g', 'foo')) -- false +< + +`api`.nvim_input() *libmodal-lua-api.nvim_input()* + + Gets one character of user input, as a number. + + Uses |getchar()|. + + Return: ~ + One character of user input, as a number (byte). + + Example: ~ +> + local libmodal = require('libmodal') + local char = string.char(libmodal.utils.api.nvim_input()) + + -- … wait for user to press a character … + + print(char) +< + +CONTINUE HERE + +`api`.nvim_lecho({hlTables}) *libmodal-lua-api.nvim_lecho()* -================================= --[[ SUMMARY: * Echo a table of {`hlgroup`, `str`} tables. * Meant to be read as "nvim list echo". @@ -233,18 +260,16 @@ function api.nvim_input() --[[ PARAMS: * `hlTables` => the tables to echo with highlights. ]] ---------------------------------- -function api.nvim_lecho(hlTables) -========================== +`api`.nvim_redraw() *libmodal-lua-api.nvim_redraw()* + --[[ SUMMARY: * Run `mode` to refresh the screen. * The function was not named `nvim_mode` because that would be really confusing given the name of this plugin. ]] --------------------------- -function api.nvim_redraw() -====================================== +`api`.nvim_show_err({title}, {msg}) *libmodal-lua-api.nvim_show_err()* + --[[ SUMMARY: * Show a `title` error. ]] @@ -252,51 +277,81 @@ function api.nvim_redraw() * `title` => the title of the error. * `msg` => the message of the error. ]] --------------------------------------- -function api.nvim_show_err(title, msg) ---[[ - /* - * MODULE `libmodal.utils.Indicator` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] +============================================================================== +4.2. `libmodal.utils.Help` *libmodal-lua-Help* -================================= ---[[ SUMMARY: - * Create a new `Indicator` for a mode. -]] ---[[ PARAMS: - * `modeName` => the name of the mode that this `Indicator` is for. -]] ---------------------------------- -function Indicator.mode(modeName) +TODO. -=================================== ---[[ SUMMARY: - * Create a new `Indicator` for a prompt. -]] ---[[ PARAMS: - * `modeName` => the name of the mode that this `Indicator` is for. -]] ------------------------------------ -function Indicator.prompt(modeName) +============================================================================== +4.3. `libmodal.utils.Indicator` *libmodal-lua-Indicator* ---[[ - /* - * MODULE `libmodal.utils.Indicator.Entry` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] +Functions ~ + +`Indicator`.mode({modeName}) *libmodal-lua-Indicator.mode()* + + Create a new `Indicator` for a mode. + + Parameters: ~ + {modeName} The name of the mode that this `Indicator` is for. + + Example: ~ +> + local libmodal = require('libmodal') + local indicator = libmodal.utils.Indicator.new('FOO') + libmodal.utils.api.nvim_lecho(indicator) +< + + See also: ~ + |libmodal-mode| For this function's use. + |libmodal-lua-api.nvim_lecho()| For effective |echo|ing of this + function. + +`Indicator`.prompt({modeName}) *libmodal-lua-Indicator.prompt()* + + Create a new `Indicator` for a prompt. + + Parameters: ~ + {modeName} The name of the mode that this `Indicator` is for. + + Example: ~ +> + local libmodal = require('libmodal') + local indicator = libmodal.utils.Indicator.new('FOO') + print(indicator) -- you can't use `nvim_lecho` with this one. +< + + See also: ~ + |libmodal-prompt| For this function's use. -================================ ---[[ SUMMARY: - * Create a new `Indicator.Entry`. -]] ---[[ PARAMS: - * `hlgroup` => The `highlight-group` to be used for this `Indicator.Entry`. - * `str` => The text for this `Indicator.Entry`. -]] --------------------------------- -function Entry.new(hlgroup, str) + +============================================================================== +4.3.1. `libmodal.utils.Indicator.Entry` *libmodal-lua-Entry* + +Functions ~ + +`Entry`.new({hlgroup}, {str}) *libmodal-lua-Entry.new()* + + Create a new `Indicator.Entry`. + + Parameters: ~ + {hlgroup} The |highlight-group| to be used for this `Indicator.Entry`. + {str} The text for this `Indicator.Entry`. + + Return: ~ + A new `Indicator.Entry`. + + Example: ~ +> + local libmodal = require('libmodal') + local entry = libmodal.utils.Indicator.Entry.new('Error', 'EXAMPLE!') + print(vim.inspect(entry)) +< + +============================================================================== +4.4. `libmodal.utils.vars` *libmodal-lua-vars* + +CONTINUE HERE. --[[ /* @@ -374,25 +429,30 @@ new('timeout' ) new('timer' ) new('windows' ) ---[[ - /* - * MODULE `libmodal.utils.WindowState` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - */ ---]] +============================================================================== +4.5 `libmodal.utils.WindowState` *libmodal-lua-WindowState* -========================== ---[[ SUMMARY: - * Create a table representing the size of the current window. -]] ---[[ RETURNS: - * The new `WindowState`. -]] --------------------------- -function WindowState.new() +`WindowState`.new() *libmodal-lua-WindowState.new()* -=========================== ---[[ SUMMARY - * Restore the state of `self`. -]] ---------------------------- -function winState:restore() + Create a table representing the size of the current window. + + Return: ~ + The new `WindowState`. + + Example: ~ +> + local libmodal = require('libmodal') + local windowState = libmodal.utils.WindowState.new() + print(vim.inspect(windowState)) +< + + See also: ~ + 'winheight' The `height` property of a `WindowState`. + 'winwidth' The `width` property of a `WindowState`. + +`self`:restore() *libmodal-lua-WindowState.restore()* + + Restore the state of this `WindowState`. + +============================================================================== + vim:tw=78:ts=4:ft=help:norl: diff --git a/lua/libmodal/init.lua b/lua/libmodal/init.lua index 00326e9..7785cce 100644 --- a/lua/libmodal/init.lua +++ b/lua/libmodal/init.lua @@ -3,14 +3,13 @@ * MODULE */ --]] + local libmodal = require('libmodal/src') -libmodal.mode = require('libmodal/src/mode') -libmodal.prompt = require('libmodal/src/prompt') -libmodal.utils = require('libmodal/src/utils') --[[ /* * PUBLICIZE MODULE */ --]] + return libmodal diff --git a/lua/libmodal/src/init.lua b/lua/libmodal/src/init.lua index 56ee198..b748434 100644 --- a/lua/libmodal/src/init.lua +++ b/lua/libmodal/src/init.lua @@ -14,5 +14,5 @@ libmodal.utils = require('libmodal/src/utils') * PUBLICIZE MODULE */ --]] -return libmodal +return libmodal diff --git a/lua/libmodal/src/mode/ParseTable/init.lua b/lua/libmodal/src/mode/ParseTable/init.lua index cde93f6..76882d5 100644 --- a/lua/libmodal/src/mode/ParseTable/init.lua +++ b/lua/libmodal/src/mode/ParseTable/init.lua @@ -48,10 +48,8 @@ end --------------------------------- local function _tableReverse(tbl) local reversed = {} - local i = #tbl - while i > 0 do - reversed[#reversed + 1] = tbl[i] - i = i - 1 + while #reversed < #tbl do + reversed[#reversed + 1] = tbl[#tbl - #reversed] end return reversed end diff --git a/lua/libmodal/src/mode/init.lua b/lua/libmodal/src/mode/init.lua index 3a3d553..33ef4e1 100644 --- a/lua/libmodal/src/mode/init.lua +++ b/lua/libmodal/src/mode/init.lua @@ -25,6 +25,7 @@ mode.ParseTable = require('libmodal/src/mode/ParseTable') */ --]] +local _HELP = '?' local _TIMEOUT_CHAR = 'ø' local _TIMEOUT_NR = string.byte(_TIMEOUT_CHAR) local _TIMEOUT_LEN = api.nvim_get_option('timeoutlen') @@ -89,7 +90,11 @@ local function _comboSelect(modeName) local clearUserInput = false -- if there was no matching command - if cmd == false then clearUserInput = true + if cmd == false then + if vars.help.instances[modeName] then + vars.help.instances[modeName]:show() + end + clearUserInput = true -- The command was a table, meaning that it MIGHT match. elseif commandType == globals.TYPE_TBL then -- Create a new timer @@ -147,6 +152,11 @@ local function _initCombos(modeName, comboTable) vars.buffers.instances[modeName] = buf vars.windows.instances[modeName] = api.nvim_call_function('libmodal#_winOpen', {buf}) + -- Determine if a default `Help` should be created. + if not comboTable[_HELP] then + vars.help.instances[modeName] = utils.Help.new(comboTable, 'KEY MAP') + end + -- Build the parse tree. vars.combos.instances[modeName] = mode.ParseTable.new(comboTable) diff --git a/lua/libmodal/src/prompt/init.lua b/lua/libmodal/src/prompt/init.lua index 4f5ba91..dbe2486 100644 --- a/lua/libmodal/src/prompt/init.lua +++ b/lua/libmodal/src/prompt/init.lua @@ -116,6 +116,7 @@ function prompt.enter(...) end if not containedHelp then -- assign it. completions[#completions + 1] = _HELP + vars.help.instances[modeName] = utils.Help.new(args[2], 'COMMAND') end elseif #args > 2 then -- assign completions as the custom completions table provided. completions = args[3] @@ -144,7 +145,7 @@ function prompt.enter(...) if args[2][userInput] then -- there is a defined command for the input. api.nvim_command(args[2][userInput]) elseif userInput == _HELP then -- the user did not define a 'help' command, so use the default. - utils.commandHelp(args[2]) + vars.help.instances[modeName]:show() else -- show an error. api.nvim_show_err(globals.DEFAULT_ERROR_MESSAGE, 'Unknown command') end diff --git a/lua/libmodal/src/utils/Help/init.lua b/lua/libmodal/src/utils/Help/init.lua new file mode 100644 index 0000000..d1e9209 --- /dev/null +++ b/lua/libmodal/src/utils/Help/init.lua @@ -0,0 +1,98 @@ +--[[ + /* + * CLASS `Help` + */ +--]] + +local Help = {} + +---------------------------------------- +--[[ SUMMARY: + * Create a default help table with `commandsOrMaps` and vim expressions. +]] +--[[ PARAMS: + * `commandsOrMaps` => the table of commands or mappings to vim expressions. +]] +--[[ RETURNS: + * A new `Help`. +]] +---------------------------------------- +function Help.new(commandsOrMaps, title) + -- find the longest key in the table. + local longestKey = 0 + for k, v in pairs(commandsOrMaps) do + local len = string.len(k) + if len > longestKey then + longestKey = len + end + end + + -- adjust the longest key length if the table header is longer. + if longestKey < string.len(title) then + longestKey = string.len(title) + end + + -- define the separator for entries in the help table. + local SEPARATOR = ' │ ' + + ---------------------- + --[[ SUMMARY: + * Align `tbl` according to the `longestKey`. + ]] + --[[ PARAMS: + * `tbl` => the table to align. + ]] + --[[ RETURNS: + * The aligned `tbl`. + ]] + ---------------------- + function tabAlign(tbl) + local toPrint = {} + for k, v in pairs(tbl) do + toPrint[#toPrint + 1] = k + local i = longestKey - string.len(k) + while i > 0 do + toPrint[#toPrint + 1] = ' ' + i = i - 1 + end + toPrint[#toPrint + 1] = SEPARATOR .. v .. '\n' + end + return toPrint + end + + -- define the separator for the help table. + local helpSeparator = {} + while #helpSeparator < string.len(title) do + helpSeparator[#helpSeparator + 1] = '-' + end + helpSeparator = table.concat(helpSeparator) + + -- Create a new `Help`. + return { + [1] = ' ', + [2] = table.concat(tabAlign({ + [title] = 'VIM EXPRESSION', + [helpSeparator] = '--------------' + })), + [3] = table.concat(tabAlign(commandsOrMaps)), + ----------------------- + --[[ SUMMARY: + * Show the contents of this `Help`. + ]] + ----------------------- + show = function(__self) + for _, v in ipairs(__self) do + print(v) + end + vim.api.nvim_call_function('getchar', {}) + end + } +end + +--[[ + /* + * PUBLICIZE `Help`. + */ +--]] + +return Help diff --git a/lua/libmodal/src/utils/api.lua b/lua/libmodal/src/utils/api.lua index 96ddb54..9a91da4 100644 --- a/lua/libmodal/src/utils/api.lua +++ b/lua/libmodal/src/utils/api.lua @@ -24,18 +24,6 @@ function api.nvim_bell() api.nvim_command('normal ' .. string.char(27)) -- escape char end ---------------------------- ---[[ SUMMARY: - * Echo a string to Vim. -]] ---[[ PARAMS: - * `str` => the string to echo. -]] ---------------------------- -function api.nvim_echo(str) - api.nvim_command("echo " .. tostring(str)) -end - ------------------------------------ --[[ SUMMARY: * Check whether or not some variable exists. diff --git a/lua/libmodal/src/utils/init.lua b/lua/libmodal/src/utils/init.lua index 2790d66..73fc26f 100644 --- a/lua/libmodal/src/utils/init.lua +++ b/lua/libmodal/src/utils/init.lua @@ -15,6 +15,7 @@ local globals = require('libmodal/src/base/globals') local utils = {} utils.api = require('libmodal/src/utils/api') +utils.Help = require('libmodal/src/utils/Help') utils.Indicator = require('libmodal/src/utils/Indicator') utils.vars = require('libmodal/src/utils/vars') utils.WindowState = require('libmodal/src/utils/WindowState') @@ -25,71 +26,6 @@ utils.WindowState = require('libmodal/src/utils/WindowState') */ --]] ------------------------------------- ---[[ SUMMARY: - * Show a default help table with `commands` and vim expressions. -]] ---[[ PARAMS: - * `commands` => the table of commands to vim expressions. -]] ------------------------------------- -function utils.commandHelp(commands) - -- find the longest key in the table. - local longestKey = 0 - for k, v in pairs(commands) do - local len = string.len(k) - if len > longestKey then - longestKey = len - end - end - - -- define the table header on the left side. - local LEFT_TBL_HEADER = 'COMMAND' - - -- adjust the longest key length if the table header is longer. - if longestKey < string.len(LEFT_TBL_HEADER) then - longestKey = string.len(LEFT_TBL_HEADER) - end - - -- define the separator for entries in the help table. - local SEPARATOR = ' │ ' - - ---------------------- - --[[ SUMMARY: - * Align `tbl` according to the `longestKey`. - ]] - --[[ PARAMS: - * `tbl` => the table to align. - ]] - --[[ RETURNS: - * The aligned `tbl`. - ]] - ---------------------- - function tabAlign(tbl) - local toPrint = {} - for k, v in pairs(tbl) do - toPrint[#toPrint + 1] = k - local i = longestKey - string.len(k) - while i > 0 do - toPrint[#toPrint + 1] = ' ' - i = i - 1 - end - toPrint[#toPrint + 1] = SEPARATOR .. v .. '\n' - end - return toPrint - end - - -- print the table headers. - print(' '); print(table.concat(tabAlign({ - [LEFT_TBL_HEADER] = 'VIM EXPRESSION', - ['-------'] = '--------------' - }))) - -- print the help table. - print(table.concat(tabAlign(commands))) - -- pause redrawing of the prompt. - api.nvim_call_function('getchar', {}) -end - ---------------------------------- --[[ SUMMARY: * Show an error from `pcall()`. diff --git a/lua/libmodal/src/utils/vars.lua b/lua/libmodal/src/utils/vars.lua index eed25b8..7f55e63 100644 --- a/lua/libmodal/src/utils/vars.lua +++ b/lua/libmodal/src/utils/vars.lua @@ -88,6 +88,7 @@ new('buffers' ) new('combos' ) new('completions' ) new('exit' ) +new('help' ) new('input' ) new('timeout' ) new('timer' ) diff --git a/pee b/pee deleted file mode 100644 index 4065046..0000000 --- a/pee +++ /dev/null @@ -1,117 +0,0 @@ -local api = vim.api -local libmodal = require('libmodal') -local barModeInputHistory = {} - -local function clearHistory(indexToCheck) - if #barModeInputHistory >= indexToCheck then - barModeInputHistory = {} - end -end - -function barMode() - barModeInputHistory[#barModeInputHistory + 1] = string.char( - api.nvim_get_var('barModeInput') - ) - - local index = 1 - if barModeInputHistory[1] == 'z' then - if barModeInputHistory[2] == 'f' then - if barModeInputHistory[3] == 'o' then - api.nvim_command("echom 'It works!'") - else index = 3 end - else index = 2 end - end - - clearHistory(index) -end - -libmodal.mode.enter('BAR', barMode) -local libmodal = require('libmodal') -local barModeRecurse = 0 -local barModeCombos = { - ['z'] = 'lua barMode()' -} - -function barMode() - barModeRecurse = barModeRecurse + 1 - libmodal.mode.enter('BAR' .. barModeRecurse, barModeCombos) - barModeRecurse = barModeRecurse - 1 -end - -barMode() -local libmodal = require('libmodal') -local barModeCombos = { - [''] = 'echom "You cant exit using escape."', - ['q'] = 'let g:barModeExit = 1' -} - -vim.api.nvim_set_var('barModeExit', 0) -libmodal.mode.enter('BAR', barModeCombos, true) -local libmodal = require('libmodal') -local barModeCombos = { - ['zf'] = 'split', - ['zfo'] = 'vsplit', - ['zfc'] = 'tabnew' -} - -libmodal.mode.enter('BAR', barModeCombos) -local libmodal = require('libmodal') -local api = vim.api -local commandList = {'new', 'close', 'last'} - -function barMode() - local userInput = vim.api.nvim_get_var('barModeInput') - if userInput == 'new' then - api.nvim_command('tabnew') - elseif userInput == 'close' then - api.nvim_command('tabclose') - elseif userInput == 'last' then - api.nvim_command('tablast') - end -end - -libmodal.prompt.enter('BAR', barMode, commandList) -local libmodal = require('libmodal') -local commands = { - ['new'] = 'tabnew', - ['close'] = 'tabclose', - ['last'] = 'tablast' -} - -libmodal.prompt.enter('BAR', commands) -local libmodal = require('libmodal') -local barModeRecurse = 0 - -function barMode() - local userInput = string.char(vim.api.nvim_get_var( - 'bar' .. tostring(barModeRecurse) .. 'ModeInput' - )) - - if userInput == 'z' then - barModeRecurse = barModeRecurse + 1 - enter() - barModeRecurse = barModeRecurse - 1 - end -end - -function enter() - libmodal.mode.enter('BAR' .. barModeRecurse, barMode) -end - -enter() -local libmodal = require('libmodal') - -function barMode() - local userInput = string.char( - vim.api.nvim_get_var('barModeInput') - ) - - if userInput == '' then - vim.api.nvim_command("echom 'You cant leave using .'") - elseif userInput == 'q' then - vim.api.nvim_set_var('barModeExit', true) - end -end - -vim.api.nvim_set_var('barModeExit', 0) -libmodal.mode.enter('BAR', barMode, true)