diff --git a/src/app/atom.coffee b/src/app/atom.coffee index f23ed3dcb..3ceb77cd8 100644 --- a/src/app/atom.coffee +++ b/src/app/atom.coffee @@ -3,6 +3,7 @@ _ = require 'underscore' Package = require 'package' TextMatePackage = require 'text-mate-package' Theme = require 'theme' +LoadTextMatePackagesTask = require 'load-text-mate-packages-task' messageIdCounter = 1 originalSendMessageToBrowserProcess = atom.sendMessageToBrowserProcess @@ -13,7 +14,15 @@ _.extend atom, pendingBrowserProcessCallbacks: {} loadPackages: -> - pack.load() for pack in @getPackages() + {packages, asyncTextMatePackages} = _.groupBy @getPackages(), (pack) -> + if pack instanceof TextMatePackage and pack.name isnt 'text.tmbundle' + 'asyncTextMatePackages' + else + 'packages' + + pack.load() for pack in packages + if asyncTextMatePackages.length + new LoadTextMatePackagesTask(asyncTextMatePackages).start() getPackages: -> @getPackageNames().map((name) -> Package.build(name)).filter (pack) -> pack? diff --git a/src/app/editor.coffee b/src/app/editor.coffee index f06487f45..a40f02a18 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -402,6 +402,11 @@ class Editor extends View @gutter.widthChanged = (newWidth) => @scrollView.css('left', newWidth + 'px') + rootView?.on 'grammars-loaded', => + @reloadGrammar() + for session in @editSessions + session.reloadGrammar() unless session is @activeEditSession + @scrollView.on 'scroll', => if @scrollView.scrollLeft() == 0 @gutter.removeClass('drop-shadow') diff --git a/src/app/load-text-mate-packages-handler.coffee b/src/app/load-text-mate-packages-handler.coffee new file mode 100644 index 000000000..c2e675bd1 --- /dev/null +++ b/src/app/load-text-mate-packages-handler.coffee @@ -0,0 +1,5 @@ +TextMatePackage = require 'text-mate-package' + +module.exports = + loadPackage: (name) -> + callTaskMethod('packageLoaded', new TextMatePackage(name).readGrammars()) diff --git a/src/app/load-text-mate-packages-task.coffee b/src/app/load-text-mate-packages-task.coffee new file mode 100644 index 000000000..02bab0a86 --- /dev/null +++ b/src/app/load-text-mate-packages-task.coffee @@ -0,0 +1,22 @@ +Task = require 'Task' + +module.exports = +class LoadTextMatePackagesTask extends Task + + constructor: (@packages) -> + super('load-text-mate-packages-handler') + + started: -> + @loadNextPackage() + + loadNextPackage: -> + unless @packages.length + rootView.trigger 'grammars-loaded' + return + + @package = @packages.shift() + @callWorkerMethod('loadPackage', @package.name) + + packageLoaded: (grammars) -> + @package.loadGrammars(grammars) + @loadNextPackage() diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index bd7931aef..1c1478070 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -7,13 +7,13 @@ OnigScanner = require 'onig-scanner' module.exports = class TextMateGrammar - @loadFromPath: (path) -> - grammar = null + @readFromPath: (path) -> + grammarContent = null plist.parseString fs.read(path), (e, data) -> throw new Error(e) if e - grammar = new TextMateGrammar(data[0]) - throw new Error("Failed to load grammar at path `#{path}`") unless grammar - grammar + grammarContent = data[0] + throw new Error("Failed to load grammar at path `#{path}`") unless grammarContent + grammarContent name: null fileTypes: null diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index 23cc9143b..97eea6189 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -22,28 +22,41 @@ class TextMatePackage extends Package super @preferencesPath = fs.join(@path, "Preferences") @syntaxesPath = fs.join(@path, "Syntaxes") + @grammars = [] load: -> try - for grammar in @getGrammars() - syntax.addGrammar(grammar) - - for { selector, properties } in @getScopedProperties() - syntax.addProperties(selector, properties) + @loadGrammars() catch e console.warn "Failed to load package named '#{@name}'", e.stack this - getGrammars: -> - return @grammars if @grammars + getGrammars: -> @grammars + + readGrammars: -> + grammars = [] + for grammarPath in fs.list(@syntaxesPath) + try + grammars.push(TextMateGrammar.readFromPath(grammarPath)) + catch e + console.warn "Failed to load grammar at path '#{grammarPath}'", e.stack + grammars + + addGrammar: (rawGrammar) -> + grammar = new TextMateGrammar(rawGrammar) + @grammars.push(grammar) + syntax.addGrammar(grammar) + + loadGrammars: (rawGrammars) -> + rawGrammars = @readGrammars() unless rawGrammars? + @grammars = [] - if fs.exists(@syntaxesPath) - for grammarPath in fs.list(@syntaxesPath) - try - @grammars.push TextMateGrammar.loadFromPath(grammarPath) - catch e - console.warn "Failed to load grammar at path '#{grammarPath}'", e.stack - @grammars + @addGrammar(rawGrammar) for rawGrammar in rawGrammars + @loadScopedProperties() + + loadScopedProperties: -> + for { selector, properties } in @getScopedProperties() + syntax.addProperties(selector, properties) getScopedProperties: -> scopedProperties = []