From 216db6320cd37393a39de68c3ac1d24c03979378 Mon Sep 17 00:00:00 2001 From: Lukas Holecek Date: Sat, 17 Nov 2012 21:39:23 +0100 Subject: [PATCH] fakevim: Fix search for [a-z]* and other character ranges Correctly convert Vim regular expression with braces to QRegExp. E.g. [a-z] in case insensitive mode should be [a-zA-Z]. Change-Id: Iea4e0220ef7d82041884f61b3ee0fed9f912e7b0 Reviewed-by: hjk --- src/plugins/fakevim/fakevimhandler.cpp | 35 ++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index 1ba8cc7d2ae..edf4b0d69be 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -373,6 +373,8 @@ static QRegExp vimPatternToQtPattern(QString needle, bool smartcase) bool escape = false; bool brace = false; + bool embraced = false; + bool range = false; bool curly = false; foreach (const QChar &c, needle) { if (brace) { @@ -380,11 +382,35 @@ static QRegExp vimPatternToQtPattern(QString needle, bool smartcase) if (c == ']') { pattern.append(_("\\[\\]")); continue; - } else { - pattern.append('['); } + pattern.append('['); + escape = true; + embraced = true; } - if (QString("(){}+|?").indexOf(c) != -1) { + if (embraced) { + if (range) { + QChar c2 = pattern[pattern.size() - 2]; + pattern.remove(pattern.size() - 2, 2); + pattern.append(c2.toUpper() + '-' + c.toUpper()); + pattern.append(c2.toLower() + '-' + c.toLower()); + range = false; + } else if (escape) { + escape = false; + pattern.append(c); + } else if (c == '\\') { + escape = true; + } else if (c == ']') { + pattern.append(']'); + embraced = false; + } else if (c == '-') { + range = ignorecase && pattern[pattern.size() - 1].isLetter(); + pattern.append('-'); + } else if (c.isLetter() && ignorecase) { + pattern.append(c.toLower() + c.toUpper()); + } else { + pattern.append(c); + } + } else if (QString("(){}+|?").indexOf(c) != -1) { if (c == '{') { curly = escape; } else if (c == '}' && curly) { @@ -2299,9 +2325,8 @@ void FakeVimHandler::Private::updateFind(bool isComplete) g.currentMessage.clear(); - const QString &needle = g.searchBuffer.contents(); SearchData sd; - sd.needle = needle; + sd.needle = g.searchBuffer.contents(); sd.forward = g.lastSearchForward; sd.highlightMatches = isComplete; if (isComplete) {