aboutsummaryrefslogtreecommitdiff
path: root/config/ecex_api_completion_plugin.c
diff options
context:
space:
mode:
authorDavid Moc <personal@cdatgoose.org>2026-06-02 13:50:21 +0200
committerDavid Moc <personal@cdatgoose.org>2026-06-02 13:50:21 +0200
commita15cb041654ae307add0b998b526c87c3f42bf5f (patch)
tree225bb4b70e9fa05aa5f4d2722a1a9cf5fc6fca7f /config/ecex_api_completion_plugin.c
parent6aeaa171dc1ca43392f53cbd02097f76e1b1c5a0 (diff)
Add plugin hooks and mode plugins
Diffstat (limited to 'config/ecex_api_completion_plugin.c')
-rw-r--r--config/ecex_api_completion_plugin.c806
1 files changed, 806 insertions, 0 deletions
diff --git a/config/ecex_api_completion_plugin.c b/config/ecex_api_completion_plugin.c
new file mode 100644
index 0000000..dae5745
--- /dev/null
+++ b/config/ecex_api_completion_plugin.c
@@ -0,0 +1,806 @@
+#include "ecex.h"
+
+#include <string.h>
+
+#define ECEX_API_PLUGIN_ID "ecex-mode"
+#define ECEX_API_SYMBOLS_PROVIDER "ecex-mode-symbols"
+#define ECEX_API_ED_FIELDS_PROVIDER "ecex-mode-ed-fields"
+#define ECEX_API_SLOT_ENABLED "enabled"
+#if defined(__GNUC__) || defined(__clang__)
+#define ECEX_API_UNUSED __attribute__((unused))
+#else
+#define ECEX_API_UNUSED
+#endif
+#define ECEX_API_SYMBOL_WORDS \
+ "ecex_t\n" \
+ "buffer_t\n" \
+ "ecex_window_t\n" \
+ "ecex_draw_context_t\n" \
+ "ecex_plugin_t\n" \
+ "ecex_plugin_runtime_t\n" \
+ "ecex_command_fn\n" \
+ "ecex_completion_provider_fn\n" \
+ "ecex_file_handler_fn\n" \
+ "ECEX_CONFIG_BEGIN\n" \
+ "ECEX_CONFIG_END\n" \
+ "ECEX_PLUGIN_BEGIN\n" \
+ "ECEX_PLUGIN_END\n" \
+ "ECEX_CONFIG_TRY\n" \
+ "ECEX_CONFIG_COMMAND\n" \
+ "ECEX_CONFIG_BIND\n" \
+ "ECEX_CONFIG_MODE\n" \
+ "ECEX_CONFIG_MODE_BIND\n" \
+ "ECEX_CONFIG_INCLUDE\n" \
+ "ECEX_RGB8\n" \
+ "ECEX_ARRAY_COUNT\n" \
+ "ecex_new\n" \
+ "ecex_free\n" \
+ "ecex_config_alloc\n" \
+ "ecex_config_calloc\n" \
+ "ecex_config_free\n" \
+ "ecex_time_seconds\n" \
+ "ecex_log\n" \
+ "ecex_logf\n" \
+ "ecex_log_group_begin\n" \
+ "ecex_log_group_end\n" \
+ "ecex_log_int\n" \
+ "ecex_log_double\n" \
+ "ecex_log_ptr\n" \
+ "ecex_log_flush\n" \
+ "ecex_mem_zero\n" \
+ "ecex_i32_get\n" \
+ "ecex_i32_set\n" \
+ "ecex_prng_next_bounded\n" \
+ "ecex_random_bounded\n" \
+ "ecex_plugin_register\n" \
+ "ecex_plugin_require\n" \
+ "ecex_plugin_find\n" \
+ "ecex_plugin_id\n" \
+ "ecex_plugin_slot_alloc\n" \
+ "ecex_plugin_slot_get\n" \
+ "ecex_plugin_slot_free\n" \
+ "ecex_plugin_slot_set_export_flags\n" \
+ "ecex_plugin_slot_read_exported\n" \
+ "ecex_plugin_slot_i32_get_scalar\n" \
+ "ecex_plugin_slot_i32_get\n" \
+ "ecex_plugin_slot_i32_set\n" \
+ "ecex_plugin_slot_i32_get_2d\n" \
+ "ecex_plugin_slot_i32_set_2d\n" \
+ "ecex_plugin_slot_i32_set_scalar\n" \
+ "ecex_plugin_object_alloc\n" \
+ "ecex_plugin_object_calloc\n" \
+ "ecex_plugin_object_free\n" \
+ "ecex_plugin_object_valid\n" \
+ "ecex_plugin_object_i32_get\n" \
+ "ecex_plugin_object_i32_set\n" \
+ "ecex_plugin_object_ptr_get\n" \
+ "ecex_plugin_object_ptr_set\n" \
+ "ecex_plugin_text_set\n" \
+ "ecex_plugin_text_set_from_buffer_title\n" \
+ "ecex_plugin_text_free\n" \
+ "ecex_plugin_text_free_all\n" \
+ "ecex_plugin_text_get_drawable\n" \
+ "ecex_plugin_file_handler_register\n" \
+ "ecex_plugin_file_handlers_run\n" \
+ "ecex_buffer_text_len\n" \
+ "ecex_buffer_scroll_line_index\n" \
+ "ecex_buffer_line_count_int\n" \
+ "ecex_buffer_line_copy_text\n" \
+ "ecex_run_plugin_file_handlers\n" \
+ "ecex_reserve_buffers\n" \
+ "ecex_add_buffer\n" \
+ "ecex_create_buffer\n" \
+ "ecex_find_buffer\n" \
+ "ecex_switch_buffer\n" \
+ "ecex_current_buffer\n" \
+ "ecex_other_buffer\n" \
+ "ecex_current_window\n" \
+ "ecex_window_count\n" \
+ "ecex_sync_current_buffer\n" \
+ "ecex_split_window_vertically\n" \
+ "ecex_split_window_horizontally\n" \
+ "ecex_other_window\n" \
+ "ecex_previous_window\n" \
+ "ecex_delete_window\n" \
+ "ecex_delete_other_windows\n" \
+ "ecex_balance_windows\n" \
+ "ecex_next_buffer\n" \
+ "ecex_previous_buffer\n" \
+ "ecex_kill_buffer\n" \
+ "ecex_kill_buffer_force\n" \
+ "ecex_has_modified_buffers\n" \
+ "ecex_validate_bindings\n" \
+ "ecex_keep_jit_module\n" \
+ "ecex_set_config_path\n" \
+ "ecex_config_path\n" \
+ "ecex_reload_config\n" \
+ "ecex_config_register_commands\n" \
+ "ecex_config_bind_keys\n" \
+ "ecex_config_bind_mode_keys\n" \
+ "ecex_config_define_modes\n" \
+ "ecex_apply_theme\n" \
+ "ecex_register_command\n" \
+ "ecex_execute_command\n" \
+ "ecex_add_command_hook\n" \
+ "ecex_remove_command_hook\n" \
+ "ecex_add_prefix_hook\n" \
+ "ecex_remove_prefix_hook\n" \
+ "ecex_notify_prefix_hooks\n" \
+ "ecex_add_buffer_hook\n" \
+ "ecex_remove_buffer_hook\n" \
+ "ecex_notify_buffer_hooks\n" \
+ "ecex_message\n" \
+ "ecex_dependency_available\n" \
+ "ecex_plugin_require_dependency\n" \
+ "ecex_add_completion_provider\n" \
+ "ecex_add_word_completion_provider\n" \
+ "ecex_define_word_completion_provider\n" \
+ "ecex_completion_provider_add_word\n" \
+ "ecex_completion_provider_add_words\n" \
+ "ecex_completion_provider_set_detail\n" \
+ "ecex_add_clangd_completion_provider\n" \
+ "ecex_remove_completion_provider\n" \
+ "ecex_buffer_identifier_prefix\n" \
+ "ecex_complete_at_point\n" \
+ "ecex_set_clipboard_callbacks\n" \
+ "ecex_clipboard_get\n" \
+ "ecex_clipboard_set\n" \
+ "ecex_bind_key\n" \
+ "ecex_lookup_key\n" \
+ "ecex_define_major_mode\n" \
+ "ecex_major_mode_by_name\n" \
+ "ecex_major_mode_name\n" \
+ "ecex_buffer_set_major_mode\n" \
+ "ecex_buffer_set_major_mode_by_name\n" \
+ "ecex_buffer_major_mode_name\n" \
+ "ecex_bind_mode_key\n" \
+ "ecex_lookup_key_for_buffer\n" \
+ "ecex_key_sequence_has_prefix_for_buffer\n" \
+ "ecex_describe_key_prefix\n" \
+ "ecex_auto_set_major_mode\n" \
+ "ecex_list_commands\n" \
+ "ecex_list_buffers\n" \
+ "ecex_create_interactive_buffer\n" \
+ "ecex_interactive_append_line\n" \
+ "ecex_interactive_activate_current_line\n" \
+ "ecex_buffer_set_renderer\n" \
+ "ecex_buffer_clear_renderer\n" \
+ "ecex_buffer_has_renderer\n" \
+ "ecex_buffer_renderer_userdata\n" \
+ "ecex_buffer_set_mouse_handler\n" \
+ "ecex_buffer_clear_mouse_handler\n" \
+ "ecex_buffer_has_mouse_handler\n" \
+ "ecex_buffer_mouse_userdata\n" \
+ "ecex_buffer_set_animation\n" \
+ "ecex_buffer_set_animation_ms\n" \
+ "ecex_buffer_clear_animation\n" \
+ "ecex_buffer_is_animating\n" \
+ "ecex_buffer_animation_userdata\n" \
+ "ecex_tick_animations\n" \
+ "ecex_buffer_replace_text\n" \
+ "ecex_buffer_set_modified\n" \
+ "ecex_draw_set_color\n" \
+ "ecex_draw_rect\n" \
+ "ecex_draw_rect_outline\n" \
+ "ecex_draw_line\n" \
+ "ecex_draw_text\n" \
+ "ecex_draw_text_aligned\n" \
+ "ecex_draw_text_width\n" \
+ "ecex_draw_rgba\n" \
+ "ecex_draw_color_rgba8_i\n" \
+ "ecex_draw_rect_i\n" \
+ "ecex_draw_rect_outline_i\n" \
+ "ecex_draw_line_i\n" \
+ "ecex_draw_text_i\n" \
+ "ecex_draw_plugin_text_i\n" \
+ "ecex_draw_plugin_text_rect_i\n" \
+ "ecex_draw_markdown_canvas_i\n" \
+ "ecex_draw_markdown_text_i\n" \
+ "ecex_draw_markdown_canvas_auto_i\n" \
+ "ecex_draw_markdown_line_auto_i\n" \
+ "ecex_draw_label_i\n" \
+ "ecex_draw_stat_i\n" \
+ "ecex_draw_tetris_preview_i\n" \
+ "ecex_find_file\n" \
+ "ecex_save_current_buffer\n" \
+ "ecex_write_current_buffer\n" \
+ "ecex_compile\n" \
+ "ecex_grep\n" \
+ "ecex_rerun_compile\n" \
+ "ecex_rerun_grep\n" \
+ "ecex_next_interactive_action\n" \
+ "ecex_previous_interactive_action\n" \
+ "ecex_indent_line_to\n" \
+ "ecex_comment_region\n" \
+ "ecex_uncomment_region\n" \
+ "ecex_request_prompt\n" \
+ "ecex_clear_prompt_request\n" \
+ "ecex_complete_command\n" \
+ "ecex_set_font\n" \
+ "ecex_get_font_size\n" \
+ "ecex_set_font_size\n" \
+ "ecex_adjust_font_size\n" \
+ "ecex_set_bg_color\n" \
+ "ecex_set_fg_color\n" \
+ "ecex_set_status_bg_color\n" \
+ "ecex_set_status_fg_color\n" \
+ "ecex_set_status_border_color\n" \
+ "ecex_set_cursor_color\n" \
+ "ecex_set_region_bg_color\n" \
+ "ecex_set_minibuffer_bg_color\n" \
+ "ecex_set_minibuffer_fg_color\n" \
+ "ecex_set_completion_fg_color\n" \
+ "ecex_set_completion_enabled\n" \
+ "ecex_set_interactive_highlight_bg_color\n" \
+ "ecex_set_interactive_highlight_fg_color\n" \
+ "ecex_set_current_line_bg_color\n" \
+ "ecex_set_search_bg_color\n" \
+ "ecex_set_line_numbers_enabled\n" \
+ "ecex_set_current_line_enabled\n" \
+ "buffer_new\n" \
+ "buffer_free\n" \
+ "buffer_reserve\n" \
+ "buffer_clear\n" \
+ "buffer_set_text\n" \
+ "buffer_insert\n" \
+ "buffer_append\n" \
+ "buffer_prepend\n" \
+ "buffer_insert_at\n" \
+ "buffer_insert_char\n" \
+ "buffer_delete_range\n" \
+ "buffer_delete_selection\n" \
+ "buffer_replace_selection\n" \
+ "buffer_backspace\n" \
+ "buffer_delete_forward\n" \
+ "buffer_kill_line\n" \
+ "buffer_undo\n" \
+ "buffer_redo\n" \
+ "buffer_clear_undo\n" \
+ "buffer_set_point\n" \
+ "buffer_move_left\n" \
+ "buffer_move_right\n" \
+ "buffer_move_up\n" \
+ "buffer_move_down\n" \
+ "buffer_move_word_left\n" \
+ "buffer_move_word_right\n" \
+ "buffer_move_beginning_of_line\n" \
+ "buffer_move_end_of_line\n" \
+ "buffer_move_beginning_of_buffer\n" \
+ "buffer_move_end_of_buffer\n" \
+ "buffer_search_forward\n" \
+ "buffer_search_backward\n" \
+ "buffer_set_mark\n" \
+ "buffer_clear_mark\n" \
+ "buffer_has_selection\n" \
+ "buffer_selection_range\n" \
+ "buffer_line_start_at\n" \
+ "buffer_line_end_at\n" \
+ "buffer_current_line_start\n" \
+ "buffer_current_line_end\n" \
+ "buffer_current_column\n" \
+ "buffer_current_line_number\n" \
+ "buffer_line_count\n" \
+ "buffer_substring\n" \
+ "buffer_current_line_copy\n" \
+ "buffer_load_file\n" \
+ "buffer_save\n" \
+ "buffer_save_as\n" \
+ "buffer_set_interactive\n" \
+ "buffer_is_interactive\n" \
+ "buffer_clear_interactive_actions\n" \
+ "buffer_add_interactive_action\n" \
+ "buffer_interactive_action_at_line\n" \
+ "ecex_path_copy\n" \
+ "ecex_path_expand_user\n" \
+ "ecex_path_join\n" \
+ "ecex_path_dirname\n" \
+ "ecex_path_basename_dup\n" \
+ "ecex_path_normalize\n" \
+ "ecex_path_is_dir\n" \
+ "ecex_path_is_file\n" \
+ "ecex_path_exists\n" \
+ "ecex_path_file_size\n" \
+ "ecex_path_is_image\n" \
+ "ecex_path_is_previewable_image\n" \
+ "ecex_path_is_video\n" \
+ "ecex_path_is_media\n" \
+ "ecex_path_cwd\n" \
+ "ecex_media_open\n" \
+ "ecex_media_toggle_playback\n"
+#define ECEX_API_ED_FIELD_WORDS \
+ "buffers\n" \
+ "buffer_cap\n" \
+ "buffer_count\n" \
+ "current_buffer_index\n" \
+ "current_buffer\n" \
+ "previous_buffer\n" \
+ "windows\n" \
+ "window_cap\n" \
+ "window_count\n" \
+ "current_window_index\n" \
+ "jit_modules\n" \
+ "jit_module_cap\n" \
+ "jit_module_count\n" \
+ "commands\n" \
+ "command_cap\n" \
+ "command_count\n" \
+ "keybinds\n" \
+ "keybind_cap\n" \
+ "keybind_count\n" \
+ "mode_keybinds\n" \
+ "mode_keybind_cap\n" \
+ "mode_keybind_count\n" \
+ "command_hooks\n" \
+ "command_hook_cap\n" \
+ "command_hook_count\n" \
+ "prefix_hooks\n" \
+ "prefix_hook_cap\n" \
+ "prefix_hook_count\n" \
+ "buffer_hooks\n" \
+ "buffer_hook_cap\n" \
+ "buffer_hook_count\n" \
+ "completion_providers\n" \
+ "completion_provider_cap\n" \
+ "completion_provider_count\n" \
+ "major_modes\n" \
+ "major_mode_cap\n" \
+ "major_mode_count\n" \
+ "next_major_mode_id\n" \
+ "plugins\n" \
+ "last_eval_source\n" \
+ "last_eval_filename\n" \
+ "last_compile_command\n" \
+ "last_grep_command\n" \
+ "prompt_request\n" \
+ "prompt_message\n" \
+ "config_path\n" \
+ "message\n" \
+ "message_revision\n" \
+ "clipboard_get\n" \
+ "clipboard_set\n" \
+ "clipboard_userdata\n" \
+ "clipboard_text\n" \
+ "should_quit\n" \
+ "ui_revision\n" \
+ "font_revision\n" \
+ "theme\n"
+
+static const char *ecex_api_symbols[] ECEX_API_UNUSED = {
+ "ecex_t",
+ "buffer_t",
+ "ecex_window_t",
+ "ecex_draw_context_t",
+ "ecex_plugin_t",
+ "ecex_plugin_runtime_t",
+ "ecex_command_fn",
+ "ecex_completion_provider_fn",
+ "ecex_file_handler_fn",
+ "ECEX_CONFIG_BEGIN",
+ "ECEX_CONFIG_END",
+ "ECEX_PLUGIN_BEGIN",
+ "ECEX_PLUGIN_END",
+ "ECEX_CONFIG_TRY",
+ "ECEX_CONFIG_COMMAND",
+ "ECEX_CONFIG_BIND",
+ "ECEX_CONFIG_MODE",
+ "ECEX_CONFIG_MODE_BIND",
+ "ECEX_CONFIG_INCLUDE",
+ "ECEX_RGB8",
+ "ECEX_ARRAY_COUNT",
+ "ecex_new",
+ "ecex_free",
+ "ecex_config_alloc",
+ "ecex_config_calloc",
+ "ecex_config_free",
+ "ecex_time_seconds",
+ "ecex_log",
+ "ecex_logf",
+ "ecex_log_group_begin",
+ "ecex_log_group_end",
+ "ecex_log_int",
+ "ecex_log_double",
+ "ecex_log_ptr",
+ "ecex_log_flush",
+ "ecex_mem_zero",
+ "ecex_i32_get",
+ "ecex_i32_set",
+ "ecex_prng_next_bounded",
+ "ecex_random_bounded",
+ "ecex_plugin_register",
+ "ecex_plugin_require",
+ "ecex_plugin_find",
+ "ecex_plugin_id",
+ "ecex_plugin_slot_alloc",
+ "ecex_plugin_slot_get",
+ "ecex_plugin_slot_free",
+ "ecex_plugin_slot_set_export_flags",
+ "ecex_plugin_slot_read_exported",
+ "ecex_plugin_slot_i32_get_scalar",
+ "ecex_plugin_slot_i32_get",
+ "ecex_plugin_slot_i32_set",
+ "ecex_plugin_slot_i32_get_2d",
+ "ecex_plugin_slot_i32_set_2d",
+ "ecex_plugin_slot_i32_set_scalar",
+ "ecex_plugin_object_alloc",
+ "ecex_plugin_object_calloc",
+ "ecex_plugin_object_free",
+ "ecex_plugin_object_valid",
+ "ecex_plugin_object_i32_get",
+ "ecex_plugin_object_i32_set",
+ "ecex_plugin_object_ptr_get",
+ "ecex_plugin_object_ptr_set",
+ "ecex_plugin_text_set",
+ "ecex_plugin_text_set_from_buffer_title",
+ "ecex_plugin_text_free",
+ "ecex_plugin_text_free_all",
+ "ecex_plugin_text_get_drawable",
+ "ecex_plugin_file_handler_register",
+ "ecex_plugin_file_handlers_run",
+ "ecex_buffer_text_len",
+ "ecex_buffer_scroll_line_index",
+ "ecex_buffer_line_count_int",
+ "ecex_buffer_line_copy_text",
+ "ecex_run_plugin_file_handlers",
+ "ecex_reserve_buffers",
+ "ecex_add_buffer",
+ "ecex_create_buffer",
+ "ecex_find_buffer",
+ "ecex_switch_buffer",
+ "ecex_current_buffer",
+ "ecex_other_buffer",
+ "ecex_current_window",
+ "ecex_window_count",
+ "ecex_sync_current_buffer",
+ "ecex_split_window_vertically",
+ "ecex_split_window_horizontally",
+ "ecex_other_window",
+ "ecex_previous_window",
+ "ecex_delete_window",
+ "ecex_delete_other_windows",
+ "ecex_balance_windows",
+ "ecex_next_buffer",
+ "ecex_previous_buffer",
+ "ecex_kill_buffer",
+ "ecex_kill_buffer_force",
+ "ecex_has_modified_buffers",
+ "ecex_validate_bindings",
+ "ecex_keep_jit_module",
+ "ecex_set_config_path",
+ "ecex_config_path",
+ "ecex_reload_config",
+ "ecex_config_register_commands",
+ "ecex_config_bind_keys",
+ "ecex_config_bind_mode_keys",
+ "ecex_config_define_modes",
+ "ecex_apply_theme",
+ "ecex_register_command",
+ "ecex_execute_command",
+ "ecex_add_command_hook",
+ "ecex_remove_command_hook",
+ "ecex_add_prefix_hook",
+ "ecex_remove_prefix_hook",
+ "ecex_notify_prefix_hooks",
+ "ecex_message",
+ "ecex_add_completion_provider",
+ "ecex_remove_completion_provider",
+ "ecex_add_clangd_completion_provider",
+ "ecex_buffer_identifier_prefix",
+ "ecex_complete_at_point",
+ "ecex_set_clipboard_callbacks",
+ "ecex_clipboard_get",
+ "ecex_clipboard_set",
+ "ecex_bind_key",
+ "ecex_lookup_key",
+ "ecex_define_major_mode",
+ "ecex_major_mode_by_name",
+ "ecex_major_mode_name",
+ "ecex_buffer_set_major_mode",
+ "ecex_buffer_set_major_mode_by_name",
+ "ecex_buffer_major_mode_name",
+ "ecex_bind_mode_key",
+ "ecex_lookup_key_for_buffer",
+ "ecex_key_sequence_has_prefix_for_buffer",
+ "ecex_describe_key_prefix",
+ "ecex_auto_set_major_mode",
+ "ecex_list_commands",
+ "ecex_list_buffers",
+ "ecex_create_interactive_buffer",
+ "ecex_interactive_append_line",
+ "ecex_interactive_activate_current_line",
+ "ecex_buffer_set_renderer",
+ "ecex_buffer_clear_renderer",
+ "ecex_buffer_has_renderer",
+ "ecex_buffer_renderer_userdata",
+ "ecex_buffer_set_mouse_handler",
+ "ecex_buffer_clear_mouse_handler",
+ "ecex_buffer_has_mouse_handler",
+ "ecex_buffer_mouse_userdata",
+ "ecex_buffer_set_animation",
+ "ecex_buffer_set_animation_ms",
+ "ecex_buffer_clear_animation",
+ "ecex_buffer_is_animating",
+ "ecex_buffer_animation_userdata",
+ "ecex_tick_animations",
+ "ecex_buffer_replace_text",
+ "ecex_buffer_set_modified",
+ "ecex_draw_set_color",
+ "ecex_draw_rect",
+ "ecex_draw_rect_outline",
+ "ecex_draw_line",
+ "ecex_draw_text",
+ "ecex_draw_text_aligned",
+ "ecex_draw_text_width",
+ "ecex_draw_rgba",
+ "ecex_draw_color_rgba8_i",
+ "ecex_draw_rect_i",
+ "ecex_draw_rect_outline_i",
+ "ecex_draw_line_i",
+ "ecex_draw_text_i",
+ "ecex_draw_plugin_text_i",
+ "ecex_draw_plugin_text_rect_i",
+ "ecex_draw_markdown_canvas_i",
+ "ecex_draw_markdown_text_i",
+ "ecex_draw_markdown_canvas_auto_i",
+ "ecex_draw_markdown_line_auto_i",
+ "ecex_draw_label_i",
+ "ecex_draw_stat_i",
+ "ecex_draw_tetris_preview_i",
+ "ecex_find_file",
+ "ecex_save_current_buffer",
+ "ecex_write_current_buffer",
+ "ecex_compile",
+ "ecex_grep",
+ "ecex_rerun_compile",
+ "ecex_rerun_grep",
+ "ecex_next_interactive_action",
+ "ecex_previous_interactive_action",
+ "ecex_comment_region",
+ "ecex_uncomment_region",
+ "ecex_request_prompt",
+ "ecex_clear_prompt_request",
+ "ecex_complete_command",
+ "ecex_set_font",
+ "ecex_get_font_size",
+ "ecex_set_font_size",
+ "ecex_adjust_font_size",
+ "ecex_set_bg_color",
+ "ecex_set_fg_color",
+ "ecex_set_status_bg_color",
+ "ecex_set_status_fg_color",
+ "ecex_set_status_border_color",
+ "ecex_set_cursor_color",
+ "ecex_set_region_bg_color",
+ "ecex_set_minibuffer_bg_color",
+ "ecex_set_minibuffer_fg_color",
+ "ecex_set_completion_fg_color",
+ "ecex_set_completion_enabled",
+ "ecex_set_interactive_highlight_bg_color",
+ "ecex_set_interactive_highlight_fg_color",
+ "ecex_set_current_line_bg_color",
+ "ecex_set_search_bg_color",
+ "ecex_set_line_numbers_enabled",
+ "ecex_set_current_line_enabled",
+ "buffer_new",
+ "buffer_free",
+ "buffer_reserve",
+ "buffer_clear",
+ "buffer_set_text",
+ "buffer_insert",
+ "buffer_append",
+ "buffer_prepend",
+ "buffer_insert_at",
+ "buffer_insert_char",
+ "buffer_delete_range",
+ "buffer_delete_selection",
+ "buffer_replace_selection",
+ "buffer_backspace",
+ "buffer_delete_forward",
+ "buffer_kill_line",
+ "buffer_undo",
+ "buffer_redo",
+ "buffer_clear_undo",
+ "buffer_set_point",
+ "buffer_move_left",
+ "buffer_move_right",
+ "buffer_move_up",
+ "buffer_move_down",
+ "buffer_move_word_left",
+ "buffer_move_word_right",
+ "buffer_move_beginning_of_line",
+ "buffer_move_end_of_line",
+ "buffer_move_beginning_of_buffer",
+ "buffer_move_end_of_buffer",
+ "buffer_search_forward",
+ "buffer_search_backward",
+ "buffer_set_mark",
+ "buffer_clear_mark",
+ "buffer_has_selection",
+ "buffer_selection_range",
+ "buffer_line_start_at",
+ "buffer_line_end_at",
+ "buffer_current_line_start",
+ "buffer_current_line_end",
+ "buffer_current_column",
+ "buffer_current_line_number",
+ "buffer_line_count",
+ "buffer_substring",
+ "buffer_current_line_copy",
+ "buffer_load_file",
+ "buffer_save",
+ "buffer_save_as",
+ "buffer_set_interactive",
+ "buffer_is_interactive",
+ "buffer_clear_interactive_actions",
+ "buffer_add_interactive_action",
+ "buffer_interactive_action_at_line",
+ "ecex_path_copy",
+ "ecex_path_expand_user",
+ "ecex_path_join",
+ "ecex_path_dirname",
+ "ecex_path_basename_dup",
+ "ecex_path_normalize",
+ "ecex_path_is_dir",
+ "ecex_path_is_file",
+ "ecex_path_exists",
+ "ecex_path_file_size",
+ "ecex_path_is_image",
+ "ecex_path_is_previewable_image",
+ "ecex_path_is_video",
+ "ecex_path_is_media",
+ "ecex_path_cwd",
+ "ecex_media_open",
+ "ecex_media_toggle_playback"
+};
+
+static const char *ecex_ed_fields[] ECEX_API_UNUSED = {
+ "buffers",
+ "buffer_cap",
+ "buffer_count",
+ "current_buffer_index",
+ "current_buffer",
+ "previous_buffer",
+ "windows",
+ "window_cap",
+ "window_count",
+ "current_window_index",
+ "jit_modules",
+ "jit_module_cap",
+ "jit_module_count",
+ "commands",
+ "command_cap",
+ "command_count",
+ "keybinds",
+ "keybind_cap",
+ "keybind_count",
+ "mode_keybinds",
+ "mode_keybind_cap",
+ "mode_keybind_count",
+ "command_hooks",
+ "command_hook_cap",
+ "command_hook_count",
+ "prefix_hooks",
+ "prefix_hook_cap",
+ "prefix_hook_count",
+ "completion_providers",
+ "completion_provider_cap",
+ "completion_provider_count",
+ "major_modes",
+ "major_mode_cap",
+ "major_mode_count",
+ "next_major_mode_id",
+ "plugins",
+ "last_eval_source",
+ "last_eval_filename",
+ "last_compile_command",
+ "last_grep_command",
+ "prompt_request",
+ "prompt_message",
+ "config_path",
+ "message",
+ "message_revision",
+ "clipboard_get",
+ "clipboard_set",
+ "clipboard_userdata",
+ "clipboard_text",
+ "should_quit",
+ "ui_revision",
+ "font_revision",
+ "theme"
+};
+
+static int ecex_api_enabled(ecex_plugin_t *plugin) {
+ return ecex_plugin_slot_i32_get_scalar(plugin, ECEX_API_SLOT_ENABLED, 1) != 0;
+}
+
+static int ecex_api_register_providers(ecex_t *ed) {
+ if (ecex_define_word_completion_provider(ed,
+ ECEX_API_SYMBOLS_PROVIDER,
+ 0,
+ ECEX_COMPLETION_DEFAULT) != 0) {
+ return -1;
+ }
+
+ if (ecex_completion_provider_add_words(ed, ECEX_API_SYMBOLS_PROVIDER, ECEX_API_SYMBOL_WORDS) != 0) {
+ ecex_remove_completion_provider(ed, ECEX_API_SYMBOLS_PROVIDER);
+ return -1;
+ }
+ if (ecex_completion_provider_set_detail(ed, ECEX_API_SYMBOLS_PROVIDER, "ecex API symbol") != 0) {
+ ecex_remove_completion_provider(ed, ECEX_API_SYMBOLS_PROVIDER);
+ return -1;
+ }
+
+ if (ecex_define_word_completion_provider(ed,
+ ECEX_API_ED_FIELDS_PROVIDER,
+ 0,
+ ECEX_COMPLETION_ED_ARROW) != 0) {
+ ecex_remove_completion_provider(ed, ECEX_API_SYMBOLS_PROVIDER);
+ return -1;
+ }
+
+ if (ecex_completion_provider_add_words(ed, ECEX_API_ED_FIELDS_PROVIDER, ECEX_API_ED_FIELD_WORDS) != 0) {
+ ecex_remove_completion_provider(ed, ECEX_API_SYMBOLS_PROVIDER);
+ ecex_remove_completion_provider(ed, ECEX_API_ED_FIELDS_PROVIDER);
+ return -1;
+ }
+ if (ecex_completion_provider_set_detail(ed, ECEX_API_ED_FIELDS_PROVIDER, "ecex_t field") != 0) {
+ ecex_remove_completion_provider(ed, ECEX_API_SYMBOLS_PROVIDER);
+ ecex_remove_completion_provider(ed, ECEX_API_ED_FIELDS_PROVIDER);
+ return -1;
+ }
+
+ return 0;
+}
+
+static void ecex_api_remove_providers(ecex_t *ed) {
+ ecex_remove_completion_provider(ed, ECEX_API_SYMBOLS_PROVIDER);
+ ecex_remove_completion_provider(ed, ECEX_API_ED_FIELDS_PROVIDER);
+}
+
+static int cmd_ecex_api_complete(ecex_t *ed) {
+ return ecex_complete_at_point(ed);
+}
+
+static int cmd_ecex_mode(ecex_t *ed) {
+ buffer_t *buffer = ecex_current_buffer(ed);
+ if (!buffer) return -1;
+ return ecex_buffer_set_major_mode_by_name(ed, buffer, "ecex-mode");
+}
+
+static int cmd_ecex_api_completion_mode(ecex_t *ed) {
+ ecex_plugin_t *plugin = ecex_plugin_find(ed, ECEX_API_PLUGIN_ID);
+ if (!plugin) return -1;
+
+ int enabled = !ecex_api_enabled(plugin);
+ ecex_plugin_slot_i32_set_scalar(plugin, ECEX_API_SLOT_ENABLED, enabled);
+ if (enabled) {
+ if (ecex_api_register_providers(ed) != 0) return -1;
+ } else {
+ ecex_api_remove_providers(ed);
+ }
+ ecex_message(ed, enabled ? "ecex API completion enabled" : "ecex API completion disabled");
+ return 0;
+}
+
+ECEX_PLUGIN_BEGIN(ecex_api_completion_plugin, ECEX_API_PLUGIN_ID)
+ if (!ecex_define_major_mode(ed, "ecex-mode")) return -1;
+
+ if (ecex_plugin_slot_i32_get_scalar(plugin, ECEX_API_SLOT_ENABLED, -1) < 0) {
+ ecex_plugin_slot_i32_set_scalar(plugin, ECEX_API_SLOT_ENABLED, 1);
+ }
+
+ ECEX_CONFIG_COMMAND("ecex-mode", cmd_ecex_mode);
+ ECEX_CONFIG_COMMAND("ecex-mode-complete", cmd_ecex_api_complete);
+ ECEX_CONFIG_COMMAND("ecex-mode-completion-mode", cmd_ecex_api_completion_mode);
+ ECEX_CONFIG_COMMAND("ecex-api-complete", cmd_ecex_api_complete);
+ ECEX_CONFIG_COMMAND("ecex-api-completion-mode", cmd_ecex_api_completion_mode);
+ if (ecex_api_enabled(plugin)) {
+ ECEX_CONFIG_TRY(ecex_api_register_providers(ed));
+ }
+ return 0;
+ECEX_PLUGIN_END
+
+#ifndef ECEX_NO_STANDALONE_CONFIG
+ECEX_CONFIG_BEGIN
+ ECEX_CONFIG_INCLUDE(ecex_api_completion_plugin);
+ECEX_CONFIG_END
+#endif