Mercurial > vim
diff src/create_nvcmdidxs.vim @ 27447:4050f0554902 v8.2.4252
patch 8.2.4252: generating the normal command table at runtime is inefficient
Commit: https://github.com/vim/vim/commit/4dc0dd869972ddafc7d9ee5ea765645b818a6dc9
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sat Jan 29 13:06:40 2022 +0000
patch 8.2.4252: generating the normal command table at runtime is inefficient
Problem: Generating the normal command table at runtime is inefficient.
Solution: Generate the table with a Vim script and put it in a header file.
(Yegappan Lakshmanan, closes #9648)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 29 Jan 2022 14:15:04 +0100 |
parents | |
children | ee1019e59bef |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/create_nvcmdidxs.vim @@ -0,0 +1,72 @@ +vim9script + +# This script generates the table nv_cmd_idx[] which contains the index in +# nv_cmds[] table (normal.c) for each of the command character supported in +# normal/visual mode. +# This is used to speed up the command lookup in nv_cmds[]. +# +# Script should be run using "make nvcmdidxs", every time the nv_cmds[] table +# in src/normal.c changes. + +def Create_nvcmdidxs_table() + var nv_cmdtbl: list<dict<number>> = [] + + # Generate the table of normal/visual mode command characters and their + # corresponding index. + var idx: number = 0 + var ch: number + while true + ch = internal_get_nv_cmdchar(idx) + if ch == -1 + break + endif + add(nv_cmdtbl, {idx: idx, cmdchar: ch}) + idx += 1 + endwhile + + # sort the table by the command character + sort(nv_cmdtbl, (a, b) => a.cmdchar - b.cmdchar) + + # Compute the highest index upto which the command character can be directly + # used as an index. + var nv_max_linear: number = 0 + for i in range(nv_cmdtbl->len()) + if i != nv_cmdtbl[i].cmdchar + nv_max_linear = i - 1 + break + endif + endfor + + # Generate a header file with the table + var output: list<string> =<< trim END + /* + * Automatically generated code by the create_nvcmdidxs.vim script. + * + * Table giving the index in nv_cmds[] to lookup based on + * the command character. + */ + + // nv_cmd_idx[<normal mode command character>] => nv_cmds[] index + static const unsigned short nv_cmd_idx[] = + { + END + + # Add each command character in comment and the corresponding index + var tbl: list<string> = mapnew(nv_cmdtbl, (k, v) => + ' /* ' .. printf('%5d', v.cmdchar) .. ' */ ' .. + printf('%3d', v.idx) .. ',' + ) + output += tbl + + output += [ '};', '', + '// The highest index for which', + '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]'] + output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';'] + + writefile(output, "nv_cmdidxs.h") +enddef + +Create_nvcmdidxs_table() +quit + +# vim: shiftwidth=2 sts=2 expandtab