mirror of
https://github.com/vim/vim
synced 2025-03-15 22:37:52 +01:00
Problem: Generating nv_cmdidxs.h requires building Vim twice. Solution: Move the table into a separate file and use a separate executable to extract the command characters. (Ozaki Kiichi, closes #9669)
60 lines
1.8 KiB
VimL
60 lines
1.8 KiB
VimL
" 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/nv_cmds.h changes.
|
|
"
|
|
" This is written in legacy Vim script so that it can be run by a slightly
|
|
" older Vim version.
|
|
|
|
" Generate the table of normal/visual mode command characters and their
|
|
" corresponding index.
|
|
let cmd = 'create_nvcmdidxs'
|
|
if has('unix')
|
|
let cmd = './' .. cmd
|
|
endif
|
|
let nv_cmdtbl = systemlist(cmd)->map({i, ch -> {'idx': i, 'cmdchar': ch}})
|
|
|
|
" sort the table by the command character
|
|
call 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.
|
|
let nv_max_linear = 0
|
|
for i in range(nv_cmdtbl->len())
|
|
if i != nv_cmdtbl[i].cmdchar
|
|
let nv_max_linear = i - 1
|
|
break
|
|
endif
|
|
endfor
|
|
|
|
" Generate a header file with the table
|
|
let output =<< 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
|
|
let output += nv_cmdtbl->map({_, v ->
|
|
\ printf(' /* %5d */ %3d,', v.cmdchar, v.idx)})
|
|
|
|
let output += ['};', '',
|
|
\ '// The highest index for which',
|
|
\ '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]']
|
|
|
|
let output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';']
|
|
|
|
call writefile(output, "nv_cmdidxs.h")
|
|
quit
|
|
|
|
" vim: shiftwidth=2 sts=2 expandtab
|