summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-06-18 20:20:58 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-06-18 20:20:58 +0100
commit1c697647749ee559df7cd39e512bf10680678fe7 (patch)
tree7f5d0682e3caa5ecace7bdaf2378ee634abb5441 /src
parentcbcc05396bbadaae2f5710c59aeff9ef60095f7a (diff)
parenta5ff40c10716f3e5ef0de8536b5b436c47162975 (diff)
Merge branch 'master' into hierarchical-highlighters
Diffstat (limited to 'src')
-rw-r--r--src/buffer_utils.cc2
-rw-r--r--src/command_manager.cc5
-rw-r--r--src/shell_manager.cc30
-rw-r--r--src/shell_manager.hh1
4 files changed, 25 insertions, 13 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc
index f05db777..5f8cb9fd 100644
--- a/src/buffer_utils.cc
+++ b/src/buffer_utils.cc
@@ -64,6 +64,7 @@ Buffer* create_fifo_buffer(String name, int fd, bool scroll)
buffer->flags() &= ~Buffer::Flags::Fifo;
buffer->flags() &= ~Buffer::Flags::NoUndo;
close(fifo);
+ buffer->run_hook_in_own_context("BufCloseFifo", "");
delete &watcher;
}
});
@@ -74,6 +75,7 @@ Buffer* create_fifo_buffer(String name, int fd, bool scroll)
if (buffer->flags() & Buffer::Flags::Fifo)
{
close(watcher->fd());
+ buffer->run_hook_in_own_context("BufCloseFifo", "");
delete watcher;
}
});
diff --git a/src/command_manager.cc b/src/command_manager.cc
index a99f89b3..874d0290 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -55,6 +55,7 @@ struct Token
ShellExpand,
RegisterExpand,
OptionExpand,
+ ValExpand,
CommandSeparator
};
Token() : m_type(Type::Raw) {}
@@ -150,6 +151,8 @@ Token::Type token_type(StringView type_name)
return Token::Type::RegisterExpand;
else if (type_name == "opt")
return Token::Type::OptionExpand;
+ else if (type_name == "val")
+ return Token::Type::ValExpand;
else if (type_name == "rec")
return Token::Type::RawEval;
else if (throw_on_invalid)
@@ -316,6 +319,8 @@ String eval_token(const Token& token, Context& context,
return RegisterManager::instance()[content].values(context)[0];
case Token::Type::OptionExpand:
return context.options()[content].get_as_string();
+ case Token::Type::ValExpand:
+ return ShellManager::instance().get_val(content, context);
case Token::Type::RawEval:
return eval(content, context, shell_params, env_vars);
case Token::Type::Raw:
diff --git a/src/shell_manager.cc b/src/shell_manager.cc
index d7caceb5..08c34160 100644
--- a/src/shell_manager.cc
+++ b/src/shell_manager.cc
@@ -108,21 +108,12 @@ String ShellManager::pipe(StringView input,
setenv(("kak_" + name).c_str(), local_var->second.c_str(), 1);
else
{
- auto env_var = std::find_if(
- m_env_vars.begin(), m_env_vars.end(),
- [&](const std::pair<Regex, EnvVarRetriever>& pair)
- { return boost::regex_match(name.begin(), name.end(),
- pair.first); });
-
- if (env_var != m_env_vars.end())
+ try
{
- try
- {
- String value = env_var->second(name, context);
- setenv(("kak_"_str + name).c_str(), value.c_str(), 1);
- }
- catch (runtime_error&) {}
+ String value = get_val(name, context);
+ setenv(("kak_"_str + name).c_str(), value.c_str(), 1);
}
+ catch (runtime_error&) {}
}
++it;
@@ -149,4 +140,17 @@ void ShellManager::register_env_var(StringView regex,
m_env_vars.push_back({ Regex(regex.begin(), regex.end()), std::move(retriever) });
}
+String ShellManager::get_val(StringView name, const Context& context) const
+{
+ auto env_var = std::find_if(
+ m_env_vars.begin(), m_env_vars.end(),
+ [&](const std::pair<Regex, EnvVarRetriever>& pair)
+ { return boost::regex_match(name.begin(), name.end(),
+ pair.first); });
+
+ if (env_var == m_env_vars.end())
+ throw runtime_error("no such env var: " + name);
+ return env_var->second(name, context);
+}
+
}
diff --git a/src/shell_manager.hh b/src/shell_manager.hh
index 16a5f27e..f5d27a03 100644
--- a/src/shell_manager.hh
+++ b/src/shell_manager.hh
@@ -28,6 +28,7 @@ public:
int* exit_status = nullptr);
void register_env_var(StringView regex, EnvVarRetriever retriever);
+ String get_val(StringView name, const Context& context) const;
private:
std::vector<std::pair<Regex, EnvVarRetriever>> m_env_vars;