summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2021-10-09 15:43:43 +1100
committerMaxime Coste <mawww@kakoune.org>2021-10-09 15:43:43 +1100
commitddcfa0f0e54a157c7a819bdd34d79ee2d4ae7ef2 (patch)
tree1257b9d952127cf8ee9425634b333a35ccdd6822 /src
parent21494e5d7890935f9c45c326dd278671b7c02042 (diff)
parent0d87d70bd1370a1f140f774f987fb520cae003b6 (diff)
Merge remote-tracking branch 'lenormf/fix-1840'
Diffstat (limited to 'src')
-rw-r--r--src/context.cc32
-rw-r--r--src/context.hh5
-rw-r--r--src/normal.cc1
3 files changed, 26 insertions, 12 deletions
diff --git a/src/context.cc b/src/context.cc
index 07259c97..efa91938 100644
--- a/src/context.cc
+++ b/src/context.cc
@@ -172,12 +172,6 @@ void Context::change_buffer(Buffer& buffer)
if (has_buffer() and m_edition_level > 0)
this->buffer().commit_undo_group();
- if (has_buffer())
- {
- auto* current = &this->buffer();
- m_last_buffer = contains(BufferManager::instance(), current) ? current : nullptr;
- }
-
if (has_client())
{
client().info_hide();
@@ -197,8 +191,6 @@ void Context::change_buffer(Buffer& buffer)
void Context::forget_buffer(Buffer& buffer)
{
m_jump_list.forget_buffer(buffer);
- if (m_last_buffer.get() == &buffer)
- m_last_buffer = nullptr;
if (&this->buffer() != &buffer)
return;
@@ -206,7 +198,29 @@ void Context::forget_buffer(Buffer& buffer)
if (is_editing() && has_input_handler())
input_handler().reset_normal_mode();
- change_buffer(m_last_buffer ? *m_last_buffer : BufferManager::instance().get_first_buffer());
+ auto last_buffer = this->last_buffer();
+ change_buffer(last_buffer ? *last_buffer : BufferManager::instance().get_first_buffer());
+}
+
+Buffer* Context::last_buffer() const
+{
+ const auto jump_list = m_jump_list.get_as_list();
+ if (jump_list.empty())
+ return nullptr;
+
+ auto predicate = [this](const auto& sels) {
+ return &sels.buffer() != &this->buffer();
+ };
+
+ auto next_buffer = find_if(jump_list.subrange(m_jump_list.current_index()-1),
+ predicate);
+ if (next_buffer != jump_list.end())
+ return &next_buffer->buffer();
+
+ auto previous_buffer = find_if(jump_list.subrange(0, m_jump_list.current_index()) | reverse(),
+ predicate);
+
+ return previous_buffer != jump_list.rend() ? &previous_buffer->buffer() : nullptr;
}
SelectionList& Context::selections()
diff --git a/src/context.hh b/src/context.hh
index 728c4cad..fd29b897 100644
--- a/src/context.hh
+++ b/src/context.hh
@@ -35,6 +35,8 @@ struct JumpList
size_t current_index() const { return m_current; }
+ ConstArrayView<SelectionList> get_as_list() const { return m_jumps; }
+
private:
using Contents = Vector<SelectionList, MemoryDomain::Selections>;
Contents m_jumps;
@@ -135,7 +137,7 @@ public:
void repeat_last_select() { if (m_last_select) m_last_select(*this); }
- Buffer* last_buffer() const { return m_last_buffer.get(); }
+ Buffer* last_buffer() const;
private:
void begin_edition();
void end_edition();
@@ -149,7 +151,6 @@ private:
SafePtr<InputHandler> m_input_handler;
SafePtr<Window> m_window;
SafePtr<Client> m_client;
- SafePtr<Buffer> m_last_buffer;
Optional<SelectionList> m_selections;
diff --git a/src/normal.cc b/src/normal.cc
index 16ed8c64..396a2eef 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -281,7 +281,6 @@ void goto_commands(Context& context, NormalParams params)
if (not target)
{
throw runtime_error("no last buffer");
- break;
}
context.push_jump();
context.change_buffer(*target);