diff --git a/src/gen/gen_terminfo.lua b/src/gen/gen_terminfo.lua index 28ba3d51d5..2760c9dc32 100644 --- a/src/gen/gen_terminfo.lua +++ b/src/gen/gen_terminfo.lua @@ -7,7 +7,7 @@ -- 3. Use database to generate src/nvim/tui/terminfo_defs.h local url = 'https://invisible-island.net/datafiles/current/terminfo.src.gz' -local target_gen = 'src/nvim/tui/terminfo_defs.h' +local target_gen = 'src/nvim/tui/terminfo_builtin.h' local target_enum = 'src/nvim/tui/terminfo_enum_defs.h' local entries = { @@ -84,6 +84,25 @@ local wanted_strings_ext = { { 'set_underline_style', 'Smulx' }, } +-- Note: these are only consumed by driver-ti via it's table of "funcs" keys. +-- Second value is whether there is a "shift" variant in terminfo. +local wanted_termkeys = { + { 'backspace', false }, + { 'beg', true }, -- sometimes known as: "begin" + { 'btab', false }, + { 'clear', false }, + { 'dc', true }, + { 'end', true }, + { 'find', true }, + { 'home', true }, + { 'ic', true }, + { 'npage', false }, + { 'ppage', false }, + { 'select', false }, + { 'suspend', true }, + { 'undo', true }, +} + local db = '/tmp/nvim_terminfo' if vim.uv.fs_stat(db) == nil then local function sys(cmd) @@ -130,7 +149,23 @@ for _, item in ipairs(wanted_strings_ext) do f_enum:write(' ' .. enumify(item[1]) .. ',\n') end f_enum:write(' kTermCount, // sentinel\n') -f_enum:write('} TerminfoDef;\n') +f_enum:write('} TerminfoDef;\n\n') + +f_enum:write([[ +// TODO(bfredl): physical F-keys beyond F12 are uncommon. But terminfo +// likes to represent chords with shift and/or ctrl and F keys as high +// F-key numbers. The same chords can also be recognized by driver-csi.c +// but will then be encoded as chords. We might actually prefer that but it is +// potentially breaking change. +]]) +local func_key_max = 63 +f_enum:write('#define kTerminfoFuncKeyMax ' .. func_key_max .. '\n') +f_enum:write('typedef enum {\n') +for _, item in ipairs(wanted_termkeys) do + f_enum:write(' kTermKey_' .. item[1] .. ',\n') +end +f_enum:write(' kTermKeyCount,\n') +f_enum:write('} TerminfoKey;\n') f_enum:close() local f_defs = io.open(target_gen, 'wb') @@ -141,7 +176,7 @@ local version = io.popen('infocmp -V'):read '*a' f_defs:write('// Generated by src/gen/gen_terminfo.lua and ' .. version .. '\n') f_defs:write('#pragma once\n\n') -f_defs:write('#include "nvim/tui/terminfo.h"\n') +f_defs:write('#include "nvim/tui/terminfo_defs.h"\n') for _, entry in ipairs(entries) do local term, target = unpack(entry) @@ -186,8 +221,34 @@ for _, entry in ipairs(entries) do for _, item in ipairs(wanted_strings_ext) do f_defs:write(' [' .. enumify(item[1]) .. '] = ' .. quote(strs[item[2]]) .. ',\n') end - f_defs:write(' },\n') + f_defs:write(' .keys = {\n') + for _, item in ipairs(wanted_termkeys) do + local name = item[1] + f_defs:write( + ' [kTermKey_' + .. name + .. '] = {' + .. quote(strs['key_' .. name]) + .. ', ' + .. quote(strs['key_s' .. name]) + .. '},\n' + ) + end + f_defs:write(' },\n') + f_defs:write(' .f_keys = {\n') + if strs['key_f1'] == nil then + f_defs:write(' NULL,\n') -- compiler get sad if list is empty + else + f_defs:write(' // note: offset by one, f_keys[0] is F1 and so on\n') + end + for i = 1, func_key_max do + if strs['key_f' .. i] ~= nil then + f_defs:write(' [' .. i - 1 .. '] = ' .. quote(strs['key_f' .. i]) .. ',\n') + end + end + f_defs:write(' },\n') + f_defs:write('};\n') end @@ -200,5 +261,15 @@ f_defs:write('#define XLIST_TERMINFO_EXT \\\n') for _, item in ipairs(wanted_strings_ext) do f_defs:write(' X(' .. item[1] .. ', ' .. item[2] .. ') \\\n') end +f_defs:write('// end of list\n\n') +f_defs:write('#define XYLIST_TERMINFO_KEYS \\\n') +for _, item in ipairs(wanted_termkeys) do + f_defs:write(' ' .. (item[2] and 'Y' or 'X') .. '(' .. item[1] .. ') \\\n') +end +f_defs:write('// end of list\n\n') +f_defs:write('#define XLIST_TERMINFO_FKEYS \\\n') +for i = 1, func_key_max do + f_defs:write(' X(f' .. i .. ') \\\n') +end f_defs:write('// end of list\n') f_defs:close() diff --git a/src/nvim/tui/input.c b/src/nvim/tui/input.c index e0317d517d..f264446f15 100644 --- a/src/nvim/tui/input.c +++ b/src/nvim/tui/input.c @@ -123,7 +123,7 @@ static PMap(int) kitty_key_map = MAP_INIT; #include "tui/input.c.generated.h" -void tinput_init(TermInput *input, Loop *loop) +void tinput_init(TermInput *input, Loop *loop, TerminfoEntry *ti) { input->loop = loop; input->paste = 0; @@ -136,14 +136,8 @@ void tinput_init(TermInput *input, Loop *loop) pmap_put(int)(&kitty_key_map, kitty_key_map_entry[i].key, (ptr_t)kitty_key_map_entry[i].name); } - const char *term = os_getenv_noalloc("TERM"); - - if (!term) { - term = ""; // termkey_new_abstract assumes non-null (#2745) - } - - input->tk = termkey_new_abstract(term, (TERMKEY_FLAG_UTF8 | TERMKEY_FLAG_NOSTART - | TERMKEY_FLAG_KEEPC0)); + input->tk = termkey_new_abstract(ti, (TERMKEY_FLAG_UTF8 | TERMKEY_FLAG_NOSTART + | TERMKEY_FLAG_KEEPC0)); termkey_set_buffer_size(input->tk, INPUT_BUFFER_SIZE); termkey_hook_terminfo_getstr(input->tk, input->tk_ti_hook_fn, input); termkey_start(input->tk); diff --git a/src/nvim/tui/terminfo.c b/src/nvim/tui/terminfo.c index 331c7248f2..89d999d857 100644 --- a/src/nvim/tui/terminfo.c +++ b/src/nvim/tui/terminfo.c @@ -11,7 +11,7 @@ #include "nvim/charset.h" #include "nvim/memory.h" #include "nvim/tui/terminfo.h" -#include "nvim/tui/terminfo_defs.h" +#include "nvim/tui/terminfo_builtin.h" #ifdef __FreeBSD__ # include "nvim/os/os.h" @@ -180,6 +180,36 @@ bool terminfo_from_unibilium(TerminfoEntry *ti, char *termname, Arena *arena) } } +#define X(name) { unibi_key_##name, unibi_string_begin_ }, +#define Y(name) { unibi_key_##name, unibi_key_s##name }, + static const enum unibi_string uni_keys[][2] = { + XYLIST_TERMINFO_KEYS + }; +#undef X +#undef Y + + for (size_t i = 0; i < ARRAY_SIZE(uni_keys); i++) { + const char *val = unibi_get_str(ut, uni_keys[i][0]); + if (val) { + ti->keys[i][0] = arena_strdup(arena, val); + if (uni_keys[i][1] != unibi_string_begin_) { + const char *sval = unibi_get_str(ut, uni_keys[i][1]); + ti->keys[i][1] = sval ? arena_strdup(arena, sval) : NULL; + } + } + } + + static const enum unibi_string uni_fkeys[] = { +#define X(name) unibi_key_##name, + XLIST_TERMINFO_FKEYS +#undef X + }; + + for (size_t i = 0; i < ARRAY_SIZE(uni_fkeys); i++) { + const char *val = unibi_get_str(ut, uni_fkeys[i]); + ti->f_keys[i] = val ? arena_strdup(arena, val) : NULL; + } + unibi_destroy(ut); return true; } @@ -223,7 +253,7 @@ String terminfo_info_msg(const TerminfoEntry *ti, const char *termname) #undef X }; - for (size_t i = 0 + 1; i < ARRAY_SIZE(string_names); i++) { + for (size_t i = 0; i < ARRAY_SIZE(string_names); i++) { const char *s = ti->defs[i]; if (s) { kv_printf(data, " %-31s = ", string_names[i]); @@ -233,8 +263,44 @@ String terminfo_info_msg(const TerminfoEntry *ti, const char *termname) } } - kv_push(data, NUL); + static const char *key_names[] = { +#define X(name) #name, +#define Y(name) #name, + XYLIST_TERMINFO_KEYS +#undef X +#undef Y + }; + for (size_t i = 0 + 1; i < ARRAY_SIZE(key_names); i++) { + const char *s = ti->keys[i][0]; + if (s) { + kv_printf(data, " key_%-27s = ", key_names[i]); + kv_transstr(&data, s, false); + const char *ss = ti->keys[i][1]; + if (ss) { + kv_printf(data, ", key_s%s = ", key_names[i]); + kv_transstr(&data, ss, false); + } + kv_push(data, '\n'); + } + } + + static const char *fkey_names[] = { +#define X(name) #name, + XLIST_TERMINFO_FKEYS +#undef X + }; + + for (size_t i = 0 + 1; i < ARRAY_SIZE(fkey_names); i++) { + const char *s = ti->f_keys[i]; + if (s) { + kv_printf(data, " key_%-27s = ", fkey_names[i]); + kv_transstr(&data, s, false); + kv_push(data, '\n'); + } + } + + kv_push(data, NUL); return cbuf_as_string(data.items, data.size - 1); } diff --git a/src/nvim/tui/terminfo.h b/src/nvim/tui/terminfo.h index 1d29d033d1..0ea429600a 100644 --- a/src/nvim/tui/terminfo.h +++ b/src/nvim/tui/terminfo.h @@ -1,19 +1,7 @@ #pragma once #include "nvim/api/private/defs.h" // IWYU pragma: keep -#include "nvim/tui/terminfo_enum_defs.h" - -typedef struct { - bool bce; - // these extended booleans indicate likely 24-color support - bool has_Tc_or_RGB; - bool Su; - - int max_colors; - int lines; - int columns; - const char *defs[kTermCount]; -} TerminfoEntry; +#include "nvim/tui/terminfo_defs.h" typedef struct { long num; diff --git a/src/nvim/tui/terminfo_builtin.h b/src/nvim/tui/terminfo_builtin.h new file mode 100644 index 0000000000..603a91251d --- /dev/null +++ b/src/nvim/tui/terminfo_builtin.h @@ -0,0 +1,1868 @@ +// uncrustify:off + +// Generated by src/gen/gen_terminfo.lua and ncurses 6.5.20240427 + +#pragma once + +#include "nvim/tui/terminfo_defs.h" + +static const TerminfoEntry ansi_terminfo = { + .bce = false, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 8, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = NULL, + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\033[B", + [kTerm_cursor_invisible] = NULL, + [kTerm_cursor_left] = "\033[D", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = NULL, + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = NULL, + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[0;10m", + [kTerm_exit_ca_mode] = NULL, + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[4%p1%dm", + [kTerm_set_a_foreground] = "\033[3%p1%dm", + [kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {NULL, NULL}, + [kTermKey_end] = {NULL, NULL}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[H", NULL}, + [kTermKey_ic] = {"\033[L", NULL}, + [kTermKey_npage] = {NULL, NULL}, + [kTermKey_ppage] = {NULL, NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + NULL, + }, +}; + +static const TerminfoEntry interix_8colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 8, + .lines = 25, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = NULL, + [kTerm_clear_screen] = "\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = NULL, + [kTerm_cursor_left] = "\033[D", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = NULL, + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[s\033[1b", + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[0m", + [kTerm_exit_ca_mode] = "\033[2b\033[u\r\033[K", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[4%p1%dm", + [kTerm_set_a_foreground] = "\033[3%p1%dm", + [kTerm_set_attributes] = NULL, + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\177", NULL}, + [kTermKey_end] = {"\033[U", NULL}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[H", NULL}, + [kTermKey_ic] = {"\033[L", NULL}, + [kTermKey_npage] = {"\033[T", NULL}, + [kTermKey_ppage] = {"\033[S", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033F1", + [1] = "\033F2", + [2] = "\033F3", + [3] = "\033F4", + [4] = "\033F5", + [5] = "\033F6", + [6] = "\033F7", + [7] = "\033F8", + [8] = "\033F9", + [9] = "\033FA", + [10] = "\033FB", + [11] = "\033FC", + [12] = "\033FD", + [13] = "\033FE", + [14] = "\033FF", + [15] = "\033FG", + [16] = "\033FH", + [17] = "\033FI", + [18] = "\033FJ", + [19] = "\033FK", + [20] = "\033FL", + [21] = "\033FM", + [22] = "\033FN", + [23] = "\033FO", + [24] = "\033FP", + [25] = "\033FQ", + [26] = "\033FR", + [27] = "\033FS", + [28] = "\033FT", + [29] = "\033FU", + [30] = "\033FV", + [31] = "\033FW", + [32] = "\033FX", + [33] = "\033FY", + [34] = "\033FZ", + [35] = "\033Fa", + [36] = "\033Fb", + [37] = "\033Fc", + [38] = "\033Fd", + [39] = "\033Fe", + [40] = "\033Ff", + [41] = "\033Fg", + [42] = "\033Fh", + [43] = "\033Fi", + [44] = "\033Fj", + [45] = "\033Fk", + [46] = "\033Fm", + [47] = "\033Fn", + [48] = "\033Fo", + [49] = "\033Fp", + [50] = "\033Fq", + [51] = "\033Fr", + [52] = "\033Fs", + [53] = "\033Ft", + [54] = "\033Fu", + [55] = "\033Fv", + [56] = "\033Fw", + [57] = "\033Fx", + [58] = "\033Fy", + [59] = "\033Fz", + }, +}; + +static const TerminfoEntry iterm_256colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[m\017", + [kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t", + [kTerm_from_status_line] = "\a", + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = "\033]2;", + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = "\033[9m", + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = "\033[4\072%p1%dm", + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", NULL}, + [kTermKey_end] = {"\033OF", "\033[1;2F"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033OH", "\033[1;2H"}, + [kTermKey_ic] = {NULL, NULL}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033OP", + [1] = "\033OQ", + [2] = "\033OR", + [3] = "\033OS", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[1;2P", + [13] = "\033[1;2Q", + [14] = "\033[1;2R", + [15] = "\033[1;2S", + [16] = "\033[15;2~", + [17] = "\033[17;2~", + [18] = "\033[18;2~", + [19] = "\033[19;2~", + [20] = "\033[20;2~", + [21] = "\033[21;2~", + [22] = "\033[23;2~", + [23] = "\033[24;2~", + }, +}; + +static const TerminfoEntry linux_16colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 8, + .lines = -1, + .columns = -1, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l\033[?1c", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h\033[?0c", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = NULL, + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[m\017", + [kTerm_exit_ca_mode] = NULL, + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[4%p1%dm", + [kTerm_set_a_foreground] = "\033[3%p1%dm", + [kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033^I", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", NULL}, + [kTermKey_end] = {"\033[4~", NULL}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", NULL}, + [kTermKey_ic] = {"\033[2~", NULL}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {"^Z", NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[[A", + [1] = "\033[[B", + [2] = "\033[[C", + [3] = "\033[[D", + [4] = "\033[[E", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + }, +}; + +static const TerminfoEntry putty_256colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = -1, + .columns = -1, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\033D", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h", + [kTerm_cursor_up] = "\033M", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h", + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[m\017", + [kTerm_exit_ca_mode] = "\033[?1049l", + [kTerm_from_status_line] = "\a", + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = "\033]0;", + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = "\033[9m", + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", NULL}, + [kTermKey_end] = {"\033[4~", NULL}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", NULL}, + [kTermKey_ic] = {"\033[2~", NULL}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {"^Z", NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[11~", + [1] = "\033[12~", + [2] = "\033[13~", + [3] = "\033[14~", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + }, +}; + +static const TerminfoEntry rxvt_256colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\0337\033[?47h", + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[m\017", + [kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033>", + [kTerm_keypad_xmit] = "\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3$"}, + [kTermKey_end] = {"\033[8~", "\033[8$"}, + [kTermKey_find] = {"\033[1~", NULL}, + [kTermKey_home] = {"\033[7~", "\033[7$"}, + [kTermKey_ic] = {"\033[2~", "\033[2$"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {"\033[4~", NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[11~", + [1] = "\033[12~", + [2] = "\033[13~", + [3] = "\033[14~", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + [20] = "\033[23$", + [21] = "\033[24$", + [22] = "\033[11\136", + [23] = "\033[12\136", + [24] = "\033[13\136", + [25] = "\033[14\136", + [26] = "\033[15\136", + [27] = "\033[17\136", + [28] = "\033[18\136", + [29] = "\033[19\136", + [30] = "\033[20\136", + [31] = "\033[21\136", + [32] = "\033[23\136", + [33] = "\033[24\136", + [34] = "\033[25\136", + [35] = "\033[26\136", + [36] = "\033[28\136", + [37] = "\033[29\136", + [38] = "\033[31\136", + [39] = "\033[32\136", + [40] = "\033[33\136", + [41] = "\033[34\136", + [42] = "\033[23@", + [43] = "\033[24@", + }, +}; + +static const TerminfoEntry screen_256colour_terminfo = { + .bce = false, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[34h\033[?25h", + [kTerm_cursor_up] = "\033M", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h", + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[3m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[m\017", + [kTerm_exit_ca_mode] = "\033[?1049l", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", NULL}, + [kTermKey_end] = {"\033[4~", NULL}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", NULL}, + [kTermKey_ic] = {"\033[2~", NULL}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033OP", + [1] = "\033OQ", + [2] = "\033OR", + [3] = "\033OS", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + }, +}; + +static const TerminfoEntry st_256colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[0m", + [kTerm_exit_ca_mode] = "\033[?1049l", + [kTerm_from_status_line] = "\a", + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = "\033]0;", + [kTerm_reset_cursor_style] = "\033[2 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = "\033[9m", + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = "\033]12;%p1%s\a", + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {NULL, NULL}, + [kTermKey_clear] = {"\033[3;5~", NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033[4~", "\033[1;2F"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", "\033[1;2H"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033OP", + [1] = "\033OQ", + [2] = "\033OR", + [3] = "\033OS", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[1;2P", + [13] = "\033[1;2Q", + [14] = "\033[1;2R", + [15] = "\033[1;2S", + [16] = "\033[15;2~", + [17] = "\033[17;2~", + [18] = "\033[18;2~", + [19] = "\033[19;2~", + [20] = "\033[20;2~", + [21] = "\033[21;2~", + [22] = "\033[23;2~", + [23] = "\033[24;2~", + [24] = "\033[1;5P", + [25] = "\033[1;5Q", + [26] = "\033[1;5R", + [27] = "\033[1;5S", + [28] = "\033[15;5~", + [29] = "\033[17;5~", + [30] = "\033[18;5~", + [31] = "\033[19;5~", + [32] = "\033[20;5~", + [33] = "\033[21;5~", + [34] = "\033[23;5~", + [35] = "\033[24;5~", + [36] = "\033[1;6P", + [37] = "\033[1;6Q", + [38] = "\033[1;6R", + [39] = "\033[1;6S", + [40] = "\033[15;6~", + [41] = "\033[17;6~", + [42] = "\033[18;6~", + [43] = "\033[19;6~", + [44] = "\033[20;6~", + [45] = "\033[21;6~", + [46] = "\033[23;6~", + [47] = "\033[24;6~", + [48] = "\033[1;3P", + [49] = "\033[1;3Q", + [50] = "\033[1;3R", + [51] = "\033[1;3S", + [52] = "\033[15;3~", + [53] = "\033[17;3~", + [54] = "\033[18;3~", + [55] = "\033[19;3~", + [56] = "\033[20;3~", + [57] = "\033[21;3~", + [58] = "\033[23;3~", + [59] = "\033[24;3~", + [60] = "\033[1;4P", + [61] = "\033[1;4Q", + [62] = "\033[1;4R", + }, +}; + +static const TerminfoEntry tmux_256colour_terminfo = { + .bce = false, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[34h\033[?25h", + [kTerm_cursor_up] = "\033M", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[m\017", + [kTerm_exit_ca_mode] = "\033[?1049l", + [kTerm_from_status_line] = "\a", + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = "\033]0;", + [kTerm_reset_cursor_style] = "\033[2 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = "\033[9m", + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = "\033]12;%p1%s\a", + [kTerm_reset_cursor_color] = "\033]112\a", + [kTerm_set_underline_style] = "\033[4\072%p1%dm", + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033[4~", "\033[1;2F"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", "\033[1;2H"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033OP", + [1] = "\033OQ", + [2] = "\033OR", + [3] = "\033OS", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[1;2P", + [13] = "\033[1;2Q", + [14] = "\033[1;2R", + [15] = "\033[1;2S", + [16] = "\033[15;2~", + [17] = "\033[17;2~", + [18] = "\033[18;2~", + [19] = "\033[19;2~", + [20] = "\033[20;2~", + [21] = "\033[21;2~", + [22] = "\033[23;2~", + [23] = "\033[24;2~", + [24] = "\033[1;5P", + [25] = "\033[1;5Q", + [26] = "\033[1;5R", + [27] = "\033[1;5S", + [28] = "\033[15;5~", + [29] = "\033[17;5~", + [30] = "\033[18;5~", + [31] = "\033[19;5~", + [32] = "\033[20;5~", + [33] = "\033[21;5~", + [34] = "\033[23;5~", + [35] = "\033[24;5~", + [36] = "\033[1;6P", + [37] = "\033[1;6Q", + [38] = "\033[1;6R", + [39] = "\033[1;6S", + [40] = "\033[15;6~", + [41] = "\033[17;6~", + [42] = "\033[18;6~", + [43] = "\033[19;6~", + [44] = "\033[20;6~", + [45] = "\033[21;6~", + [46] = "\033[23;6~", + [47] = "\033[24;6~", + [48] = "\033[1;3P", + [49] = "\033[1;3Q", + [50] = "\033[1;3R", + [51] = "\033[1;3S", + [52] = "\033[15;3~", + [53] = "\033[17;3~", + [54] = "\033[18;3~", + [55] = "\033[19;3~", + [56] = "\033[20;3~", + [57] = "\033[21;3~", + [58] = "\033[23;3~", + [59] = "\033[24;3~", + [60] = "\033[1;4P", + [61] = "\033[1;4Q", + [62] = "\033[1;4R", + }, +}; + +static const TerminfoEntry vte_256colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[0m\017", + [kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t^N%e\017%;", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = "\033[1 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = "\033[9m", + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = "\033]12;%p1%s\a", + [kTerm_reset_cursor_color] = "\033]112\a", + [kTerm_set_underline_style] = "\033[4\072%p1%dm", + }, + .keys = { + [kTermKey_backspace] = {"\177", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033OF", "\033[1;2F"}, + [kTermKey_find] = {"\033[1~", NULL}, + [kTermKey_home] = {"\033OH", "\033[1;2H"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {"\033[4~", NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033OP", + [1] = "\033OQ", + [2] = "\033OR", + [3] = "\033OS", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[1;2P", + [13] = "\033[1;2Q", + [14] = "\033[1;2R", + [15] = "\033[1;2S", + [16] = "\033[15;2~", + [17] = "\033[17;2~", + [18] = "\033[18;2~", + [19] = "\033[19;2~", + [20] = "\033[20;2~", + [21] = "\033[21;2~", + [22] = "\033[23;2~", + [23] = "\033[24;2~", + [24] = "\033[1;5P", + [25] = "\033[1;5Q", + [26] = "\033[1;5R", + [27] = "\033[1;5S", + [28] = "\033[15;5~", + [29] = "\033[17;5~", + [30] = "\033[18;5~", + [31] = "\033[19;5~", + [32] = "\033[20;5~", + [33] = "\033[21;5~", + [34] = "\033[23;5~", + [35] = "\033[24;5~", + [36] = "\033[1;6P", + [37] = "\033[1;6Q", + [38] = "\033[1;6R", + [39] = "\033[1;6S", + [40] = "\033[15;6~", + [41] = "\033[17;6~", + [42] = "\033[18;6~", + [43] = "\033[19;6~", + [44] = "\033[20;6~", + [45] = "\033[21;6~", + [46] = "\033[23;6~", + [47] = "\033[24;6~", + [48] = "\033[1;3P", + [49] = "\033[1;3Q", + [50] = "\033[1;3R", + [51] = "\033[1;3S", + [52] = "\033[15;3~", + [53] = "\033[17;3~", + [54] = "\033[18;3~", + [55] = "\033[19;3~", + [56] = "\033[20;3~", + [57] = "\033[21;3~", + [58] = "\033[23;3~", + [59] = "\033[24;3~", + [60] = "\033[1;4P", + [61] = "\033[1;4Q", + [62] = "\033[1;4R", + }, +}; + +static const TerminfoEntry xterm_256colour_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\n", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?12l\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033(B\033[m", + [kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = "\033[?1l\033>", + [kTerm_keypad_xmit] = "\033[?1h\033=", + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m", + [kTerm_set_lr_margin] = "\033[?69h\033[%i%p1%d;%p2%ds", + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = "\033[2 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = "\033[9m", + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = "\033]12;%p1%s\a", + [kTerm_reset_cursor_color] = "\033]112\a", + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {"\033OE", NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033OF", "\033[1;2F"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033OH", "\033[1;2H"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033OP", + [1] = "\033OQ", + [2] = "\033OR", + [3] = "\033OS", + [4] = "\033[15~", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[1;2P", + [13] = "\033[1;2Q", + [14] = "\033[1;2R", + [15] = "\033[1;2S", + [16] = "\033[15;2~", + [17] = "\033[17;2~", + [18] = "\033[18;2~", + [19] = "\033[19;2~", + [20] = "\033[20;2~", + [21] = "\033[21;2~", + [22] = "\033[23;2~", + [23] = "\033[24;2~", + [24] = "\033[1;5P", + [25] = "\033[1;5Q", + [26] = "\033[1;5R", + [27] = "\033[1;5S", + [28] = "\033[15;5~", + [29] = "\033[17;5~", + [30] = "\033[18;5~", + [31] = "\033[19;5~", + [32] = "\033[20;5~", + [33] = "\033[21;5~", + [34] = "\033[23;5~", + [35] = "\033[24;5~", + [36] = "\033[1;6P", + [37] = "\033[1;6Q", + [38] = "\033[1;6R", + [39] = "\033[1;6S", + [40] = "\033[15;6~", + [41] = "\033[17;6~", + [42] = "\033[18;6~", + [43] = "\033[19;6~", + [44] = "\033[20;6~", + [45] = "\033[21;6~", + [46] = "\033[23;6~", + [47] = "\033[24;6~", + [48] = "\033[1;3P", + [49] = "\033[1;3Q", + [50] = "\033[1;3R", + [51] = "\033[1;3S", + [52] = "\033[15;3~", + [53] = "\033[17;3~", + [54] = "\033[18;3~", + [55] = "\033[19;3~", + [56] = "\033[20;3~", + [57] = "\033[21;3~", + [58] = "\033[23;3~", + [59] = "\033[24;3~", + [60] = "\033[1;4P", + [61] = "\033[1;4Q", + [62] = "\033[1;4R", + }, +}; + +static const TerminfoEntry cygwin_terminfo = { + .bce = false, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 8, + .lines = -1, + .columns = -1, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = NULL, + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\033[B", + [kTerm_cursor_invisible] = NULL, + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = NULL, + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\0337\033[?47h", + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[0;10m", + [kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338", + [kTerm_from_status_line] = "\a", + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[4%p1%dm", + [kTerm_set_a_foreground] = "\033[3%p1%dm", + [kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = "\033];", + [kTerm_reset_cursor_style] = NULL, + [kTerm_set_cursor_style] = NULL, + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {NULL, NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", NULL}, + [kTermKey_end] = {"\033[4~", NULL}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", NULL}, + [kTermKey_ic] = {"\033[2~", NULL}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {"^Z", NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[[A", + [1] = "\033[[B", + [2] = "\033[[C", + [3] = "\033[[D", + [4] = "\033[[E", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + }, +}; + +static const TerminfoEntry win32con_terminfo = { + .bce = false, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 8, + .lines = -1, + .columns = -1, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = NULL, + [kTerm_clear_screen] = "\033[H\033[J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\033[B", + [kTerm_cursor_invisible] = NULL, + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = NULL, + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = NULL, + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\0337\033[?47h", + [kTerm_enter_italics_mode] = NULL, + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = NULL, + [kTerm_erase_chars] = NULL, + [kTerm_exit_attribute_mode] = "\033[0m", + [kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = NULL, + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = NULL, + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = NULL, + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[4%p1%dm", + [kTerm_set_a_foreground] = "\033[3%p1%dm", + [kTerm_set_attributes] = "\033[0%?%p1%t;7%;%?%p3%t;7%;%?%p6%t;1%;m", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = "\033[0 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {NULL, NULL}, + [kTermKey_btab] = {NULL, NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033[4~", "\033[4;2~"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", "\033[1;2~"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {"^Z", NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[[A", + [1] = "\033[[B", + [2] = "\033[[C", + [3] = "\033[[D", + [4] = "\033[[E", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + [20] = "\033[23$", + [21] = "\033[24$", + [22] = "\033[11\136", + [23] = "\033[12\136", + [24] = "\033[13\136", + [25] = "\033[14\136", + [26] = "\033[15\136", + [27] = "\033[17\136", + [28] = "\033[18\136", + [29] = "\033[19\136", + [30] = "\033[20\136", + [31] = "\033[21\136", + [32] = "\033[23\136", + [33] = "\033[24\136", + [34] = "\033[25\136", + [35] = "\033[26\136", + [36] = "\033[28\136", + [37] = "\033[29\136", + [38] = "\033[31\136", + [40] = "\033[32\136", + [41] = "\033[33\136", + [42] = "\033[34\136", + [43] = "\033[23@", + [44] = "\033[24@", + }, +}; + +static const TerminfoEntry conemu_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\033[B", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[0m", + [kTerm_exit_ca_mode] = "\033[?1049l", + [kTerm_from_status_line] = NULL, + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[48;5;%p1%dm", + [kTerm_set_a_foreground] = "\033[38;5;%p1%dm", + [kTerm_set_attributes] = "\033[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = NULL, + [kTerm_reset_cursor_style] = "\033[2 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {"\033OE", NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033[4~", "\033[4;2~"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", "\033[1;2~"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[[A", + [1] = "\033[[B", + [2] = "\033[[C", + [3] = "\033[[D", + [4] = "\033[[E", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + [20] = "\033[23$", + [21] = "\033[24$", + [22] = "\033[11\136", + [23] = "\033[12\136", + [24] = "\033[13\136", + [25] = "\033[14\136", + [26] = "\033[15\136", + [27] = "\033[17\136", + [28] = "\033[18\136", + [29] = "\033[19\136", + [30] = "\033[20\136", + [31] = "\033[21\136", + [32] = "\033[23\136", + [33] = "\033[24\136", + [34] = "\033[25\136", + [35] = "\033[26\136", + [36] = "\033[28\136", + [37] = "\033[29\136", + [38] = "\033[31\136", + [39] = "\033[1;6S", + [40] = "\033[32\136", + [41] = "\033[33\136", + [42] = "\033[34\136", + [43] = "\033[23@", + [44] = "\033[24@", + }, +}; + +static const TerminfoEntry vtpcon_terminfo = { + .bce = true, + .has_Tc_or_RGB = false, + .Su = false, + .max_colors = 0x100, + .lines = 24, + .columns = 80, + .defs = { + [kTerm_carriage_return] = "\r", + [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", + [kTerm_clear_screen] = "\033[H\033[2J", + [kTerm_clr_eol] = "\033[K", + [kTerm_clr_eos] = "\033[J", + [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", + [kTerm_cursor_down] = "\033[B", + [kTerm_cursor_invisible] = "\033[?25l", + [kTerm_cursor_left] = "\b", + [kTerm_cursor_home] = "\033[H", + [kTerm_cursor_normal] = "\033[?12l\033[?25h", + [kTerm_cursor_up] = "\033[A", + [kTerm_cursor_right] = "\033[C", + [kTerm_delete_line] = "\033[M", + [kTerm_enter_bold_mode] = "\033[1m", + [kTerm_enter_ca_mode] = "\033[?1049h", + [kTerm_enter_italics_mode] = "\033[3m", + [kTerm_enter_reverse_mode] = "\033[7m", + [kTerm_enter_standout_mode] = "\033[7m", + [kTerm_enter_underline_mode] = "\033[4m", + [kTerm_erase_chars] = "\033[%p1%dX", + [kTerm_exit_attribute_mode] = "\033[0m", + [kTerm_exit_ca_mode] = "\033[?1049l", + [kTerm_from_status_line] = "\a", + [kTerm_insert_line] = "\033[L", + [kTerm_keypad_local] = NULL, + [kTerm_keypad_xmit] = NULL, + [kTerm_parm_delete_line] = "\033[%p1%dM", + [kTerm_parm_down_cursor] = "\033[%p1%dB", + [kTerm_parm_insert_line] = "\033[%p1%dL", + [kTerm_parm_left_cursor] = "\033[%p1%dD", + [kTerm_parm_right_cursor] = "\033[%p1%dC", + [kTerm_parm_up_cursor] = "\033[%p1%dA", + [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", + [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", + [kTerm_set_attributes] = "\033[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m", + [kTerm_set_lr_margin] = NULL, + [kTerm_to_status_line] = "\033]0;", + [kTerm_reset_cursor_style] = "\033[2 q", + [kTerm_set_cursor_style] = "\033[%p1%d q", + [kTerm_enter_strikethrough_mode] = NULL, + [kTerm_set_rgb_foreground] = NULL, + [kTerm_set_rgb_background] = NULL, + [kTerm_set_cursor_color] = NULL, + [kTerm_reset_cursor_color] = NULL, + [kTerm_set_underline_style] = NULL, + }, + .keys = { + [kTermKey_backspace] = {"\b", NULL}, + [kTermKey_beg] = {"\033OE", NULL}, + [kTermKey_btab] = {"\033[Z", NULL}, + [kTermKey_clear] = {NULL, NULL}, + [kTermKey_dc] = {"\033[3~", "\033[3;2~"}, + [kTermKey_end] = {"\033[4~", "\033[4;2~"}, + [kTermKey_find] = {NULL, NULL}, + [kTermKey_home] = {"\033[1~", "\033[1;2~"}, + [kTermKey_ic] = {"\033[2~", "\033[2;2~"}, + [kTermKey_npage] = {"\033[6~", NULL}, + [kTermKey_ppage] = {"\033[5~", NULL}, + [kTermKey_select] = {NULL, NULL}, + [kTermKey_suspend] = {NULL, NULL}, + [kTermKey_undo] = {NULL, NULL}, + }, + .f_keys = { + // note: offset by one, f_keys[0] is F1 and so on + [0] = "\033[[A", + [1] = "\033[[B", + [2] = "\033[[C", + [3] = "\033[[D", + [4] = "\033[[E", + [5] = "\033[17~", + [6] = "\033[18~", + [7] = "\033[19~", + [8] = "\033[20~", + [9] = "\033[21~", + [10] = "\033[23~", + [11] = "\033[24~", + [12] = "\033[25~", + [13] = "\033[26~", + [14] = "\033[28~", + [15] = "\033[29~", + [16] = "\033[31~", + [17] = "\033[32~", + [18] = "\033[33~", + [19] = "\033[34~", + [20] = "\033[23$", + [21] = "\033[24$", + [22] = "\033[11\136", + [23] = "\033[12\136", + [24] = "\033[13\136", + [25] = "\033[14\136", + [26] = "\033[15\136", + [27] = "\033[17\136", + [28] = "\033[18\136", + [29] = "\033[19\136", + [30] = "\033[20\136", + [31] = "\033[21\136", + [32] = "\033[23\136", + [33] = "\033[24\136", + [34] = "\033[25\136", + [35] = "\033[26\136", + [36] = "\033[28\136", + [37] = "\033[29\136", + [38] = "\033[31\136", + [39] = "\033[1;6S", + [40] = "\033[32\136", + [41] = "\033[33\136", + [42] = "\033[34\136", + [43] = "\033[23@", + [44] = "\033[24@", + }, +}; + +#define XLIST_TERMINFO_BUILTIN \ + X(carriage_return) \ + X(change_scroll_region) \ + X(clear_screen) \ + X(clr_eol) \ + X(clr_eos) \ + X(cursor_address) \ + X(cursor_down) \ + X(cursor_invisible) \ + X(cursor_left) \ + X(cursor_home) \ + X(cursor_normal) \ + X(cursor_up) \ + X(cursor_right) \ + X(delete_line) \ + X(enter_bold_mode) \ + X(enter_ca_mode) \ + X(enter_italics_mode) \ + X(enter_reverse_mode) \ + X(enter_standout_mode) \ + X(enter_underline_mode) \ + X(erase_chars) \ + X(exit_attribute_mode) \ + X(exit_ca_mode) \ + X(from_status_line) \ + X(insert_line) \ + X(keypad_local) \ + X(keypad_xmit) \ + X(parm_delete_line) \ + X(parm_down_cursor) \ + X(parm_insert_line) \ + X(parm_left_cursor) \ + X(parm_right_cursor) \ + X(parm_up_cursor) \ + X(set_a_background) \ + X(set_a_foreground) \ + X(set_attributes) \ + X(set_lr_margin) \ + X(to_status_line) \ +// end of list + +#define XLIST_TERMINFO_EXT \ + X(reset_cursor_style, Se) \ + X(set_cursor_style, Ss) \ + X(enter_strikethrough_mode, smxx) \ + X(set_rgb_foreground, setrgbf) \ + X(set_rgb_background, setrgbb) \ + X(set_cursor_color, Cs) \ + X(reset_cursor_color, Cr) \ + X(set_underline_style, Smulx) \ +// end of list + +#define XYLIST_TERMINFO_KEYS \ + X(backspace) \ + Y(beg) \ + X(btab) \ + X(clear) \ + Y(dc) \ + Y(end) \ + Y(find) \ + Y(home) \ + Y(ic) \ + X(npage) \ + X(ppage) \ + X(select) \ + Y(suspend) \ + Y(undo) \ +// end of list + +#define XLIST_TERMINFO_FKEYS \ + X(f1) \ + X(f2) \ + X(f3) \ + X(f4) \ + X(f5) \ + X(f6) \ + X(f7) \ + X(f8) \ + X(f9) \ + X(f10) \ + X(f11) \ + X(f12) \ + X(f13) \ + X(f14) \ + X(f15) \ + X(f16) \ + X(f17) \ + X(f18) \ + X(f19) \ + X(f20) \ + X(f21) \ + X(f22) \ + X(f23) \ + X(f24) \ + X(f25) \ + X(f26) \ + X(f27) \ + X(f28) \ + X(f29) \ + X(f30) \ + X(f31) \ + X(f32) \ + X(f33) \ + X(f34) \ + X(f35) \ + X(f36) \ + X(f37) \ + X(f38) \ + X(f39) \ + X(f40) \ + X(f41) \ + X(f42) \ + X(f43) \ + X(f44) \ + X(f45) \ + X(f46) \ + X(f47) \ + X(f48) \ + X(f49) \ + X(f50) \ + X(f51) \ + X(f52) \ + X(f53) \ + X(f54) \ + X(f55) \ + X(f56) \ + X(f57) \ + X(f58) \ + X(f59) \ + X(f60) \ + X(f61) \ + X(f62) \ + X(f63) \ +// end of list diff --git a/src/nvim/tui/terminfo_defs.h b/src/nvim/tui/terminfo_defs.h index baf516b177..546bb2ec4e 100644 --- a/src/nvim/tui/terminfo_defs.h +++ b/src/nvim/tui/terminfo_defs.h @@ -1,914 +1,20 @@ -// uncrustify:off - -// Generated by src/gen/gen_terminfo.lua and ncurses 6.5.20240427 - #pragma once -#include "nvim/tui/terminfo.h" +#include +#include -static const TerminfoEntry ansi_terminfo = { - .bce = false, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 8, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = NULL, - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\033[B", - [kTerm_cursor_invisible] = NULL, - [kTerm_cursor_left] = "\033[D", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = NULL, - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = NULL, - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[0;10m", - [kTerm_exit_ca_mode] = NULL, - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[4%p1%dm", - [kTerm_set_a_foreground] = "\033[3%p1%dm", - [kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; +#include "nvim/tui/terminfo_enum_defs.h" -static const TerminfoEntry interix_8colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 8, - .lines = 25, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = NULL, - [kTerm_clear_screen] = "\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = NULL, - [kTerm_cursor_left] = "\033[D", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = NULL, - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[s\033[1b", - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[0m", - [kTerm_exit_ca_mode] = "\033[2b\033[u\r\033[K", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[4%p1%dm", - [kTerm_set_a_foreground] = "\033[3%p1%dm", - [kTerm_set_attributes] = NULL, - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; +typedef struct { + bool bce; + // these extended booleans indicate likely 24-color support + bool has_Tc_or_RGB; + bool Su; -static const TerminfoEntry iterm_256colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[m\017", - [kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t", - [kTerm_from_status_line] = "\a", - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = "\033]2;", - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = "\033[9m", - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = "\033[4\072%p1%dm", - }, -}; - -static const TerminfoEntry linux_16colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 8, - .lines = -1, - .columns = -1, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l\033[?1c", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h\033[?0c", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = NULL, - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[m\017", - [kTerm_exit_ca_mode] = NULL, - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[4%p1%dm", - [kTerm_set_a_foreground] = "\033[3%p1%dm", - [kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry putty_256colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = -1, - .columns = -1, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\033D", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h", - [kTerm_cursor_up] = "\033M", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h", - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[m\017", - [kTerm_exit_ca_mode] = "\033[?1049l", - [kTerm_from_status_line] = "\a", - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = "\033]0;", - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = "\033[9m", - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry rxvt_256colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\0337\033[?47h", - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[m\017", - [kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033>", - [kTerm_keypad_xmit] = "\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry screen_256colour_terminfo = { - .bce = false, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[34h\033[?25h", - [kTerm_cursor_up] = "\033M", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h", - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[3m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[m\017", - [kTerm_exit_ca_mode] = "\033[?1049l", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry st_256colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[0m", - [kTerm_exit_ca_mode] = "\033[?1049l", - [kTerm_from_status_line] = "\a", - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = "\033]0;", - [kTerm_reset_cursor_style] = "\033[2 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = "\033[9m", - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = "\033]12;%p1%s\a", - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry tmux_256colour_terminfo = { - .bce = false, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[34h\033[?25h", - [kTerm_cursor_up] = "\033M", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[m\017", - [kTerm_exit_ca_mode] = "\033[?1049l", - [kTerm_from_status_line] = "\a", - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = "\033]0;", - [kTerm_reset_cursor_style] = "\033[2 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = "\033[9m", - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = "\033]12;%p1%s\a", - [kTerm_reset_cursor_color] = "\033]112\a", - [kTerm_set_underline_style] = "\033[4\072%p1%dm", - }, -}; - -static const TerminfoEntry vte_256colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[0m\017", - [kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t^N%e\017%;", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = "\033[1 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = "\033[9m", - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = "\033]12;%p1%s\a", - [kTerm_reset_cursor_color] = "\033]112\a", - [kTerm_set_underline_style] = "\033[4\072%p1%dm", - }, -}; - -static const TerminfoEntry xterm_256colour_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\n", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?12l\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033(B\033[m", - [kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = "\033[?1l\033>", - [kTerm_keypad_xmit] = "\033[?1h\033=", - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m", - [kTerm_set_lr_margin] = "\033[?69h\033[%i%p1%d;%p2%ds", - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = "\033[2 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = "\033[9m", - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = "\033]12;%p1%s\a", - [kTerm_reset_cursor_color] = "\033]112\a", - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry cygwin_terminfo = { - .bce = false, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 8, - .lines = -1, - .columns = -1, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = NULL, - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\033[B", - [kTerm_cursor_invisible] = NULL, - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = NULL, - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\0337\033[?47h", - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[0;10m", - [kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338", - [kTerm_from_status_line] = "\a", - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[4%p1%dm", - [kTerm_set_a_foreground] = "\033[3%p1%dm", - [kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = "\033];", - [kTerm_reset_cursor_style] = NULL, - [kTerm_set_cursor_style] = NULL, - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry win32con_terminfo = { - .bce = false, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 8, - .lines = -1, - .columns = -1, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = NULL, - [kTerm_clear_screen] = "\033[H\033[J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\033[B", - [kTerm_cursor_invisible] = NULL, - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = NULL, - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = NULL, - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\0337\033[?47h", - [kTerm_enter_italics_mode] = NULL, - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = NULL, - [kTerm_erase_chars] = NULL, - [kTerm_exit_attribute_mode] = "\033[0m", - [kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = NULL, - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = NULL, - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = NULL, - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[4%p1%dm", - [kTerm_set_a_foreground] = "\033[3%p1%dm", - [kTerm_set_attributes] = "\033[0%?%p1%t;7%;%?%p3%t;7%;%?%p6%t;1%;m", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = "\033[0 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry conemu_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\033[B", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[0m", - [kTerm_exit_ca_mode] = "\033[?1049l", - [kTerm_from_status_line] = NULL, - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[48;5;%p1%dm", - [kTerm_set_a_foreground] = "\033[38;5;%p1%dm", - [kTerm_set_attributes] = "\033[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = NULL, - [kTerm_reset_cursor_style] = "\033[2 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -static const TerminfoEntry vtpcon_terminfo = { - .bce = true, - .has_Tc_or_RGB = false, - .Su = false, - .max_colors = 0x100, - .lines = 24, - .columns = 80, - .defs = { - [kTerm_carriage_return] = "\r", - [kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr", - [kTerm_clear_screen] = "\033[H\033[2J", - [kTerm_clr_eol] = "\033[K", - [kTerm_clr_eos] = "\033[J", - [kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH", - [kTerm_cursor_down] = "\033[B", - [kTerm_cursor_invisible] = "\033[?25l", - [kTerm_cursor_left] = "\b", - [kTerm_cursor_home] = "\033[H", - [kTerm_cursor_normal] = "\033[?12l\033[?25h", - [kTerm_cursor_up] = "\033[A", - [kTerm_cursor_right] = "\033[C", - [kTerm_delete_line] = "\033[M", - [kTerm_enter_bold_mode] = "\033[1m", - [kTerm_enter_ca_mode] = "\033[?1049h", - [kTerm_enter_italics_mode] = "\033[3m", - [kTerm_enter_reverse_mode] = "\033[7m", - [kTerm_enter_standout_mode] = "\033[7m", - [kTerm_enter_underline_mode] = "\033[4m", - [kTerm_erase_chars] = "\033[%p1%dX", - [kTerm_exit_attribute_mode] = "\033[0m", - [kTerm_exit_ca_mode] = "\033[?1049l", - [kTerm_from_status_line] = "\a", - [kTerm_insert_line] = "\033[L", - [kTerm_keypad_local] = NULL, - [kTerm_keypad_xmit] = NULL, - [kTerm_parm_delete_line] = "\033[%p1%dM", - [kTerm_parm_down_cursor] = "\033[%p1%dB", - [kTerm_parm_insert_line] = "\033[%p1%dL", - [kTerm_parm_left_cursor] = "\033[%p1%dD", - [kTerm_parm_right_cursor] = "\033[%p1%dC", - [kTerm_parm_up_cursor] = "\033[%p1%dA", - [kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", - [kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", - [kTerm_set_attributes] = "\033[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m", - [kTerm_set_lr_margin] = NULL, - [kTerm_to_status_line] = "\033]0;", - [kTerm_reset_cursor_style] = "\033[2 q", - [kTerm_set_cursor_style] = "\033[%p1%d q", - [kTerm_enter_strikethrough_mode] = NULL, - [kTerm_set_rgb_foreground] = NULL, - [kTerm_set_rgb_background] = NULL, - [kTerm_set_cursor_color] = NULL, - [kTerm_reset_cursor_color] = NULL, - [kTerm_set_underline_style] = NULL, - }, -}; - -#define XLIST_TERMINFO_BUILTIN \ - X(carriage_return) \ - X(change_scroll_region) \ - X(clear_screen) \ - X(clr_eol) \ - X(clr_eos) \ - X(cursor_address) \ - X(cursor_down) \ - X(cursor_invisible) \ - X(cursor_left) \ - X(cursor_home) \ - X(cursor_normal) \ - X(cursor_up) \ - X(cursor_right) \ - X(delete_line) \ - X(enter_bold_mode) \ - X(enter_ca_mode) \ - X(enter_italics_mode) \ - X(enter_reverse_mode) \ - X(enter_standout_mode) \ - X(enter_underline_mode) \ - X(erase_chars) \ - X(exit_attribute_mode) \ - X(exit_ca_mode) \ - X(from_status_line) \ - X(insert_line) \ - X(keypad_local) \ - X(keypad_xmit) \ - X(parm_delete_line) \ - X(parm_down_cursor) \ - X(parm_insert_line) \ - X(parm_left_cursor) \ - X(parm_right_cursor) \ - X(parm_up_cursor) \ - X(set_a_background) \ - X(set_a_foreground) \ - X(set_attributes) \ - X(set_lr_margin) \ - X(to_status_line) \ -// end of list - -#define XLIST_TERMINFO_EXT \ - X(reset_cursor_style, Se) \ - X(set_cursor_style, Ss) \ - X(enter_strikethrough_mode, smxx) \ - X(set_rgb_foreground, setrgbf) \ - X(set_rgb_background, setrgbb) \ - X(set_cursor_color, Cs) \ - X(reset_cursor_color, Cr) \ - X(set_underline_style, Smulx) \ -// end of list + int max_colors; + int lines; + int columns; + const char *defs[kTermCount]; + const char *keys[kTermKeyCount][2]; + const char *f_keys[kTerminfoFuncKeyMax]; +} TerminfoEntry; diff --git a/src/nvim/tui/terminfo_enum_defs.h b/src/nvim/tui/terminfo_enum_defs.h index 57348219bd..511216eb0e 100644 --- a/src/nvim/tui/terminfo_enum_defs.h +++ b/src/nvim/tui/terminfo_enum_defs.h @@ -52,3 +52,27 @@ typedef enum { kTerm_set_underline_style, kTermCount, // sentinel } TerminfoDef; + +// TODO(bfredl): physical F-keys beyond F12 are uncommon. But terminfo +// likes to represent chords with shift and/or ctrl and F keys as high +// F-key numbers. The same chords can also be recognized by driver-csi.c +// but will then be encoded as chords. We might actually prefer that but it is +// potentially breaking change. +#define kTerminfoFuncKeyMax 63 +typedef enum { + kTermKey_backspace, + kTermKey_beg, + kTermKey_btab, + kTermKey_clear, + kTermKey_dc, + kTermKey_end, + kTermKey_find, + kTermKey_home, + kTermKey_ic, + kTermKey_npage, + kTermKey_ppage, + kTermKey_select, + kTermKey_suspend, + kTermKey_undo, + kTermKeyCount, +} TerminfoKey; diff --git a/src/nvim/tui/termkey/driver-csi.c b/src/nvim/tui/termkey/driver-csi.c index b97259d6df..2e034bcd3a 100644 --- a/src/nvim/tui/termkey/driver-csi.c +++ b/src/nvim/tui/termkey/driver-csi.c @@ -683,7 +683,7 @@ static int register_keys(void) return 1; } -void *new_driver_csi(TermKey *tk, const char *term) +void *new_driver_csi(TermKey *tk, TerminfoEntry *term) { if (!keyinfo_initialised) { if (!register_keys()) { diff --git a/src/nvim/tui/termkey/driver-ti.c b/src/nvim/tui/termkey/driver-ti.c index fb20b4e89a..5bab3da169 100644 --- a/src/nvim/tui/termkey/driver-ti.c +++ b/src/nvim/tui/termkey/driver-ti.c @@ -4,10 +4,11 @@ #include #include #include -#include #include +#include "nvim/charset.h" #include "nvim/memory.h" +#include "nvim/tui/terminfo.h" #include "nvim/tui/termkey/driver-ti.h" #include "nvim/tui/termkey/termkey-internal.h" #include "nvim/tui/termkey/termkey_defs.h" @@ -25,77 +26,58 @@ #define MAX_FUNCNAME 9 static struct { + TerminfoKey ti_key; const char *funcname; TermKeyType type; TermKeySym sym; int mods; } funcs[] = { // THIS LIST MUST REMAIN SORTED! - { "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 }, - { "begin", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 }, - { "beg", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 }, - { "btab", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT }, - { "cancel", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL, 0 }, - { "clear", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR, 0 }, - { "close", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE, 0 }, - { "command", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND, 0 }, - { "copy", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY, 0 }, - { "dc", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 0 }, - { "down", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 0 }, - { "end", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 0 }, - { "enter", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER, 0 }, - { "exit", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT, 0 }, - { "find", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 0 }, - { "help", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP, 0 }, - { "home", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 0 }, - { "ic", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 0 }, - { "left", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 0 }, - { "mark", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK, 0 }, - { "message", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE, 0 }, - { "move", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE, 0 }, - { "next", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, // Not quite, but it's the best we can do - { "npage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, - { "open", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN, 0 }, - { "options", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS, 0 }, - { "ppage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, - { "previous", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, // Not quite, but it's the best we can do - { "print", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT, 0 }, - { "redo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO, 0 }, - { "reference", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 }, - { "refresh", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH, 0 }, - { "replace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE, 0 }, - { "restart", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART, 0 }, - { "resume", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME, 0 }, - { "right", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 0 }, - { "save", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE, 0 }, - { "select", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 0 }, - { "suspend", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND, 0 }, - { "undo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO, 0 }, - { "up", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 0 }, - { NULL, 0, 0, 0 }, + // nvim note: entries commented out without further note are not recognized by nvim. +#define KDEF(x) kTermKey_##x, #x + { KDEF(backspace), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 }, + { KDEF(beg), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 }, + { KDEF(btab), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT }, + // { KDEF(cancel), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL, 0 }, + { KDEF(clear), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR, 0 }, + // { KDEF(close), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE, 0 }, + // { KDEF(command), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND, 0 }, + // { KDEF(copy), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY, 0 }, + { KDEF(dc), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 0 }, + // { KDEF(down), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 0 }, // redundant, driver-csi + { KDEF(end), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 0 }, + // { KDEF(enter), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER, 0 }, + // { KDEF(exit), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT, 0 }, + { KDEF(find), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 0 }, + // { KDEF(help), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP, 0 }, + { KDEF(home), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 0 }, + { KDEF(ic), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 0 }, + // { KDEF(left), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 0 }, // redundant: driver-csi + // { KDEF(mark), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK, 0 }, + // { KDEF(message), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE, 0 }, + // { KDEF(move), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE, 0 }, + // { KDEF(next), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, // use "npage" right below + { KDEF(npage), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, + // { KDEF(open), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN, 0 }, + // { KDEF(options), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS, 0 }, + { KDEF(ppage), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, + // { KDEF(previous), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, // use "ppage" right above + // { KDEF(print), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT, 0 }, + // { KDEF(redo), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO, 0 }, + // { KDEF(reference), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 }, + // { KDEF(refresh), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH, 0 }, + // { KDEF(replace), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE, 0 }, + // { KDEF(restart), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART, 0 }, + // { KDEF(resume), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME, 0 }, + // { KDEF(right), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 0 }, // redundant, driver-csi + // { KDEF(save), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE, 0 }, + { KDEF(select), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 0 }, + { KDEF(suspend), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND, 0 }, + { KDEF(undo), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO, 0 }, + // { KDEF(up), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 0 }, // redundant, driver-ci + { 0, NULL, 0, 0, 0 }, }; -static enum unibi_string unibi_lookup_str(const char *name) -{ - for (enum unibi_string ret = unibi_string_begin_ + 1; ret < unibi_string_end_; ret++) { - if (streq(unibi_name_str(ret), name)) { - return ret; - } - } - - return (enum unibi_string)-1; -} - -static const char *unibi_get_str_by_name(const unibi_term *ut, const char *name) -{ - enum unibi_string idx = unibi_lookup_str(name); - if (idx == (enum unibi_string)-1) { - return NULL; - } - - return unibi_get_str(ut, idx); -} - // To be efficient at lookups, we store the byte sequence => keyinfo mapping // in a trie. This avoids a slow linear search through a flat list of // sequences. Because it is likely most nodes will be very sparse, we optimise @@ -226,12 +208,18 @@ static struct trie_node *compress_trie(struct trie_node *n) return n; } -static bool try_load_terminfo_key(TermKeyTI *ti, const char *name, struct keyinfo *info) +static bool try_load_terminfo_key(TermKeyTI *ti, bool fn_nr, int key, bool shift, const char *name, + struct keyinfo *info) { const char *value = NULL; - if (ti->unibi) { - value = unibi_get_str_by_name(ti->unibi, name); + if (ti->ti) { + if (!fn_nr) { + value = ti->ti->keys[key][shift ? 1 : 0]; + } else { + assert(!shift); + value = ti->ti->f_keys[key]; + } } if (ti->tk->ti_getstr_hook) { @@ -253,8 +241,6 @@ static int load_terminfo(TermKeyTI *ti) { int i; - unibi_term *unibi = ti->unibi; - ti->root = new_node_arr(0, 0xff); if (!ti->root) { return 0; @@ -265,7 +251,7 @@ static int load_terminfo(TermKeyTI *ti) char name[MAX_FUNCNAME + 5 + 1]; sprintf(name, "key_%s", funcs[i].funcname); // NOLINT(runtime/printf) - if (!try_load_terminfo_key(ti, name, &(struct keyinfo){ + if (!try_load_terminfo_key(ti, false, (int)funcs[i].ti_key, false, name, &(struct keyinfo){ .type = funcs[i].type, .sym = funcs[i].sym, .modifier_mask = funcs[i].mods, @@ -276,7 +262,7 @@ static int load_terminfo(TermKeyTI *ti) // Maybe it has a shifted version sprintf(name, "key_s%s", funcs[i].funcname); // NOLINT(runtime/printf) - try_load_terminfo_key(ti, name, &(struct keyinfo){ + try_load_terminfo_key(ti, false, (int)funcs[i].ti_key, true, name, &(struct keyinfo){ .type = funcs[i].type, .sym = funcs[i].sym, .modifier_mask = funcs[i].mods | TERMKEY_KEYMOD_SHIFT, @@ -285,10 +271,10 @@ static int load_terminfo(TermKeyTI *ti) } // Now the F keys - for (i = 1; i < 255; i++) { + for (i = 1; i <= kTerminfoFuncKeyMax; i++) { char name[9]; sprintf(name, "key_f%d", i); // NOLINT(runtime/printf) - if (!try_load_terminfo_key(ti, name, &(struct keyinfo){ + if (!try_load_terminfo_key(ti, true, (i - 1), false, name, &(struct keyinfo){ .type = TERMKEY_TYPE_FUNCTION, .sym = i, .modifier_mask = 0, @@ -299,11 +285,12 @@ static int load_terminfo(TermKeyTI *ti) } // Finally mouse mode - { + // This is overriden in nvim: we only want driver-csi mouse support + if (false) { const char *value = NULL; - if (ti->unibi) { - value = unibi_get_str_by_name(ti->unibi, "key_mouse"); + if (ti->ti) { + // value = ti->ti->keys[kTermKey_mouse][0]; } if (ti->tk->ti_getstr_hook) { @@ -321,8 +308,8 @@ static int load_terminfo(TermKeyTI *ti) // Take copies of these terminfo strings, in case we build multiple termkey // instances for multiple different termtypes, and it's different by the // time we want to use it - const char *keypad_xmit = unibi - ? unibi_get_str(unibi, unibi_keypad_xmit) + const char *keypad_xmit = ti->ti + ? ti->ti->defs[kTerm_keypad_xmit] : NULL; if (keypad_xmit) { @@ -331,8 +318,8 @@ static int load_terminfo(TermKeyTI *ti) ti->start_string = NULL; } - const char *keypad_local = unibi - ? unibi_get_str(unibi, unibi_keypad_local) + const char *keypad_local = ti->ti + ? ti->ti->defs[kTerm_keypad_local] : NULL; if (keypad_local) { @@ -341,18 +328,12 @@ static int load_terminfo(TermKeyTI *ti) ti->stop_string = NULL; } - if (unibi) { - unibi_destroy(unibi); - } - - ti->unibi = NULL; - ti->root = compress_trie(ti->root); return 1; } -void *new_driver_ti(TermKey *tk, const char *term) +void *new_driver_ti(TermKey *tk, TerminfoEntry *term) { TermKeyTI *ti = xmalloc(sizeof *ti); @@ -361,13 +342,9 @@ void *new_driver_ti(TermKey *tk, const char *term) ti->start_string = NULL; ti->stop_string = NULL; - ti->unibi = unibi_from_term(term); - int saved_errno = errno; - if (!ti->unibi && saved_errno != ENOENT) { - xfree(ti); - return NULL; - } - // ti->unibi may be NULL if errno == ENOENT. That means the terminal wasn't + ti->ti = term; + + // ti->ti may be NULL because reasons. That means the terminal wasn't // known. Lets keep going because if we get getstr hook that might invent // new strings for us @@ -472,10 +449,6 @@ void free_driver_ti(void *info) xfree(ti->stop_string); } - if (ti->unibi) { - unibi_destroy(ti->unibi); - } - xfree(ti); } diff --git a/src/nvim/tui/termkey/termkey-internal.h b/src/nvim/tui/termkey/termkey-internal.h index 97fae939c5..2e2f8d70de 100644 --- a/src/nvim/tui/termkey/termkey-internal.h +++ b/src/nvim/tui/termkey/termkey-internal.h @@ -20,7 +20,7 @@ typedef SSIZE_T ssize_t; struct TermKeyDriver { const char *name; - void *(*new_driver)(TermKey *tk, const char *term); + void *(*new_driver)(TermKey *tk, TerminfoEntry *term); void (*free_driver)(void *info); int (*start_driver)(TermKey *tk, void *info); int (*stop_driver)(TermKey *tk, void *info); diff --git a/src/nvim/tui/termkey/termkey.c b/src/nvim/tui/termkey/termkey.c index 7309a2548f..77b65bc075 100644 --- a/src/nvim/tui/termkey/termkey.c +++ b/src/nvim/tui/termkey/termkey.c @@ -357,7 +357,7 @@ static TermKey *termkey_alloc(void) return tk; } -static int termkey_init(TermKey *tk, const char *term) +static int termkey_init(TermKey *tk, TerminfoEntry *term) { tk->buffer = xmalloc(tk->buffsize); tk->keynames = xmalloc(sizeof(tk->keynames[0]) * (size_t)tk->nkeynames); @@ -433,7 +433,7 @@ abort_free_keynames: return 0; } -TermKey *termkey_new_abstract(const char *term, int flags) +TermKey *termkey_new_abstract(TerminfoEntry *term, int flags) { TermKey *tk = termkey_alloc(); if (!tk) { diff --git a/src/nvim/tui/termkey/termkey_defs.h b/src/nvim/tui/termkey/termkey_defs.h index a0b3e13439..853d1cdd95 100644 --- a/src/nvim/tui/termkey/termkey_defs.h +++ b/src/nvim/tui/termkey/termkey_defs.h @@ -6,6 +6,7 @@ #include #include "nvim/event/defs.h" +#include "nvim/tui/terminfo_defs.h" #include "nvim/tui/tui_defs.h" #include "nvim/types_defs.h" @@ -201,7 +202,7 @@ typedef enum { typedef struct { TermKey *tk; - unibi_term *unibi; // only valid until first 'start' call + TerminfoEntry *ti; // not used after first 'start' call struct trie_node *root; diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index c377e860b9..f457fc15c5 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -171,7 +171,6 @@ void tui_start(TUIData **tui_p, int *width, int *height, char **term, bool *rgb) kv_push(tui->attrs, HLATTRS_INIT); tui->input.tk_ti_hook_fn = tui_tk_ti_getstr; - tinput_init(&tui->input, &main_loop); ugrid_init(&tui->grid); tui_terminal_start(tui); @@ -597,6 +596,7 @@ static void tui_terminal_start(TUIData *tui) { tui->print_attr_id = -1; terminfo_start(tui); + tinput_init(&tui->input, &main_loop, &tui->ti); tui_guess_size(tui); tinput_start(&tui->input); } diff --git a/test/unit/termkey_spec.lua b/test/unit/termkey_spec.lua index 0381cfd15a..ec21390782 100644 --- a/test/unit/termkey_spec.lua +++ b/test/unit/termkey_spec.lua @@ -69,7 +69,7 @@ local termkey = t.cimport( describe('termkey', function() itp('01base', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) t.neq(tk, nil) t.eq(termkey.termkey_get_buffer_size(tk), 256) @@ -85,7 +85,7 @@ describe('termkey', function() end) itp('02getkey', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey t.eq(termkey.termkey_get_buffer_remaining(tk), 256) -- buffer free initially 256 @@ -159,7 +159,7 @@ describe('termkey', function() end) itp('03utf8', function() - local tk = termkey.termkey_new_abstract('vt100', termkey.TERMKEY_FLAG_UTF8) + local tk = termkey.termkey_new_abstract(nil, termkey.TERMKEY_FLAG_UTF8) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey termkey.termkey_push_bytes(tk, 'a', 1) @@ -291,7 +291,7 @@ describe('termkey', function() end) itp('04flags', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey termkey.termkey_push_bytes(tk, ' ', 1) @@ -316,7 +316,7 @@ describe('termkey', function() end) itp('06buffer', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey t.eq(termkey.termkey_get_buffer_remaining(tk), 256) -- buffer free initially 256 @@ -347,7 +347,7 @@ describe('termkey', function() end itp('10keyname', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local sym = termkey_keyname2sym(tk, 'SomeUnknownKey') t.eq(sym, termkey.TERMKEY_SYM_UNKNOWN) -- keyname2sym SomeUnknownKey @@ -374,7 +374,7 @@ describe('termkey', function() end) itp('11strfkey', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) ---@type TermKeyKey local key = t.ffi.new( 'TermKeyKey', @@ -598,7 +598,7 @@ describe('termkey', function() return key1.modifiers - key2.modifiers end - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) ---@type TermKeyKey local key1 = t.ffi.new('TermKeyKey', { type = termkey.TERMKEY_TYPE_UNICODE, @@ -656,7 +656,7 @@ describe('termkey', function() end) itp('30mouse', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey', { type = -1 }) ---@type TermKeyKey local ev = t.ffi.new('TermKeyMouseEvent[1]') local button = t.ffi.new('int[1]') @@ -809,7 +809,7 @@ describe('termkey', function() end) itp('31position', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey local line = t.ffi.new('int[1]') local col = t.ffi.new('int[1]') @@ -839,7 +839,7 @@ describe('termkey', function() end) itp('32modereport', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey local initial = t.ffi.new('int[1]') local mode = t.ffi.new('int[1]') @@ -879,7 +879,7 @@ describe('termkey', function() end) itp('38csi', function() - local tk = termkey.termkey_new_abstract('vt100', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey local args = t.ffi.new('TermKeyCsiParam[16]') local nargs = t.ffi.new('size_t[1]') @@ -916,7 +916,7 @@ describe('termkey', function() end) itp('39dcs', function() - local tk = termkey.termkey_new_abstract('xterm', 0) + local tk = termkey.termkey_new_abstract(nil, 0) local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey -- 7bit DCS