add 'g' and 'G' commands to go to first and last line in buffer

This commit is contained in:
Josh Holtrop 2016-12-28 14:07:28 -05:00
parent 8df75f5ab0
commit 237dbf9c2b
3 changed files with 40 additions and 2 deletions

View File

@ -19,7 +19,7 @@ public:
INVALID_CODE_POINT = 0xFFFFFFFFu, INVALID_CODE_POINT = 0xFFFFFFFFu,
}; };
Iterator(Buffer * buffer) Iterator(const Buffer * buffer)
{ {
m_buffer = buffer; m_buffer = buffer;
m_offset = 0u; m_offset = 0u;
@ -87,7 +87,7 @@ public:
size_t offset() const { return m_offset; } size_t offset() const { return m_offset; }
protected: protected:
Buffer * m_buffer; const Buffer * m_buffer;
size_t m_offset; size_t m_offset;
size_t m_line; size_t m_line;
}; };
@ -114,6 +114,8 @@ public:
void insert_code_point(uint32_t code_point, bool adjust_iterators = true); void insert_code_point(uint32_t code_point, bool adjust_iterators = true);
void erase_code_point(const Buffer::Iterator & position); void erase_code_point(const Buffer::Iterator & position);
std::string filename() const { return m_filename; } std::string filename() const { return m_filename; }
Iterator begin() const { return Iterator(this); }
Iterator end() const { return *m_eof_iterator; }
protected: protected:
bool m_eol_at_eof; bool m_eol_at_eof;

View File

@ -333,6 +333,9 @@ void BufferPane::handle_key(uint32_t keyval)
case '$': case '$':
cursor_move(CursorMovement::EOL); cursor_move(CursorMovement::EOL);
break; break;
case 'G':
cursor_move(CursorMovement::LAST_LINE);
break;
case 'a': case 'a':
if (**m_iterator != '\n') if (**m_iterator != '\n')
{ {
@ -341,6 +344,9 @@ void BufferPane::handle_key(uint32_t keyval)
m_buffer->enter_insert_mode(*m_iterator); m_buffer->enter_insert_mode(*m_iterator);
m_window->request_redraw(); m_window->request_redraw();
break; break;
case 'g':
cursor_move(CursorMovement::FIRST_LINE);
break;
case 'h': case 'h':
cursor_move(CursorMovement::LEFT); cursor_move(CursorMovement::LEFT);
break; break;
@ -419,6 +425,28 @@ void BufferPane::cursor_move(CursorMovement which)
case CursorMovement::EOL: case CursorMovement::EOL:
moved = m_iterator->go_end_of_line(m_buffer->insert_mode()); moved = m_iterator->go_end_of_line(m_buffer->insert_mode());
break; break;
case CursorMovement::FIRST_LINE:
{
auto it = m_buffer->begin();
if (it != *m_iterator)
{
*m_iterator = it;
moved = true;
}
}
break;
case CursorMovement::LAST_LINE:
{
auto it = m_buffer->end();
it.go_back();
it.go_start_of_line();
if (it != *m_iterator)
{
*m_iterator = it;
moved = true;
}
}
break;
} }
if (moved) if (moved)
{ {
@ -446,6 +474,12 @@ void BufferPane::cursor_move(CursorMovement which)
case CursorMovement::EOL: case CursorMovement::EOL:
m_target_column = INT_MAX; m_target_column = INT_MAX;
break; break;
case CursorMovement::FIRST_LINE:
m_cursor_screen_row = 0;
break;
case CursorMovement::LAST_LINE:
m_cursor_screen_row = m_rows;
break;
} }
m_cursor_screen_row = determine_new_cursor_screen_row(); m_cursor_screen_row = determine_new_cursor_screen_row();
m_window->request_redraw(); m_window->request_redraw();

View File

@ -25,6 +25,8 @@ protected:
DOWN, DOWN,
SOL, SOL,
EOL, EOL,
FIRST_LINE,
LAST_LINE,
}; };
int effective_scroll_offset() int effective_scroll_offset()