forked from extern/nushell
Add the ability to remove and list aliases (#3879)
* Add the ability to remove and list aliases * Fix failing unit tests * Add a test to check unalias shadowing blocks
This commit is contained in:
@ -1902,7 +1902,7 @@ fn parse_call(
|
||||
)),
|
||||
);
|
||||
}
|
||||
} else if lite_cmd.parts[0].item == "alias" {
|
||||
} else if lite_cmd.parts[0].item == "alias" || lite_cmd.parts[0].item == "unalias" {
|
||||
let error = parse_alias(&lite_cmd, scope);
|
||||
if error.is_none() {
|
||||
return (Some(ClassifiedCommand::Internal(internal_command)), None);
|
||||
@ -2048,26 +2048,41 @@ fn expand_shorthand_forms(
|
||||
}
|
||||
|
||||
fn parse_alias(call: &LiteCommand, scope: &dyn ParserScope) -> Option<ParseError> {
|
||||
if call.parts.len() == 2 && (call.parts[1].item == "--help" || (call.parts[1].item == "-h")) {
|
||||
return None;
|
||||
}
|
||||
if call.parts[0].item == "alias" {
|
||||
if (call.parts.len() == 1)
|
||||
|| (call.parts.len() == 2
|
||||
&& (call.parts[1].item == "--help" || (call.parts[1].item == "-h")))
|
||||
{
|
||||
return None;
|
||||
}
|
||||
if call.parts.len() < 4 {
|
||||
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
|
||||
}
|
||||
|
||||
if call.parts.len() < 4 {
|
||||
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
|
||||
}
|
||||
if call.parts[0].item != "alias" {
|
||||
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
|
||||
}
|
||||
|
||||
if call.parts[0].item != "alias" {
|
||||
return Some(ParseError::mismatch("alias", call.parts[0].clone()));
|
||||
}
|
||||
|
||||
if call.parts[2].item != "=" {
|
||||
return Some(ParseError::mismatch("=", call.parts[2].clone()));
|
||||
if call.parts[2].item != "=" {
|
||||
return Some(ParseError::mismatch("=", call.parts[2].clone()));
|
||||
}
|
||||
} else {
|
||||
// unalias
|
||||
if call.parts.len() != 2 {
|
||||
return Some(ParseError::mismatch("unalias", call.parts[0].clone()));
|
||||
}
|
||||
}
|
||||
|
||||
let name = call.parts[1].item.clone();
|
||||
let args: Vec<_> = call.parts.iter().skip(3).cloned().collect();
|
||||
|
||||
scope.add_alias(&name, args);
|
||||
match call.parts[0].item.as_str() {
|
||||
"alias" => scope.add_alias(&name, args),
|
||||
"unalias" => {
|
||||
scope.remove_alias(&name);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
None
|
||||
}
|
||||
|
@ -13,6 +13,8 @@ pub trait ParserScope: Debug {
|
||||
|
||||
fn get_alias(&self, name: &str) -> Option<Vec<Spanned<String>>>;
|
||||
|
||||
fn remove_alias(&self, name: &str);
|
||||
|
||||
fn add_alias(&self, name: &str, replacement: Vec<Spanned<String>>);
|
||||
|
||||
fn enter_scope(&self);
|
||||
|
Reference in New Issue
Block a user