diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index 6a94cacbe..01ba9e65e 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -3038,6 +3038,25 @@ describe "TextEditor", -> atom.workspace.open(null, softTabs: false).then (editor) -> expect(editor.getSoftTabs()).toBeFalsy() + describe '.getTabLength(scopeDescriptor)', -> + describe 'when scoped settings are used', -> + coffeeEditor = null + beforeEach -> + waitsForPromise -> + atom.packages.activatePackage('language-coffee-script') + waitsForPromise -> + atom.project.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o + + it 'will return correct values based on the scope of the set grammars', -> + atom.config.set '.source.coffee', 'editor.tabLength', 6 + atom.config.set '.source.coffee .class', 'editor.tabLength', 4 + + expect(editor.getTabLength()).toBe 2 + expect(coffeeEditor.getTabLength()).toBe 6 + + coffeeEditor.setCursorBufferPosition [0, 10] + expect(coffeeEditor.getTabLength(coffeeEditor.scopesAtCursor())).toBe 4 + describe ".indentLevelForLine(line)", -> it "returns the indent level when the line has only leading whitespace", -> expect(editor.indentLevelForLine(" hello")).toBe(2) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index fc465e5d7..f32c4efd4 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -396,8 +396,8 @@ class DisplayBuffer extends Model # Retrieves the current tab length. # # Returns a {Number}. - getTabLength: -> - @tokenizedBuffer.getTabLength() + getTabLength: (scopeDescriptor) -> + @tokenizedBuffer.getTabLength(scopeDescriptor) # Specifies the tab length. # diff --git a/src/text-editor.coffee b/src/text-editor.coffee index d1fca0412..eec6432e1 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -2173,12 +2173,16 @@ class TextEditor extends Model # Essential: Get the on-screen length of tab characters. # - # Returns a {Number}. - getTabLength: -> @displayBuffer.getTabLength() - - # Essential: Set the on-screen length of tab characters. + # * `scopeDescriptor` (optional) {Array} of {String}s. # - # * `tabLength` {Number} length of a single tab + # Returns a {Number}. + getTabLength: (scopeDescriptor) -> @displayBuffer.getTabLength(scopeDescriptor) + + # Essential: Set the on-screen length of tab characters. Setting this to a + # {Number} This will override the `editor.tabLength` setting. + # + # * `tabLength` {Number} length of a single tab. Setting to `null` will + # fallback to using the `editor.tabLength` config setting setTabLength: (tabLength) -> @displayBuffer.setTabLength(tabLength) # Extended: Determine if the buffer uses hard or soft tabs. diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index ae2fa559a..23a6fe882 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -25,16 +25,14 @@ class TokenizedBuffer extends Model constructor: ({@buffer, @tabLength, @invisibles}) -> @emitter = new Emitter - @tabLength ?= atom.config.get('editor.tabLength') - @subscribe atom.syntax.onDidAddGrammar(@grammarAddedOrUpdated) @subscribe atom.syntax.onDidUpdateGrammar(@grammarAddedOrUpdated) @subscribe @buffer.onDidChange (e) => @handleBufferChange(e) @subscribe @buffer.onDidChangePath (@bufferPath) => @reloadGrammar() + # TODO: FIXME: make this work for scoped properties @subscribe @$tabLength.changes, (tabLength) => @retokenizeLines() - @subscribe atom.config.onDidChange 'editor.tabLength', ({newValue}) => @setTabLength(newValue) @reloadGrammar() @@ -81,6 +79,7 @@ class TokenizedBuffer extends Model return if grammar is @grammar @unsubscribe(@grammar) if @grammar @grammar = grammar + @grammarScopeDescriptor = [@grammar.scopeName] @currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @buffer.getText()) @subscribe @grammar.onDidUpdate => @retokenizeLines() @retokenizeLines() @@ -112,15 +111,9 @@ class TokenizedBuffer extends Model setVisible: (@visible) -> @tokenizeInBackground() if @visible - # Retrieves the current tab length. - # - # Returns a {Number}. - getTabLength: -> - @tabLength + getTabLength: (scopeDescriptor) -> + @tabLength ? atom.config.get(scopeDescriptor ? @grammarScopeDescriptor, 'editor.tabLength') - # Specifies the tab length. - # - # tabLength - A {Number} that defines the new tab length. setTabLength: (@tabLength) -> setInvisibles: (invisibles) ->