summaryrefslogtreecommitdiff
path: root/src/command_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-12-01 20:07:14 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-12-01 20:07:14 +0000
commitb2648053f90ae076f94d59f551e512a73db2f8db (patch)
tree68ea70144b5d2871617ccfb5ce73dbad5ddc56e8 /src/command_manager.cc
parent550a95a3d7c74a7090000d07a01eea0974454a86 (diff)
Add argument expansion support
Diffstat (limited to 'src/command_manager.cc')
-rw-r--r--src/command_manager.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 0f689fa7..ad7359b5 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -54,6 +54,7 @@ struct Token
RegisterExpand,
OptionExpand,
ValExpand,
+ ArgExpand,
CommandSeparator
};
Token() : m_type(Type::Raw) {}
@@ -198,6 +199,8 @@ Token::Type token_type(StringView type_name)
return Token::Type::OptionExpand;
else if (type_name == "val")
return Token::Type::ValExpand;
+ else if (type_name == "arg")
+ return Token::Type::ArgExpand;
else if (throw_on_invalid)
throw unknown_expand{type_name};
else
@@ -343,6 +346,20 @@ String expand_token(const Token& token, const Context& context,
return it->value;
return ShellManager::instance().get_val(content, context);
}
+ case Token::Type::ArgExpand:
+ {
+ if (content == "#")
+ return to_string(shell_context.params.size());
+ else if (content == "@")
+ return join(shell_context.params, ' ');
+
+ const int arg = str_to_int(content)-1;
+ if (arg < 0)
+ throw runtime_error("invalid argument index");
+ if (arg < shell_context.params.size())
+ return shell_context.params[arg];
+ return {};
+ }
case Token::Type::RawEval:
return expand(content, context, shell_context);
case Token::Type::Raw: