diff --git a/src/completion/katewordcompletion.cpp b/src/completion/katewordcompletion.cpp --- a/src/completion/katewordcompletion.cpp +++ b/src/completion/katewordcompletion.cpp @@ -247,31 +247,57 @@ ) const { KTextEditor::ViewPrivate *v = qobject_cast (view); + + const bool blockSelection = v->blockSelection() && v->selection(); + + KTextEditor::Range range = blockSelection ? (KTextEditor::Range(word.start(), v->selectionRange().end())) : word; + if (v->config()->wordCompletionRemoveTail()) { - int tailStart = word.end().column(); - const QString &line = view->document()->line(word.end().line()); - int tailEnd = line.length(); - for (int i = word.end().column(); i < tailEnd; ++i) { - // Letters, numbers and underscore are part of a word! - /// \todo Introduce configurable \e word-separators?? - if (!line[i].isLetterOrNumber() && line[i] != QLatin1Char('_')) { - tailEnd = i; + + v->doc()->replaceText(range, m_matches.at(index.row()), blockSelection); + v->doc()->editEnd(); + + if (blockSelection && !range.onSingleLine()) { + KTextEditor::Range selectionRange = view->selectionRange(); + const int selectionEndColumn = selectionRange.end().column(); + v->doc()->editStart(); + for (int i = selectionRange.start().line(); i <= selectionRange.end().line(); ++i) { + const QString &line = v->doc()->line(i); + int tailEnd = line.length(); + for (int j = selectionEndColumn; j < tailEnd; ++j) { + // Letters, numbers and underscore are part of a word! + /// \todo Introduce configurable \e word-separators?? + if (!line[j].isLetterOrNumber() && line[j] != QLatin1Char('_')) { + tailEnd = j; + } + } + + v->doc()->removeText(KTextEditor::Range(KTextEditor::Cursor(i, selectionEndColumn), KTextEditor::Cursor(i, tailEnd))); + } + } else { + int tailStart = word.end().column(); + const QString &line = view->document()->line(word.end().line()); + int tailEnd = line.length(); + for (int i = word.end().column(); i < tailEnd; ++i) { + // Letters, numbers and underscore are part of a word! + /// \todo Introduce configurable \e word-separators?? + if (!line[i].isLetterOrNumber() && line[i] != QLatin1Char('_')) { + tailEnd = i; + } } - } - int sizeDiff = m_matches.at(index.row()).size() - (word.end().column() - word.start().column()); + int sizeDiff = m_matches.at(index.row()).size() - (word.end().column() - word.start().column()); - tailStart += sizeDiff; - tailEnd += sizeDiff; + tailStart += sizeDiff; + tailEnd += sizeDiff; - KTextEditor::Range tail(KTextEditor::Cursor(word.start().line(), tailStart), KTextEditor::Cursor(word.end().line(), tailEnd)); + KTextEditor::Range tail(KTextEditor::Cursor(word.start().line(), tailStart), KTextEditor::Cursor(word.end().line(), tailEnd)); - view->document()->replaceText(word, m_matches.at(index.row())); - v->doc()->editEnd(); - v->doc()->editStart(); - view->document()->replaceText(tail, QString()); + v->doc()->editStart(); + view->document()->replaceText(tail, QString()); + } } else { - view->document()->replaceText(word, m_matches.at(index.row())); + v->doc()->replaceText(range, m_matches.at(index.row()), blockSelection); } } diff --git a/src/document/katedocument.cpp b/src/document/katedocument.cpp --- a/src/document/katedocument.cpp +++ b/src/document/katedocument.cpp @@ -5173,7 +5173,14 @@ // TODO more efficient? editStart(); bool changed = removeText(range, block); - changed |= insertText(range.start(), s, block); + + // handle text completion for multiline block selection + if (block && !range.onSingleLine()) { + changed |= typeChars(static_cast(activeView()), s); + } else { + changed |= insertText(range.start(), s, block); + } + editEnd(); return changed; }