void TabSettings::reindentLine(QTextBlock block, int delta) const { const QString text = block.text(); const int oldBlockLength = text.size(); int oldIndent = indentationColumn(text); int newIndent = qMax(oldIndent + delta, 0); if (oldIndent == newIndent) return; const QString indentString = indentationString(0, newIndent); newIndent = indentString.length(); if (oldBlockLength == indentString.length() && text == indentString) return; QTextCursor cursor(block); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace(text)); cursor.removeSelectedText(); cursor.insertText(indentString); cursor.endEditBlock(); }
void TabSettings::reindentLine(QTextBlock block, int delta) const { const QString text = block.text(); const int oldBlockLength = text.size(); int oldIndent = indentationColumn(text); int newIndent = qMax(oldIndent + delta, 0); if (oldIndent == newIndent) return; QString indentString; if (m_tabPolicy == TabsOnlyTabPolicy && m_tabSize == m_indentSize) { // user likes tabs for spaces and uses tabs for indentation, preserve padding int padding = qMin(maximumPadding(text), newIndent); indentString = indentationString(0, newIndent - padding, block); indentString += QString(padding, QLatin1Char(' ')); } else { indentString = indentationString(0, newIndent, block); } if (oldBlockLength == indentString.length() && text == indentString) return; QTextCursor cursor(block); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace(text)); cursor.removeSelectedText(); cursor.insertText(indentString); cursor.endEditBlock(); }
void VfmdLine::ensureIsHorizontalRuleComputed() { if (m_isHorizontalRuleComputed) { return; } char firstNonSpaceByte = firstNonSpace(); unsigned int numOfHrBytes = 0; if (firstNonSpaceByte == '*' || firstNonSpaceByte == '-' || firstNonSpaceByte == '_') { const char hrByte = firstNonSpaceByte; const char *p = m_lineContent.data(); unsigned int sz = m_lineContent.size(); while (sz--) { const char c = *p++; if (c == hrByte) { numOfHrBytes++; } else if (c != ' ') { m_isHorizontalRule = false; m_isHorizontalRuleComputed = true; return; } } } m_isHorizontalRule = (numOfHrBytes >= 3); m_isHorizontalRuleComputed = true; }
void CodeEditer::indentLine(QTextBlock block, int newIndent) const { const QString text = block.text(); const int oldBlockLength = text.size(); // Quickly check whether indenting is required. if (oldBlockLength == 0 && newIndent == 0) return; const QString indentString = indentationString(0, newIndent); newIndent = indentString.length(); if (oldBlockLength == indentString.length() && text == indentString) return; if (oldBlockLength > indentString.length() && text.startsWith(indentString) && !text.at(indentString.length()).isSpace()) { return; } QTextCursor cursor(block); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace(text)); cursor.removeSelectedText(); cursor.insertText(indentString); cursor.endEditBlock(); }
void FakeVimProxy::indentRegion(int beginBlock, int endBlock, QChar typedChar) { QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(m_widget); if (!ed) return; const auto indentSize = theFakeVimSetting(FakeVim::Internal::ConfigShiftWidth) ->value().toInt(); QTextDocument *doc = ed->document(); QTextBlock startBlock = doc->findBlockByNumber(beginBlock); // Record line lengths for mark adjustments QVector<int> lineLengths(endBlock - beginBlock + 1); QTextBlock block = startBlock; for (int i = beginBlock; i <= endBlock; ++i) { const auto line = block.text(); lineLengths[i - beginBlock] = line.length(); if (typedChar.unicode() == 0 && line.simplified().isEmpty()) { // clear empty lines QTextCursor cursor(block); while (!cursor.atBlockEnd()) cursor.deleteChar(); } else { const auto previousBlock = block.previous(); const auto previousLine = previousBlock.isValid() ? previousBlock.text() : QString(); int indent = firstNonSpace(previousLine); if (typedChar == '}') indent = std::max(0, indent - indentSize); else if ( previousLine.endsWith("{") ) indent += indentSize; const auto indentString = QString(" ").repeated(indent); QTextCursor cursor(block); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace(line)); cursor.removeSelectedText(); cursor.insertText(indentString); cursor.endEditBlock(); } block = block.next(); } }
int TabSettings::maximumPadding(const QString &text) const { int fns = firstNonSpace(text); int i = fns; while (i > 0) { if (text.at(i-1) != QLatin1Char(' ')) break; --i; } return fns - i; }
void PlainTextEditor::indentOrUnindent( bool doIndent ) { QTextCursor cursor = textCursor(); cursor.beginEditBlock(); // Indent or unindent the selected lines int pos = cursor.position(); int anchor = cursor.anchor(); int start = qMin( anchor, pos ); int end = qMax( anchor, pos ); QTextDocument* doc = document(); QTextBlock startBlock = doc->findBlock(start); QTextBlock endBlock = doc->findBlock( end -1 ).next(); for ( QTextBlock block = startBlock; block != endBlock; block = block.next() ) { QString text = block.text(); if ( doIndent ) { const int indentPosition = firstNonSpace( text ); cursor.setPosition( block.position() +indentPosition ); cursor.insertText( QString( IndentSize, QLatin1Char( ' ' ) ) ); } else { const int indentPosition = firstNonSpace( text ); const int targetColumn = indentedColumn( columnAt( text, indentPosition ), false ); cursor.setPosition( block.position() +indentPosition ); cursor.setPosition( block.position() +targetColumn, QTextCursor::KeepAnchor ); cursor.removeSelectedText(); } } // Reselect the selected lines cursor.setPosition( startBlock.position() ); cursor.setPosition( endBlock.previous().position(), QTextCursor::KeepAnchor ); cursor.movePosition( QTextCursor::EndOfBlock, QTextCursor::KeepAnchor ); cursor.endEditBlock(); setTextCursor( cursor ); }
void TabSettings::indentLine(QTextBlock block, int newIndent, int padding) const { const QString text = block.text(); const int oldBlockLength = text.size(); if (m_continuationAlignBehavior == NoContinuationAlign) { newIndent -= padding; padding = 0; } else if (m_continuationAlignBehavior == ContinuationAlignWithIndent) { padding = 0; } // Quickly check whether indenting is required. // fixme: after changing "use spaces for tabs" the change was not reflected // because of the following optimisation. Commenting it out for now. // if (indentationColumn(text) == newIndent) // return; QString indentString; if (m_tabPolicy == TabsOnlyTabPolicy) { // user likes tabs for spaces and uses tabs for indentation, preserve padding indentString = indentationString(0, newIndent - padding, block); indentString += QString(padding, QLatin1Char(' ')); } else { indentString = indentationString(0, newIndent, block); } if (oldBlockLength == indentString.length() && text == indentString) return; QTextCursor cursor(block); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace(text)); cursor.removeSelectedText(); cursor.insertText(indentString); cursor.endEditBlock(); }
void TabSettings::indentLine(QTextBlock block, int newIndent) const { const QString text = block.text(); const int oldBlockLength = text.size(); // Quickly check whether indenting is required. if (indentationColumn(text) == newIndent) return; const QString indentString = indentationString(0, newIndent, block); newIndent = indentString.length(); if (oldBlockLength == indentString.length() && text == indentString) return; QTextCursor cursor(block); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::StartOfBlock); cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace(text)); cursor.removeSelectedText(); cursor.insertText(indentString); cursor.endEditBlock(); }
bool TabSettings::cursorIsAtBeginningOfLine(const QTextCursor &cursor) const { QString text = cursor.block().text(); int fns = firstNonSpace(text); return (cursor.position() - cursor.block().position() <= fns); }
int TabSettings::indentationColumn(const QString &text) const { return columnAt(text, firstNonSpace(text)); }
QString TabSettings::indentationString(const QString &text) const { return text.left(firstNonSpace(text)); }