add feature flag

pull/8675/merge^2
mattwparas 1 year ago
parent 81243247c6
commit 279f5eddb3

@ -13,6 +13,7 @@ include = ["src/**/*", "README.md"]
[features] [features]
unicode-lines = ["ropey/unicode_lines"] unicode-lines = ["ropey/unicode_lines"]
integration = [] integration = []
steel = ["dep:steel-core"]
[dependencies] [dependencies]
helix-loader = { version = "0.6", path = "../helix-loader" } helix-loader = { version = "0.6", path = "../helix-loader" }
@ -48,7 +49,7 @@ chrono = { version = "0.4", default-features = false, features = ["alloc", "std"
etcetera = "0.8" etcetera = "0.8"
textwrap = "0.16.0" textwrap = "0.16.0"
steel-core = { workspace = true } steel-core = { workspace = true, optional = true }
[dev-dependencies] [dev-dependencies]
quickcheck = { version = "1", default-features = false } quickcheck = { version = "1", default-features = false }

@ -1,32 +1,37 @@
use std::{borrow::Cow, cell::Cell, rc::Rc}; #[cfg(feature = "steel")]
pub mod steel_implementations {
use ropey::iter::Chars; use std::{borrow::Cow, cell::Cell, rc::Rc};
use smallvec::SmallVec;
use steel::{ use ropey::iter::Chars;
use smallvec::SmallVec;
use steel::{
gc::unsafe_erased_pointers::CustomReference, gc::unsafe_erased_pointers::CustomReference,
rvals::{Custom, SteelString}, rvals::{Custom, SteelString},
steel_vm::{builtin::BuiltInModule, register_fn::RegisterFn, register_fn::RegisterFnBorrowed}, steel_vm::{
}; builtin::BuiltInModule, register_fn::RegisterFn, register_fn::RegisterFnBorrowed,
},
};
impl steel::rvals::Custom for crate::Position {} impl steel::rvals::Custom for crate::Position {}
impl steel::rvals::Custom for crate::Selection {} impl steel::rvals::Custom for crate::Selection {}
pub struct SRopeSlice<'a> { pub struct SRopeSlice<'a> {
slice: crate::RopeSlice<'a>, slice: crate::RopeSlice<'a>,
} }
steel::custom_reference!(SRopeSlice<'a>); steel::custom_reference!(SRopeSlice<'a>);
impl<'a> CustomReference for SRopeSlice<'a> {} impl<'a> CustomReference for SRopeSlice<'a> {}
// impl Custom for SRopeSlice<'static> {} // impl Custom for SRopeSlice<'static> {}
pub struct SRopeSliceCowStr<'a>(Cow<'a, str>); pub struct SRopeSliceCowStr<'a>(Cow<'a, str>);
steel::custom_reference!(SRopeSliceCowStr<'a>); steel::custom_reference!(SRopeSliceCowStr<'a>);
impl<'a> CustomReference for SRopeSliceCowStr<'a> {} impl<'a> CustomReference for SRopeSliceCowStr<'a> {}
struct CharIter<'a>(Chars<'a>); struct CharIter<'a>(Chars<'a>);
impl<'a> SRopeSlice<'a> { impl<'a> SRopeSlice<'a> {
pub fn new(slice: crate::RopeSlice<'a>) -> Self { pub fn new(slice: crate::RopeSlice<'a>) -> Self {
Self { slice } Self { slice }
} }
@ -68,20 +73,20 @@ impl<'a> SRopeSlice<'a> {
pub fn get_char(&'a self, index: usize) -> Option<char> { pub fn get_char(&'a self, index: usize) -> Option<char> {
self.slice.get_char(index) self.slice.get_char(index)
} }
} }
// RegisterFn::< // RegisterFn::<
// _, // _,
// steel::steel_vm::register_fn::MarkerWrapper7<( // steel::steel_vm::register_fn::MarkerWrapper7<(
// Context<'_>, // Context<'_>,
// helix_view::Editor, // helix_view::Editor,
// helix_view::Editor, // helix_view::Editor,
// Context<'static>, // Context<'static>,
// )>, // )>,
// helix_view::Editor, // helix_view::Editor,
// >::register_fn(&mut engine, "cx-editor!", get_editor); // >::register_fn(&mut engine, "cx-editor!", get_editor);
pub fn rope_slice_module() -> BuiltInModule { pub fn rope_slice_module() -> BuiltInModule {
let mut module = BuiltInModule::new("helix/core/text"); let mut module = BuiltInModule::new("helix/core/text");
// (SELF, ARG, SELFSTAT, RET, RETSTAT) // (SELF, ARG, SELFSTAT, RET, RETSTAT)
@ -110,43 +115,43 @@ pub fn rope_slice_module() -> BuiltInModule {
// module.register_fn("slice-len-chars", SRopeSlice::len_chars); // module.register_fn("slice-len-chars", SRopeSlice::len_chars);
module module
} }
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
enum SliceKind { enum SliceKind {
Normal(usize, usize), Normal(usize, usize),
Byte(usize, usize), Byte(usize, usize),
Line(usize), Line(usize),
} }
#[derive(Clone)] #[derive(Clone)]
pub struct SteelRopeSlice { pub struct SteelRopeSlice {
text: crate::Rope, text: crate::Rope,
ranges: SmallVec<[SliceKind; 5]>, ranges: SmallVec<[SliceKind; 5]>,
} }
// #[derive(Clone)] // #[derive(Clone)]
// pub struct SteelRopeString { // pub struct SteelRopeString {
// slice: SteelRopeSlice, // slice: SteelRopeSlice,
// operations: SmallVec<[StringOperation; 5]>, // operations: SmallVec<[StringOperation; 5]>,
// } // }
// #[derive(Clone)] // #[derive(Clone)]
// enum StringOperation { // enum StringOperation {
// TrimStart, // TrimStart,
// StartsWith(SteelString), // StartsWith(SteelString),
// } // }
// impl SteelRopeString { // impl SteelRopeString {
// pub fn evaluate(&self) -> SteelVal { // pub fn evaluate(&self) -> SteelVal {
// todo!() // todo!()
// } // }
// } // }
impl Custom for SteelRopeSlice {} impl Custom for SteelRopeSlice {}
// impl Custom for SteelRopeString {} // impl Custom for SteelRopeString {}
impl SteelRopeSlice { impl SteelRopeSlice {
pub fn from_string(string: SteelString) -> Self { pub fn from_string(string: SteelString) -> Self {
Self { Self {
text: crate::Rope::from_str(string.as_str()), text: crate::Rope::from_str(string.as_str()),
@ -219,9 +224,9 @@ impl SteelRopeSlice {
// pub fn as_cow(&'a self) -> SRopeSliceCowStr<'a> { // pub fn as_cow(&'a self) -> SRopeSliceCowStr<'a> {
// SRopeSliceCowStr(std::borrow::Cow::from(self.slice)) // SRopeSliceCowStr(std::borrow::Cow::from(self.slice))
// } // }
} }
pub fn rope_module() -> BuiltInModule { pub fn rope_module() -> BuiltInModule {
let mut module = BuiltInModule::new("helix/core/text"); let mut module = BuiltInModule::new("helix/core/text");
module module
@ -240,4 +245,5 @@ pub fn rope_module() -> BuiltInModule {
); );
module module
}
} }

@ -156,14 +156,6 @@ pub fn log_file() -> PathBuf {
LOG_FILE.get().map(|path| path.to_path_buf()).unwrap() LOG_FILE.get().map(|path| path.to_path_buf()).unwrap()
} }
pub fn helix_module_file() -> PathBuf {
config_dir().join("helix.scm")
}
pub fn steel_init_file() -> PathBuf {
config_dir().join("init.scm")
}
pub fn workspace_config_file() -> PathBuf { pub fn workspace_config_file() -> PathBuf {
find_workspace().0.join(".helix").join("config.toml") find_workspace().0.join(".helix").join("config.toml")
} }

@ -13,10 +13,12 @@ default-run = "hx"
rust-version = "1.65" rust-version = "1.65"
[features] [features]
default = ["git"] default = ["git", "steel"]
# default = ["git"]
unicode-lines = ["helix-core/unicode-lines"] unicode-lines = ["helix-core/unicode-lines"]
integration = [] integration = []
git = ["helix-vcs/git"] git = ["helix-vcs/git"]
steel = ["dep:steel-core", "helix-core/steel", "helix-view/steel", "tui/steel"]
[[bin]] [[bin]]
name = "hx" name = "hx"
@ -67,7 +69,7 @@ grep-regex = "0.1.11"
grep-searcher = "0.1.11" grep-searcher = "0.1.11"
# plugin support # plugin support
steel-core = { workspace = true } steel-core = { workspace = true, optional = true }
[target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100 [target.'cfg(not(windows))'.dependencies] # https://github.com/vorner/signal-hook/issues/100
signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] } signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] }

