summaryrefslogtreecommitdiff
path: root/src/insert_completer.cc
diff options
context:
space:
mode:
authorAndrew Vos <andrew.vos@gmail.com>2020-11-16 16:02:13 +0000
committerAndrew Vos <andrew.vos@gmail.com>2020-11-20 20:00:46 +0000
commitf3f3f806243efcd15d8000b96119608dd79163ab (patch)
tree1e261c64fcc7b2bbf2575d3e931b83b6abcff9a6 /src/insert_completer.cc
parentefd38881d3bc8fcc08bd0aa1c52489a5bfc354d3 (diff)
Ignore indent when completing lines
When doing line completion, we previously used to not complete the line if it had different indent to the potential completion. This commit changes the behaviour to ignore indentation when completing lines.
Diffstat (limited to 'src/insert_completer.cc')
-rw-r--r--src/insert_completer.cc17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/insert_completer.cc b/src/insert_completer.cc
index ca6b08a1..43a4fc61 100644
--- a/src/insert_completer.cc
+++ b/src/insert_completer.cc
@@ -348,7 +348,8 @@ InsertCompletion complete_line(const SelectionList& sels,
const ColumnCount tabstop = options["tabstop"].get<int>();
const ColumnCount column = get_column(buffer, tabstop, cursor_pos);
- StringView prefix = buffer[cursor_pos.line].substr(0_byte, cursor_pos.column);
+ StringView prefix = trim_indent(buffer[cursor_pos.line].substr(0_byte, cursor_pos.column));
+ BufferCoord replace_begin = buffer.advance(cursor_pos, -prefix.length());
InsertCompletion::CandidateList candidates;
auto add_candidates = [&](const Buffer& buf) {
@@ -356,12 +357,16 @@ InsertCompletion complete_line(const SelectionList& sels,
{
if (buf.name() == buffer.name() && l == cursor_pos.line)
continue;
- const StringView line = buf[l];
+
+ const StringView line = trim_indent(buf[l]);
+
+ if (line.length() == 0)
+ continue;
+
if (prefix == line.substr(0_byte, prefix.length()))
{
- StringView candidate = line.substr(0_byte, line.length()-1);
- candidates.push_back({candidate.str(), "",
- {expand_tabs(candidate, tabstop, column), {}}});
+ StringView candidate = trim_indent(line.substr(0_byte, line.length()));
+ candidates.push_back({candidate.str(), "", {expand_tabs(candidate, tabstop, column), {}} });
// perf: it's unlikely the user intends to search among >10 candidates anyway
if (candidates.size() == 100)
break;
@@ -384,7 +389,7 @@ InsertCompletion complete_line(const SelectionList& sels,
return {};
std::sort(candidates.begin(), candidates.end());
candidates.erase(std::unique(candidates.begin(), candidates.end()), candidates.end());
- return { std::move(candidates), cursor_pos.line, cursor_pos, buffer.timestamp() };
+ return { std::move(candidates), replace_begin, cursor_pos, buffer.timestamp() };
}
}