diff --git a/.gitmodules b/.gitmodules
index 5f07d011..98dbcfb2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -253,9 +253,6 @@
[submodule "vendor/grammars/SublimeXtend"]
path = vendor/grammars/SublimeXtend
url = https://github.com/staltz/SublimeXtend
-[submodule "vendor/grammars/Stata.tmbundle"]
- path = vendor/grammars/Stata.tmbundle
- url = https://github.com/statatmbundle/Stata.tmbundle
[submodule "vendor/grammars/Vala-TMBundle"]
path = vendor/grammars/Vala-TMBundle
url = https://github.com/technosophos/Vala-TMBundle
@@ -677,3 +674,9 @@
[submodule "vendor/grammars/X10"]
path = vendor/grammars/X10
url = git@github.com:x10-lang/x10-highlighting.git
+[submodule "vendor/grammars/language-babel"]
+ path = vendor/grammars/language-babel
+ url = https://github.com/gandm/language-babel
+[submodule "vendor/grammars/Stata.tmbundle"]
+ path = vendor/grammars/Stata.tmbundle
+ url = https://github.com/pschumm/Stata.tmbundle
diff --git a/README.md b/README.md
index 4ca08af1..2a4d3c31 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ See [Troubleshooting](#troubleshooting) and [`CONTRIBUTING.md`](/CONTRIBUTING.md

-The Language stats bar is built by aggregating the languages of each file in that repository. If it is reporting a language that you don't expect:
+The Language stats bar displays languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://developer.github.com/v3/repos/#list-languages) API. If the bar is reporting a language that you don't expect:
0. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.
0. If you see files that you didn't write, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](#overrides) feature to ignore them.
diff --git a/bin/git-linguist b/bin/git-linguist
new file mode 100755
index 00000000..9541cf82
--- /dev/null
+++ b/bin/git-linguist
@@ -0,0 +1,137 @@
+#!/usr/bin/env ruby
+
+require 'linguist'
+require 'rugged'
+require 'optparse'
+require 'json'
+require 'tmpdir'
+require 'zlib'
+
+class GitLinguist
+ def initialize(path, commit_oid, incremental = true)
+ @repo_path = path
+ @commit_oid = commit_oid
+ @incremental = incremental
+ end
+
+ def linguist
+ if @commit_oid.nil?
+ raise "git-linguist must be called with a specific commit OID to perform language computation"
+ end
+ repo = Linguist::Repository.new(rugged, @commit_oid)
+
+ if @incremental && stats = load_language_stats
+ old_commit_oid, old_stats = stats
+
+ # A cache with NULL oid means that we want to froze
+ # these language stats in place and stop computing
+ # them (for performance reasons)
+ return old_stats if old_commit_oid == NULL_OID
+ repo.load_existing_stats(old_commit_oid, old_stats)
+ end
+
+ result = yield repo
+
+ save_language_stats(@commit_oid, repo.cache)
+ result
+ end
+
+ def load_language_stats
+ version, oid, stats = load_cache
+ if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats
+ [oid, stats]
+ end
+ end
+
+ def save_language_stats(oid, stats)
+ cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats]
+ write_cache(cache)
+ end
+
+ def clear_language_stats
+ File.unlink(cache_file)
+ end
+
+ def disable_language_stats
+ save_language_stats(NULL_OID, {})
+ end
+
+ protected
+ NULL_OID = ("0" * 40).freeze
+
+ LANGUAGE_STATS_CACHE = 'language-stats.cache'
+ LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}"
+
+ def rugged
+ @rugged ||= Rugged::Repository.bare(@repo_path)
+ end
+
+ def cache_file
+ File.join(@repo_path, LANGUAGE_STATS_CACHE)
+ end
+
+ def write_cache(object)
+ return unless File.directory? @repo_path
+
+ begin
+ tmp_path = Dir::Tmpname.make_tmpname(cache_file, nil)
+ File.open(tmp_path, "wb") do |f|
+ marshal = Marshal.dump(object)
+ f.write(Zlib::Deflate.deflate(marshal))
+ end
+
+ File.rename(tmp_path, cache_file)
+ rescue => e
+ (File.unlink(tmp_path) rescue nil)
+ raise e
+ end
+ end
+
+ def load_cache
+ marshal = File.open(cache_file, "rb") { |f| Zlib::Inflate.inflate(f.read) }
+ Marshal.load(marshal)
+ rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError
+ nil
+ end
+end
+
+
+def git_linguist(args)
+ incremental = true
+ commit = nil
+
+ parser = OptionParser.new do |opts|
+ opts.banner = "Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable"
+
+ opts.on("-f", "--force", "Force a full rescan") { incremental = false }
+ opts.on("--commit=COMMIT", "Commit to index") { |v| commit = v}
+ end
+
+ parser.parse!(args)
+
+ git_dir = `git rev-parse --git-dir`.strip
+ raise "git-linguist must be ran in a Git repository" unless $?.success?
+ wrapper = GitLinguist.new(git_dir, commit, incremental)
+
+ case args.pop
+ when "stats"
+ wrapper.linguist do |linguist|
+ puts JSON.dump(linguist.languages)
+ end
+ when "breakdown"
+ wrapper.linguist do |linguist|
+ puts JSON.dump(linguist.breakdown_by_file)
+ end
+ when "dump-cache"
+ puts JSON.dump(wrapper.load_language_stats)
+ when "clear"
+ wrapper.clear_language_stats
+ when "disable"
+ wrapper.disable_language_stats
+ else
+ $stderr.print(parser.help)
+ exit 1
+ end
+end
+
+git_linguist(ARGV)
diff --git a/github-linguist.gemspec b/github-linguist.gemspec
index 87bbc8bf..bdba3e6b 100644
--- a/github-linguist.gemspec
+++ b/github-linguist.gemspec
@@ -10,8 +10,8 @@ Gem::Specification.new do |s|
s.homepage = "https://github.com/github/linguist"
s.license = "MIT"
- s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb']
- s.executables << 'linguist'
+ s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + ['LICENSE']
+ s.executables = ['linguist', 'git-linguist']
s.add_dependency 'charlock_holmes', '~> 0.7.3'
s.add_dependency 'escape_utils', '~> 1.1.0'
diff --git a/grammars.yml b/grammars.yml
index 42be3967..4bd66f12 100644
--- a/grammars.yml
+++ b/grammars.yml
@@ -92,7 +92,7 @@ vendor/grammars/Scalate.tmbundle:
- text.html.ssp
vendor/grammars/Slash.tmbundle:
- text.html.slash
-vendor/grammars/Stata.tmbundle:
+vendor/grammars/Stata.tmbundle/:
- source.mata
- source.stata
vendor/grammars/Stylus/:
@@ -178,6 +178,8 @@ vendor/grammars/assembly.tmbundle:
- source.x86asm
vendor/grammars/atom-fsharp/:
- source.fsharp
+- source.fsharp.fsi
+- source.fsharp.fsx
vendor/grammars/atom-language-purescript/:
- source.purescript
vendor/grammars/atom-salt:
@@ -314,6 +316,9 @@ vendor/grammars/json.tmbundle:
- source.json
vendor/grammars/kotlin-sublime-package:
- source.Kotlin
+vendor/grammars/language-babel/:
+- source.js.jsx
+- source.regexp.babel
vendor/grammars/language-clojure:
- source.clojure
vendor/grammars/language-coffee-script:
diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb
index f1fb2d19..d107e737 100644
--- a/lib/linguist/generated.rb
+++ b/lib/linguist/generated.rb
@@ -241,22 +241,26 @@ module Linguist
return lines[0].include?("Code generated by")
end
+ PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp']
+
# Internal: Is the blob a C++, Java or Python source file generated by the
# Protocol Buffer compiler?
#
# Returns true of false.
def generated_protocol_buffer?
- return false unless ['.py', '.java', '.h', '.cc', '.cpp'].include?(extname)
+ return false unless PROTOBUF_EXTENSIONS.include?(extname)
return false unless lines.count > 1
return lines[0].include?("Generated by the protocol buffer compiler. DO NOT EDIT!")
end
+ APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp']
+
# Internal: Is the blob generated by Apache Thrift compiler?
#
# Returns true or false
def generated_apache_thrift?
- return false unless ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp'].include?(extname)
+ return false unless APACHE_THRIFT_EXTENSIONS.include?(extname)
return false unless lines.count > 1
return lines[0].include?("Autogenerated by Thrift Compiler") || lines[1].include?("Autogenerated by Thrift Compiler")
diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb
index dd1f8ee6..11f58b28 100644
--- a/lib/linguist/heuristics.rb
+++ b/lib/linguist/heuristics.rb
@@ -56,7 +56,8 @@ module Linguist
# Internal: Check if this heuristic matches the candidate languages.
def matches?(filename)
- @extensions.any? { |ext| filename.downcase.end_with?(ext) }
+ filename = filename.downcase
+ @extensions.any? { |ext| filename.end_with?(ext) }
end
# Internal: Perform the heuristic
@@ -65,7 +66,7 @@ module Linguist
end
# Common heuristics
- ObjectiveCRegex = /^[ \t]*@(interface|class|protocol|property|end|synchronized|selector|implementation)\b/
+ ObjectiveCRegex = /^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])/
disambiguate ".asc" do |data|
if /^(----[- ]BEGIN|ssh-(rsa|dss)) /.match(data)
diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml
index b2d75fa1..d7a3a18b 100644
--- a/lib/linguist/languages.yml
+++ b/lib/linguist/languages.yml
@@ -8,7 +8,8 @@
# Use "text" if a mode does not exist.
# wrap - Boolean wrap to enable line wrapping (default: false)
# extensions - An Array of associated extensions (the first one is
-# considered the primary extension)
+# considered the primary extension, the others should be
+# listed alphabetically)
# interpreters - An Array of associated interpreters
# searchable - Boolean flag to enable searching (defaults to true)
# search_term - Deprecated: Some languages maybe indexed under a
@@ -1367,6 +1368,7 @@ Haml:
Handlebars:
type: markup
color: "#01a9d6"
+ group: HTML
aliases:
- hbs
- htmlbars
@@ -1575,6 +1577,14 @@ JSONiq:
- .jq
tm_scope: source.jq
+JSX:
+ type: programming
+ group: JavaScript
+ extensions:
+ - .jsx
+ tm_scope: source.js.jsx
+ ace_mode: javascript
+
Jade:
group: HTML
type: markup
@@ -1628,7 +1638,6 @@ JavaScript:
- .jsfl
- .jsm
- .jss
- - .jsx
- .njs
- .pac
- .sjs
@@ -2448,6 +2457,7 @@ PLSQL:
color: "#dad8d8"
extensions:
- .pls
+ - .pck
- .pkb
- .pks
- .plb
@@ -3433,6 +3443,7 @@ TypeScript:
- ts
extensions:
- .ts
+ - .tsx
tm_scope: source.ts
ace_mode: typescript
@@ -3649,6 +3660,7 @@ XML:
- .tmSnippet
- .tmTheme
- .ts
+ - .tsx
- .ui
- .urdf
- .vbproj
diff --git a/lib/linguist/lazy_blob.rb b/lib/linguist/lazy_blob.rb
index 55c10309..28fb78f3 100644
--- a/lib/linguist/lazy_blob.rb
+++ b/lib/linguist/lazy_blob.rb
@@ -79,6 +79,10 @@ module Linguist
@size
end
+ def cleanup!
+ @data.clear if @data
+ end
+
protected
# Returns true if the attribute is present and not the string "false".
diff --git a/lib/linguist/repository.rb b/lib/linguist/repository.rb
index 181ddf0e..51040734 100644
--- a/lib/linguist/repository.rb
+++ b/lib/linguist/repository.rb
@@ -126,12 +126,13 @@ module Linguist
end
protected
+ MAX_TREE_SIZE = 100_000
def compute_stats(old_commit_oid, cache = nil)
+ return {} if current_tree.count_recursive(MAX_TREE_SIZE) >= MAX_TREE_SIZE
+
old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree
-
read_index
-
diff = Rugged::Tree.diff(repository, old_tree, current_tree)
# Clear file map and fetch full diff if any .gitattributes files are changed
@@ -157,8 +158,11 @@ module Linguist
blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))
- next unless blob.include_in_language_stats?
- file_map[new] = [blob.language.group.name, blob.size]
+ if blob.include_in_language_stats?
+ file_map[new] = [blob.language.group.name, blob.size]
+ end
+
+ blob.cleanup!
end
end
diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb
index dbdb7d7f..c5dfb5f9 100644
--- a/lib/linguist/version.rb
+++ b/lib/linguist/version.rb
@@ -1,3 +1,3 @@
module Linguist
- VERSION = "4.5.15"
+ VERSION = "4.6.4"
end
diff --git a/samples/JSX/sample.jsx b/samples/JSX/sample.jsx
new file mode 100644
index 00000000..2020618d
--- /dev/null
+++ b/samples/JSX/sample.jsx
@@ -0,0 +1,23 @@
+'use strict';
+
+const React = require('react')
+
+module.exports = React.createClass({
+ render: function() {
+ let {feeds, log} = this.props;
+
+ log.info(feeds);
+ return
+
News Feed's
+
+ {feeds.map(function(feed) {
+ return -
+ {feed.data && feed.data.length > 0 ?
+ {feed.name} ({feed.data.length})
+ : 'feed.name' }
+
+ })}
+
+
;
+ }
+});
diff --git a/samples/Objective-C/Siesta.h b/samples/Objective-C/Siesta.h
new file mode 100644
index 00000000..a48984e3
--- /dev/null
+++ b/samples/Objective-C/Siesta.h
@@ -0,0 +1,16 @@
+//
+// Siesta.h
+// Siesta
+//
+// Created by Paul on 2015/6/14.
+// Copyright © 2015 Bust Out Solutions. MIT license.
+//
+
+#import
+
+//! Project version number for Siesta.
+FOUNDATION_EXPORT double SiestaVersionNumber;
+
+//! Project version string for Siesta.
+FOUNDATION_EXPORT const unsigned char SiestaVersionString[];
+
diff --git a/samples/PLSQL/plsqlguide.pck b/samples/PLSQL/plsqlguide.pck
new file mode 100644
index 00000000..d31830ba
--- /dev/null
+++ b/samples/PLSQL/plsqlguide.pck
@@ -0,0 +1,90 @@
+create or replace package plsqlguide is
+
+-- Author : Jared Petersen
+-- Created : 9/22/2015 12:26:22 AM
+-- Purpose : Basic PLSQL template/guide
+
+/* Procedures */
+procedure p_main;
+
+end plsqlguide;
+/
+create or replace package body plsqlguide is
+
+/* Main entry point (homepage) */
+procedure p_main
+ is
+begin
+
+htp.prn('
+
+
+
+
+
+
+
+ PL/SQL Sample Application
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | # |
+ Name |
+ Description |
+ Quantity |
+ Price |
+
+');
+
+-- Fill out the parts table
+for row in (select * from parts) loop
+ htp.prn('
+
+ | '||row.pid||' |
+ '||row.name||' |
+ '||row.description||' |
+ '||row.quantity||' |
+ '||row.price||' |
+
+ ');
+end loop;
+
+htp.prn('
+
+
+
+
+
+
+
+
+
+');
+
+end p_main;
+
+begin
+ -- Initialization
+ null;
+end plsqlguide;
+/
diff --git a/samples/TypeScript/tsxAttributeResolution9.tsx b/samples/TypeScript/tsxAttributeResolution9.tsx
new file mode 100644
index 00000000..164536f8
--- /dev/null
+++ b/samples/TypeScript/tsxAttributeResolution9.tsx
@@ -0,0 +1,27 @@
+//@jsx: preserve
+//@module: amd
+
+//@filename: react.d.ts
+declare module JSX {
+ interface Element { }
+ interface IntrinsicElements {
+ }
+ interface ElementAttributesProperty {
+ props;
+ }
+}
+
+interface Props {
+ foo: string;
+}
+
+//@filename: file.tsx
+export class MyComponent {
+ render() {
+ }
+
+ props: { foo: string; }
+}
+
+; // ok
+; // should be an error
diff --git a/samples/XML/water.tsx b/samples/XML/water.tsx
new file mode 100644
index 00000000..db4d1b97
--- /dev/null
+++ b/samples/XML/water.tsx
@@ -0,0 +1,213 @@
+
+
+
+
+
+ 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
+
+
+
+
diff --git a/test/test_pedantic.rb b/test/test_pedantic.rb
index 2d0372cc..d34f292e 100644
--- a/test/test_pedantic.rb
+++ b/test/test_pedantic.rb
@@ -9,7 +9,7 @@ class TestPedantic < Minitest::Test
assert_sorted LANGUAGES.keys
end
- def test_extensions_are_sorted
+ def test_nonprimary_extensions_are_sorted
LANGUAGES.each do |name, language|
extensions = language['extensions']
assert_sorted extensions[1..-1].map(&:downcase) if extensions && extensions.size > 1
diff --git a/vendor/grammars/ColdFusion b/vendor/grammars/ColdFusion
index 3e7e68b1..c54a4c5f 160000
--- a/vendor/grammars/ColdFusion
+++ b/vendor/grammars/ColdFusion
@@ -1 +1 @@
-Subproject commit 3e7e68b14dc3f55082e4d449666d3fde3f024a02
+Subproject commit c54a4c5f5e9b7d5992a28d9d45b9adb023520428
diff --git a/vendor/grammars/Docker.tmbundle b/vendor/grammars/Docker.tmbundle
index 8ff6e62c..6bb36d82 160000
--- a/vendor/grammars/Docker.tmbundle
+++ b/vendor/grammars/Docker.tmbundle
@@ -1 +1 @@
-Subproject commit 8ff6e62c89c625829e86d9094c0dab873120408c
+Subproject commit 6bb36d82623fbf48999f8181d589fa91aa58bb3e
diff --git a/vendor/grammars/Handlebars b/vendor/grammars/Handlebars
index 88a0836a..60309828 160000
--- a/vendor/grammars/Handlebars
+++ b/vendor/grammars/Handlebars
@@ -1 +1 @@
-Subproject commit 88a0836abe8de6bf4a4f0ac878bcd3087f0fef95
+Subproject commit 6030982880f95b887daebf1ccb30ad1c615e0fc2
diff --git a/vendor/grammars/InnoSetup b/vendor/grammars/InnoSetup
index 3906a8d2..9a8fca6c 160000
--- a/vendor/grammars/InnoSetup
+++ b/vendor/grammars/InnoSetup
@@ -1 +1 @@
-Subproject commit 3906a8d2fbc2fd197373113536d8deb28d05ee4c
+Subproject commit 9a8fca6c05a59dcbd90113c06545e45f83a7a075
diff --git a/vendor/grammars/LiveScript.tmbundle b/vendor/grammars/LiveScript.tmbundle
index 92d0a7c4..05dc4639 160000
--- a/vendor/grammars/LiveScript.tmbundle
+++ b/vendor/grammars/LiveScript.tmbundle
@@ -1 +1 @@
-Subproject commit 92d0a7c47cd7913fce9b81627adfce6594de1a92
+Subproject commit 05dc46397a05a28820a07b69019c3a113518ac46
diff --git a/vendor/grammars/NSIS b/vendor/grammars/NSIS
index 53b64a0a..ea610444 160000
--- a/vendor/grammars/NSIS
+++ b/vendor/grammars/NSIS
@@ -1 +1 @@
-Subproject commit 53b64a0a11a1a505be1aa6b382edef82690bf41e
+Subproject commit ea6104445d65ebfd183d6835736f306b1d986b79
diff --git a/vendor/grammars/Sublime-Nit b/vendor/grammars/Sublime-Nit
index e1e5463c..12c1d654 160000
--- a/vendor/grammars/Sublime-Nit
+++ b/vendor/grammars/Sublime-Nit
@@ -1 +1 @@
-Subproject commit e1e5463c9cc83d61e48617dbe370307e358162b2
+Subproject commit 12c1d654166cab044fbab2d1d7f481930ad7777c
diff --git a/vendor/grammars/SublimePapyrus b/vendor/grammars/SublimePapyrus
index a9d818f0..75d567dc 160000
--- a/vendor/grammars/SublimePapyrus
+++ b/vendor/grammars/SublimePapyrus
@@ -1 +1 @@
-Subproject commit a9d818f0ac24d8576db3bf703b78c7c675705439
+Subproject commit 75d567dc3a890acbc6edebedad2879b0af426766
diff --git a/vendor/grammars/abap.tmbundle b/vendor/grammars/abap.tmbundle
index 08d6db92..e8619c96 160000
--- a/vendor/grammars/abap.tmbundle
+++ b/vendor/grammars/abap.tmbundle
@@ -1 +1 @@
-Subproject commit 08d6db92d0fddbf7a854584d1f568ca069e7d594
+Subproject commit e8619c9692b0ef74e288832660257f6e3477030c
diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp
index 2cbcaca9..053f5dc3 160000
--- a/vendor/grammars/atom-fsharp
+++ b/vendor/grammars/atom-fsharp
@@ -1 +1 @@
-Subproject commit 2cbcaca93cbb94319f249a35653e3f3a24571a32
+Subproject commit 053f5dc3abd329369d272afd4cca3114636e0c70
diff --git a/vendor/grammars/ats.sublime b/vendor/grammars/ats.sublime
index d6317b23..1ecc2b01 160000
--- a/vendor/grammars/ats.sublime
+++ b/vendor/grammars/ats.sublime
@@ -1 +1 @@
-Subproject commit d6317b2309055954d4f024479a6b6b6115acf3ba
+Subproject commit 1ecc2b011ed9d58bd5435b7440697e300591a23d
diff --git a/vendor/grammars/chapel-tmbundle b/vendor/grammars/chapel-tmbundle
index 4c9bc68a..b657738c 160000
--- a/vendor/grammars/chapel-tmbundle
+++ b/vendor/grammars/chapel-tmbundle
@@ -1 +1 @@
-Subproject commit 4c9bc68a518330e6930ed7b9edfa04e6b5f7b149
+Subproject commit b657738cc05cddd8d8a20afa307e93e607d17d97
diff --git a/vendor/grammars/dart-sublime-bundle b/vendor/grammars/dart-sublime-bundle
index d61e6efc..2e5295ab 160000
--- a/vendor/grammars/dart-sublime-bundle
+++ b/vendor/grammars/dart-sublime-bundle
@@ -1 +1 @@
-Subproject commit d61e6efcbdec3c7c4a47e5355ce31b57020b24c9
+Subproject commit 2e5295ab32859d12714c8b44516d8a214eb73ecd
diff --git a/vendor/grammars/elixir-tmbundle b/vendor/grammars/elixir-tmbundle
index 56efe611..46514e8f 160000
--- a/vendor/grammars/elixir-tmbundle
+++ b/vendor/grammars/elixir-tmbundle
@@ -1 +1 @@
-Subproject commit 56efe6116ff92a6979ba94ff2722486e3f440583
+Subproject commit 46514e8f9f30c47f7867fd8d0019c554154ce89c
diff --git a/vendor/grammars/factor b/vendor/grammars/factor
index b2a51dfe..0f387e75 160000
--- a/vendor/grammars/factor
+++ b/vendor/grammars/factor
@@ -1 +1 @@
-Subproject commit b2a51dfeb2bc721c0c908d3f0fa56ddf9202d06c
+Subproject commit 0f387e750d4f7a8dca06af95faacdd9482d467d4
diff --git a/vendor/grammars/gnuplot-tmbundle b/vendor/grammars/gnuplot-tmbundle
index 14e0f70c..19508305 160000
--- a/vendor/grammars/gnuplot-tmbundle
+++ b/vendor/grammars/gnuplot-tmbundle
@@ -1 +1 @@
-Subproject commit 14e0f70c7b26c688c904e5d379454df5c34f0a0f
+Subproject commit 1950830563977a831eb127e4f92307dbf43830cb
diff --git a/vendor/grammars/jade-tmbundle b/vendor/grammars/jade-tmbundle
index ad13ddaa..fea35b58 160000
--- a/vendor/grammars/jade-tmbundle
+++ b/vendor/grammars/jade-tmbundle
@@ -1 +1 @@
-Subproject commit ad13ddaad0a8e41abc3d188cff43feb6b7147cf9
+Subproject commit fea35b58dca320d1d7940948162b7fd3fa9a1b1d
diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel
new file mode 160000
index 00000000..b49eb323
--- /dev/null
+++ b/vendor/grammars/language-babel
@@ -0,0 +1 @@
+Subproject commit b49eb3238820a00f8034e50b4b632915ce17368d
diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure
index 19522d6a..6dfdabde 160000
--- a/vendor/grammars/language-clojure
+++ b/vendor/grammars/language-clojure
@@ -1 +1 @@
-Subproject commit 19522d6acbb40d231a209338755bab71e4500fa0
+Subproject commit 6dfdabde51699585f1f648bce10012b24befc4a3
diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script
index e9f47f0f..0eeace01 160000
--- a/vendor/grammars/language-coffee-script
+++ b/vendor/grammars/language-coffee-script
@@ -1 +1 @@
-Subproject commit e9f47f0f5517b77ebb1a3cb9bdbd4fdf97ff5caa
+Subproject commit 0eeace014be887846eab5e3a39581ef4d705dd15
diff --git a/vendor/grammars/language-crystal b/vendor/grammars/language-crystal
index 93264691..5c0e60fd 160000
--- a/vendor/grammars/language-crystal
+++ b/vendor/grammars/language-crystal
@@ -1 +1 @@
-Subproject commit 932646913b9ceabe96dd0c6dc5f3ef9a894902c2
+Subproject commit 5c0e60fd5323b5f093317ffda9721db3fcd72672
diff --git a/vendor/grammars/language-csharp b/vendor/grammars/language-csharp
index 79fe8b57..4c4dbea3 160000
--- a/vendor/grammars/language-csharp
+++ b/vendor/grammars/language-csharp
@@ -1 +1 @@
-Subproject commit 79fe8b57647c0e565af89a051b6b62137b094bbd
+Subproject commit 4c4dbea32393a32510bb60d95b49633dd09e9e06
diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript
index c5c381e3..f7e166b6 160000
--- a/vendor/grammars/language-javascript
+++ b/vendor/grammars/language-javascript
@@ -1 +1 @@
-Subproject commit c5c381e37812219db84cb5916094ca3b8dce62db
+Subproject commit f7e166b65d38069345ff0a8bbe59847a5f43ef4d
diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python
index 8933c523..44e1d183 160000
--- a/vendor/grammars/language-python
+++ b/vendor/grammars/language-python
@@ -1 +1 @@
-Subproject commit 8933c5239ab946c4d8f3417b04f6dfc2e3448968
+Subproject commit 44e1d1836675a9b19928a5b2cfce83613fd5b706
diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript
index a6823795..d034fecc 160000
--- a/vendor/grammars/language-shellscript
+++ b/vendor/grammars/language-shellscript
@@ -1 +1 @@
-Subproject commit a6823795885801b62c7fceca41adaa4bf4de7a69
+Subproject commit d034fecce883fe047ef8fd3b5ef2179182815ed3
diff --git a/vendor/grammars/sql.tmbundle b/vendor/grammars/sql.tmbundle
index 0e80dd0c..1fd3f03f 160000
--- a/vendor/grammars/sql.tmbundle
+++ b/vendor/grammars/sql.tmbundle
@@ -1 +1 @@
-Subproject commit 0e80dd0c7d72e539213703f5e70615e6afa62cff
+Subproject commit 1fd3f03f97e37fde2c7f2dd4c11728a19242d320
diff --git a/vendor/grammars/standard-ml.tmbundle b/vendor/grammars/standard-ml.tmbundle
index 791c8b20..b52a5ebf 160000
--- a/vendor/grammars/standard-ml.tmbundle
+++ b/vendor/grammars/standard-ml.tmbundle
@@ -1 +1 @@
-Subproject commit 791c8b2054b4c12edcee29d73945c0db53e447e9
+Subproject commit b52a5ebf528f89f19bead3f92b10f772ccda74aa
diff --git a/vendor/grammars/sublime-aspectj b/vendor/grammars/sublime-aspectj
index 72b35f79..043444fc 160000
--- a/vendor/grammars/sublime-aspectj
+++ b/vendor/grammars/sublime-aspectj
@@ -1 +1 @@
-Subproject commit 72b35f795c2d7800ea65eb91b32d7594748dc561
+Subproject commit 043444fc3f602e4845f4f07395cfa11804df760b
diff --git a/vendor/grammars/sublime-bsv b/vendor/grammars/sublime-bsv
index ca223cdd..6b3ecf1d 160000
--- a/vendor/grammars/sublime-bsv
+++ b/vendor/grammars/sublime-bsv
@@ -1 +1 @@
-Subproject commit ca223cdd653e454ed7536f50e68c70bc56d30103
+Subproject commit 6b3ecf1d44a2e9a9fc8a6c73268d23f1ade81cd8
diff --git a/vendor/grammars/sublime-cirru b/vendor/grammars/sublime-cirru
index c27a9604..75674a73 160000
--- a/vendor/grammars/sublime-cirru
+++ b/vendor/grammars/sublime-cirru
@@ -1 +1 @@
-Subproject commit c27a9604db7d3ddde6d91b16497532319058f7e0
+Subproject commit 75674a73e1fa27277e678f460f5eeeaa843fc423
diff --git a/vendor/grammars/sublime-glsl b/vendor/grammars/sublime-glsl
index 31bb50cb..0443b921 160000
--- a/vendor/grammars/sublime-glsl
+++ b/vendor/grammars/sublime-glsl
@@ -1 +1 @@
-Subproject commit 31bb50cbb3501aa94375cc1ded5cc924cfe92f8a
+Subproject commit 0443b921dfd842f4c366e0dd7027225956da6524
diff --git a/vendor/grammars/sublime-golo b/vendor/grammars/sublime-golo
index 2c0707bd..33259eba 160000
--- a/vendor/grammars/sublime-golo
+++ b/vendor/grammars/sublime-golo
@@ -1 +1 @@
-Subproject commit 2c0707bd4fb11ec354d552bfbc6c8c5febdfd1ad
+Subproject commit 33259eba0cd75d73ad833b7c29f6a77aa4af55cc
diff --git a/vendor/grammars/sublime-nix b/vendor/grammars/sublime-nix
index 217ffe59..d7a3653d 160000
--- a/vendor/grammars/sublime-nix
+++ b/vendor/grammars/sublime-nix
@@ -1 +1 @@
-Subproject commit 217ffe591fca71624f63099d8fb64b1e3001939a
+Subproject commit d7a3653d59ded2e3536e5141e6d1d93f604867d4
diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust
index cff9c9c1..4fcfd98b 160000
--- a/vendor/grammars/sublime-rust
+++ b/vendor/grammars/sublime-rust
@@ -1 +1 @@
-Subproject commit cff9c9c1c60f2bb4dc720931ceb37bcc12598334
+Subproject commit 4fcfd98b22f179ed4d1f3dde4a0f21f8c651d4f3
diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript
index cf0fe35e..066599f6 160000
--- a/vendor/grammars/sublime-typescript
+++ b/vendor/grammars/sublime-typescript
@@ -1 +1 @@
-Subproject commit cf0fe35e3653d1de1605ac1d20ecba43dbd29709
+Subproject commit 066599f6afba3838c8fb053b6a0efb1308d626ad
diff --git a/vendor/grammars/sublime_cobol b/vendor/grammars/sublime_cobol
index bc8c0ff0..19ae2ba3 160000
--- a/vendor/grammars/sublime_cobol
+++ b/vendor/grammars/sublime_cobol
@@ -1 +1 @@
-Subproject commit bc8c0ff073a91383aaa65024c105ad5e0755bcbf
+Subproject commit 19ae2ba33ebc0b439051a499888acd4f916f83b9