diff --git a/spec/app/tokenized-buffer-spec.coffee b/spec/app/tokenized-buffer-spec.coffee
index 4f7ad41ce..cedf537e3 100644
--- a/spec/app/tokenized-buffer-spec.coffee
+++ b/spec/app/tokenized-buffer-spec.coffee
@@ -328,6 +328,26 @@ describe "TokenizedBuffer", ->
expect(tokenizedBuffer.lineForScreenRow(2).text).toBe "#{tabAsSpaces} buy()#{tabAsSpaces}while supply > demand"
+ describe "when the language mode emits a 'grammar-updated' event based on an included grammar being activated", ->
+ it "retokenizes the buffer", ->
+ atom.activatePackage('ruby.tmbundle', sync: true)
+ atom.activatePackage('ruby-on-rails-tmbundle', sync: true)
+
+ editSession = project.buildEditSession()
+ editSession.setVisible(true)
+ editSession.setGrammar(syntax.selectGrammar('test.erb'))
+ editSession.buffer.setText("
<%= User.find(2).full_name %>
")
+ tokenizedBuffer = editSession.displayBuffer.tokenizedBuffer
+ fullyTokenize(tokenizedBuffer)
+
+ {tokens} = tokenizedBuffer.lineForScreenRow(0)
+ expect(tokens[0]).toEqual value: "", scopes: ["text.html.ruby"]
+
+ atom.activatePackage('html.tmbundle', sync: true)
+ fullyTokenize(tokenizedBuffer)
+ {tokens} = tokenizedBuffer.lineForScreenRow(0)
+ expect(tokens[0]).toEqual value: '<', scopes: ["text.html.ruby","meta.tag.block.any.html","punctuation.definition.tag.begin.html"]
+
describe "when a Git commit message file is tokenized", ->
beforeEach ->
atom.activatePackage('git.tmbundle', sync: true)
diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee
index 2ad48459d..95b461fce 100644
--- a/src/app/language-mode.coffee
+++ b/src/app/language-mode.coffee
@@ -34,6 +34,7 @@ class LanguageMode
return if grammar is @grammar
@grammar = grammar
@currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @buffer.getText())
+ @subscribe @grammar, 'grammar-updated', => @trigger 'grammar-updated'
@trigger 'grammar-changed', grammar
reloadGrammar: ->
diff --git a/src/app/null-grammar.coffee b/src/app/null-grammar.coffee
index af9cd3ae8..6dadc599a 100644
--- a/src/app/null-grammar.coffee
+++ b/src/app/null-grammar.coffee
@@ -1,4 +1,6 @@
Token = require 'token'
+EventEmitter = require 'event-emitter'
+_ = require 'underscore'
###
# Internal #
@@ -14,3 +16,5 @@ class NullGrammar
{ tokens: [new Token(value: line, scopes: ['null-grammar.text.plain'])] }
grammarAddedOrRemoved: -> # no op
+
+_.extend NullGrammar.prototype, EventEmitter
diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee
index 35d38bff4..70e90b7ac 100644
--- a/src/app/tokenized-buffer.coffee
+++ b/src/app/tokenized-buffer.coffee
@@ -28,6 +28,7 @@ class TokenizedBuffer
@resetScreenLines()
@buffer.on "changed.tokenized-buffer#{@id}", (e) => @handleBufferChange(e)
@languageMode.on 'grammar-changed', => @resetScreenLines()
+ @languageMode.on 'grammar-updated', => @resetScreenLines()
resetScreenLines: ->
@screenLines = @buildPlaceholderScreenLinesForRows(0, @buffer.getLastRow())