diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index 4bb47b9c152..9924d09bc7e 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -288,7 +288,8 @@ void FakeVimOptionPage::copyTextEditorSettings()
m_ui.checkBoxExpandTab->setChecked(ts.m_spacesForTabs);
m_ui.spinBoxTabStop->setValue(ts.m_tabSize);
m_ui.spinBoxShiftWidth->setValue(ts.m_indentSize);
- m_ui.checkBoxSmartTab->setChecked(ts.m_smartBackspace);
+ m_ui.checkBoxSmartTab->setChecked(
+ ts.m_smartBackspaceBehavior == TabSettings::BackspaceFollowsPreviousIndents);
m_ui.checkBoxAutoIndent->setChecked(true);
m_ui.checkBoxSmartIndent->setChecked(ts.m_autoIndent);
m_ui.checkBoxIncSearch->setChecked(true);
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index f08fa5ff1a0..b9a93ee844b 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -4529,12 +4529,12 @@ void BaseTextEditorWidget::handleBackspaceKey()
return;
bool handled = false;
- if (!tabSettings.m_smartBackspace) {
+ if (tabSettings.m_smartBackspaceBehavior == TabSettings::BackspaceNeverIndents) {
if (cursorWithinSnippet)
cursor.beginEditBlock();
cursor.deletePreviousChar();
handled = true;
- } else {
+ } else if (tabSettings.m_smartBackspaceBehavior == TabSettings::BackspaceFollowsPreviousIndents) {
QTextBlock currentBlock = cursor.block();
int positionInBlock = pos - currentBlock.position();
const QString blockText = currentBlock.text();
@@ -4544,9 +4544,12 @@ void BaseTextEditorWidget::handleBackspaceKey()
cursor.deletePreviousChar();
handled = true;
} else {
+ if (cursorWithinSnippet) {
+ d->m_snippetOverlay->clear();
+ cursorWithinSnippet = false;
+ }
int previousIndent = 0;
const int indent = tabSettings.columnAt(blockText, positionInBlock);
-
for (QTextBlock previousNonEmptyBlock = currentBlock.previous();
previousNonEmptyBlock.isValid();
previousNonEmptyBlock = previousNonEmptyBlock.previous()) {
@@ -4554,8 +4557,8 @@ void BaseTextEditorWidget::handleBackspaceKey()
if (previousNonEmptyBlockText.trimmed().isEmpty())
continue;
previousIndent =
- tabSettings.columnAt(previousNonEmptyBlockText,
- tabSettings.firstNonSpace(previousNonEmptyBlockText));
+ tabSettings.columnAt(previousNonEmptyBlockText,
+ tabSettings.firstNonSpace(previousNonEmptyBlockText));
if (previousIndent < indent) {
cursor.beginEditBlock();
cursor.setPosition(currentBlock.position(), QTextCursor::KeepAnchor);
@@ -4566,6 +4569,19 @@ void BaseTextEditorWidget::handleBackspaceKey()
}
}
}
+ } else if (tabSettings.m_smartBackspaceBehavior == TabSettings::BackspaceUnindents) {
+ if (!pos || !characterAt(pos - 1).isSpace()) {
+ if (cursorWithinSnippet)
+ cursor.beginEditBlock();
+ cursor.deletePreviousChar();
+ } else {
+ if (cursorWithinSnippet) {
+ d->m_snippetOverlay->clear();
+ cursorWithinSnippet = false;
+ }
+ indentOrUnindent(false);
+ }
+ handled = true;
}
if (!handled) {
diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp
index 447eeea534b..09c7bf04743 100644
--- a/src/plugins/texteditor/tabsettings.cpp
+++ b/src/plugins/texteditor/tabsettings.cpp
@@ -42,7 +42,7 @@
static const char spacesForTabsKey[] = "SpacesForTabs";
static const char autoSpacesForTabsKey[] = "AutoSpacesForTabs";
-static const char smartBackspaceKey[] = "SmartBackspace";
+static const char smartBackspaceBehaviorKey[] = "SmartBackspaceBehavior";
static const char autoIndentKey[] = "AutoIndent";
static const char tabSizeKey[] = "TabSize";
static const char indentSizeKey[] = "IndentSize";
@@ -58,11 +58,11 @@ TabSettings::TabSettings() :
m_spacesForTabs(true),
m_autoSpacesForTabs(false),
m_autoIndent(true),
- m_smartBackspace(false),
m_tabSize(8),
m_indentSize(4),
m_tabKeyBehavior(TabNeverIndents),
- m_continuationAlignBehavior(ContinuationAlignWithSpaces)
+ m_continuationAlignBehavior(ContinuationAlignWithSpaces),
+ m_smartBackspaceBehavior(BackspaceNeverIndents)
{
}
@@ -82,7 +82,7 @@ void TabSettings::toMap(const QString &prefix, QVariantMap *map) const
map->insert(prefix + QLatin1String(spacesForTabsKey), m_spacesForTabs);
map->insert(prefix + QLatin1String(autoSpacesForTabsKey), m_autoSpacesForTabs);
map->insert(prefix + QLatin1String(autoIndentKey), m_autoIndent);
- map->insert(prefix + QLatin1String(smartBackspaceKey), m_smartBackspace);
+ map->insert(prefix + QLatin1String(smartBackspaceBehaviorKey), m_smartBackspaceBehavior);
map->insert(prefix + QLatin1String(tabSizeKey), m_tabSize);
map->insert(prefix + QLatin1String(indentSizeKey), m_indentSize);
map->insert(prefix + QLatin1String(tabKeyBehaviorKey), m_tabKeyBehavior);
@@ -96,8 +96,9 @@ void TabSettings::fromMap(const QString &prefix, const QVariantMap &map)
m_autoSpacesForTabs =
map.value(prefix + QLatin1String(autoSpacesForTabsKey), m_autoSpacesForTabs).toBool();
m_autoIndent = map.value(prefix + QLatin1String(autoIndentKey), m_autoIndent).toBool();
- m_smartBackspace =
- map.value(prefix + QLatin1String(smartBackspaceKey), m_smartBackspace).toBool();
+ m_smartBackspaceBehavior = (SmartBackspaceBehavior)
+ map.value(prefix + QLatin1String(smartBackspaceBehaviorKey),
+ m_smartBackspaceBehavior).toInt();
m_tabSize = map.value(prefix + QLatin1String(tabSizeKey), m_tabSize).toInt();
m_indentSize = map.value(prefix + QLatin1String(indentSizeKey), m_indentSize).toInt();
m_tabKeyBehavior = (TabKeyBehavior)
@@ -396,7 +397,7 @@ bool TabSettings::equals(const TabSettings &ts) const
return m_spacesForTabs == ts.m_spacesForTabs
&& m_autoSpacesForTabs == ts.m_autoSpacesForTabs
&& m_autoIndent == ts.m_autoIndent
- && m_smartBackspace == ts.m_smartBackspace
+ && m_smartBackspaceBehavior == ts.m_smartBackspaceBehavior
&& m_tabSize == ts.m_tabSize
&& m_indentSize == ts.m_indentSize
&& m_tabKeyBehavior == ts.m_tabKeyBehavior
diff --git a/src/plugins/texteditor/tabsettings.h b/src/plugins/texteditor/tabsettings.h
index 26a1c6f7ec6..885f4b23308 100644
--- a/src/plugins/texteditor/tabsettings.h
+++ b/src/plugins/texteditor/tabsettings.h
@@ -63,6 +63,13 @@ public:
ContinuationAlignWithIndent = 2
};
+ // This enum must match the indexes of smartBackspaceBehavior widget
+ enum SmartBackspaceBehavior {
+ BackspaceNeverIndents = 0,
+ BackspaceFollowsPreviousIndents = 1,
+ BackspaceUnindents = 2
+ };
+
TabSettings();
void toSettings(const QString &category, QSettings *s) const;
@@ -96,11 +103,11 @@ public:
bool m_spacesForTabs;
bool m_autoSpacesForTabs;
bool m_autoIndent;
- bool m_smartBackspace;
int m_tabSize;
int m_indentSize;
TabKeyBehavior m_tabKeyBehavior;
ContinuationAlignBehavior m_continuationAlignBehavior;
+ SmartBackspaceBehavior m_smartBackspaceBehavior;
bool equals(const TabSettings &ts) const;
};
diff --git a/src/plugins/texteditor/tabsettingswidget.cpp b/src/plugins/texteditor/tabsettingswidget.cpp
index 60cc37caf87..fea3255cba0 100644
--- a/src/plugins/texteditor/tabsettingswidget.cpp
+++ b/src/plugins/texteditor/tabsettingswidget.cpp
@@ -52,7 +52,7 @@ TabSettingsWidget::TabSettingsWidget(QWidget *parent) :
this, SLOT(slotSettingsChanged()));
connect(ui->autoIndent, SIGNAL(toggled(bool)),
this, SLOT(slotSettingsChanged()));
- connect(ui->smartBackspace, SIGNAL(toggled(bool)),
+ connect(ui->smartBackspaceBehavior, SIGNAL(currentIndexChanged(int)),
this, SLOT(slotSettingsChanged()));
connect(ui->tabSize, SIGNAL(valueChanged(int)),
this, SLOT(slotSettingsChanged()));
@@ -77,7 +77,7 @@ void TabSettingsWidget::setSettings(const TextEditor::TabSettings& s)
ui->insertSpaces->setChecked(s.m_spacesForTabs);
ui->autoInsertSpaces->setChecked(s.m_autoSpacesForTabs);
ui->autoIndent->setChecked(s.m_autoIndent);
- ui->smartBackspace->setChecked(s.m_smartBackspace);
+ ui->smartBackspaceBehavior->setCurrentIndex(s.m_smartBackspaceBehavior);
ui->tabSize->setValue(s.m_tabSize);
ui->indentSize->setValue(s.m_indentSize);
ui->tabKeyBehavior->setCurrentIndex(s.m_tabKeyBehavior);
@@ -94,11 +94,13 @@ TabSettings TabSettingsWidget::settings() const
set.m_spacesForTabs = ui->insertSpaces->isChecked();
set.m_autoSpacesForTabs = ui->autoInsertSpaces->isChecked();
set.m_autoIndent = ui->autoIndent->isChecked();
- set.m_smartBackspace = ui->smartBackspace->isChecked();
+ set.m_smartBackspaceBehavior =
+ (TabSettings::SmartBackspaceBehavior)ui->smartBackspaceBehavior->currentIndex();
set.m_tabSize = ui->tabSize->value();
set.m_indentSize = ui->indentSize->value();
set.m_tabKeyBehavior = (TabSettings::TabKeyBehavior)(ui->tabKeyBehavior->currentIndex());
- set.m_continuationAlignBehavior = (TabSettings::ContinuationAlignBehavior)(ui->continuationAlignBehavior->currentIndex());
+ set.m_continuationAlignBehavior =
+ (TabSettings::ContinuationAlignBehavior)(ui->continuationAlignBehavior->currentIndex());
return set;
}
@@ -124,7 +126,7 @@ QString TabSettingsWidget::searchKeywords() const
<< sep << ui->insertSpaces->text()
<< sep << ui->autoInsertSpaces->text()
<< sep << ui->autoIndent->text()
- << sep << ui->smartBackspace->text()
+ << sep << ui->smartBackspaceLabel->text()
<< sep << ui->tabSizeLabel->text()
<< sep << ui->indentSizeLabel->text()
<< sep << ui->tabKeyBehaviorLabel->text()
diff --git a/src/plugins/texteditor/tabsettingswidget.ui b/src/plugins/texteditor/tabsettingswidget.ui
index 63494f7b8ab..3b0d91ce495 100644
--- a/src/plugins/texteditor/tabsettingswidget.ui
+++ b/src/plugins/texteditor/tabsettingswidget.ui
@@ -166,24 +166,14 @@
- -
-
-
- Backspace will go back one indentation level instead of one space.
-
-
- &Backspace follows indentation
-
-
-
- -
+
-
Align continuation lines:
- -
+
-
<html><head/><body>
@@ -229,14 +219,14 @@ Influences the indentation of continuation lines.
- -
+
-
Tab key performs auto-indent:
- -
+
-
-
@@ -255,7 +245,7 @@ Influences the indentation of continuation lines.
- -
+
-
Qt::Vertical
@@ -268,6 +258,48 @@ Influences the indentation of continuation lines.
+ -
+
+
+ Backspace indentation:
+
+
+
+ -
+
+
+ <html><head/><body>
+Specifies how backspace interacts with indentation.
+
+<ul>
+<li>None: No interaction at all. Regular plain backspace behavior.
+</li>
+
+<li>Follows Previous Indents: In leading white space it will take the cursor back to the nearest indentation level used in previous lines.
+</li>
+
+<li>Unindents: If the character behind the cursor is a space it behaves as a backtab.
+</li>
+</ul></body></html>
+
+
+
-
+
+ None
+
+
+ -
+
+ Follows Previous Indents
+
+
+ -
+
+ Unindents
+
+
+
+
@@ -279,7 +311,6 @@ Influences the indentation of continuation lines.
tabSize
indentSize
autoIndent
- smartBackspace
continuationAlignBehavior
tabKeyBehavior