diff --git a/autotests/src/completion_test.cpp b/autotests/src/completion_test.cpp --- a/autotests/src/completion_test.cpp +++ b/autotests/src/completion_test.cpp @@ -470,6 +470,18 @@ invokeCompletionBox(m_view); QCOMPARE(model->filteredItemCount(), (uint) 1); + // test matching from word start only + KateViewConfig::global()->setValue(KateViewConfig::WordCompletionMatchFromWordStart, true); + m_view->document()->setText(QStringLiteral("some")); + invokeCompletionBox(m_view); + QCOMPARE(model->filteredItemCount(), (uint) 4); + // now with the default value + KateViewConfig::global()->setValue(KateViewConfig::WordCompletionMatchFromWordStart, false); + m_view->document()->setText(QStringLiteral("some")); + invokeCompletionBox(m_view); + QCOMPARE(model->filteredItemCount(), (uint) 6); + + m_view->document()->setText(QStringLiteral("matched")); m_view->userInvokedCompletion(); QApplication::processEvents(); diff --git a/src/completion/katecompletionmodel.cpp b/src/completion/katecompletionmodel.cpp --- a/src/completion/katecompletionmodel.cpp +++ b/src/completion/katecompletionmodel.cpp @@ -2007,8 +2007,8 @@ } matchCompletion = (m_nameColumn.startsWith(match, model->matchCaseSensitivity()) ? StartsWithMatch : NoMatch); - if (matchCompletion == NoMatch) { - // if no match, try for "contains" + if (! model->view()->config()->wordCompletionMatchFromWordStart() && matchCompletion == NoMatch) { + // If no match, and wordCompletionMatchFromWordStart() is false, try for "contains" // Only match when the occurrence is at a "word" beginning, marked by // an underscore or a capital. So Foo matches BarFoo and Bar_Foo, but not barfoo. // Starting at 1 saves looking at the beginning of the word, that was already checked above. diff --git a/src/dialogs/completionconfigtab.ui b/src/dialogs/completionconfigtab.ui --- a/src/dialogs/completionconfigtab.ui +++ b/src/dialogs/completionconfigtab.ui @@ -79,6 +79,16 @@ + + + + Only show completion items that match the beginning of a word, e.g. "Foo" will match "Foobar" but will not match "BarFoo". Note that the beginning of a word is marked by a capital letter or an underscore. + + + Only show completions matching word beginning + + + diff --git a/src/dialogs/katedialogs.cpp b/src/dialogs/katedialogs.cpp --- a/src/dialogs/katedialogs.cpp +++ b/src/dialogs/katedialogs.cpp @@ -244,6 +244,7 @@ observeChanges(ui->chkAutoCompletionEnabled); observeChanges(ui->gbKeywordCompletion); observeChanges(ui->gbWordCompletion); + observeChanges(ui->fromWordStart); observeChanges(ui->minimalWordLength); observeChanges(ui->removeTail); @@ -274,6 +275,7 @@ KateViewConfig::global()->setValue(KateViewConfig::AutomaticCompletionInvocation, ui->chkAutoCompletionEnabled->isChecked()); KateViewConfig::global()->setValue(KateViewConfig::KeywordCompletion, ui->gbKeywordCompletion->isChecked()); KateViewConfig::global()->setValue(KateViewConfig::WordCompletion, ui->gbWordCompletion->isChecked()); + KateViewConfig::global()->setValue(KateViewConfig::WordCompletionMatchFromWordStart, ui->fromWordStart->isChecked()); KateViewConfig::global()->setValue(KateViewConfig::WordCompletionMinimalWordLength, ui->minimalWordLength->value()); KateViewConfig::global()->setValue(KateViewConfig::WordCompletionRemoveTail, ui->removeTail->isChecked()); @@ -287,6 +289,7 @@ ui->gbKeywordCompletion->setChecked(KateViewConfig::global()->keywordCompletion()); ui->gbWordCompletion->setChecked(KateViewConfig::global()->wordCompletion()); + ui->fromWordStart->setChecked(KateViewConfig::global()->wordCompletionMatchFromWordStart()); ui->minimalWordLength->setValue(KateViewConfig::global()->wordCompletionMinimalWordLength()); ui->removeTail->setChecked(KateViewConfig::global()->wordCompletionRemoveTail()); } diff --git a/src/utils/kateconfig.h b/src/utils/kateconfig.h --- a/src/utils/kateconfig.h +++ b/src/utils/kateconfig.h @@ -989,6 +989,7 @@ ViInputModeStealKeys, ViRelativeLineNumbers, WordCompletion, + WordCompletionMatchFromWordStart, WordCompletionMinimalWordLength, WordCompletionRemoveTail, }; @@ -1187,6 +1188,11 @@ return value(KeywordCompletion).toBool(); } + bool wordCompletionMatchFromWordStart() const + { + return value(WordCompletionMatchFromWordStart).toBool(); + } + int wordCompletionMinimalWordLength() const { return value(WordCompletionMinimalWordLength).toInt(); diff --git a/src/utils/kateconfig.cpp b/src/utils/kateconfig.cpp --- a/src/utils/kateconfig.cpp +++ b/src/utils/kateconfig.cpp @@ -556,6 +556,7 @@ addConfigEntry(ConfigEntry(ViInputModeStealKeys, "Vi Input Mode Steal Keys", QString(), false)); addConfigEntry(ConfigEntry(ViRelativeLineNumbers, "Vi Relative Line Numbers", QString(), false)); addConfigEntry(ConfigEntry(WordCompletion, "Word Completion", QString(), true)); + addConfigEntry(ConfigEntry(WordCompletionMatchFromWordStart, "Word Completion Match From Word Start Only", QString(), false)); addConfigEntry(ConfigEntry(WordCompletionMinimalWordLength, "Word Completion Minimal Word Length", QString(), 3, [](const QVariant &value) { return inBounds(0, value, 99); })); addConfigEntry(ConfigEntry(WordCompletionRemoveTail, "Word Completion Remove Tail", QString(), true));