File diff suppressed because it is too large Load Diff

@ -8,7 +8,7 @@ use steel::{
}; };
use crate::{ use crate::{
commands::{engine::ENGINE, Context}, commands::{engine::scheme::ENGINE, Context},
compositor::{self, Component}, compositor::{self, Component},
ui::{Popup, Prompt, PromptEvent}, ui::{Popup, Prompt, PromptEvent},
}; };
@ -72,6 +72,7 @@ pub fn helix_component_module() -> BuiltInModule {
} }
}, },
); );
// prompt: Cow<'static, str>, // prompt: Cow<'static, str>,
// history_register: Option<char>, // history_register: Option<char>,
// completion_fn: impl FnMut(&Editor, &str) -> Vec<Completion> + 'static, // completion_fn: impl FnMut(&Editor, &str) -> Vec<Completion> + 'static,

File diff suppressed because it is too large Load Diff

@ -2,7 +2,6 @@ use std::ops::Deref;
use crate::job::Job; use crate::job::Job;
use super::engine::{compositor_present_error, present_error};
use super::*; use super::*;
use helix_core::{encoding, shellwords::Shellwords}; use helix_core::{encoding, shellwords::Shellwords};

@ -134,7 +134,11 @@ impl Config {
let local_config = fs::read_to_string(helix_loader::workspace_config_file()) let local_config = fs::read_to_string(helix_loader::workspace_config_file())
.map_err(ConfigLoadError::Error); .map_err(ConfigLoadError::Error);
let bindings = crate::commands::engine::SharedKeyBindingsEventQueue::get(); #[cfg(feature = "steel")]
let bindings = crate::commands::engine::scheme::SharedKeyBindingsEventQueue::get();
#[cfg(not(feature = "steel"))]
let bindings = None;
Config::load(global_config, local_config, bindings) Config::load(global_config, local_config, bindings)
} }

