From 2f26de3e26cbf02cf7f9fcb63373b8eb33e62c44 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Thu, 4 Jun 2015 13:51:50 -0700 Subject: [PATCH 01/77] Remove treeview from the deprecated packages --- build/deprecated-packages.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/build/deprecated-packages.json b/build/deprecated-packages.json index 8d41a53ea..ac980e165 100644 --- a/build/deprecated-packages.json +++ b/build/deprecated-packages.json @@ -1545,11 +1545,6 @@ "hasDeprecations": true, "latestHasDeprecations": false }, - "tree-view": { - "version": "<=0.172.0", - "hasDeprecations": true, - "latestHasDeprecations": true - }, "true-color": { "version": "<=0.4.1", "hasDeprecations": true, @@ -1689,4 +1684,4 @@ "hasDeprecations": true, "latestHasDeprecations": false } -} \ No newline at end of file +} From 5793919f3b981e664b7a9a89234a9587863ed94b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 4 Jun 2015 14:07:53 -0700 Subject: [PATCH 02/77] :arrow_up: apm@0.171 --- apm/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm/package.json b/apm/package.json index 1dde8b9a6..bb9fd4647 100644 --- a/apm/package.json +++ b/apm/package.json @@ -6,6 +6,6 @@ "url": "https://github.com/atom/atom.git" }, "dependencies": { - "atom-package-manager": "0.170.0" + "atom-package-manager": "0.171.0" } } From f585b5bb126056b16e9534864df45e90b7f7d50a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Thu, 4 Jun 2015 15:05:05 -0700 Subject: [PATCH 03/77] Prepare 0.207 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd5ffbbec..6e20ca50f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.206.0", + "version": "0.207.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 5b494b7b174be6774b786fcc8ea81eb41ab83118 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 01:19:12 +0200 Subject: [PATCH 04/77] Lazily construct placeholder lines in TokenizedBuffer --- src/tokenized-buffer.coffee | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index 55d2e7e37..72a972967 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -112,14 +112,14 @@ class TokenizedBuffer extends Model throw new Error("No grammar found for path: #{path}") hasTokenForSelector: (selector) -> - for {tokens} in @tokenizedLines - for token in tokens + for tokenizedLine in @tokenizedLines when tokenizedLine? + for token in tokenizedLine.tokens return true if selector.matches(token.scopes) false retokenizeLines: -> lastRow = @buffer.getLastRow() - @tokenizedLines = @buildPlaceholderTokenizedLinesForRows(0, lastRow) + @tokenizedLines = new Array(lastRow + 1) @invalidRows = [] @invalidateRow(0) @fullyTokenized = false @@ -248,12 +248,12 @@ class TokenizedBuffer extends Model @emitter.emit 'did-change', event retokenizeWhitespaceRowsIfIndentLevelChanged: (row, increment) -> - line = @tokenizedLines[row] + line = @tokenizedLineForRow(row) if line?.isOnlyWhitespace() and @indentLevelForRow(row) isnt line.indentLevel while line?.isOnlyWhitespace() @tokenizedLines[row] = @buildTokenizedLineForRow(row, @stackForRow(row - 1), @openScopesForRow(row)) row += increment - line = @tokenizedLines[row] + line = @tokenizedLineForRow(row) row - increment @@ -313,7 +313,7 @@ class TokenizedBuffer extends Model tokenizedLines buildPlaceholderTokenizedLinesForRows: (startRow, endRow) -> - @buildPlaceholderTokenizedLineForRow(row) for row in [startRow..endRow] + @buildPlaceholderTokenizedLineForRow(row) for row in [startRow..endRow] by 1 buildPlaceholderTokenizedLineForRow: (row) -> openScopes = [@grammar.startIdForScope(@grammar.scopeName)] @@ -341,7 +341,8 @@ class TokenizedBuffer extends Model null tokenizedLineForRow: (bufferRow) -> - @tokenizedLines[bufferRow] + if 0 <= bufferRow < @tokenizedLines.length + @tokenizedLines[bufferRow] ?= @buildPlaceholderTokenizedLineForRow(bufferRow) stackForRow: (bufferRow) -> @tokenizedLines[bufferRow]?.ruleStack @@ -418,17 +419,17 @@ class TokenizedBuffer extends Model tokenForPosition: (position) -> {row, column} = Point.fromObject(position) - @tokenizedLines[row].tokenAtBufferColumn(column) + @tokenizedLineForRow(row).tokenAtBufferColumn(column) tokenStartPositionForPosition: (position) -> {row, column} = Point.fromObject(position) - column = @tokenizedLines[row].tokenStartColumnForBufferColumn(column) + column = @tokenizedLineForRow(row).tokenStartColumnForBufferColumn(column) new Point(row, column) bufferRangeForScopeAtPosition: (selector, position) -> position = Point.fromObject(position) - {openScopes, tags} = @tokenizedLines[position.row] + {openScopes, tags} = @tokenizedLineForRow(position.row) scopes = openScopes.map (tag) -> atom.grammars.scopeForId(tag) startColumn = 0 From de508db9b2c9cb609f565b38adeeaee0823c7e48 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 02:25:57 +0200 Subject: [PATCH 05/77] Implement basic large file mode for editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don’t tokenize * Don’t build metadata to support folds and soft wraps Remaining issues: * Max line length is hard coded * Foldable indicators should be disabled * Folding via API should be disallowed --- src/display-buffer.coffee | 68 +++++++++++++++++++++++++++---------- src/project.coffee | 8 ++--- src/text-editor.coffee | 4 +-- src/tokenized-buffer.coffee | 13 +++++-- 4 files changed, 65 insertions(+), 28 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index d98f93fe3..32f374776 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -24,13 +24,13 @@ class DisplayBuffer extends Model horizontalScrollMargin: 6 scopedCharacterWidthsChangeCount: 0 - constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, ignoreInvisibles}={}) -> + constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, ignoreInvisibles, @largeFileMode}={}) -> super @emitter = new Emitter @disposables = new CompositeDisposable - @tokenizedBuffer ?= new TokenizedBuffer({tabLength, buffer, ignoreInvisibles}) + @tokenizedBuffer ?= new TokenizedBuffer({tabLength, buffer, ignoreInvisibles, @largeFileMode}) @buffer = @tokenizedBuffer.buffer @charWidthsByScope = {} @markers = {} @@ -478,7 +478,10 @@ class DisplayBuffer extends Model # # Returns {TokenizedLine} tokenizedLineForScreenRow: (screenRow) -> - @screenLines[screenRow] + if @largeFileMode + @tokenizedBuffer.tokenizedLineForRow(screenRow) + else + @screenLines[screenRow] # Gets the screen lines for the given screen row range. # @@ -487,13 +490,19 @@ class DisplayBuffer extends Model # # Returns an {Array} of {TokenizedLine}s. tokenizedLinesForScreenRows: (startRow, endRow) -> - @screenLines[startRow..endRow] + if @largeFileMode + @tokenizedBuffer.tokenizedLinesForRows(startRow, endRow) + else + @screenLines[startRow..endRow] # Gets all the screen lines. # # Returns an {Array} of {TokenizedLine}s. getTokenizedLines: -> - new Array(@screenLines...) + if @largeFileMode + @tokenizedBuffer.tokenizedLinesForRows(0, @getLastRow()) + else + new Array(@screenLines...) indentLevelForLine: (line) -> @tokenizedBuffer.indentLevelForLine(line) @@ -506,8 +515,11 @@ class DisplayBuffer extends Model # # Returns an {Array} of buffer rows as {Numbers}s. bufferRowsForScreenRows: (startScreenRow, endScreenRow) -> - for screenRow in [startScreenRow..endScreenRow] - @rowMap.bufferRowRangeForScreenRow(screenRow)[0] + if @largeFileMode + [startScreenRow..endScreenRow] + else + for screenRow in [startScreenRow..endScreenRow] + @rowMap.bufferRowRangeForScreenRow(screenRow)[0] # Creates a new fold between two row numbers. # @@ -611,10 +623,16 @@ class DisplayBuffer extends Model # # Returns a {Number}. screenRowForBufferRow: (bufferRow) -> - @rowMap.screenRowRangeForBufferRow(bufferRow)[0] + if @largeFileMode + bufferRow + else + @rowMap.screenRowRangeForBufferRow(bufferRow)[0] lastScreenRowForBufferRow: (bufferRow) -> - @rowMap.screenRowRangeForBufferRow(bufferRow)[1] - 1 + if @largeFileMode + bufferRow + else + @rowMap.screenRowRangeForBufferRow(bufferRow)[1] - 1 # Given a screen row, this converts it into a buffer row. # @@ -622,7 +640,10 @@ class DisplayBuffer extends Model # # Returns a {Number}. bufferRowForScreenRow: (screenRow) -> - @rowMap.bufferRowRangeForScreenRow(screenRow)[0] + if @largeFileMode + screenRow + else + @rowMap.bufferRowRangeForScreenRow(screenRow)[0] # Given a buffer range, this converts it into a screen position. # @@ -724,7 +745,10 @@ class DisplayBuffer extends Model # # Returns a {Number}. getLineCount: -> - @screenLines.length + if @largeFileMode + @tokenizedBuffer.getLineCount() + else + @screenLines.length # Gets the number of the last screen line. # @@ -736,13 +760,19 @@ class DisplayBuffer extends Model # # Returns a {Number}. getMaxLineLength: -> - @maxLineLength + if @largeFileMode + 100 + else + @maxLineLength # Gets the row number of the longest screen line. # # Return a {} getLongestScreenRow: -> - @longestScreenRow + if @largeFileMode + 0 + else + @longestScreenRow # Given a buffer position, this converts it into a screen position. # @@ -759,7 +789,7 @@ class DisplayBuffer extends Model {row, column} = @buffer.clipPosition(bufferPosition) [startScreenRow, endScreenRow] = @rowMap.screenRowRangeForBufferRow(row) for screenRow in [startScreenRow...endScreenRow] - screenLine = @screenLines[screenRow] + screenLine = @tokenizedLineForScreenRow(screenRow) unless screenLine? throw new BufferToScreenConversionError "No screen line exists when converting buffer row to screen row", @@ -792,7 +822,7 @@ class DisplayBuffer extends Model bufferPositionForScreenPosition: (screenPosition, options) -> {row, column} = @clipScreenPosition(Point.fromObject(screenPosition), options) [bufferRow] = @rowMap.bufferRowRangeForScreenRow(row) - new Point(bufferRow, @screenLines[row].bufferColumnForScreenColumn(column)) + new Point(bufferRow, @tokenizedLineForScreenRow(row).bufferColumnForScreenColumn(column)) # Retrieves the grammar's token scopeDescriptor for a buffer position. # @@ -856,13 +886,13 @@ class DisplayBuffer extends Model else if column < 0 column = 0 - screenLine = @screenLines[row] + screenLine = @tokenizedLineForScreenRow(row) maxScreenColumn = screenLine.getMaxScreenColumn() if screenLine.isSoftWrapped() and column >= maxScreenColumn if wrapAtSoftNewlines row++ - column = @screenLines[row].clipScreenColumn(0) + column = @tokenizedLineForScreenRow(row).clipScreenColumn(0) else column = screenLine.clipScreenColumn(maxScreenColumn - 1) else if screenLine.isColumnInsideSoftWrapIndentation(column) @@ -870,7 +900,7 @@ class DisplayBuffer extends Model column = screenLine.clipScreenColumn(0) else row-- - column = @screenLines[row].getMaxScreenColumn() - 1 + column = @tokenizedLineForScreenRow(row).getMaxScreenColumn() - 1 else if wrapBeyondNewlines and column > maxScreenColumn and row < @getLastRow() row++ column = 0 @@ -1137,6 +1167,8 @@ class DisplayBuffer extends Model @setScrollTop(Math.min(@getScrollTop(), @getMaxScrollTop())) if delta < 0 updateScreenLines: (startBufferRow, endBufferRow, bufferDelta=0, options={}) -> + return if @largeFileMode + startBufferRow = @rowMap.bufferRowRangeForBufferRow(startBufferRow)[0] endBufferRow = @rowMap.bufferRowRangeForBufferRow(endBufferRow - 1)[1] startScreenRow = @rowMap.screenRowRangeForBufferRow(startBufferRow)[0] diff --git a/src/project.coffee b/src/project.coffee index 75cdb714f..e2eed7ac5 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -376,11 +376,6 @@ class Project extends Model # # Returns a promise that resolves to the {TextBuffer}. buildBuffer: (absoluteFilePath) -> - if fs.getSizeSync(absoluteFilePath) >= 2 * 1048576 # 2MB - error = new Error("Atom can only handle files < 2MB for now.") - error.code = 'EFILETOOLARGE' - throw error - buffer = new TextBuffer({filePath: absoluteFilePath}) @addBuffer(buffer) buffer.load() @@ -410,7 +405,8 @@ class Project extends Model buffer?.destroy() buildEditorForBuffer: (buffer, editorOptions) -> - editor = new TextEditor(_.extend({buffer, registerEditor: true}, editorOptions)) + largeFileMode = fs.getSizeSync(buffer.getPath()) >= 2 * 1048576 # 2MB + editor = new TextEditor(_.extend({buffer, largeFileMode, registerEditor: true}, editorOptions)) editor eachBuffer: (args...) -> diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 4aacb3dfa..9a9262e50 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -75,7 +75,7 @@ class TextEditor extends Model 'autoDecreaseIndentForBufferRow', 'toggleLineCommentForBufferRow', 'toggleLineCommentsForBufferRows', toProperty: 'languageMode' - constructor: ({@softTabs, initialLine, initialColumn, tabLength, softWrapped, @displayBuffer, buffer, registerEditor, suppressCursorCreation, @mini, @placeholderText, lineNumberGutterVisible}={}) -> + constructor: ({@softTabs, initialLine, initialColumn, tabLength, softWrapped, @displayBuffer, buffer, registerEditor, suppressCursorCreation, @mini, @placeholderText, lineNumberGutterVisible, largeFileMode}={}) -> super @emitter = new Emitter @@ -84,7 +84,7 @@ class TextEditor extends Model @selections = [] buffer ?= new TextBuffer - @displayBuffer ?= new DisplayBuffer({buffer, tabLength, softWrapped, ignoreInvisibles: @mini}) + @displayBuffer ?= new DisplayBuffer({buffer, tabLength, softWrapped, ignoreInvisibles: @mini, largeFileMode}) @buffer = @displayBuffer.buffer @softTabs = @usesSoftTabs() ? @softTabs ? atom.config.get('editor.softTabs') ? true diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index 72a972967..5aa3482a9 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -24,7 +24,7 @@ class TokenizedBuffer extends Model visible: false configSettings: null - constructor: ({@buffer, @tabLength, @ignoreInvisibles}) -> + constructor: ({@buffer, @tabLength, @ignoreInvisibles, @largeFileMode}) -> @emitter = new Emitter @disposables = new CompositeDisposable @tokenIterator = new TokenIterator @@ -209,6 +209,8 @@ class TokenizedBuffer extends Model return invalidateRow: (row) -> + return if @largeFileMode + @invalidRows.push(row) @invalidRows.sort (a, b) -> a - b @tokenizeInBackground() @@ -230,7 +232,10 @@ class TokenizedBuffer extends Model @updateInvalidRows(start, end, delta) previousEndStack = @stackForRow(end) # used in spill detection below - newTokenizedLines = @buildTokenizedLinesForRows(start, end + delta, @stackForRow(start - 1), @openScopesForRow(start)) + if @largeFileMode + newTokenizedLines = @buildPlaceholderTokenizedLinesForRows(start, end + delta) + else + newTokenizedLines = @buildTokenizedLinesForRows(start, end + delta, @stackForRow(start - 1), @openScopesForRow(start)) _.spliceWithArray(@tokenizedLines, start, end - start + 1, newTokenizedLines) start = @retokenizeWhitespaceRowsIfIndentLevelChanged(start - 1, -1) @@ -344,6 +349,10 @@ class TokenizedBuffer extends Model if 0 <= bufferRow < @tokenizedLines.length @tokenizedLines[bufferRow] ?= @buildPlaceholderTokenizedLineForRow(bufferRow) + tokenizedLinesForRows: (startRow, endRow) -> + for row in [startRow..endRow] by 1 + @tokenizedLineForRow(row) + stackForRow: (bufferRow) -> @tokenizedLines[bufferRow]?.ruleStack From d139ef9399ae8e5c42606dc7bd1270a450bf42b7 Mon Sep 17 00:00:00 2001 From: simurai Date: Fri, 5 Jun 2015 16:12:15 +0900 Subject: [PATCH 06/77] :arrow_up: one-dark-syntax@v0.7.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e20ca50f..eabbf5978 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "base16-tomorrow-dark-theme": "0.26.0", "base16-tomorrow-light-theme": "0.9.0", "one-dark-ui": "0.9.0", - "one-dark-syntax": "0.7.0", + "one-dark-syntax": "0.7.1", "one-light-syntax": "0.7.0", "one-light-ui": "0.9.0", "solarized-dark-syntax": "0.35.0", From 9f21ccf54dac77dfc08cfb2b79d6382b3f91fc66 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 12:07:44 +0200 Subject: [PATCH 07/77] Give tiles an opaque background --- src/tile-component.coffee | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tile-component.coffee b/src/tile-component.coffee index 88e06afd2..5659b73a9 100644 --- a/src/tile-component.coffee +++ b/src/tile-component.coffee @@ -38,6 +38,10 @@ class TileComponent @newTileState = @newState.tiles[@id] @oldTileState = @oldState.tiles[@id] + if @newState.backgroundColor isnt @oldState.backgroundColor + @domNode.style.backgroundColor = @newState.backgroundColor + @oldState.backgroundColor = @newState.backgroundColor + if @newTileState.display isnt @oldTileState.display @domNode.style.display = @newTileState.display @oldTileState.display = @newTileState.display From 4735ce60d99d77b9fd569569d7b8ba0d35043342 Mon Sep 17 00:00:00 2001 From: verrazanof Date: Fri, 5 Jun 2015 12:55:25 +0000 Subject: [PATCH 08/77] Update linux.md For Arch, `export PYTHON=/usr/bin/python2` should correct for `export python=/usr/bin/python2` --- docs/build-instructions/linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build-instructions/linux.md b/docs/build-instructions/linux.md index 4874489ab..7b81786b7 100644 --- a/docs/build-instructions/linux.md +++ b/docs/build-instructions/linux.md @@ -30,7 +30,7 @@ Ubuntu LTS 12.04 64-bit is the recommended platform. ### Arch * `sudo pacman -S gconf base-devel git nodejs libgnome-keyring python2` -* `export PYTHON=/usr/bin/python2` before building Atom. +* `export python=/usr/bin/python2` before building Atom. ### Slackware From da05e1e2348d9fb784f02c5ece1a69734ef8024a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 16:05:30 +0200 Subject: [PATCH 09/77] wip --- src/highlights-component.coffee | 2 +- src/lines-component.coffee | 5 --- src/text-editor-presenter.coffee | 76 ++++++++++++++++++++++---------- src/tile-component.coffee | 6 +++ 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/src/highlights-component.coffee b/src/highlights-component.coffee index 5a5747d4c..eb64b9bc4 100644 --- a/src/highlights-component.coffee +++ b/src/highlights-component.coffee @@ -21,7 +21,7 @@ class HighlightsComponent @domNode updateSync: (state) -> - newState = state.content.highlights + newState = state.highlights @oldState ?= {} # remove highlights diff --git a/src/lines-component.coffee b/src/lines-component.coffee index 23f1c0015..bac1c9616 100644 --- a/src/lines-component.coffee +++ b/src/lines-component.coffee @@ -1,7 +1,6 @@ {$$} = require 'space-pen' CursorsComponent = require './cursors-component' -HighlightsComponent = require './highlights-component' TileComponent = require './tile-component' DummyLineNode = $$(-> @div className: 'line', style: 'position: absolute; visibility: hidden;', => @span 'x')[0] @@ -24,9 +23,6 @@ class LinesComponent @cursorsComponent = new CursorsComponent(@presenter) @domNode.appendChild(@cursorsComponent.getDomNode()) - @highlightsComponent = new HighlightsComponent(@presenter) - @domNode.appendChild(@highlightsComponent.getDomNode()) - if @useShadowDOM insertionPoint = document.createElement('content') insertionPoint.setAttribute('select', '.overlayer') @@ -63,7 +59,6 @@ class LinesComponent @oldState.scrollWidth = @newState.scrollWidth @cursorsComponent.updateSync(state) - @highlightsComponent.updateSync(state) @oldState.indentGuidesVisible = @newState.indentGuidesVisible @oldState.scrollWidth = @newState.scrollWidth diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 03cfd5a21..5d447edaa 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -335,6 +335,7 @@ class TextEditorPresenter tile.left = -@scrollLeft tile.height = @tileSize * @lineHeight tile.display = "block" + tile.highlights ?= {} @updateLinesState(tile, startRow, endRow) @@ -1041,7 +1042,7 @@ class TextEditorPresenter hasPixelPositionRequirements: -> @lineHeight? and @baseCharacterWidth? - pixelPositionForScreenPosition: (screenPosition, clip=true) -> + pixelPositionForScreenPosition: (screenPosition, clip=true, foo) -> screenPosition = Point.fromObject(screenPosition) screenPosition = @model.clipScreenPosition(screenPosition) if clip @@ -1050,6 +1051,7 @@ class TextEditorPresenter baseCharacterWidth = @baseCharacterWidth top = targetRow * @lineHeight + top -= foo * @lineHeight if foo? left = 0 column = 0 @@ -1074,8 +1076,8 @@ class TextEditorPresenter left += characterWidths[char] ? baseCharacterWidth unless char is '\0' column += charLength - top -= @scrollTop - left -= @scrollLeft + top -= @scrollTop unless foo? + left -= @scrollLeft unless foo? {top, left} hasPixelRectRequirements: -> @@ -1175,9 +1177,10 @@ class TextEditorPresenter else if decoration.isType('highlight') visibleHighlights[decoration.id] = @updateHighlightState(decoration) - for id of @state.content.highlights - unless visibleHighlights[id] - delete @state.content.highlights[id] + for tileId, tileState of @state.content.tiles + for id, highlight of tileState.highlights + unless visibleHighlights[id] + delete tileState.highlights[id] return @@ -1236,7 +1239,12 @@ class TextEditorPresenter range = marker.getScreenRange() if decoration.isDestroyed() or not marker.isValid() or range.isEmpty() or not range.intersectsRowRange(@startRow, @endRow - 1) - delete @state.content.highlights[decoration.id] + tileStartRow = @tileForRow(range.start.row) + tileEndRow = @tileForRow(range.end.row) + + for tile in [tileStartRow..tileEndRow] by @tileSize + delete @state.content.tiles[tile]?.highlights[decoration.id] + @emitDidUpdateState() return @@ -1248,32 +1256,54 @@ class TextEditorPresenter range.end.column = 0 if range.isEmpty() - delete @state.content.highlights[decoration.id] + tileState = @state.content.tiles[@tileForRow(range.start.row)] + delete tileState.highlights[decoration.id] @emitDidUpdateState() return - highlightState = @state.content.highlights[decoration.id] ?= { - flashCount: 0 - flashDuration: null - flashClass: null - } + flash = decoration.consumeNextFlash() - if flash = decoration.consumeNextFlash() - highlightState.flashCount++ - highlightState.flashClass = flash.class - highlightState.flashDuration = flash.duration + startRow = range.start.row + while startRow <= range.end.row + tileStartRow = @tileForRow(startRow) + tileEndRow = tileStartRow + @tileSize + tileState = @state.content.tiles[tileStartRow] ?= {highlights: {}} + endRow = Math.min(tileEndRow, range.end.row) + + tileRange = new Range(new Point(startRow, 0), new Point(endRow, Infinity)) + + if startRow is range.start.row + tileRange.start.column = range.start.column + + if endRow is range.end.row + tileRange.end.column = range.end.column + + highlightState = tileState.highlights[decoration.id] ?= { + flashCount: 0 + flashDuration: null + flashClass: null + tileRow: tileStartRow + } + + if flash? + highlightState.flashCount++ + highlightState.flashClass = flash.class + highlightState.flashDuration = flash.duration + + highlightState.class = properties.class + highlightState.deprecatedRegionClass = properties.deprecatedRegionClass + highlightState.regions = @buildHighlightRegions(tileStartRow, tileRange) + + startRow = tileEndRow - highlightState.class = properties.class - highlightState.deprecatedRegionClass = properties.deprecatedRegionClass - highlightState.regions = @buildHighlightRegions(range) @emitDidUpdateState() true - buildHighlightRegions: (screenRange) -> + buildHighlightRegions: (tileStartRow, screenRange) -> lineHeightInPixels = @lineHeight - startPixelPosition = @pixelPositionForScreenPosition(screenRange.start, true) - endPixelPosition = @pixelPositionForScreenPosition(screenRange.end, true) + startPixelPosition = @pixelPositionForScreenPosition(screenRange.start, true, tileStartRow) + endPixelPosition = @pixelPositionForScreenPosition(screenRange.end, true, tileStartRow) spannedRows = screenRange.end.row - screenRange.start.row + 1 if spannedRows is 1 diff --git a/src/tile-component.coffee b/src/tile-component.coffee index 5659b73a9..1aeeea952 100644 --- a/src/tile-component.coffee +++ b/src/tile-component.coffee @@ -1,5 +1,6 @@ _ = require 'underscore-plus' +HighlightsComponent = require './highlights-component' TokenIterator = require './token-iterator' AcceptFilter = {acceptNode: -> NodeFilter.FILTER_ACCEPT} WrapperDiv = document.createElement('div') @@ -26,6 +27,9 @@ class TileComponent @domNode.style.position = "absolute" @domNode.style.display = "block" + @highlightsComponent = new HighlightsComponent(@presenter) + @domNode.appendChild(@highlightsComponent.getDomNode()) + getDomNode: -> @domNode @@ -62,6 +66,8 @@ class TileComponent @domNode.style.width = @newState.scrollWidth + 'px' @oldState.scrollWidth = @newState.scrollWidth + @highlightsComponent.updateSync(@newTileState) + @oldState.indentGuidesVisible = @newState.indentGuidesVisible @oldState.scrollWidth = @newState.scrollWidth From 79b0bc2bad17f3a14fc8cafaada75630216867c3 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 16:11:37 +0200 Subject: [PATCH 10/77] :art: Use `pixelPositionForScreenPositionInTile` --- src/text-editor-presenter.coffee | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 5d447edaa..d8322d061 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1042,7 +1042,14 @@ class TextEditorPresenter hasPixelPositionRequirements: -> @lineHeight? and @baseCharacterWidth? - pixelPositionForScreenPosition: (screenPosition, clip=true, foo) -> + pixelPositionForScreenPositionInTile: (tileStartRow, screenPosition, clip) -> + position = @pixelPositionForScreenPosition(screenPosition, clip) + position.top -= tileStartRow * @lineHeight + position.top += @scrollTop + position.left += @scrollLeft + position + + pixelPositionForScreenPosition: (screenPosition, clip=true) -> screenPosition = Point.fromObject(screenPosition) screenPosition = @model.clipScreenPosition(screenPosition) if clip @@ -1051,7 +1058,6 @@ class TextEditorPresenter baseCharacterWidth = @baseCharacterWidth top = targetRow * @lineHeight - top -= foo * @lineHeight if foo? left = 0 column = 0 @@ -1076,8 +1082,8 @@ class TextEditorPresenter left += characterWidths[char] ? baseCharacterWidth unless char is '\0' column += charLength - top -= @scrollTop unless foo? - left -= @scrollLeft unless foo? + top -= @scrollTop + left -= @scrollLeft {top, left} hasPixelRectRequirements: -> @@ -1302,8 +1308,8 @@ class TextEditorPresenter buildHighlightRegions: (tileStartRow, screenRange) -> lineHeightInPixels = @lineHeight - startPixelPosition = @pixelPositionForScreenPosition(screenRange.start, true, tileStartRow) - endPixelPosition = @pixelPositionForScreenPosition(screenRange.end, true, tileStartRow) + startPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.start, true) + endPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.end, true) spannedRows = screenRange.end.row - screenRange.start.row + 1 if spannedRows is 1 From d294f35849e931d65a43ef6b333268dae49e2e15 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 16:26:33 +0200 Subject: [PATCH 11/77] Get rid of `.underlayer` /cc: @nathansobo --- src/highlights-component.coffee | 5 ----- static/text-editor-light.less | 9 --------- static/text-editor-shadow.less | 9 --------- 3 files changed, 23 deletions(-) diff --git a/src/highlights-component.coffee b/src/highlights-component.coffee index eb64b9bc4..5e364f90c 100644 --- a/src/highlights-component.coffee +++ b/src/highlights-component.coffee @@ -12,11 +12,6 @@ class HighlightsComponent @domNode = document.createElement('div') @domNode.classList.add('highlights') - if atom.config.get('editor.useShadowDOM') - insertionPoint = document.createElement('content') - insertionPoint.setAttribute('select', '.underlayer') - @domNode.appendChild(insertionPoint) - getDomNode: -> @domNode diff --git a/static/text-editor-light.less b/static/text-editor-light.less index 9d87c61ca..a8b99f0bc 100644 --- a/static/text-editor-light.less +++ b/static/text-editor-light.less @@ -100,15 +100,6 @@ atom-text-editor { min-width: 0; } - .underlayer { - position: absolute; - z-index: -2; - top: 0; - bottom: 0; - left: 0; - right: 0; - } - .highlight { background: none; padding: 0; diff --git a/static/text-editor-shadow.less b/static/text-editor-shadow.less index c67637290..cb63b45b0 100644 --- a/static/text-editor-shadow.less +++ b/static/text-editor-shadow.less @@ -81,15 +81,6 @@ min-width: 0; } -.underlayer { - position: absolute; - z-index: -2; - top: 0; - bottom: 0; - left: 0; - right: 0; -} - .highlight { background: none; padding: 0; From ccd739ff65b5cfd9f043bb9c0c1ced466c655554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Fri, 5 Jun 2015 16:35:48 +0200 Subject: [PATCH 12/77] :arrow_up: notifications@0.51.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eabbf5978..1db19fde1 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "link": "0.30.0", "markdown-preview": "0.150.0", "metrics": "0.51.0", - "notifications": "0.50.0", + "notifications": "0.51.0", "open-on-github": "0.37.0", "package-generator": "0.39.0", "release-notes": "0.52.0", From c1b4b743b47192d9e2c4a8eecff113e3b5d381a4 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 17:00:17 +0200 Subject: [PATCH 13/77] Organize visible highlights by tile --- src/text-editor-presenter.coffee | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index d8322d061..4277c6193 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -24,6 +24,7 @@ class TextEditorPresenter @disposables = new CompositeDisposable @emitter = new Emitter + @visibleHighlights = {} @characterWidthsByScope = {} @rangesByDecorationId = {} @lineDecorationsByScreenRow = {} @@ -331,6 +332,7 @@ class TextEditorPresenter endRow = Math.min(@model.getScreenLineCount(), startRow + @tileSize) tile = @state.content.tiles[startRow] ?= {} + tile.startRow = startRow tile.top = startRow * @lineHeight - @scrollTop tile.left = -@scrollLeft tile.height = @tileSize * @lineHeight @@ -1171,8 +1173,8 @@ class TextEditorPresenter @lineDecorationsByScreenRow = {} @lineNumberDecorationsByScreenRow = {} @customGutterDecorationsByGutterNameAndScreenRow = {} + @visibleHighlights = {} - visibleHighlights = {} return unless 0 <= @startRow <= @endRow <= Infinity for markerId, decorations of @model.decorationsForScreenRowRange(@startRow, @endRow - 1) @@ -1181,12 +1183,11 @@ class TextEditorPresenter if decoration.isType('line') or decoration.isType('gutter') @addToLineDecorationCaches(decoration, range) else if decoration.isType('highlight') - visibleHighlights[decoration.id] = @updateHighlightState(decoration) + @updateHighlightState(decoration) for tileId, tileState of @state.content.tiles for id, highlight of tileState.highlights - unless visibleHighlights[id] - delete tileState.highlights[id] + delete tileState.highlights[id] unless @visibleHighlights[tileId]?[id]? return @@ -1300,6 +1301,9 @@ class TextEditorPresenter highlightState.deprecatedRegionClass = properties.deprecatedRegionClass highlightState.regions = @buildHighlightRegions(tileStartRow, tileRange) + @visibleHighlights[tileStartRow] ?= {} + @visibleHighlights[tileStartRow][decoration.id] = true + startRow = tileEndRow @emitDidUpdateState() From b20394e323ad975c1a176666423a0f60f696c6fd Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 17:34:34 +0200 Subject: [PATCH 14/77] :art: --- src/text-editor-presenter.coffee | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 4277c6193..193e62324 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1270,14 +1270,19 @@ class TextEditorPresenter flash = decoration.consumeNextFlash() - startRow = range.start.row - while startRow <= range.end.row - tileStartRow = @tileForRow(startRow) - tileEndRow = tileStartRow + @tileSize - tileState = @state.content.tiles[tileStartRow] ?= {highlights: {}} - endRow = Math.min(tileEndRow, range.end.row) - tileRange = new Range(new Point(startRow, 0), new Point(endRow, Infinity)) + startTile = @tileForRow(range.start.row) + endTile = @tileForRow(range.end.row) + + for currentTile in [startTile..endTile] by @tileSize + startRow = Math.max(currentTile, range.start.row) + endRow = Math.min(currentTile + @tileSize - 1, range.end.row) + + tileState = @state.content.tiles[currentTile] ?= {highlights: {}} + tileRange = new Range( + new Point(startRow, 0), + new Point(endRow, Infinity) + ) if startRow is range.start.row tileRange.start.column = range.start.column @@ -1285,11 +1290,13 @@ class TextEditorPresenter if endRow is range.end.row tileRange.end.column = range.end.column + console.log "Range for tile #{currentTile}: #{tileRange.toString()}" + highlightState = tileState.highlights[decoration.id] ?= { flashCount: 0 flashDuration: null flashClass: null - tileRow: tileStartRow + tileRow: currentTile } if flash? @@ -1299,12 +1306,10 @@ class TextEditorPresenter highlightState.class = properties.class highlightState.deprecatedRegionClass = properties.deprecatedRegionClass - highlightState.regions = @buildHighlightRegions(tileStartRow, tileRange) + highlightState.regions = @buildHighlightRegions(currentTile, tileRange) - @visibleHighlights[tileStartRow] ?= {} - @visibleHighlights[tileStartRow][decoration.id] = true - - startRow = tileEndRow + @visibleHighlights[currentTile] ?= {} + @visibleHighlights[currentTile][decoration.id] = true @emitDidUpdateState() From 022d0cead3633711d9f15da5f56d64ead667e1c2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 5 Jun 2015 08:43:11 -0700 Subject: [PATCH 15/77] Re-enable tree-view and tabs sublime-tabs is installed --- .../packages/sublime-tabs/package.json | 4 ++++ spec/package-manager-spec.coffee | 19 +++++++++++++++++++ src/package-manager.coffee | 11 +++++++++++ 3 files changed, 34 insertions(+) create mode 100644 spec/fixtures/packages/sublime-tabs/package.json diff --git a/spec/fixtures/packages/sublime-tabs/package.json b/spec/fixtures/packages/sublime-tabs/package.json new file mode 100644 index 000000000..2fd01501d --- /dev/null +++ b/spec/fixtures/packages/sublime-tabs/package.json @@ -0,0 +1,4 @@ +{ + "name": "sublime-tabs", + "version": "1.0.0" +} diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index f09f43824..af9378caa 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -877,3 +877,22 @@ describe "PackageManager", -> runs -> expect(fs.isDirectorySync(autocompleteCSSPath)).toBe false expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true + + describe "when the deprecated sublime-tabs package is installed", -> + it "enables the tree-view and tabs package", -> + atom.config.pushAtKeyPath('core.disabledPackages', 'tree-view') + atom.config.pushAtKeyPath('core.disabledPackages', 'tabs') + + spyOn(atom.packages, 'getAvailablePackagePaths').andReturn [ + path.join(__dirname, 'fixtures', 'packages', 'sublime-tabs') + path.resolve(__dirname, '..', 'node_modules', 'tree-view') + path.resolve(__dirname, '..', 'node_modules', 'tabs') + ] + atom.packages.loadPackages() + + waitsFor -> + not atom.packages.isPackageDisabled('tree-view') and not atom.packages.isPackageDisabled('tabs') + + runs -> + expect(atom.packages.isPackageLoaded('tree-view')).toBe true + expect(atom.packages.isPackageLoaded('tabs')).toBe true diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 306e553a8..478f16dd7 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -314,6 +314,10 @@ class PackageManager @uninstallAutocompletePlus() packagePaths = @getAvailablePackagePaths() + + # TODO: remove after a few atom versions. + @migrateSublimeTabsSettings(packagePaths) + packagePaths = packagePaths.filter (packagePath) => not @isPackageDisabled(path.basename(packagePath)) packagePaths = _.uniq packagePaths, (packagePath) -> path.basename(packagePath) @loadPackage(packagePath) for packagePath in packagePaths @@ -445,6 +449,13 @@ class PackageManager @uninstallDirectory(dirToRemove) return + # TODO: remove this after a few versions + migrateSublimeTabsSettings: (packagePaths) -> + for packagePath in packagePaths when path.basename(packagePath) is 'sublime-tabs' + atom.config.removeAtKeyPath('core.disabledPackages', 'tree-view') + atom.config.removeAtKeyPath('core.disabledPackages', 'tabs') + return + uninstallDirectory: (directory) -> symlinkPromise = new Promise (resolve) -> fs.isSymbolicLink directory, (isSymLink) -> resolve(isSymLink) From 71f9c2641846eeaffbfbf9b664250d474eb12e8d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 5 Jun 2015 08:47:00 -0700 Subject: [PATCH 16/77] Only migrate config when not including deprecated APIs --- spec/package-manager-spec.coffee | 10 ++++++++++ src/package-manager.coffee | 1 + 2 files changed, 11 insertions(+) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index af9378caa..26b675975 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -879,6 +879,16 @@ describe "PackageManager", -> expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true describe "when the deprecated sublime-tabs package is installed", -> + grim = require 'grim' + includeDeprecatedAPIs = null + + beforeEach -> + {includeDeprecatedAPIs} = grim + grim.includeDeprecatedAPIs = false + + afterEach -> + grim.includeDeprecatedAPIs = includeDeprecatedAPIs + it "enables the tree-view and tabs package", -> atom.config.pushAtKeyPath('core.disabledPackages', 'tree-view') atom.config.pushAtKeyPath('core.disabledPackages', 'tabs') diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 478f16dd7..aeb67ea3b 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -451,6 +451,7 @@ class PackageManager # TODO: remove this after a few versions migrateSublimeTabsSettings: (packagePaths) -> + return if Grim.includeDeprecatedAPIs for packagePath in packagePaths when path.basename(packagePath) is 'sublime-tabs' atom.config.removeAtKeyPath('core.disabledPackages', 'tree-view') atom.config.removeAtKeyPath('core.disabledPackages', 'tabs') From 786bfc7ebdd3d56457f12ae4d8588c657db2075f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=BDu=C5=BEak?= Date: Fri, 5 Jun 2015 17:51:42 +0200 Subject: [PATCH 17/77] :arrow_up: notifications@0.52.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1db19fde1..e9755c850 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "link": "0.30.0", "markdown-preview": "0.150.0", "metrics": "0.51.0", - "notifications": "0.51.0", + "notifications": "0.52.0", "open-on-github": "0.37.0", "package-generator": "0.39.0", "release-notes": "0.52.0", From 2b3329673fdf6882797c65f9e1e428198e0b1346 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 5 Jun 2015 09:03:22 -0700 Subject: [PATCH 18/77] :arrow_up: settings-view@0.208 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9755c850..20cb1a580 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "open-on-github": "0.37.0", "package-generator": "0.39.0", "release-notes": "0.52.0", - "settings-view": "0.207.0", + "settings-view": "0.208.0", "snippets": "0.93.0", "spell-check": "0.58.0", "status-bar": "0.74.0", From 53a3239379e0ae63c136f1e513e65b103705af82 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 18:17:30 +0200 Subject: [PATCH 19/77] Use buffer coordinates in TokenizedBuffer::scopeDescriptorForPosition Fixes #7073 --- src/tokenized-buffer.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index 55d2e7e37..6b25847c9 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -405,7 +405,7 @@ class TokenizedBuffer extends Model iterator = @tokenizedLines[row].getTokenIterator() while iterator.next() - if iterator.getScreenEnd() > column + if iterator.getBufferEnd() > column scopes = iterator.getScopes() break From b3c9a9a77dae7ca832ef1d1e6cae091fba03283f Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 5 Jun 2015 18:33:32 +0200 Subject: [PATCH 20/77] :bug: Correctly display highlight regions --- src/text-editor-presenter.coffee | 33 +++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 193e62324..76f532ec6 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1270,7 +1270,6 @@ class TextEditorPresenter flash = decoration.consumeNextFlash() - startTile = @tileForRow(range.start.row) endTile = @tileForRow(range.end.row) @@ -1290,8 +1289,6 @@ class TextEditorPresenter if endRow is range.end.row tileRange.end.column = range.end.column - console.log "Range for tile #{currentTile}: #{tileRange.toString()}" - highlightState = tileState.highlights[decoration.id] ?= { flashCount: 0 flashDuration: null @@ -1317,20 +1314,25 @@ class TextEditorPresenter buildHighlightRegions: (tileStartRow, screenRange) -> lineHeightInPixels = @lineHeight - startPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.start, true) + startPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.start, false) endPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.end, true) spannedRows = screenRange.end.row - screenRange.start.row + 1 + regions = [] + if spannedRows is 1 - [ + region = top: startPixelPosition.top height: lineHeightInPixels left: startPixelPosition.left - width: endPixelPosition.left - startPixelPosition.left - ] - else - regions = [] + if screenRange.end.column is Infinity + region.right = 0 + else + region.width = endPixelPosition.left - startPixelPosition.left + + regions.push(region) + else # First row, extending from selection start to the right side of screen regions.push( top: startPixelPosition.top @@ -1350,14 +1352,19 @@ class TextEditorPresenter # Last row, extending from left side of screen to selection end if screenRange.end.column > 0 - regions.push( + region = top: endPixelPosition.top height: lineHeightInPixels left: 0 - width: endPixelPosition.left - ) - regions + if screenRange.end.column is Infinity + region.right = 0 + else + region.width = endPixelPosition.left + + regions.push(region) + + regions setOverlayDimensions: (decorationId, itemWidth, itemHeight, contentMargin) -> @overlayDimensions[decorationId] ?= {} From c34838277d68bd19f0b97ecede4d86c684a111b8 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 19:55:34 +0200 Subject: [PATCH 21/77] =?UTF-8?q?In=20largeFileMode,=20base=20maxLineLengt?= =?UTF-8?q?h=20on=20the=20longest=20line=20we=E2=80=99ve=20seen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is pretty hacky. If we want to compute the true longest line, we’ll need to process every line, which is what large file mode is designed to avoid. So now whenever the display buffer returns a line, it has the potential to update the longest line. This is a bit weird because retrieving a line now has a side effect. It’s even more weird because the longest line will actually be wrong for the initial state updates in the TextEditorPresenter. But as soon as the user interacts in any way the dimensions are recomputed, so it works for now. A better approach may be to set a visible region on the display buffer. But I’d like to keep this low-touch until we have a chance to revisit the design of DisplayBuffer in a bigger way. --- src/display-buffer.coffee | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 32f374776..388182c8f 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -479,7 +479,11 @@ class DisplayBuffer extends Model # Returns {TokenizedLine} tokenizedLineForScreenRow: (screenRow) -> if @largeFileMode - @tokenizedBuffer.tokenizedLineForRow(screenRow) + line = @tokenizedBuffer.tokenizedLineForRow(screenRow) + if line.text.length > @maxLineLength + @maxLineLength = line.text.length + @longestScreenRow = screenRow + line else @screenLines[screenRow] @@ -760,19 +764,13 @@ class DisplayBuffer extends Model # # Returns a {Number}. getMaxLineLength: -> - if @largeFileMode - 100 - else - @maxLineLength + @maxLineLength # Gets the row number of the longest screen line. # # Return a {} getLongestScreenRow: -> - if @largeFileMode - 0 - else - @longestScreenRow + @longestScreenRow # Given a buffer position, this converts it into a screen position. # From 0f24e369c60d5b021d46228315bac9c1eca3713d Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 5 Jun 2015 11:29:36 -0700 Subject: [PATCH 22/77] :arrow_up: text-buffer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 20cb1a580..879348d77 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "6.2.0", + "text-buffer": "6.2.1", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6", From 2337254afbe827b8bea2b7819800c9aa663de687 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 5 Jun 2015 12:05:05 -0700 Subject: [PATCH 23/77] Fix text-editor-component-spec failure Grouping intervals are exclusive now. It shouldn't affect anybody since it's a one-millisecond change to the meaning of grouping-interval, but it required changing some time intervals in this spec. --- spec/text-editor-component-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index b2bb09acd..e4d502ded 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -2340,10 +2340,10 @@ describe "TextEditorComponent", -> editor.setText("") componentNode.dispatchEvent(buildTextInputEvent(data: 'x', target: inputNode)) - currentTime += 100 + currentTime += 99 componentNode.dispatchEvent(buildTextInputEvent(data: 'y', target: inputNode)) - currentTime += 100 + currentTime += 99 componentNode.dispatchEvent(new CustomEvent('editor:duplicate-lines', bubbles: true, cancelable: true)) currentTime += 101 From 639647d1158eb90c510811ab3cb66d199e7a2904 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 21:31:06 +0200 Subject: [PATCH 24/77] Disallow fold creation in large file mode --- src/display-buffer.coffee | 9 +++++---- src/tokenized-buffer.coffee | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 388182c8f..2fccc4eb0 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -532,10 +532,11 @@ class DisplayBuffer extends Model # # Returns the new {Fold}. createFold: (startRow, endRow) -> - foldMarker = - @findFoldMarker({startRow, endRow}) ? - @buffer.markRange([[startRow, 0], [endRow, Infinity]], @getFoldMarkerAttributes()) - @foldForMarker(foldMarker) + unless @largeFileMode + foldMarker = + @findFoldMarker({startRow, endRow}) ? + @buffer.markRange([[startRow, 0], [endRow, Infinity]], @getFoldMarkerAttributes()) + @foldForMarker(foldMarker) isFoldedAtBufferRow: (bufferRow) -> @largestFoldContainingBufferRow(bufferRow)? diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index 5aa3482a9..f051cb4be 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -263,6 +263,8 @@ class TokenizedBuffer extends Model row - increment updateFoldableStatus: (startRow, endRow) -> + return [startRow, endRow] if @largeFileMode + scanStartRow = @buffer.previousNonBlankRow(startRow) ? startRow scanStartRow-- while scanStartRow > 0 and @tokenizedLineForRow(scanStartRow).isComment() scanEndRow = @buffer.nextNonBlankRow(endRow) ? endRow @@ -278,7 +280,10 @@ class TokenizedBuffer extends Model [startRow, endRow] isFoldableAtRow: (row) -> - @isFoldableCodeAtRow(row) or @isFoldableCommentAtRow(row) + if @largeFileMode + false + else + @isFoldableCodeAtRow(row) or @isFoldableCommentAtRow(row) # Returns a {Boolean} indicating whether the given buffer row starts # a a foldable row range due to the code's indentation patterns. From efd4662de0af4776bca54ed1a79a5c7e4c8f98b2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 21:36:11 +0200 Subject: [PATCH 25/77] =?UTF-8?q?Don=E2=80=99t=20allow=20soft=20wrap=20to?= =?UTF-8?q?=20be=20enabled=20in=20large=20file=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/display-buffer.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 2fccc4eb0..8aa6e9d1b 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -445,7 +445,10 @@ class DisplayBuffer extends Model @isSoftWrapped() isSoftWrapped: -> - @softWrapped ? @configSettings.softWrap ? false + if @largeFileMode + false + else + @softWrapped ? @configSettings.softWrap ? false # Set the number of characters that fit horizontally in the editor. # From 56273e7eef6c16093ca45eebf346c9903ddb614e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 21:44:23 +0200 Subject: [PATCH 26/77] Preserve large file mode across serialization and pane splits --- src/display-buffer.coffee | 3 ++- src/tokenized-buffer.coffee | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 8aa6e9d1b..910f7b177 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -89,13 +89,14 @@ class DisplayBuffer extends Model scrollTop: @scrollTop scrollLeft: @scrollLeft tokenizedBuffer: @tokenizedBuffer.serialize() + largeFileMode: @largeFileMode deserializeParams: (params) -> params.tokenizedBuffer = TokenizedBuffer.deserialize(params.tokenizedBuffer) params copy: -> - newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength()}) + newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength(), @largeFileMode}) newDisplayBuffer.setScrollTop(@getScrollTop()) newDisplayBuffer.setScrollLeft(@getScrollLeft()) diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index f051cb4be..6337aa3c6 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -44,6 +44,7 @@ class TokenizedBuffer extends Model bufferPath: @buffer.getPath() tabLength: @tabLength ignoreInvisibles: @ignoreInvisibles + largeFileMode: @largeFileMode deserializeParams: (params) -> params.buffer = atom.project.bufferForPathSync(params.bufferPath) From 1800a9fb1d6a6cd147a275a6efd2458606974928 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Fri, 5 Jun 2015 12:52:34 -0700 Subject: [PATCH 27/77] Prepare 0.208 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 879348d77..4e998abb4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "0.207.0", + "version": "0.208.0", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 48ce361bd0f81b369a5f10ce7e9a4c2e5d3c339f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 22:24:49 +0200 Subject: [PATCH 28/77] Select grammars based on first 10 lines of content, not the entire file --- src/tokenized-buffer.coffee | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index 6337aa3c6..758aef501 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -67,7 +67,7 @@ class TokenizedBuffer extends Model if grammar.injectionSelector? @retokenizeLines() if @hasTokenForSelector(grammar.injectionSelector) else - newScore = grammar.getScore(@buffer.getPath(), @buffer.getText()) + newScore = grammar.getScore(@buffer.getPath(), @getGrammarSelectionContent()) @setGrammar(grammar, newScore) if newScore > @currentGrammarScore setGrammar: (grammar, score) -> @@ -75,7 +75,7 @@ class TokenizedBuffer extends Model @grammar = grammar @rootScopeDescriptor = new ScopeDescriptor(scopes: [@grammar.scopeName]) - @currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @buffer.getText()) + @currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @getGrammarSelectionContent()) @grammarUpdateDisposable?.dispose() @grammarUpdateDisposable = @grammar.onDidUpdate => @retokenizeLines() @@ -106,8 +106,11 @@ class TokenizedBuffer extends Model @emit 'grammar-changed', grammar if Grim.includeDeprecatedAPIs @emitter.emit 'did-change-grammar', grammar + getGrammarSelectionContent: -> + @buffer.getTextInRange([[0, 0], [10, 0]]) + reloadGrammar: -> - if grammar = atom.grammars.selectGrammar(@buffer.getPath(), @buffer.getText()) + if grammar = atom.grammars.selectGrammar(@buffer.getPath(), @getGrammarSelectionContent()) @setGrammar(grammar) else throw new Error("No grammar found for path: #{path}") From 2732e0dcacea193bbf54a96384320a15f4644935 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 5 Jun 2015 13:31:24 -0700 Subject: [PATCH 29/77] presenter: :fire: redundant decoration state updates --- src/text-editor-presenter.coffee | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 03cfd5a21..2acb59c27 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1134,8 +1134,6 @@ class TextEditorPresenter @shouldUpdateLineNumbersState = true else if decoration.isType('gutter') @shouldUpdateCustomGutterDecorationState = true - if decoration.isType('highlight') - @updateHighlightState(decoration) if decoration.isType('overlay') @shouldUpdateOverlaysState = true @@ -1145,14 +1143,14 @@ class TextEditorPresenter @observeDecoration(decoration) if decoration.isType('line') or decoration.isType('gutter') - @addToLineDecorationCaches(decoration, decoration.getMarker().getScreenRange()) + @shouldUpdateDecorations = true @shouldUpdateTilesState = true if decoration.isType('line') if decoration.isType('line-number') @shouldUpdateLineNumbersState = true else if decoration.isType('gutter') @shouldUpdateCustomGutterDecorationState = true else if decoration.isType('highlight') - @updateHighlightState(decoration) + @shouldUpdateDecorations = true else if decoration.isType('overlay') @shouldUpdateOverlaysState = true @@ -1357,7 +1355,6 @@ class TextEditorPresenter @shouldUpdateHiddenInputState = true @pauseCursorBlinking() @updateCursorState(cursor) - @emitDidUpdateState() startBlinkingCursors: -> From ffcebdad33bc863e88152ffa94717dfc2d669d84 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 23:14:11 +0200 Subject: [PATCH 30/77] Remove outdated test --- spec/workspace-spec.coffee | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 009f95a1c..3e94727d4 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -272,20 +272,6 @@ describe "Workspace", -> beforeEach -> atom.notifications.onDidAddNotification notificationSpy = jasmine.createSpy() - describe "when a large file is opened", -> - beforeEach -> - spyOn(fs, 'getSizeSync').andReturn 2 * 1048577 # 2MB - - it "creates a notification", -> - waitsForPromise -> - workspace.open('file1') - - runs -> - expect(notificationSpy).toHaveBeenCalled() - notification = notificationSpy.mostRecentCall.args[0] - expect(notification.getType()).toBe 'warning' - expect(notification.getMessage()).toContain '< 2MB' - describe "when a file does not exist", -> it "creates an empty buffer for the specified path", -> waitsForPromise -> From df733aa3de889976d43f9d209d15a947883018c0 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 23:25:48 +0200 Subject: [PATCH 31/77] Add a basic test for opening an editor in largeFileMode if >= 2MB --- spec/workspace-spec.coffee | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 3e94727d4..4918fc65f 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -224,6 +224,17 @@ describe "Workspace", -> expect(workspace.paneContainer.root.children[0]).toBe pane1 expect(workspace.paneContainer.root.children[1]).toBe pane4 + describe "when the file is large (over 2mb)", -> + it "opens the editor with largeFileMode: true", -> + spyOn(fs, 'getSizeSync').andReturn 2 * 1048577 # 2MB + + editor = null + waitsForPromise -> + workspace.open('sample.js').then (e) -> editor = e + + runs -> + expect(editor.displayBuffer.largeFileMode).toBe true + describe "when passed a path that matches a custom opener", -> it "returns the resource returned by the custom opener", -> fooOpener = (pathToOpen, options) -> {foo: pathToOpen, options} if pathToOpen?.match(/\.foo/) From 3ac9d539ce99d09d17b4dfd2d33c140edeb54e8f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 23:40:29 +0200 Subject: [PATCH 32/77] Add a super basic test for large file mode --- spec/text-editor-spec.coffee | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index 8ad1ce390..63b01a178 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -66,6 +66,25 @@ describe "TextEditor", -> expect(editor.tokenizedLineForScreenRow(0).invisibles.eol).toBe '?' + describe "when the editor is constructed with the largeFileMode option set to true", -> + it "loads the editor but doesn't tokenize", -> + editor = null + + waitsForPromise -> + atom.workspace.open('sample.js', largeFileMode: true).then (o) -> editor = o + + runs -> + buffer = editor.getBuffer() + expect(editor.tokenizedLineForScreenRow(0).text).toBe buffer.lineForRow(0) + expect(editor.tokenizedLineForScreenRow(0).tokens.length).toBe 1 + expect(editor.tokenizedLineForScreenRow(1).tokens.length).toBe 2 # soft tab + expect(editor.tokenizedLineForScreenRow(12).text).toBe buffer.lineForRow(12) + expect(editor.tokenizedLineForScreenRow(0).tokens.length).toBe 1 + expect(editor.getCursorScreenPosition()).toEqual [0, 0] + editor.insertText('hey"') + expect(editor.tokenizedLineForScreenRow(0).tokens.length).toBe 1 + expect(editor.tokenizedLineForScreenRow(1).tokens.length).toBe 2 # sof tab + describe "when the editor is constructed with an initialLine option", -> it "positions the cursor on the specified line", -> editor = null From 88812831ce248315f908fe048d0bd38a8d81d86e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 5 Jun 2015 23:40:56 +0200 Subject: [PATCH 33/77] Only check for max line length when lines exist --- src/display-buffer.coffee | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 910f7b177..2519fa6d6 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -483,11 +483,11 @@ class DisplayBuffer extends Model # Returns {TokenizedLine} tokenizedLineForScreenRow: (screenRow) -> if @largeFileMode - line = @tokenizedBuffer.tokenizedLineForRow(screenRow) - if line.text.length > @maxLineLength - @maxLineLength = line.text.length - @longestScreenRow = screenRow - line + if line = @tokenizedBuffer.tokenizedLineForRow(screenRow) + if line.text.length > @maxLineLength + @maxLineLength = line.text.length + @longestScreenRow = screenRow + line else @screenLines[screenRow] From 02140c718214c3a9e0160ff1f66cd7ba90042962 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 5 Jun 2015 16:26:53 -0700 Subject: [PATCH 34/77] :arrow_up: find-and-replace, text-buffer --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4e998abb4..cf19292e7 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "6.2.1", + "text-buffer": "6.3.0", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6", @@ -99,7 +99,7 @@ "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", - "find-and-replace": "0.171.0", + "find-and-replace": "0.172.0", "fuzzy-finder": "0.87.0", "git-diff": "0.55.0", "go-to-line": "0.30.0", From f850750707950cf7d022e467cd5079c75cdf0f4d Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 5 Jun 2015 16:44:43 -0700 Subject: [PATCH 35/77] :arrow_up: spell-check --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cf19292e7..4e082676a 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "release-notes": "0.52.0", "settings-view": "0.208.0", "snippets": "0.93.0", - "spell-check": "0.58.0", + "spell-check": "0.59.0", "status-bar": "0.74.0", "styleguide": "0.44.0", "symbols-view": "0.97.0", From cf70739bf19f3f082c5370aa1e132da0062f1de7 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 08:34:28 +0200 Subject: [PATCH 36/77] Don't clip when building highlight regions --- src/text-editor-presenter.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 76f532ec6..77cdd7c6d 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1315,7 +1315,7 @@ class TextEditorPresenter buildHighlightRegions: (tileStartRow, screenRange) -> lineHeightInPixels = @lineHeight startPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.start, false) - endPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.end, true) + endPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.end, false) spannedRows = screenRange.end.row - screenRange.start.row + 1 regions = [] From 11202ebb6965f51233bb6e8c5cbd9d6bd6ba992a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 09:15:10 +0200 Subject: [PATCH 37/77] :art: --- src/text-editor-presenter.coffee | 56 +++++++++++++++++++------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 77cdd7c6d..6af2c6524 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1238,6 +1238,22 @@ class TextEditorPresenter return + intersectRangeWithTile: (range, tileStartRow) -> + intersectingStartRow = Math.max(tileStartRow, range.start.row) + intersectingEndRow = Math.min(tileStartRow + @tileSize - 1, range.end.row) + intersectingRange = new Range( + new Point(intersectingStartRow, 0), + new Point(intersectingEndRow, Infinity) + ) + + if intersectingStartRow is range.start.row + intersectingRange.start.column = range.start.column + + if intersectingEndRow is range.end.row + intersectingRange.end.column = range.end.column + + intersectingRange + updateHighlightState: (decoration) -> return unless @startRow? and @endRow? and @lineHeight? and @hasPixelPositionRequirements() @@ -1273,27 +1289,13 @@ class TextEditorPresenter startTile = @tileForRow(range.start.row) endTile = @tileForRow(range.end.row) - for currentTile in [startTile..endTile] by @tileSize - startRow = Math.max(currentTile, range.start.row) - endRow = Math.min(currentTile + @tileSize - 1, range.end.row) - - tileState = @state.content.tiles[currentTile] ?= {highlights: {}} - tileRange = new Range( - new Point(startRow, 0), - new Point(endRow, Infinity) - ) - - if startRow is range.start.row - tileRange.start.column = range.start.column - - if endRow is range.end.row - tileRange.end.column = range.end.column - + for tileStartRow in [startTile..endTile] by @tileSize + tileState = @state.content.tiles[tileStartRow] ?= {highlights: {}} highlightState = tileState.highlights[decoration.id] ?= { flashCount: 0 flashDuration: null flashClass: null - tileRow: currentTile + tileRow: tileStartRow } if flash? @@ -1301,21 +1303,29 @@ class TextEditorPresenter highlightState.flashClass = flash.class highlightState.flashDuration = flash.duration + intersectingRange = @intersectRangeWithTile(range, tileStartRow) highlightState.class = properties.class highlightState.deprecatedRegionClass = properties.deprecatedRegionClass - highlightState.regions = @buildHighlightRegions(currentTile, tileRange) + highlightState.regions = @buildHighlightRegions(intersectingRange) - @visibleHighlights[currentTile] ?= {} - @visibleHighlights[currentTile][decoration.id] = true + for region in highlightState.regions + @repositionRegionWithinTile(region, tileStartRow) + + @visibleHighlights[tileStartRow] ?= {} + @visibleHighlights[tileStartRow][decoration.id] = true @emitDidUpdateState() true - buildHighlightRegions: (tileStartRow, screenRange) -> + repositionRegionWithinTile: (region, tileStartRow) -> + region.top += @scrollTop - tileStartRow * @lineHeight + region.left += @scrollLeft + + buildHighlightRegions: (screenRange) -> lineHeightInPixels = @lineHeight - startPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.start, false) - endPixelPosition = @pixelPositionForScreenPositionInTile(tileStartRow, screenRange.end, false) + startPixelPosition = @pixelPositionForScreenPosition(screenRange.start, false) + endPixelPosition = @pixelPositionForScreenPosition(screenRange.end, false) spannedRows = screenRange.end.row - screenRange.start.row + 1 regions = [] From 8319eae0d7f986f1563569a0e8a4f42db1031c3d Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 09:29:40 +0200 Subject: [PATCH 38/77] :fire: Delete unused code --- src/text-editor-presenter.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 6af2c6524..23f4a12f9 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -332,7 +332,6 @@ class TextEditorPresenter endRow = Math.min(@model.getScreenLineCount(), startRow + @tileSize) tile = @state.content.tiles[startRow] ?= {} - tile.startRow = startRow tile.top = startRow * @lineHeight - @scrollTop tile.left = -@scrollLeft tile.height = @tileSize * @lineHeight @@ -1295,7 +1294,6 @@ class TextEditorPresenter flashCount: 0 flashDuration: null flashClass: null - tileRow: tileStartRow } if flash? From f7b82f2411d745e58eadcaf28644dc03631de226 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 09:31:38 +0200 Subject: [PATCH 39/77] :fire: --- src/text-editor-presenter.coffee | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 23f4a12f9..95b683b9e 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1043,13 +1043,6 @@ class TextEditorPresenter hasPixelPositionRequirements: -> @lineHeight? and @baseCharacterWidth? - pixelPositionForScreenPositionInTile: (tileStartRow, screenPosition, clip) -> - position = @pixelPositionForScreenPosition(screenPosition, clip) - position.top -= tileStartRow * @lineHeight - position.top += @scrollTop - position.left += @scrollLeft - position - pixelPositionForScreenPosition: (screenPosition, clip=true) -> screenPosition = Point.fromObject(screenPosition) screenPosition = @model.clipScreenPosition(screenPosition) if clip From de766afee79ae0cdee6b7111f0172eeefbe5f1e3 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 10:18:26 +0200 Subject: [PATCH 40/77] Start porting specs --- spec/text-editor-presenter-spec.coffee | 65 +++++++++++++++++--------- src/text-editor-presenter.coffee | 7 ++- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index fc52c4828..41400d605 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1277,8 +1277,13 @@ describe "TextEditorPresenter", -> expect(presenter.getState().content.cursorsVisible).toBe false describe ".highlights", -> - stateForHighlight = (presenter, decoration) -> - presenter.getState().content.highlights[decoration.id] + expectUndefinedStateForHighlight = (presenter, decoration) -> + for startRow, tileState of presenter.getState().content.tiles + state = stateForHighlightInTile(presenter, decoration, startRow) + expect(state).toBeUndefined() + + stateForHighlightInTile = (presenter, decoration, tile) -> + presenter.getState().content.tiles[tile]?.highlights[decoration.id] stateForSelection = (presenter, selectionIndex) -> selection = presenter.model.getSelections()[selectionIndex] @@ -1297,11 +1302,11 @@ describe "TextEditorPresenter", -> marker3 = editor.markBufferRange([[0, 6], [3, 6]]) highlight3 = editor.decorateMarker(marker3, type: 'highlight', class: 'c') - # on-screen + # on-screen, spans over 2 tiles marker4 = editor.markBufferRange([[2, 6], [4, 6]]) highlight4 = editor.decorateMarker(marker4, type: 'highlight', class: 'd') - # partially off-screen below, 2 of 3 regions on screen + # partially off-screen below, spans over 3 tiles, 2 of 3 regions on screen marker5 = editor.markBufferRange([[3, 6], [6, 6]]) highlight5 = editor.decorateMarker(marker5, type: 'highlight', class: 'e') @@ -1317,51 +1322,67 @@ describe "TextEditorPresenter", -> marker8 = editor.markBufferRange([[2, 2], [2, 2]]) highlight8 = editor.decorateMarker(marker8, type: 'highlight', class: 'h') - presenter = buildPresenter(explicitHeight: 30, scrollTop: 20) + presenter = buildPresenter(explicitHeight: 30, scrollTop: 20, tileSize: 2) - expect(stateForHighlight(presenter, highlight1)).toBeUndefined() + expectUndefinedStateForHighlight(presenter, highlight1) - expectValues stateForHighlight(presenter, highlight2), { + expectValues stateForHighlightInTile(presenter, highlight2, 2), { class: 'b' regions: [ - {top: 2 * 10 - 20, left: 0 * 10, width: 6 * 10, height: 1 * 10} + {top: 0, left: 0 * 10, width: 6 * 10, height: 1 * 10} ] } - expectValues stateForHighlight(presenter, highlight3), { + expectValues stateForHighlightInTile(presenter, highlight3, 2), { class: 'c' regions: [ - {top: 2 * 10 - 20, left: 0 * 10, right: 0, height: 1 * 10} - {top: 3 * 10 - 20, left: 0 * 10, width: 6 * 10, height: 1 * 10} + {top: 0, left: 0 * 10, right: 0, height: 1 * 10} + {top: 10, left: 0 * 10, width: 6 * 10, height: 1 * 10} ] } - expectValues stateForHighlight(presenter, highlight4), { + expectValues stateForHighlightInTile(presenter, highlight4, 2), { class: 'd' regions: [ - {top: 2 * 10 - 20, left: 6 * 10, right: 0, height: 1 * 10} - {top: 3 * 10 - 20, left: 0, right: 0, height: 1 * 10} - {top: 4 * 10 - 20, left: 0, width: 6 * 10, height: 1 * 10} + {top: 0, left: 6 * 10, right: 0, height: 1 * 10} + {top: 10, left: 0, right: 0, height: 1 * 10} + ] + } + expectValues stateForHighlightInTile(presenter, highlight4, 4), { + class: 'd' + regions: [ + {top: 0, left: 0, width: 60, height: 1 * 10} ] } - expectValues stateForHighlight(presenter, highlight5), { + expectValues stateForHighlightInTile(presenter, highlight5, 2), { class: 'e' regions: [ - {top: 3 * 10 - 20, left: 6 * 10, right: 0, height: 1 * 10} - {top: 4 * 10 - 20, left: 0 * 10, right: 0, height: 2 * 10} + {top: 10, left: 6 * 10, right: 0, height: 1 * 10} ] } - expectValues stateForHighlight(presenter, highlight6), { + expectValues stateForHighlightInTile(presenter, highlight5, 4), { + class: 'e' + regions: [ + {top: 0, left: 0, right: 0, height: 1 * 10} + {top: 10, left: 0, right: 0, height: 1 * 10} + ] + } + + expect(stateForHighlightInTile(presenter, highlight5, 6)).toBeUndefined() + + expectValues stateForHighlightInTile(presenter, highlight6, 4), { class: 'f' regions: [ - {top: 5 * 10 - 20, left: 6 * 10, right: 0, height: 1 * 10} + {top: 10, left: 6 * 10, right: 0, height: 1 * 10} ] } - expect(stateForHighlight(presenter, highlight7)).toBeUndefined() - expect(stateForHighlight(presenter, highlight8)).toBeUndefined() + expect(stateForHighlightInTile(presenter, highlight6, 6)).toBeUndefined() + + expectUndefinedStateForHighlight(presenter, highlight7) + expectUndefinedStateForHighlight(presenter, highlight8) it "is empty until all of the required measurements are assigned", -> editor.setSelectedBufferRanges([ diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 95b683b9e..7cbc434d5 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -1282,6 +1282,10 @@ class TextEditorPresenter endTile = @tileForRow(range.end.row) for tileStartRow in [startTile..endTile] by @tileSize + rangeWithinTile = @intersectRangeWithTile(range, tileStartRow) + + continue if rangeWithinTile.isEmpty() + tileState = @state.content.tiles[tileStartRow] ?= {highlights: {}} highlightState = tileState.highlights[decoration.id] ?= { flashCount: 0 @@ -1294,10 +1298,9 @@ class TextEditorPresenter highlightState.flashClass = flash.class highlightState.flashDuration = flash.duration - intersectingRange = @intersectRangeWithTile(range, tileStartRow) highlightState.class = properties.class highlightState.deprecatedRegionClass = properties.deprecatedRegionClass - highlightState.regions = @buildHighlightRegions(intersectingRange) + highlightState.regions = @buildHighlightRegions(rangeWithinTile) for region in highlightState.regions @repositionRegionWithinTile(region, tileStartRow) From b68da1e19bbca1dbd71cf45459a968ed541835c0 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 10:21:24 +0200 Subject: [PATCH 41/77] :green_heart: Finish porting `TextEditorPresenter` specs --- spec/text-editor-presenter-spec.coffee | 147 +++++++++++++++---------- 1 file changed, 86 insertions(+), 61 deletions(-) diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 41400d605..25fde69c1 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1278,16 +1278,21 @@ describe "TextEditorPresenter", -> describe ".highlights", -> expectUndefinedStateForHighlight = (presenter, decoration) -> - for startRow, tileState of presenter.getState().content.tiles - state = stateForHighlightInTile(presenter, decoration, startRow) + for tileId, tileState of presenter.getState().content.tiles + state = stateForHighlightInTile(presenter, decoration, tileId) expect(state).toBeUndefined() stateForHighlightInTile = (presenter, decoration, tile) -> presenter.getState().content.tiles[tile]?.highlights[decoration.id] - stateForSelection = (presenter, selectionIndex) -> + stateForSelectionInTile = (presenter, selectionIndex, tile) -> selection = presenter.model.getSelections()[selectionIndex] - stateForHighlight(presenter, selection.decoration) + stateForHighlightInTile(presenter, selection.decoration, tile) + + expectUndefinedStateForSelection = (presenter, selectionIndex) -> + for tileId, tileState of presenter.getState().content.tiles + state = stateForSelectionInTile(presenter, selectionIndex, tileId) + expect(state).toBeUndefined() it "contains states for highlights that are visible on screen", -> # off-screen above @@ -1389,56 +1394,66 @@ describe "TextEditorPresenter", -> [[0, 2], [2, 4]], ]) - presenter = buildPresenter(explicitHeight: null, lineHeight: null, scrollTop: null, baseCharacterWidth: null) - expect(presenter.getState().content.highlights).toEqual({}) + presenter = buildPresenter(explicitHeight: null, lineHeight: null, scrollTop: null, baseCharacterWidth: null, tileSize: 2) + for tileId, tileState of presenter.getState().content.tiles + expect(tileState.highlights).toEqual({}) presenter.setExplicitHeight(25) - expect(presenter.getState().content.highlights).toEqual({}) + for tileId, tileState of presenter.getState().content.tiles + expect(tileState.highlights).toEqual({}) presenter.setLineHeight(10) - expect(presenter.getState().content.highlights).toEqual({}) + for tileId, tileState of presenter.getState().content.tiles + expect(tileState.highlights).toEqual({}) presenter.setScrollTop(0) - expect(presenter.getState().content.highlights).toEqual({}) + for tileId, tileState of presenter.getState().content.tiles + expect(tileState.highlights).toEqual({}) presenter.setBaseCharacterWidth(8) - expect(presenter.getState().content.highlights).not.toEqual({}) + assignedAnyHighlight = false + for tileId, tileState of presenter.getState().content.tiles + assignedAnyHighlight ||= _.isEqual(tileState.highlights, {}) + + expect(assignedAnyHighlight).toBe(true) it "does not include highlights for invalid markers", -> marker = editor.markBufferRange([[2, 2], [2, 4]], invalidate: 'touch') highlight = editor.decorateMarker(marker, type: 'highlight', class: 'h') - presenter = buildPresenter(explicitHeight: 30, scrollTop: 20) + presenter = buildPresenter(explicitHeight: 30, scrollTop: 20, tileSize: 2) + + expect(stateForHighlightInTile(presenter, highlight, 2)).toBeDefined() - expect(stateForHighlight(presenter, highlight)).toBeDefined() expectStateUpdate presenter, -> editor.getBuffer().insert([2, 2], "stuff") - expect(stateForHighlight(presenter, highlight)).toBeUndefined() + + expectUndefinedStateForHighlight(presenter, highlight) it "updates when ::scrollTop changes", -> editor.setSelectedBufferRanges([ [[6, 2], [6, 4]], ]) - presenter = buildPresenter(explicitHeight: 30, scrollTop: 20) + presenter = buildPresenter(explicitHeight: 30, scrollTop: 20, tileSize: 2) - expect(stateForSelection(presenter, 0)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 0) expectStateUpdate presenter, -> presenter.setScrollTop(5 * 10) - expect(stateForSelection(presenter, 0)).toBeDefined() + expect(stateForSelectionInTile(presenter, 0, 6)).toBeDefined() expectStateUpdate presenter, -> presenter.setScrollTop(2 * 10) - expect(stateForSelection(presenter, 0)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 0) it "updates when ::explicitHeight changes", -> editor.setSelectedBufferRanges([ [[6, 2], [6, 4]], ]) - presenter = buildPresenter(explicitHeight: 20, scrollTop: 20) + presenter = buildPresenter(explicitHeight: 20, scrollTop: 20, tileSize: 2) - expect(stateForSelection(presenter, 0)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 0) expectStateUpdate presenter, -> presenter.setExplicitHeight(60) - expect(stateForSelection(presenter, 0)).toBeDefined() + expect(stateForSelectionInTile(presenter, 0, 6)).toBeDefined() expectStateUpdate presenter, -> presenter.setExplicitHeight(20) - expect(stateForSelection(presenter, 0)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 0) it "updates when ::lineHeight changes", -> editor.setSelectedBufferRanges([ @@ -1446,26 +1461,26 @@ describe "TextEditorPresenter", -> [[3, 4], [3, 6]], ]) - presenter = buildPresenter(explicitHeight: 20, scrollTop: 0) + presenter = buildPresenter(explicitHeight: 20, scrollTop: 0, tileSize: 2) - expectValues stateForSelection(presenter, 0), { + expectValues stateForSelectionInTile(presenter, 0, 2), { regions: [ - {top: 2 * 10, left: 2 * 10, width: 2 * 10, height: 10} + {top: 0, left: 2 * 10, width: 2 * 10, height: 10} ] } - expect(stateForSelection(presenter, 1)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 1) expectStateUpdate presenter, -> presenter.setLineHeight(5) - expectValues stateForSelection(presenter, 0), { + expectValues stateForSelectionInTile(presenter, 0, 2), { regions: [ - {top: 2 * 5, left: 2 * 10, width: 2 * 10, height: 5} + {top: 0, left: 2 * 10, width: 2 * 10, height: 5} ] } - expectValues stateForSelection(presenter, 1), { + expectValues stateForSelectionInTile(presenter, 1, 2), { regions: [ - {top: 3 * 5, left: 4 * 10, width: 2 * 10, height: 5} + {top: 5, left: 4 * 10, width: 2 * 10, height: 5} ] } @@ -1474,14 +1489,14 @@ describe "TextEditorPresenter", -> [[2, 2], [2, 4]], ]) - presenter = buildPresenter(explicitHeight: 20, scrollTop: 0) + presenter = buildPresenter(explicitHeight: 20, scrollTop: 0, tileSize: 2) - expectValues stateForSelection(presenter, 0), { - regions: [{top: 2 * 10, left: 2 * 10, width: 2 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 0, 2), { + regions: [{top: 0, left: 2 * 10, width: 2 * 10, height: 10}] } expectStateUpdate presenter, -> presenter.setBaseCharacterWidth(20) - expectValues stateForSelection(presenter, 0), { - regions: [{top: 2 * 10, left: 2 * 20, width: 2 * 20, height: 10}] + expectValues stateForSelectionInTile(presenter, 0, 2), { + regions: [{top: 0, left: 2 * 20, width: 2 * 20, height: 10}] } it "updates when scoped character widths change", -> @@ -1493,14 +1508,14 @@ describe "TextEditorPresenter", -> [[2, 4], [2, 6]], ]) - presenter = buildPresenter(explicitHeight: 20, scrollTop: 0) + presenter = buildPresenter(explicitHeight: 20, scrollTop: 0, tileSize: 2) - expectValues stateForSelection(presenter, 0), { - regions: [{top: 2 * 10, left: 4 * 10, width: 2 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 0, 2), { + regions: [{top: 0, left: 4 * 10, width: 2 * 10, height: 10}] } expectStateUpdate presenter, -> presenter.setScopedCharacterWidth(['source.js', 'keyword.control.js'], 'i', 20) - expectValues stateForSelection(presenter, 0), { - regions: [{top: 2 * 10, left: 4 * 10, width: 20 + 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 0, 2), { + regions: [{top: 0, left: 4 * 10, width: 20 + 10, height: 10}] } it "updates when highlight decorations are added, moved, hidden, shown, or destroyed", -> @@ -1508,74 +1523,79 @@ describe "TextEditorPresenter", -> [[1, 2], [1, 4]], [[3, 4], [3, 6]] ]) - presenter = buildPresenter(explicitHeight: 20, scrollTop: 0) + presenter = buildPresenter(explicitHeight: 20, scrollTop: 0, tileSize: 2) - expectValues stateForSelection(presenter, 0), { - regions: [{top: 1 * 10, left: 2 * 10, width: 2 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 0, 0), { + regions: [{top: 10, left: 2 * 10, width: 2 * 10, height: 10}] } - expect(stateForSelection(presenter, 1)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 1) # moving into view expectStateUpdate presenter, -> editor.getSelections()[1].setBufferRange([[2, 4], [2, 6]], autoscroll: false) - expectValues stateForSelection(presenter, 1), { - regions: [{top: 2 * 10, left: 4 * 10, width: 2 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 1, 2), { + regions: [{top: 0, left: 4 * 10, width: 2 * 10, height: 10}] } # becoming empty expectStateUpdate presenter, -> editor.getSelections()[1].clear(autoscroll: false) - expect(stateForSelection(presenter, 1)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 1) # becoming non-empty expectStateUpdate presenter, -> editor.getSelections()[1].setBufferRange([[2, 4], [2, 6]], autoscroll: false) - expectValues stateForSelection(presenter, 1), { - regions: [{top: 2 * 10, left: 4 * 10, width: 2 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 1, 2), { + regions: [{top: 0, left: 4 * 10, width: 2 * 10, height: 10}] } # moving out of view expectStateUpdate presenter, -> editor.getSelections()[1].setBufferRange([[3, 4], [3, 6]], autoscroll: false) - expect(stateForSelection(presenter, 1)).toBeUndefined() + expectUndefinedStateForSelection(presenter, 1) # adding expectStateUpdate presenter, -> editor.addSelectionForBufferRange([[1, 4], [1, 6]], autoscroll: false) - expectValues stateForSelection(presenter, 2), { - regions: [{top: 1 * 10, left: 4 * 10, width: 2 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 2, 0), { + regions: [{top: 10, left: 4 * 10, width: 2 * 10, height: 10}] } # moving added selection expectStateUpdate presenter, -> editor.getSelections()[2].setBufferRange([[1, 4], [1, 8]], autoscroll: false) - expectValues stateForSelection(presenter, 2), { - regions: [{top: 1 * 10, left: 4 * 10, width: 4 * 10, height: 10}] + expectValues stateForSelectionInTile(presenter, 2, 0), { + regions: [{top: 10, left: 4 * 10, width: 4 * 10, height: 10}] } # destroying destroyedSelection = editor.getSelections()[2] expectStateUpdate presenter, -> destroyedSelection.destroy() - expect(stateForHighlight(presenter, destroyedSelection.decoration)).toBeUndefined() + expectUndefinedStateForHighlight(presenter, destroyedSelection.decoration) it "updates when highlight decorations' properties are updated", -> marker = editor.markBufferPosition([2, 2]) highlight = editor.decorateMarker(marker, type: 'highlight', class: 'a') - presenter = buildPresenter(explicitHeight: 30, scrollTop: 20) + presenter = buildPresenter(explicitHeight: 30, scrollTop: 20, tileSize: 2) - expect(stateForHighlight(presenter, highlight)).toBeUndefined() + expectUndefinedStateForHighlight(presenter, highlight) expectStateUpdate presenter, -> marker.setBufferRange([[2, 2], [2, 4]]) highlight.setProperties(class: 'b', type: 'highlight') - expectValues stateForHighlight(presenter, highlight), {class: 'b'} + expectValues stateForHighlightInTile(presenter, highlight, 2), {class: 'b'} it "increments the .flashCount and sets the .flashClass and .flashDuration when the highlight model flashes", -> - presenter = buildPresenter(explicitHeight: 30, scrollTop: 20) + presenter = buildPresenter(explicitHeight: 30, scrollTop: 20, tileSize: 2) marker = editor.markBufferPosition([2, 2]) highlight = editor.decorateMarker(marker, type: 'highlight', class: 'a') expectStateUpdate presenter, -> - marker.setBufferRange([[2, 2], [2, 4]]) + marker.setBufferRange([[2, 2], [5, 2]]) highlight.flash('b', 500) - expectValues stateForHighlight(presenter, highlight), { + expectValues stateForHighlightInTile(presenter, highlight, 2), { + flashClass: 'b' + flashDuration: 500 + flashCount: 1 + } + expectValues stateForHighlightInTile(presenter, highlight, 4), { flashClass: 'b' flashDuration: 500 flashCount: 1 @@ -1583,7 +1603,12 @@ describe "TextEditorPresenter", -> expectStateUpdate presenter, -> highlight.flash('c', 600) - expectValues stateForHighlight(presenter, highlight), { + expectValues stateForHighlightInTile(presenter, highlight, 2), { + flashClass: 'c' + flashDuration: 600 + flashCount: 2 + } + expectValues stateForHighlightInTile(presenter, highlight, 4), { flashClass: 'c' flashDuration: 600 flashCount: 2 From fcb965306656e4d20acf3523d114a4032300bff6 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 15:41:15 +0200 Subject: [PATCH 42/77] Start porting `TextEditorComponent` specs --- spec/text-editor-component-spec.coffee | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index e4d502ded..3f62e7fd0 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -89,19 +89,19 @@ describe "TextEditorComponent", -> expect(tilesNodes.length).toBe(3) expect(tilesNodes[0].style['-webkit-transform']).toBe "translate3d(0px, 0px, 0px)" - expect(tilesNodes[0].children.length).toBe(tileSize) + expect(tilesNodes[0].querySelectorAll(".line").length).toBe(tileSize) expectTileContainsRow(tilesNodes[0], 0, top: 0 * lineHeightInPixels) expectTileContainsRow(tilesNodes[0], 1, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[0], 2, top: 2 * lineHeightInPixels) expect(tilesNodes[1].style['-webkit-transform']).toBe "translate3d(0px, #{1 * tileHeight}px, 0px)" - expect(tilesNodes[1].children.length).toBe(tileSize) + expect(tilesNodes[1].querySelectorAll(".line").length).toBe(tileSize) expectTileContainsRow(tilesNodes[1], 3, top: 0 * lineHeightInPixels) expectTileContainsRow(tilesNodes[1], 4, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[1], 5, top: 2 * lineHeightInPixels) expect(tilesNodes[2].style['-webkit-transform']).toBe "translate3d(0px, #{2 * tileHeight}px, 0px)" - expect(tilesNodes[2].children.length).toBe(tileSize) + expect(tilesNodes[2].querySelectorAll(".line").length).toBe(tileSize) expectTileContainsRow(tilesNodes[2], 6, top: 0 * lineHeightInPixels) expectTileContainsRow(tilesNodes[2], 7, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[2], 8, top: 2 * lineHeightInPixels) @@ -118,19 +118,19 @@ describe "TextEditorComponent", -> expect(tilesNodes.length).toBe(3) expect(tilesNodes[0].style['-webkit-transform']).toBe "translate3d(0px, -5px, 0px)" - expect(tilesNodes[0].children.length).toBe(tileSize) + expect(tilesNodes[0].querySelectorAll(".line").length).toBe(tileSize) expectTileContainsRow(tilesNodes[0], 3, top: 0 * lineHeightInPixels) expectTileContainsRow(tilesNodes[0], 4, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[0], 5, top: 2 * lineHeightInPixels) expect(tilesNodes[1].style['-webkit-transform']).toBe "translate3d(0px, #{1 * tileHeight - 5}px, 0px)" - expect(tilesNodes[1].children.length).toBe(tileSize) + expect(tilesNodes[1].querySelectorAll(".line").length).toBe(tileSize) expectTileContainsRow(tilesNodes[1], 6, top: 0 * lineHeightInPixels) expectTileContainsRow(tilesNodes[1], 7, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[1], 8, top: 2 * lineHeightInPixels) expect(tilesNodes[2].style['-webkit-transform']).toBe "translate3d(0px, #{2 * tileHeight - 5}px, 0px)" - expect(tilesNodes[2].children.length).toBe(tileSize) + expect(tilesNodes[2].querySelectorAll(".line").length).toBe(tileSize) expectTileContainsRow(tilesNodes[2], 9, top: 0 * lineHeightInPixels) expectTileContainsRow(tilesNodes[2], 10, top: 1 * lineHeightInPixels) expectTileContainsRow(tilesNodes[2], 11, top: 2 * lineHeightInPixels) @@ -1219,7 +1219,7 @@ describe "TextEditorComponent", -> expect(regions.length).toBe 1 regionRect = regions[0].style - expect(regionRect.top).toBe (9 * lineHeightInPixels - verticalScrollbarNode.scrollTop) + 'px' + expect(regionRect.top).toBe (0 + 'px') expect(regionRect.height).toBe 1 * lineHeightInPixels + 'px' expect(regionRect.left).toBe 2 * charWidth + 'px' expect(regionRect.width).toBe 2 * charWidth + 'px' @@ -1263,10 +1263,10 @@ describe "TextEditorComponent", -> it "allows multiple space-delimited decoration classes", -> decoration.setProperties(type: 'highlight', class: 'foo bar') nextAnimationFrame() - expect(componentNode.querySelectorAll('.foo.bar').length).toBe 1 + expect(componentNode.querySelectorAll('.foo.bar').length).toBe 2 decoration.setProperties(type: 'highlight', class: 'bar baz') nextAnimationFrame() - expect(componentNode.querySelectorAll('.bar.baz').length).toBe 1 + expect(componentNode.querySelectorAll('.bar.baz').length).toBe 2 it "renders classes on the regions directly if 'deprecatedRegionClass' option is defined", -> decoration = editor.decorateMarker(marker, type: 'highlight', class: 'test-highlight', deprecatedRegionClass: 'test-highlight-region') @@ -1278,7 +1278,7 @@ describe "TextEditorComponent", -> describe "when flashing a decoration via Decoration::flash()", -> highlightNode = null beforeEach -> - highlightNode = componentNode.querySelector('.test-highlight') + highlightNode = componentNode.querySelectorAll('.test-highlight')[1] it "adds and removes the flash class specified in ::flash", -> expect(highlightNode.classList.contains('flash-class')).toBe false @@ -1314,13 +1314,15 @@ describe "TextEditorComponent", -> regionStyle = componentNode.querySelector('.test-highlight .region').style originalTop = parseInt(regionStyle.top) + expect(originalTop).toBe(2 * lineHeightInPixels) + editor.getBuffer().insert([0, 0], '\n') nextAnimationFrame() regionStyle = componentNode.querySelector('.test-highlight .region').style newTop = parseInt(regionStyle.top) - expect(newTop).toBe originalTop + lineHeightInPixels + expect(newTop).toBe(0) it "moves rendered highlights when the marker is manually moved", -> regionStyle = componentNode.querySelector('.test-highlight .region').style @@ -1330,7 +1332,7 @@ describe "TextEditorComponent", -> nextAnimationFrame() regionStyle = componentNode.querySelector('.test-highlight .region').style - expect(parseInt(regionStyle.top)).toBe 5 * lineHeightInPixels + expect(parseInt(regionStyle.top)).toBe 2 * lineHeightInPixels describe "when a decoration is updated via Decoration::update", -> it "renders the decoration's new params", -> From 465043f213a6e267e7ea50834e28cfa2b786edb2 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 16:22:33 +0200 Subject: [PATCH 43/77] :fire: --- src/tile-component.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tile-component.coffee b/src/tile-component.coffee index 1aeeea952..9ceca8e54 100644 --- a/src/tile-component.coffee +++ b/src/tile-component.coffee @@ -14,8 +14,6 @@ cloneObject = (object) -> module.exports = class TileComponent - placeholderTextDiv: null - constructor: ({@presenter, @id}) -> @tokenIterator = new TokenIterator @measuredLines = new Set From c4503fc13735988f8aa3774119856647fc30038f Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 16:55:00 +0200 Subject: [PATCH 44/77] :green_heart: --- spec/text-editor-component-spec.coffee | 38 +++++++++++++++++++++----- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index 3f62e7fd0..eec4c004f 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -972,21 +972,45 @@ describe "TextEditorComponent", -> expect(region2Rect.left).toBe scrollViewClientLeft + 0 expect(region2Rect.width).toBe 10 * charWidth - it "renders 3 regions for selections with more than 2 lines", -> - editor.setSelectedScreenRange([[1, 6], [5, 10]]) + it "renders 3 regions per tile for selections with more than 2 lines", -> + editor.setSelectedScreenRange([[0, 6], [5, 10]]) nextAnimationFrame() - regions = componentNode.querySelectorAll('.selection .region') - expect(regions.length).toBe 3 + + # Tile 0 + regions = componentNode.querySelectorAll(".tile")[0].querySelectorAll('.selection .region') + expect(regions.length).toBe(3) region1Rect = regions[0].getBoundingClientRect() - expect(region1Rect.top).toBe 1 * lineHeightInPixels + expect(region1Rect.top).toBe 0 expect(region1Rect.height).toBe 1 * lineHeightInPixels expect(region1Rect.left).toBe scrollViewClientLeft + 6 * charWidth expect(region1Rect.right).toBe scrollViewNode.getBoundingClientRect().right region2Rect = regions[1].getBoundingClientRect() - expect(region2Rect.top).toBe 2 * lineHeightInPixels - expect(region2Rect.height).toBe 3 * lineHeightInPixels + expect(region2Rect.top).toBe 1 * lineHeightInPixels + expect(region2Rect.height).toBe 1 * lineHeightInPixels + expect(region2Rect.left).toBe scrollViewClientLeft + 0 + expect(region2Rect.right).toBe scrollViewNode.getBoundingClientRect().right + + region3Rect = regions[2].getBoundingClientRect() + expect(region3Rect.top).toBe 2 * lineHeightInPixels + expect(region3Rect.height).toBe 1 * lineHeightInPixels + expect(region3Rect.left).toBe scrollViewClientLeft + 0 + expect(region3Rect.right).toBe scrollViewNode.getBoundingClientRect().right + + # Tile 3 + regions = componentNode.querySelectorAll(".tile")[1].querySelectorAll('.selection .region') + expect(regions.length).toBe(3) + + region1Rect = regions[0].getBoundingClientRect() + expect(region1Rect.top).toBe 3 * lineHeightInPixels + expect(region1Rect.height).toBe 1 * lineHeightInPixels + expect(region1Rect.left).toBe scrollViewClientLeft + 0 + expect(region1Rect.right).toBe scrollViewNode.getBoundingClientRect().right + + region2Rect = regions[1].getBoundingClientRect() + expect(region2Rect.top).toBe 4 * lineHeightInPixels + expect(region2Rect.height).toBe 1 * lineHeightInPixels expect(region2Rect.left).toBe scrollViewClientLeft + 0 expect(region2Rect.right).toBe scrollViewNode.getBoundingClientRect().right From 515ae7acb780c7f514dc6190e1c2bc35e3657b73 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Sat, 6 Jun 2015 17:19:24 +0200 Subject: [PATCH 45/77] Use tile node as the reference for highlights width --- spec/text-editor-component-spec.coffee | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index eec4c004f..264ff9b11 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -957,14 +957,15 @@ describe "TextEditorComponent", -> it "renders 2 regions for 2-line selections", -> editor.setSelectedScreenRange([[1, 6], [2, 10]]) nextAnimationFrame() - regions = componentNode.querySelectorAll('.selection .region') + tileNode = componentNode.querySelectorAll(".tile")[0] + regions = tileNode.querySelectorAll('.selection .region') expect(regions.length).toBe 2 region1Rect = regions[0].getBoundingClientRect() expect(region1Rect.top).toBe 1 * lineHeightInPixels expect(region1Rect.height).toBe 1 * lineHeightInPixels expect(region1Rect.left).toBe scrollViewClientLeft + 6 * charWidth - expect(region1Rect.right).toBe scrollViewNode.getBoundingClientRect().right + expect(region1Rect.right).toBe tileNode.getBoundingClientRect().right region2Rect = regions[1].getBoundingClientRect() expect(region2Rect.top).toBe 2 * lineHeightInPixels @@ -977,42 +978,44 @@ describe "TextEditorComponent", -> nextAnimationFrame() # Tile 0 - regions = componentNode.querySelectorAll(".tile")[0].querySelectorAll('.selection .region') + tileNode = componentNode.querySelectorAll(".tile")[0] + regions = tileNode.querySelectorAll('.selection .region') expect(regions.length).toBe(3) region1Rect = regions[0].getBoundingClientRect() expect(region1Rect.top).toBe 0 expect(region1Rect.height).toBe 1 * lineHeightInPixels expect(region1Rect.left).toBe scrollViewClientLeft + 6 * charWidth - expect(region1Rect.right).toBe scrollViewNode.getBoundingClientRect().right + expect(region1Rect.right).toBe tileNode.getBoundingClientRect().right region2Rect = regions[1].getBoundingClientRect() expect(region2Rect.top).toBe 1 * lineHeightInPixels expect(region2Rect.height).toBe 1 * lineHeightInPixels expect(region2Rect.left).toBe scrollViewClientLeft + 0 - expect(region2Rect.right).toBe scrollViewNode.getBoundingClientRect().right + expect(region2Rect.right).toBe tileNode.getBoundingClientRect().right region3Rect = regions[2].getBoundingClientRect() expect(region3Rect.top).toBe 2 * lineHeightInPixels expect(region3Rect.height).toBe 1 * lineHeightInPixels expect(region3Rect.left).toBe scrollViewClientLeft + 0 - expect(region3Rect.right).toBe scrollViewNode.getBoundingClientRect().right + expect(region3Rect.right).toBe tileNode.getBoundingClientRect().right # Tile 3 - regions = componentNode.querySelectorAll(".tile")[1].querySelectorAll('.selection .region') + tileNode = componentNode.querySelectorAll(".tile")[1] + regions = tileNode.querySelectorAll('.selection .region') expect(regions.length).toBe(3) region1Rect = regions[0].getBoundingClientRect() expect(region1Rect.top).toBe 3 * lineHeightInPixels expect(region1Rect.height).toBe 1 * lineHeightInPixels expect(region1Rect.left).toBe scrollViewClientLeft + 0 - expect(region1Rect.right).toBe scrollViewNode.getBoundingClientRect().right + expect(region1Rect.right).toBe tileNode.getBoundingClientRect().right region2Rect = regions[1].getBoundingClientRect() expect(region2Rect.top).toBe 4 * lineHeightInPixels expect(region2Rect.height).toBe 1 * lineHeightInPixels expect(region2Rect.left).toBe scrollViewClientLeft + 0 - expect(region2Rect.right).toBe scrollViewNode.getBoundingClientRect().right + expect(region2Rect.right).toBe tileNode.getBoundingClientRect().right region3Rect = regions[2].getBoundingClientRect() expect(region3Rect.top).toBe 5 * lineHeightInPixels From 786f3399addeadf54ca1def408384256034efdb8 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Sat, 6 Jun 2015 22:17:14 -0700 Subject: [PATCH 46/77] Update text-editor.coffee Fix a type in `src/text-editor.coffee` (`adter` => `after`). --- src/text-editor.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text-editor.coffee b/src/text-editor.coffee index 9a9262e50..977b94ed1 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -325,7 +325,7 @@ class TextEditor extends Model onWillInsertText: (callback) -> @emitter.on 'will-insert-text', callback - # Extended: Calls your `callback` adter text has been inserted. + # Extended: Calls your `callback` after text has been inserted. # # * `callback` {Function} # * `event` event {Object} From fbf58d072595e9e0178f12983423241bd1cf693e Mon Sep 17 00:00:00 2001 From: Thomas Johansen Date: Sun, 7 Jun 2015 09:30:02 +0200 Subject: [PATCH 47/77] :memo: Remove mention of WorkspaceView which no longer exists Fixes #7146 --- src/workspace.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/workspace.coffee b/src/workspace.coffee index 0285cf99d..157d002de 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -22,8 +22,8 @@ Task = require './task' # An instance of this class is available via the `atom.workspace` global. # # Interact with this object to open files, be notified of current and future -# editors, and manipulate panes. To add panels, you'll need to use the -# {WorkspaceView} class for now until we establish APIs at the model layer. +# editors, and manipulate panes. To add panels, use {Workspace::addTopPanel} +# and friends. # # * `editor` {TextEditor} the new editor # From 9d70aec316d4123c030a3134b98a10e87b0c6df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Machist=C3=A9=20N=2E=20Quintana?= Date: Sun, 7 Jun 2015 10:49:25 -0400 Subject: [PATCH 48/77] Only use lsb-core instead of full lsb suite --- resources/linux/redhat/atom.spec.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/linux/redhat/atom.spec.in b/resources/linux/redhat/atom.spec.in index 2bd89cb9a..8ef886e31 100644 --- a/resources/linux/redhat/atom.spec.in +++ b/resources/linux/redhat/atom.spec.in @@ -7,7 +7,7 @@ URL: https://atom.io/ AutoReqProv: no # Avoid libchromiumcontent.so missing dependency Prefix: <%= installDir %> -Requires: lsb +Requires: lsb-core-noarch %description <%= description %> From ca72b802acbd2d7206d6e2278a55d5735f71a79e Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Sun, 7 Jun 2015 11:23:42 -0400 Subject: [PATCH 49/77] Enable "Downloading Update" context menu entry Previously 'update-downloaded' would get emitted right after 'update-available' which would suppress the "Downloading Update" menu entry --- src/browser/auto-updater-win32.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/browser/auto-updater-win32.coffee b/src/browser/auto-updater-win32.coffee index 89018a396..d1ed277e2 100644 --- a/src/browser/auto-updater-win32.coffee +++ b/src/browser/auto-updater-win32.coffee @@ -14,6 +14,8 @@ class AutoUpdater require('auto-updater').quitAndInstall() downloadUpdate: (callback) -> + @emit 'update-available' + SquirrelUpdate.spawn ['--download', @updateUrl], (error, stdout) -> return callback(error) if error? @@ -56,7 +58,6 @@ class AutoUpdater @emit 'update-not-available' return - @emit 'update-available' @emit 'update-downloaded', {}, update.releaseNotes, update.version, new Date(), 'https://atom.io', => @quitAndInstall() module.exports = new AutoUpdater() From 9e6e05a5a6c28eeb5d4e321d58a035beb6326e84 Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Sun, 7 Jun 2015 11:33:26 -0400 Subject: [PATCH 50/77] Put 'update-available' in @downloadUpdate instead So that it only shows up when there's an actual update --- src/browser/auto-updater-win32.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/auto-updater-win32.coffee b/src/browser/auto-updater-win32.coffee index d1ed277e2..4d043ac4e 100644 --- a/src/browser/auto-updater-win32.coffee +++ b/src/browser/auto-updater-win32.coffee @@ -14,8 +14,6 @@ class AutoUpdater require('auto-updater').quitAndInstall() downloadUpdate: (callback) -> - @emit 'update-available' - SquirrelUpdate.spawn ['--download', @updateUrl], (error, stdout) -> return callback(error) if error? @@ -53,6 +51,8 @@ class AutoUpdater @emit 'update-not-available' return + @emit 'update-available' + @installUpdate (error) => if error? @emit 'update-not-available' From 0db3b701772a5d1d11c2161c85f32166d0bff133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Machist=C3=A9=20N=2E=20Quintana?= Date: Mon, 8 Jun 2015 10:59:34 -0400 Subject: [PATCH 51/77] :memo: Update Project::getRepositories() example --- src/project.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index e2eed7ac5..c10ce4a3b 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -128,8 +128,8 @@ class Project extends Model # Prefer the following, which evaluates to a {Promise} that resolves to an # {Array} of {Repository} objects: # ``` - # Promise.all(project.getDirectories().map( - # project.repositoryForDirectory.bind(project))) + # Promise.all(atom.project.getDirectories().map( + # atom.project.repositoryForDirectory.bind(atom.project))) # ``` getRepositories: -> @repositories From 02c8cd682d7f1cf78821eaed49856014b298d0d1 Mon Sep 17 00:00:00 2001 From: atrotors Date: Tue, 9 Jun 2015 01:00:45 +1000 Subject: [PATCH 52/77] fixed missing icon when building from source --- build/tasks/generate-asar-task.coffee | 1 + build/tasks/install-task.coffee | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/tasks/generate-asar-task.coffee b/build/tasks/generate-asar-task.coffee index 3de5f73b6..bb00c6b0f 100644 --- a/build/tasks/generate-asar-task.coffee +++ b/build/tasks/generate-asar-task.coffee @@ -15,6 +15,7 @@ module.exports = (grunt) -> 'ctags-linux' 'ctags-win32.exe' '**/node_modules/spellchecker/**' + 'atom.png' ] unpack = "{#{unpack.join(',')}}" diff --git a/build/tasks/install-task.coffee b/build/tasks/install-task.coffee index 71d3c4ae8..8db654941 100644 --- a/build/tasks/install-task.coffee +++ b/build/tasks/install-task.coffee @@ -46,7 +46,7 @@ module.exports = (grunt) -> desktopInstallFile = path.join(installDir, 'share', 'applications', 'atom.desktop') {description} = grunt.file.readJSON('package.json') - iconName = path.join(shareDir, 'resources', 'app', 'resources', 'atom.png') + iconName = path.join(shareDir, 'resources', 'app.asar.unpacked', 'resources', 'atom.png') executable = path.join(shareDir, 'atom') template = _.template(String(fs.readFileSync(desktopFile))) filled = template({description, iconName, executable}) From 06b30b7d02a2493f21be3496dfe3669e3a0f3ff3 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 8 Jun 2015 18:03:06 +0200 Subject: [PATCH 53/77] :arrow_up: text-buffer Fixes #6899 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4e082676a..5aa732adf 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "6.3.0", + "text-buffer": "6.3.1", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6", From d986cda5220c804eea2b979d2d18dd8a7d8c61f3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 09:06:28 -0700 Subject: [PATCH 54/77] :arrow_up: language-javscript@0.79 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5aa732adf..d747b77dd 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "language-html": "0.39.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", - "language-javascript": "0.78.0", + "language-javascript": "0.79.0", "language-json": "0.15.0", "language-less": "0.27.0", "language-make": "0.14.0", From 0cb79a24cf097ac0417a16ab35b388217bf69368 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 09:10:35 -0700 Subject: [PATCH 55/77] :arrow_up: archive-view@0.58 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d747b77dd..a4a56ce99 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "one-light-ui": "0.9.0", "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", - "archive-view": "0.57.0", + "archive-view": "0.58.0", "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.2", From 39117956877f63d7c6c1893c71d841624cc5f4ef Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 09:29:35 -0700 Subject: [PATCH 56/77] :arrow_up: whitespace@0.30 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a4a56ce99..bc3ab4953 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "tree-view": "0.171.0", "update-package-dependencies": "0.10.0", "welcome": "0.27.0", - "whitespace": "0.29.0", + "whitespace": "0.30.0", "wrap-guide": "0.35.0", "language-c": "0.45.0", "language-clojure": "0.15.0", From f96def7b7aadcb67a4f7ac71ef93bc103b27f4d1 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 09:40:05 -0700 Subject: [PATCH 57/77] :arrow_up: release-notes@0.53 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc3ab4953..e95667c7c 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "notifications": "0.52.0", "open-on-github": "0.37.0", "package-generator": "0.39.0", - "release-notes": "0.52.0", + "release-notes": "0.53.0", "settings-view": "0.208.0", "snippets": "0.93.0", "spell-check": "0.59.0", From cec6959e0867cc2b070e13b72534c8e8c87d0b2c Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 8 Jun 2015 18:58:04 +0200 Subject: [PATCH 58/77] Extend highlights to the full editor width --- spec/text-editor-component-spec.coffee | 4 +++- src/lines-component.coffee | 6 +++--- src/text-editor-presenter.coffee | 1 + src/tile-component.coffee | 16 +++++++--------- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index 264ff9b11..6749e7803 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -246,8 +246,10 @@ describe "TextEditorComponent", -> # lines caused full-screen repaints after switching away from an editor # and back again Please ensure you don't cause a performance regression if # you change this behavior. + editorFullWidth = editor.getScrollWidth() + editor.getVerticalScrollbarWidth() + for lineNode in lineNodes - expect(lineNode.style.width).toBe editor.getScrollWidth() + 'px' + expect(lineNode.style.width).toBe editorFullWidth + 'px' componentNode.style.width = gutterWidth + editor.getScrollWidth() + 100 + 'px' component.measureDimensions() diff --git a/src/lines-component.coffee b/src/lines-component.coffee index bac1c9616..f8b6579a5 100644 --- a/src/lines-component.coffee +++ b/src/lines-component.coffee @@ -54,14 +54,14 @@ class LinesComponent @removeTileNodes() unless @oldState.indentGuidesVisible is @newState.indentGuidesVisible @updateTileNodes() - if @newState.scrollWidth isnt @oldState.scrollWidth - @domNode.style.width = @newState.scrollWidth + 'px' - @oldState.scrollWidth = @newState.scrollWidth + if @newState.width isnt @oldState.width + @domNode.style.width = @newState.width + 'px' @cursorsComponent.updateSync(state) @oldState.indentGuidesVisible = @newState.indentGuidesVisible @oldState.scrollWidth = @newState.scrollWidth + @oldState.width = @newState.width removeTileNodes: -> @removeTileNode(id) for id of @oldState.tiles diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 3149faf56..0e7e448fa 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -307,6 +307,7 @@ class TextEditorPresenter @state.hiddenInput.width = Math.max(width, 2) updateContentState: -> + @state.content.width = Math.max(@contentWidth + @verticalScrollbarWidth, @contentFrameWidth) @state.content.scrollWidth = @scrollWidth @state.content.scrollLeft = @scrollLeft @state.content.indentGuidesVisible = not @model.isMini() and @showIndentGuide diff --git a/src/tile-component.coffee b/src/tile-component.coffee index 9ceca8e54..99dfc6ced 100644 --- a/src/tile-component.coffee +++ b/src/tile-component.coffee @@ -52,6 +52,9 @@ class TileComponent @domNode.style.height = @newTileState.height + 'px' @oldTileState.height = @newTileState.height + if @newState.width isnt @oldState.width + @domNode.style.width = @newState.width + 'px' + if @newTileState.top isnt @oldTileState.top or @newTileState.left isnt @oldTileState.left @domNode.style['-webkit-transform'] = "translate3d(#{@newTileState.left}px, #{@newTileState.top}px, 0px)" @oldTileState.top = @newTileState.top @@ -60,14 +63,9 @@ class TileComponent @removeLineNodes() unless @oldState.indentGuidesVisible is @newState.indentGuidesVisible @updateLineNodes() - if @newState.scrollWidth isnt @oldState.scrollWidth - @domNode.style.width = @newState.scrollWidth + 'px' - @oldState.scrollWidth = @newState.scrollWidth - @highlightsComponent.updateSync(@newTileState) @oldState.indentGuidesVisible = @newState.indentGuidesVisible - @oldState.scrollWidth = @newState.scrollWidth removeLineNodes: -> @removeLineNode(id) for id of @oldTileState.lines @@ -112,7 +110,7 @@ class TileComponent return buildLineHTML: (id) -> - {scrollWidth} = @newState + {width} = @newState {screenRow, tokens, text, top, lineEnding, fold, isSoftWrapped, indentLevel, decorationClasses} = @newTileState.lines[id] classes = '' @@ -121,7 +119,7 @@ class TileComponent classes += decorationClass + ' ' classes += 'line' - lineHTML = "
" + lineHTML = "
" if text is "" lineHTML += @buildEmptyLineInnerHTML(id) @@ -281,8 +279,8 @@ class TileComponent lineNode = @lineNodesByLineId[id] - if @newState.scrollWidth isnt @oldState.scrollWidth - lineNode.style.width = @newState.scrollWidth + 'px' + if @newState.width isnt @oldState.width + lineNode.style.width = @newState.width + 'px' newDecorationClasses = newLineState.decorationClasses oldDecorationClasses = oldLineState.decorationClasses From fccaa9791c1e7912ed6d3bc5710f1a4a3a3aea48 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 10:03:46 -0700 Subject: [PATCH 59/77] :arrow_up: welcome@0.28 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e95667c7c..74ec09cae 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "timecop": "0.31.0", "tree-view": "0.171.0", "update-package-dependencies": "0.10.0", - "welcome": "0.27.0", + "welcome": "0.28.0", "whitespace": "0.30.0", "wrap-guide": "0.35.0", "language-c": "0.45.0", From 53b537737ff3b7fde859a20ad1e43f72209e57b3 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 10:05:56 -0700 Subject: [PATCH 60/77] :arrow_up: language-ruby-on-rails@0.22 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 74ec09cae..4c88a7b99 100644 --- a/package.json +++ b/package.json @@ -149,7 +149,7 @@ "language-property-list": "0.8.0", "language-python": "0.35.0", "language-ruby": "0.56.0", - "language-ruby-on-rails": "0.21.0", + "language-ruby-on-rails": "0.22.0", "language-sass": "0.38.0", "language-shellscript": "0.15.0", "language-source": "0.9.0", From 82e37cc64fcdcac5fb0a9ca837db101e6c220a2e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 10:09:44 -0700 Subject: [PATCH 61/77] :arrow_up: bracket-matcher@0.76 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4c88a7b99..99c70aa4a 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "autosave": "0.20.0", "background-tips": "0.25.0", "bookmarks": "0.35.0", - "bracket-matcher": "0.75.0", + "bracket-matcher": "0.76.0", "command-palette": "0.36.0", "deprecation-cop": "0.52.0", "dev-live-reload": "0.46.0", From e19dec5adcd248c41f6cd815680da1c29fe047c2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 10:22:40 -0700 Subject: [PATCH 62/77] :arrow_up: autoflow@0.25 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99c70aa4a..45107389a 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "autocomplete-html": "0.7.2", "autocomplete-plus": "2.17.3", "autocomplete-snippets": "1.7.0", - "autoflow": "0.24.0", + "autoflow": "0.25.0", "autosave": "0.20.0", "background-tips": "0.25.0", "bookmarks": "0.35.0", From 1877e10b9c722f2734ac8ddf0266dd263fb26fb8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 11:13:48 -0700 Subject: [PATCH 63/77] :arrow_up: language-python@0.36 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 45107389a..d15854cef 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "language-perl": "0.24.0", "language-php": "0.24.0", "language-property-list": "0.8.0", - "language-python": "0.35.0", + "language-python": "0.36.0", "language-ruby": "0.56.0", "language-ruby-on-rails": "0.22.0", "language-sass": "0.38.0", From 678820df220de457ebf6235d958146186c4868a8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 12:30:50 -0700 Subject: [PATCH 64/77] :arrow_up: symbols-view@0.98 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d15854cef..63d0d5082 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "spell-check": "0.59.0", "status-bar": "0.74.0", "styleguide": "0.44.0", - "symbols-view": "0.97.0", + "symbols-view": "0.98.0", "tabs": "0.73.0", "timecop": "0.31.0", "tree-view": "0.171.0", From 21176f3cdc83809324e61902ed47e1920fd253d9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 12:47:28 -0700 Subject: [PATCH 65/77] :arrow_up: tree-view@0.172 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 63d0d5082..22d83da0a 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "symbols-view": "0.98.0", "tabs": "0.73.0", "timecop": "0.31.0", - "tree-view": "0.171.0", + "tree-view": "0.172.0", "update-package-dependencies": "0.10.0", "welcome": "0.28.0", "whitespace": "0.30.0", From 36d55c93849950eebd568a798b0976336f3c2fc2 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 8 Jun 2015 22:56:18 +0200 Subject: [PATCH 66/77] =?UTF-8?q?Don=E2=80=99t=20break=20out=20soft=20tabs?= =?UTF-8?q?=20that=20are=20interrupted=20by=20a=20scope=20boundary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spec/tokenized-buffer-spec.coffee | 16 ++++++++++++++++ src/tokenized-line.coffee | 7 ++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index dc57d3fee..23520518a 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -322,6 +322,22 @@ describe "TokenizedBuffer", -> expect(tokens[2].value).toBe " \u030b" expect(tokens[2].hasLeadingWhitespace()).toBe false + it "does not break out soft tabs across a scope boundary", -> + waitsForPromise -> + atom.packages.activatePackage('language-gfm') + + runs -> + tokenizedBuffer.setTabLength(4) + tokenizedBuffer.setGrammar(atom.grammars.selectGrammar('.md')) + buffer.setText(' 0 + + expect(length).toBe 4 + describe "when the buffer contains hard-tabs", -> beforeEach -> waitsForPromise -> diff --git a/src/tokenized-line.coffee b/src/tokenized-line.coffee index b8f7226c8..bd871fc4f 100644 --- a/src/tokenized-line.coffee +++ b/src/tokenized-line.coffee @@ -102,10 +102,11 @@ class TokenizedLine substringEnd += 1 else if (screenColumn + 1) % @tabLength is 0 - @specialTokens[tokenIndex] = SoftTab suffix = @tags[tokenIndex] - @tabLength - @tags.splice(tokenIndex, 1, @tabLength) - @tags.splice(tokenIndex + 1, 0, suffix) if suffix > 0 + if suffix >= 0 + @specialTokens[tokenIndex] = SoftTab + @tags.splice(tokenIndex, 1, @tabLength) + @tags.splice(tokenIndex + 1, 0, suffix) if suffix > 0 if @invisibles?.space if substringEnd > substringStart From af85ee701a3ecc2248ff394947efd22de28ec2ee Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 14:34:12 -0700 Subject: [PATCH 67/77] :arrow_up: tabs@0.74 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 22d83da0a..fee22497f 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "status-bar": "0.74.0", "styleguide": "0.44.0", "symbols-view": "0.98.0", - "tabs": "0.73.0", + "tabs": "0.74.0", "timecop": "0.31.0", "tree-view": "0.172.0", "update-package-dependencies": "0.10.0", From cdd4e496ccbc65b906de403331387a66454f264d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 14:37:19 -0700 Subject: [PATCH 68/77] :arrow_up: language-html@0.40 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fee22497f..fd454c6f0 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "language-gfm": "0.77.0", "language-git": "0.10.0", "language-go": "0.26.0", - "language-html": "0.39.0", + "language-html": "0.40.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", "language-javascript": "0.79.0", From 39dce7ae3ce832d66983c17537ed304d39f2bb1a Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Mon, 8 Jun 2015 23:57:44 +0200 Subject: [PATCH 69/77] :arrow_up: text-buffer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fd454c6f0..cb58a4375 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "space-pen": "3.8.2", "stacktrace-parser": "0.1.1", "temp": "0.8.1", - "text-buffer": "6.3.1", + "text-buffer": "6.3.2", "theorist": "^1.0.2", "typescript-simple": "1.0.0", "underscore-plus": "^1.6.6", From 2893772d1a5df8b6ea394e14ebb8eab637cb731b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 15:32:03 -0700 Subject: [PATCH 70/77] Add stricter atom.png glob pattern --- build/tasks/generate-asar-task.coffee | 2 +- build/tasks/install-task.coffee | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/build/tasks/generate-asar-task.coffee b/build/tasks/generate-asar-task.coffee index bb00c6b0f..800721fee 100644 --- a/build/tasks/generate-asar-task.coffee +++ b/build/tasks/generate-asar-task.coffee @@ -15,7 +15,7 @@ module.exports = (grunt) -> 'ctags-linux' 'ctags-win32.exe' '**/node_modules/spellchecker/**' - 'atom.png' + '**/resources/atom.png' ] unpack = "{#{unpack.join(',')}}" diff --git a/build/tasks/install-task.coffee b/build/tasks/install-task.coffee index 8db654941..86a827a1b 100644 --- a/build/tasks/install-task.coffee +++ b/build/tasks/install-task.coffee @@ -31,8 +31,6 @@ module.exports = (grunt) -> binDir = path.join(installDir, 'bin') shareDir = path.join(installDir, 'share', 'atom') - iconName = path.join(shareDir, 'resources', 'app', 'resources', 'atom.png') - mkdir binDir cp 'atom.sh', path.join(binDir, 'atom') rm shareDir From 6859a2924aabb9bc8c83420d1db24d93fafa4dbc Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 15:35:22 -0700 Subject: [PATCH 71/77] Keep upgrading deprecated selectors until 1.0 --- src/styles-element.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/styles-element.coffee b/src/styles-element.coffee index 74ebd23ba..fc3b888cf 100644 --- a/src/styles-element.coffee +++ b/src/styles-element.coffee @@ -1,5 +1,4 @@ {Emitter, CompositeDisposable} = require 'event-kit' -{includeDeprecatedAPIs} = require 'grim' class StylesElement extends HTMLElement subscriptions: null @@ -19,7 +18,7 @@ class StylesElement extends HTMLElement @styleElementClonesByOriginalElement = new WeakMap attachedCallback: -> - if includeDeprecatedAPIs and @context is 'atom-text-editor' + if @context is 'atom-text-editor' for styleElement in @children @upgradeDeprecatedSelectors(styleElement) @initialize() @@ -67,7 +66,7 @@ class StylesElement extends HTMLElement @insertBefore(styleElementClone, insertBefore) - if includeDeprecatedAPIs and @context is 'atom-text-editor' + if @context is 'atom-text-editor' @upgradeDeprecatedSelectors(styleElementClone) @emitter.emit 'did-add-style-element', styleElementClone From 609fc6cb6e2d63e988088b37afb7a953d7921eee Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 15:54:24 -0700 Subject: [PATCH 72/77] :arrow_up: tabs@0.75 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cb58a4375..d6930ab69 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "status-bar": "0.74.0", "styleguide": "0.44.0", "symbols-view": "0.98.0", - "tabs": "0.74.0", + "tabs": "0.75.0", "timecop": "0.31.0", "tree-view": "0.172.0", "update-package-dependencies": "0.10.0", From c370263e27163895e0cda611545f1940168b8e4f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 15:58:48 -0700 Subject: [PATCH 73/77] :arrow_up: language-perl@0.25 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d6930ab69..cd76a7853 100644 --- a/package.json +++ b/package.json @@ -144,7 +144,7 @@ "language-make": "0.14.0", "language-mustache": "0.11.0", "language-objective-c": "0.15.0", - "language-perl": "0.24.0", + "language-perl": "0.25.0", "language-php": "0.24.0", "language-property-list": "0.8.0", "language-python": "0.36.0", From 66d40858dc226b31e9178efc1ba47cb3ae79d039 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 16:41:50 -0700 Subject: [PATCH 74/77] :arrow_up: tabs@0.76 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cd76a7853..b1ec1ed1c 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "status-bar": "0.74.0", "styleguide": "0.44.0", "symbols-view": "0.98.0", - "tabs": "0.75.0", + "tabs": "0.76.0", "timecop": "0.31.0", "tree-view": "0.172.0", "update-package-dependencies": "0.10.0", From f92e224db769206113c8d75b1729a58f64b986d8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 16:51:41 -0700 Subject: [PATCH 75/77] :arrow_up: language-javascript@0.80 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b1ec1ed1c..e8bf3233f 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "language-html": "0.40.0", "language-hyperlink": "0.13.0", "language-java": "0.15.0", - "language-javascript": "0.79.0", + "language-javascript": "0.80.0", "language-json": "0.15.0", "language-less": "0.27.0", "language-make": "0.14.0", From 6a007a7061480009ad8a11a79f384bcf6662a3d8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 16:52:51 -0700 Subject: [PATCH 76/77] :arrow_up: language-coffee-script@0.41 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e8bf3233f..9f982b91b 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "wrap-guide": "0.35.0", "language-c": "0.45.0", "language-clojure": "0.15.0", - "language-coffee-script": "0.40.0", + "language-coffee-script": "0.41.0", "language-csharp": "0.5.0", "language-css": "0.30.0", "language-gfm": "0.77.0", From c06d62e607411e4e42c451daf98aa54106f8477e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 8 Jun 2015 17:26:59 -0700 Subject: [PATCH 77/77] :arrow_up: snippets@0.94 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9f982b91b..c331fb413 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "package-generator": "0.39.0", "release-notes": "0.53.0", "settings-view": "0.208.0", - "snippets": "0.93.0", + "snippets": "0.94.0", "spell-check": "0.59.0", "status-bar": "0.74.0", "styleguide": "0.44.0",