summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-11-25 23:40:38 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-11-25 23:40:38 +0000
commit001da44e11dcea58fbeb545aa256cb930ea7e857 (patch)
treea26cf97c3a78628ddce00b0d4dc655a85353c05f /src
parent3644f2a056e4339d032c4806f7781f941159c963 (diff)
Add -save-regs <regs> option to exec and eval to preserve registers
Fixes #279
Diffstat (limited to 'src')
-rw-r--r--src/commands.cc63
1 files changed, 44 insertions, 19 deletions
diff --git a/src/commands.cc b/src/commands.cc
index f85ce7f3..ddaee769 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -1198,7 +1198,8 @@ const ParameterDesc context_wrap_params = {
{ "draft", { false, "run in a disposable context" } },
{ "no-hooks", { false, "disable hooks" } },
{ "with-maps", { false, "use user defined key mapping when executing keys" } },
- { "itersel", { false, "run once for each selection with that selection as the only one" } } },
+ { "itersel", { false, "run once for each selection with that selection as the only one" } },
+ { "save-regs", { true, "restore all given registers after execution" } } },
ParameterDesc::Flags::SwitchesOnlyAtStart, 1
};
@@ -1216,6 +1217,41 @@ private:
T m_prev_value;
};
+class RegisterRestorer
+{
+public:
+ RegisterRestorer(char name, const Context& context)
+ : m_name(name)
+ {
+ ConstArrayView<String> save = RegisterManager::instance()[name].values(context);
+ m_save = Vector<String>(save.begin(), save.end());
+ }
+
+ RegisterRestorer(RegisterRestorer&& other) noexcept
+ : m_save(std::move(other.m_save)), m_name(other.m_name)
+ {
+ other.m_name = 0;
+ }
+
+ RegisterRestorer& operator=(RegisterRestorer&& other) noexcept
+ {
+ m_save = std::move(other.m_save);
+ m_name = other.m_name;
+ other.m_name = 0;
+ return *this;
+ }
+
+ ~RegisterRestorer()
+ {
+ if (m_name != 0)
+ RegisterManager::instance()[m_name] = m_save;
+ }
+
+private:
+ Vector<String> m_save;
+ char m_name;
+};
+
template<typename Func>
void context_wrap(const ParametersParser& parser, Context& context, Func func)
{
@@ -1229,6 +1265,13 @@ void context_wrap(const ParametersParser& parser, Context& context, Func func)
context.user_hooks_disabled();
const bool disable_keymaps = not parser.get_switch("with-maps");
+ Vector<RegisterRestorer> saved_registers;
+ if (auto regs = parser.get_switch("save-regs"))
+ {
+ for (auto& r : *regs)
+ saved_registers.emplace_back(r, context);
+ }
+
ClientManager& cm = ClientManager::instance();
if (auto bufnames = parser.get_switch("buffer"))
{
@@ -1652,24 +1695,6 @@ const CommandDesc change_working_directory_cmd = {
}
};
-class RegisterRestorer
-{
-public:
- RegisterRestorer(char name, const Context& context)
- : m_name(name)
- {
- ConstArrayView<String> save = RegisterManager::instance()[name].values(context);
- m_save = Vector<String>(save.begin(), save.end());
- }
-
- ~RegisterRestorer()
- { RegisterManager::instance()[m_name] = m_save; }
-
-private:
- Vector<String> m_save;
- char m_name;
-};
-
}
void exec_keys(ConstArrayView<Key> keys, Context& context)