Explicitly pass buffer to selectors

This commit is contained in:
Maxime Coste 2013-06-01 14:22:57 +02:00
parent 3453ebbd52
commit b51799a2b2
6 changed files with 101 additions and 95 deletions

View File

@ -293,7 +293,7 @@ void Editor::select(const Selector& selector, SelectMode mode)
if (mode == SelectMode::Append) if (mode == SelectMode::Append)
{ {
auto& sel = m_selections[m_main_sel]; auto& sel = m_selections[m_main_sel];
auto res = selector(sel); auto res = selector(*m_buffer, sel);
if (res.captures().empty()) if (res.captures().empty())
res.captures() = sel.captures(); res.captures() = sel.captures();
m_main_sel = m_selections.size(); m_main_sel = m_selections.size();
@ -302,7 +302,7 @@ void Editor::select(const Selector& selector, SelectMode mode)
else if (mode == SelectMode::ReplaceMain) else if (mode == SelectMode::ReplaceMain)
{ {
auto& sel = m_selections[m_main_sel]; auto& sel = m_selections[m_main_sel];
auto res = selector(sel); auto res = selector(*m_buffer, sel);
sel.first() = res.first(); sel.first() = res.first();
sel.last() = res.last(); sel.last() = res.last();
if (not res.captures().empty()) if (not res.captures().empty())
@ -312,7 +312,7 @@ void Editor::select(const Selector& selector, SelectMode mode)
{ {
for (auto& sel : m_selections) for (auto& sel : m_selections)
{ {
auto res = selector(sel); auto res = selector(*m_buffer, sel);
if (mode == SelectMode::Extend) if (mode == SelectMode::Extend)
sel.merge_with(res); sel.merge_with(res);
else else
@ -338,7 +338,7 @@ void Editor::multi_select(const MultiSelector& selector)
SelectionList new_selections; SelectionList new_selections;
for (auto& sel : m_selections) for (auto& sel : m_selections)
{ {
SelectionList res = selector(sel); SelectionList res = selector(*m_buffer, sel);
new_selections.reserve(new_selections.size() + res.size()); new_selections.reserve(new_selections.size() + res.size());
for (auto& new_sel : res) for (auto& new_sel : res)
{ {

View File

@ -38,8 +38,8 @@ enum class InsertMode : unsigned
class Editor : public SafeCountable class Editor : public SafeCountable
{ {
public: public:
typedef std::function<Selection (const Selection&)> Selector; typedef std::function<Selection (const Buffer&, const Selection&)> Selector;
typedef std::function<SelectionList (const Selection&)> MultiSelector; typedef std::function<SelectionList (const Buffer&, const Selection&)> MultiSelector;
Editor(Buffer& buffer); Editor(Buffer& buffer);
virtual ~Editor() {} virtual ~Editor() {}

View File

@ -203,7 +203,7 @@ void replace_with_char(Context& context)
Editor& editor = context.editor(); Editor& editor = context.editor();
SelectionList sels = editor.selections(); SelectionList sels = editor.selections();
auto restore_sels = on_scope_end([&]{ editor.select(std::move(sels)); }); auto restore_sels = on_scope_end([&]{ editor.select(std::move(sels)); });
editor.multi_select(std::bind(select_all_matches, _1, Regex{"."})); editor.multi_select(std::bind(select_all_matches, _1, _2, Regex{"."}));
editor.insert(codepoint_to_str(key.key), InsertMode::Replace); editor.insert(codepoint_to_str(key.key), InsertMode::Replace);
}); });
} }
@ -282,7 +282,7 @@ void search(Context& context)
else if (str.empty() or not context.options()["incsearch"].get<bool>()) else if (str.empty() or not context.options()["incsearch"].get<bool>())
return; return;
context.editor().select(std::bind(select_next_match<forward>, _1, ex), mode); context.editor().select(std::bind(select_next_match<forward>, _1, _2, ex), mode);
} }
catch (boost::regex_error& err) catch (boost::regex_error& err)
{ {
@ -315,7 +315,7 @@ void search_next(Context& context)
context.push_jump(); context.push_jump();
int count = context.numeric_param(); int count = context.numeric_param();
do { do {
context.editor().select(std::bind(select_next_match<forward>, _1, ex), mode); context.editor().select(std::bind(select_next_match<forward>, _1, _2, ex), mode);
} while (--count > 0); } while (--count > 0);
} }
catch (boost::regex_error& err) catch (boost::regex_error& err)
@ -445,7 +445,7 @@ void select_regex(Context& context)
else else
RegisterManager::instance()['/'] = String{ex.str()}; RegisterManager::instance()['/'] = String{ex.str()};
if (not ex.empty() and not ex.str().empty()) if (not ex.empty() and not ex.str().empty())
context.editor().multi_select(std::bind(select_all_matches, _1, ex)); context.editor().multi_select(std::bind(select_all_matches, _1, _2, ex));
}); });
} }
@ -457,13 +457,13 @@ void split_regex(Context& context)
else else
RegisterManager::instance()['/'] = String{ex.str()}; RegisterManager::instance()['/'] = String{ex.str()};
if (not ex.empty() and not ex.str().empty()) if (not ex.empty() and not ex.str().empty())
context.editor().multi_select(std::bind(split_selection, _1, ex)); context.editor().multi_select(std::bind(split_selection, _1, _2, ex));
}); });
} }
void split_lines(Context& context) void split_lines(Context& context)
{ {
context.editor().multi_select(std::bind(split_selection, _1, Regex{"^"})); context.editor().multi_select(std::bind(split_selection, _1, _2, Regex{"^"}));
} }
void join_select_spaces(Context& context) void join_select_spaces(Context& context)
@ -471,9 +471,9 @@ void join_select_spaces(Context& context)
Editor& editor = context.editor(); Editor& editor = context.editor();
editor.select(select_whole_lines); editor.select(select_whole_lines);
editor.select(select_to_eol, SelectMode::Extend); editor.select(select_to_eol, SelectMode::Extend);
editor.multi_select([](const Selection& sel) editor.multi_select([](const Buffer& buffer, const Selection& sel)
{ {
SelectionList res = select_all_matches(sel, Regex{"(\n\\h*)+"}); SelectionList res = select_all_matches(buffer, sel, Regex{"(\n\\h*)+"});
// remove last end of line if selected // remove last end of line if selected
kak_assert(std::is_sorted(res.begin(), res.end(), kak_assert(std::is_sorted(res.begin(), res.end(),
[](const Selection& lhs, const Selection& rhs) [](const Selection& lhs, const Selection& rhs)
@ -521,7 +521,7 @@ void indent(Context& context)
DynamicSelectionList sels{editor.buffer(), editor.selections()}; DynamicSelectionList sels{editor.buffer(), editor.selections()};
auto restore_sels = on_scope_end([&]{ editor.select((SelectionList)std::move(sels)); }); auto restore_sels = on_scope_end([&]{ editor.select((SelectionList)std::move(sels)); });
editor.select(select_whole_lines); editor.select(select_whole_lines);
editor.multi_select(std::bind(select_all_matches, _1, Regex{"^[^\n]"})); editor.multi_select(std::bind(select_all_matches, _1, _2, Regex{"^[^\n]"}));
editor.insert(indent, InsertMode::Insert); editor.insert(indent, InsertMode::Insert);
} }
@ -532,7 +532,7 @@ void deindent(Context& context)
DynamicSelectionList sels{editor.buffer(), editor.selections()}; DynamicSelectionList sels{editor.buffer(), editor.selections()};
auto restore_sels = on_scope_end([&]{ editor.select((SelectionList)std::move(sels)); }); auto restore_sels = on_scope_end([&]{ editor.select((SelectionList)std::move(sels)); });
editor.select(select_whole_lines); editor.select(select_whole_lines);
editor.multi_select(std::bind(select_all_matches, _1, editor.multi_select(std::bind(select_all_matches, _1, _2,
Regex{"^\\h{1," + to_string(width) + "}"})); Regex{"^\\h{1," + to_string(width) + "}"}));
editor.erase(); editor.erase();
} }
@ -556,26 +556,26 @@ void select_object(Context& context)
[=](const Key& key, Context& context) { [=](const Key& key, Context& context) {
if (hide) if (hide)
context.ui().info_hide(); context.ui().info_hide();
typedef std::function<Selection (const Selection&)> Selector; typedef std::function<Selection (const Buffer&, const Selection&)> Selector;
static const std::unordered_map<Key, Selector> key_to_selector = static const std::unordered_map<Key, Selector> key_to_selector =
{ {
{ { Key::Modifiers::None, '(' }, std::bind(select_surrounding, _1, CodepointPair{ '(', ')' }, flags) }, { { Key::Modifiers::None, '(' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '(', ')' }, flags) },
{ { Key::Modifiers::None, ')' }, std::bind(select_surrounding, _1, CodepointPair{ '(', ')' }, flags) }, { { Key::Modifiers::None, ')' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '(', ')' }, flags) },
{ { Key::Modifiers::None, 'b' }, std::bind(select_surrounding, _1, CodepointPair{ '(', ')' }, flags) }, { { Key::Modifiers::None, 'b' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '(', ')' }, flags) },
{ { Key::Modifiers::None, '{' }, std::bind(select_surrounding, _1, CodepointPair{ '{', '}' }, flags) }, { { Key::Modifiers::None, '{' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '{', '}' }, flags) },
{ { Key::Modifiers::None, '}' }, std::bind(select_surrounding, _1, CodepointPair{ '{', '}' }, flags) }, { { Key::Modifiers::None, '}' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '{', '}' }, flags) },
{ { Key::Modifiers::None, 'B' }, std::bind(select_surrounding, _1, CodepointPair{ '{', '}' }, flags) }, { { Key::Modifiers::None, 'B' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '{', '}' }, flags) },
{ { Key::Modifiers::None, '[' }, std::bind(select_surrounding, _1, CodepointPair{ '[', ']' }, flags) }, { { Key::Modifiers::None, '[' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '[', ']' }, flags) },
{ { Key::Modifiers::None, ']' }, std::bind(select_surrounding, _1, CodepointPair{ '[', ']' }, flags) }, { { Key::Modifiers::None, ']' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '[', ']' }, flags) },
{ { Key::Modifiers::None, 'r' }, std::bind(select_surrounding, _1, CodepointPair{ '[', ']' }, flags) }, { { Key::Modifiers::None, 'r' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '[', ']' }, flags) },
{ { Key::Modifiers::None, '<' }, std::bind(select_surrounding, _1, CodepointPair{ '<', '>' }, flags) }, { { Key::Modifiers::None, '<' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '<', '>' }, flags) },
{ { Key::Modifiers::None, '>' }, std::bind(select_surrounding, _1, CodepointPair{ '<', '>' }, flags) }, { { Key::Modifiers::None, '>' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '<', '>' }, flags) },
{ { Key::Modifiers::None, '"' }, std::bind(select_surrounding, _1, CodepointPair{ '"', '"' }, flags) }, { { Key::Modifiers::None, '"' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '"', '"' }, flags) },
{ { Key::Modifiers::None, '\'' }, std::bind(select_surrounding, _1, CodepointPair{ '\'', '\'' }, flags) }, { { Key::Modifiers::None, '\'' }, std::bind(select_surrounding, _1, _2, CodepointPair{ '\'', '\'' }, flags) },
{ { Key::Modifiers::None, 'w' }, std::bind(select_whole_word<false>, _1, flags) }, { { Key::Modifiers::None, 'w' }, std::bind(select_whole_word<false>, _1, _2, flags) },
{ { Key::Modifiers::None, 'W' }, std::bind(select_whole_word<true>, _1, flags) }, { { Key::Modifiers::None, 'W' }, std::bind(select_whole_word<true>, _1, _2, flags) },
{ { Key::Modifiers::None, 's' }, std::bind(select_whole_sentence, _1, flags) }, { { Key::Modifiers::None, 's' }, std::bind(select_whole_sentence, _1, _2, flags) },
{ { Key::Modifiers::None, 'p' }, std::bind(select_whole_paragraph, _1, flags) }, { { Key::Modifiers::None, 'p' }, std::bind(select_whole_paragraph, _1, _2, flags) },
}; };
auto it = key_to_selector.find(key); auto it = key_to_selector.find(key);
@ -642,7 +642,7 @@ void select_to_next_char(Context& context)
context.input_handler().on_next_key([param](const Key& key, Context& context) { context.input_handler().on_next_key([param](const Key& key, Context& context) {
context.editor().select( context.editor().select(
std::bind(flags & SelectFlags::Reverse ? select_to_reverse : select_to, std::bind(flags & SelectFlags::Reverse ? select_to_reverse : select_to,
_1, key.key, param, flags & SelectFlags::Inclusive), _1, _2, key.key, param, flags & SelectFlags::Inclusive),
flags & SelectFlags::Extend ? SelectMode::Extend : SelectMode::Replace); flags & SelectFlags::Extend ? SelectMode::Extend : SelectMode::Replace);
}); });
} }

