Index: src/document/katedocument.cpp =================================================================== --- src/document/katedocument.cpp +++ src/document/katedocument.cpp @@ -114,19 +114,17 @@ return indexOf(list, entry) >= 0; } -static inline QChar matchingStartBracket(QChar c, bool withQuotes) +static inline QChar matchingStartBracket(const QChar &c) { switch (c.toLatin1()) { case '}': return QLatin1Char('{'); case ']': return QLatin1Char('['); case ')': return QLatin1Char('('); - case '\'': return withQuotes ? QLatin1Char('\'') : QChar(); - case '"': return withQuotes ? QLatin1Char('"') : QChar(); } return QChar(); } -static inline QChar matchingEndBracket(QChar c, bool withQuotes) +static inline QChar matchingEndBracket(const QChar &c, bool withQuotes = true) { switch (c.toLatin1()) { case '{': return QLatin1Char('}'); @@ -138,23 +136,23 @@ return QChar(); } -static inline QChar matchingBracket(QChar c, bool withQuotes) +static inline QChar matchingBracket(const QChar &c) { - QChar bracket = matchingStartBracket(c, withQuotes); + QChar bracket = matchingStartBracket(c); if (bracket.isNull()) { - bracket = matchingEndBracket(c, false); + bracket = matchingEndBracket(c, /*withQuotes=*/false); } return bracket; } static inline bool isStartBracket(const QChar &c) { - return ! matchingEndBracket(c, false).isNull(); + return ! matchingEndBracket(c, /*withQuotes=*/false).isNull(); } static inline bool isEndBracket(const QChar &c) { - return ! matchingStartBracket(c, false).isNull(); + return ! matchingStartBracket(c).isNull(); } static inline bool isBracket(const QChar &c) @@ -2957,21 +2955,35 @@ */ QChar closingBracket; if (view->config()->autoBrackets() && chars.size() == 1) { + const QChar typedChar = chars.at(0); /** * we inserted a bracket? * => remember the matching closing one */ - closingBracket = matchingEndBracket(chars[0], true); + closingBracket = matchingEndBracket(typedChar); /** * closing bracket for the autobracket we inserted earlier? */ - if ( m_currentAutobraceClosingChar == chars[0] && m_currentAutobraceRange ) { + if ( m_currentAutobraceClosingChar == typedChar && m_currentAutobraceRange ) { // do nothing m_currentAutobraceRange.reset(nullptr); view->cursorRight(); return true; } + + // Treat some char also as "auto bracket" only when we have a selection + // Some of these may handy when write Markdown, some perhaps elsewhere + if (view->selection() && closingBracket.isNull()) { + if (QStringLiteral("ยด`_.:|#@~*!?$%/\\=").contains(typedChar)) { + closingBracket = typedChar; + } else { + switch (typedChar.toLatin1()) { + case '>': closingBracket = QLatin1Char('<'); break; + case '<': closingBracket = QLatin1Char('>'); break; + } + } + } } /** @@ -4065,7 +4077,7 @@ return KTextEditor::Range::invalid(); } - const QChar opposite = matchingBracket(bracket, false); + const QChar opposite = matchingBracket(bracket); if (opposite.isNull()) { return KTextEditor::Range::invalid(); }