gen_keycodes.lua (1970B)
1 local names_file = arg[1] 2 local keycodes_file = arg[2] 3 4 local hashy = require('gen.hashy') 5 local keycodes = loadfile(keycodes_file)() 6 7 local keycode_names = keycodes.names 8 9 local hashorder = {} --- @type string[] 10 11 --- @type table<string,integer[]> 12 --- Maps lower-case key names to their original indexes. 13 --- When multiple keys have the same name (e.g. TAB and K_TAB), 14 --- the name will have multiple original indexes. 15 local name_orig_idx = {} 16 17 --- @type table<string,integer> 18 --- Maps keys to the original indexes of their preferred names. 19 local key_orig_idx = {} 20 21 for i, keycode in ipairs(keycode_names) do 22 local key = keycode[1] 23 local name = keycode[2] 24 local name_lower = name:lower() 25 table.insert(hashorder, name_lower) 26 if name_orig_idx[name_lower] == nil then 27 name_orig_idx[name_lower] = { i } 28 else 29 table.insert(name_orig_idx[name_lower], i) 30 end 31 if key_orig_idx[key] == nil then 32 key_orig_idx[key] = i 33 end 34 end 35 36 table.sort(hashorder) 37 local hashfun 38 hashorder, hashfun = hashy.hashy_hash('get_special_key_code', hashorder, function(idx) 39 return 'key_names_table[' .. idx .. '].name.data' 40 end, true) 41 42 local names_tgt = assert(io.open(names_file, 'w')) 43 names_tgt:write([[ 44 static const struct key_name_entry { 45 int key; ///< Special key code or ascii value 46 bool is_alt; ///< Is an alternative name 47 String name; ///< Name of key 48 } key_names_table[] = {]]) 49 50 local name_orig_idx_ = vim.deepcopy(name_orig_idx) 51 for _, lower_name in ipairs(hashorder) do 52 local orig_idx = table.remove(name_orig_idx_[lower_name], 1) 53 local keycode = keycode_names[orig_idx] 54 local key = keycode[1] 55 local name = keycode[2] 56 names_tgt:write( 57 ('\n {%s, %s, {"%s", %u}},'):format( 58 key, 59 key_orig_idx[key] == orig_idx and 'false' or 'true', 60 name, 61 #name 62 ) 63 ) 64 end 65 assert(vim.iter(vim.tbl_values(name_orig_idx_)):all(vim.tbl_isempty)) 66 67 names_tgt:write('\n};\n\n') 68 names_tgt:write('static ' .. hashfun) 69 names_tgt:close()