diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-06-18 20:20:58 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-06-18 20:20:58 +0100 |
| commit | 1c697647749ee559df7cd39e512bf10680678fe7 (patch) | |
| tree | 7f5d0682e3caa5ecace7bdaf2378ee634abb5441 /src | |
| parent | cbcc05396bbadaae2f5710c59aeff9ef60095f7a (diff) | |
| parent | a5ff40c10716f3e5ef0de8536b5b436c47162975 (diff) | |
Merge branch 'master' into hierarchical-highlighters
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer_utils.cc | 2 | ||||
| -rw-r--r-- | src/command_manager.cc | 5 | ||||
| -rw-r--r-- | src/shell_manager.cc | 30 | ||||
| -rw-r--r-- | src/shell_manager.hh | 1 |
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; |
