Buffer::{iterator_at,clamp} takes an optional avoid_eol parameter
when avoid_eol is true, clamping does avoid end-of-line if possible
This commit is contained in:
parent
260b30e6d9
commit
390d4ccdfc
|
@ -55,9 +55,10 @@ Buffer::~Buffer()
|
||||||
assert(m_change_listeners.empty());
|
assert(m_change_listeners.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferIterator Buffer::iterator_at(const BufferCoord& line_and_column) const
|
BufferIterator Buffer::iterator_at(const BufferCoord& line_and_column,
|
||||||
|
bool avoid_eol) const
|
||||||
{
|
{
|
||||||
return BufferIterator(*this, clamp(line_and_column));
|
return BufferIterator(*this, clamp(line_and_column, avoid_eol));
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Buffer::line_and_column_at(const BufferIterator& iterator) const
|
BufferCoord Buffer::line_and_column_at(const BufferIterator& iterator) const
|
||||||
|
@ -78,14 +79,15 @@ BufferSize Buffer::line_length(BufferPos line) const
|
||||||
return end - m_lines[line].start;
|
return end - m_lines[line].start;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCoord Buffer::clamp(const BufferCoord& line_and_column) const
|
BufferCoord Buffer::clamp(const BufferCoord& line_and_column,
|
||||||
|
bool avoid_eol) const
|
||||||
{
|
{
|
||||||
if (m_lines.empty())
|
if (m_lines.empty())
|
||||||
return BufferCoord();
|
return BufferCoord();
|
||||||
|
|
||||||
BufferCoord result(line_and_column.line, line_and_column.column);
|
BufferCoord result(line_and_column.line, line_and_column.column);
|
||||||
result.line = Kakoune::clamp<int>(0, m_lines.size() - 1, result.line);
|
result.line = Kakoune::clamp<int>(0, m_lines.size() - 1, result.line);
|
||||||
int max_col = std::max(0, line_length(result.line) - 2);
|
int max_col = std::max(0, line_length(result.line) - (avoid_eol ? 2 : 1));
|
||||||
result.column = Kakoune::clamp<int>(0, max_col, result.column);
|
result.column = Kakoune::clamp<int>(0, max_col, result.column);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,11 +130,16 @@ public:
|
||||||
BufferSize character_count() const;
|
BufferSize character_count() const;
|
||||||
BufferSize line_count() const;
|
BufferSize line_count() const;
|
||||||
|
|
||||||
BufferIterator iterator_at(const BufferCoord& line_and_column) const;
|
// returns an iterator at given coordinates. line_and_column is
|
||||||
|
// clamped according to avoid_eol.
|
||||||
|
BufferIterator iterator_at(const BufferCoord& line_and_column,
|
||||||
|
bool avoid_eol = false) const;
|
||||||
BufferCoord line_and_column_at(const BufferIterator& iterator) const;
|
BufferCoord line_and_column_at(const BufferIterator& iterator) const;
|
||||||
|
|
||||||
// returns nearest valid coordinates from given ones
|
// returns nearest valid coordinates from given ones
|
||||||
BufferCoord clamp(const BufferCoord& line_and_column) const;
|
// if avoid_eol, clamp to character before eol if line is not empty
|
||||||
|
BufferCoord clamp(const BufferCoord& line_and_column,
|
||||||
|
bool avoid_eol = false) const;
|
||||||
|
|
||||||
const String& name() const { return m_name; }
|
const String& name() const { return m_name; }
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ void Editor::move_selections(const BufferCoord& offset, bool append)
|
||||||
for (auto& sel : m_selections.back())
|
for (auto& sel : m_selections.back())
|
||||||
{
|
{
|
||||||
BufferCoord pos = m_buffer.line_and_column_at(sel.last());
|
BufferCoord pos = m_buffer.line_and_column_at(sel.last());
|
||||||
BufferIterator last = m_buffer.iterator_at(pos + BufferCoord(offset));
|
BufferIterator last = m_buffer.iterator_at(pos + offset, true);
|
||||||
sel = Selection(append ? sel.first() : last, last);
|
sel = Selection(append ? sel.first() : last, last);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user