int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s CAPNAME [PARAM...]\n", argv[0]); return 2; } unibi_term *t = unibi_from_env(); if (!t) { fprintf(stderr, "%s: %s: %s\n", argv[0], getenv("TERM"), strerror(errno)); return 3; } if (strcmp(argv[1], "longname") == 0) { printf("%s\n", unibi_get_name(t)); return 0; } for (enum unibi_boolean i = unibi_boolean_begin_ + 1; i < unibi_boolean_end_; ++i) { if ( strcmp(argv[1], unibi_name_bool(i)) == 0 || strcmp(argv[1], unibi_short_name_bool(i)) == 0 ) { if (unibi_get_bool(t, i)) { return 0; } else { return 1; } } } for (enum unibi_numeric i = unibi_numeric_begin_ + 1; i < unibi_numeric_end_; ++i) { if ( strcmp(argv[1], unibi_name_num(i)) == 0 || strcmp(argv[1], unibi_short_name_num(i)) == 0 ) { printf("%hd\n", unibi_get_num(t, i)); return 0; } } for (enum unibi_string i = unibi_string_begin_ + 1; i < unibi_string_end_; ++i) { if ( strcmp(argv[1], unibi_name_str(i)) == 0 || strcmp(argv[1], unibi_short_name_str(i)) == 0 ) { const char *fmt = unibi_get_str(t, i); if (!fmt) { return 1; } if (argc < 3) { fputs(fmt, stdout); return 0; } unibi_var_t vars[9] = {{0}}; switch (i) { #define REQ(N) do { if (argc - 2 < (N)) { fprintf(stderr, "%s: %s: missing argument\n", argv[0], argv[1]); return 4; } } while (0) case unibi_dial_phone: case unibi_quick_dial: REQ(1); vars[0].p = argv[2]; break; case unibi_pkey_key: case unibi_pkey_local: case unibi_pkey_xmit: case unibi_plab_norm: REQ(2); vars[0].i = atoi(argv[2]); vars[1].p = argv[3]; break; case unibi_pkey_plab: REQ(3); vars[0].i = atoi(argv[2]); vars[1].p = argv[3]; vars[2].p = argv[4]; break; default: { for (int k = 0; k + 2 < argc; ++k) { vars[k].i = atoi(argv[k + 2]); } break; #undef REQ } } char buf[1024]; size_t r = unibi_run(fmt, vars, buf, sizeof buf); fwrite(buf, 1, r, stdout); return 0; } } fprintf(stderr, "%s: %s: unknown terminfo capability\n", argv[0], argv[1]); return 5; }
/// Dumps termcap info to the messages area. /// Serves a similar purpose as Vim `:set termcap` (removed in Nvim). /// /// @note adapted from unibilium unibi-dump.c void terminfo_info_msg(const unibi_term *const ut) { if (exiting) { return; } msg_puts_title("\n\n--- Terminal info --- {{{\n"); char *term; get_tty_option("term", &term); msg_printf_attr(0, "&term: %s\n", term); msg_printf_attr(0, "Description: %s\n", unibi_get_name(ut)); const char **a = unibi_get_aliases(ut); if (*a) { msg_puts("Aliases: "); do { msg_printf_attr(0, "%s%s\n", *a, a[1] ? " | " : ""); a++; } while (*a); } msg_puts("Boolean capabilities:\n"); for (enum unibi_boolean i = unibi_boolean_begin_ + 1; i < unibi_boolean_end_; i++) { msg_printf_attr(0, " %-25s %-10s = %s\n", unibi_name_bool(i), unibi_short_name_bool(i), unibi_get_bool(ut, i) ? "true" : "false"); } msg_puts("Numeric capabilities:\n"); for (enum unibi_numeric i = unibi_numeric_begin_ + 1; i < unibi_numeric_end_; i++) { int n = unibi_get_num(ut, i); // -1 means "empty" msg_printf_attr(0, " %-25s %-10s = %d\n", unibi_name_num(i), unibi_short_name_num(i), n); } msg_puts("String capabilities:\n"); for (enum unibi_string i = unibi_string_begin_ + 1; i < unibi_string_end_; i++) { const char *s = unibi_get_str(ut, i); if (s) { msg_printf_attr(0, " %-25s %-10s = ", unibi_name_str(i), unibi_short_name_str(i)); // Most of these strings will contain escape sequences. msg_outtrans_special((char_u *)s, false); msg_putchar('\n'); } } if (unibi_count_ext_bool(ut)) { msg_puts("Extended boolean capabilities:\n"); for (size_t i = 0; i < unibi_count_ext_bool(ut); i++) { msg_printf_attr(0, " %-25s = %s\n", unibi_get_ext_bool_name(ut, i), unibi_get_ext_bool(ut, i) ? "true" : "false"); } } if (unibi_count_ext_num(ut)) { msg_puts("Extended numeric capabilities:\n"); for (size_t i = 0; i < unibi_count_ext_num(ut); i++) { msg_printf_attr(0, " %-25s = %d\n", unibi_get_ext_num_name(ut, i), unibi_get_ext_num(ut, i)); } } if (unibi_count_ext_str(ut)) { msg_puts("Extended string capabilities:\n"); for (size_t i = 0; i < unibi_count_ext_str(ut); i++) { msg_printf_attr(0, " %-25s = ", unibi_get_ext_str_name(ut, i)); msg_outtrans_special((char_u *)unibi_get_ext_str(ut, i), false); msg_putchar('\n'); } } msg_puts("}}}\n"); xfree(term); }