mirror of
https://github.com/atom/atom.git
synced 2026-01-23 22:08:08 -05:00
Fix indentation when pasting lines
The fix to ignore invisibles () introduces a new bug when pasting lines from the clipboard (see screencast below). As the commit takes the content of `@buffer.lineFromRow(bufferRow)` to test against the `decreaseIndentRegex`, it will actually test the content of the row the cursor is on instead of the content that is being pasted. And this (of course) could cause unexpected indentations.
This commit is contained in:
@@ -2262,7 +2262,7 @@ describe "TextEditor", ->
|
||||
expect(editor.indentationForBufferRow(2)).toBe 0
|
||||
expect(editor.indentationForBufferRow(3)).toBe 1
|
||||
|
||||
describe "when a newline is appended on a line that matches the decreaseNextIndentRegex", ->
|
||||
describe "when a newline is appended on a line that matches the decreaseNextIndentPattern", ->
|
||||
it "indents the new line to the correct level when editor.autoIndent is true", ->
|
||||
waitsForPromise ->
|
||||
atom.packages.activatePackage('language-go')
|
||||
@@ -3012,7 +3012,19 @@ describe "TextEditor", ->
|
||||
expect(editor.lineTextForBufferRow(7)).toBe("\t\t\t * indent")
|
||||
expect(editor.lineTextForBufferRow(8)).toBe("\t\t\t **/")
|
||||
|
||||
describe "when pasting a single line of text", ->
|
||||
describe "when pasting line(s) above a line that matches the decreaseIndentPattern", ->
|
||||
it "auto-indents based on the pasted line(s) only", ->
|
||||
atom.clipboard.write("a(x);\n b(x);\n c(x);\n", indentBasis: 0)
|
||||
editor.setCursorBufferPosition([7, 0])
|
||||
editor.pasteText()
|
||||
|
||||
expect(editor.lineTextForBufferRow(7)).toBe " a(x);"
|
||||
expect(editor.lineTextForBufferRow(8)).toBe " b(x);"
|
||||
expect(editor.lineTextForBufferRow(9)).toBe " c(x);"
|
||||
expect(editor.lineTextForBufferRow(10)).toBe " }"
|
||||
|
||||
|
||||
describe "when pasting a line of text without line ending", ->
|
||||
it "does not auto-indent the text", ->
|
||||
atom.clipboard.write("a(x);", indentBasis: 0)
|
||||
editor.setCursorBufferPosition([5, 0])
|
||||
|
||||
@@ -234,14 +234,15 @@ class LanguageMode
|
||||
#
|
||||
# Returns a {Number}.
|
||||
suggestedIndentForBufferRow: (bufferRow, options) ->
|
||||
line = @buffer.lineForRow(bufferRow)
|
||||
tokenizedLine = @editor.displayBuffer.tokenizedBuffer.tokenizedLineForRow(bufferRow)
|
||||
@suggestedIndentForTokenizedLineAtBufferRow(bufferRow, tokenizedLine, options)
|
||||
@suggestedIndentForTokenizedLineAtBufferRow(bufferRow, line, tokenizedLine, options)
|
||||
|
||||
suggestedIndentForLineAtBufferRow: (bufferRow, line, options) ->
|
||||
tokenizedLine = @editor.displayBuffer.tokenizedBuffer.buildTokenizedLineForRowWithText(bufferRow, line)
|
||||
@suggestedIndentForTokenizedLineAtBufferRow(bufferRow, tokenizedLine, options)
|
||||
@suggestedIndentForTokenizedLineAtBufferRow(bufferRow, line, tokenizedLine, options)
|
||||
|
||||
suggestedIndentForTokenizedLineAtBufferRow: (bufferRow, tokenizedLine, options) ->
|
||||
suggestedIndentForTokenizedLineAtBufferRow: (bufferRow, line, tokenizedLine, options={}) ->
|
||||
iterator = tokenizedLine.getTokenIterator()
|
||||
iterator.next()
|
||||
scopeDescriptor = new ScopeDescriptor(scopes: iterator.getScopes())
|
||||
@@ -253,7 +254,7 @@ class LanguageMode
|
||||
currentIndentLevel = @editor.indentationForBufferRow(bufferRow)
|
||||
return currentIndentLevel unless increaseIndentRegex
|
||||
|
||||
if options?.skipBlankLines ? true
|
||||
if options.skipBlankLines ? true
|
||||
precedingRow = @buffer.previousNonBlankRow(bufferRow)
|
||||
return 0 unless precedingRow?
|
||||
else
|
||||
@@ -268,10 +269,7 @@ class LanguageMode
|
||||
desiredIndentLevel += 1 if increaseIndentRegex?.testSync(precedingLine)
|
||||
desiredIndentLevel -= 1 if decreaseNextIndentRegex?.testSync(precedingLine)
|
||||
|
||||
unless @editor.isBufferRowCommented(bufferRow)
|
||||
bufferLine = @buffer.lineForRow(bufferRow)
|
||||
desiredIndentLevel -= 1 if decreaseIndentRegex?.testSync(bufferLine)
|
||||
|
||||
desiredIndentLevel -= 1 if decreaseIndentRegex?.testSync(line)
|
||||
Math.max(desiredIndentLevel, 0)
|
||||
|
||||
# Calculate a minimum indent level for a range of lines excluding empty lines.
|
||||
|
||||
Reference in New Issue
Block a user