View File

@ -83,7 +83,7 @@ Range utf8_range(const Utf8Iterator& first, const Utf8Iterator& last)
typedef boost::regex_iterator<BufferIterator> RegexIterator; typedef boost::regex_iterator<BufferIterator> RegexIterator;
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_to_next_word(const Selection& selection) Selection select_to_next_word(const Buffer& buffer, const Selection& selection)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
if (categorize<punctuation_is_word>(*begin) != if (categorize<punctuation_is_word>(*begin) !=
@ -102,11 +102,11 @@ Selection select_to_next_word(const Selection& selection)
return utf8_range(begin, end-1); return utf8_range(begin, end-1);
} }
template Selection select_to_next_word<false>(const Selection&); template Selection select_to_next_word<false>(const Buffer&, const Selection&);
template Selection select_to_next_word<true>(const Selection&); template Selection select_to_next_word<true>(const Buffer&, const Selection&);
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_to_next_word_end(const Selection& selection) Selection select_to_next_word_end(const Buffer& buffer, const Selection& selection)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
if (categorize<punctuation_is_word>(*begin) != if (categorize<punctuation_is_word>(*begin) !=
@ -124,11 +124,11 @@ Selection select_to_next_word_end(const Selection& selection)
return utf8_range(begin, end-1); return utf8_range(begin, end-1);
} }
template Selection select_to_next_word_end<false>(const Selection&); template Selection select_to_next_word_end<false>(const Buffer&, const Selection&);
template Selection select_to_next_word_end<true>(const Selection&); template Selection select_to_next_word_end<true>(const Buffer&, const Selection&);
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_to_previous_word(const Selection& selection) Selection select_to_previous_word(const Buffer& buffer, const Selection& selection)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
@ -154,10 +154,10 @@ Selection select_to_previous_word(const Selection& selection)
return utf8_range(begin, with_end ? end : end+1); return utf8_range(begin, with_end ? end : end+1);
} }
template Selection select_to_previous_word<false>(const Selection&); template Selection select_to_previous_word<false>(const Buffer&, const Selection&);
template Selection select_to_previous_word<true>(const Selection&); template Selection select_to_previous_word<true>(const Buffer&, const Selection&);
Selection select_line(const Selection& selection) Selection select_line(const Buffer& buffer, const Selection& selection)
{ {
Utf8Iterator first = selection.last(); Utf8Iterator first = selection.last();
if (*first == '\n' and not is_end(first + 1)) if (*first == '\n' and not is_end(first + 1))
@ -172,7 +172,7 @@ Selection select_line(const Selection& selection)
return utf8_range(first, last); return utf8_range(first, last);
} }
Selection select_matching(const Selection& selection) Selection select_matching(const Buffer& buffer, const Selection& selection)
{ {
std::vector<Codepoint> matching_pairs = { '(', ')', '{', '}', '[', ']', '<', '>' }; std::vector<Codepoint> matching_pairs = { '(', ')', '{', '}', '[', ']', '<', '>' };
Utf8Iterator it = selection.last(); Utf8Iterator it = selection.last();
@ -285,7 +285,7 @@ static optional<Range> find_surrounding(const BufferIterator& pos,
return to_end ? utf8_range(first, last) : utf8_range(last, first); return to_end ? utf8_range(first, last) : utf8_range(last, first);
} }
Selection select_surrounding(const Selection& selection, Selection select_surrounding(const Buffer& buffer, const Selection& selection,
const CodepointPair& matching, const CodepointPair& matching,
ObjectFlags flags) ObjectFlags flags)
{ {
@ -303,7 +303,7 @@ Selection select_surrounding(const Selection& selection,
return *res; return *res;
} }
Selection select_to(const Selection& selection, Selection select_to(const Buffer& buffer, const Selection& selection,
Codepoint c, int count, bool inclusive) Codepoint c, int count, bool inclusive)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
@ -320,7 +320,7 @@ Selection select_to(const Selection& selection,
return utf8_range(begin, inclusive ? end : end-1); return utf8_range(begin, inclusive ? end : end-1);
} }
Selection select_to_reverse(const Selection& selection, Selection select_to_reverse(const Buffer& buffer, const Selection& selection,
Codepoint c, int count, bool inclusive) Codepoint c, int count, bool inclusive)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
@ -337,7 +337,7 @@ Selection select_to_reverse(const Selection& selection,
return utf8_range(begin, inclusive ? end : end+1); return utf8_range(begin, inclusive ? end : end+1);
} }
Selection select_to_eol(const Selection& selection) Selection select_to_eol(const Buffer& buffer, const Selection& selection)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
Utf8Iterator end = begin + 1; Utf8Iterator end = begin + 1;
@ -345,7 +345,7 @@ Selection select_to_eol(const Selection& selection)
return utf8_range(begin, end-1); return utf8_range(begin, end-1);
} }
Selection select_to_eol_reverse(const Selection& selection) Selection select_to_eol_reverse(const Buffer& buffer, const Selection& selection)
{ {
Utf8Iterator begin = selection.last(); Utf8Iterator begin = selection.last();
Utf8Iterator end = begin - 1; Utf8Iterator end = begin - 1;
@ -354,7 +354,7 @@ Selection select_to_eol_reverse(const Selection& selection)
} }
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_whole_word(const Selection& selection, ObjectFlags flags) Selection select_whole_word(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
{ {
Utf8Iterator first = selection.last(); Utf8Iterator first = selection.last();
Utf8Iterator last = first; Utf8Iterator last = first;
@ -394,10 +394,10 @@ Selection select_whole_word(const Selection& selection, ObjectFlags flags)
return (flags & ObjectFlags::ToEnd) ? utf8_range(first, last) return (flags & ObjectFlags::ToEnd) ? utf8_range(first, last)
: utf8_range(last, first); : utf8_range(last, first);
} }
template Selection select_whole_word<false>(const Selection&, ObjectFlags); template Selection select_whole_word<false>(const Buffer&, const Selection&, ObjectFlags);
template Selection select_whole_word<true>(const Selection&, ObjectFlags); template Selection select_whole_word<true>(const Buffer&, const Selection&, ObjectFlags);
Selection select_whole_sentence(const Selection& selection, ObjectFlags flags) Selection select_whole_sentence(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
{ {
BufferIterator first = selection.last(); BufferIterator first = selection.last();
BufferIterator last = first; BufferIterator last = first;
@ -448,7 +448,7 @@ Selection select_whole_sentence(const Selection& selection, ObjectFlags flags)
: Selection{last, first}; : Selection{last, first};
} }
Selection select_whole_paragraph(const Selection& selection, ObjectFlags flags) Selection select_whole_paragraph(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
{ {
BufferIterator first = selection.last(); BufferIterator first = selection.last();
BufferIterator last = first; BufferIterator last = first;
@ -490,7 +490,7 @@ Selection select_whole_paragraph(const Selection& selection, ObjectFlags flags)
: Selection{last, first}; : Selection{last, first};
} }
Selection select_whole_lines(const Selection& selection) Selection select_whole_lines(const Buffer& buffer, const Selection& selection)
{ {
// no need to be utf8 aware for is_eol as we only use \n as line seperator // no need to be utf8 aware for is_eol as we only use \n as line seperator
BufferIterator first = selection.first(); BufferIterator first = selection.first();
@ -510,7 +510,7 @@ Selection select_whole_lines(const Selection& selection)
return Selection(first, last); return Selection(first, last);
} }
Selection trim_partial_lines(const Selection& selection) Selection trim_partial_lines(const Buffer& buffer, const Selection& selection)
{ {
// same as select_whole_lines // same as select_whole_lines
BufferIterator first = selection.first(); BufferIterator first = selection.first();
@ -526,9 +526,8 @@ Selection trim_partial_lines(const Selection& selection)
return Selection(first, last); return Selection(first, last);
} }
Selection select_whole_buffer(const Selection& selection) Selection select_whole_buffer(const Buffer& buffer, const Selection&)
{ {
const Buffer& buffer = selection.first().buffer();
return Selection(buffer.begin(), utf8::previous(buffer.end())); return Selection(buffer.begin(), utf8::previous(buffer.end()));
} }
@ -549,23 +548,20 @@ static bool find_last_match(BufferIterator begin, const BufferIterator& end,
} }
template<bool forward> template<bool forward>
bool find_match_in_buffer(const BufferIterator pos, MatchResults& matches, bool find_match_in_buffer(const Buffer& buffer, const BufferIterator pos,
const Regex& ex) MatchResults& matches, const Regex& ex)
{ {
auto bufbeg = pos.buffer().begin();
auto bufend = pos.buffer().end();
if (forward) if (forward)
return (boost::regex_search(pos, bufend, matches, ex) or return (boost::regex_search(pos, buffer.end(), matches, ex) or
boost::regex_search(bufbeg, pos, matches, ex)); boost::regex_search(buffer.begin(), pos, matches, ex));
else else
return (find_last_match(bufbeg, pos, matches, ex) or return (find_last_match(buffer.begin(), pos, matches, ex) or
find_last_match(pos, bufend, matches, ex)); find_last_match(pos, buffer.end(), matches, ex));
} }
template<bool forward> template<bool forward>
Selection select_next_match(const Selection& selection, const Regex& regex) Selection select_next_match(const Buffer& buffer, const Selection& selection, const Regex& regex)
{ {
// regex matching do not use Utf8Iterator as boost::regex handle utf8 // regex matching do not use Utf8Iterator as boost::regex handle utf8
// decoding itself // decoding itself
@ -575,7 +571,7 @@ Selection select_next_match(const Selection& selection, const Regex& regex)
MatchResults matches; MatchResults matches;
if (find_match_in_buffer<forward>(utf8::next(begin), matches, regex)) if (find_match_in_buffer<forward>(buffer, utf8::next(begin), matches, regex))
{ {
begin = matches[0].first; begin = matches[0].first;
end = matches[0].second; end = matches[0].second;
@ -593,10 +589,10 @@ Selection select_next_match(const Selection& selection, const Regex& regex)
std::swap(begin, end); std::swap(begin, end);
return Selection{begin, end, std::move(captures)}; return Selection{begin, end, std::move(captures)};
} }
template Selection select_next_match<true>(const Selection&, const Regex&); template Selection select_next_match<true>(const Buffer&, const Selection&, const Regex&);
template Selection select_next_match<false>(const Selection&, const Regex&); template Selection select_next_match<false>(const Buffer&, const Selection&, const Regex&);
SelectionList select_all_matches(const Selection& selection, const Regex& regex) SelectionList select_all_matches(const Buffer& buffer, const Selection& selection, const Regex& regex)
{ {
auto sel_end = utf8::next(selection.max()); auto sel_end = utf8::next(selection.max());
RegexIterator re_it(selection.min(), sel_end, regex); RegexIterator re_it(selection.min(), sel_end, regex);
@ -621,7 +617,7 @@ SelectionList select_all_matches(const Selection& selection, const Regex& regex)
return result; return result;
} }
SelectionList split_selection(const Selection& selection, SelectionList split_selection(const Buffer& buffer, const Selection& selection,
const Regex& regex) const Regex& regex)
{ {
auto sel_end = utf8::next(selection.max()); auto sel_end = utf8::next(selection.max());

View File

@ -8,22 +8,27 @@ namespace Kakoune
{ {
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_to_next_word(const Selection& selection); Selection select_to_next_word(const Buffer& buffer,
const Selection& selection);
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_to_next_word_end(const Selection& selection); Selection select_to_next_word_end(const Buffer& buffer,
const Selection& selection);
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_to_previous_word(const Selection& selection); Selection select_to_previous_word(const Buffer& buffer,
const Selection& selection);
Selection select_line(const Selection& selection); Selection select_line(const Buffer& buffer,
Selection select_matching(const Selection& selection); const Selection& selection);
Selection select_matching(const Buffer& buffer,
const Selection& selection);
Selection select_to(const Selection& selection, Selection select_to(const Buffer& buffer, const Selection& selection,
Codepoint c, int count, bool inclusive); Codepoint c, int count, bool inclusive);
Selection select_to_reverse(const Selection& selection, Selection select_to_reverse(const Buffer& buffer, const Selection& selection,
Codepoint c, int count, bool inclusive); Codepoint c, int count, bool inclusive);
Selection select_to_eol(const Selection& selection); Selection select_to_eol(const Buffer& buffer, const Selection& selection);
Selection select_to_eol_reverse(const Selection& selection); Selection select_to_eol_reverse(const Buffer& buffer, const Selection& selection);
enum class ObjectFlags enum class ObjectFlags
{ {
@ -37,24 +42,28 @@ constexpr ObjectFlags operator|(ObjectFlags lhs, ObjectFlags rhs)
{ return (ObjectFlags)((int)lhs | (int) rhs); } { return (ObjectFlags)((int)lhs | (int) rhs); }
template<bool punctuation_is_word> template<bool punctuation_is_word>
Selection select_whole_word(const Selection& selection, ObjectFlags flags); Selection select_whole_word(const Buffer& buffer, const Selection& selection,
Selection select_whole_sentence(const Selection& selection, ObjectFlags flags); ObjectFlags flags);
Selection select_whole_paragraph(const Selection& selection, ObjectFlags flags); Selection select_whole_sentence(const Buffer& buffer, const Selection& selection,
Selection select_whole_lines(const Selection& selection); ObjectFlags flags);
Selection select_whole_buffer(const Selection& selection); Selection select_whole_paragraph(const Buffer& buffer, const Selection& selection,
Selection trim_partial_lines(const Selection& selection); ObjectFlags flags);
Selection select_whole_lines(const Buffer& buffer, const Selection& selection);
Selection select_whole_buffer(const Buffer& buffer, const Selection& selection);
Selection trim_partial_lines(const Buffer& buffer, const Selection& selection);
template<bool forward> template<bool forward>
Selection select_next_match(const Selection& selection, const Regex& regex); Selection select_next_match(const Buffer& buffer, const Selection& selection,
const Regex& regex);
SelectionList select_all_matches(const Selection& selection, SelectionList select_all_matches(const Buffer& buffer, const Selection& selection,
const Regex& regex); const Regex& regex);
SelectionList split_selection(const Selection& selection, SelectionList split_selection(const Buffer& buffer, const Selection& selection,
const Regex& separator_regex); const Regex& separator_regex);
using CodepointPair = std::pair<Codepoint, Codepoint>; using CodepointPair = std::pair<Codepoint, Codepoint>;
Selection select_surrounding(const Selection& selection, Selection select_surrounding(const Buffer& buffer, const Selection& selection,
const CodepointPair& matching, const CodepointPair& matching,
ObjectFlags flags); ObjectFlags flags);

View File

@ -52,13 +52,14 @@ void test_buffer()
void test_editor() void test_editor()
{ {
using namespace std::placeholders;
Buffer buffer("test", Buffer::Flags::None, { "test\n", "\n", "youpi\n" }); Buffer buffer("test", Buffer::Flags::None, { "test\n", "\n", "youpi\n" });
Editor editor(buffer); Editor editor(buffer);
{ {
scoped_edition edition{editor}; scoped_edition edition{editor};
editor.select(select_whole_buffer); editor.select(select_whole_buffer);
editor.multi_select(std::bind(select_all_matches, std::placeholders::_1, Regex{"\\n\\h*"})); editor.multi_select(std::bind(select_all_matches, _1, _2, Regex{"\\n\\h*"}));
for (auto& sel : editor.selections()) for (auto& sel : editor.selections())
{ {
kak_assert(*sel.min() == '\n'); kak_assert(*sel.min() == '\n');