summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-05-29 05:19:27 +0000
committerMaxime Coste <frrrwww@gmail.com>2012-05-29 05:19:27 +0000
commit8fedbbf07bdb972a82af2923cbe914439389c808 (patch)
treec11267716602ee6982d948ef7241434b9f25a069
parente57ddd3bab1445caaf001d80f117c878762adc69 (diff)
ShellManager::eval now takes an additional env_var map
-rw-r--r--src/command_manager.cc2
-rw-r--r--src/main.cc2
-rw-r--r--src/shell_manager.cc17
-rw-r--r--src/shell_manager.hh4
4 files changed, 17 insertions, 8 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc
index 800b3a04..d348d976 100644
--- a/src/command_manager.cc
+++ b/src/command_manager.cc
@@ -99,7 +99,7 @@ static void shell_eval(std::vector<String>& params,
const String& cmdline,
const Context& context)
{
- String output = ShellManager::instance().eval(cmdline, context);
+ String output = ShellManager::instance().eval(cmdline, context, {});
TokenList tokens = split(output);
for (auto it = tokens.begin(); it != tokens.end(); ++it)
diff --git a/src/main.cc b/src/main.cc
index 39f5a4ec..afde43be 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -215,7 +215,7 @@ void do_pipe(Editor& editor, int count)
editor.buffer().begin_undo_group();
for (auto& sel : const_cast<const Editor&>(editor).selections())
{
- String new_content = ShellManager::instance().eval(cmdline, main_context);
+ String new_content = ShellManager::instance().eval(cmdline, main_context, {});
editor.buffer().modify(Modification::make_erase(sel.begin(), sel.end()));
editor.buffer().modify(Modification::make_insert(sel.begin(), new_content));
}
diff --git a/src/shell_manager.cc b/src/shell_manager.cc
index f750ab05..48688494 100644
--- a/src/shell_manager.cc
+++ b/src/shell_manager.cc
@@ -12,7 +12,8 @@ ShellManager::ShellManager()
{
}
-String ShellManager::eval(const String& cmdline, const Context& context)
+String ShellManager::eval(const String& cmdline, const Context& context,
+ const EnvVarMap& env_vars)
{
int write_pipe[2];
int read_pipe[2];
@@ -61,11 +62,17 @@ String ShellManager::eval(const String& cmdline, const Context& context)
assert(false);
assert(name.length() > 0);
- auto env_var = m_env_vars.find(name);
- if (env_var != m_env_vars.end())
+ auto local_var = env_vars.find(name);
+ if (local_var != env_vars.end())
+ setenv(("kak_" + name).c_str(), local_var->second.c_str(), 1);
+ else
{
- String value = env_var->second(context);
- setenv(("kak_" + name).c_str(), value.c_str(), 1);
+ auto env_var = m_env_vars.find(name);
+ if (env_var != m_env_vars.end())
+ {
+ String value = env_var->second(context);
+ setenv(("kak_" + name).c_str(), value.c_str(), 1);
+ }
}
++it;
diff --git a/src/shell_manager.hh b/src/shell_manager.hh
index b67136aa..661e9a4f 100644
--- a/src/shell_manager.hh
+++ b/src/shell_manager.hh
@@ -11,13 +11,15 @@ namespace Kakoune
class Context;
typedef std::function<String (const Context&)> EnvVarRetriever;
+typedef std::unordered_map<String, String> EnvVarMap;
class ShellManager : public Singleton<ShellManager>
{
public:
ShellManager();
- String eval(const String& cmdline, const Context& context);
+ String eval(const String& cmdline, const Context& context,
+ const EnvVarMap& env_vars);
void register_env_var(const String& name, EnvVarRetriever retriever);