Add simple cd

This commit is contained in:
JT 2021-10-03 09:16:37 +13:00
parent e4e1b7a11e
commit 91090e1db1
6 changed files with 52 additions and 1 deletions

1
Cargo.lock generated
View File

@ -499,6 +499,7 @@ dependencies = [
"glob",
"nu-engine",
"nu-json",
"nu-path",
"nu-protocol",
"nu-table",
"sysinfo",

View File

@ -8,6 +8,7 @@ edition = "2018"
[dependencies]
nu-engine = { path = "../nu-engine" }
nu-json = { path = "../nu-json" }
nu-path = { path = "../nu-path" }
nu-protocol = { path = "../nu-protocol" }
nu-table = { path = "../nu-table" }

View File

@ -16,6 +16,7 @@ pub fn create_default_context() -> Rc<RefCell<EngineState>> {
working_set.add_decl(Box::new(Alias));
working_set.add_decl(Box::new(Benchmark));
working_set.add_decl(Box::new(BuildString));
working_set.add_decl(Box::new(Cd));
working_set.add_decl(Box::new(Def));
working_set.add_decl(Box::new(Do));
working_set.add_decl(Box::new(Each));

View File

@ -0,0 +1,46 @@
use nu_engine::CallExt;
use nu_protocol::ast::Call;
use nu_protocol::engine::{Command, EvaluationContext};
use nu_protocol::{Signature, SyntaxShape, Value};
pub struct Cd;
impl Command for Cd {
fn name(&self) -> &str {
"cd"
}
fn usage(&self) -> &str {
"Change directory."
}
fn signature(&self) -> nu_protocol::Signature {
Signature::build("cd").optional("path", SyntaxShape::FilePath, "the path to change to")
}
fn run(
&self,
context: &EvaluationContext,
call: &Call,
_input: Value,
) -> Result<nu_protocol::Value, nu_protocol::ShellError> {
let path: Option<String> = call.opt(context, 0)?;
let path = match path {
Some(path) => {
let path = nu_path::expand_tilde(path);
path.to_string_lossy().to_string()
}
None => {
let path = nu_path::expand_tilde("~");
path.to_string_lossy().to_string()
}
};
let _ = std::env::set_current_dir(&path);
//FIXME: this only changes the current scope, but instead this environment variable
//should probably be a block that loads the information from the state in the overlay
context.add_env_var("PWD".into(), path);
Ok(Value::Nothing { span: call.head })
}
}

View File

@ -1,3 +1,5 @@
mod cd;
mod ls;
pub use cd::Cd;
pub use ls::Ls;

View File

@ -86,7 +86,7 @@ impl SyntaxShape {
SyntaxShape::Custom(custom, _) => custom.to_type(),
SyntaxShape::Duration => Type::Duration,
SyntaxShape::Expression => Type::Unknown,
SyntaxShape::FilePath => Type::FilePath,
SyntaxShape::FilePath => Type::String,
SyntaxShape::Filesize => Type::Filesize,
SyntaxShape::FullCellPath => Type::Unknown,
SyntaxShape::GlobPattern => Type::String,