summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorKevin Song <chipbuster@users.noreply.github.com>2019-09-07 19:33:06 -0500
committerGitHub <noreply@github.com>2019-09-07 19:33:06 -0500
commit9721666d331ddfd7a04bbb434cccf38b44701b00 (patch)
tree8edb32e1cebc6951451953a311cd9cfb4447712d /src/modules
parent3e5cac98522feca856867e32cf3df52ff0285c62 (diff)
feat: Add the ability to configure per-module color styles (#285)
Add parsing logic, config support, docs, and integration with other modules for custom styling of each module.
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/battery.rs5
-rw-r--r--src/modules/character.rs18
-rw-r--r--src/modules/cmd_duration.rs4
-rw-r--r--src/modules/directory.rs4
-rw-r--r--src/modules/git_branch.rs6
-rw-r--r--src/modules/git_state.rs5
-rw-r--r--src/modules/git_status.rs5
-rw-r--r--src/modules/golang.rs6
-rw-r--r--src/modules/hostname.rs8
-rw-r--r--src/modules/jobs.rs7
-rw-r--r--src/modules/nix_shell.rs6
-rw-r--r--src/modules/nodejs.rs6
-rw-r--r--src/modules/package.rs6
-rw-r--r--src/modules/python.rs4
-rw-r--r--src/modules/ruby.rs6
-rw-r--r--src/modules/rust.rs6
-rw-r--r--src/modules/username.rs25
17 files changed, 81 insertions, 46 deletions
diff --git a/src/modules/battery.rs b/src/modules/battery.rs
index 800fb6d23..47c9eee73 100644
--- a/src/modules/battery.rs
+++ b/src/modules/battery.rs
@@ -30,7 +30,10 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
// TODO: Set style based on percentage when threshold is modifiable
let mut module = context.new_module("battery")?;
- module.set_style(Color::Red.bold());
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Red.bold());
+ module.set_style(module_style);
module.get_prefix().set_value("");
match state {
diff --git a/src/modules/character.rs b/src/modules/character.rs
index 9c4d7e982..704fe5c9f 100644
--- a/src/modules/character.rs
+++ b/src/modules/character.rs
@@ -5,10 +5,10 @@ use ansi_term::Color;
///
/// The character segment prints an arrow character in a color dependant on the exit-
/// code of the last executed command:
-/// - If the exit-code was "0", the arrow will be formatted with `COLOR_SUCCESS`
+/// - If the exit-code was "0", the arrow will be formatted with `style_success`
/// (green by default)
/// - If the exit-code was anything else, the arrow will be formatted with
-/// `COLOR_FAILURE` (red by default)
+/// `style_failure` (red by default)
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
const SUCCESS_CHAR: &str = "❯";
const FAILURE_CHAR: &str = "✖";
@@ -20,12 +20,16 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
const ASSUMED_MODE: ShellEditMode = ShellEditMode::Insert;
// TODO: extend config to more modes
- let color_success = Color::Green.bold();
- let color_failure = Color::Red.bold();
-
let mut module = context.new_module("character")?;
module.get_prefix().set_value("");
+ let style_success = module
+ .config_value_style("style_success")
+ .unwrap_or_else(|| Color::Green.bold());
+ let style_failure = module
+ .config_value_style("style_failure")
+ .unwrap_or_else(|| Color::Red.bold());
+
let arguments = &context.arguments;
let use_symbol = module
.config_value_bool("use_symbol_for_status")
@@ -56,9 +60,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
};
if exit_success {
- symbol.set_style(color_success.bold());
+ symbol.set_style(style_success);
} else {
- symbol.set_style(color_failure.bold());
+ symbol.set_style(style_failure);
};
Some(module)
diff --git a/src/modules/cmd_duration.rs b/src/modules/cmd_duration.rs
index 2f9e0c32e..ac7102284 100644
--- a/src/modules/cmd_duration.rs
+++ b/src/modules/cmd_duration.rs
@@ -32,7 +32,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let module_color = match elapsed {
time if time < config_min => return None,
- _ => Color::Yellow.bold(),
+ _ => module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Yellow.bold()),
};
module.set_style(module_color);
diff --git a/src/modules/directory.rs b/src/modules/directory.rs
index 8c12db59a..952701262 100644
--- a/src/modules/directory.rs
+++ b/src/modules/directory.rs
@@ -17,9 +17,11 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
const HOME_SYMBOL: &str = "~";
const DIR_TRUNCATION_LENGTH: i64 = 3;
const FISH_STYLE_PWD_DIR_LENGTH: i64 = 0;
- let module_color = Color::Cyan.bold();
let mut module = context.new_module("directory")?;
+ let module_color = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Cyan.bold());
module.set_style(module_color);
let truncation_length = module
diff --git a/src/modules/git_branch.rs b/src/modules/git_branch.rs
index 120c58d4e..d6b64c4e0 100644
--- a/src/modules/git_branch.rs
+++ b/src/modules/git_branch.rs
@@ -9,9 +9,11 @@ use super::{Context, Module};
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
const GIT_BRANCH_CHAR: &str = " ";
- let segment_color = Color::Purple.bold();
-
let mut module = context.new_module("git_branch")?;
+
+ let segment_color = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Purple.bold());
module.set_style(segment_color);
module.get_prefix().set_value("on ");
diff --git a/src/modules/git_state.rs b/src/modules/git_state.rs
index 55f3d4c11..8d242b0ca 100644
--- a/src/modules/git_state.rs
+++ b/src/modules/git_state.rs
@@ -19,9 +19,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
return None;
}
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Yellow.bold());
+ module.set_style(module_style);
module.get_prefix().set_value("(");
module.get_suffix().set_value(") ");
- module.set_style(Color::Yellow.bold());
let label = match state_description {
StateDescription::Label(label) => label,
diff --git a/src/modules/git_status.rs b/src/modules/git_status.rs
index 646f01f07..aa82fb739 100644
--- a/src/modules/git_status.rs
+++ b/src/modules/git_status.rs
@@ -34,10 +34,11 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let repo_root = context.repo_root.as_ref()?;
let repository = Repository::open(repo_root).ok()?;
- let module_style = Color::Red.bold();
let mut module = context.new_module("git_status")?;
-
let show_sync_count = module.config_value_bool("show_sync_count").unwrap_or(false);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Red.bold());
module.get_prefix().set_value("[").set_style(module_style);
module.get_suffix().set_value("] ").set_style(module_style);
diff --git a/src/modules/golang.rs b/src/modules/golang.rs
index 0114c30de..bf632bf72 100644
--- a/src/modules/golang.rs
+++ b/src/modules/golang.rs
@@ -28,10 +28,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
match get_go_version() {
Some(go_version) => {
const GO_CHAR: &str = "🐹 ";
- let module_color = Color::Cyan.bold();
let mut module = context.new_module("golang")?;
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Cyan.bold());
+ module.set_style(module_style);
let formatted_version = format_go_version(&go_version)?;
module.new_segment("symbol", GO_CHAR);
diff --git a/src/modules/hostname.rs b/src/modules/hostname.rs
index 51567bcbb..9b0690d8f 100644
--- a/src/modules/hostname.rs
+++ b/src/modules/hostname.rs
@@ -1,6 +1,5 @@
-use ansi_term::{Color, Style};
+use ansi_term::Color;
use std::env;
-use std::process::Command;
use super::{Context, Module};
use std::ffi::OsString;
@@ -12,6 +11,9 @@ use std::ffi::OsString;
/// - hostname.ssh_only is false OR the user is currently connected as an SSH session (`$SSH_CONNECTION`)
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let mut module = context.new_module("hostname")?;
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Green.bold().dimmed());
let ssh_connection = env::var("SSH_CONNECTION").ok();
if module.config_value_bool("ssh_only").unwrap_or(true) && ssh_connection.is_none() {
@@ -31,7 +33,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let prefix = module.config_value_str("prefix").unwrap_or("").to_owned();
let suffix = module.config_value_str("suffix").unwrap_or("").to_owned();
- module.set_style(Color::Green.bold().dimmed());
+ module.set_style(module_style);
module.new_segment("hostname", &format!("{}{}{}", prefix, host, suffix));
module.get_prefix().set_value("on ");
diff --git a/src/modules/jobs.rs b/src/modules/jobs.rs
index 649c2f8b0..bb8a2d7d4 100644
--- a/src/modules/jobs.rs
+++ b/src/modules/jobs.rs
@@ -9,9 +9,10 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let threshold = module.config_value_i64("threshold").unwrap_or(1);
const JOB_CHAR: &str = "✦";
- let module_color = Color::Blue.bold();
-
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Blue.bold());
+ module.set_style(module_style);
let arguments = &context.arguments;
let num_of_jobs = arguments
diff --git a/src/modules/nix_shell.rs b/src/modules/nix_shell.rs
index b37fcdcf4..5fc98dfc9 100644
--- a/src/modules/nix_shell.rs
+++ b/src/modules/nix_shell.rs
@@ -46,8 +46,10 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
}
})
.map(|segment| {
- let module_color = Color::Red.bold();
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Red.bold());
+ module.set_style(module_style);
module.new_segment("nix_shell", &segment);
module
})
diff --git a/src/modules/nodejs.rs b/src/modules/nodejs.rs
index c7029d88c..8f8219c7a 100644
--- a/src/modules/nodejs.rs
+++ b/src/modules/nodejs.rs
@@ -24,10 +24,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
match get_node_version() {
Some(node_version) => {
const NODE_CHAR: &str = "⬢ ";
- let module_color = Color::Green.bold();
let mut module = context.new_module("nodejs")?;
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Green.bold());
+ module.set_style(module_style);
let formatted_version = node_version.trim();
module.new_segment("symbol", NODE_CHAR);
diff --git a/src/modules/package.rs b/src/modules/package.rs
index c459323d9..ceb34bc6c 100644
--- a/src/modules/package.rs
+++ b/src/modules/package.rs
@@ -12,10 +12,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
match get_package_version() {
Some(package_version) => {
const PACKAGE_CHAR: &str = "📦 ";
- let module_color = Color::Red.bold();
let mut module = context.new_module("package")?;
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Red.bold());
+ module.set_style(module_style);
module.get_prefix().set_value("is ");
module.new_segment("symbol", PACKAGE_CHAR);
diff --git a/src/modules/python.rs b/src/modules/python.rs
index e12511633..61d8189db 100644
--- a/src/modules/python.rs
+++ b/src/modules/python.rs
@@ -36,7 +36,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
.unwrap_or(false);
const PYTHON_CHAR: &str = "🐍 ";
- let module_color = Color::Yellow.bold();
+ let module_color = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Yellow.bold());
module.set_style(module_color);
module.new_segment("symbol", PYTHON_CHAR);
diff --git a/src/modules/ruby.rs b/src/modules/ruby.rs
index ff3945360..a39bda75c 100644
--- a/src/modules/ruby.rs
+++ b/src/modules/ruby.rs
@@ -22,10 +22,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
match get_ruby_version() {
Some(ruby_version) => {
const RUBY_CHAR: &str = "💎 ";
- let module_color = Color::Red.bold();
let mut module = context.new_module("ruby")?;
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Red.bold());
+ module.set_style(module_style);
let formatted_version = format_ruby_version(&ruby_version)?;
module.new_segment("symbol", RUBY_CHAR);
diff --git a/src/modules/rust.rs b/src/modules/rust.rs
index c94a34d8b..401f6e4ce 100644
--- a/src/modules/rust.rs
+++ b/src/modules/rust.rs
@@ -22,10 +22,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
match get_rust_version() {
Some(rust_version) => {
const RUST_CHAR: &str = "🦀 ";
- let module_color = Color::Red.bold();
let mut module = context.new_module("rust")?;
- module.set_style(module_color);
+ let module_style = module
+ .config_value_style("style")
+ .unwrap_or_else(|| Color::Red.bold());
+ module.set_style(module_style);
let formatted_version = format_rustc_version(rust_version);
module.new_segment("symbol", RUST_CHAR);
diff --git a/src/modules/username.rs b/src/modules/username.rs
index cda223652..07ecc5b14 100644
--- a/src/modules/username.rs
+++ b/src/modules/username.rs
@@ -15,11 +15,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let logname = env::var("LOGNAME").ok();
let ssh_connection = env::var("SSH_CONNECTION").ok();
- let mut module_color = Color::Yellow.bold();
-
- if user != logname || ssh_connection.is_some() || is_root(&mut module_color) {
+ const ROOT_UID: Option<u32> = Some(0);
+ let user_uid = get_uid();
+ if user != logname || ssh_connection.is_some() || user_uid == ROOT_UID {
let mut module = context.new_module("username")?;
- module.set_style(module_color);
+ let module_style = get_mod_style(user_uid, &module);
+ module.set_style(module_style);
module.new_segment("username", &user?);
return Some(module);
@@ -37,13 +38,13 @@ fn get_uid() -> Option<u32> {
}
}
-fn is_root(style: &mut Style) -> bool {
- match get_uid() {
- Some(uid) if uid == 0 => {
- style.clone_from(&Color::Red.bold());
-
- true
- }
- _ => false,
+fn get_mod_style(user_uid: Option<u32>, module: &Module) -> Style {
+ match user_uid {
+ Some(0) => module
+ .config_value_style("style_root")
+ .unwrap_or_else(|| Color::Red.bold()),
+ _ => module
+ .config_value_style("style_user")
+ .unwrap_or_else(|| Color::Yellow.bold()),
}
}