aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--book/src/configuration.md3
-rw-r--r--contrib/completion/hx.bash2
-rw-r--r--contrib/completion/hx.fish1
-rw-r--r--contrib/completion/hx.zsh2
-rw-r--r--helix-loader/src/lib.rs42
-rw-r--r--helix-term/src/application.rs3
-rw-r--r--helix-term/src/args.rs5
-rw-r--r--helix-term/src/main.rs6
8 files changed, 48 insertions, 16 deletions
diff --git a/book/src/configuration.md b/book/src/configuration.md
index 5eb94c4e..e418869f 100644
--- a/book/src/configuration.md
+++ b/book/src/configuration.md
@@ -25,6 +25,9 @@ select = "underline"
hidden = false
```
+You may also specify a file to use for configuration with the `-c` or
+`--config` CLI argument: `hx -c path/to/custom-config.toml`.
+
## Editor
### `[editor]` Section
diff --git a/contrib/completion/hx.bash b/contrib/completion/hx.bash
index 87c34028..8a2d9777 100644
--- a/contrib/completion/hx.bash
+++ b/contrib/completion/hx.bash
@@ -16,7 +16,7 @@ _hx() {
COMPREPLY=($(compgen -W "$languages" -- $2))
;;
*)
- COMPREPLY=($(compgen -fd -W "-h --help --tutor -V --version -v -vv -vvv --health -g --grammar --vsplit --hsplit" -- $2))
+ COMPREPLY=($(compgen -fd -W "-h --help --tutor -V --version -v -vv -vvv --health -g --grammar --vsplit --hsplit -c --config" -- $2))
;;
esac
} && complete -F _hx hx
diff --git a/contrib/completion/hx.fish b/contrib/completion/hx.fish
index df2fb500..65f248d4 100644
--- a/contrib/completion/hx.fish
+++ b/contrib/completion/hx.fish
@@ -11,3 +11,4 @@ complete -c hx -s v -o vv -o vvv -d "Increases logging verbosity"
complete -c hx -s V -l version -d "Prints version information"
complete -c hx -l vsplit -d "Splits all given files vertically into different windows"
complete -c hx -l hsplit -d "Splits all given files horizontally into different windows"
+complete -c hx -s c -l config -d "Specifies a file to use for completion"
diff --git a/contrib/completion/hx.zsh b/contrib/completion/hx.zsh
index f9d58d3c..e3375656 100644
--- a/contrib/completion/hx.zsh
+++ b/contrib/completion/hx.zsh
@@ -16,6 +16,8 @@ _hx() {
"--grammar[Fetches or builds tree-sitter grammars]:action:->grammar" \
"--vsplit[Splits all given files vertically into different windows]" \
"--hsplit[Splits all given files horizontally into different windows]" \
+ "-c[Specifies a file to use for configuration]" \
+ "--config[Specifies a file to use for configuration]" \
"*:file:_files"
case "$state" in
diff --git a/helix-loader/src/lib.rs b/helix-loader/src/lib.rs
index 1ba48e7b..015b39a5 100644
--- a/helix-loader/src/lib.rs
+++ b/helix-loader/src/lib.rs
@@ -2,11 +2,28 @@ pub mod config;
pub mod grammar;
use etcetera::base_strategy::{choose_base_strategy, BaseStrategy};
+use std::path::PathBuf;
-pub static RUNTIME_DIR: once_cell::sync::Lazy<std::path::PathBuf> =
- once_cell::sync::Lazy::new(runtime_dir);
+pub static RUNTIME_DIR: once_cell::sync::Lazy<PathBuf> = once_cell::sync::Lazy::new(runtime_dir);
-pub fn runtime_dir() -> std::path::PathBuf {
+static CONFIG_FILE: once_cell::sync::OnceCell<PathBuf> = once_cell::sync::OnceCell::new();
+
+pub fn initialize_config_file(specified_file: Option<PathBuf>) {
+ let config_file = specified_file.unwrap_or_else(|| {
+ let config_dir = config_dir();
+
+ if !config_dir.exists() {
+ std::fs::create_dir_all(&config_dir).ok();
+ }
+
+ config_dir.join("config.toml")
+ });
+
+ // We should only initialize this value once.
+ CONFIG_FILE.set(config_file).ok();
+}
+
+pub fn runtime_dir() -> PathBuf {
if let Ok(dir) = std::env::var("HELIX_RUNTIME") {
return dir.into();
}
@@ -31,7 +48,7 @@ pub fn runtime_dir() -> std::path::PathBuf {
.unwrap()
}
-pub fn config_dir() -> std::path::PathBuf {
+pub fn config_dir() -> PathBuf {
// TODO: allow env var override
let strategy = choose_base_strategy().expect("Unable to find the config directory!");
let mut path = strategy.config_dir();
@@ -39,7 +56,7 @@ pub fn config_dir() -> std::path::PathBuf {
path
}
-pub fn local_config_dirs() -> Vec<std::path::PathBuf> {
+pub fn local_config_dirs() -> Vec<PathBuf> {
let directories = find_root_impl(None, &[".helix".to_string()])
.into_iter()
.map(|path| path.join(".helix"))
@@ -48,7 +65,7 @@ pub fn local_config_dirs() -> Vec<std::path::PathBuf> {
directories
}
-pub fn cache_dir() -> std::path::PathBuf {
+pub fn cache_dir() -> PathBuf {
// TODO: allow env var override
let strategy = choose_base_strategy().expect("Unable to find the config directory!");
let mut path = strategy.cache_dir();
@@ -56,19 +73,22 @@ pub fn cache_dir() -> std::path::PathBuf {
path
}
-pub fn config_file() -> std::path::PathBuf {
- config_dir().join("config.toml")
+pub fn config_file() -> PathBuf {
+ CONFIG_FILE
+ .get()
+ .map(|path| path.to_path_buf())
+ .unwrap_or_else(|| config_dir().join("config.toml"))
}
-pub fn lang_config_file() -> std::path::PathBuf {
+pub fn lang_config_file() -> PathBuf {
config_dir().join("languages.toml")
}
-pub fn log_file() -> std::path::PathBuf {
+pub fn log_file() -> PathBuf {
cache_dir().join("helix.log")
}
-pub fn find_root_impl(root: Option<&str>, root_markers: &[String]) -> Vec<std::path::PathBuf> {
+pub fn find_root_impl(root: Option<&str>, root_markers: &[String]) -> Vec<PathBuf> {
let current_dir = std::env::current_dir().expect("unable to determine current directory");
let mut directories = Vec::new();
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 50e72cf7..527ca1c7 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -89,9 +89,8 @@ impl Application {
use helix_view::editor::Action;
- let config_dir = helix_loader::config_dir();
let theme_loader = std::sync::Arc::new(theme::Loader::new(
- &config_dir,
+ &helix_loader::config_dir(),
&helix_loader::runtime_dir(),
));
diff --git a/helix-term/src/args.rs b/helix-term/src/args.rs
index c3019ea7..d16d7dfd 100644
--- a/helix-term/src/args.rs
+++ b/helix-term/src/args.rs
@@ -14,6 +14,7 @@ pub struct Args {
pub build_grammars: bool,
pub split: Option<Layout>,
pub verbosity: u64,
+ pub config_file: Option<PathBuf>,
pub files: Vec<(PathBuf, Position)>,
}
@@ -43,6 +44,10 @@ impl Args {
anyhow::bail!("--grammar must be followed by either 'fetch' or 'build'")
}
},
+ "-c" | "--config" => match argv.next().as_deref() {
+ Some(path) => args.config_file = Some(path.into()),
+ None => anyhow::bail!("--config must specify a path to read"),
+ },
arg if arg.starts_with("--") => {
anyhow::bail!("unexpected double dash argument: {}", arg)
}
diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs
index 83af7588..7f04f201 100644
--- a/helix-term/src/main.rs
+++ b/helix-term/src/main.rs
@@ -64,6 +64,7 @@ FLAGS:
--health [LANG] Checks for potential errors in editor setup
If given, checks for config errors in language LANG
-g, --grammar {{fetch|build}} Fetches or builds tree-sitter grammars listed in languages.toml
+ -c, --config <file> Specifies a file to use for configuration
-v Increases logging verbosity each use for up to 3 times
(default file: {})
-V, --version Prints version information
@@ -119,14 +120,15 @@ FLAGS:
std::fs::create_dir_all(&config_dir).ok();
}
- let config = match std::fs::read_to_string(config_dir.join("config.toml")) {
+ helix_loader::initialize_config_file(args.config_file.clone());
+
+ let config = match std::fs::read_to_string(helix_loader::config_file()) {
Ok(config) => toml::from_str(&config)
.map(helix_term::keymap::merge_keys)
.unwrap_or_else(|err| {
eprintln!("Bad config: {}", err);
eprintln!("Press <ENTER> to continue with default config");
use std::io::Read;
- // This waits for an enter press.
let _ = std::io::stdin().read(&mut []);
Config::default()
}),