diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_docmd.c | 9 | ||||
-rw-r--r-- | src/nvim/generators/gen_ex_cmds.lua | 73 |
2 files changed, 58 insertions, 24 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index e91b6b6470..037b5dec7f 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -155,8 +155,6 @@ struct dbg_stuff { # include "ex_cmds_defs.generated.h" #endif -static const int command_count = 539; - static char_u dollar_command[2] = {'$', 0}; static void save_dbg_stuff(struct dbg_stuff *dsp) @@ -2265,8 +2263,11 @@ static char_u * do_one_cmd(char_u **cmdlinep, need_rethrow = check_cstack = FALSE; doend: - if (curwin->w_cursor.lnum == 0) /* can happen with zero line number */ + // can happen with zero line number + if (curwin->w_cursor.lnum == 0) { curwin->w_cursor.lnum = 1; + curwin->w_cursor.col = 0; + } if (errormsg != NULL && *errormsg != NUL && !did_emsg) { if (flags & DOCMD_VERBOSE) { @@ -2447,7 +2448,7 @@ static char_u *find_command(exarg_T *eap, int *full) const int c2 = eap->cmd[1]; if (command_count != (int)CMD_SIZE) { - iemsg((char_u *)_("E943: Command table needs to be updated, run 'make cmdidxs'")); + iemsg((char *)_("E943: Command table needs to be updated, run 'make'")); getout(1); } diff --git a/src/nvim/generators/gen_ex_cmds.lua b/src/nvim/generators/gen_ex_cmds.lua index cb566d46ca..7859d7c71a 100644 --- a/src/nvim/generators/gen_ex_cmds.lua +++ b/src/nvim/generators/gen_ex_cmds.lua @@ -28,34 +28,41 @@ local lastchar = nil local i local cmd local first = true -local prevfirstchar = nil local byte_a = string.byte('a') local byte_z = string.byte('z') +local a_to_z = byte_z - byte_a + 1 -local cmdidxs = string.format([[ -static const cmdidx_T cmdidxs[%u] = { -]], byte_z - byte_a + 2) +-- Table giving the index of the first command in cmdnames[] to lookup +-- based on the first letter of a command. +local cmdidxs1_out = string.format([[ +static const uint16_t cmdidxs1[%u] = { +]], a_to_z) +-- Table giving the index of the first command in cmdnames[] to lookup +-- based on the first 2 letters of a command. +-- Values in cmdidxs2[c1][c2] are relative to cmdidxs1[c1] so that they +-- fit in a byte. +local cmdidxs2_out = string.format([[ +static const char_u cmdidxs2[%u][%u] = { +/* a b c d e f g h i j k l m n o p q r s t u v w x y z */ + +]], a_to_z, a_to_z) enumfile:write([[ typedef enum CMD_index { ]]) defsfile:write(string.format([[ +static const int command_count = %u; +]], #defs)) +defsfile:write(string.format([[ static CommandDefinition cmdnames[%u] = { ]], #defs)) +local cmds, cmdidxs1, cmdidxs2 = {}, {}, {} for i, cmd in ipairs(defs) do local enumname = cmd.enum or ('CMD_' .. cmd.command) - firstchar = string.byte(cmd.command) - if firstchar ~= prevfirstchar then - if (not prevfirstchar - or (byte_a <= firstchar and firstchar <= byte_z) - or (byte_a <= prevfirstchar and prevfirstchar <= byte_z)) then - if not first then - cmdidxs = cmdidxs .. ',\n' - end - cmdidxs = cmdidxs .. ' ' .. enumname - end - prevfirstchar = firstchar + local byte_cmd = cmd.command:sub(1, 1):byte() + if byte_a <= byte_cmd and byte_cmd <= byte_z then + table.insert(cmds, cmd.command) end if first then first = false @@ -71,6 +78,35 @@ for i, cmd in ipairs(defs) do .cmd_addr_type = %i }]], enumname, cmd.command, cmd.func, cmd.flags, cmd.addr_type)) end +for i = #cmds, 1, -1 do + local cmd = cmds[i] + -- First and second characters of the command + local c1 = cmd:sub(1, 1) + cmdidxs1[c1] = i - 1 + if cmd:len() >= 2 then + local c2 = cmd:sub(2, 2) + local byte_c2 = string.byte(c2) + if byte_a <= byte_c2 and byte_c2 <= byte_z then + if not cmdidxs2[c1] then + cmdidxs2[c1] = {} + end + cmdidxs2[c1][c2] = i - 1 + end + end +end +for i = byte_a, byte_z do + local c1 = string.char(i) + cmdidxs1_out = cmdidxs1_out .. ' /* ' .. c1 .. ' */ ' .. cmdidxs1[c1] .. ',\n' + cmdidxs2_out = cmdidxs2_out .. ' /* ' .. c1 .. ' */ {' + for j = byte_a, byte_z do + local c2 = string.char(j) + cmdidxs2_out = cmdidxs2_out .. + ((cmdidxs2[c1] and cmdidxs2[c1][c2]) + and string.format('%3d', cmdidxs2[c1][c2] - cmdidxs1[c1]) + or ' 0') .. ',' + end + cmdidxs2_out = cmdidxs2_out .. ' },\n' +end defsfile:write([[ }; @@ -81,8 +117,5 @@ enumfile:write([[ CMD_USER_BUF = -2 } cmdidx_T; ]]) -cmdidxs = cmdidxs .. [[ - -}; -]] -defsfile:write(cmdidxs) +defsfile:write(cmdidxs1_out .. '};\n') +defsfile:write(cmdidxs2_out .. '};\n') |