summaryrefslogtreecommitdiff
path: root/src/insert_completer.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-10-12 12:41:52 +1100
committerMaxime Coste <mawww@kakoune.org>2020-10-12 12:41:52 +1100
commitf6c67f783185e649b42db26656ab588b48084809 (patch)
treecbdaba3eedd3d6b1754a7a7f18a226fe53f282ea /src/insert_completer.cc
parent246a32797a17e7cdebcde64ac98c09501d1da10d (diff)
Code cleanup in insert completer
Diffstat (limited to 'src/insert_completer.cc')
-rw-r--r--src/insert_completer.cc120
1 files changed, 59 insertions, 61 deletions
diff --git a/src/insert_completer.cc b/src/insert_completer.cc
index 94c1a95e..03ce45a5 100644
--- a/src/insert_completer.cc
+++ b/src/insert_completer.cc
@@ -261,76 +261,74 @@ InsertCompletion complete_option(const SelectionList& sels,
auto& desc = opt.prefix;
static const Regex re(R"((\d+)\.(\d+)(?:\+(\d+))?@(\d+))");
MatchResults<String::const_iterator> match;
- if (regex_match(desc.begin(), desc.end(), match, re))
- {
- BufferCoord coord{ str_to_int({match[1].first, match[1].second}) - 1,
- str_to_int({match[2].first, match[2].second}) - 1 };
- if (not buffer.is_valid(coord))
- return {};
- size_t timestamp = (size_t)str_to_int({match[4].first, match[4].second});
- auto changes = buffer.changes_since(timestamp);
- if (any_of(changes, [&](auto&& change) { return change.begin < coord; }))
- return {};
-
- if (cursor_pos.line == coord.line and cursor_pos.column >= coord.column)
- {
- StringView query = buffer.substr(coord, cursor_pos);
+ if (not regex_match(desc.begin(), desc.end(), match, re))
+ return {};
- const ColumnCount tabstop = options["tabstop"].get<int>();
- const ColumnCount column = get_column(buffer, tabstop, cursor_pos);
+ BufferCoord coord{str_to_int({match[1].first, match[1].second}) - 1,
+ str_to_int({match[2].first, match[2].second}) - 1};
+ if (not buffer.is_valid(coord))
+ return {};
+ size_t timestamp = (size_t)str_to_int({match[4].first, match[4].second});
+ auto changes = buffer.changes_since(timestamp);
+ if (any_of(changes, [&](auto&& change) { return change.begin < coord; }))
+ return {};
- struct RankedMatchAndInfo : RankedMatch
- {
- using RankedMatch::RankedMatch;
- using RankedMatch::operator==;
- using RankedMatch::operator<;
+ if (cursor_pos.line != coord.line or cursor_pos.column < coord.column)
+ return {};
- StringView on_select;
- DisplayLine menu_entry;
- };
+ const ColumnCount tabstop = options["tabstop"].get<int>();
+ const ColumnCount column = get_column(buffer, tabstop, cursor_pos);
- Vector<RankedMatchAndInfo> matches;
+ struct RankedMatchAndInfo : RankedMatch
+ {
+ using RankedMatch::RankedMatch;
+ using RankedMatch::operator==;
+ using RankedMatch::operator<;
- for (auto& candidate : opt.list)
- {
- if (RankedMatchAndInfo match{std::get<0>(candidate), query})
- {
- match.on_select = std::get<1>(candidate);
- auto& menu = std::get<2>(candidate);
- match.menu_entry = not menu.empty() ?
- parse_display_line(expand_tabs(menu, tabstop, column), faces)
- : DisplayLine{ expand_tabs(menu, tabstop, column), {} };
-
- matches.push_back(std::move(match));
- }
- }
+ StringView on_select;
+ DisplayLine menu_entry;
+ };
- constexpr size_t max_count = 100;
- // Gather best max_count matches
- auto greater = [](auto& lhs, auto& rhs) { return rhs < lhs; };
- auto first = matches.begin(), last = matches.end();
- std::make_heap(first, last, greater);
- InsertCompletion::CandidateList candidates;
- candidates.reserve(std::min(matches.size(), max_count));
- candidates.reserve(matches.size());
- while (candidates.size() < max_count and first != last)
- {
- if (candidates.empty() or candidates.back().completion != first->candidate())
- candidates.push_back({ first->candidate().str(), first->on_select.str(),
- std::move(first->menu_entry) });
- std::pop_heap(first, last--, greater);
- }
+ StringView query = buffer.substr(coord, cursor_pos);
+ Vector<RankedMatchAndInfo> matches;
- auto end = cursor_pos;
- if (match[3].matched)
- {
- ByteCount len = str_to_int({match[3].first, match[3].second});
- end = buffer.advance(coord, len);
- }
- return { std::move(candidates), coord, end, timestamp };
+ for (auto& candidate : opt.list)
+ {
+ if (RankedMatchAndInfo match{std::get<0>(candidate), query})
+ {
+ match.on_select = std::get<1>(candidate);
+ auto& menu = std::get<2>(candidate);
+ match.menu_entry = not menu.empty() ?
+ parse_display_line(expand_tabs(menu, tabstop, column), faces)
+ : DisplayLine{String{}, {}};
+
+ matches.push_back(std::move(match));
}
}
- return {};
+
+ constexpr size_t max_count = 100;
+ // Gather best max_count matches
+ auto greater = [](auto& lhs, auto& rhs) { return rhs < lhs; };
+ auto first = matches.begin(), last = matches.end();
+ std::make_heap(first, last, greater);
+ InsertCompletion::CandidateList candidates;
+ candidates.reserve(std::min(matches.size(), max_count));
+ candidates.reserve(matches.size());
+ while (candidates.size() < max_count and first != last)
+ {
+ if (candidates.empty() or candidates.back().completion != first->candidate())
+ candidates.push_back({ first->candidate().str(), first->on_select.str(),
+ std::move(first->menu_entry) });
+ std::pop_heap(first, last--, greater);
+ }
+
+ auto end = cursor_pos;
+ if (match[3].matched)
+ {
+ ByteCount len = str_to_int({match[3].first, match[3].second});
+ end = buffer.advance(coord, len);
+ }
+ return { std::move(candidates), coord, end, timestamp };
}
template<bool other_buffers>