summaryrefslogtreecommitdiff
path: root/src/selectors.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2023-05-15 21:10:02 +1000
committerMaxime Coste <mawww@kakoune.org>2023-05-21 16:20:51 +1000
commitcfa658b899b44a8a0f4c7f3dd9811ae0d44ddd3a (patch)
tree80613249d2988b09ebc7eaa85a91f811959931f3 /src/selectors.cc
parente140df8f0857125f40f9338450f73ff1ac50664d (diff)
Add <c-g> to cancel current operation
The current implementation only does this during regex operations, but should be extensible to other operations that might take a long time by regularly calling EventManager::handle_urgent_events().
Diffstat (limited to 'src/selectors.cc')
-rw-r--r--src/selectors.cc37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/selectors.cc b/src/selectors.cc
index cf631e72..e3cba87d 100644
--- a/src/selectors.cc
+++ b/src/selectors.cc
@@ -2,6 +2,7 @@
#include "buffer_utils.hh"
#include "context.hh"
+#include "event_manager.hh"
#include "flags.hh"
#include "option_types.hh"
#include "regex.hh"
@@ -287,16 +288,19 @@ find_opening(Iterator pos, const Container& container,
// When on the token of a non-nestable block, we want to consider it opening
if (nestable and
backward_regex_search(container.begin(), pos,
- container.begin(), container.end(), res, closing) and
+ container.begin(), container.end(), res, closing,
+ RegexExecFlags::None, EventManager::handle_urgent_events) and
res[0].second == pos)
pos = res[0].first;
- using RegexIt = RegexIterator<Iterator, RegexMode::Backward>;
- for (auto&& match : RegexIt{container.begin(), pos, container.begin(), container.end(), opening})
+ using RegexIt = RegexIterator<Iterator, RegexMode::Backward, const Regex, void (*)()>;
+ for (auto&& match : RegexIt{container.begin(), pos, container.begin(), container.end(), opening,
+ RegexExecFlags::None, EventManager::handle_urgent_events})
{
if (nestable)
{
- for (auto m [[maybe_unused]] : RegexIt{match[0].second, pos, container.begin(), container.end(), closing})
+ for (auto m [[maybe_unused]] : RegexIt{match[0].second, pos, container.begin(), container.end(), closing,
+ RegexExecFlags::None, EventManager::handle_urgent_events})
++level;
}
@@ -314,12 +318,13 @@ find_closing(Iterator pos, const Container& container,
const Regex& opening, const Regex& closing,
int level, bool nestable)
{
- using RegexIt = RegexIterator<Iterator, RegexMode::Forward>;
- for (auto match : RegexIt{pos, container.end(), container.begin(), container.end(), closing})
+ for (auto match : RegexIterator{pos, container.end(), container.begin(), container.end(), closing,
+ RegexExecFlags::None, EventManager::handle_urgent_events})
{
if (nestable)
{
- for (auto m [[maybe_unused]] : RegexIt{pos, match[0].first, container.begin(), container.end(), opening})
+ for (auto m [[maybe_unused]] : RegexIterator{pos, match[0].first, container.begin(), container.end(), opening,
+ RegexExecFlags::None, EventManager::handle_urgent_events})
++level;
}
@@ -356,7 +361,8 @@ find_surrounding(const Container& container, Iterator pos,
return {};
}
else if (MatchResults<Iterator> res;
- regex_search(pos, container.end(), container.begin(), container.end(), res, opening) and
+ regex_search(pos, container.end(), container.begin(), container.end(), res, opening,
+ RegexExecFlags::None, EventManager::handle_urgent_events) and
res[0].first == pos) // Skip opening match if pos lies on it
last = empty(res[0]) ? std::next(res[0].second) : res[0].second;
@@ -868,11 +874,13 @@ static bool find_next(const Buffer& buffer, const BufferIterator& pos,
{
if (pos != buffer.end() and
regex_search(pos, buffer.end(), buffer.begin(), buffer.end(),
- matches, ex, match_flags(buffer, pos, buffer.end())))
+ matches, ex, match_flags(buffer, pos, buffer.end()),
+ EventManager::handle_urgent_events))
return true;
wrapped = true;
return regex_search(buffer.begin(), buffer.end(), buffer.begin(), buffer.end(),
- matches, ex, match_flags(buffer, buffer.begin(), buffer.end()));
+ matches, ex, match_flags(buffer, buffer.begin(), buffer.end()),
+ EventManager::handle_urgent_events);
}
static bool find_prev(const Buffer& buffer, const BufferIterator& pos,
@@ -883,13 +891,15 @@ static bool find_prev(const Buffer& buffer, const BufferIterator& pos,
backward_regex_search(buffer.begin(), pos, buffer.begin(), buffer.end(),
matches, ex,
match_flags(buffer, buffer.begin(), pos) |
- RegexExecFlags::NotInitialNull))
+ RegexExecFlags::NotInitialNull,
+ EventManager::handle_urgent_events))
return true;
wrapped = true;
return backward_regex_search(buffer.begin(), buffer.end(), buffer.begin(), buffer.end(),
matches, ex,
match_flags(buffer, buffer.begin(), buffer.end()) |
- RegexExecFlags::NotInitialNull);
+ RegexExecFlags::NotInitialNull,
+ EventManager::handle_urgent_events);
}
template<RegexMode mode>
@@ -935,7 +945,8 @@ Vector<Selection> select_matches(const Buffer& buffer, ConstArrayView<Selection>
auto sel_beg = buffer.iterator_at(sel.min());
auto sel_end = utf8::next(buffer.iterator_at(sel.max()), buffer.end());
- for (auto&& match : RegexIterator{sel_beg, sel_end, vm, match_flags(buffer, sel_beg, sel_end)})
+ for (auto&& match : RegexIterator{sel_beg, sel_end, vm, match_flags(buffer, sel_beg, sel_end),
+ EventManager::handle_urgent_events})
{
auto capture = match[capture_idx];
if (not capture.matched or capture.first == sel_end)