diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2015-11-25 23:40:38 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2015-11-25 23:40:38 +0000 |
| commit | 001da44e11dcea58fbeb545aa256cb930ea7e857 (patch) | |
| tree | a26cf97c3a78628ddce00b0d4dc655a85353c05f /src | |
| parent | 3644f2a056e4339d032c4806f7781f941159c963 (diff) | |
Add -save-regs <regs> option to exec and eval to preserve registers
Fixes #279
Diffstat (limited to 'src')
| -rw-r--r-- | src/commands.cc | 63 |
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) |
