summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-04-22 19:31:31 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-04-22 19:32:12 +0100
commit389308dfd812a499df5dac86d98c8e1be9604dea (patch)
tree8f52f1b99ab25d41f0527acdec89262b6ae04c84 /src
parent65c818b85970135f9fff3b71432d2a8f331f8526 (diff)
Preserve current word in word completion if found elsewhere
If occurence count in the buffer if greater that one, do not remove it from the matches.
Diffstat (limited to 'src')
-rw-r--r--src/input_handler.cc6
-rw-r--r--src/unit_tests.cc2
-rw-r--r--src/word_db.cc8
-rw-r--r--src/word_db.hh1
4 files changed, 15 insertions, 2 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index 037bcdcf..49c02367 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -776,11 +776,13 @@ public:
String current_word{begin, end};
+ auto& word_db = get_word_db(buffer);
std::unordered_set<String> matches;
- auto bufmatches = get_word_db(buffer).find_prefix(prefix);
+ auto bufmatches = word_db.find_prefix(prefix);
matches.insert(bufmatches.begin(), bufmatches.end());
- matches.erase(current_word);
+ if (word_db.get_word_occurences(current_word) <= 1)
+ matches.erase(current_word);
if (other_buffers)
{
diff --git a/src/unit_tests.cc b/src/unit_tests.cc
index 66fe53f2..e26ce611 100644
--- a/src/unit_tests.cc
+++ b/src/unit_tests.cc
@@ -80,6 +80,8 @@ void test_word_db()
auto res = word_db.find_prefix("");
std::sort(res.begin(), res.end());
kak_assert(res == std::vector<String>{ "allo" COMMA "kanaky" COMMA "mutch" COMMA "tchaa" COMMA "tchou" });
+ kak_assert(word_db.get_word_occurences("tchou") == 3);
+ kak_assert(word_db.get_word_occurences("allo") == 1);
buffer.erase(buffer.iterator_at({1, 6}), buffer.iterator_at({4, 0}));
res = word_db.find_prefix("");
std::sort(res.begin(), res.end());
diff --git a/src/word_db.cc b/src/word_db.cc
index e33d15ed..e9b05795 100644
--- a/src/word_db.cc
+++ b/src/word_db.cc
@@ -112,4 +112,12 @@ std::vector<String> WordDB::find_prefix(const String& prefix)
return res;
}
+int WordDB::get_word_occurences(const String& word) const
+{
+ auto it = m_words.find(word);
+ if (it != m_words.end())
+ return it->second;
+ return 0;
+}
+
}
diff --git a/src/word_db.hh b/src/word_db.hh
index 48ed2c4f..950cc05d 100644
--- a/src/word_db.hh
+++ b/src/word_db.hh
@@ -18,6 +18,7 @@ public:
WordDB(const Buffer& buffer);
std::vector<String> find_prefix(const String& prefix);
+ int get_word_occurences(const String& word) const;
using WordList = std::map<String, int>;
private: