aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs2
-rw-r--r--src/run/builtin.rs28
2 files changed, 23 insertions, 7 deletions
diff --git a/src/main.rs b/src/main.rs
index 19e7743..c4113f9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -55,6 +55,7 @@ pub struct Session {
line: LineBuf,
history: Vec<BString>,
dispatch: CommandDispatch,
+ prev_path: BString,
}
/// relative path -- in case it is a proper subpath the result starts with a slash `/`
@@ -138,6 +139,7 @@ fn event_loop() {
line: LineBuf::new(),
history: Vec::new(),
dispatch: CommandDispatch::new(),
+ prev_path: vec![b'.'],
};
print!("{}", se.prompt());
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index b342dd0..e715bd7 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -1,6 +1,6 @@
#![allow(non_camel_case_types)]
-use std::{fs::OpenOptions, path::PathBuf};
+use std::{env::*, fs::OpenOptions, path::PathBuf};
use super::Builtin;
use crate::*;
@@ -10,15 +10,29 @@ impl Builtin for cd {
fn name(&self) -> &str {
"cd"
}
- fn mod_session(&self, _: &mut Session, args: &[BString]) {
- let target: &Path = match args.get(0).map(|v| &v[..]) {
- Some(b"-") => todo!("prev"),
- Some(path) => OsStr::from_bytes(path).as_ref(),
- None => todo!("homedir"),
+ fn mod_session(&self, se: &mut Session, args: &[BString]) {
+ let mut dir = match current_dir() {
+ Ok(path) => path.as_os_str().as_bytes().to_vec(),
+ Err(_) => vec![b'.'],
};
+ std::mem::swap(&mut dir, &mut se.prev_path);
+
+ match args.get(0).map(|v| &v[..]) {
+ Some(b"-") => {
+ let _ = set_current_dir(OsStr::from_bytes(&dir));
+ }
+ Some(path) => {
+ let _ = set_current_dir(OsStr::from_bytes(path));
+ }
+ None => {
+ if let Some(home) = std::env::var_os("HOME") {
+ let _ = set_current_dir(home);
+ }
+ }
+ }
+
// TODO: let mod_session builtins return nonzero exit code
- let _ = std::env::set_current_dir(target);
}
}