Selectors: add split_selection bound to Alt-s
This commit is contained in:
parent
b67c36358d
commit
7861ad9ddb
12
src/main.cc
12
src/main.cc
|
@ -527,6 +527,16 @@ void do_select_regex(Window& window, int count)
|
||||||
catch (prompt_aborted&) {}
|
catch (prompt_aborted&) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void do_split_regex(Window& window, int count)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::string ex = prompt("split: ");
|
||||||
|
window.multi_select(std::bind(split_selection, _1, ex));
|
||||||
|
}
|
||||||
|
catch (prompt_aborted&) {}
|
||||||
|
}
|
||||||
|
|
||||||
std::unordered_map<char, std::function<void (Window& window, int count)>> keymap =
|
std::unordered_map<char, std::function<void (Window& window, int count)>> keymap =
|
||||||
{
|
{
|
||||||
{ 'h', [](Window& window, int count) { window.move_cursor(DisplayCoord(0, -std::max(count,1))); } },
|
{ 'h', [](Window& window, int count) { window.move_cursor(DisplayCoord(0, -std::max(count,1))); } },
|
||||||
|
@ -602,6 +612,8 @@ std::unordered_map<char, std::function<void (Window& window, int count)>> alt_ke
|
||||||
{ 'L', [](Window& window, int count) { do { window.select(select_to_eol, true); } while(--count > 0); } },
|
{ 'L', [](Window& window, int count) { do { window.select(select_to_eol, true); } while(--count > 0); } },
|
||||||
{ 'h', [](Window& window, int count) { do { window.select(select_to_eol_reverse, false); } while(--count > 0); } },
|
{ 'h', [](Window& window, int count) { do { window.select(select_to_eol_reverse, false); } while(--count > 0); } },
|
||||||
{ 'H', [](Window& window, int count) { do { window.select(select_to_eol_reverse, true); } while(--count > 0); } },
|
{ 'H', [](Window& window, int count) { do { window.select(select_to_eol_reverse, true); } while(--count > 0); } },
|
||||||
|
|
||||||
|
{ 's', do_split_regex },
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
|
|
|
@ -340,14 +340,14 @@ Selection select_next_match(const BufferIterator& cursor,
|
||||||
return Selection(begin, end - 1, std::move(captures));
|
return Selection(begin, end - 1, std::move(captures));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef boost::regex_iterator<BufferIterator> RegexIterator;
|
||||||
|
|
||||||
SelectionList select_all_matches(const Selection& selection,
|
SelectionList select_all_matches(const Selection& selection,
|
||||||
const std::string& regex)
|
const std::string& regex)
|
||||||
{
|
{
|
||||||
boost::regex ex(regex);
|
boost::regex ex(regex);
|
||||||
boost::regex_iterator<BufferIterator> re_it(selection.begin(),
|
RegexIterator re_it(selection.begin(), selection.end(), ex);
|
||||||
selection.end(),
|
RegexIterator re_end;
|
||||||
ex);
|
|
||||||
boost::regex_iterator<BufferIterator> re_end;
|
|
||||||
|
|
||||||
SelectionList result;
|
SelectionList result;
|
||||||
for (; re_it != re_end; ++re_it)
|
for (; re_it != re_end; ++re_it)
|
||||||
|
@ -355,13 +355,33 @@ SelectionList select_all_matches(const Selection& selection,
|
||||||
BufferIterator begin = (*re_it)[0].first;
|
BufferIterator begin = (*re_it)[0].first;
|
||||||
BufferIterator end = (*re_it)[0].second;
|
BufferIterator end = (*re_it)[0].second;
|
||||||
|
|
||||||
if (begin == end)
|
|
||||||
++end;
|
|
||||||
|
|
||||||
Selection::CaptureList captures(re_it->begin(), re_it->end());
|
Selection::CaptureList captures(re_it->begin(), re_it->end());
|
||||||
result.push_back(Selection(begin, end-1, std::move(captures)));
|
|
||||||
|
result.push_back(Selection(begin, begin == end ? end : end-1,
|
||||||
|
std::move(captures)));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SelectionList split_selection(const Selection& selection,
|
||||||
|
const std::string& separator_regex)
|
||||||
|
{
|
||||||
|
boost::regex ex(separator_regex);
|
||||||
|
RegexIterator re_it(selection.begin(), selection.end(), ex,
|
||||||
|
boost::regex_constants::match_nosubs);
|
||||||
|
RegexIterator re_end;
|
||||||
|
|
||||||
|
SelectionList result;
|
||||||
|
BufferIterator begin = selection.begin();
|
||||||
|
for (; re_it != re_end; ++re_it)
|
||||||
|
{
|
||||||
|
BufferIterator end = (*re_it)[0].first;
|
||||||
|
|
||||||
|
result.push_back(Selection(begin, (begin == end) ? end : end-1));
|
||||||
|
begin = (*re_it)[0].second;
|
||||||
|
}
|
||||||
|
result.push_back(Selection(begin, selection.last()));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@ Selection select_next_match(const BufferIterator& cursor,
|
||||||
SelectionList select_all_matches(const Selection& selection,
|
SelectionList select_all_matches(const Selection& selection,
|
||||||
const std::string& regex);
|
const std::string& regex);
|
||||||
|
|
||||||
|
SelectionList split_selection(const Selection& selection,
|
||||||
|
const std::string& separator_regex);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // selectors_hh_INCLUDED
|
#endif // selectors_hh_INCLUDED
|
||||||
|
|
Loading…
Reference in New Issue
Block a user