@ -803,20 +803,7 @@ impl EditorView {
self.pseudo_pending.extend(self.keymaps.pending()); self.pseudo_pending.extend(self.keymaps.pending());
// Check the engine for any buffer specific keybindings first // Check the engine for any buffer specific keybindings first
let key_result = ScriptingEngine::get_keymap_for_extension(cxt) let key_result = ScriptingEngine::handle_keymap_event(self, mode, cxt, event);
.and_then(|map| {
if let steel::SteelVal::Custom(inner) = map {
if let Some(underlying) = steel::rvals::as_underlying_type::<
commands::engine::EmbeddedKeyMap,
>(inner.borrow().as_ref())
{
return Some(self.keymaps.get_with_map(&underlying.0, mode, event));
}
}
None
})
.unwrap_or_else(|| self.keymaps.get(mode, event));
cxt.editor.autoinfo = self.keymaps.sticky().map(|node| node.infobox()); cxt.editor.autoinfo = self.keymaps.sticky().map(|node| node.infobox());

@ -0,0 +1,11 @@
#[cfg(feature = "steel")]
mod steel_implementations {
use crate::{
compositor::Component,
ui::{Popup, Text},
};
impl steel::rvals::Custom for Text {}
impl<T: steel::rvals::IntoSteelVal + Component> steel::rvals::Custom for Popup<T> {}
}

@ -1,6 +1,7 @@
mod completion; mod completion;
mod document; mod document;
pub(crate) mod editor; pub(crate) mod editor;
mod extension;
mod fuzzy_match; mod fuzzy_match;
mod info; mod info;
pub mod lsp; pub mod lsp;

@ -3,7 +3,6 @@ use crate::{
compositor::{Callback, Component, Context, Event, EventResult}, compositor::{Callback, Component, Context, Event, EventResult},
ctrl, key, ctrl, key,
}; };
use steel::rvals::Custom;
use tui::buffer::Buffer as Surface; use tui::buffer::Buffer as Surface;
use helix_core::Position; use helix_core::Position;
@ -15,8 +14,6 @@ use helix_view::{
// TODO: share logic with Menu, it's essentially Popup(render_fn), but render fn needs to return // TODO: share logic with Menu, it's essentially Popup(render_fn), but render fn needs to return
// a width/height hint. maybe Popup(Box<Component>) // a width/height hint. maybe Popup(Box<Component>)
impl<T: steel::rvals::IntoSteelVal + Component> Custom for Popup<T> {}
pub struct Popup<T: Component> { pub struct Popup<T: Component> {
contents: T, contents: T,
position: Option<Position>, position: Option<Position>,

@ -8,10 +8,7 @@ use helix_view::{
Document, Editor, View, Document, Editor, View,
}; };
use crate::{ use crate::ui::ProgressSpinners;
commands::engine::{StatusLineMessage, STATUS_LINE_MESSAGE},
ui::ProgressSpinners,
};
use helix_view::editor::StatusLineElement as StatusLineElementID; use helix_view::editor::StatusLineElement as StatusLineElementID;
use tui::buffer::Buffer as Surface; use tui::buffer::Buffer as Surface;
@ -515,9 +512,9 @@ fn render_custom_text<F>(context: &mut RenderContext, write: F)
where where
F: Fn(&mut RenderContext, String, Option<Style>) + Copy, F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
{ {
if let Some(message) = StatusLineMessage::get() { // if let Some(message) = StatusLineMessage::get() {
write(context, message, None); // write(context, message, None);
} // }
} }
fn render_register<F>(context: &mut RenderContext, write: F) fn render_register<F>(context: &mut RenderContext, write: F)

@ -3,8 +3,6 @@ use tui::buffer::Buffer as Surface;
use helix_view::graphics::Rect; use helix_view::graphics::Rect;
impl steel::rvals::Custom for Text {}
pub struct Text { pub struct Text {
pub(crate) contents: tui::text::Text<'static>, pub(crate) contents: tui::text::Text<'static>,
size: (u16, u16), size: (u16, u16),

@ -14,6 +14,7 @@ include = ["src/**/*", "README.md"]
[features] [features]
default = ["crossterm"] default = ["crossterm"]
steel = ["dep:steel-core", "helix-view/steel", "helix-core/steel"]
[dependencies] [dependencies]
bitflags = "2.4" bitflags = "2.4"
@ -26,4 +27,4 @@ once_cell = "1.18"
log = "~0.4" log = "~0.4"
helix-view = { version = "0.6", path = "../helix-view", features = ["term"] } helix-view = { version = "0.6", path = "../helix-view", features = ["term"] }
helix-core = { version = "0.6", path = "../helix-core" } helix-core = { version = "0.6", path = "../helix-core" }
steel-core = { workspace = true } steel-core = { workspace = true, optional = true }

@ -1,7 +1,11 @@
use crate::{buffer::Buffer, widgets::Widget}; #[cfg(feature = "steel")]
mod steel_implementations {
use steel::{gc::unsafe_erased_pointers::CustomReference, rvals::Custom}; use crate::{buffer::Buffer, widgets::Widget};
impl CustomReference for Buffer {} use steel::{gc::unsafe_erased_pointers::CustomReference, rvals::Custom};
steel::custom_reference!(Buffer); impl CustomReference for Buffer {}
steel::custom_reference!(Buffer);
}

@ -10,8 +10,8 @@ repository = "https://github.com/helix-editor/helix"
homepage = "https://helix-editor.com" homepage = "https://helix-editor.com"
[features] [features]
default = []
term = ["crossterm"] term = ["crossterm"]
steel = ["dep:steel-core", "helix-core/steel"]
[dependencies] [dependencies]
bitflags = "2.4" bitflags = "2.4"
@ -46,7 +46,7 @@ which = "4.4"
parking_lot = "0.12.1" parking_lot = "0.12.1"
# plugin support # plugin support
steel-core = { workspace = true } steel-core = { workspace = true, optional = true }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]

@ -874,11 +874,6 @@ pub struct Breakpoint {
use futures_util::stream::{Flatten, Once}; use futures_util::stream::{Flatten, Once};
impl steel::gc::unsafe_erased_pointers::CustomReference for Editor {}
steel::custom_reference!(Editor);
impl steel::rvals::Custom for Mode {}
#[repr(C)] #[repr(C)]
pub struct Editor { pub struct Editor {
/// Current editing mode. /// Current editing mode.

@ -1,15 +1,29 @@
use steel::{gc::unsafe_erased_pointers::CustomReference, rvals::Custom}; use crate::DocumentId;
use crate::{graphics::Rect, input::Event, Document, DocumentId, ViewId};
// Reference types along with value types - This should allow for having users
impl CustomReference for Event {}
impl Custom for Rect {}
impl Custom for crate::graphics::CursorKind {}
impl Custom for DocumentId {}
impl Custom for ViewId {}
impl CustomReference for Document {}
pub fn document_id_to_usize(doc_id: &DocumentId) -> usize { pub fn document_id_to_usize(doc_id: &DocumentId) -> usize {
doc_id.0.into() doc_id.0.into()
} }
#[cfg(feature = "steel")]
mod steel_implementations {
use steel::{gc::unsafe_erased_pointers::CustomReference, rvals::Custom};
use crate::{
document::Mode, graphics::Rect, input::Event, Document, DocumentId, Editor, ViewId,
};
impl steel::gc::unsafe_erased_pointers::CustomReference for Editor {}
steel::custom_reference!(Editor);
impl steel::rvals::Custom for Mode {}
impl steel::rvals::Custom for Event {}
// Reference types along with value types - This should allow for having users
impl CustomReference for Event {}
impl Custom for Rect {}
impl Custom for crate::graphics::CursorKind {}
impl Custom for DocumentId {}
impl Custom for ViewId {}
impl CustomReference for Document {}
}

@ -17,8 +17,6 @@ pub enum Event {
IdleTimeout, IdleTimeout,
} }
impl steel::rvals::Custom for Event {}
#[derive(Debug, PartialOrd, PartialEq, Eq, Clone, Copy, Hash)] #[derive(Debug, PartialOrd, PartialEq, Eq, Clone, Copy, Hash)]
pub struct MouseEvent { pub struct MouseEvent {
/// The kind of mouse event that was caused. /// The kind of mouse event that was caused.

Loading…
Cancel
Save