Collapse jumps based on current index change
The previous method, while likely more correct, could restore jump lists containing references to already removed buffers.
This commit is contained in:
parent
924f30840b
commit
1ad3b87302
|
@ -1754,18 +1754,17 @@ void context_wrap(const ParametersParser& parser, Context& context, StringView d
|
|||
else
|
||||
{
|
||||
const bool collapse_jumps = not (c.flags() & Context::Flags::Draft) and context.has_buffer();
|
||||
auto original_jump_list = collapse_jumps ? c.jump_list() : Optional<JumpList>{};
|
||||
auto& jump_list = c.jump_list();
|
||||
const size_t prev_index = jump_list.current_index();
|
||||
auto jump = collapse_jumps ? c.selections() : Optional<SelectionList>{};
|
||||
|
||||
func(parser, c);
|
||||
|
||||
// If the jump list got mutated, collapse all jumps into a single one from original selections
|
||||
if (collapse_jumps and c.jump_list() != *original_jump_list)
|
||||
{
|
||||
original_jump_list->push(std::move(*jump));
|
||||
if (c.jump_list() != *original_jump_list)
|
||||
c.jump_list() = std::move(*original_jump_list);
|
||||
}
|
||||
if (auto index = jump_list.current_index();
|
||||
collapse_jumps and index > prev_index and
|
||||
contains(BufferManager::instance(), &jump->buffer()))
|
||||
jump_list.push(std::move(*jump), prev_index);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -76,8 +76,14 @@ void Context::print_status(DisplayLine status) const
|
|||
client().print_status(std::move(status));
|
||||
}
|
||||
|
||||
void JumpList::push(SelectionList jump)
|
||||
void JumpList::push(SelectionList jump, Optional<size_t> index)
|
||||
{
|
||||
if (index)
|
||||
{
|
||||
m_current = *index;
|
||||
kak_assert(m_current <= m_jumps.size());
|
||||
}
|
||||
|
||||
if (m_current != m_jumps.size())
|
||||
m_jumps.erase(m_jumps.begin()+m_current+1, m_jumps.end());
|
||||
m_jumps.erase(std::remove(begin(m_jumps), end(m_jumps), jump),
|
||||
|
|
|
@ -21,7 +21,7 @@ class AliasRegistry;
|
|||
|
||||
struct JumpList
|
||||
{
|
||||
void push(SelectionList jump);
|
||||
void push(SelectionList jump, Optional<size_t> index = {});
|
||||
const SelectionList& forward(Context& context, int count);
|
||||
const SelectionList& backward(Context& context, int count);
|
||||
void forget_buffer(Buffer& buffer);
|
||||
|
@ -33,6 +33,8 @@ struct JumpList
|
|||
|
||||
friend bool operator!=(const JumpList& lhs, const JumpList& rhs) { return not (lhs == rhs); }
|
||||
|
||||
size_t current_index() const { return m_current; }
|
||||
|
||||
private:
|
||||
using Contents = Vector<SelectionList, MemoryDomain::Selections>;
|
||||
Contents m_jumps;
|
||||
|
|
Loading…
Reference in New Issue
Block a user