Paste indent normalization works with on lines w/ mixed indentation

Normalizing the indent no longer explodes when pasting on a line that has mixed tabs and spaces when the edit session is using hard tabs.
This commit is contained in:
Corey Johnson & Nathan Sobo
2012-12-06 11:53:57 -07:00
parent 9945c5ebbb
commit de5bd91055
3 changed files with 37 additions and 6 deletions

View File

@@ -754,6 +754,22 @@ describe "EditSession", ->
expect(editSession.lineForBufferRow(5)).toBe " }"
expect(editSession.lineForBufferRow(6)).toBe " bar();xx"
describe "when inserting on a line that has mixed tabs and whitespace in hard tabs mode (regression)", ->
it "correctly indents the inserted text", ->
editSession.softTabs = false
buffer.setText """
not indented
\tmixed indented
"""
editSession.setCursorBufferPosition([1, 0])
editSession.insertText(text, normalizeIndent: true)
expect(editSession.lineForBufferRow(1)).toBe "\t\t\twhile (true) {"
expect(editSession.lineForBufferRow(2)).toBe "\t\t\t\tfoo();"
expect(editSession.lineForBufferRow(3)).toBe "\t\t\t}"
expect(editSession.lineForBufferRow(4)).toBe "\t\tbar(); \tmixed indented"
describe "when the cursor's current column is greater than the suggested indent level", ->
describe "when the indentBasis is inferred from the first line", ->
it "preserves the current indent level, indenting all lines relative to it", ->
@@ -1776,3 +1792,17 @@ describe "EditSession", ->
editSession = fixturesProject.buildEditSessionForPath(null, softTabs: false)
expect(editSession.softTabs).toBeFalsy()
describe ".indentLevelForLine(line)", ->
it "returns the indent level when the line has only leading whitespace", ->
expect(editSession.indentLevelForLine(" hello")).toBe(2)
expect(editSession.indentLevelForLine(" hello")).toBe(1.5)
it "returns the indent level when the line has only leading tabs", ->
expect(editSession.indentLevelForLine("\t\thello")).toBe(2)
it "returns the indent level when the line has mixed leading whitespace and tabs", ->
expect(editSession.indentLevelForLine("\t hello")).toBe(2)
expect(editSession.indentLevelForLine(" \thello")).toBe(2)
expect(editSession.indentLevelForLine(" \t hello")).toBe(2.5)
expect(editSession.indentLevelForLine(" \t \thello")).toBe(3.5)

View File

@@ -124,10 +124,13 @@ class EditSession
@buffer.change([[bufferRow, 0], [bufferRow, currentIndentString.length]], newIndentString)
indentLevelForLine: (line) ->
if line.match(/^\t/)
line.match(/^\t*/)?[0].length
if match = line.match(/^[\t ]+/)
leadingWhitespace = match[0]
tabCount = leadingWhitespace.match(/\t/g)?.length ? 0
spaceCount = leadingWhitespace.match(/[ ]/g)?.length ? 0
tabCount + (spaceCount / @getTabLength())
else
line.match(/^\s*/)?[0].length / @getTabLength()
0
buildIndentString: (number) ->
if @softTabs

View File

@@ -238,11 +238,9 @@ class Selection
adjustIndentationForLine: (line, delta) ->
currentIndentLevel = @editSession.indentLevelForLine(line)
currentIndentString = @editSession.buildIndentString(currentIndentLevel)
desiredIndentLevel = Math.max(0, currentIndentLevel + delta)
desiredIndentString = @editSession.buildIndentString(desiredIndentLevel)
line.replace(new RegExp("^#{currentIndentString}"), desiredIndentString)
line.replace(/^[\t ]*/, desiredIndentString)
backspace: ->
if @isEmpty() and not @editSession.isFoldedAtScreenRow(@cursor.getScreenRow())