From 17d74c488353b1d14fe52caf7bd30e5cde1e5cce Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Fri, 26 Oct 2012 12:09:51 -0600 Subject: [PATCH] Detect softTabs/hardTabs when an `EditSession` is created --- spec/app/buffer-spec.coffee | 9 +++++++++ spec/app/edit-session-spec.coffee | 12 +++++++++++- src/app/buffer.coffee | 6 ++++++ src/app/edit-session.coffee | 4 ++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/spec/app/buffer-spec.coffee b/spec/app/buffer-spec.coffee index ec9de0b84..3aa9340db 100644 --- a/spec/app/buffer-spec.coffee +++ b/spec/app/buffer-spec.coffee @@ -628,3 +628,12 @@ describe 'Buffer', -> buffer.delete([[3, 0], [5, 0]]) expect(destroyHandler).toHaveBeenCalled() expect(buffer.getAnchors().indexOf(anchor)).toBe -1 + + describe ".usesSoftTabs()", -> + it "returns true if the first indented line begins with tabs", -> + buffer.setText("function() {\n foo();\n}") + expect(buffer.usesSoftTabs()).toBeTruthy() + buffer.setText("function() {\n\tfoo();\n}") + expect(buffer.usesSoftTabs()).toBeFalsy() + buffer.setText("") + expect(buffer.usesSoftTabs()).toBeUndefined() diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 69a06e1cb..abb3d854f 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -10,7 +10,6 @@ describe "EditSession", -> buffer.setText(buffer.getText().replace(/[ ]{2}/g, "\t")) beforeEach -> - buffer = new Buffer() editSession = fixturesProject.buildEditSessionForPath('sample.js', autoIndent: false) buffer = editSession.buffer lineLengths = buffer.getLines().map (line) -> line.length @@ -1745,3 +1744,14 @@ describe "EditSession", -> editSession.setSelectedBufferRange([[0, 1], [0, 4]]) editSession.transpose() expect(editSession.lineForBufferRow(0)).toBe 'xcbaz' + + describe "soft-tabs detection", -> + it "assign soft / hard tabs based on the contents of the buffer, or uses the default if unknown", -> + editSession = fixturesProject.buildEditSessionForPath('sample.js', softTabs: false) + expect(editSession.softTabs).toBeTruthy() + + editSession = fixturesProject.buildEditSessionForPath('sample-with-tabs.coffee', softTabs: true) + expect(editSession.softTabs).toBeFalsy() + + editSession = fixturesProject.buildEditSessionForPath(null, softTabs: false) + expect(editSession.softTabs).toBeFalsy() diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index a7f10bd99..152cba605 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -352,6 +352,12 @@ class Buffer return row unless @isRowBlank(row) null + usesSoftTabs: -> + for line in @getLines() + if match = line.match(/^\s/) + return match[0][0] != '\t' + undefined + logLines: (start=0, end=@getLastRow())-> for row in [start..end] line = @lineForRow(row) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 262607744..7c94d928c 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -39,9 +39,9 @@ class EditSession softTabs: true softWrap: false - constructor: ({@project, @buffer, @tabLength, @autoIndent, @softTabs, @softWrap }) -> + constructor: ({@project, @buffer, @tabLength, @autoIndent, softTabs, @softWrap }) -> @id = @constructor.idCounter++ - @softTabs ?= true + @softTabs = @buffer.usesSoftTabs() ? softTabs ? true @languageMode = new LanguageMode(this, @buffer.getExtension()) @displayBuffer = new DisplayBuffer(@buffer, { @languageMode, @tabLength }) @tokenizedBuffer = @displayBuffer.tokenizedBuffer