diff --git a/helix-term/src/commands/engine/steel.rs b/helix-term/src/commands/engine/steel.rs index fa69a1d22..4ff3fde8b 100644 --- a/helix-term/src/commands/engine/steel.rs +++ b/helix-term/src/commands/engine/steel.rs @@ -692,6 +692,12 @@ fn load_configuration_api(engine: &mut Engine, generate_sources: bool) { fn load_editor_api(engine: &mut Engine, generate_sources: bool) { let mut module = BuiltInModule::new("helix/core/editor"); + // Types + module.register_fn("Action/Load", || Action::Load); + module.register_fn("Action/Replace", || Action::Replace); + module.register_fn("Action/HorizontalSplit", || Action::HorizontalSplit); + module.register_fn("Action/VerticalSplit", || Action::VerticalSplit); + // Arity 0 module.register_fn("editor-focus", cx_current_focus); module.register_fn("editor-mode", cx_get_mode); @@ -710,6 +716,9 @@ fn load_editor_api(engine: &mut Engine, generate_sources: bool) { module.register_fn("set-scratch-buffer-name!", set_scratch_buffer_name); module.register_fn("editor-doc-exists?", cx_document_exists); + // Arity 2 + module.register_fn("editor-switch-action!", cx_switch_action); + // Arity 1 RegisterFn::< _, @@ -727,6 +736,22 @@ fn load_editor_api(engine: &mut Engine, generate_sources: bool) { let mut builtin_editor_command_module = "(require-builtin helix/core/editor as helix.)".to_string(); + let mut template_function_type_constructor = |name: &str| { + builtin_editor_command_module.push_str(&format!( + r#" +(provide {}) +(define ({}) + (helix.{})) +"#, + name, name, name + )); + }; + + template_function_type_constructor("Action/Load"); + template_function_type_constructor("Action/Replace"); + template_function_type_constructor("Action/HorizontalSplit"); + template_function_type_constructor("Action/VerticalSplit"); + let mut template_function_arity_0 = |name: &str| { builtin_editor_command_module.push_str(&format!( r#" @@ -764,6 +789,19 @@ fn load_editor_api(engine: &mut Engine, generate_sources: bool) { template_function_arity_1("editor-doc-exists?"); template_function_arity_1("editor->get-document"); + let mut template_function_arity_2 = |name: &str| { + builtin_editor_command_module.push_str(&format!( + r#" +(provide {}) +(define ({} arg1 arg2) + (helix.{} *helix.cx* arg1 arg2)) +"#, + name, name, name + )); + }; + + template_function_arity_2("editor-switch-action!"); + let mut target_directory = helix_runtime_search_path(); if !target_directory.exists() { @@ -2266,6 +2304,10 @@ fn cx_switch(cx: &mut Context, doc_id: DocumentId) { cx.editor.switch(doc_id, Action::VerticalSplit) } +fn cx_switch_action(cx: &mut Context, doc_id: DocumentId, action: Action) { + cx.editor.switch(doc_id, action) +} + fn cx_get_mode(cx: &mut Context) -> Mode { cx.editor.mode } diff --git a/helix-view/src/extension.rs b/helix-view/src/extension.rs index 50f96e685..db71c3601 100644 --- a/helix-view/src/extension.rs +++ b/helix-view/src/extension.rs @@ -15,9 +15,7 @@ mod steel_implementations { use crate::{ document::Mode, editor::{ - BufferLine, CursorShapeConfig, FilePickerConfig, GutterConfig, IndentGuidesConfig, - LineEndingConfig, LineNumber, LspConfig, SearchConfig, SmartTabConfig, - StatusLineConfig, TerminalConfig, WhitespaceConfig, + Action, BufferLine, CursorShapeConfig, FilePickerConfig, GutterConfig, IndentGuidesConfig, LineEndingConfig, LineNumber, LspConfig, SearchConfig, SmartTabConfig, StatusLineConfig, TerminalConfig, WhitespaceConfig }, graphics::{Color, Rect, Style, UnderlineStyle}, input::Event, @@ -56,6 +54,8 @@ mod steel_implementations { impl Custom for ViewId {} impl CustomReference for Document {} + impl Custom for Action {} + impl Custom for FilePickerConfig {} impl Custom for StatusLineConfig {} impl Custom for SearchConfig {}