summaryrefslogtreecommitdiff
path: root/src/window.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-09-28 14:23:43 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-09-28 14:23:43 +0000
commit43fb64a91359c078b9692cfc87f0b035d3f25f5f (patch)
treeb1c9a61d0e1f3f79900838bf9bc09dcc4d084717 /src/window.cc
parent309b722df94a365d71198afc6803b3d0f42c0d47 (diff)
Window: selection behaviour now depends on a window state
more vi-like behaviour, hit the v key to toggle append selection mode, this means much more keys become available for mapping, as caps are now longer reserved to append mode.
Diffstat (limited to 'src/window.cc')
-rw-r--r--src/window.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/window.cc b/src/window.cc
index 85ab632d..0631416f 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -37,6 +37,7 @@ Window::Window(Buffer& buffer)
: m_buffer(buffer),
m_position(0, 0),
m_dimensions(0, 0),
+ m_select_mode(SelectMode::Normal),
m_current_inserter(nullptr)
{
m_selections.push_back(Selection(buffer.begin(), buffer.begin()));
@@ -153,11 +154,11 @@ void Window::empty_selections()
m_selections.push_back(std::move(sel));
}
-void Window::select(bool append, const Selector& selector)
+void Window::select(const Selector& selector)
{
check_invariant();
- if (not append)
+ if (m_select_mode == SelectMode::Normal)
{
Selection sel = selector(m_selections.back().last());
m_selections.clear();
@@ -183,7 +184,16 @@ BufferString Window::selection_content() const
void Window::move_cursor(const WindowCoord& offset)
{
- move_cursor_to(cursor_position() + offset);
+ if (m_select_mode == SelectMode::Normal)
+ move_cursor_to(cursor_position() + offset);
+ else
+ {
+ for (auto& sel : m_selections)
+ {
+ WindowCoord pos = line_and_column_at(sel.last());
+ sel = Selection(sel.first(), iterator_at(pos + offset));
+ }
+ }
}
void Window::move_cursor_to(const WindowCoord& new_pos)