Only restore cursor position after an append if we still have cursor > anchor

Fixes #1158
This commit is contained in:
Maxime Coste 2017-01-25 13:36:06 +00:00
parent 2475ffa612
commit aa7241067e

View File

@ -988,7 +988,7 @@ class Insert : public InputMode
public: public:
Insert(InputHandler& input_handler, InsertMode mode, int count) Insert(InputHandler& input_handler, InsertMode mode, int count)
: InputMode(input_handler), : InputMode(input_handler),
m_insert_mode(mode), m_restore_cursor(mode == InsertMode::Append),
m_edition(context()), m_edition(context()),
m_completer(context()), m_completer(context()),
m_autoshowcompl(true), m_autoshowcompl(true),
@ -1003,7 +1003,7 @@ public:
last_insert().keys.clear(); last_insert().keys.clear();
last_insert().disable_hooks = context().hooks_disabled(); last_insert().disable_hooks = context().hooks_disabled();
context().hooks().run_hook("InsertBegin", "", context()); context().hooks().run_hook("InsertBegin", "", context());
prepare(m_insert_mode, count); prepare(mode, count);
if (context().has_client() and if (context().has_client() and
context().options()["readonly"].get<bool>()) context().options()["readonly"].get<bool>())
@ -1014,11 +1014,14 @@ public:
~Insert() override ~Insert() override
{ {
auto& selections = context().selections(); auto& selections = context().selections();
if (m_restore_cursor)
{
for (auto& sel : selections) for (auto& sel : selections)
{ {
if (m_insert_mode == InsertMode::Append and sel.cursor().column > 0) if (sel.cursor() > sel.anchor() and sel.cursor().column > 0)
sel.cursor() = context().buffer().char_prev(sel.cursor()); sel.cursor() = context().buffer().char_prev(sel.cursor());
} }
}
selections.avoid_eol(); selections.avoid_eol();
} }
@ -1299,9 +1302,9 @@ private:
buffer.check_invariant(); buffer.check_invariant();
} }
InsertMode m_insert_mode;
ScopedEdition m_edition; ScopedEdition m_edition;
InsertCompleter m_completer; InsertCompleter m_completer;
bool m_restore_cursor;
bool m_autoshowcompl; bool m_autoshowcompl;
Timer m_idle_timer; Timer m_idle_timer;
bool m_in_end = false; bool m_in_end = false;