forked from qt-creator/qt-creator
work on substitution command in fakevim
This commit is contained in:
@@ -1701,6 +1701,7 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
|||||||
static QRegExp reNormal("^norm(al)?( (.*))?$");
|
static QRegExp reNormal("^norm(al)?( (.*))?$");
|
||||||
static QRegExp reSet("^set?( (.*))?$");
|
static QRegExp reSet("^set?( (.*))?$");
|
||||||
static QRegExp reWrite("^w!?( (.*))?$");
|
static QRegExp reWrite("^w!?( (.*))?$");
|
||||||
|
static QRegExp reSubstitute("^s(.)(.*)\\1(.*)\\1([gi]*)");
|
||||||
|
|
||||||
if (cmd.isEmpty()) {
|
if (cmd.isEmpty()) {
|
||||||
setPosition(firstPositionInLine(beginLine));
|
setPosition(firstPositionInLine(beginLine));
|
||||||
@@ -1805,6 +1806,47 @@ void FakeVimHandler::Private::handleExCommand(const QString &cmd0)
|
|||||||
enterCommandMode();
|
enterCommandMode();
|
||||||
//qDebug() << "REPLAY: " << reNormal.cap(3);
|
//qDebug() << "REPLAY: " << reNormal.cap(3);
|
||||||
replay(reNormal.cap(3), 1);
|
replay(reNormal.cap(3), 1);
|
||||||
|
} else if (reSubstitute.indexIn(cmd) != -1) { // :substitute
|
||||||
|
QString needle = reSubstitute.cap(2);
|
||||||
|
const QString replacement = reSubstitute.cap(3);
|
||||||
|
QString flags = reSubstitute.cap(4);
|
||||||
|
const bool startOfLineOnly = needle.startsWith('^');
|
||||||
|
if (startOfLineOnly)
|
||||||
|
needle.remove(0, 1);
|
||||||
|
needle.replace('$', '\n');
|
||||||
|
needle.replace("\\\n", "\\$");
|
||||||
|
QRegExp pattern(needle);
|
||||||
|
if (flags.contains('i'))
|
||||||
|
pattern.setCaseSensitivity(Qt::CaseInsensitive);
|
||||||
|
const bool global = flags.contains('g');
|
||||||
|
m_tc.beginEditBlock();
|
||||||
|
for (int line = beginLine; line <= endLine; ++line) {
|
||||||
|
const int start = firstPositionInLine(line);
|
||||||
|
const int end = lastPositionInLine(line);
|
||||||
|
for (int position = start; position <= end && position >= start; ) {
|
||||||
|
position = pattern.indexIn(m_tc.document()->toPlainText(), position);
|
||||||
|
if (startOfLineOnly && position != start)
|
||||||
|
break;
|
||||||
|
if (position != -1) {
|
||||||
|
m_tc.setPosition(position);
|
||||||
|
m_tc.movePosition(QTextCursor::NextCharacter,
|
||||||
|
QTextCursor::KeepAnchor, pattern.matchedLength());
|
||||||
|
QString text = m_tc.selectedText();
|
||||||
|
if (text.endsWith(ParagraphSeparator)) {
|
||||||
|
text = replacement + "\n";
|
||||||
|
} else {
|
||||||
|
text.replace(ParagraphSeparator, "\n");
|
||||||
|
text.replace(pattern, replacement);
|
||||||
|
}
|
||||||
|
m_tc.removeSelectedText();
|
||||||
|
m_tc.insertText(text);
|
||||||
|
}
|
||||||
|
if (!global)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_tc.endEditBlock();
|
||||||
|
enterCommandMode();
|
||||||
} else if (reSet.indexIn(cmd) != -1) { // :set
|
} else if (reSet.indexIn(cmd) != -1) { // :set
|
||||||
showBlackMessage(QString());
|
showBlackMessage(QString());
|
||||||
QString arg = reSet.cap(2);
|
QString arg = reSet.cap(2);
|
||||||
|
Reference in New Issue
Block a user