selectors now take a Selection as parameter instead of a BufferIterator

This commit is contained in:
Maxime Coste 2012-02-07 14:26:51 +00:00
parent ffaade96ba
commit 9b5e9ffee2
5 changed files with 80 additions and 69 deletions

View File

@ -149,7 +149,6 @@ void Editor::select(const BufferIterator& iterator)
{
selections().clear();
selections().push_back(Selection(iterator, iterator));
}
void Editor::select(const Selector& selector, bool append)
@ -159,12 +158,12 @@ void Editor::select(const Selector& selector, bool append)
if (not append)
{
for (auto& sel : selections())
sel = selector(sel.last());
sel = selector(sel);
}
else
{
for (auto& sel : selections())
sel.merge_with(selector(sel.last()));
sel.merge_with(selector(sel));
}
}

View File

@ -20,7 +20,7 @@ class Editor
{
public:
typedef BufferString String;
typedef std::function<Selection (const BufferIterator&)> Selector;
typedef std::function<Selection (const Selection&)> Selector;
typedef std::function<SelectionList (const Selection&)> MultiSelector;
Editor(Buffer& buffer);

View File

@ -900,7 +900,7 @@ void do_split_regex(Editor& editor, int count)
void do_join(Editor& editor, int count)
{
editor.multi_select(select_whole_lines);
editor.select(select_whole_lines);
editor.select(select_to_eol, true);
editor.multi_select(std::bind(select_all_matches, _1, "\n\\h*"));
editor.replace(" ");
@ -970,8 +970,7 @@ std::unordered_map<Key, std::function<void (Editor& editor, int count)>> keymap
{ { Key::Modifiers::None, '.' }, do_repeat_insert },
{ { Key::Modifiers::None, '%' }, [](Editor& editor, int count) { editor.select([](const BufferIterator& cursor)
{ return Selection(cursor.buffer().begin(), cursor.buffer().end()-1); }); } },
{ { Key::Modifiers::None, '%' }, [](Editor& editor, int count) { editor.clear_selections(); editor.select(select_whole_buffer); } },
{ { Key::Modifiers::None, ':' }, [](Editor& editor, int count) { do_command(); } },
{ { Key::Modifiers::None, '|' }, do_pipe },
@ -1016,7 +1015,7 @@ std::unordered_map<Key, std::function<void (Editor& editor, int count)>> keymap
{ { Key::Modifiers::Alt, 'j' }, do_join },
{ { Key::Modifiers::Alt, 'x' }, [](Editor& editor, int count) { editor.multi_select(select_whole_lines); } },
{ { Key::Modifiers::Alt, 'x' }, [](Editor& editor, int count) { editor.select(select_whole_lines); } },
};
void exec_keys(const KeyList& keys,

View File

@ -71,9 +71,9 @@ bool skip_while_reverse(BufferIterator& it, T condition)
return condition(*it);
}
Selection select_to_next_word(const BufferIterator& cursor)
Selection select_to_next_word(const Selection& selection)
{
BufferIterator begin = cursor;
BufferIterator begin = selection.last();
if (categorize(*begin) != categorize(*(begin+1)))
++begin;
@ -91,9 +91,9 @@ Selection select_to_next_word(const BufferIterator& cursor)
return Selection(begin, with_end ? end : end-1);
}
Selection select_to_next_word_end(const BufferIterator& cursor)
Selection select_to_next_word_end(const Selection& selection)
{
BufferIterator begin = cursor;
BufferIterator begin = selection.last();
if (categorize(*begin) != categorize(*(begin+1)))
++begin;
@ -110,9 +110,9 @@ Selection select_to_next_word_end(const BufferIterator& cursor)
return Selection(begin, with_end ? end : end-1);
}
Selection select_to_previous_word(const BufferIterator& cursor)
Selection select_to_previous_word(const Selection& selection)
{
BufferIterator begin = cursor;
BufferIterator begin = selection.last();
if (categorize(*begin) != categorize(*(begin-1)))
--begin;
@ -130,9 +130,9 @@ Selection select_to_previous_word(const BufferIterator& cursor)
return Selection(begin, with_end ? end : end+1);
}
Selection select_to_next_WORD(const BufferIterator& cursor)
Selection select_to_next_WORD(const Selection& selection)
{
BufferIterator begin = cursor;
BufferIterator begin = selection.last();
if (categorize<false>(*begin) != categorize<false>(*(begin+1)))
++begin;
@ -146,9 +146,9 @@ Selection select_to_next_WORD(const BufferIterator& cursor)
return Selection(begin, with_end ? end : end-1);
}
Selection select_to_next_WORD_end(const BufferIterator& cursor)
Selection select_to_next_WORD_end(const Selection& selection)
{
BufferIterator begin = cursor;
BufferIterator begin = selection.last();
if (categorize<false>(*begin) != categorize<false>(*(begin+1)))
++begin;
@ -163,9 +163,9 @@ Selection select_to_next_WORD_end(const BufferIterator& cursor)
return Selection(begin, with_end ? end : end-1);
}
Selection select_to_previous_WORD(const BufferIterator& cursor)
Selection select_to_previous_WORD(const Selection& selection)
{
BufferIterator begin = cursor;
BufferIterator begin = selection.last();
if (categorize<false>(*begin) != categorize<false>(*(begin-1)))
--begin;
@ -178,9 +178,9 @@ Selection select_to_previous_WORD(const BufferIterator& cursor)
return Selection(begin, with_end ? end : end+1);
}
Selection select_line(const BufferIterator& cursor)
Selection select_line(const Selection& selection)
{
BufferIterator first = cursor;
BufferIterator first = selection.last();
if (*first == '\n' and not (first + 1).is_end())
++first;
@ -193,10 +193,10 @@ Selection select_line(const BufferIterator& cursor)
return Selection(first, last);
}
Selection select_matching(const BufferIterator& cursor)
Selection select_matching(const Selection& selection)
{
std::vector<char> matching_pairs = { '(', ')', '{', '}', '[', ']', '<', '>' };
BufferIterator it = cursor;
BufferIterator it = selection.last();
std::vector<char>::iterator match = matching_pairs.end();
while (not is_eol(*it))
{
@ -206,7 +206,7 @@ Selection select_matching(const BufferIterator& cursor)
++it;
}
if (match == matching_pairs.end())
return Selection(cursor, cursor);
return selection;
BufferIterator begin = it;
@ -239,15 +239,15 @@ Selection select_matching(const BufferIterator& cursor)
--it;
}
}
return Selection(cursor, cursor);
return selection;
}
Selection select_surrounding(const BufferIterator& cursor,
Selection select_surrounding(const Selection& selection,
const std::pair<char, char>& matching,
bool inside)
{
int level = 0;
BufferIterator first = cursor;
BufferIterator first = selection.last();
while (not first.is_begin())
{
if (*first == matching.second)
@ -262,7 +262,7 @@ Selection select_surrounding(const BufferIterator& cursor,
--first;
}
if (level != 0 or *first != matching.first)
return Selection(cursor, cursor);
return selection;
level = 0;
BufferIterator last = first + 1;
@ -280,7 +280,7 @@ Selection select_surrounding(const BufferIterator& cursor,
++last;
}
if (level != 0 or *last != matching.second)
return Selection(cursor, cursor);
return selection;
if (inside)
{
@ -291,51 +291,57 @@ Selection select_surrounding(const BufferIterator& cursor,
return Selection(first, last);
}
Selection select_to(const BufferIterator& cursor, char c, int count, bool inclusive)
Selection select_to(const Selection& selection,
char c, int count, bool inclusive)
{
BufferIterator end = cursor;
BufferIterator begin = selection.last();
BufferIterator end = begin;
do
{
++end;
skip_while(end, [c](char cur) { return not is_eol(cur) and cur != c; });
if (end.is_end() or is_eol(*end))
return Selection(cursor, cursor);
return selection;
}
while (--count > 0);
return Selection(cursor, inclusive ? end : end-1);
return Selection(begin, inclusive ? end : end-1);
}
Selection select_to_reverse(const BufferIterator& cursor, char c, int count, bool inclusive)
Selection select_to_reverse(const Selection& selection,
char c, int count, bool inclusive)
{
BufferIterator end = cursor;
BufferIterator begin = selection.last();
BufferIterator end = begin;
do
{
--end;
skip_while_reverse(end, [c](char cur) { return not is_eol(cur) and cur != c; });
if (end.is_begin() or is_eol(*end))
return Selection(cursor, cursor);
return selection;
}
while (--count > 0);
return Selection(cursor, inclusive ? end : end+1);
return Selection(begin, inclusive ? end : end+1);
}
Selection select_to_eol(const BufferIterator& cursor)
Selection select_to_eol(const Selection& selection)
{
BufferIterator end = cursor + 1;
BufferIterator begin = selection.last();
BufferIterator end = begin + 1;
skip_while(end, [](char cur) { return not is_eol(cur); });
return Selection(cursor, end-1);
return Selection(begin, end-1);
}
Selection select_to_eol_reverse(const BufferIterator& cursor)
Selection select_to_eol_reverse(const Selection& selection)
{
BufferIterator end = cursor - 1;
BufferIterator begin = selection.last();
BufferIterator end = begin - 1;
skip_while_reverse(end, [](char cur) { return not is_eol(cur); });
return Selection(cursor, end.is_begin() ? end : end+1);
return Selection(begin, end.is_begin() ? end : end+1);
}
SelectionList select_whole_lines(const Selection& selection)
Selection select_whole_lines(const Selection& selection)
{
BufferIterator first = selection.first();
BufferIterator last = selection.last();
@ -349,25 +355,29 @@ SelectionList select_whole_lines(const Selection& selection)
skip_while(to_line_end, [](char cur) { return not is_eol(cur); });
SelectionList result;
result.push_back(Selection(first, last));
return result;
return Selection(first, last);
}
Selection select_next_match(const BufferIterator& cursor,
Selection select_whole_buffer(const Selection& selection)
{
const Buffer& buffer = selection.first().buffer();
return Selection(buffer.begin(), buffer.end()-1);
}
Selection select_next_match(const Selection& selection,
const std::string& regex)
{
boost::regex ex(regex);
BufferIterator begin = cursor;
BufferIterator end = cursor;
BufferIterator begin = selection.last();
BufferIterator end = begin;
Selection::CaptureList captures;
try
{
boost::match_results<BufferIterator> matches;
if (boost::regex_search(cursor+1, cursor.buffer().end(), matches,
if (boost::regex_search(begin+1, begin.buffer().end(), matches,
ex))
{
begin = matches[0].first;
@ -375,7 +385,7 @@ Selection select_next_match(const BufferIterator& cursor,
std::copy(matches.begin(), matches.end(),
std::back_inserter(captures));
}
else if (boost::regex_search(cursor.buffer().begin(), cursor+1, matches,
else if (boost::regex_search(begin.buffer().begin(), begin+1, matches,
ex))
{
begin = matches[0].first;

View File

@ -1,32 +1,35 @@
#ifndef selectors_hh_INCLUDED
#define selectors_hh_INCLUDED
#include "window.hh"
#include "selection.hh"
namespace Kakoune
{
Selection select_to_next_word(const BufferIterator& cursor);
Selection select_to_next_word_end(const BufferIterator& cursor);
Selection select_to_previous_word(const BufferIterator& cursor);
Selection select_to_next_WORD(const BufferIterator& cursor);
Selection select_to_next_WORD_end(const BufferIterator& cursor);
Selection select_to_previous_WORD(const BufferIterator& cursor);
Selection select_line(const BufferIterator& cursor);
Selection select_matching(const BufferIterator& cursor);
Selection select_surrounding(const BufferIterator& cursor,
Selection select_to_next_word(const Selection& selection);
Selection select_to_next_word_end(const Selection& selection);
Selection select_to_previous_word(const Selection& selection);
Selection select_to_next_WORD(const Selection& selection);
Selection select_to_next_WORD_end(const Selection& selection);
Selection select_to_previous_WORD(const Selection& selection);
Selection select_line(const Selection& selection);
Selection select_matching(const Selection& selection);
Selection select_surrounding(const Selection& selection,
const std::pair<char, char>& matching,
bool inside);
Selection select_to(const BufferIterator& cursor, char c, int count, bool inclusive);
Selection select_to_reverse(const BufferIterator& cursor, char c, int count, bool inclusive);
Selection select_to(const Selection& selection,
char c, int count, bool inclusive);
Selection select_to_reverse(const Selection& selection,
char c, int count, bool inclusive);
Selection select_to_eol(const BufferIterator& cursor);
Selection select_to_eol_reverse(const BufferIterator& cursor);
Selection select_to_eol(const Selection& selection);
Selection select_to_eol_reverse(const Selection& selection);
SelectionList select_whole_lines(const Selection& selection);
Selection select_whole_lines(const Selection& selection);
Selection select_whole_buffer(const Selection& selection);
Selection select_next_match(const BufferIterator& cursor,
Selection select_next_match(const Selection& selection,
const std::string& regex);
SelectionList select_all_matches(const Selection& selection,