summaryrefslogtreecommitdiff
path: root/examples/dte/show.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/dte/show.c')
-rw-r--r--examples/dte/show.c558
1 files changed, 0 insertions, 558 deletions
diff --git a/examples/dte/show.c b/examples/dte/show.c
deleted file mode 100644
index 69a6acf..0000000
--- a/examples/dte/show.c
+++ /dev/null
@@ -1,558 +0,0 @@
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include "show.h"
-#include "bind.h"
-#include "buffer.h"
-#include "change.h"
-#include "cmdline.h"
-#include "command/alias.h"
-#include "command/macro.h"
-#include "command/serialize.h"
-#include "commands.h"
-#include "compiler.h"
-#include "completion.h"
-#include "config.h"
-#include "edit.h"
-#include "encoding.h"
-#include "error.h"
-#include "file-option.h"
-#include "filetype.h"
-#include "frame.h"
-#include "msg.h"
-#include "options.h"
-#include "syntax/color.h"
-#include "terminal/cursor.h"
-#include "terminal/key.h"
-#include "terminal/style.h"
-#include "util/array.h"
-#include "util/bsearch.h"
-#include "util/debug.h"
-#include "util/intern.h"
-#include "util/str-util.h"
-#include "util/unicode.h"
-#include "util/xmalloc.h"
-#include "util/xsnprintf.h"
-#include "view.h"
-#include "window.h"
-
-extern char **environ;
-
-typedef enum {
- DTERC = 0x1, // Use "dte" filetype (and syntax highlighter)
- LASTLINE = 0x2, // Move cursor to last line (e.g. most recent history entry)
- MSGLINE = 0x4, // Move cursor to line containing current message
-} ShowHandlerFlags;
-
-typedef struct {
- const char name[11];
- uint8_t flags; // ShowHandlerFlags
- String (*dump)(EditorState *e);
- bool (*show)(EditorState *e, const char *name, bool cmdline);
- void (*complete_arg)(EditorState *e, PointerArray *a, const char *prefix);
-} ShowHandler;
-
-static void open_temporary_buffer (
- EditorState *e,
- const char *text,
- size_t text_len,
- const char *cmd,
- const char *cmd_arg,
- ShowHandlerFlags flags
-) {
- View *view = window_open_new_file(e->window);
- Buffer *buffer = view->buffer;
- buffer->temporary = true;
- do_insert(view, text, text_len);
- set_display_filename(buffer, xasprintf("(%s %s)", cmd, cmd_arg));
- buffer_set_encoding(buffer, encoding_from_type(UTF8), e->options.utf8_bom);
-
- if (flags & LASTLINE) {
- block_iter_eof(&view->cursor);
- block_iter_prev_line(&view->cursor);
- } else if ((flags & MSGLINE) && e->messages.array.count > 0) {
- block_iter_goto_line(&view->cursor, e->messages.pos);
- }
-
- if (flags & DTERC) {
- buffer->options.filetype = str_intern("dte");
- set_file_options(e, buffer);
- buffer_update_syntax(e, buffer);
- }
-}
-
-static bool show_normal_alias(EditorState *e, const char *alias_name, bool cflag)
-{
- const char *cmd_str = find_alias(&e->aliases, alias_name);
- if (!cmd_str) {
- if (find_normal_command(alias_name)) {
- info_msg("%s is a built-in command, not an alias", alias_name);
- } else {
- info_msg("%s is not a known alias", alias_name);
- }
- return true;
- }
-
- if (cflag) {
- set_input_mode(e, INPUT_COMMAND);
- cmdline_set_text(&e->cmdline, cmd_str);
- } else {
- info_msg("%s is aliased to: %s", alias_name, cmd_str);
- }
-
- return true;
-}
-
-static bool show_binding(EditorState *e, const char *keystr, bool cflag)
-{
- KeyCode key;
- if (!parse_key_string(&key, keystr)) {
- return error_msg("invalid key string: %s", keystr);
- }
-
- // Use canonical key string in printed messages
- char buf[KEYCODE_STR_MAX];
- size_t len = keycode_to_string(key, buf);
- BUG_ON(len == 0);
- keystr = buf;
-
- if (u_is_unicode(key)) {
- return error_msg("%s is not a bindable key", keystr);
- }
-
- const CachedCommand *b = lookup_binding(&e->modes[INPUT_NORMAL].key_bindings, key);
- if (!b) {
- info_msg("%s is not bound to a command", keystr);
- return true;
- }
-
- if (cflag) {
- set_input_mode(e, INPUT_COMMAND);
- cmdline_set_text(&e->cmdline, b->cmd_str);
- } else {
- info_msg("%s is bound to: %s", keystr, b->cmd_str);
- }
-
- return true;
-}
-
-static bool show_color(EditorState *e, const char *color_name, bool cflag)
-{
- const TermColor *hl = find_color(&e->colors, color_name);
- if (!hl) {
- info_msg("no color entry with name '%s'", color_name);
- return true;
- }
-
- if (cflag) {
- CommandLine *c = &e->cmdline;
- set_input_mode(e, INPUT_COMMAND);
- cmdline_clear(c);
- string_append_hl_color(&c->buf, color_name, hl);
- c->pos = c->buf.len;
- } else {
- const char *color_str = term_color_to_string(hl);
- info_msg("color '%s' is set to: %s", color_name, color_str);
- }
-
- return true;
-}
-
-static bool show_cursor(EditorState *e, const char *mode_str, bool cflag)
-{
- CursorInputMode mode = cursor_mode_from_str(mode_str);
- if (mode >= NR_CURSOR_MODES) {
- return error_msg("no cursor entry for '%s'", mode_str);
- }
-
- TermCursorStyle style = e->cursor_styles[mode];
- const char *type = cursor_type_to_str(style.type);
- const char *color = cursor_color_to_str(style.color);
- if (cflag) {
- char buf[64];
- xsnprintf(buf, sizeof buf, "cursor %s %s %s", mode_str, type, color);
- set_input_mode(e, INPUT_COMMAND);
- cmdline_set_text(&e->cmdline, buf);
- } else {
- info_msg("cursor '%s' is set to: %s %s", mode_str, type, color);
- }
-
- return true;
-}
-
-static bool show_env(EditorState *e, const char *name, bool cflag)
-{
- const char *value = getenv(name);
- if (!value) {
- info_msg("no environment variable with name '%s'", name);
- return true;
- }
-
- if (cflag) {
- set_input_mode(e, INPUT_COMMAND);
- cmdline_set_text(&e->cmdline, value);
- } else {
- info_msg("$%s is set to: %s", name, value);
- }
-
- return true;
-}
-
-static String dump_env(EditorState* UNUSED_ARG(e))
-{
- String buf = string_new(4096);
- for (size_t i = 0; environ[i]; i++) {
- string_append_cstring(&buf, environ[i]);
- string_append_byte(&buf, '\n');
- }
- return buf;
-}
-
-static String dump_setenv(EditorState* UNUSED_ARG(e))
-{
- String buf = string_new(4096);
- for (size_t i = 0; environ[i]; i++) {
- const char *str = environ[i];
- const char *delim = strchr(str, '=');
- if (unlikely(!delim || delim == str)) {
- continue;
- }
- string_append_literal(&buf, "setenv ");
- if (unlikely(str[0] == '-' || delim[1] == '-')) {
- string_append_literal(&buf, "-- ");
- }
- const StringView name = string_view(str, delim - str);
- string_append_escaped_arg_sv(&buf, name, true);
- string_append_byte(&buf, ' ');
- string_append_escaped_arg(&buf, delim + 1, true);
- string_append_byte(&buf, '\n');
- }
- return buf;
-}
-
-static bool show_builtin(EditorState *e, const char *name, bool cflag)
-{
- const BuiltinConfig *cfg = get_builtin_config(name);
- if (!cfg) {
- return error_msg("no built-in config with name '%s'", name);
- }
-
- const StringView sv = cfg->text;
- if (cflag) {
- buffer_insert_bytes(e->view, sv.data, sv.length);
- } else {
- open_temporary_buffer(e, sv.data, sv.length, "builtin", name, DTERC);
- }
-
- return true;
-}
-
-static bool show_compiler(EditorState *e, const char *name, bool cflag)
-{
- const Compiler *compiler = find_compiler(&e->compilers, name);
- if (!compiler) {
- info_msg("no errorfmt entry found for '%s'", name);
- return true;
- }
-
- String str = string_new(512);
- dump_compiler(compiler, name, &str);
- if (cflag) {
- buffer_insert_bytes(e->view, str.buffer, str.len);
- } else {
- open_temporary_buffer(e, str.buffer, str.len, "errorfmt", name, DTERC);
- }
-
- string_free(&str);
- return true;
-}
-
-static bool show_option(EditorState *e, const char *name, bool cflag)
-{
- const char *value = get_option_value_string(e, name);
- if (!value) {
- return error_msg("invalid option name: %s", name);
- }
-
- if (cflag) {
- set_input_mode(e, INPUT_COMMAND);
- cmdline_set_text(&e->cmdline, value);
- } else {
- info_msg("%s is set to: %s", name, value);
- }
-
- return true;
-}
-
-static void collect_all_options(EditorState* UNUSED_ARG(e), PointerArray *a, const char *prefix)
-{
- collect_options(a, prefix, false, false);
-}
-
-static void do_collect_cursor_modes(EditorState* UNUSED_ARG(e), PointerArray *a, const char *prefix)
-{
- collect_cursor_modes(a, prefix);
-}
-
-static void do_collect_builtin_configs(EditorState* UNUSED_ARG(e), PointerArray *a, const char *prefix)
-{
- collect_builtin_configs(a, prefix);
-}
-
-static void do_collect_builtin_includes(EditorState* UNUSED_ARG(e), PointerArray *a, const char *prefix)
-{
- collect_builtin_includes(a, prefix);
-}
-
-static bool show_wsplit(EditorState *e, const char *name, bool cflag)
-{
- if (!streq(name, "this")) {
- return error_msg("invalid window: %s", name);
- }
-
- const Window *w = e->window;
- char buf[(4 * DECIMAL_STR_MAX(w->x)) + 4];
- xsnprintf(buf, sizeof buf, "%d,%d %dx%d", w->x, w->y, w->w, w->h);
-
- if (cflag) {
- set_input_mode(e, INPUT_COMMAND);
- cmdline_set_text(&e->cmdline, buf);
- } else {
- info_msg("current window dimensions: %s", buf);
- }
-
- return true;
-}
-
-static String do_history_dump(const History *history)
-{
- const size_t nr_entries = history->entries.count;
- const size_t size = round_size_to_next_multiple(16 * nr_entries, 4096);
- String buf = string_new(size);
- size_t n = 0;
- for (HistoryEntry *e = history->first; e; e = e->next, n++) {
- string_append_cstring(&buf, e->text);
- string_append_byte(&buf, '\n');
- }
- BUG_ON(n != nr_entries);
- return buf;
-}
-
-String dump_command_history(EditorState *e)
-{
- return do_history_dump(&e->command_history);
-}
-
-String dump_search_history(EditorState *e)
-{
- return do_history_dump(&e->search_history);
-}
-
-typedef struct {
- const char *name;
- const char *value;
-} CommandAlias;
-
-static int alias_cmp(const void *ap, const void *bp)
-{
- const CommandAlias *a = ap;
- const CommandAlias *b = bp;
- return strcmp(a->name, b->name);
-}
-
-String dump_normal_aliases(EditorState *e)
-{
- const size_t count = e->aliases.count;
- if (unlikely(count == 0)) {
- return string_new(0);
- }
-
- // Clone the contents of the HashMap as an array of name/value pairs
- CommandAlias *array = xnew(CommandAlias, count);
- size_t n = 0;
- for (HashMapIter it = hashmap_iter(&e->aliases); hashmap_next(&it); ) {
- array[n++] = (CommandAlias) {
- .name = it.entry->key,
- .value = it.entry->value,
- };
- }
-
- // Sort the array
- BUG_ON(n != count);
- qsort(array, count, sizeof(array[0]), alias_cmp);
-
- // Serialize the aliases in sorted order
- String buf = string_new(4096);
- for (size_t i = 0; i < count; i++) {
- const char *name = array[i].name;
- string_append_literal(&buf, "alias ");
- if (unlikely(name[0] == '-')) {
- string_append_literal(&buf, "-- ");
- }
- string_append_escaped_arg(&buf, name, true);
- string_append_byte(&buf, ' ');
- string_append_escaped_arg(&buf, array[i].value, true);
- string_append_byte(&buf, '\n');
- }
-
- free(array);
- return buf;
-}
-
-String dump_all_bindings(EditorState *e)
-{
- static const char flags[][4] = {
- [INPUT_NORMAL] = "",
- [INPUT_COMMAND] = "-c ",
- [INPUT_SEARCH] = "-s ",
- };
-
- static_assert(ARRAYLEN(flags) == ARRAYLEN(e->modes));
- String buf = string_new(4096);
- for (InputMode i = 0, n = ARRAYLEN(e->modes); i < n; i++) {
- const IntMap *bindings = &e->modes[i].key_bindings;
- if (dump_bindings(bindings, flags[i], &buf) && i != n - 1) {
- string_append_byte(&buf, '\n');
- }
- }
- return buf;
-}
-
-String dump_frames(EditorState *e)
-{
- String str = string_new(4096);
- dump_frame(e->root_frame, 0, &str);
- return str;
-}
-
-String dump_compilers(EditorState *e)
-{
- String buf = string_new(4096);
- for (HashMapIter it = hashmap_iter(&e->compilers); hashmap_next(&it); ) {
- const char *name = it.entry->key;
- const Compiler *c = it.entry->value;
- dump_compiler(c, name, &buf);
- string_append_byte(&buf, '\n');
- }
- return buf;
-}
-
-String dump_cursors(EditorState *e)
-{
- String buf = string_new(128);
- for (CursorInputMode m = 0; m < ARRAYLEN(e->cursor_styles); m++) {
- const TermCursorStyle *style = &e->cursor_styles[m];
- string_append_literal(&buf, "cursor ");
- string_append_cstring(&buf, cursor_mode_to_str(m));
- string_append_byte(&buf, ' ');
- string_append_cstring(&buf, cursor_type_to_str(style->type));
- string_append_byte(&buf, ' ');
- string_append_cstring(&buf, cursor_color_to_str(style->color));
- string_append_byte(&buf, '\n');
- }
- return buf;
-}
-
-// Dump option values only
-String do_dump_options(EditorState *e)
-{
- return dump_options(&e->options, &e->buffer->options);
-}
-
-// Dump option values and FileOption entries
-String dump_options_and_fileopts(EditorState *e)
-{
- String str = do_dump_options(e);
- string_append_literal(&str, "\n\n");
- dump_file_options(&e->file_options, &str);
- return str;
-}
-
-String do_dump_builtin_configs(EditorState* UNUSED_ARG(e))
-{
- return dump_builtin_configs();
-}
-
-String do_dump_hl_colors(EditorState *e)
-{
- return dump_hl_colors(&e->colors);
-}
-
-String do_dump_filetypes(EditorState *e)
-{
- return dump_filetypes(&e->filetypes);
-}
-
-static String do_dump_messages(EditorState *e)
-{
- return dump_messages(&e->messages);
-}
-
-static String do_dump_macro(EditorState *e)
-{
- return dump_macro(&e->macro);
-}
-
-static String do_dump_buffer(EditorState *e)
-{
- return dump_buffer(e->buffer);
-}
-
-static const ShowHandler show_handlers[] = {
- {"alias", DTERC, dump_normal_aliases, show_normal_alias, collect_normal_aliases},
- {"bind", DTERC, dump_all_bindings, show_binding, collect_bound_normal_keys},
- {"buffer", 0, do_dump_buffer, NULL, NULL},
- {"builtin", 0, do_dump_builtin_configs, show_builtin, do_collect_builtin_configs},
- {"color", DTERC, do_dump_hl_colors, show_color, collect_hl_colors},
- {"command", DTERC | LASTLINE, dump_command_history, NULL, NULL},
- {"cursor", DTERC, dump_cursors, show_cursor, do_collect_cursor_modes},
- {"env", 0, dump_env, show_env, collect_env},
- {"errorfmt", DTERC, dump_compilers, show_compiler, collect_compilers},
- {"ft", DTERC, do_dump_filetypes, NULL, NULL},
- {"hi", DTERC, do_dump_hl_colors, show_color, collect_hl_colors},
- {"include", 0, do_dump_builtin_configs, show_builtin, do_collect_builtin_includes},
- {"macro", DTERC, do_dump_macro, NULL, NULL},
- {"msg", MSGLINE, do_dump_messages, NULL, NULL},
- {"option", DTERC, dump_options_and_fileopts, show_option, collect_all_options},
- {"search", LASTLINE, dump_search_history, NULL, NULL},
- {"set", DTERC, do_dump_options, show_option, collect_all_options},
- {"setenv", DTERC, dump_setenv, show_env, collect_env},
- {"wsplit", 0, dump_frames, show_wsplit, NULL},
-};
-
-UNITTEST {
- CHECK_BSEARCH_ARRAY(show_handlers, name, strcmp);
-}
-
-bool show(EditorState *e, const char *type, const char *key, bool cflag)
-{
- const ShowHandler *handler = BSEARCH(type, show_handlers, vstrcmp);
- if (!handler) {
- return error_msg("invalid argument: '%s'", type);
- }
-
- if (key) {
- if (!handler->show) {
- return error_msg("'show %s' doesn't take extra arguments", type);
- }
- return handler->show(e, key, cflag);
- }
-
- String str = handler->dump(e);
- open_temporary_buffer(e, str.buffer, str.len, "show", type, handler->flags);
- string_free(&str);
- return true;
-}
-
-void collect_show_subcommands(PointerArray *a, const char *prefix)
-{
- COLLECT_STRING_FIELDS(show_handlers, name, a, prefix);
-}
-
-void collect_show_subcommand_args(EditorState *e, PointerArray *a, const char *name, const char *arg_prefix)
-{
- const ShowHandler *handler = BSEARCH(name, show_handlers, vstrcmp);
- if (handler && handler->complete_arg) {
- handler->complete_arg(e, a, arg_prefix);
- }
-}