diff --git a/src/utils/veditutils.cpp b/src/utils/veditutils.cpp index 808769c6..4467cce6 100644 --- a/src/utils/veditutils.cpp +++ b/src/utils/veditutils.cpp @@ -919,14 +919,21 @@ void VEditUtils::insertTitleMark(QTextCursor &p_cursor, void VEditUtils::findCurrentWord(QTextCursor p_cursor, int &p_start, - int &p_end) + int &p_end, + bool p_findPrecedingWord) { QString text = p_cursor.block().text(); int pib = p_cursor.positionInBlock(); if (pib < text.size() && text[pib].isSpace()) { - p_start = p_end = p_cursor.position(); - return; + if (!p_findPrecedingWord + || pib == 0 + || text[pib - 1].isSpace()) { + p_start = p_end = p_cursor.position(); + return; + } + + p_cursor.movePosition(QTextCursor::PreviousCharacter); } p_cursor.movePosition(QTextCursor::StartOfWord); diff --git a/src/utils/veditutils.h b/src/utils/veditutils.h index b164e831..ca5da4e6 100644 --- a/src/utils/veditutils.h +++ b/src/utils/veditutils.h @@ -182,7 +182,8 @@ public: // @p_start will equals to @p_end if @p_cursor is a space. static void findCurrentWord(QTextCursor p_cursor, int &p_start, - int &p_end); + int &p_end, + bool p_findPrecedingWord = false); // Find the start and end of the WORD @p_cursor locates in (within a single block). // @p_start and @p_end will be the global position of the start and end of the WORD. diff --git a/src/veditor.cpp b/src/veditor.cpp index 526b68f5..0b66c6e1 100644 --- a/src/veditor.cpp +++ b/src/veditor.cpp @@ -1187,7 +1187,7 @@ QStringList VEditor::generateCompletionCandidates() const QString content = getContent(); QTextCursor cursor = textCursorW(); int start, end; - VEditUtils::findCurrentWord(cursor, start, end); + VEditUtils::findCurrentWord(cursor, start, end, true); QRegExp reg("\\W+");