diff --git a/src/normal.cc b/src/normal.cc index 2ec36d10..28a8c322 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -239,19 +239,23 @@ void view_commands(Context& context, NormalParams params) if (not cp or not context.has_window()) return; - LineCount cursor_line = context.selections().main().cursor().line; + const ByteCoord cursor = context.selections().main().cursor(); Window& window = context.window(); switch (tolower(*cp)) { case 'v': case 'c': - context.window().center_line(cursor_line); + context.window().center_line(cursor.line); + break; + case 'm': + context.window().center_column( + context.buffer()[cursor.line].char_count_to(cursor.column)); break; case 't': - context.window().display_line_at(cursor_line, 0); + context.window().display_line_at(cursor.line, 0); break; case 'b': - context.window().display_line_at(cursor_line, window.dimensions().line-1); + context.window().display_line_at(cursor.line, window.dimensions().line-1); break; case 'h': context.window().scroll(-std::max(1, params.count)); @@ -267,7 +271,8 @@ void view_commands(Context& context, NormalParams params) break; } }, "view", - "v,c: center cursor \n" + "v,c: center cursor (vertically)\n" + "m: center cursor (horzontally)\n" "t: cursor on top \n" "b: cursor on bottom\n" "h: scroll left \n" diff --git a/src/window.cc b/src/window.cc index c2f286c2..d4429407 100644 --- a/src/window.cc +++ b/src/window.cc @@ -40,6 +40,11 @@ Window::~Window() options().unregister_watcher(*this); } +void Window::scroll(LineCount offset) +{ + m_position.line = std::max(0_line, m_position.line + offset); +} + void Window::display_line_at(LineCount buffer_line, LineCount display_line) { if (display_line >= 0 or display_line < m_dimensions.line) @@ -51,16 +56,22 @@ void Window::center_line(LineCount buffer_line) display_line_at(buffer_line, m_dimensions.line/2_line); } -void Window::scroll(LineCount offset) -{ - m_position.line = std::max(0_line, m_position.line + offset); -} - void Window::scroll(CharCount offset) { m_position.column = std::max(0_char, m_position.column + offset); } +void Window::display_column_at(CharCount buffer_column, CharCount display_column) +{ + if (display_column >= 0 or display_column < m_dimensions.column) + m_position.column = std::max(0_char, buffer_column - display_column); +} + +void Window::center_column(CharCount buffer_column) +{ + display_column_at(buffer_column, m_dimensions.column/2_char); +} + size_t Window::compute_hash(const Context& context) const { size_t res = hash_values(m_position, context.ui().dimensions(), context.buffer().timestamp()); diff --git a/src/window.hh b/src/window.hh index 4a3d3701..fd347c79 100644 --- a/src/window.hh +++ b/src/window.hh @@ -23,10 +23,13 @@ public: const CharCoord& dimensions() const { return m_dimensions; } void set_dimensions(CharCoord dimensions); + void scroll(LineCount offset); void center_line(LineCount buffer_line); void display_line_at(LineCount buffer_line, LineCount display_line); - void scroll(LineCount offset); + void scroll(CharCount offset); + void center_column(CharCount buffer_column); + void display_column_at(CharCount buffer_column, CharCount display_column); const DisplayBuffer& update_display_buffer(const Context& context);