on master help sign in
Provide a feature flag to be able to embed the runtime folder.
62d181dBrian Dawn
Cargo.lock+34
@@ -266,6 +266,7 @@ dependencies = [
266 "once_cell",
266 "once_cell",
267 "regex",
267 "regex",
268 "ropey",
268 "ropey",
269+ "rust-embed",
269 "serde",
270 "serde",
270 "smallvec",
271 "smallvec",
271 "tendril",
272 "tendril",
@@ -692,6 +693,39 @@ dependencies = [
692 "smallvec",
693 "smallvec",
693]
694]
694
695
696+[[package]]
697+name = "rust-embed"
698+version = "5.9.0"
699+source = "registry+https://github.com/rust-lang/crates.io-index"
700+checksum = "2fe1fe6aac5d6bb9e1ffd81002340363272a7648234ec7bdfac5ee202cb65523"
701+dependencies = [
702+ "rust-embed-impl",
703+ "rust-embed-utils",
704+ "walkdir",
705+]
706+
707+[[package]]
708+name = "rust-embed-impl"
709+version = "5.9.0"
710+source = "registry+https://github.com/rust-lang/crates.io-index"
711+checksum = "3ed91c41c42ef7bf687384439c312e75e0da9c149b0390889b94de3c7d9d9e66"
712+dependencies = [
713+ "proc-macro2",
714+ "quote",
715+ "rust-embed-utils",
716+ "syn",
717+ "walkdir",
718+]
719+
720+[[package]]
721+name = "rust-embed-utils"
722+version = "5.1.0"
723+source = "registry+https://github.com/rust-lang/crates.io-index"
724+checksum = "2a512219132473ab0a77b52077059f1c47ce4af7fbdc94503e9862a34422876d"
725+dependencies = [
726+ "walkdir",
727+]
728+
695[[package]]
729[[package]]
696name = "ryu"
730name = "ryu"
697version = "1.0.5"
731version = "1.0.5"
README.md+7
@@ -45,6 +45,13 @@ the `HELIX_RUNTIME` environment variable.
45> NOTE: You should set this to <path to repository>/runtime in development (if
45> NOTE: You should set this to <path to repository>/runtime in development (if
46> running via cargo).
46> running via cargo).
47
47
48+If you want to bake the `runtime/` directory into the Helix binary you can build
49+it with:
50+
51+```
52+cargo install --path helix-term --features "embed_runtime"
53+```
54+
48## Arch Linux
55## Arch Linux
49There are two packages available from AUR:
56There are two packages available from AUR:
50 - `helix-bin`: contains prebuilt binary from GitHub releases
57 - `helix-bin`: contains prebuilt binary from GitHub releases
book/src/install.md+7
@@ -35,3 +35,10 @@ This will install the `hx` binary to `$HOME/.cargo/bin`.
35Now copy the `runtime/` directory somewhere. Helix will by default look for the
35Now copy the `runtime/` directory somewhere. Helix will by default look for the
36runtime inside the same folder as the executable, but that can be overriden via
36runtime inside the same folder as the executable, but that can be overriden via
37the `HELIX_RUNTIME` environment variable.
37the `HELIX_RUNTIME` environment variable.
38+
39+If you want to bake the `runtime/` directory into the Helix binary you can build
40+it with:
41+
42+```
43+cargo install --path helix-term --features "embed_runtime"
44+```
helix-core/Cargo.toml+5
@@ -7,6 +7,10 @@ license = "MPL-2.0"
7
7
8# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
9
9
10+
11+[features]
12+embed_runtime = []
13+
10[dependencies]
14[dependencies]
11helix-syntax = { path = "../helix-syntax" }
15helix-syntax = { path = "../helix-syntax" }
12
16
@@ -24,3 +28,4 @@ serde = { version = "1.0", features = ["derive"] }
24toml = "0.5"
28toml = "0.5"
25
29
26etcetera = "0.3"
30etcetera = "0.3"
31+rust-embed="5.9.0"
helix-core/src/lib.rs+1
@@ -44,6 +44,7 @@ pub(crate) fn find_first_non_whitespace_char(text: RopeSlice, line_num: usize) -
44 None
44 None
45}
45}
46
46
47+#[cfg(not(embed_runtime))]
47pub fn runtime_dir() -> std::path::PathBuf {
48pub fn runtime_dir() -> std::path::PathBuf {
48 // runtime env var || dir where binary is located
49 // runtime env var || dir where binary is located
49 std::env::var("HELIX_RUNTIME")
50 std::env::var("HELIX_RUNTIME")
helix-core/src/syntax.rs+29−11
@@ -73,16 +73,37 @@ pub struct IndentQuery {
73 pub outdent: HashSet<String>,
73 pub outdent: HashSet<String>,
74}
74}
75
75
76+#[cfg(not(feature = "embed_runtime"))]
76−fn read_query(language: &str, filename: &str) -> String {
77+fn load_runtime_file(language: &str, filename: &str) -> Result<String, std::io::Error> {
77− static INHERITS_REGEX: Lazy<Regex> =
78− Lazy::new(|| Regex::new(r";+\s*inherits\s*:?\s*([a-z_,()]+)\s*").unwrap());
79−
80 let root = crate::runtime_dir();
78 let root = crate::runtime_dir();
81− // let root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
79+ let path = root.join("queries").join(language).join(filename);
80+ std::fs::read_to_string(&path)
81+}
82+
83+#[cfg(feature = "embed_runtime")]
84+use rust_embed::RustEmbed;
85+
86+#[cfg(feature = "embed_runtime")]
87+#[derive(RustEmbed)]
88+#[folder = "../runtime/"]
89+struct Runtime;
82
90
91+#[cfg(feature = "embed_runtime")]
92+fn load_runtime_file(language: &str, filename: &str) -> Result<String, Box<dyn std::error::Error>> {
93+ let root = PathBuf::new();
83 let path = root.join("queries").join(language).join(filename);
94 let path = root.join("queries").join(language).join(filename);
84
95
85− let query = std::fs::read_to_string(&path).unwrap_or_default();
96+ let query_bytes = Runtime::get(&path.as_path().display().to_string()).unwrap_or_default();
97+ std::str::from_utf8(query_bytes.as_ref())
98+ .map(|s| s.to_string())
99+ .map_err(|err| err.into())
100+}
101+
102+fn read_query(language: &str, filename: &str) -> String {
103+ static INHERITS_REGEX: Lazy<Regex> =
104+ Lazy::new(|| Regex::new(r";+\s*inherits\s*:?\s*([a-z_,()]+)\s*").unwrap());
105+
106+ let query = load_runtime_file(language, filename).unwrap_or_default();
86
107
87 // TODO: the collect() is not ideal
108 // TODO: the collect() is not ideal
88 let inherits = INHERITS_REGEX
109 let inherits = INHERITS_REGEX
@@ -146,11 +167,8 @@ impl LanguageConfiguration {
146 .get_or_init(|| {
167 .get_or_init(|| {
147 let language = get_language_name(self.language_id).to_ascii_lowercase();
168 let language = get_language_name(self.language_id).to_ascii_lowercase();
148
169
149− let root = crate::runtime_dir();
150− let path = root.join("queries").join(language).join("indents.toml");
170+ let toml = load_runtime_file(&language, "indents.toml").ok()?;
151−
152− let toml = std::fs::read(&path).ok()?;
153− toml::from_slice(&toml).ok()
171+ toml::from_slice(&toml.as_bytes()).ok()
154 })
172 })
155 .as_ref()
173 .as_ref()
156 }
174 }
helix-term/Cargo.toml+3
@@ -8,6 +8,9 @@ license = "MPL-2.0"
8
8
9# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
9# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
10
10
11+[features]
12+embed_runtime = ["helix-core/embed_runtime"]
13+
11[[bin]]
14[[bin]]
12name = "hx"
15name = "hx"
13path = "src/main.rs"
16path = "src/main.rs"