diff --git a/src/buffer.cc b/src/buffer.cc index f6409cbb..b7034b5c 100644 --- a/src/buffer.cc +++ b/src/buffer.cc @@ -135,7 +135,7 @@ void Buffer::insert(const BufferIterator& position, const BufferString& string) compute_lines(); } -BufferIterator Buffer::iterator_at(const LineAndColumn& line_and_column) const +BufferIterator Buffer::iterator_at(const BufferCoord& line_and_column) const { if (m_lines.empty()) return begin(); @@ -145,9 +145,9 @@ BufferIterator Buffer::iterator_at(const LineAndColumn& line_and_column) const return BufferIterator(*this, m_lines[line] + column); } -LineAndColumn Buffer::line_and_column_at(const BufferIterator& iterator) const +BufferCoord Buffer::line_and_column_at(const BufferIterator& iterator) const { - LineAndColumn result; + BufferCoord result; if (not m_lines.empty()) { result.line = line_at(iterator); @@ -174,12 +174,12 @@ BufferSize Buffer::line_length(BufferPos line) const return end - m_lines[line]; } -LineAndColumn Buffer::clamp(const LineAndColumn& line_and_column) const +BufferCoord Buffer::clamp(const BufferCoord& line_and_column) const { if (m_lines.empty()) - return LineAndColumn(); + return BufferCoord(); - LineAndColumn result(line_and_column.line, line_and_column.column); + BufferCoord result(line_and_column.line, line_and_column.column); result.line = Kakoune::clamp(0, m_lines.size() - 1, result.line); result.column = Kakoune::clamp(0, line_length(result.line), result.column); return result; diff --git a/src/buffer.hh b/src/buffer.hh index dd2762a5..66136f82 100644 --- a/src/buffer.hh +++ b/src/buffer.hh @@ -4,6 +4,8 @@ #include #include +#include "utils.hh" + namespace Kakoune { @@ -13,13 +15,10 @@ typedef int BufferSize; typedef char BufferChar; typedef std::basic_string BufferString; -struct LineAndColumn +struct BufferCoord : LineAndColumn { - BufferPos line; - BufferPos column; - - LineAndColumn(BufferPos line = 0, BufferPos column = 0) - : line(line), column(column) {} + BufferCoord(int line = 0, int column = 0) + : LineAndColumn(line, column) {} }; class BufferIterator @@ -82,10 +81,10 @@ public: BufferSize length() const; - BufferIterator iterator_at(const LineAndColumn& line_and_column) const; - LineAndColumn line_and_column_at(const BufferIterator& iterator) const; + BufferIterator iterator_at(const BufferCoord& line_and_column) const; + BufferCoord line_and_column_at(const BufferIterator& iterator) const; - LineAndColumn clamp(const LineAndColumn& line_and_column) const; + BufferCoord clamp(const BufferCoord& line_and_column) const; const std::string& name() const { return m_name; } diff --git a/src/main.cc b/src/main.cc index 2e91e345..c1e2243a 100644 --- a/src/main.cc +++ b/src/main.cc @@ -15,11 +15,11 @@ void draw_window(Window& window) getmaxyx(stdscr, max_y, max_x); max_y -= 1; - window.set_dimensions(LineAndColumn(max_y, max_x)); + window.set_dimensions(WindowCoord(max_y, max_x)); window.update_display_buffer(); - LineAndColumn position; + WindowCoord position; for (const DisplayAtom& atom : window.display_buffer()) { const std::string& content = atom.content; @@ -64,7 +64,7 @@ void draw_window(Window& window) addch('~'); } - const LineAndColumn& cursor_position = window.cursor_position(); + const WindowCoord& cursor_position = window.cursor_position(); move(cursor_position.line, cursor_position.column); } @@ -136,7 +136,7 @@ void do_insert(Window& window) { print_status("-- INSERT --"); std::string inserted; - LineAndColumn pos = window.cursor_position(); + WindowCoord pos = window.cursor_position(); move(pos.line, pos.column); refresh(); while(true) @@ -281,10 +281,10 @@ void do_search(Window& window) std::unordered_map> keymap = { - { 'h', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(LineAndColumn(0, -count)); window.empty_selections(); } }, - { 'j', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(LineAndColumn(count, 0)); window.empty_selections(); } }, - { 'k', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(LineAndColumn(-count, 0)); window.empty_selections(); } }, - { 'l', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(LineAndColumn(0, count)); window.empty_selections(); } }, + { 'h', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(WindowCoord(0, -count)); window.empty_selections(); } }, + { 'j', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(WindowCoord(count, 0)); window.empty_selections(); } }, + { 'k', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(WindowCoord(-count, 0)); window.empty_selections(); } }, + { 'l', [](Window& window, int count) { if (count == 0) count = 1; window.move_cursor(WindowCoord(0, count)); window.empty_selections(); } }, { 'd', [](Window& window, int count) { window.erase(); window.empty_selections(); } }, { 'c', [](Window& window, int count) { window.erase(); do_insert(window); } }, { 'i', [](Window& window, int count) { do_insert(window); } }, diff --git a/src/utils.hh b/src/utils.hh new file mode 100644 index 00000000..75640cd8 --- /dev/null +++ b/src/utils.hh @@ -0,0 +1,18 @@ +#ifndef utils_hh_INCLUDED +#define utils_hh_INCLUDED + +namespace Kakoune +{ + +struct LineAndColumn +{ + int line; + int column; + + LineAndColumn(int line = 0, int column = 0) + : line(line), column(column) {} +}; + +} + +#endif // utils_hh_INCLUDED diff --git a/src/window.cc b/src/window.cc index 64c2b72d..5d0d7778 100644 --- a/src/window.cc +++ b/src/window.cc @@ -28,9 +28,9 @@ void Window::erase() } } -static LineAndColumn measure_string(const Window::String& string) +static WindowCoord measure_string(const Window::String& string) { - LineAndColumn result(0, 0); + WindowCoord result(0, 0); for (size_t i = 0; i < string.length(); ++i) { if (string[i] == '\n') @@ -64,7 +64,7 @@ void Window::append(const String& string) { if (m_selections.empty()) { - move_cursor(LineAndColumn(0 , 1)); + move_cursor(WindowCoord(0 , 1)); insert(string); } @@ -74,24 +74,24 @@ void Window::append(const String& string) } } -LineAndColumn Window::window_to_buffer(const LineAndColumn& window_pos) const +BufferCoord Window::window_to_buffer(const WindowCoord& window_pos) const { - return LineAndColumn(m_position.line + window_pos.line, - m_position.column + window_pos.column); + return BufferCoord(m_position.line + window_pos.line, + m_position.column + window_pos.column); } -LineAndColumn Window::buffer_to_window(const LineAndColumn& buffer_pos) const +WindowCoord Window::buffer_to_window(const BufferCoord& buffer_pos) const { - return LineAndColumn(buffer_pos.line - m_position.line, - buffer_pos.column - m_position.column); + return WindowCoord(buffer_pos.line - m_position.line, + buffer_pos.column - m_position.column); } -BufferIterator Window::iterator_at(const LineAndColumn& window_pos) const +BufferIterator Window::iterator_at(const WindowCoord& window_pos) const { return m_buffer->iterator_at(window_to_buffer(window_pos)); } -LineAndColumn Window::line_and_column_at(const BufferIterator& iterator) const +WindowCoord Window::line_and_column_at(const BufferIterator& iterator) const { return buffer_to_window(m_buffer->line_and_column_at(iterator)); } @@ -119,11 +119,11 @@ void Window::select(bool append, const Selector& selector) scroll_to_keep_cursor_visible_ifn(); } -void Window::move_cursor(const LineAndColumn& offset) +void Window::move_cursor(const WindowCoord& offset) { - LineAndColumn target_position = - window_to_buffer(LineAndColumn(m_cursor.line + offset.line, - m_cursor.column + offset.column)); + BufferCoord target_position = + window_to_buffer(WindowCoord(m_cursor.line + offset.line, + m_cursor.column + offset.column)); m_cursor = buffer_to_window(m_buffer->clamp(target_position)); @@ -165,7 +165,7 @@ void Window::update_display_buffer() } } -void Window::set_dimensions(const LineAndColumn& dimensions) +void Window::set_dimensions(const WindowCoord& dimensions) { m_dimensions = dimensions; } diff --git a/src/window.hh b/src/window.hh index 926e1e64..bbeab01b 100644 --- a/src/window.hh +++ b/src/window.hh @@ -3,12 +3,21 @@ #include #include + +#include "utils.hh" + #include "buffer.hh" #include "display_buffer.hh" namespace Kakoune { +struct WindowCoord : LineAndColumn +{ + WindowCoord(int line = 0, int column = 0) + : LineAndColumn(line, column) {} +}; + struct Selection { Selection(const BufferIterator& begin, const BufferIterator& end) @@ -33,24 +42,25 @@ public: void insert(const String& string); void append(const String& string); - const LineAndColumn& position() const { return m_position; } - const LineAndColumn& cursor_position() const { return m_cursor; } + const BufferCoord& position() const { return m_position; } + const WindowCoord& cursor_position() const { return m_cursor; } const std::shared_ptr& buffer() const { return m_buffer; } - LineAndColumn window_to_buffer(const LineAndColumn& window_pos) const; - LineAndColumn buffer_to_window(const LineAndColumn& buffer_pos) const; - BufferIterator iterator_at(const LineAndColumn& window_pos) const; - LineAndColumn line_and_column_at(const BufferIterator& iterator) const; + BufferCoord window_to_buffer(const WindowCoord& window_pos) const; + WindowCoord buffer_to_window(const BufferCoord& buffer_pos) const; - void move_cursor(const LineAndColumn& offset); + BufferIterator iterator_at(const WindowCoord& window_pos) const; + WindowCoord line_and_column_at(const BufferIterator& iterator) const; + + void move_cursor(const WindowCoord& offset); const SelectionList& selections() const { return m_selections; } void empty_selections(); void select(bool append, const Selector& selector); - void set_dimensions(const LineAndColumn& dimensions); + void set_dimensions(const WindowCoord& dimensions); const DisplayBuffer& display_buffer() const { return m_display_buffer; } @@ -60,9 +70,9 @@ private: void scroll_to_keep_cursor_visible_ifn(); std::shared_ptr m_buffer; - LineAndColumn m_position; - LineAndColumn m_cursor; - LineAndColumn m_dimensions; + BufferCoord m_position; + WindowCoord m_cursor; + WindowCoord m_dimensions; SelectionList m_selections; DisplayBuffer m_display_buffer; };