diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2015-11-02 19:49:58 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2015-11-02 19:51:59 +0000 |
| commit | c8d24176469124dd74567caccc45560ea7ad23d7 (patch) | |
| tree | 0584ac07760625406c67eac93bd23a7ae3d2da89 /src | |
| parent | 17eef4a7dc3883b725069616d90db3a519837638 (diff) | |
Support horizontal centering in view commands (using m)
Fixes #442
Diffstat (limited to 'src')
| -rw-r--r-- | src/normal.cc | 15 | ||||
| -rw-r--r-- | src/window.cc | 19 | ||||
| -rw-r--r-- | src/window.hh | 5 |
3 files changed, 29 insertions, 10 deletions
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<CharCount>(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,14 +56,20 @@ void Window::center_line(LineCount buffer_line) display_line_at(buffer_line, m_dimensions.line/2_line); } -void Window::scroll(LineCount offset) +void Window::scroll(CharCount offset) { - m_position.line = std::max(0_line, m_position.line + offset); + m_position.column = std::max(0_char, m_position.column + offset); } -void Window::scroll(CharCount offset) +void Window::display_column_at(CharCount buffer_column, CharCount display_column) { - m_position.column = std::max(0_char, m_position.column + offset); + 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 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); |
