From 8fac4e5aff8738b46112f7b4a263040276ceef03 Mon Sep 17 00:00:00 2001 From: Daniel Knuettel Date: Tue, 16 Apr 2024 19:39:50 +0200 Subject: [PATCH] some work --- Cargo.toml | 3 ++ src/make_prompt.rs | 123 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 119 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2539d10..b8b420a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,6 @@ edition = "2021" [[bin]] name = "make_prompt" path = "src/make_prompt.rs" + +[dependencies] +git2="*" diff --git a/src/make_prompt.rs b/src/make_prompt.rs index 785a69e..1198622 100644 --- a/src/make_prompt.rs +++ b/src/make_prompt.rs @@ -1,5 +1,7 @@ use std::fs::File; use std::io::Read; +use std::io::BufReader; +use std::io::BufRead; fn fixed_width(input: &String, len: usize) -> String { @@ -11,9 +13,9 @@ fn fixed_width(input: &String, len: usize) -> String let cut_to = len - 2_usize; let start_from = clen - cut_to; let cutted_result = &input[start_from..]; - let mut result: String = cutted_result.to_owned(); + let mut result: String = String::from(PLACE_HOLDER); - result.push_str(&PLACE_HOLDER); + result.push_str(&cutted_result); return result; } else @@ -69,11 +71,107 @@ fn battery_info(width_to: usize) -> String } } +fn do_get_git_branch(cwd: & std::path::Path) -> String +{ + let default = String::from(""); + match git2::Repository::discover(cwd) + { + Ok(repo) => { + match repo.head() + { + Ok(head) => { + match head.shorthand() + { + Some(branch) => String::from(branch), + None => default + } + }, + Err(_) => default + } + }, + Err(_) => default + } +} +fn get_git_branch(cwd: & std::path::Path) -> String +{ + format!("✶ {}", do_get_git_branch(cwd)) +} + +fn head(from: T, nlines: u64) -> String +{ + let mut res = String::new(); + let mut i = 0; + let mut reader = BufReader::new(from); + loop + { + i += 1; + if i > nlines + { + break; + } + let mut line = String::new(); + let _len = reader.read_line(&mut line); + res.push_str(& line); + + } + res +} + +fn cut_f(input: &String, delimiter: &str, field: u32) -> String +{ + let mut i = 1; + for fld in input.split(delimiter) + { + if i < field + { + i += 1; + continue; + } + return { + if fld.ends_with('\n') + { + fld[..fld.len() - 1].to_string() + } + else + { + fld.to_string() + } + }; + } + String::from("") +} + +fn get_editor() -> String +{ + match std::env::var("EDITOR") + { + Ok(editor) => match std::process::Command::new(editor).arg("--version").stdout(std::process::Stdio::piped()).spawn() + { + Ok(child) => match child.stdout + { + Some(out) => cut_f(&head(out, 1), "-", 1), + None => {eprintln!("editor --version did not give stdout"); String::from("")} + }, + Err(_) => {eprintln!("failed to spawn editor"); String::from("")} + }, + Err(_) => {eprintln!("failed to get $EDITOR"); String::from("")} + } +} + + fn shell_color_str(string_in: &T, color: &str) -> String { format!("\x1b[{color}m{string_in}\x1b[00m") } +fn getenv(varname: &str) -> String +{ + match std::env::var(varname) + { + Ok(hostname) => hostname, + Err(_) => "".to_string() + } +} fn main() { @@ -114,15 +212,26 @@ fn main() args[2].to_string() } }; + print!("\n"); { - print!("{}{}", shell_color_str(&"┌[", SH_GREEN), battery_info(12)); - println!("{}", shell_color_str(&"]", SH_GREEN)); + print!("{}{}", shell_color_str(&"┌[", SH_GREEN) + , battery_info(12)); + print!("{}{}", shell_color_str(&"|", SH_GREEN) + , fixed_width(&get_git_branch(& std::path::Path::new(&cwd)), 12)); + print!("{}{}", shell_color_str(&"|", SH_GREEN) + , fixed_width(&get_editor(), 10)); + print!("{}{}", shell_color_str(&"|", SH_GREEN) + , fixed_width(lastexit, 4)); + println!("{}", shell_color_str(&"]┐", SH_GREEN)); } { - print!("{}", shell_color_str(&"╞[", SH_GREEN)); - println!("{}", shell_color_str(&"]", SH_GREEN)); + print!("{}{}", shell_color_str(&"╞[", SH_GREEN) + , fixed_width(&getenv("HOSTNAME"), 12)); + print!("{}{}", shell_color_str(&"|", SH_GREEN) + , fixed_width(&getenv("USER"), 10)); + println!("{}", shell_color_str(&"]┘", SH_GREEN)); } { print!("{} {}", shell_color_str(&"╞>", SH_GREEN) @@ -131,6 +240,6 @@ fn main() } { - print!("{} {}", shell_color_str(&"└", SH_GREEN), shell_color_str(&"$", SH_PURPLE)); + print!("{} {} ", shell_color_str(&"└", SH_GREEN), shell_color_str(&"$", SH_PURPLE)); } }