summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-11-02 19:49:58 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-11-02 19:51:59 +0000
commitc8d24176469124dd74567caccc45560ea7ad23d7 (patch)
tree0584ac07760625406c67eac93bd23a7ae3d2da89 /src
parent17eef4a7dc3883b725069616d90db3a519837638 (diff)
Support horizontal centering in view commands (using m)
Fixes #442
Diffstat (limited to 'src')
-rw-r--r--src/normal.cc15
-rw-r--r--src/window.cc19
-rw-r--r--src/window.hh5
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);