Explicitly pass buffer to selectors
This commit is contained in:
parent
3453ebbd52
commit
b51799a2b2
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
SelectionList select_all_matches(const Selection& selection,
|
|
||||||
const Regex& regex);
|
const Regex& regex);
|
||||||
|
|
||||||
SelectionList split_selection(const Selection& selection,
|
SelectionList select_all_matches(const Buffer& buffer, const Selection& selection,
|
||||||
|
const Regex& regex);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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');
|
||||||
|
|
Loading…
Reference in New Issue
Block a user