Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.

Commit 4ab72eb

Browse files
committed
Merge pull request #7205 from adobe/randy/soft-tabs-pref
Add preference for soft tabs
2 parents 8971aed + 69b024b commit 4ab72eb

2 files changed

Lines changed: 64 additions & 32 deletions

File tree

src/editor/Editor.js

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,53 +64,56 @@
6464
define(function (require, exports, module) {
6565
"use strict";
6666

67-
var CodeMirror = require("thirdparty/CodeMirror2/lib/codemirror"),
67+
var AnimationUtils = require("utils/AnimationUtils"),
68+
Async = require("utils/Async"),
69+
CodeMirror = require("thirdparty/CodeMirror2/lib/codemirror"),
6870
Menus = require("command/Menus"),
6971
PerfUtils = require("utils/PerfUtils"),
7072
PreferencesManager = require("preferences/PreferencesManager"),
7173
Strings = require("strings"),
7274
TextRange = require("document/TextRange").TextRange,
7375
TokenUtils = require("utils/TokenUtils"),
7476
ViewUtils = require("utils/ViewUtils"),
75-
Async = require("utils/Async"),
76-
AnimationUtils = require("utils/AnimationUtils"),
7777
_ = require("thirdparty/lodash");
7878

7979
/** Editor preferences */
80-
var SMART_INDENT = "smartIndent",
81-
USE_TAB_CHAR = "useTabChar",
82-
TAB_SIZE = "tabSize",
83-
SPACE_UNITS = "spaceUnits",
84-
CLOSE_BRACKETS = "closeBrackets",
80+
var CLOSE_BRACKETS = "closeBrackets",
81+
CLOSE_TAGS = "closeTags",
82+
SCROLL_PAST_END = "scrollPastEnd",
8583
SHOW_LINE_NUMBERS = "showLineNumbers",
84+
SMART_INDENT = "smartIndent",
85+
SOFT_TABS = "softTabs",
86+
SPACE_UNITS = "spaceUnits",
8687
STYLE_ACTIVE_LINE = "styleActiveLine",
88+
TAB_SIZE = "tabSize",
8789
WORD_WRAP = "wordWrap",
88-
CLOSE_TAGS = "closeTags",
89-
SCROLL_PAST_END = "scrollPastEnd",
90-
cmOptions = {};
90+
USE_TAB_CHAR = "useTabChar";
91+
92+
var cmOptions = {};
9193

9294
// Mappings from Brackets preferences to CodeMirror options
93-
cmOptions[SMART_INDENT] = "smartIndent";
94-
cmOptions[USE_TAB_CHAR] = "indentWithTabs";
95-
cmOptions[TAB_SIZE] = "indentUnit";
96-
cmOptions[SPACE_UNITS] = "indentUnit";
9795
cmOptions[CLOSE_BRACKETS] = "autoCloseBrackets";
96+
cmOptions[CLOSE_TAGS] = "autoCloseTags";
97+
cmOptions[SCROLL_PAST_END] = "scrollPastEnd";
9898
cmOptions[SHOW_LINE_NUMBERS] = "lineNumbers";
99+
cmOptions[SMART_INDENT] = "smartIndent";
100+
cmOptions[SPACE_UNITS] = "indentUnit";
99101
cmOptions[STYLE_ACTIVE_LINE] = "styleActiveLine";
102+
cmOptions[TAB_SIZE] = "indentUnit";
103+
cmOptions[USE_TAB_CHAR] = "indentWithTabs";
100104
cmOptions[WORD_WRAP] = "lineWrapping";
101-
cmOptions[CLOSE_TAGS] = "autoCloseTags";
102-
cmOptions[SCROLL_PAST_END] = "scrollPastEnd";
103105

104-
PreferencesManager.definePreference(SMART_INDENT, "boolean", true);
105-
PreferencesManager.definePreference(USE_TAB_CHAR, "boolean", false);
106-
PreferencesManager.definePreference(TAB_SIZE, "number", 4);
107-
PreferencesManager.definePreference(SPACE_UNITS, "number", 4);
108-
PreferencesManager.definePreference(CLOSE_BRACKETS, "boolean", false);
106+
PreferencesManager.definePreference(CLOSE_BRACKETS, "boolean", false);
107+
PreferencesManager.definePreference(CLOSE_TAGS, "Object", { whenOpening: true, whenClosing: true, indentTags: [] });
108+
PreferencesManager.definePreference(SCROLL_PAST_END, "boolean", false);
109109
PreferencesManager.definePreference(SHOW_LINE_NUMBERS, "boolean", true);
110+
PreferencesManager.definePreference(SMART_INDENT, "boolean", true);
111+
PreferencesManager.definePreference(SOFT_TABS, "boolean", true);
112+
PreferencesManager.definePreference(SPACE_UNITS, "number", 4);
110113
PreferencesManager.definePreference(STYLE_ACTIVE_LINE, "boolean", false);
111-
PreferencesManager.definePreference(WORD_WRAP, "boolean", true);
112-
PreferencesManager.definePreference(CLOSE_TAGS, "Object", { whenOpening: true, whenClosing: true, indentTags: [] });
113-
PreferencesManager.definePreference(SCROLL_PAST_END, "boolean", false);
114+
PreferencesManager.definePreference(TAB_SIZE, "number", 4);
115+
PreferencesManager.definePreference(USE_TAB_CHAR, "boolean", false);
116+
PreferencesManager.definePreference(WORD_WRAP, "boolean", true);
114117

115118
var editorOptions = Object.keys(cmOptions);
116119

@@ -516,7 +519,7 @@ define(function (require, exports, module) {
516519
var instance = this._codeMirror,
517520
overallJump = null;
518521

519-
if (!instance.getOption("indentWithTabs")) {
522+
if (!instance.getOption("indentWithTabs") && PreferencesManager.get(SOFT_TABS)) {
520523
var indentUnit = instance.getOption("indentUnit");
521524

522525
_.each(this.getSelections(), function (sel) {

test/spec/Editor-test.js

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@
2828
define(function (require, exports, module) {
2929
'use strict';
3030

31-
var Editor = require("editor/Editor").Editor,
32-
EditorManager = require("editor/EditorManager"),
33-
SpecRunnerUtils = require("spec/SpecRunnerUtils"),
34-
LanguageManager = require("language/LanguageManager"),
35-
KeyEvent = require("utils/KeyEvent");
31+
var Editor = require("editor/Editor").Editor,
32+
EditorManager = require("editor/EditorManager"),
33+
KeyEvent = require("utils/KeyEvent"),
34+
LanguageManager = require("language/LanguageManager"),
35+
PreferencesManager = require("preferences/PreferencesManager"),
36+
SpecRunnerUtils = require("spec/SpecRunnerUtils");
3637

3738
var langNames = {
3839
css: {mode: "css", langName: "CSS"},
@@ -1077,7 +1078,35 @@ define(function (require, exports, module) {
10771078
myEditor.document.setText(" four ");
10781079
checkSoftTab({line: 0, ch: 8}, 1, "moveH", {line: 0, ch: 9});
10791080
});
1080-
1081+
1082+
describe("with soft tabs preference off", function () {
1083+
beforeEach(function () {
1084+
// Disable soft tabs
1085+
PreferencesManager.set("softTabs", false);
1086+
});
1087+
afterEach(function () {
1088+
// Re-enable soft tabs
1089+
PreferencesManager.set("softTabs", true);
1090+
});
1091+
1092+
it("should move left by 1 space if cursor is immediately after 1 indent level worth of spaces at beginning of line", function () {
1093+
myEditor.document.setText(" content");
1094+
checkSoftTab({line: 0, ch: 4}, -1, "moveH", {line: 0, ch: 3});
1095+
});
1096+
it("should backspace by 1 space if cursor is immediately after 1 indent level worth of spaces at beginning of line", function () {
1097+
myEditor.document.setText(" content");
1098+
checkSoftTab({line: 0, ch: 4}, -1, "deleteH", {line: 0, ch: 3}, " content");
1099+
});
1100+
it("should move right by 1 space if cursor is immediately before 1 indent level worth of spaces at beginning of line", function () {
1101+
myEditor.document.setText(" content");
1102+
checkSoftTab({line: 0, ch: 0}, 1, "moveH", {line: 0, ch: 1});
1103+
});
1104+
it("should delete right by 1 space if cursor is immediately before 1 indent level worth of spaces at beginning of line", function () {
1105+
myEditor.document.setText(" content");
1106+
checkSoftTab({line: 0, ch: 0}, 1, "deleteH", {line: 0, ch: 0}, " content");
1107+
});
1108+
});
1109+
10811110
describe("with multiple selections", function () {
10821111
it("should move left over a soft tab from multiple aligned cursors", function () {
10831112
myEditor.document.setText(" one\n two\n three\n");

0 commit comments

Comments
 (0)