use SelectionsAndCaptures to store jumps
This commit is contained in:
parent
14f980e4e0
commit
9c368c85d6
|
@ -100,23 +100,25 @@ struct Context
|
|||
using Insertion = std::pair<InsertMode, std::vector<Key>>;
|
||||
Insertion& last_insert() { return m_last_insert; }
|
||||
|
||||
using Jump = std::pair<safe_ptr<Buffer>, BufferCoord>;
|
||||
void push_jump()
|
||||
{
|
||||
Jump jump{safe_ptr<Buffer>{&buffer()},
|
||||
editor().selections().back().last().coord()};
|
||||
const SelectionAndCaptures& jump = editor().selections().back();
|
||||
if (m_current_jump != m_jump_list.end())
|
||||
{
|
||||
m_jump_list.erase(m_current_jump+1, m_jump_list.end());
|
||||
if (*m_current_jump == jump)
|
||||
return;
|
||||
auto begin = m_current_jump;
|
||||
// when jump overlaps with m_current_jump, we replace m_current_jump
|
||||
// instead of pushing after it.
|
||||
if (&begin->first().buffer() != &jump.first().buffer() or
|
||||
not overlaps(*begin, jump))
|
||||
++begin;
|
||||
m_jump_list.erase(begin, m_jump_list.end());
|
||||
}
|
||||
|
||||
m_jump_list.push_back(jump);
|
||||
m_current_jump = m_jump_list.end();
|
||||
}
|
||||
|
||||
Jump jump_forward()
|
||||
SelectionAndCaptures jump_forward()
|
||||
{
|
||||
if (m_current_jump != m_jump_list.end() and
|
||||
m_current_jump + 1 != m_jump_list.end())
|
||||
|
@ -124,7 +126,7 @@ struct Context
|
|||
throw runtime_error("no next jump");
|
||||
}
|
||||
|
||||
Jump jump_backward()
|
||||
SelectionAndCaptures jump_backward()
|
||||
{
|
||||
if (m_current_jump != m_jump_list.begin())
|
||||
{
|
||||
|
@ -142,12 +144,12 @@ struct Context
|
|||
{
|
||||
for (auto it = m_jump_list.begin(); it != m_jump_list.end();)
|
||||
{
|
||||
if (it->first == &buffer)
|
||||
if (&it->first().buffer() == &buffer)
|
||||
{
|
||||
if (it < m_current_jump)
|
||||
--m_current_jump;
|
||||
else if (it == m_current_jump)
|
||||
m_current_jump = m_jump_list.end();
|
||||
m_current_jump = m_jump_list.end()-1;
|
||||
|
||||
it = m_jump_list.erase(it);
|
||||
}
|
||||
|
@ -165,9 +167,8 @@ private:
|
|||
Insertion m_last_insert = {InsertMode::Insert, {}};
|
||||
int m_numeric_param = 0;
|
||||
|
||||
using JumpList = std::vector<Jump>;
|
||||
JumpList m_jump_list;
|
||||
JumpList::iterator m_current_jump = m_jump_list.begin();
|
||||
SelectionAndCapturesList m_jump_list;
|
||||
SelectionAndCapturesList::iterator m_current_jump = m_jump_list.begin();
|
||||
};
|
||||
|
||||
}
|
||||
|
|
33
src/main.cc
33
src/main.cc
|
@ -332,30 +332,21 @@ void select_to_next_char(Context& context)
|
|||
});
|
||||
}
|
||||
|
||||
void jump_forward(Context& context)
|
||||
enum class JumpDirection { Forward, Backward };
|
||||
template<JumpDirection direction>
|
||||
void jump(Context& context)
|
||||
{
|
||||
auto jump = context.jump_forward();
|
||||
auto jump = (direction == JumpDirection::Forward) ?
|
||||
context.jump_forward() : context.jump_backward();
|
||||
|
||||
BufferManager::instance().set_last_used_buffer(*jump.first);
|
||||
if (jump.first != &context.buffer())
|
||||
Buffer& buffer = const_cast<Buffer&>(jump.first().buffer());
|
||||
BufferManager::instance().set_last_used_buffer(buffer);
|
||||
if (&buffer != &context.buffer())
|
||||
{
|
||||
auto& manager = ClientManager::instance();
|
||||
context.change_editor(manager.get_unused_window_for_buffer(*jump.first));
|
||||
context.change_editor(manager.get_unused_window_for_buffer(buffer));
|
||||
}
|
||||
context.editor().select(jump.first->iterator_at(jump.second));
|
||||
}
|
||||
|
||||
void jump_backward(Context& context)
|
||||
{
|
||||
auto jump = context.jump_backward();
|
||||
|
||||
BufferManager::instance().set_last_used_buffer(*jump.first);
|
||||
if (jump.first != &context.buffer())
|
||||
{
|
||||
auto& manager = ClientManager::instance();
|
||||
context.change_editor(manager.get_unused_window_for_buffer(*jump.first));
|
||||
}
|
||||
context.editor().select(jump.first->iterator_at(jump.second));
|
||||
context.editor().select(SelectionAndCapturesList{ jump });
|
||||
}
|
||||
|
||||
String runtime_directory()
|
||||
|
@ -478,8 +469,8 @@ std::unordered_map<Key, std::function<void (Context& context)>> keymap =
|
|||
{ { Key::Modifiers::None, Key::PageUp }, do_scroll<Key::PageUp> },
|
||||
{ { Key::Modifiers::None, Key::PageDown }, do_scroll<Key::PageDown> },
|
||||
|
||||
{ { Key::Modifiers::Control, 'i' }, jump_forward },
|
||||
{ { Key::Modifiers::Control, 'o' }, jump_backward },
|
||||
{ { Key::Modifiers::Control, 'i' }, jump<JumpDirection::Forward> },
|
||||
{ { Key::Modifiers::Control, 'o' }, jump<JumpDirection::Backward> },
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user