diff --git a/src/inbuilt.rs b/src/inbuilt.rs index 1aad682..87126dd 100644 --- a/src/inbuilt.rs +++ b/src/inbuilt.rs @@ -1,8 +1,17 @@ -use std::env; +// Provides Built-In Shell Functions. pub fn cd(args: &[String]) { - let path = args[0].to_string(); - assert!(env::set_current_dir(&path).is_ok()); + let path = if args.is_empty() { + std::env::var("HOME").unwrap_or_default() + } else { + shellexpand::tilde(&args[0]).to_string() + }; + + let status = std::env::set_current_dir(&path); + + if status.is_err() { + println!("cd: no such file or directory: {}", &path); + } } pub fn help() { diff --git a/src/main.rs b/src/main.rs index 68c0957..7b1c593 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,8 +5,6 @@ mod inbuilt; use inbuilt::*; use mlua::prelude::*; -use std::env; -use whoami::{username, devicename}; // Helper function for resolving aliases. fn resolve_alias(config: &mlua::Table, cmd: &str) -> Option { @@ -31,8 +29,8 @@ fn resolve_prompt(config: &mlua::Table) -> String { // Format current working directory. fn fmt_cwd() -> String { - let home = env::var("HOME").unwrap_or_default(); - let cwd = env::current_dir() + let home = std::env::var("HOME").unwrap_or_default(); + let cwd = std::env::current_dir() .ok() .and_then(|p| p.to_str().map(String::from)) .unwrap_or_default(); @@ -48,8 +46,8 @@ fn fmt_cwd() -> String { // Context for shell expansion. fn context(s: &str) -> Option { match s { - "user" => Some(username()), - "host" => Some(devicename()), + "user" => Some(whoami::username()), + "host" => Some(whoami::devicename()), "cwd" => Some(fmt_cwd()), _ => None, }