on master help sign in
Merge branch 'master' into fix_654_stdin_filename
commit38178fedf463cb704509b772d5e274461086d368 authorKyle Criddle <criddle.kyle@gmail.com> dateTue 24 Mar 2020, 19:08 (7 years ago) parent59f2e2d8d3136e
118 files changed+1837−1763
.github/FUNDING.yml−3 .gitmodules+47−47 .travis.yml+3−3 Cargo.lock+365−451 Cargo.toml+4−3 README.md+7−7 assets/JavaDoc.sublime-syntax.patch+3−3 assets/create.sh+1−1 assets/manual/bat.1.in+79−66 assets/syntaxes.bin assets/syntaxes/Packages → assets/syntaxes/01_Packages assets/syntaxes/AWK → assets/syntaxes/02_Extra/AWK assets/syntaxes/AsciiDoc → assets/syntaxes/02_Extra/AsciiDoc assets/syntaxes/AsciiDoc.sublime-syntax → assets/syntaxes/02_Extra/AsciiDoc.sublime-syntax assets/syntaxes/Assembly (ARM) → assets/syntaxes/02_Extra/Assembly (ARM) assets/syntaxes/Assembly (ARM).sublime-syntax → assets/syntaxes/02_Extra/Assembly (ARM).sublime-syntax assets/syntaxes/Assembly (x86_64).sublime-syntax → assets/syntaxes/02_Extra/Assembly (x86_64).sublime-syntax assets/syntaxes/CMake → assets/syntaxes/02_Extra/CMake assets/syntaxes/CSV → assets/syntaxes/02_Extra/CSV assets/syntaxes/CSV.sublime-syntax → assets/syntaxes/02_Extra/CSV.sublime-syntax assets/syntaxes/Cabal → assets/syntaxes/02_Extra/Cabal assets/syntaxes/Cabal.sublime-syntax → assets/syntaxes/02_Extra/Cabal.sublime-syntax assets/syntaxes/CoffeeScript → assets/syntaxes/02_Extra/CoffeeScript assets/syntaxes/CoffeeScript.sublime-syntax → assets/syntaxes/02_Extra/CoffeeScript.sublime-syntax assets/syntaxes/CpuInfo.sublime-syntax → assets/syntaxes/02_Extra/CpuInfo.sublime-syntax assets/syntaxes/Crystal → assets/syntaxes/02_Extra/Crystal assets/syntaxes/Crystal.sublime-syntax → assets/syntaxes/02_Extra/Crystal.sublime-syntax assets/syntaxes/Dart → assets/syntaxes/02_Extra/Dart assets/syntaxes/Dart.sublime-syntax → assets/syntaxes/02_Extra/Dart.sublime-syntax assets/syntaxes/Docker → assets/syntaxes/02_Extra/Docker assets/syntaxes/DotENV → assets/syntaxes/02_Extra/DotENV assets/syntaxes/DotENV.sublime-syntax → assets/syntaxes/02_Extra/DotENV.sublime-syntax assets/syntaxes/Elixir → assets/syntaxes/02_Extra/Elixir assets/syntaxes/Elm → assets/syntaxes/02_Extra/Elm assets/syntaxes/FSharp → assets/syntaxes/02_Extra/FSharp assets/syntaxes/Fish → assets/syntaxes/02_Extra/Fish assets/syntaxes/Fstab.sublime-syntax → assets/syntaxes/02_Extra/Fstab.sublime-syntax assets/syntaxes/GraphQL → assets/syntaxes/02_Extra/GraphQL assets/syntaxes/Group.sublime-syntax → assets/syntaxes/02_Extra/Group.sublime-syntax assets/syntaxes/HTML (Twig) → assets/syntaxes/02_Extra/HTML (Twig) assets/syntaxes/HTML (Twig).sublime-syntax → assets/syntaxes/02_Extra/HTML (Twig).sublime-syntax assets/syntaxes/Hosts.sublime-syntax → assets/syntaxes/02_Extra/Hosts.sublime-syntax assets/syntaxes/INI → assets/syntaxes/02_Extra/INI assets/syntaxes/INI.sublime-syntax → assets/syntaxes/02_Extra/INI.sublime-syntax assets/syntaxes/JavaScript (Babel) → assets/syntaxes/02_Extra/JavaScript (Babel) assets/syntaxes/JavaScript (Babel).sublime-syntax → assets/syntaxes/02_Extra/JavaScript (Babel).sublime-syntax assets/syntaxes/Jinja2 → assets/syntaxes/02_Extra/Jinja2 assets/syntaxes/Jsonnet → assets/syntaxes/02_Extra/Jsonnet assets/syntaxes/Julia → assets/syntaxes/02_Extra/Julia assets/syntaxes/Kotlin → assets/syntaxes/02_Extra/Kotlin assets/syntaxes/Kotlin.sublime-syntax → assets/syntaxes/02_Extra/Kotlin.sublime-syntax assets/syntaxes/LESS → assets/syntaxes/02_Extra/LESS assets/syntaxes/Manpage.sublime-syntax → assets/syntaxes/02_Extra/Manpage.sublime-syntax assets/syntaxes/MemInfo.sublime-syntax → assets/syntaxes/02_Extra/MemInfo.sublime-syntax assets/syntaxes/Nim.sublime-syntax → assets/syntaxes/02_Extra/Nim.sublime-syntax assets/syntaxes/Nix → assets/syntaxes/02_Extra/Nix assets/syntaxes/Nix.sublime-syntax → assets/syntaxes/02_Extra/Nix.sublime-syntax assets/syntaxes/Org mode → assets/syntaxes/02_Extra/Org mode assets/syntaxes/Org mode.sublime-syntax → assets/syntaxes/02_Extra/Org mode.sublime-syntax assets/syntaxes/Passwd.sublime-syntax → assets/syntaxes/02_Extra/Passwd.sublime-syntax assets/syntaxes/PowerShell → assets/syntaxes/02_Extra/PowerShell assets/syntaxes/PowerShell.sublime-syntax → assets/syntaxes/02_Extra/PowerShell.sublime-syntax assets/syntaxes/Protobuf → assets/syntaxes/02_Extra/Protobuf assets/syntaxes/Puppet → assets/syntaxes/02_Extra/Puppet assets/syntaxes/PureScript → assets/syntaxes/02_Extra/PureScript assets/syntaxes/Resolv.sublime-syntax → assets/syntaxes/02_Extra/Resolv.sublime-syntax assets/syntaxes/Robot → assets/syntaxes/02_Extra/Robot assets/syntaxes/Robot.sublime-syntax → assets/syntaxes/02_Extra/Robot.sublime-syntax assets/syntaxes/SCSS_Sass → assets/syntaxes/02_Extra/SCSS_Sass assets/syntaxes/SLS → assets/syntaxes/02_Extra/SLS assets/syntaxes/Strace → assets/syntaxes/02_Extra/Strace assets/syntaxes/Swift → assets/syntaxes/02_Extra/Swift assets/syntaxes/Swift.sublime-syntax → assets/syntaxes/02_Extra/Swift.sublime-syntax assets/syntaxes/Syslog → assets/syntaxes/02_Extra/Syslog assets/syntaxes/TOML → assets/syntaxes/02_Extra/TOML assets/syntaxes/Terraform → assets/syntaxes/02_Extra/Terraform assets/syntaxes/TypeScript → assets/syntaxes/02_Extra/TypeScript assets/syntaxes/TypeScript.sublime-syntax → assets/syntaxes/02_Extra/TypeScript.sublime-syntax assets/syntaxes/TypsecriptReact.sublime-syntax → assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntax assets/syntaxes/Verilog → assets/syntaxes/02_Extra/Verilog assets/syntaxes/Verilog.sublime-syntax → assets/syntaxes/02_Extra/Verilog.sublime-syntax assets/syntaxes/VimL → assets/syntaxes/02_Extra/VimL assets/syntaxes/VimL.sublime-syntax → assets/syntaxes/02_Extra/VimL.sublime-syntax assets/syntaxes/Vue → assets/syntaxes/02_Extra/Vue assets/syntaxes/hosts → assets/syntaxes/02_Extra/hosts assets/syntaxes/requirementstxt → assets/syntaxes/02_Extra/requirementstxt assets/syntaxes/requirementstxt.sublime-syntax → assets/syntaxes/02_Extra/requirementstxt.sublime-syntax assets/syntaxes/show-nonprintable.sublime-syntax → assets/syntaxes/02_Extra/show-nonprintable.sublime-syntax assets/syntaxes/ssh-config → assets/syntaxes/02_Extra/ssh-config assets/syntaxes/varlink → assets/syntaxes/02_Extra/varlink assets/syntaxes/FSharp.sublime-syntax−672 assets/themes.bin build.rs+21−27 ci/before_deploy.bash+6−5 doc/README-ja.md+6−6 doc/README-ko.md+560 examples/cat.rs+33 examples/simple.rs+7−22 src/assets.rs+169−65 src/bin/bat/app.rs+38−38 src/bin/bat/assets.rs+38 src/bin/bat/clap_app.rs+7−7 src/bin/bat/config.rs+1−1 src/dirs.rs → src/bin/bat/directories.rs+25−15 src/bin/bat/main.rs+27−19 src/config.rs+96 src/controller.rs+8−4 src/errors.rs+25 src/inputfile.rs+4−4 src/lib.rs+13−114 src/line_range.rs+53−21 src/output.rs+1−1 src/printer.rs+13−13 src/style.rs+37−49 src/syntax_mapping.rs+94−18 src/wrap.rs+11 tests/no_duplicate_extensions.rs+35 tests/syntax_detection.rs−78
.github/FUNDING.ymldeleted−3
@@ -1,3 +0,0 @@
1−# These are supported funding model platforms
2−
3−github: sharkdp
.gitmodules+47−47
@@ -1,32 +1,32 @@
11[submodule "assets/syntaxes/Elixir"]
2− path = assets/syntaxes/Elixir
2+ path = assets/syntaxes/02_Extra/Elixir
33 url = https://github.com/princemaple/elixir-sublime-syntax/
44[submodule "assets/syntaxes/Packages"]
5− path = assets/syntaxes/Packages
5+ path = assets/syntaxes/01_Packages
66 url = https://github.com/sublimehq/Packages/
77[submodule "assets/syntaxes/TOML"]
8− path = assets/syntaxes/TOML
8+ path = assets/syntaxes/02_Extra/TOML
99 url = https://github.com/jasonwilliams/sublime_toml_highlighting
1010[submodule "assets/syntaxes/Julia"]
11− path = assets/syntaxes/Julia
11+ path = assets/syntaxes/02_Extra/Julia
1212 url = https://github.com/JuliaEditorSupport/Julia-sublime
1313[submodule "assets/themes/sublime-monokai-extended"]
1414 path = assets/themes/sublime-monokai-extended
1515 url = https://github.com/jonschlinkert/sublime-monokai-extended
1616[submodule "assets/syntaxes/Docker"]
17− path = assets/syntaxes/Docker
17+ path = assets/syntaxes/02_Extra/Docker
1818 url = https://github.com/asbjornenge/Docker.tmbundle
1919[submodule "assets/syntaxes/VimL"]
20− path = assets/syntaxes/VimL
20+ path = assets/syntaxes/02_Extra/VimL
2121 url = https://github.com/SalGnt/Sublime-VimL
2222[submodule "assets/syntaxes/INI"]
23− path = assets/syntaxes/INI
23+ path = assets/syntaxes/02_Extra/INI
2424 url = https://github.com/clintberry/sublime-text-2-ini
2525[submodule "assets/syntaxes/CMake"]
26− path = assets/syntaxes/CMake
26+ path = assets/syntaxes/02_Extra/CMake
2727 url = https://github.com/zyxar/Sublime-CMakeLists
2828[submodule "assets/syntaxes/LESS"]
29− path = assets/syntaxes/LESS
29+ path = assets/syntaxes/02_Extra/LESS
3030 url = https://github.com/danro/LESS-sublime
3131[submodule "assets/themes/DarkNeon"]
3232 path = assets/themes/DarkNeon
@@ -41,127 +41,127 @@
4141 path = assets/themes/TwoDark
4242 url = https://github.com/erremauro/TwoDark
4343[submodule "assets/syntaxes/AWK"]
44− path = assets/syntaxes/AWK
44+ path = assets/syntaxes/02_Extra/AWK
4545 url = https://github.com/JohnNilsson/awk-sublime
4646[submodule "assets/syntaxes/Nix"]
47− path = assets/syntaxes/Nix
47+ path = assets/syntaxes/02_Extra/Nix
4848 url = https://github.com/wmertens/sublime-nix
4949[submodule "assets/themes/zenburn"]
5050 path = assets/themes/zenburn
5151 url = https://github.com/colinta/zenburn.git
5252[submodule "assets/syntaxes/Kotlin"]
53− path = assets/syntaxes/Kotlin
53+ path = assets/syntaxes/02_Extra/Kotlin
5454 url = https://github.com/vkostyukov/kotlin-sublime-package
5555[submodule "assets/syntaxes/Elm"]
56− path = assets/syntaxes/Elm
56+ path = assets/syntaxes/02_Extra/Elm
5757 url = https://github.com/elm-community/SublimeElmLanguageSupport
5858[submodule "assets/syntaxes/TypeScript"]
59− path = assets/syntaxes/TypeScript
59+ path = assets/syntaxes/02_Extra/TypeScript
6060 url = https://github.com/Microsoft/TypeScript-Sublime-Plugin
6161[submodule "assets/syntaxes/Puppet"]
62− path = assets/syntaxes/Puppet
62+ path = assets/syntaxes/02_Extra/Puppet
6363 url = https://github.com/russCloak/SublimePuppet
6464[submodule "assets/syntaxes/CSV"]
65− path = assets/syntaxes/CSV
65+ path = assets/syntaxes/02_Extra/CSV
6666 url = https://github.com/wadetb/Sublime-Text-Advanced-CSV
6767[submodule "assets/themes/onehalf"]
6868 path = assets/themes/onehalf
6969 url = https://github.com/sonph/onehalf
7070[submodule "assets/syntaxes/JavaScript (Babel)"]
71− path = assets/syntaxes/JavaScript (Babel)
71+ path = assets/syntaxes/02_Extra/JavaScript (Babel)
7272 url = https://github.com/babel/babel-sublime
7373[submodule "assets/syntaxes/Cabal"]
74− path = assets/syntaxes/Cabal
74+ path = assets/syntaxes/02_Extra/Cabal
7575 url = https://github.com/SublimeHaskell/SublimeHaskell
7676[submodule "assets/syntaxes/Dart"]
77− path = assets/syntaxes/Dart
77+ path = assets/syntaxes/02_Extra/Dart
7878 url = https://github.com/guillermooo/dart-sublime-bundle
7979[submodule "assets/syntaxes/FSharp"]
80− path = assets/syntaxes/FSharp
80+ path = assets/syntaxes/02_Extra/FSharp
8181 url = https://github.com/hoest/sublimetext-fsharp
8282[submodule "assets/syntaxes/PureScript"]
83− path = assets/syntaxes/PureScript
83+ path = assets/syntaxes/02_Extra/PureScript
8484 url = https://github.com/tellnobody1/sublime-purescript-syntax
8585[submodule "assets/syntaxes/Swift"]
86− path = assets/syntaxes/Swift
86+ path = assets/syntaxes/02_Extra/Swift
8787 url = https://github.com/quiqueg/Swift-Sublime-Package
8888[submodule "assets/syntaxes/Crystal"]
89− path = assets/syntaxes/Crystal
89+ path = assets/syntaxes/02_Extra/Crystal
9090 url = https://github.com/crystal-lang-tools/sublime-crystal.git
9191[submodule "assets/syntaxes/PowerShell"]
92− path = assets/syntaxes/PowerShell
92+ path = assets/syntaxes/02_Extra/PowerShell
9393 url = https://github.com/PowerShell/EditorSyntax
9494[submodule "assets/syntaxes/Robot"]
95− path = assets/syntaxes/Robot
95+ path = assets/syntaxes/02_Extra/Robot
9696 url = https://github.com/andriyko/sublime-robot-framework-assistant.git
9797[submodule "assets/themes/sublime-snazzy"]
9898 path = assets/themes/sublime-snazzy
9999 url = https://github.com/greggb/sublime-snazzy
100100[submodule "assets/syntaxes/AsciiDoc"]
101− path = assets/syntaxes/AsciiDoc
101+ path = assets/syntaxes/02_Extra/AsciiDoc
102102 url = https://github.com/SublimeText/AsciiDoc.git
103103[submodule "assets/syntaxes/Assembly (ARM)"]
104− path = assets/syntaxes/Assembly (ARM)
104+ path = assets/syntaxes/02_Extra/Assembly (ARM)
105105 url = https://github.com/tvi/Sublime-ARM-Assembly
106106[submodule "assets/syntaxes/syslog-syntax"]
107− path = assets/syntaxes/Syslog
107+ path = assets/syntaxes/02_Extra/Syslog
108108 url = https://github.com/caos21/syslog-syntax.git
109109 branch = master
110110[submodule "assets/syntaxes/protobuf-syntax-highlighting"]
111− path = assets/syntaxes/Protobuf
111+ path = assets/syntaxes/02_Extra/Protobuf
112112 url = https://github.com/VcamX/protobuf-syntax-highlighting.git
113113 branch = master
114114[submodule "assets/syntaxes/Terraform"]
115− path = assets/syntaxes/Terraform
115+ path = assets/syntaxes/02_Extra/Terraform
116116 url = https://github.com/alexlouden/Terraform.tmLanguage.git
117117[submodule "assets/syntaxes/Jsonnet"]
118− path = assets/syntaxes/Jsonnet
118+ path = assets/syntaxes/02_Extra/Jsonnet
119119 url = https://github.com/gburiola/sublime-jsonnet-syntax.git
120120[submodule "assets/syntaxes/varlink"]
121− path = assets/syntaxes/varlink
121+ path = assets/syntaxes/02_Extra/varlink
122122 url = https://github.com/varlink/syntax-highlight-varlink.git
123123[submodule "assets/syntaxes/sublime-fish"]
124− path = assets/syntaxes/Fish
124+ path = assets/syntaxes/02_Extra/Fish
125125 url = https://github.com/Phidica/sublime-fish.git
126126[submodule "assets/syntaxes/Org mode"]
127− path = assets/syntaxes/Org mode
127+ path = assets/syntaxes/02_Extra/Org mode
128128 url = https://github.com/jezcope/Org.tmbundle.git
129129[submodule "assets/syntaxes/requirementstxt"]
130− path = assets/syntaxes/requirementstxt
130+ path = assets/syntaxes/02_Extra/requirementstxt
131131 url = https://github.com/wuub/requirementstxt
132132[submodule "assets/syntaxes/DotENV"]
133− path = assets/syntaxes/DotENV
133+ path = assets/syntaxes/02_Extra/DotENV
134134 url = https://github.com/zaynali53/DotENV
135135[submodule "assets/syntaxes/hosts"]
136− path = assets/syntaxes/hosts
136+ path = assets/syntaxes/02_Extra/hosts
137137 url = https://github.com/brandonwamboldt/sublime-hosts
138138[submodule "assets/syntaxes/ssh-config"]
139− path = assets/syntaxes/ssh-config
139+ path = assets/syntaxes/02_Extra/ssh-config
140140 url = https://github.com/robballou/sublimetext-sshconfig.git
141141[submodule "assets/syntaxes/GraphQL"]
142− path = assets/syntaxes/GraphQL
142+ path = assets/syntaxes/02_Extra/GraphQL
143143 url = https://github.com/dncrews/GraphQL-SublimeText3.git
144144[submodule "assets/syntaxes/Verilog"]
145− path = assets/syntaxes/Verilog
145+ path = assets/syntaxes/02_Extra/Verilog
146146 url = https://github.com/pro711/sublime-verilog
147147[submodule "assets/syntaxes/SCSS_Sass"]
148− path = assets/syntaxes/SCSS_Sass
148+ path = assets/syntaxes/02_Extra/SCSS_Sass
149149 url = https://github.com/braver/SublimeSass
150150[submodule "assets/syntaxes/Strace"]
151− path = assets/syntaxes/Strace
151+ path = assets/syntaxes/02_Extra/Strace
152152 url = https://github.com/djuretic/SublimeStrace
153153[submodule "assets/syntaxes/Jinja2"]
154− path = assets/syntaxes/Jinja2
154+ path = assets/syntaxes/02_Extra/Jinja2
155155 url = https://github.com/Martin819/sublime-jinja2
156156[submodule "assets/syntaxes/SLS"]
157− path = assets/syntaxes/SLS
157+ path = assets/syntaxes/02_Extra/SLS
158158 url = https://github.com/saltstack/sublime-text
159159 branch = master
160160[submodule "assets/themes/dracula-sublime"]
161161 path = assets/themes/dracula-sublime
162162 url = https://github.com/dracula/sublime.git
163163[submodule "assets/syntaxes/HTML (Twig)"]
164− path = assets/syntaxes/HTML (Twig)
164+ path = assets/syntaxes/02_Extra/HTML (Twig)
165165 url = https://github.com/Anomareh/PHP-Twig.tmbundle.git
166166[submodule "assets/themes/Nord-sublime"]
167167 path = assets/themes/Nord-sublime
@@ -170,9 +170,9 @@
170170 path = assets/themes/solarized-sublime
171171 url = https://github.com/paulcpederson/solarized-sublime.git
172172[submodule "assets/syntaxes/Vue"]
173− path = assets/syntaxes/Vue
173+ path = assets/syntaxes/02_Extra/Vue
174174 url = https://github.com/vuejs/vue-syntax-highlight.git
175175 branch = new
176176[submodule "assets/syntaxes/CoffeeScript"]
177− path = assets/syntaxes/CoffeeScript
177+ path = assets/syntaxes/02_Extra/CoffeeScript
178178 url = https://github.com/sustained/CoffeeScript-Sublime-Plugin
.travis.yml+3−3
@@ -33,15 +33,15 @@ matrix:
3333
3434 # Minimum Rust supported channel.
3535 - os: linux
36− rust: 1.36.0
36+ rust: 1.37.0
3737 env: TARGET=x86_64-unknown-linux-gnu
3838 - os: linux
39− rust: 1.36.0
39+ rust: 1.37.0
4040 env:
4141 - TARGET=x86_64-unknown-linux-musl
4242 - CC_x86_64_unknown_linux_musl=/usr/bin/musl-gcc
4343 - os: osx
44− rust: 1.36.0
44+ rust: 1.37.0
4545 env: TARGET=x86_64-apple-darwin
4646
4747 # Disable nightly for now
Cargo.lock+365−451
@@ -2,15 +2,15 @@
22# It is not intended for manual editing.
33[[package]]
44name = "adler32"
5−version = "1.0.3"
5+version = "1.0.4"
66source = "registry+https://github.com/rust-lang/crates.io-index"
77
88[[package]]
99name = "aho-corasick"
10−version = "0.7.6"
10+version = "0.7.10"
1111source = "registry+https://github.com/rust-lang/crates.io-index"
1212dependencies = [
13− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
13+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
1414]
1515
1616[[package]]
@@ -18,7 +18,7 @@ name = "ansi_colours"
1818version = "1.0.1"
1919source = "registry+https://github.com/rust-lang/crates.io-index"
2020dependencies = [
21− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
21+ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
2222]
2323
2424[[package]]
@@ -44,25 +44,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
4444
4545[[package]]
4646name = "arrayref"
47−version = "0.3.5"
47+version = "0.3.6"
4848source = "registry+https://github.com/rust-lang/crates.io-index"
4949
5050[[package]]
5151name = "arrayvec"
52−version = "0.4.11"
52+version = "0.5.1"
5353source = "registry+https://github.com/rust-lang/crates.io-index"
54−dependencies = [
55− "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
56−]
5754
5855[[package]]
5956name = "assert_cmd"
6057version = "0.12.0"
6158source = "registry+https://github.com/rust-lang/crates.io-index"
6259dependencies = [
63− "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
60+ "doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
6461 "escargot 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
65− "predicates 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
62+ "predicates 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
6663 "predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
6764 "predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
6865]
@@ -73,33 +70,33 @@ version = "0.2.14"
7370source = "registry+https://github.com/rust-lang/crates.io-index"
7471dependencies = [
7572 "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
76− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
73+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
7774 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
7875]
7976
8077[[package]]
8178name = "autocfg"
82−version = "0.1.6"
79+version = "1.0.0"
8380source = "registry+https://github.com/rust-lang/crates.io-index"
8481
8582[[package]]
8683name = "backtrace"
87−version = "0.3.35"
84+version = "0.3.45"
8885source = "registry+https://github.com/rust-lang/crates.io-index"
8986dependencies = [
90− "backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
91− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
92− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
87+ "backtrace-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
88+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
89+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
9390 "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
9491]
9592
9693[[package]]
9794name = "backtrace-sys"
98−version = "0.1.31"
95+version = "0.1.34"
9996source = "registry+https://github.com/rust-lang/crates.io-index"
10097dependencies = [
101− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
102− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
98+ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
99+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
103100]
104101
105102[[package]]
@@ -107,12 +104,17 @@ name = "base64"
107104version = "0.10.1"
108105source = "registry+https://github.com/rust-lang/crates.io-index"
109106dependencies = [
110− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
107+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
111108]
112109
110+[[package]]
111+name = "base64"
112+version = "0.11.0"
113+source = "registry+https://github.com/rust-lang/crates.io-index"
114+
113115[[package]]
114116name = "bat"
115−version = "0.12.1"
117+version = "0.13.0"
116118dependencies = [
117119 "ansi_colours 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
118120 "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -123,10 +125,11 @@ dependencies = [
123125 "content_inspector 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
124126 "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
125127 "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
126− "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
127− "git2 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
128+ "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)",
129+ "git2 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
130+ "globset 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
128131 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
129− "liquid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
132+ "liquid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
130133 "shell-words 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
131134 "syntect 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
132135 "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -136,22 +139,21 @@ dependencies = [
136139
137140[[package]]
138141name = "bincode"
139−version = "1.1.4"
142+version = "1.2.1"
140143source = "registry+https://github.com/rust-lang/crates.io-index"
141144dependencies = [
142− "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
143− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
144− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
145+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
146+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
145147]
146148
147149[[package]]
148150name = "bindgen"
149−version = "0.50.0"
151+version = "0.50.1"
150152source = "registry+https://github.com/rust-lang/crates.io-index"
151153dependencies = [
152− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
153− "cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
154− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
154+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
155+ "cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
156+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
155157 "clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)",
156158 "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
157159 "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -161,24 +163,24 @@ dependencies = [
161163 "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
162164 "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
163165 "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
164− "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
166+ "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
165167 "shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
166168 "which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
167169]
168170
169171[[package]]
170172name = "bitflags"
171−version = "1.1.0"
173+version = "1.2.1"
172174source = "registry+https://github.com/rust-lang/crates.io-index"
173175
174176[[package]]
175177name = "blake2b_simd"
176−version = "0.5.7"
178+version = "0.5.10"
177179source = "registry+https://github.com/rust-lang/crates.io-index"
178180dependencies = [
179− "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
180− "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
181− "constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
181+ "arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
182+ "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
183+ "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
182184]
183185
184186[[package]]
@@ -186,20 +188,28 @@ name = "block-buffer"
186188version = "0.7.3"
187189source = "registry+https://github.com/rust-lang/crates.io-index"
188190dependencies = [
189− "block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
191+ "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
190192 "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
191− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
193+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
192194 "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
193195]
194196
195197[[package]]
196198name = "block-padding"
197−version = "0.1.4"
199+version = "0.1.5"
198200source = "registry+https://github.com/rust-lang/crates.io-index"
199201dependencies = [
200202 "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
201203]
202204
205+[[package]]
206+name = "bstr"
207+version = "0.2.12"
208+source = "registry+https://github.com/rust-lang/crates.io-index"
209+dependencies = [
210+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
211+]
212+
203213[[package]]
204214name = "byte-tools"
205215version = "0.3.1"
@@ -207,21 +217,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
207217
208218[[package]]
209219name = "byteorder"
210−version = "1.3.2"
220+version = "1.3.4"
211221source = "registry+https://github.com/rust-lang/crates.io-index"
212222
213223[[package]]
214224name = "cc"
215−version = "1.0.45"
225+version = "1.0.50"
216226source = "registry+https://github.com/rust-lang/crates.io-index"
217227dependencies = [
218− "jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
219− "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
228+ "jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)",
220229]
221230
222231[[package]]
223232name = "cexpr"
224−version = "0.3.5"
233+version = "0.3.6"
225234source = "registry+https://github.com/rust-lang/crates.io-index"
226235dependencies = [
227236 "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -229,17 +238,16 @@ dependencies = [
229238
230239[[package]]
231240name = "cfg-if"
232−version = "0.1.9"
241+version = "0.1.10"
233242source = "registry+https://github.com/rust-lang/crates.io-index"
234243
235244[[package]]
236245name = "chrono"
237−version = "0.4.9"
246+version = "0.4.11"
238247source = "registry+https://github.com/rust-lang/crates.io-index"
239248dependencies = [
240− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
241− "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
242− "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
249+ "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
250+ "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
243251 "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
244252]
245253
@@ -249,7 +257,7 @@ version = "0.28.1"
249257source = "registry+https://github.com/rust-lang/crates.io-index"
250258dependencies = [
251259 "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
252− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
260+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
253261 "libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
254262]
255263
@@ -260,7 +268,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
260268dependencies = [
261269 "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
262270 "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
263− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
271+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
264272 "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
265273 "term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
266274 "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -275,18 +283,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
275283dependencies = [
276284 "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
277285 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
278− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
286+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
279287 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
280288]
281289
282−[[package]]
283−name = "cloudabi"
284−version = "0.0.3"
285−source = "registry+https://github.com/rust-lang/crates.io-index"
286−dependencies = [
287− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
288−]
289−
290290[[package]]
291291name = "console"
292292version = "0.10.0"
@@ -295,8 +295,8 @@ dependencies = [
295295 "clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
296296 "encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
297297 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
298− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
299− "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
298+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
299+ "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
300300 "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
301301 "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
302302 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -304,7 +304,7 @@ dependencies = [
304304
305305[[package]]
306306name = "constant_time_eq"
307−version = "0.1.4"
307+version = "0.1.5"
308308source = "registry+https://github.com/rust-lang/crates.io-index"
309309
310310[[package]]
@@ -312,7 +312,7 @@ name = "content_inspector"
312312version = "0.2.4"
313313source = "registry+https://github.com/rust-lang/crates.io-index"
314314dependencies = [
315− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
315+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
316316]
317317
318318[[package]]
@@ -320,23 +320,19 @@ name = "crc32fast"
320320version = "1.2.0"
321321source = "registry+https://github.com/rust-lang/crates.io-index"
322322dependencies = [
323− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
323+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
324324]
325325
326326[[package]]
327327name = "crossbeam-utils"
328−version = "0.6.6"
328+version = "0.7.2"
329329source = "registry+https://github.com/rust-lang/crates.io-index"
330330dependencies = [
331− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
331+ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
332+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
332333 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
333334]
334335
335−[[package]]
336−name = "deunicode"
337−version = "1.0.0"
338−source = "registry+https://github.com/rust-lang/crates.io-index"
339−
340336[[package]]
341337name = "difference"
342338version = "2.0.0"
@@ -355,7 +351,7 @@ name = "dirs"
355351version = "2.0.2"
356352source = "registry+https://github.com/rust-lang/crates.io-index"
357353dependencies = [
358− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
354+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
359355 "dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
360356]
361357
@@ -364,15 +360,15 @@ name = "dirs-sys"
364360version = "0.3.4"
365361source = "registry+https://github.com/rust-lang/crates.io-index"
366362dependencies = [
367− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
368− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
369− "redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
363+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
364+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
365+ "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
370366 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
371367]
372368
373369[[package]]
374370name = "doc-comment"
375−version = "0.3.1"
371+version = "0.3.3"
376372source = "registry+https://github.com/rust-lang/crates.io-index"
377373
378374[[package]]
@@ -448,18 +444,18 @@ version = "0.6.2"
448444source = "registry+https://github.com/rust-lang/crates.io-index"
449445dependencies = [
450446 "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
451− "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
447+ "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
452448 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
453− "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
454− "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
449+ "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
450+ "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
455451]
456452
457453[[package]]
458454name = "error-chain"
459−version = "0.12.1"
455+version = "0.12.2"
460456source = "registry+https://github.com/rust-lang/crates.io-index"
461457dependencies = [
462− "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
458+ "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
463459]
464460
465461[[package]]
@@ -469,28 +465,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
469465dependencies = [
470466 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
471467 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
472− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
473− "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
468+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
469+ "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
474470]
475471
476472[[package]]
477473name = "failure"
478−version = "0.1.5"
479−source = "registry+https://github.com/rust-lang/crates.io-index"
480−dependencies = [
481− "backtrace 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)",
482− "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
483−]
484−
485−[[package]]
486−name = "failure_derive"
487−version = "0.1.5"
474+version = "0.1.7"
488475source = "registry+https://github.com/rust-lang/crates.io-index"
489476dependencies = [
490− "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
491− "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
492− "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
493− "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
477+ "backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)",
494478]
495479
496480[[package]]
@@ -500,13 +484,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
500484
501485[[package]]
502486name = "flate2"
503−version = "1.0.11"
487+version = "1.0.14"
504488source = "registry+https://github.com/rust-lang/crates.io-index"
505489dependencies = [
490+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
506491 "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
507− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
508− "miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
509− "miniz_oxide 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
492+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
493+ "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
510494]
511495
512496[[package]]
@@ -524,7 +508,7 @@ name = "fxhash"
524508version = "0.2.1"
525509source = "registry+https://github.com/rust-lang/crates.io-index"
526510dependencies = [
527− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
511+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
528512]
529513
530514[[package]]
@@ -537,24 +521,24 @@ dependencies = [
537521
538522[[package]]
539523name = "getrandom"
540−version = "0.1.12"
524+version = "0.1.14"
541525source = "registry+https://github.com/rust-lang/crates.io-index"
542526dependencies = [
543− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
544− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
545− "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
527+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
528+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
529+ "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)",
546530]
547531
548532[[package]]
549533name = "git2"
550−version = "0.12.0"
534+version = "0.13.0"
551535source = "registry+https://github.com/rust-lang/crates.io-index"
552536dependencies = [
553− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
554− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
555− "libgit2-sys 0.11.0+0.99.0 (registry+https://github.com/rust-lang/crates.io-index)",
537+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
538+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
539+ "libgit2-sys 0.12.0+0.99.0 (registry+https://github.com/rust-lang/crates.io-index)",
556540 "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
557− "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
541+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
558542]
559543
560544[[package]]
@@ -562,20 +546,32 @@ name = "glob"
562546version = "0.3.0"
563547source = "registry+https://github.com/rust-lang/crates.io-index"
564548
549+[[package]]
550+name = "globset"
551+version = "0.4.5"
552+source = "registry+https://github.com/rust-lang/crates.io-index"
553+dependencies = [
554+ "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)",
555+ "bstr 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
556+ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
557+ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
558+ "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
559+]
560+
565561[[package]]
566562name = "hermit-abi"
567563version = "0.1.8"
568564source = "registry+https://github.com/rust-lang/crates.io-index"
569565dependencies = [
570− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
566+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
571567]
572568
573569[[package]]
574570name = "humantime"
575−version = "1.2.0"
571+version = "1.3.0"
576572source = "registry+https://github.com/rust-lang/crates.io-index"
577573dependencies = [
578− "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
574+ "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
579575]
580576
581577[[package]]
@@ -585,7 +581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
585581dependencies = [
586582 "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
587583 "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
588− "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
584+ "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
589585]
590586
591587[[package]]
@@ -595,12 +591,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
595591dependencies = [
596592 "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
597593 "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
598− "unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
594+ "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
599595]
600596
601597[[package]]
602598name = "itertools"
603−version = "0.8.0"
599+version = "0.8.2"
604600source = "registry+https://github.com/rust-lang/crates.io-index"
605601dependencies = [
606602 "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -608,17 +604,15 @@ dependencies = [
608604
609605[[package]]
610606name = "itoa"
611−version = "0.4.4"
607+version = "0.4.5"
612608source = "registry+https://github.com/rust-lang/crates.io-index"
613609
614610[[package]]
615611name = "jobserver"
616−version = "0.1.17"
612+version = "0.1.21"
617613source = "registry+https://github.com/rust-lang/crates.io-index"
618614dependencies = [
619− "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
620− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
621− "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
615+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
622616]
623617
624618[[package]]
@@ -630,6 +624,14 @@ dependencies = [
630624 "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
631625]
632626
627+[[package]]
628+name = "kstring"
629+version = "0.1.0"
630+source = "registry+https://github.com/rust-lang/crates.io-index"
631+dependencies = [
632+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
633+]
634+
633635[[package]]
634636name = "lazy_static"
635637version = "1.4.0"
@@ -642,18 +644,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
642644
643645[[package]]
644646name = "libc"
645−version = "0.2.62"
647+version = "0.2.68"
646648source = "registry+https://github.com/rust-lang/crates.io-index"
647649
648650[[package]]
649651name = "libgit2-sys"
650−version = "0.11.0+0.99.0"
652+version = "0.12.0+0.99.0"
651653source = "registry+https://github.com/rust-lang/crates.io-index"
652654dependencies = [
653− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
654− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
655+ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
656+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
655657 "libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
656− "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
658+ "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
657659]
658660
659661[[package]]
@@ -661,7 +663,7 @@ name = "libloading"
661663version = "0.5.2"
662664source = "registry+https://github.com/rust-lang/crates.io-index"
663665dependencies = [
664− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
666+ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
665667 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
666668]
667669
@@ -670,10 +672,10 @@ name = "libz-sys"
670672version = "1.0.25"
671673source = "registry+https://github.com/rust-lang/crates.io-index"
672674dependencies = [
673− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
674− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
675− "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
676− "vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
675+ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
676+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
677+ "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
678+ "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
677679]
678680
679681[[package]]
@@ -681,7 +683,7 @@ name = "line-wrap"
681683version = "0.1.1"
682684source = "registry+https://github.com/rust-lang/crates.io-index"
683685dependencies = [
684− "safemem 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
686+ "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
685687]
686688
687689[[package]]
@@ -691,78 +693,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
691693
692694[[package]]
693695name = "liquid"
694−version = "0.19.0"
696+version = "0.20.0"
695697source = "registry+https://github.com/rust-lang/crates.io-index"
696698dependencies = [
697− "chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
698− "deunicode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
699− "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
700− "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
701− "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
702− "liquid-compiler 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
703− "liquid-derive 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
704− "liquid-error 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
705− "liquid-interpreter 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
706− "liquid-value 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
707− "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
708− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
709− "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
710− "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
699+ "doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
700+ "kstring 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
701+ "liquid-core 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
702+ "liquid-derive 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
703+ "liquid-lib 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
704+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
711705]
712706
713707[[package]]
714−name = "liquid-compiler"
715−version = "0.19.0"
708+name = "liquid-core"
709+version = "0.20.0"
716710source = "registry+https://github.com/rust-lang/crates.io-index"
717711dependencies = [
718− "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
719− "liquid-error 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
720− "liquid-interpreter 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
721− "liquid-value 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
722− "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
712+ "anymap 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
713+ "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
714+ "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
715+ "kstring 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
716+ "liquid-derive 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
717+ "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
718+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
723719 "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
720+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
724721]
725722
726723[[package]]
727724name = "liquid-derive"
728−version = "0.19.0"
729−source = "registry+https://github.com/rust-lang/crates.io-index"
730−dependencies = [
731− "liquid-compiler 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
732− "liquid-error 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
733− "liquid-interpreter 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
734− "liquid-value 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
735− "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
736− "proc-quote 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
737− "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
738−]
739−
740−[[package]]
741−name = "liquid-error"
742−version = "0.19.0"
743−source = "registry+https://github.com/rust-lang/crates.io-index"
744−
745−[[package]]
746−name = "liquid-interpreter"
747−version = "0.19.0"
725+version = "0.20.0"
748726source = "registry+https://github.com/rust-lang/crates.io-index"
749727dependencies = [
750− "anymap 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)",
751− "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
752− "liquid-error 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
753− "liquid-value 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
728+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
729+ "proc-quote 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
730+ "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
754731]
755732
756733[[package]]
757−name = "liquid-value"
758−version = "0.19.0"
734+name = "liquid-lib"
735+version = "0.20.0"
759736source = "registry+https://github.com/rust-lang/crates.io-index"
760737dependencies = [
761− "chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
762− "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
763− "liquid-error 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
764− "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
765− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
738+ "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
739+ "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
740+ "kstring 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
741+ "liquid-core 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
742+ "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
743+ "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
744+ "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
745+ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
766746]
767747
768748[[package]]
@@ -770,7 +750,7 @@ name = "log"
770750version = "0.4.8"
771751source = "registry+https://github.com/rust-lang/crates.io-index"
772752dependencies = [
773− "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
753+ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
774754]
775755
776756[[package]]
@@ -785,73 +765,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
785765
786766[[package]]
787767name = "memchr"
788−version = "2.2.1"
768+version = "2.3.3"
789769source = "registry+https://github.com/rust-lang/crates.io-index"
790770
791−[[package]]
792−name = "miniz-sys"
793−version = "0.1.12"
794−source = "registry+https://github.com/rust-lang/crates.io-index"
795−dependencies = [
796− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
797− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
798−]
799−
800771[[package]]
801772name = "miniz_oxide"
802−version = "0.3.2"
773+version = "0.3.6"
803774source = "registry+https://github.com/rust-lang/crates.io-index"
804775dependencies = [
805− "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
776+ "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
806777]
807778
808−[[package]]
809−name = "nodrop"
810−version = "0.1.13"
811−source = "registry+https://github.com/rust-lang/crates.io-index"
812−
813779[[package]]
814780name = "nom"
815781version = "4.2.3"
816782source = "registry+https://github.com/rust-lang/crates.io-index"
817783dependencies = [
818− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
784+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
819785 "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
820786]
821787
822788[[package]]
823789name = "num-integer"
824−version = "0.1.41"
790+version = "0.1.42"
825791source = "registry+https://github.com/rust-lang/crates.io-index"
826792dependencies = [
827− "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
828− "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
793+ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
794+ "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
829795]
830796
831797[[package]]
832798name = "num-traits"
833−version = "0.2.8"
799+version = "0.2.11"
834800source = "registry+https://github.com/rust-lang/crates.io-index"
835801dependencies = [
836− "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
802+ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
837803]
838804
839805[[package]]
840−name = "num_cpus"
841−version = "1.10.1"
806+name = "once_cell"
807+version = "1.3.1"
842808source = "registry+https://github.com/rust-lang/crates.io-index"
843−dependencies = [
844− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
845−]
846809
847810[[package]]
848811name = "onig"
849812version = "5.0.0"
850813source = "registry+https://github.com/rust-lang/crates.io-index"
851814dependencies = [
852− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
815+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
853816 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
854− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
817+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
855818 "onig_sys 69.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
856819]
857820
@@ -860,9 +823,9 @@ name = "onig_sys"
860823version = "69.2.0"
861824source = "registry+https://github.com/rust-lang/crates.io-index"
862825dependencies = [
863− "bindgen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)",
864− "cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
865− "pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
826+ "bindgen 0.50.1 (registry+https://github.com/rust-lang/crates.io-index)",
827+ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
828+ "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)",
866829]
867830
868831[[package]]
@@ -887,10 +850,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
887850
888851[[package]]
889852name = "pest"
890−version = "2.1.2"
853+version = "2.1.3"
891854source = "registry+https://github.com/rust-lang/crates.io-index"
892855dependencies = [
893− "ucd-trie 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
856+ "ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
894857]
895858
896859[[package]]
@@ -898,35 +861,35 @@ name = "pest_derive"
898861version = "2.1.0"
899862source = "registry+https://github.com/rust-lang/crates.io-index"
900863dependencies = [
901− "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
902− "pest_generator 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
864+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
865+ "pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
903866]
904867
905868[[package]]
906869name = "pest_generator"
907−version = "2.1.1"
870+version = "2.1.3"
908871source = "registry+https://github.com/rust-lang/crates.io-index"
909872dependencies = [
910− "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
911− "pest_meta 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
912− "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
913− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
914− "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
873+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
874+ "pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
875+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
876+ "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
877+ "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
915878]
916879
917880[[package]]
918881name = "pest_meta"
919−version = "2.1.2"
882+version = "2.1.3"
920883source = "registry+https://github.com/rust-lang/crates.io-index"
921884dependencies = [
922885 "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
923− "pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
924− "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
886+ "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
887+ "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
925888]
926889
927890[[package]]
928891name = "pkg-config"
929−version = "0.3.15"
892+version = "0.3.17"
930893source = "registry+https://github.com/rust-lang/crates.io-index"
931894
932895[[package]]
@@ -935,16 +898,16 @@ version = "0.4.2"
935898source = "registry+https://github.com/rust-lang/crates.io-index"
936899dependencies = [
937900 "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
938− "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
939− "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
901+ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
902+ "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
940903 "line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
941− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
904+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
942905 "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
943906]
944907
945908[[package]]
946909name = "predicates"
947−version = "1.0.1"
910+version = "1.0.4"
948911source = "registry+https://github.com/rust-lang/crates.io-index"
949912dependencies = [
950913 "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -967,13 +930,8 @@ dependencies = [
967930
968931[[package]]
969932name = "proc-macro-hack"
970−version = "0.5.9"
933+version = "0.5.14"
971934source = "registry+https://github.com/rust-lang/crates.io-index"
972−dependencies = [
973− "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
974− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
975− "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
976−]
977935
978936[[package]]
979937name = "proc-macro2"
@@ -985,7 +943,7 @@ dependencies = [
985943
986944[[package]]
987945name = "proc-macro2"
988−version = "1.0.2"
946+version = "1.0.9"
989947source = "registry+https://github.com/rust-lang/crates.io-index"
990948dependencies = [
991949 "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -993,29 +951,29 @@ dependencies = [
993951
994952[[package]]
995953name = "proc-quote"
996−version = "0.2.2"
954+version = "0.3.0"
997955source = "registry+https://github.com/rust-lang/crates.io-index"
998956dependencies = [
999− "proc-macro-hack 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
1000− "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
1001− "proc-quote-impl 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
1002− "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
1003− "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
957+ "proc-macro-hack 0.5.14 (registry+https://github.com/rust-lang/crates.io-index)",
958+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
959+ "proc-quote-impl 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
960+ "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
961+ "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
1004962]
1005963
1006964[[package]]
1007965name = "proc-quote-impl"
1008−version = "0.2.2"
966+version = "0.3.0"
1009967source = "registry+https://github.com/rust-lang/crates.io-index"
1010968dependencies = [
1011− "proc-macro-hack 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
1012− "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
1013− "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
969+ "proc-macro-hack 0.5.14 (registry+https://github.com/rust-lang/crates.io-index)",
970+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
971+ "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
1014972]
1015973
1016974[[package]]
1017975name = "quick-error"
1018−version = "1.2.2"
976+version = "1.2.3"
1019977source = "registry+https://github.com/rust-lang/crates.io-index"
1020978
1021979[[package]]
@@ -1028,10 +986,10 @@ dependencies = [
1028986
1029987[[package]]
1030988name = "quote"
1031−version = "1.0.2"
989+version = "1.0.3"
1032990source = "registry+https://github.com/rust-lang/crates.io-index"
1033991dependencies = [
1034− "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
992+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
1035993]
1036994
1037995[[package]]
@@ -1040,7 +998,7 @@ version = "0.4.6"
1040998source = "registry+https://github.com/rust-lang/crates.io-index"
1041999dependencies = [
10421000 "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
1043− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
1001+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
10441002 "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
10451003 "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
10461004 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1059,19 +1017,6 @@ name = "rand_core"
10591017version = "0.4.2"
10601018source = "registry+https://github.com/rust-lang/crates.io-index"
10611019
1062−[[package]]
1063−name = "rand_os"
1064−version = "0.1.3"
1065−source = "registry+https://github.com/rust-lang/crates.io-index"
1066−dependencies = [
1067− "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
1068− "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
1069− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
1070− "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
1071− "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
1072− "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
1073−]
1074−
10751020[[package]]
10761021name = "rdrand"
10771022version = "0.4.0"
@@ -1087,29 +1032,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
10871032
10881033[[package]]
10891034name = "redox_users"
1090−version = "0.3.1"
1035+version = "0.3.4"
10911036source = "registry+https://github.com/rust-lang/crates.io-index"
10921037dependencies = [
1093− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
1094− "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
1038+ "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)",
10951039 "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
1096− "rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
1040+ "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
10971041]
10981042
10991043[[package]]
11001044name = "regex"
1101−version = "1.3.1"
1045+version = "1.3.5"
11021046source = "registry+https://github.com/rust-lang/crates.io-index"
11031047dependencies = [
1104− "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
1105− "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
1106− "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
1107− "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
1048+ "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)",
1049+ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
1050+ "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
1051+ "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
11081052]
11091053
11101054[[package]]
11111055name = "regex-syntax"
1112−version = "0.6.12"
1056+version = "0.6.17"
11131057source = "registry+https://github.com/rust-lang/crates.io-index"
11141058
11151059[[package]]
@@ -1122,12 +1066,13 @@ dependencies = [
11221066
11231067[[package]]
11241068name = "rust-argon2"
1125−version = "0.5.1"
1069+version = "0.7.0"
11261070source = "registry+https://github.com/rust-lang/crates.io-index"
11271071dependencies = [
1128− "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
1129− "blake2b_simd 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
1130− "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
1072+ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
1073+ "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
1074+ "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
1075+ "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
11311076]
11321077
11331078[[package]]
@@ -1137,53 +1082,53 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
11371082
11381083[[package]]
11391084name = "ryu"
1140−version = "1.0.0"
1085+version = "1.0.3"
11411086source = "registry+https://github.com/rust-lang/crates.io-index"
11421087
11431088[[package]]
11441089name = "safemem"
1145−version = "0.3.2"
1090+version = "0.3.3"
11461091source = "registry+https://github.com/rust-lang/crates.io-index"
11471092
11481093[[package]]
11491094name = "same-file"
1150−version = "1.0.5"
1095+version = "1.0.6"
11511096source = "registry+https://github.com/rust-lang/crates.io-index"
11521097dependencies = [
1153− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
1098+ "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
11541099]
11551100
11561101[[package]]
11571102name = "serde"
1158−version = "1.0.99"
1103+version = "1.0.105"
11591104source = "registry+https://github.com/rust-lang/crates.io-index"
11601105dependencies = [
1161− "serde_derive 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
1106+ "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
11621107]
11631108
11641109[[package]]
11651110name = "serde_derive"
1166−version = "1.0.99"
1111+version = "1.0.105"
11671112source = "registry+https://github.com/rust-lang/crates.io-index"
11681113dependencies = [
1169− "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
1170− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
1171− "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
1114+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
1115+ "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
1116+ "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)",
11721117]
11731118
11741119[[package]]
11751120name = "serde_json"
1176−version = "1.0.40"
1121+version = "1.0.48"
11771122source = "registry+https://github.com/rust-lang/crates.io-index"
11781123dependencies = [
1179− "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
1180− "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
1181− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
1124+ "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
1125+ "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
1126+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
11821127]
11831128
11841129[[package]]
11851130name = "sha-1"
1186−version = "0.8.1"
1131+version = "0.8.2"
11871132source = "registry+https://github.com/rust-lang/crates.io-index"
11881133dependencies = [
11891134 "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1204,7 +1149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
12041149
12051150[[package]]
12061151name = "smallvec"
1207−version = "0.6.10"
1152+version = "1.2.0"
12081153source = "registry+https://github.com/rust-lang/crates.io-index"
12091154
12101155[[package]]
@@ -1214,53 +1159,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
12141159
12151160[[package]]
12161161name = "syn"
1217−version = "0.15.44"
1162+version = "1.0.17"
12181163source = "registry+https://github.com/rust-lang/crates.io-index"
12191164dependencies = [
1220− "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
1221− "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
1222− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
1223−]
1224−
1225−[[package]]
1226−name = "syn"
1227−version = "1.0.5"
1228−source = "registry+https://github.com/rust-lang/crates.io-index"
1229−dependencies = [
1230− "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
1231− "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
1165+ "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
1166+ "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
12321167 "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
12331168]
12341169
1235−[[package]]
1236−name = "synstructure"
1237−version = "0.10.2"
1238−source = "registry+https://github.com/rust-lang/crates.io-index"
1239−dependencies = [
1240− "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
1241− "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
1242− "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)",
1243− "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
1244−]
1245−
12461170[[package]]
12471171name = "syntect"
12481172version = "3.3.0"
12491173source = "registry+https://github.com/rust-lang/crates.io-index"
12501174dependencies = [
1251− "bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
1252− "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
1253− "flate2 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
1175+ "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
1176+ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
1177+ "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
12541178 "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
12551179 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
12561180 "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
12571181 "onig 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
12581182 "plist 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
1259− "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
1260− "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
1261− "serde_derive 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
1262− "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
1263− "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
1183+ "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)",
1184+ "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
1185+ "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
1186+ "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
1187+ "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
12641188 "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
12651189]
12661190
@@ -1279,16 +1203,16 @@ version = "0.3.1"
12791203source = "registry+https://github.com/rust-lang/crates.io-index"
12801204dependencies = [
12811205 "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
1282− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
1206+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
12831207 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
12841208]
12851209
12861210[[package]]
12871211name = "termcolor"
1288−version = "1.0.5"
1212+version = "1.1.0"
12891213source = "registry+https://github.com/rust-lang/crates.io-index"
12901214dependencies = [
1291− "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
1215+ "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
12921216]
12931217
12941218[[package]]
@@ -1296,7 +1220,7 @@ name = "termios"
12961220version = "0.3.1"
12971221source = "registry+https://github.com/rust-lang/crates.io-index"
12981222dependencies = [
1299− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
1223+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
13001224]
13011225
13021226[[package]]
@@ -1310,7 +1234,7 @@ dependencies = [
13101234
13111235[[package]]
13121236name = "thread_local"
1313−version = "0.3.6"
1237+version = "1.0.1"
13141238source = "registry+https://github.com/rust-lang/crates.io-index"
13151239dependencies = [
13161240 "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1321,7 +1245,7 @@ name = "time"
13211245version = "0.1.42"
13221246source = "registry+https://github.com/rust-lang/crates.io-index"
13231247dependencies = [
1324− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
1248+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
13251249 "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
13261250 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
13271251]
@@ -1338,7 +1262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
13381262
13391263[[package]]
13401264name = "ucd-trie"
1341−version = "0.1.2"
1265+version = "0.1.3"
13421266source = "registry+https://github.com/rust-lang/crates.io-index"
13431267
13441268[[package]]
@@ -1351,15 +1275,15 @@ dependencies = [
13511275
13521276[[package]]
13531277name = "unicode-normalization"
1354−version = "0.1.8"
1278+version = "0.1.12"
13551279source = "registry+https://github.com/rust-lang/crates.io-index"
13561280dependencies = [
1357− "smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
1281+ "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
13581282]
13591283
13601284[[package]]
13611285name = "unicode-segmentation"
1362−version = "1.3.0"
1286+version = "1.6.0"
13631287source = "registry+https://github.com/rust-lang/crates.io-index"
13641288
13651289[[package]]
@@ -1389,7 +1313,7 @@ dependencies = [
13891313
13901314[[package]]
13911315name = "url"
1392−version = "2.1.0"
1316+version = "2.1.1"
13931317source = "registry+https://github.com/rust-lang/crates.io-index"
13941318dependencies = [
13951319 "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1399,7 +1323,7 @@ dependencies = [
13991323
14001324[[package]]
14011325name = "vcpkg"
1402−version = "0.2.7"
1326+version = "0.2.8"
14031327source = "registry+https://github.com/rust-lang/crates.io-index"
14041328
14051329[[package]]
@@ -1412,19 +1336,24 @@ name = "version_check"
14121336version = "0.1.5"
14131337source = "registry+https://github.com/rust-lang/crates.io-index"
14141338
1339+[[package]]
1340+name = "version_check"
1341+version = "0.9.1"
1342+source = "registry+https://github.com/rust-lang/crates.io-index"
1343+
14151344[[package]]
14161345name = "walkdir"
1417−version = "2.2.9"
1346+version = "2.3.1"
14181347source = "registry+https://github.com/rust-lang/crates.io-index"
14191348dependencies = [
1420− "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
1349+ "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
14211350 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
1422− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
1351+ "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
14231352]
14241353
14251354[[package]]
14261355name = "wasi"
1427−version = "0.7.0"
1356+version = "0.9.0+wasi-snapshot-preview1"
14281357source = "registry+https://github.com/rust-lang/crates.io-index"
14291358
14301359[[package]]
@@ -1432,8 +1361,8 @@ name = "which"
14321361version = "2.0.1"
14331362source = "registry+https://github.com/rust-lang/crates.io-index"
14341363dependencies = [
1435− "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
1436− "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
1364+ "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
1365+ "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)",
14371366]
14381367
14391368[[package]]
@@ -1470,7 +1399,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
14701399
14711400[[package]]
14721401name = "winapi-util"
1473−version = "0.1.2"
1402+version = "0.1.3"
14741403source = "registry+https://github.com/rust-lang/crates.io-index"
14751404dependencies = [
14761405 "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1481,15 +1410,6 @@ name = "winapi-x86_64-pc-windows-gnu"
14811410version = "0.4.0"
14821411source = "registry+https://github.com/rust-lang/crates.io-index"
14831412
1484−[[package]]
1485−name = "wincolor"
1486−version = "1.0.2"
1487−source = "registry+https://github.com/rust-lang/crates.io-index"
1488−dependencies = [
1489− "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
1490− "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
1491−]
1492−
14931413[[package]]
14941414name = "xml-rs"
14951415version = "0.8.0"
@@ -1504,47 +1424,47 @@ dependencies = [
15041424]
15051425
15061426[metadata]
1507−"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c"
1508−"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
1427+"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2"
1428+"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
15091429"checksum ansi_colours 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d0f302a81afc6a7f4350c04f0ba7cfab529cc009bca3324b3fb5764e6add8b6"
15101430"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
15111431"checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
15121432"checksum anymap 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344"
1513−"checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee"
1514−"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba"
1433+"checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
1434+"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
15151435"checksum assert_cmd 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6283bac8dd7226470d491bc4737816fea4ca1fba7a2847f2e9097fd6bfb4624c"
15161436"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
1517−"checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875"
1518−"checksum backtrace 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "1371048253fa3bac6704bfd6bbfc922ee9bdcee8881330d40f308b81cc5adc55"
1519−"checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b"
1437+"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
1438+"checksum backtrace 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "ad235dabf00f36301792cfe82499880ba54c6486be094d1047b02bacb67c14e8"
1439+"checksum backtrace-sys 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "ca797db0057bae1a7aa2eef3283a874695455cecf08a43bfb8507ee0ebc1ed69"
15201440"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
1521−"checksum bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9f04a5e50dc80b3d5d35320889053637d15011aed5e66b66b37ae798c65da6f7"
1522−"checksum bindgen 0.50.0 (registry+https://github.com/rust-lang/crates.io-index)" = "65a913de3fa2fa95f2c593bb7e33b1be1ce1ce8a83f34b6bb02e6f01400b96cc"
1523−"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
1524−"checksum blake2b_simd 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bf775a81bb2d464e20ff170ac20316c7b08a43d11dbc72f0f82e8e8d3d6d0499"
1441+"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
1442+"checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf"
1443+"checksum bindgen 0.50.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cb0e5a5f74b2bafe0b39379f616b5975e08bcaca4e779c078d5c31324147e9ba"
1444+"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
1445+"checksum blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a"
15251446"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
1526−"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09"
1447+"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
1448+"checksum bstr 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "2889e6d50f394968c8bf4240dc3f2a7eb4680844d27308f798229ac9d4725f41"
15271449"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
1528−"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
1529−"checksum cc 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4fc9a35e1f4290eb9e5fc54ba6cf40671ed2a2514c3eeb2b2a908dda2ea5a1be"
1530−"checksum cexpr 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7fa24eb00d5ffab90eaeaf1092ac85c04c64aaf358ea6f84505b8116d24c6af"
1531−"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
1532−"checksum chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e8493056968583b0193c1bb04d6f7684586f3726992d6c573261941a895dbd68"
1450+"checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
1451+"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
1452+"checksum cexpr 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fce5b5fb86b0c57c20c834c1b412fd09c77c8a59b9473f86272709e78874cd1d"
1453+"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
1454+"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
15331455"checksum clang-sys 0.28.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81de550971c976f176130da4b2978d3b524eaa0fd9ac31f3ceb5ae1231fb4853"
15341456"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
15351457"checksum clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e"
1536−"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
15371458"checksum console 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6728a28023f207181b193262711102bfbaf47cc9d13bc71d0736607ef8efe88c"
1538−"checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120"
1459+"checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
15391460"checksum content_inspector 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38"
15401461"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1"
1541−"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
1542−"checksum deunicode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca8a0f5bbdedde60605d0719b998e282af68e2b1c50203110211fe4abe857560"
1462+"checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
15431463"checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
15441464"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
15451465"checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3"
15461466"checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b"
1547−"checksum doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97"
1467+"checksum doc-comment 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
15481468"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
15491469"checksum encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
15501470"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
@@ -1555,133 +1475,127 @@ dependencies = [
15551475"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
15561476"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
15571477"checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
1558−"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9"
1478+"checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd"
15591479"checksum escargot 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "74cf96bec282dcdb07099f7e31d9fed323bca9435a09aba7b6d99b7617bca96d"
1560−"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
1561−"checksum failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1"
1480+"checksum failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b"
15621481"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
1563−"checksum flate2 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "2adaffba6388640136149e18ed080b77a78611c1e1d6de75aedcdf78df5d4682"
1482+"checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42"
15641483"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
15651484"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
15661485"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
15671486"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
1568−"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571"
1569−"checksum git2 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "26e07ef27260a78f7e8d218ebac2c72f2c4db50493741b190b6e8eade1da7c68"
1487+"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb"
1488+"checksum git2 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7da16ceafe24cedd9ba02c4463a2b506b6493baf4317c79c5acb553134a3c15"
15701489"checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
1490+"checksum globset 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad1da430bd7281dde2576f44c84cc3f0f7b475e7202cd503042dff01a8c8120"
15711491"checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8"
1572−"checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114"
1492+"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
15731493"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
15741494"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
1575−"checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358"
1576−"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f"
1577−"checksum jobserver 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b1d42ef453b30b7387e113da1c83ab1605d90c5b4e0eb8e96d016ed3b8c160"
1495+"checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484"
1496+"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e"
1497+"checksum jobserver 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
15781498"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
1499+"checksum kstring 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6382df53100fd22e149030b6634720c94a151076db8d727b3274d7070975d609"
15791500"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
15801501"checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
1581−"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
1582−"checksum libgit2-sys 0.11.0+0.99.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4d5d1459353d397a029fb18862166338de938e6be976606bd056cf8f1a912ecf"
1502+"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
1503+"checksum libgit2-sys 0.12.0+0.99.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05dff41ac39e7b653f5f1550886cf00ba52f8e7f57210b633cdeedb3de5b236c"
15831504"checksum libloading 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
15841505"checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe"
15851506"checksum line-wrap 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
15861507"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
1587−"checksum liquid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cf7f28965f50ff06e2e9f26162f6d944b71f976506a7a01a6308ddebd36155"
1588−"checksum liquid-compiler 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7cd195c00674a2dc811b07969358c97c0639db4a73bc61514db48609d110356f"
1589−"checksum liquid-derive 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b0faadd0dd1a7cf38390316c36a9a741949462750f9833b794ac6d7de145218"
1590−"checksum liquid-error 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d5c0851812322e87dcf67c2d7e520c3efd8651bd44eb8d0c0246e6dfb94d481"
1591−"checksum liquid-interpreter 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "998e0411b8cb6210bb0729ccbb15abd2a1c8ef7e318c97511ae5a741c817c63e"
1592−"checksum liquid-value 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7606ac3743bff9929daff0d0f51f9177ab3ec74520f7f832b8ec595dd96efee"
1508+"checksum liquid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62b5a51d24120bc37da30a3bcd741ede7450f00e9fcb0b8648a1d25f7736bc6e"
1509+"checksum liquid-core 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3a922402825d7fd1965364e1d289f909076bcf580e5ae4a5edaf82af1fe7a9dc"
1510+"checksum liquid-derive 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e6fcb48d443dbc49c65b3e5aaecc95e6e911a28b20049d6ac2d94527543fa133"
1511+"checksum liquid-lib 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0629fbd25a919496d2e621e8a3af892bc438273d0f446eb4f0d66ce45117d15d"
15931512"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
15941513"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
15951514"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
1596−"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
1597−"checksum miniz-sys 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202"
1598−"checksum miniz_oxide 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7108aff85b876d06f22503dcce091e29f76733b2bfdd91eebce81f5e68203a10"
1599−"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945"
1515+"checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
1516+"checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5"
16001517"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
1601−"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09"
1602−"checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32"
1603−"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273"
1518+"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba"
1519+"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096"
1520+"checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b"
16041521"checksum onig 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e4e723fc996fff1aeab8f62205f3e8528bf498bdd5eadb2784d2d31f30077947"
16051522"checksum onig_sys 69.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0a8d4efbf5f59cece01f539305191485b651acb3785b9d5eef05749f0496514e"
16061523"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
16071524"checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
16081525"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
16091526"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
1610−"checksum pest 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e4fb201c5c22a55d8b24fef95f78be52738e5e1361129be1b5e862ecdb6894a"
1527+"checksum pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
16111528"checksum pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
1612−"checksum pest_generator 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9fcf299b5712d06ee128a556c94709aaa04512c4dffb8ead07c5c998447fc0"
1613−"checksum pest_meta 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df43fd99896fd72c485fe47542c7b500e4ac1e8700bf995544d1317a60ded547"
1614−"checksum pkg-config 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c1d2cfa5a714db3b5f24f0915e74fcdf91d09d496ba61329705dda7774d2af"
1529+"checksum pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
1530+"checksum pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
1531+"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
16151532"checksum plist 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a9f075f6394100e7c105ed1af73fb1859d6fd14e49d4290d578120beb167f"
1616−"checksum predicates 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "53e09015b0d3f5a0ec2d4428f7559bb7b3fff341b4e159fedd1d57fac8b939ff"
1533+"checksum predicates 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "347a1b6f0b21e636bc9872fb60b83b8e185f6f5516298b8238699f7f9a531030"
16171534"checksum predicates-core 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06075c3a3e92559ff8929e7a280684489ea27fe44805174c3ebd9328dcb37178"
16181535"checksum predicates-tree 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8e63c4859013b38a76eca2414c64911fba30def9e3202ac461a2d22831220124"
1619−"checksum proc-macro-hack 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e688f31d92ffd7c1ddc57a1b4e6d773c0f2a14ee437a4b0a4f5a69c80eb221c8"
1536+"checksum proc-macro-hack 0.5.14 (registry+https://github.com/rust-lang/crates.io-index)" = "fcfdefadc3d57ca21cf17990a28ef4c0f7c61383a28cb7604cf4a18e6ede1420"
16201537"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
1621−"checksum proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "175a40b9cf564ce9bf050654633dbf339978706b8ead1a907bb970b63185dd95"
1622−"checksum proc-quote 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fa612543f23fda013e1e6ce30b5285a9d313c6e582e57b4ceca74eb5b85685b5"
1623−"checksum proc-quote-impl 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f785f0f8cd00b7945efc3f3bdf8205eb06af5aacec598d83e67f41dc8d101fda"
1624−"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
1538+"checksum proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435"
1539+"checksum proc-quote 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d8fe0b6f6aef22a400495cdabfd44389b8d5cf71407680fe031be86e51296c85"
1540+"checksum proc-quote-impl 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "66d3ed99337a9586d312fcd7240546abd644b095a5bd1d1809d82c6ae6d16a8c"
1541+"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
16251542"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
1626−"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
1543+"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
16271544"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
16281545"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
16291546"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
1630−"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071"
16311547"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
16321548"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
1633−"checksum redox_users 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ecedbca3bf205f8d8f5c2b44d83cd0690e39ee84b951ed649e9f1841132b66d"
1634−"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
1635−"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
1549+"checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431"
1550+"checksum regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8900ebc1363efa7ea1c399ccc32daed870b4002651e0bed86e72d501ebbe0048"
1551+"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae"
16361552"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e"
1637−"checksum rust-argon2 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4ca4eaef519b494d1f2848fc602d18816fed808a981aedf4f1f00ceb7c9d32cf"
1553+"checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017"
16381554"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
1639−"checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997"
1640−"checksum safemem 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d2b08423011dae9a5ca23f07cf57dac3857f5c885d352b76f6d95f4aea9434d0"
1641−"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421"
1642−"checksum serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)" = "fec2851eb56d010dc9a21b89ca53ee75e6528bab60c11e89d38390904982da9f"
1643−"checksum serde_derive 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)" = "cb4dc18c61206b08dc98216c98faa0232f4337e1e1b8574551d5bad29ea1b425"
1644−"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"
1645−"checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68"
1555+"checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76"
1556+"checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
1557+"checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
1558+"checksum serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "e707fbbf255b8fc8c3b99abb91e7257a622caeb20a9818cbadbeeede4e0932ff"
1559+"checksum serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)" = "ac5d00fc561ba2724df6758a17de23df5914f20e41cb00f94d5b7ae42fffaff8"
1560+"checksum serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25"
1561+"checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
16461562"checksum shell-words 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a"
16471563"checksum shlex 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
1648−"checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7"
1564+"checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc"
16491565"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
1650−"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
1651−"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
1652−"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f"
1566+"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03"
16531567"checksum syntect 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "955e9da2455eea5635f7032fc3a229908e6af18c39600313866095e07db0d8b8"
16541568"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
16551569"checksum term_size 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e5b9a66db815dcfd2da92db471106457082577c3c278d4138ab3e3b4e189327"
1656−"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
1570+"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f"
16571571"checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625"
16581572"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
1659−"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
1573+"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
16601574"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
16611575"checksum treeline 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41"
16621576"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
1663−"checksum ucd-trie 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2"
1577+"checksum ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
16641578"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
1665−"checksum unicode-normalization 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426"
1666−"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9"
1579+"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4"
1580+"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
16671581"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
16681582"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
16691583"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
16701584"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
1671−"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61"
1672−"checksum vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "33dd455d0f96e90a75803cfeb7f948768c08d70a6de9a8d2362461935698bf95"
1585+"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb"
1586+"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168"
16731587"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
16741588"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
1675−"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e"
1676−"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d"
1589+"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
1590+"checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
1591+"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
16771592"checksum which 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b57acb10231b9493c8472b20cb57317d0679a49e0bdbee44b3b803a6473af164"
16781593"checksum wild 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "97d34fecce28871e5c0e059deae21ef7f7d13b98a5964b24c58b3735c8052fc8"
16791594"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
16801595"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6"
16811596"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
16821597"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1683−"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9"
1598+"checksum winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80"
16841599"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1685−"checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9"
16861600"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"
16871601"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
Cargo.toml+4−3
@@ -7,7 +7,7 @@ license = "MIT/Apache-2.0"
77name = "bat"
88readme = "README.md"
99repository = "https://github.com/sharkdp/bat"
10−version = "0.12.1"
10+version = "0.13.0"
1111exclude = [
1212 "assets/syntaxes/*",
1313 "assets/themes/*",
@@ -27,9 +27,10 @@ content_inspector = "0.2.4"
2727encoding = "0.2"
2828shell-words = "0.1.0"
2929unicode-width = "0.1.7"
30+globset = "0.4"
3031
3132[dependencies.git2]
32−version = "0.12"
33+version = "0.13"
3334default-features = false
3435features = []
3536
@@ -54,7 +55,7 @@ assert_cmd = "0.12.0"
5455
5556[build-dependencies]
5657clap = "2.33"
57−liquid = "0.19"
58+liquid = "0.20"
5859lazy_static = "1.4"
5960
6061[profile.release]
README.md+7−7
@@ -13,7 +13,7 @@
1313 <a href="#installation">Installation</a> •
1414 <a href="#customization">Customization</a> •
1515 <a href="#project-goals-and-alternatives">Project goals, alternatives</a> •
16− Translation [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="doc/README-ja.md">日本語</a>]
16+ Translation [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="doc/README-ja.md">日本語</a>][<a href="doc/README-ko.md">한국어</a>]
1717</p>
1818
1919### Syntax highlighting
@@ -180,7 +180,7 @@ apt install bat
180180If you want to run the latest release of bat or if you are on older versions of Ubuntu/Debian, download the latest `.deb` package from the [release page](https://github.com/sharkdp/bat/releases)
181181and install it via:
182182```bash
183−sudo dpkg -i bat_0.12.1_amd64.deb # adapt version number and architecture
183+sudo dpkg -i bat_0.13.0_amd64.deb # adapt version number and architecture
184184```
185185
186186### On Alpine Linux
@@ -341,7 +341,7 @@ binaries are also available: look for archives with `musl` in the file name.
341341
342342### From source
343343
344−If you want to build `bat` from source, you need Rust 1.36 or
344+If you want to build `bat` from source, you need Rust 1.37 or
345345higher. You can then use `cargo` to build everything:
346346
347347```bash
@@ -500,11 +500,11 @@ Example configuration file:
500500# Use italic text on the terminal (not supported on all terminals)
501501--italic-text=always
502502
503−# Use C++ syntax (instead of C) for .h header files
504−--map-syntax h:cpp
503+# Use C++ syntax for .ino files
504+--map-syntax "*.ino:C++"
505505
506−# Use "gitignore" highlighting for ".ignore" files
507−--map-syntax .ignore:.gitignore
506+# Use ".gitignore"-style highlighting for ".ignore" files
507+--map-syntax ".ignore:Git Ignore"
508508```
509509
510510## Using `bat` on Windows
assets/JavaDoc.sublime-syntax.patch+3−3
@@ -1,7 +1,7 @@
1−diff --git syntaxes/Packages/Java/JavaDoc.sublime-syntax syntaxes/Packages/Java/JavaDoc.sublime-syntax
1+diff --git syntaxes/01_Packages/Java/JavaDoc.sublime-syntax syntaxes/01_Packages/Java/JavaDoc.sublime-syntax
22index 422a6a9..40a741e 100644
3−--- syntaxes/Packages/Java/JavaDoc.sublime-syntax
4−+++ syntaxes/Packages/Java/JavaDoc.sublime-syntax
3+--- syntaxes/01_Packages/Java/JavaDoc.sublime-syntax
4++++ syntaxes/01_Packages/Java/JavaDoc.sublime-syntax
55@@ -13,7 +13,7 @@ variables:
66 contexts:
77 prototype:
assets/create.sh+1−1
@@ -44,7 +44,7 @@ bat cache --clear
4444
4545# TODO: Remove this (and the reverse part below) when
4646# https://github.com/trishume/syntect/issues/222 has been fixed
47−JAVADOC_FILE="${ASSET_DIR}/syntaxes/Packages/Java/JavaDoc.sublime-syntax"
47+JAVADOC_FILE="${ASSET_DIR}/syntaxes/01_Packages/Java/JavaDoc.sublime-syntax"
4848JAVADOC_PATCH="${ASSET_DIR}/JavaDoc.sublime-syntax.patch"
4949patch "$JAVADOC_FILE" "$JAVADOC_PATCH"
5050
assets/manual/bat.1.in+79−66
@@ -1,18 +1,23 @@
11.TH {{PROJECT_EXECUTABLE | upcase}} "1"
22.SH NAME
3−{{PROJECT_EXECUTABLE}} \- manual page for {{PROJECT_NAME}}
4−.SH DESCRIPTION
5−{{PROJECT_EXECUTABLE}} - a cat(1) clone with syntax highlighting and Git integration.
3+{{PROJECT_EXECUTABLE}} \- a cat(1) clone with syntax highlighting and Git integration.
64.SH "USAGE"
7−.IP
8−{{PROJECT_EXECUTABLE}} [OPTIONS] [FILE]...
9−.IP
10−{{PROJECT_EXECUTABLE}} <SUBCOMMAND>
5+.IP "{{PROJECT_EXECUTABLE}} [OPTIONS] [FILE]..."
6+.IP "{{PROJECT_EXECUTABLE}} cache [CACHE-OPTIONS] [--build|--clear]
7+.SH DESCRIPTION
8+{{PROJECT_EXECUTABLE}} prints the syntax-highlighted content of a collection of FILEs to the
9+terminal. If no FILE is specified, or when FILE is '-', it reads from standard input.
10+
11+{{PROJECT_EXECUTABLE}} supports a large number of programming and markup languages.
12+It also communicates with git(1) to show modifications with respect to the git index.
13+{{PROJECT_EXECUTABLE}} automatically pipes its output through a pager (by default: less).
14+
15+Whenever the output of {{PROJECT_EXECUTABLE}} goes to a non-interactive terminal, i.e. when the
16+output is piped into another process or into a file, {{PROJECT_EXECUTABLE}} will act as a drop-in
17+replacement for cat(1) and fall back to printing the plain file contents.
18+
1119.SH "OPTIONS"
12−.HP
13−General remarks
14−.IP
15−Command-line options like '-l'/'--language' that take values can be specified as
20+General remarks: Command-line options like '-l'/'--language' that take values can be specified as
1621either '--language value', '--language=value', '-l value' or '-lvalue'.
1722.HP
1823\fB\-A\fR, \fB\-\-show\-all\fR
@@ -33,78 +38,80 @@ specified as a name (like 'C++' or 'LaTeX') or possible file extension
3338(like 'cpp', 'hpp' or 'md'). Use '\-\-list\-languages' to show all supported
3439language names and file extensions.
3540.HP
36−\fB\-H\fR, \fB\-\-highlight\-line\fR <N>...
41+\fB\-H\fR, \fB\-\-highlight\-line\fR <N:M>...
3742.IP
38−Highlight the N\-th line with a different background color
43+Highlight the specified line ranges with a different background color For example:
44+.RS
45+.IP "\-\-highlight\-line 40"
46+highlights line 40
47+.IP "\-\-highlight\-line 30:40"
48+highlights lines 30 to 40
49+.IP "\-\-highlight\-line :40"
50+highlights lines 1 to 40
51+.IP "\-\-highlight\-line 40:"
52+highlights lines 40 to the end of the file
53+.RE
3954.HP
4055\fB\-\-tabs\fR <T>
4156.IP
42−Set the tab width to T spaces. Use a width of 0 to pass tabs through
43−directly
57+Set the tab width to T spaces. Use a width of 0 to pass tabs through directly
4458.HP
4559\fB\-\-wrap\fR <mode>
4660.IP
47−Specify the text\-wrapping mode (*auto*, never, character). The
48−\&'\-\-terminal\-width' option can be used in addition to control the output
49−width.
61+Specify the text\-wrapping mode (*auto*, never, character). The '\-\-terminal\-width' option
62+can be used in addition to control the output width.
5063.HP
5164\fB\-\-terminal\-width\fR <width>
5265.IP
53−Explicitly set the width of the terminal instead of determining it
54−automatically. If prefixed with '+' or '\-', the value will be treated as
55−an offset to the actual terminal width. See also: '\-\-wrap'.
66+Explicitly set the width of the terminal instead of determining it automatically. If
67+prefixed with '+' or '\-', the value will be treated as an offset to the actual terminal
68+width. See also: '\-\-wrap'.
5669.HP
5770\fB\-n\fR, \fB\-\-number\fR
5871.IP
59−Only show line numbers, no other decorations. This is an alias for
60−\&'\-\-style=numbers'
72+Only show line numbers, no other decorations. This is an alias for '\-\-style=numbers'
6173.HP
6274\fB\-\-color\fR <when>
6375.IP
64−Specify when to use colored output. The automatic mode only enables colors
65−if an interactive terminal is detected. Possible values: *auto*, never,
66−always.
76+Specify when to use colored output. The automatic mode only enables colors if an
77+interactive terminal is detected. Possible values: *auto*, never, always.
6778.HP
6879\fB\-\-italic\-text\fR <when>
6980.IP
70−Specify when to use ANSI sequences for italic text in the output. Possible
71−values: always, *never*.
81+Specify when to use ANSI sequences for italic text in the output. Possible values:
82+always, *never*.
7283.HP
7384\fB\-\-decorations\fR <when>
7485.IP
75−Specify when to use the decorations that have been specified via
76−\&'\-\-style'. The automatic mode only enables decorations if an interactive
77−terminal is detected. Possible values: *auto*, never, always.
86+Specify when to use the decorations that have been specified via '\-\-style'. The
87+automatic mode only enables decorations if an interactive terminal is detected. Possible
88+values: *auto*, never, always.
7889.HP
7990\fB\-\-paging\fR <when>
8091.IP
81−Specify when to use the pager. To control which pager is used, set the
82−PAGER or BAT_PAGER environment variables (the latter takes precedence) or
83−use the '\-\-pager' option. To disable the pager permanently, set BAT_PAGER
84−to an empty string or set '\-\-paging=never' in the configuration file.
85−Possible values: *auto*, never, always.
92+Specify when to use the pager. To control which pager is used, set the PAGER or
93+BAT_PAGER environment variables (the latter takes precedence) or use the '\-\-pager'
94+option. To disable the pager permanently, set BAT_PAGER to an empty string or set
95+\&'\-\-paging=never' in the configuration file. Possible values: *auto*, never, always.
8696.HP
8797\fB\-\-pager\fR <command>
8898.IP
89−Determine which pager is used. This option will overwrite the PAGER and
90−BAT_PAGER environment variables. The default pager is 'less'. To disable
91−the pager completely, use the '\-\-paging' option. Example: '\-\-pager "less
92−\fB\-RF\fR"'.
99+Determine which pager is used. This option will overwrite the PAGER and BAT_PAGER
100+environment variables. The default pager is 'less'. To disable the pager completely, use
101+the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'.
93102.HP
94−\fB\-m\fR, \fB\-\-map\-syntax\fR <from:to>...
103+\fB\-m\fR, \fB\-\-map\-syntax\fR <glob-pattern:syntax-name>...
95104.IP
96−Map a file extension or file name to an existing syntax (specified by a
97−file extension or file name). For example, to
98−highlight *.build files with the Python syntax, use '\-m build:py'. To
99−highlight files named '.myignore' with the Git Ignore syntax, use '\-m
100−\&.myignore:gitignore'.
105+Map a glob pattern to an existing syntax name. The glob pattern is matched on the full
106+path and the filename. For example, to highlight *.build files with the Python syntax,
107+use -m '*.build:Python'. To highlight files named '.myignore' with the Git Ignore
108+syntax, use -m '.myignore:Git Ignore'.
101109.HP
102110\fB\-\-theme\fR <theme>
103111.IP
104−Set the theme for syntax highlighting. Use '\-\-list\-themes' to see all
105−available themes. To set a default theme, add the '\-\-theme="..."' option
106−to the configuration file or export the BAT_THEME environment variable
107−(e.g.: export BAT_THEME="...").
112+Set the theme for syntax highlighting. Use '\-\-list\-themes' to see all available themes.
113+To set a default theme, add the '\-\-theme="..."' option to the configuration file or
114+export the BAT_THEME environment variable (e.g.: export BAT_THEME="...").
108115.HP
109116\fB\-\-list\-themes\fR
110117.IP
@@ -112,12 +119,11 @@ Display a list of supported themes for syntax highlighting.
112119.HP
113120\fB\-\-style\fR <style\-components>
114121.IP
115−Configure which elements (line numbers, file headers, grid borders, Git
116−modifications, ..) to display in addition to the file contents. The
117−argument is a comma\-separated list of components to display (e.g.
118−\&'numbers,changes,grid') or a pre\-defined style ('full'). To set a default
119−style, add the '\-\-style=".."' option to the configuration file or export
120−the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
122+Configure which elements (line numbers, file headers, grid borders, Git modifications,
123+\&..) to display in addition to the file contents. The argument is a comma\-separated list
124+of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full').
125+To set a default style, add the '\-\-style=".."' option to the configuration file or
126+export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible
121127values: *auto*, full, plain, changes, header, grid, numbers, snip.
122128.HP
123129\fB\-r\fR, \fB\-\-line\-range\fR <N:M>...
@@ -138,8 +144,8 @@ Display a list of supported languages for syntax highlighting.
138144.HP
139145\fB\-u\fR, \fB\-\-unbuffered\fR
140146.IP
141−This option exists for POSIX\-compliance reasons ('u' is for 'unbuffered').
142−The output is always unbuffered \- this option is simply ignored.
147+This option exists for POSIX\-compliance reasons ('u' is for 'unbuffered'). The output is
148+always unbuffered \- this option is simply ignored.
143149.HP
144150\fB\-h\fR, \fB\-\-help\fR
145151.IP
@@ -148,13 +154,20 @@ Print this help message.
148154\fB\-V\fR, \fB\-\-version\fR
149155.IP
150156Show version information.
151−.SH "ARGS"
152−.IP
153−<FILE>...
157+.SH "POSITIONAL ARGUMENTS"
158+.HP
159+\fB<FILE>...\fR
154160.IP
155−File(s) to print / concatenate. Use a dash ('\-') or no argument at all to read
156−from standard input.
161+Files to print and concatenate. Use a dash ('\-') or no argument at all to read from
162+standard input.
157163.SH "SUBCOMMANDS"
158−.IP
159−cache
160−Modify the syntax\-definition and theme cache
164+.HP
165+\fBcache\fR - Modify the syntax\-definition and theme cache.
166+.SH "FILES"
167+{{PROJECT_EXECUTABLE}} can also be customized with a configuration file. The location of the file
168+is dependent on your operating system. To get the default path for your system, call:
169+
170+\fB{{PROJECT_EXECUTABLE}} --config-file\fR
171+
172+Alternatively, you can use the BAT_CONFIG_PATH environment variable to point bat to a non-default
173+location of the configuration file.
assets/syntaxes.bin

Binary file not shown.

assets/syntaxes/Packages → assets/syntaxes/01_Packagesrenamed

The content is the same.

assets/syntaxes/AWK → assets/syntaxes/02_Extra/AWKrenamed

The content is the same.

assets/syntaxes/AsciiDoc → assets/syntaxes/02_Extra/AsciiDocrenamed

The content is the same.

assets/syntaxes/AsciiDoc.sublime-syntax → assets/syntaxes/02_Extra/AsciiDoc.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Assembly (ARM) → assets/syntaxes/02_Extra/Assembly (ARM)renamed

The content is the same.

assets/syntaxes/Assembly (ARM).sublime-syntax → assets/syntaxes/02_Extra/Assembly (ARM).sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Assembly (x86_64).sublime-syntax → assets/syntaxes/02_Extra/Assembly (x86_64).sublime-syntaxrenamed

The content is the same.

assets/syntaxes/CMake → assets/syntaxes/02_Extra/CMakerenamed

The content is the same.

assets/syntaxes/CSV → assets/syntaxes/02_Extra/CSVrenamed

The content is the same.

assets/syntaxes/CSV.sublime-syntax → assets/syntaxes/02_Extra/CSV.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Cabal → assets/syntaxes/02_Extra/Cabalrenamed

The content is the same.

assets/syntaxes/Cabal.sublime-syntax → assets/syntaxes/02_Extra/Cabal.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/CoffeeScript → assets/syntaxes/02_Extra/CoffeeScriptrenamed

The content is the same.

assets/syntaxes/CoffeeScript.sublime-syntax → assets/syntaxes/02_Extra/CoffeeScript.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/CpuInfo.sublime-syntax → assets/syntaxes/02_Extra/CpuInfo.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Crystal → assets/syntaxes/02_Extra/Crystalrenamed

The content is the same.

assets/syntaxes/Crystal.sublime-syntax → assets/syntaxes/02_Extra/Crystal.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Dart → assets/syntaxes/02_Extra/Dartrenamed

The content is the same.

assets/syntaxes/Dart.sublime-syntax → assets/syntaxes/02_Extra/Dart.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Docker → assets/syntaxes/02_Extra/Dockerrenamed

The content is the same.

assets/syntaxes/DotENV → assets/syntaxes/02_Extra/DotENVrenamed

The content is the same.

assets/syntaxes/DotENV.sublime-syntax → assets/syntaxes/02_Extra/DotENV.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Elixir → assets/syntaxes/02_Extra/Elixirrenamed

The content is the same.

assets/syntaxes/Elm → assets/syntaxes/02_Extra/Elmrenamed

The content is the same.

assets/syntaxes/FSharp → assets/syntaxes/02_Extra/FSharprenamed

The content is the same.

assets/syntaxes/Fish → assets/syntaxes/02_Extra/Fishrenamed

The content is the same.

assets/syntaxes/Fstab.sublime-syntax → assets/syntaxes/02_Extra/Fstab.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/GraphQL → assets/syntaxes/02_Extra/GraphQLrenamed

The content is the same.

assets/syntaxes/Group.sublime-syntax → assets/syntaxes/02_Extra/Group.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/HTML (Twig) → assets/syntaxes/02_Extra/HTML (Twig)renamed

The content is the same.

assets/syntaxes/HTML (Twig).sublime-syntax → assets/syntaxes/02_Extra/HTML (Twig).sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Hosts.sublime-syntax → assets/syntaxes/02_Extra/Hosts.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/INI → assets/syntaxes/02_Extra/INIrenamed

The content is the same.

assets/syntaxes/INI.sublime-syntax → assets/syntaxes/02_Extra/INI.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/JavaScript (Babel) → assets/syntaxes/02_Extra/JavaScript (Babel)renamed

The content is the same.

assets/syntaxes/JavaScript (Babel).sublime-syntax → assets/syntaxes/02_Extra/JavaScript (Babel).sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Jinja2 → assets/syntaxes/02_Extra/Jinja2renamed

The content is the same.

assets/syntaxes/Jsonnet → assets/syntaxes/02_Extra/Jsonnetrenamed

The content is the same.

assets/syntaxes/Julia → assets/syntaxes/02_Extra/Juliarenamed

The content is the same.

assets/syntaxes/Kotlin → assets/syntaxes/02_Extra/Kotlinrenamed

The content is the same.

assets/syntaxes/Kotlin.sublime-syntax → assets/syntaxes/02_Extra/Kotlin.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/LESS → assets/syntaxes/02_Extra/LESSrenamed

The content is the same.

assets/syntaxes/Manpage.sublime-syntax → assets/syntaxes/02_Extra/Manpage.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/MemInfo.sublime-syntax → assets/syntaxes/02_Extra/MemInfo.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Nim.sublime-syntax → assets/syntaxes/02_Extra/Nim.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Nix → assets/syntaxes/02_Extra/Nixrenamed

The content is the same.

assets/syntaxes/Nix.sublime-syntax → assets/syntaxes/02_Extra/Nix.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Org mode → assets/syntaxes/02_Extra/Org moderenamed

The content is the same.

assets/syntaxes/Org mode.sublime-syntax → assets/syntaxes/02_Extra/Org mode.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Passwd.sublime-syntax → assets/syntaxes/02_Extra/Passwd.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/PowerShell → assets/syntaxes/02_Extra/PowerShellrenamed

The content is the same.

assets/syntaxes/PowerShell.sublime-syntax → assets/syntaxes/02_Extra/PowerShell.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Protobuf → assets/syntaxes/02_Extra/Protobufrenamed

The content is the same.

assets/syntaxes/Puppet → assets/syntaxes/02_Extra/Puppetrenamed

The content is the same.

assets/syntaxes/PureScript → assets/syntaxes/02_Extra/PureScriptrenamed

The content is the same.

assets/syntaxes/Resolv.sublime-syntax → assets/syntaxes/02_Extra/Resolv.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Robot → assets/syntaxes/02_Extra/Robotrenamed

The content is the same.

assets/syntaxes/Robot.sublime-syntax → assets/syntaxes/02_Extra/Robot.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/SCSS_Sass → assets/syntaxes/02_Extra/SCSS_Sassrenamed

The content is the same.

assets/syntaxes/SLS → assets/syntaxes/02_Extra/SLSrenamed

The content is the same.

assets/syntaxes/Strace → assets/syntaxes/02_Extra/Stracerenamed

The content is the same.

assets/syntaxes/Swift → assets/syntaxes/02_Extra/Swiftrenamed

The content is the same.

assets/syntaxes/Swift.sublime-syntax → assets/syntaxes/02_Extra/Swift.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Syslog → assets/syntaxes/02_Extra/Syslogrenamed

The content is the same.

assets/syntaxes/TOML → assets/syntaxes/02_Extra/TOMLrenamed

The content is the same.

assets/syntaxes/Terraform → assets/syntaxes/02_Extra/Terraformrenamed

The content is the same.

assets/syntaxes/TypeScript → assets/syntaxes/02_Extra/TypeScriptrenamed

The content is the same.

assets/syntaxes/TypeScript.sublime-syntax → assets/syntaxes/02_Extra/TypeScript.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/TypsecriptReact.sublime-syntax → assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Verilog → assets/syntaxes/02_Extra/Verilogrenamed

The content is the same.

assets/syntaxes/Verilog.sublime-syntax → assets/syntaxes/02_Extra/Verilog.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/VimL → assets/syntaxes/02_Extra/VimLrenamed

The content is the same.

assets/syntaxes/VimL.sublime-syntax → assets/syntaxes/02_Extra/VimL.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/Vue → assets/syntaxes/02_Extra/Vuerenamed

The content is the same.

assets/syntaxes/hosts → assets/syntaxes/02_Extra/hostsrenamed

The content is the same.

assets/syntaxes/requirementstxt → assets/syntaxes/02_Extra/requirementstxtrenamed

The content is the same.

assets/syntaxes/requirementstxt.sublime-syntax → assets/syntaxes/02_Extra/requirementstxt.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/show-nonprintable.sublime-syntax → assets/syntaxes/02_Extra/show-nonprintable.sublime-syntaxrenamed

The content is the same.

assets/syntaxes/ssh-config → assets/syntaxes/02_Extra/ssh-configrenamed

The content is the same.

assets/syntaxes/varlink → assets/syntaxes/02_Extra/varlinkrenamed

The content is the same.

assets/syntaxes/FSharp.sublime-syntaxdeleted−672
@@ -1,672 +0,0 @@
1−%YAML 1.2
2−---
3−# http://www.sublimetext.com/docs/3/syntax.html
4−name: "F#"
5−file_extensions:
6− - fs
7− - fsi
8− - fsx
9−scope: source.fsharp
10−contexts:
11− main:
12− - include: compiler_directives
13− - include: comments
14− - include: constants
15− - include: strings
16− - include: chars
17− - include: double_tick
18− - include: definition
19− - include: abstract_definition
20− - include: attributes
21− - include: modules
22− - include: anonymous_functions
23− - include: du_declaration
24− - include: record_declaration
25− - include: records
26− - include: strp_inlined
27− - include: keywords
28− - include: cexprs
29− - include: text
30− abstract_definition:
31− - match: '\b(abstract)\s+(member)?(\s+\[\<.*\>\])?\s*([_[:alpha:]0-9,\._`\s]+)(:)'
32− captures:
33− 1: keyword.fsharp
34− 2: keyword.fsharp
35− 3: support.function.attribute.fsharp
36− 5: keyword.fsharp
37− push:
38− - meta_scope: abstract.definition.fsharp
39− - match: \s*(with)\b|=|$
40− captures:
41− 1: keyword.fsharp
42− pop: true
43− - include: comments
44− - include: common_declaration
45− - match: '(\?{0,1})([[:alpha:]0-9''`^._ ]+)\s*(:)(\s*([[:alpha:]0-9''`^._ ]+)){0,1}'
46− captures:
47− 1: keyword.symbol.fsharp
48− 2: variable.parameter.fsharp
49− 3: keyword.symbol.fsharp
50− 4: entity.name.type.fsharp
51− - match: '(?!with|get|set\b)\b([\w0-9''`^._]+)'
52− captures:
53− 1: entity.name.type.fsharp
54− - include: keywords
55− anonymous_functions:
56− - match: \b(fun)\b
57− captures:
58− 1: keyword.fsharp
59− push:
60− - meta_scope: function.anonymous
61− - match: (->)
62− captures:
63− 1: keyword.fsharp
64− pop: true
65− - include: comments
66− - match: (\()
67− captures:
68− 1: keyword.symbol.fsharp
69− push:
70− - match: \s*(?=(->))
71− captures:
72− 1: keyword.symbol.fsharp
73− pop: true
74− - include: member_declaration
75− - include: variables
76− attributes:
77− - match: '\[\<'
78− push:
79− - meta_scope: support.function.attribute.fsharp
80− - match: '\>\]|\]'
81− pop: true
82− - include: main
83− cexprs:
84− - match: '\b(async|seq|promise|task|maybe|asyncMaybe|controller|scope|application|pipeline)\s*\{'
85− scope: cexpr.fsharp
86− captures:
87− 0: keyword.fsharp
88− chars:
89− - match: ('\\?.')
90− scope: char.fsharp
91− captures:
92− 1: string.quoted.single.fsharp
93− comments:
94− - match: (\(\*(?!\)))
95− captures:
96− 1: comment.block.fsharp
97− push:
98− - meta_scope: comment.block.fsharp
99− - match: (\*\))
100− captures:
101− 1: comment.block.fsharp
102− pop: true
103− - match: //.*$
104− scope: comment.line.double-slash.fsharp
105− common_binding_definition:
106− - include: comments
107− - include: attributes
108− - match: (:)\s*(\()\s*(static member|member)
109− captures:
110− 1: keyword.symbol.fsharp
111− 2: keyword.symbol.fsharp
112− 3: keyword.fsharp
113− push:
114− - match: (\))\s*((?=,)|(?=\=))
115− captures:
116− 1: keyword.symbol.fsharp
117− pop: true
118− - match: '(\^[[:alpha:]0-9''._]+)'
119− captures:
120− 1: entity.name.type.fsharp
121− - include: variables
122− - include: keywords
123− - match: (:)\s*(\()
124− captures:
125− 1: keyword.symbol.fsharp
126− 2: keyword.symbol.fsharp
127− push:
128− - match: '(\)\s*(([?[:alpha:]0-9''`^._ ]*)))'
129− captures:
130− 1: keyword.symbol.fsharp
131− 2: entity.name.type.fsharp
132− pop: true
133− - include: tuple_signature
134− - match: '(:)\s*(\^[[:alpha:]0-9''._]+)\s*(when)'
135− captures:
136− 1: keyword.symbol.fsharp
137− 2: entity.name.type.fsharp
138− 3: keyword.fsharp
139− push:
140− - match: (?=:)
141− captures:
142− 1: keyword.symbol.fsharp
143− pop: true
144− - match: \b(and|when|or)\b
145− scope: keyword.fsharp
146− - match: "([[:alpha:]0-9'^._]+)"
147− comment: Because we first capture the keywords, we can capture what looks like a word and assume it's an entity definition
148− captures:
149− 1: entity.name.type.fsharp
150− - match: (\(|\))
151− scope: keyword.symbol.fsharp
152− - match: '(:)\s*([?[:alpha:]0-9''`^._ ]+)'
153− captures:
154− 1: keyword.symbol.fsharp
155− 2: entity.name.type.fsharp
156− - match: '(->)\s*(\()?\s*([?[:alpha:]0-9''`^._ ]+)*'
157− captures:
158− 1: keyword.symbol.fsharp
159− 2: keyword.symbol.fsharp
160− 3: entity.name.type.fsharp
161− - match: (\*)\s*(\()
162− captures:
163− 1: keyword.symbol.fsharp
164− 2: keyword.symbol.fsharp
165− push:
166− - match: '(\)\s*(([?[:alpha:]0-9''`^._ ]+))+)'
167− captures:
168− 1: keyword.symbol.fsharp
169− 2: entity.name.type.fsharp
170− pop: true
171− - include: tuple_signature
172− - match: '(\*)(\s*([?[:alpha:]0-9''`^._ ]+))*'
173− captures:
174− 1: keyword.symbol.fsharp
175− 2: entity.name.type.fsharp
176− - match: '(<(?![[:space:]]*\)))'
177− captures:
178− 1: keyword.symbol.fsharp
179− push:
180− - match: ((?<!:)>)
181− captures:
182− 1: keyword.symbol.fsharp
183− pop: true
184− - include: generic_declaration
185− - match: "({)"
186− captures:
187− 1: keyword.symbol.fsharp
188− push:
189− - match: "(})"
190− captures:
191− 1: keyword.symbol.fsharp
192− pop: true
193− - include: record_signature
194− - include: definition
195− - include: variables
196− - include: keywords
197− common_declaration:
198− - match: '\s*(->)\s*([[:alpha:]0-9''`^._ ]+)(<)'
199− captures:
200− 1: keyword.symbol.fsharp
201− 2: entity.name.type.fsharp
202− 3: keyword.symbol.fsharp
203− push:
204− - match: (>)
205− captures:
206− 1: keyword.symbol.fsharp
207− pop: true
208− - match: "([[:alpha:]0-9'`^._ ]+)"
209− captures:
210− 1: entity.name.type.fsharp
211− - include: keywords
212− - match: '\s*(->)\s*(?!with|get|set\b)\b([\w0-9''`^._]+)'
213− captures:
214− 1: keyword.symbol.fsharp
215− 2: entity.name.type.fsharp
216− - match: '(\?{0,1})([[:alpha:]0-9''`^._ ]+)\s*(:)(\s*([?[:alpha:]0-9''`^._ ]+)(<))'
217− captures:
218− 1: keyword.symbol.fsharp
219− 2: variable.parameter.fsharp
220− 3: keyword.symbol.fsharp
221− 4: keyword.symbol.fsharp
222− 5: entity.name.type.fsharp
223− push:
224− - match: (>)
225− captures:
226− 1: keyword.symbol.fsharp
227− pop: true
228− - match: "([[:alpha:]0-9'`^._ ]+)"
229− captures:
230− 1: entity.name.type.fsharp
231− - include: keywords
232− compiler_directives:
233− - match: \s?(#if|#elif|#else|#elseif|#endif|#light|#nowarn)
234− scope: compiler_directive.fsharp
235− captures:
236− constants:
237− - match: \(\)
238− scope: constant.language.unit.fsharp
239− - match: '\b-?[0-9][0-9_]*((\.([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))'
240− scope: constant.numeric.floating-point.fsharp
241− - match: '\b(-?((0(x|X)[0-9a-fA-F][0-9a-fA-F_]*)|(0(o|O)[0-7][0-7_]*)|(0(b|B)[01][01_]*)|([0-9][0-9_]*)))'
242− scope: constant.numeric.integer.nativeint.fsharp
243− - match: \b(true|false|null|unit)\b
244− scope: constant.others.fsharp
245− definition:
246− - match: '\b(let mutable|static let mutable|let inline|let|member val|static member inline|static member|default|member|override|let!)(\s+rec|mutable)?(\s+\[\<.*\>\])?\s*(private|internal|public)?\s+(\[[^-=]*\]|[_[:alpha:]]([_[:alpha:]0-9,\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9,\._`\s]+|(?<=,)\s)*)?'
247− captures:
248− 1: keyword.fsharp
249− 2: keyword.fsharp
250− 3: support.function.attribute.fsharp
251− 4: keyword.fsharp
252− 5: variable.fsharp
253− push:
254− - meta_scope: binding.fsharp
255− - match: \s*(with\b|=|\n+=|(?<=\=))
256− captures:
257− 1: keyword.fsharp
258− pop: true
259− - include: common_binding_definition
260− - match: '\b(static val mutable|val mutable|val)(\s+rec|mutable)?(\s+\[\<.*\>\])?\s*(private|internal|public)?\s+(\[[^-=]*\]|[_[:alpha:]]([_[:alpha:]0-9,\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9,\._`\s]+|(?<=,)\s)*)?'
261− captures:
262− 1: keyword.fsharp
263− 2: keyword.fsharp
264− 3: support.function.attribute.fsharp
265− 4: keyword.fsharp
266− 5: variable.fsharp
267− push:
268− - meta_scope: binding.fsharp
269− - match: \n$
270− pop: true
271− - include: common_binding_definition
272− double_tick:
273− - match: (``)(.*)(``)
274− scope: variable.other.binding.fsharp
275− captures:
276− 1: string.quoted.single.fsharp
277− 2: variable.other.binding.fsharp
278− 3: string.quoted.single.fsharp
279− du_declaration:
280− - match: \b(of)\b
281− captures:
282− 1: keyword.fsharp
283− push:
284− - meta_scope: du_declaration.fsharp
285− - match: $|(\|)
286− captures:
287− 1: keyword.symbol.fsharp
288− pop: true
289− - include: comments
290− - match: '([[:alpha:]0-9''`<>^._]+|``[[:alpha:]0-9'' <>^._]+``)\s*(:)\s*([[:alpha:]0-9''`<>^._]+|``[[:alpha:]0-9'' <>^._]+``)'
291− captures:
292− 1: variable.parameter.fsharp
293− 2: keyword.symbol.fsharp
294− 3: entity.name.type.fsharp
295− - match: "([[:alpha:]0-9'`^._]+)|``([[:alpha:]0-9'^._ ]+)``"
296− captures:
297− 1: entity.name.type.fsharp
298− - include: keywords
299− generic_declaration:
300− - match: (:)\s*(\()\s*(static member|member)
301− captures:
302− 1: keyword.symbol.fsharp
303− 2: keyword.symbol.fsharp
304− 3: keyword.fsharp
305− push:
306− - match: (\))
307− captures:
308− 1: keyword.symbol.fsharp
309− pop: true
310− - match: (\()
311− captures:
312− 1: keyword.symbol.fsharp
313− push:
314− - match: (\))
315− captures:
316− 1: keyword.symbol.fsharp
317− pop: true
318− - include: member_declaration
319− - match: '((''|\^)[[:alpha:]0-9''._]+)'
320− captures:
321− 1: entity.name.type.fsharp
322− - include: variables
323− - include: keywords
324− - match: \b(private|to|public|internal|function|yield!|yield|class|exception|match|delegate|of|new|in|as|if|then|else|elif|for|begin|end|inherit|do|let\!|return\!|return|interface|with|abstract|property|union|enum|member|try|finally|and|when|use|use\!|struct|while|mutable)(?!')\b
325− scope: keyword.fsharp
326− - match: ":"
327− scope: keyword.fsharp
328− - include: constants
329− - match: '((''|\^)[[:alpha:]0-9''._]+)'
330− captures:
331− 1: entity.name.type.fsharp
332− - match: (<)
333− captures:
334− 1: keyword.symbol.fsharp
335− push:
336− - match: (>)
337− captures:
338− 1: keyword.symbol.fsharp
339− pop: true
340− - match: '((''|\^)[[:alpha:]0-9''._]+)'
341− captures:
342− 1: entity.name.type.fsharp
343− - include: tuple_signature
344− - include: generic_declaration
345− - match: '(?!when|and|or\b)\b([\w0-9''`^._]+)'
346− captures:
347− 1: entity.name.type.fsharp
348− - match: (\|)
349− captures:
350− 1: keyword.symbol.fsharp
351− - include: keywords
352− keywords:
353− - match: \b(private|to|public|internal|function|yield!|yield|class|exception|match|delegate|of|new|in|as|if|then|else|elif|for|begin|end|inherit|do|let\!|return\!|return|interface|with|abstract|property|union|enum|member|try|finally|and|when|or|use|use\!|struct|while|mutable)(?!')\b
354− scope: keyword.fsharp
355− - match: '(&&&|\|\|\||\^\^\^|~~~|<<<|>>>|\|>|\->|\<\-|:>|:\?>|:|\[|\]|\;|<>|=|@|\|\||&&|{|}|\||_|\.\.|\,|\+|\-|\*|\/|\^|\!|\>|\>\=|\>\>|\<|\<\=|\(|\)|\<\<)'
356− scope: keyword.symbol.fsharp
357− member_declaration:
358− - include: comments
359− - include: common_declaration
360− - match: (:)\s*(\()\s*(static member|member)
361− captures:
362− 1: keyword.symbol.fsharp
363− 2: keyword.symbol.fsharp
364− 3: keyword.fsharp
365− push:
366− - match: (\))\s*((?=,)|(?=\=))
367− captures:
368− 1: keyword.symbol.fsharp
369− pop: true
370− - match: (\()
371− captures:
372− 1: keyword.symbol.fsharp
373− push:
374− - match: (\))
375− captures:
376− 1: keyword.symbol.fsharp
377− pop: true
378− - include: member_declaration
379− - match: '(\^[[:alpha:]0-9''._]+)'
380− captures:
381− 1: entity.name.type.fsharp
382− - include: variables
383− - include: keywords
384− - match: '(\^[[:alpha:]0-9''._]+)'
385− captures:
386− 1: entity.name.type.fsharp
387− - match: \b(and|when|or)\b
388− scope: keyword.fsharp
389− - match: (\(|\))
390− scope: keyword.symbol.fsharp
391− - match: '(\?{0,1})([[:alpha:]0-9''`^._]+|``[[:alpha:]0-9''`^:,._ ]+``)\s*(:{0,1})(\s*([?[:alpha:]0-9''`<>._ ]+)){0,1}'
392− captures:
393− 1: keyword.symbol.fsharp
394− 2: variable.parameter.fsharp
395− 3: keyword.symbol.fsharp
396− 4: entity.name.type.fsharp
397− - include: keywords
398− modules:
399− - match: '\b(namespace|module)\s*(public|internal|private)?\s+([[:alpha:]][[:alpha:]0-9''_. ]*)'
400− captures:
401− 1: keyword.fsharp
402− 2: keyword.fsharp
403− 3: entity.name.section.fsharp
404− push:
405− - meta_scope: entity.name.section.fsharp
406− - match: (\s?=|\s|$)
407− captures:
408− 1: keyword.symbol.fsharp
409− pop: true
410− - match: '(\.)([A-Z][[:alpha:]0-9''_]*)'
411− scope: entity.name.section.fsharp
412− captures:
413− 1: punctuation.separator.namespace-reference.fsharp
414− 2: entity.name.section.fsharp
415− - match: '\b(open)\s+([[:alpha:]][[:alpha:]0-9''_]*)(?=(\.[A-Z][[:alpha:]0-9_]*)*)'
416− captures:
417− 1: keyword.fsharp
418− 2: entity.name.section.fsharp
419− push:
420− - meta_scope: namespace.open.fsharp
421− - match: (\s|$)
422− pop: true
423− - match: '(\.)([[:alpha:]][[:alpha:]0-9''_]*)'
424− scope: entity.name.section.fsharp
425− captures:
426− 1: punctuation.separator.namespace-reference.fsharp
427− 2: entity.name.section.fsharp
428− - match: '^\s*(module)\s+([A-Z][[:alpha:]0-9''_]*)\s*(=)\s*([A-Z][[:alpha:]0-9''_]*)'
429− captures:
430− 1: keyword.fsharp
431− 2: entity.name.type.namespace.fsharp
432− 3: punctuation.separator.namespace-definition.fsharp
433− 4: entity.name.section.fsharp
434− push:
435− - meta_scope: namespace.alias.fsharp
436− - match: (\s|$)
437− pop: true
438− - match: '(\.)([A-Z][[:alpha:]0-9''_]*)'
439− scope: entity.name.section.fsharp
440− captures:
441− 1: punctuation.separator.namespace-reference.fsharp
442− 2: entity.name.section.fsharp
443− record_declaration:
444− - match: '(\{)'
445− captures:
446− 1: keyword.symbol.fsharp
447− push:
448− - match: '(?<=\})'
449− pop: true
450− - include: comments
451− - match: '(((mutable)\s[[:alpha:]]+)|[[:alpha:]0-9''`<>^._]*)\s*((?<!:):(?!:))\s*'
452− captures:
453− 3: keyword.fsharp
454− 4: keyword.symbol.fsharp
455− push:
456− - match: '$|(;|\})'
457− captures:
458− 1: keyword.symbol.fsharp
459− pop: true
460− - include: comments
461− - match: "([[:alpha:]0-9'`^_ ]+)"
462− captures:
463− 1: entity.name.type.fsharp
464− - include: keywords
465− - include: compiler_directives
466− - include: constants
467− - include: strings
468− - include: chars
469− - include: double_tick
470− - include: definition
471− - include: attributes
472− - include: anonymous_functions
473− - include: keywords
474− - include: cexprs
475− - include: text
476− record_signature:
477− - match: "[[:alpha:]0-9'`^_ ]+(=)([[:alpha:]0-9'`^_ ]+)"
478− captures:
479− 1: keyword.symbol.fsharp
480− 2: variable.parameter.fsharp
481− - match: "({)"
482− captures:
483− 1: keyword.symbol.fsharp
484− push:
485− - match: "(})"
486− captures:
487− 1: keyword.symbol.fsharp
488− pop: true
489− - match: "[[:alpha:]0-9'`^_ ]+(=)([[:alpha:]0-9'`^_ ]+)"
490− captures:
491− 1: keyword.symbol.fsharp
492− 2: variable.parameter.fsharp
493− - include: record_signature
494− - include: keywords
495− records:
496− - match: '\b(type)[\s]+(private|internal|public)?\s*'
497− captures:
498− 1: keyword.fsharp
499− 2: keyword.fsharp
500− push:
501− - meta_scope: record.fsharp
502− - match: '\s*((with)|((as)\s+([[:alpha:]0-9'']+))|(=)|[\n=]|(\(\)))'
503− captures:
504− 2: keyword.fsharp
505− 3: keyword.fsharp
506− 4: keyword.fsharp
507− 5: variable.parameter.fsharp
508− 6: keyword.symbol.fsharp
509− 7: constant.language.unit.fsharp
510− pop: true
511− - include: comments
512− - include: attributes
513− - match: "([[:alpha:]0-9'^._]+|``[[:alpha:]0-9'`^:,._ ]+``)"
514− captures:
515− 1: entity.name.type.fsharp
516− - match: (<)
517− captures:
518− 1: keyword.fsharp
519− push:
520− - match: ((?<!:)>)
521− captures:
522− 1: keyword.fsharp
523− pop: true
524− - match: '((''|\^)``[[:alpha:]0-9`^:,._ ]+``|(''|\^)[[:alpha:]0-9`^:._]+)'
525− captures:
526− 1: entity.name.type.fsharp
527− - match: \b(interface|with|abstract|and|when|or|not|struct|equality|comparison|unmanaged|delegate|enum)\b
528− scope: keyword.fsharp
529− - match: (\()
530− captures:
531− 1: keyword.symbol.fsharp
532− push:
533− - match: (\))
534− captures:
535− 1: keyword.symbol.fsharp
536− pop: true
537− - match: (static member|member|new)
538− captures:
539− 1: keyword.fsharp
540− - include: common_binding_definition
541− - match: '([\w0-9''`^._]+)'
542− captures:
543− 1: entity.name.type.fsharp
544− - include: keywords
545− - match: \s*(private|internal|public)
546− captures:
547− 1: keyword.symbol.fsharp
548− 2: keyword.fsharp
549− - match: (\()
550− captures:
551− 1: keyword.symbol.fsharp
552− push:
553− - match: '\s*(?=(=)|[\n=]|(\(\))|(as))'
554− captures:
555− 1: keyword.symbol.fsharp
556− pop: true
557− - include: member_declaration
558− - include: keywords
559− string_formatter:
560− - match: (%0?-?(\d+)?((a|t)|(\.\d+)?(f|F|e|E|g|G|M)|(b|c|s|d|i|x|X|o|u)|(s|b|O)|(\+?A)))
561− scope: entity.name.type.format.specifier.fsharp
562− captures:
563− 1: keyword.format.specifier.fsharp
564− strings:
565− - match: '(?=[^\\])(@")'
566− captures:
567− 1: punctuation.definition.string.begin.fsharp
568− push:
569− - meta_scope: string.quoted.literal.fsharp
570− - match: (")(?!")
571− captures:
572− 1: punctuation.definition.string.end.fsharp
573− pop: true
574− - match: '"(")'
575− scope: constant.character.string.escape.fsharp
576− - match: '(?=[^\\])(""")'
577− captures:
578− 1: punctuation.definition.string.begin.fsharp
579− push:
580− - meta_scope: string.quoted.triple.fsharp
581− - match: (""")
582− captures:
583− 1: punctuation.definition.string.end.fsharp
584− pop: true
585− - include: string_formatter
586− - match: '(?=[^\\])(")'
587− captures:
588− 1: punctuation.definition.string.begin.fsharp
589− push:
590− - meta_scope: string.quoted.double.fsharp
591− - match: (")
592− captures:
593− 1: punctuation.definition.string.end.fsharp
594− pop: true
595− - match: '\\$[ \t]*'
596− scope: punctuation.separator.string.ignore-eol.fsharp
597− - match: '\\([\\''''ntbr]|u[a-fA-F0-9]{4}|u[a-fA-F0-9]{8})'
598− scope: constant.character.string.escape.fsharp
599− - match: '\\(?![\\''''ntbr]|u[a-fA-F0-9]{4}|u[a-fA-F0-9]{8}).'
600− scope: invalid.illeagal.character.string.fsharp
601− - include: string_formatter
602− strp_inlined:
603− - match: (\()
604− captures:
605− 1: keyword.symbol.fsharp
606− push:
607− - match: (\))
608− captures:
609− 1: keyword.symbol.fsharp
610− pop: true
611− - include: strp_inlined_body
612− strp_inlined_body:
613− - include: comments
614− - include: anonymous_functions
615− - match: '(\^[[:alpha:]0-9''._]+)'
616− captures:
617− 1: entity.name.type.fsharp
618− - match: \b(and|when|or)\b
619− scope: keyword.fsharp
620− - match: (\()
621− captures:
622− 1: keyword.symbol.fsharp
623− push:
624− - match: (\))
625− captures:
626− 1: keyword.symbol.fsharp
627− pop: true
628− - include: strp_inlined_body
629− - match: '(static member|member)\s*([[:alpha:]0-9''`<>^._]+|``[[:alpha:]0-9'' <>^._]+``)\s*(:)'
630− captures:
631− 1: keyword.fsharp
632− 2: variable.fsharp
633− 3: keyword.symbol.fsharp
634− - include: compiler_directives
635− - include: constants
636− - include: strings
637− - include: chars
638− - include: double_tick
639− - include: keywords
640− - include: text
641− - include: definition
642− - include: attributes
643− - include: keywords
644− - include: cexprs
645− - include: text
646− text:
647− - match: \\
648− scope: text.fsharp
649− tuple_signature:
650− - match: "(([?[:alpha:]0-9'`^._ ]+))+"
651− captures:
652− 1: entity.name.type.fsharp
653− - match: (\()
654− captures:
655− 1: keyword.symbol.fsharp
656− push:
657− - match: (\))
658− captures:
659− 1: keyword.symbol.fsharp
660− pop: true
661− - match: "(([?[:alpha:]0-9'`^._ ]+))+"
662− captures:
663− 1: entity.name.type.fsharp
664− - include: tuple_signature
665− - include: keywords
666− variables:
667− - match: \(\)
668− scope: constant.language.unit.fsharp
669− - match: '(\?{0,1})(``[[:alpha:]0-9''`^:,._ ]+``|[[:alpha:]0-9''`<>^._ ]\w*)'
670− captures:
671− 1: keyword.symbol.fsharp
672− 2: variable.parameter.fsharp
assets/themes.bin

Binary file not shown.

build.rs+21−27
@@ -7,6 +7,7 @@ extern crate liquid;
77
88use std::error::Error;
99use std::fs;
10+use std::path::Path;
1011
1112// Read environment variables.
1213lazy_static! {
@@ -17,34 +18,13 @@ lazy_static! {
1718 .unwrap_or("bat");
1819}
1920
20−fn init_template() -> liquid::value::Object {
21− let mut globals = liquid::value::Object::new();
22−
23− globals.insert(
24− "PROJECT_NAME".into(),
25− liquid::value::Value::scalar(PROJECT_NAME.to_owned()),
26− );
27−
28− globals.insert(
29− "PROJECT_EXECUTABLE".into(),
30− liquid::value::Value::scalar(EXECUTABLE_NAME.to_owned()),
31− );
32−
33− globals.insert(
34− "PROJECT_VERSION".into(),
35− liquid::value::Value::scalar(PROJECT_VERSION.to_owned()),
36− );
37−
38− globals
39−}
40−
4121/// Generates a file from a liquid template.
4222fn template(
43− variables: &liquid::value::Object,
23+ variables: &liquid::Object,
4424 in_file: &str,
45− out_file: &str,
25+ out_file: impl AsRef<Path>,
4626) -> Result<(), Box<dyn Error>> {
47− let template = liquid::ParserBuilder::with_liquid()
27+ let template = liquid::ParserBuilder::with_stdlib()
4828 .build()?
4929 .parse(&fs::read_to_string(in_file)?)?;
5030
@@ -53,13 +33,27 @@ fn template(
5333}
5434
5535fn main() -> Result<(), Box<dyn Error>> {
56− let variables = init_template();
36+ let variables = liquid::object!({
37+ "PROJECT_NAME": PROJECT_NAME.to_owned(),
38+ "PROJECT_EXECUTABLE": EXECUTABLE_NAME.to_owned(),
39+ "PROJECT_VERSION": PROJECT_VERSION.to_owned(),
40+ });
5741
58− template(&variables, "assets/manual/bat.1.in", "assets/manual/bat.1")?;
42+ let out_dir_env = std::env::var_os("OUT_DIR").expect("OUT_DIR to be set in build.rs");
43+ let out_dir = Path::new(&out_dir_env);
44+
45+ std::fs::create_dir_all(out_dir.join("assets/manual")).unwrap();
46+ std::fs::create_dir_all(out_dir.join("assets/completions")).unwrap();
47+
48+ template(
49+ &variables,
50+ "assets/manual/bat.1.in",
51+ out_dir.join("assets/manual/bat.1"),
52+ )?;
5953 template(
6054 &variables,
6155 "assets/completions/bat.fish.in",
62− "assets/completions/bat.fish",
56+ out_dir.join("assets/completions/bat.fish"),
6357 )?;
6458
6559 Ok(())
ci/before_deploy.bash+6−5
@@ -38,7 +38,7 @@ pack() {
3838 "${gcc_prefix}"strip "$tempdir/$package_name/$PROJECT_NAME"
3939
4040 # manpage, readme and license
41− cp "assets/manual/bat.1" "$tempdir/$package_name/$PROJECT_NAME.1"
41+ cp target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/assets/manual/bat.1 "$tempdir/$package_name/$PROJECT_NAME.1"
4242 cp README.md "$tempdir/$package_name"
4343 cp LICENSE-MIT "$tempdir/$package_name"
4444 cp LICENSE-APACHE "$tempdir/$package_name"
@@ -47,7 +47,7 @@ pack() {
4747 # TODO: disabled for now, see issue #372
4848 # cp target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/"$PROJECT_NAME".bash "$tempdir/$package_name/autocomplete/${PROJECT_NAME}.bash-completion"
4949 # cp target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/"$PROJECT_NAME".fish "$tempdir/$package_name/autocomplete"
50− cp "assets/completions/bat.fish" "$tempdir/$package_name/autocomplete/$PROJECT_NAME.fish"
50+ cp target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/assets/completions/bat.fish "$tempdir/$package_name/autocomplete/$PROJECT_NAME.fish"
5151 # cp target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/_"$PROJECT_NAME" "$tempdir/$package_name/autocomplete"
5252
5353 # archiving
@@ -108,11 +108,11 @@ make_deb() {
108108 "${gcc_prefix}"strip "$tempdir/usr/bin/$PROJECT_NAME"
109109
110110 # manpage
111− install -Dm644 "assets/manual/bat.1" "$tempdir/usr/share/man/man1/$PROJECT_NAME.1"
111+ install -Dm644 target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/assets/manual/bat.1 "$tempdir/usr/share/man/man1/$PROJECT_NAME.1"
112112 gzip --best "$tempdir/usr/share/man/man1/$PROJECT_NAME.1"
113113
114114 # completions
115− install -Dm644 "assets/completions/bat.fish" "$tempdir/usr/share/fish/vendor_completions.d/$PROJECT_NAME.fish"
115+ install -Dm644 target/"$TARGET"/release/build/"$PROJECT_NAME"-*/out/assets/completions/bat.fish "$tempdir/usr/share/fish/vendor_completions.d/$PROJECT_NAME.fish"
116116
117117 # readme and license
118118 install -Dm644 README.md "$tempdir/usr/share/doc/$PROJECT_NAME/README.md"
@@ -164,7 +164,8 @@ Package: $dpkgname
164164Version: $version
165165Section: utils
166166Priority: optional
167−Maintainer: David Peter <mail@david-peter.de>
167+Maintainer: $maintainer
168+Homepage: $homepage
168169Architecture: $architecture
169170Provides: $PROJECT_NAME
170171Conflicts: $conflictname
doc/README-ja.md+6−6
@@ -13,7 +13,7 @@
1313 <a href="#インストール">インストール</a> •
1414 <a href="#カスタマイズ">カスタマイズ</a> •
1515 <a href="#プロジェクトの目標と既存の類似したOSS">プロジェクトの目標と既存の類似したOSS</a> •
16− 翻訳 [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="README-ja.md">日本語</a>]
16+ 翻訳 [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="README-ja.md">日本語</a>][<a href="README-ko.md">한국어</a>]
1717</p>
1818
1919### シンタックスハイライト
@@ -180,7 +180,7 @@ apt install bat
180180batの最新リリースを実行する場合、または Ubuntu/Debian の古いバージョンを使用している場合は、[release page](https://github.com/sharkdp/bat/releases) から最新の `.deb` パッケージをダウンロードし、
181181次の方法でインストールします:
182182```bash
183−sudo dpkg -i bat_0.12.1_amd64.deb # adapt version number and architecture
183+sudo dpkg -i bat_0.13.0_amd64.deb # adapt version number and architecture
184184```
185185
186186### On Alpine Linux
@@ -500,11 +500,11 @@ export BAT_CONFIG_PATH="/path/to/bat.conf"
500500# Use italic text on the terminal (not supported on all terminals)
501501--italic-text=always
502502
503−# Use C++ syntax (instead of C) for .h header files
504−--map-syntax h:cpp
503+# Use C++ syntax for .ino files
504+--map-syntax "*.ino:C++"
505505
506−# Use "gitignore" highlighting for ".ignore" files
507−--map-syntax .ignore:.gitignore
506+# Use ".gitignore"-style highlighting for ".ignore" files
507+--map-syntax ".ignore:Git Ignore"
508508```
509509
510510## Windows での `bat` の利用
doc/README-ko.mdnew file+560
@@ -0,0 +1,560 @@
1+<p align="center">
2+ <img src="../doc/logo-header.svg" alt="bat - a cat clone with wings"><br>
3+ <a href="https://travis-ci.org/sharkdp/bat"><img src="https://travis-ci.org/sharkdp/bat.svg?branch=master" alt="Build Status"></a>
4+ <a href="https://ci.appveyor.com/project/sharkdp/bat"><img src="https://ci.appveyor.com/api/projects/status/cptsmtbiwbnr2vhf/branch/master?svg=true"></a>
5+ <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
6+ <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
7+
8+ 문법 강조와 깃 통합 기능의 <i>cat(1)</i> 클론
9+</p>
10+
11+<p align="center">
12+ <a href="#문법-강조">주요 기능들</a> •
13+ <a href="#사용법">사용법</a> •
14+ <a href="#설치">설치</a> •
15+ <a href="#커스터마이즈">커스터마이즈</a> •
16+ <a href="#프로젝트-목표와-대안들">프로젝트 목표와 대안들</a> •
17+ 번역 [<a href="https://github.com/chinanf-boy/bat-zh">中文</a>][<a href="../doc/README-ja.md">日本語</a>]
18+</p>
19+
20+### 문법 강조
21+
22+`bat`은 다양한 프로그래밍 언어와 마크업 언어에 대해 문법 강조(Syntax highlighting)기능을 지원하고 있습니다:
23+
24+![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
25+
26+### Git 통합
27+
28+`bat`은 `git`을 통해 인덱스와 함께 변경분을 표시합니다 (왼쪽 바를 확인하세요):
29+
30+![Git integration example](https://i.imgur.com/2lSW4RE.png)
31+
32+### 표시할 수 없는 문자 처리
33+
34+`-A`/`--show-all` 옵션을 사용하여 표시할수 없는 문자를 시각화 해줍니다:
35+
36+![Non-printable character example](https://i.imgur.com/WndGp9H.png)
37+
38+### 자동 페이징
39+
40+하나의 화면에 비해 출력이 너무 큰 경우, `less` 를 이용해 출력들을 연결할 수 있습니다.
41+
42+### 파일 연결
43+
44+이 뿐만 아니라 파일을 연결할 때도 사용 할 수 있습니다. :wink: `bat`가 인터렉티브 하지 않은(non-interactive)가 감지하면 (예를 들어,다른 프로세스 혹은 파일과 파이프라인을 연결 한 경우) `bat`은 `cat`을 대신하여 동작하며 일반 파일 내용을 표기해줍니다.
45+
46+## 사용법
47+
48+터미널에서 하나의 파일 표시하기
49+
50+```bash
51+> bat README.md
52+```
53+
54+여러 파일 한번에 보여주기
55+
56+```bash
57+> bat src/*.rs
58+```
59+
60+stdin에서 읽고, 자동으로 맞는 문법 강조 적용하기
61+
62+```bash
63+> curl -s https://sh.rustup.rs | bat
64+```
65+
66+stdin에서 읽고, 명시적으로 언어 지정하여 적용하기
67+
68+```bash
69+> yaml2json .travis.yml | json_pp | bat -l json
70+```
71+
72+표시할 수 없는 문자 처리하기
73+```bash
74+> bat -A /etc/hosts
75+```
76+
77+`cat` 대신 사용하기:
78+
79+```bash
80+bat > note.md # quickly create a new file
81+
82+bat header.md content.md footer.md > document.md
83+
84+bat -n main.rs # show line numbers (only)
85+
86+bat f - g # output 'f', then stdin, then 'g'.
87+```
88+
89+### 다른 툴과의 통합
90+
91+#### `find` 와 `fd`
92+
93+`find`의 `-exec` 옵션을 사용하여 `bat`의 모든 검색 결과를 미리 볼 수 있습니다:
94+```bash
95+find … -exec bat {} +
96+```
97+
98+[`fd`](https://github.com/sharkdp/fd)를 사용하고 있는 경우, `-X`/`--exec-batch` 옵션을 이용하여 동일하게 사용할 수 있습니다:
99+```bash
100+fd … -X bat
101+```
102+
103+#### `ripgrep`
104+
105+[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)과 함께, [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 결과를 `bat`을 이용하여 볼 수 있습니다.
106+
107+```bash
108+batgrep needle src/
109+```
110+
111+#### `tail -f`
112+
113+`bat` 과 `tail -f`를 함께 사용하여, 특정 파일을 문법 강조하며 지속적으로 모니터링 할 수 있습니다.
114+```bash
115+tail -f /var/log/pacman.log | bat --paging=never -l log
116+```
117+이 작업을 하려면 페이징 기능을 꺼야합니다. 또, 자동 감지가 되지 않기 때문에, 적용되어야할 문법을 명시적(`-l log`)으로 지정해야 합니다.
118+
119+#### `git`
120+
121+`bat`과 `git show`를 함께 사용하여 주어진 파일의 이전 기록을 문법 강조와 함께 볼 수 있습니다:
122+```bash
123+git show v0.6.0:src/main.rs | bat -l rs
124+```
125+
126+diffs 내에서 문법 강조 표시는 현재 지원되지 않습니다. 이 기능은 [`delta`](https://github.com/dandavison/delta)에서 찾아 볼 수 있습니다.
127+
128+#### `xclip`
129+
130+`bat` 출력에서 라인 넘버와 Git 수정 내역이 같이 있어 파일 내용을 복사하기가 어려울 수도 있습니다. 이 경우에는 `-p`/`--plain` 옵션을 사용 하거나 출력 시 파이프라인으로 `xclip`을 사용하면 됩니다:
131+```bash
132+bat main.cpp | xclip
133+```
134+`bat` 에서는 리다이렉트된 것으로 감지하여, 파일 내용만 출력합니다.
135+
136+#### `man`
137+
138+`bat`은 `MANPAGER` 환경 변수 설정을 통해 `man`에 대하여 컬러 페이져를 사용할 수 있습니다:
139+
140+```bash
141+export MANPAGER="sh -c 'col -bx | bat -l man -p'"
142+man 2 select
143+```
144+
145+포매팅 문제가 발생한다면, `MANROFFOPT="-c"` 설정 해야 할 수도 있습니다 .
146+
147+새 커맨드에서 이 번들을 사용하려면, [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 이용 할 수 있습니다.
148+
149+
150+참고 : [Manpage syntax](../assets/syntaxes/Manpage.sublime-syntax)는 이 저장소에서 개발되고 있으며, 아직 작업 중 입니다.
151+
152+#### `prettier` / `shfmt` / `rustfmt`
153+
154+[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) 스크립트는 코드를 포맷팅하고 `bat`으로 출력해주는 랩퍼(wrapper) 입니다.
155+
156+
157+## 설치
158+
159+[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions)
160+
161+### On Ubuntu
162+*... 그리고 기타 Debian 기반의 Linux 배포판들.*
163+
164+Ubuntu Eoan 19.10 혹은 Debian unstable sid 이후 버전 부터는 [Ubuntu용 `bat` 패키지](https://packages.ubuntu.com/eoan/bat)나 [Debian용 `bat` 패키지](https://packages.debian.org/sid/bat) 를 설치 할 수 있습니다.
165+
166+```bash
167+apt install bat
168+```
169+
170+만약 최근 릴리즈된 bat을 사용을 원하거나 buntu/Debian 예전 버전을 사용하는 경우, [릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다음과 같이 `.deb` 패키지를 받아 설치 할 수도 있습니다:
171+
172+```bash
173+sudo dpkg -i bat_0.13.0_amd64.deb # adapt version number and architecture
174+```
175+
176+### On Alpine Linux
177+
178+공식 소스를 통해 [`bat` 패키지](https://pkgs.alpinelinux.org/packages?name=bat) 를 설치 할 수 있습니다:
179+
180+```bash
181+apk add bat
182+```
183+
184+### On Arch Linux
185+
186+공식 소스를 통해 [`bat` 패키지](https://www.archlinux.org/packages/community/x86_64/bat/)를 설치할 수 있습니다:
187+
188+```bash
189+pacman -S bat
190+```
191+
192+### On Fedora
193+
194+[공식 Fedora 모듈 저장소](https://docs.fedoraproject.org/en-US/modularity/using-modules/)에서 [`bat` 패키지](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)을 설치할 수 있습니다:
195+
196+```bash
197+dnf install bat
198+```
199+
200+### On Gentoo Linux
201+
202+공식 소스를 통해 [`bat` 패키지](https://packages.gentoo.org/packages/sys-apps/bat)를 설치할 수 있습니다.
203+
204+```bash
205+emerge sys-apps/bat
206+```
207+
208+### On Void Linux
209+
210+xbps-install를 이용해 `bat`을 설치할 수 있습니다:
211+```bash
212+xbps-install -S bat
213+```
214+
215+### On FreeBSD
216+
217+pkg를 이용하여 미리 컴파일된 [`bat` 패키지](https://www.freshports.org/textproc/bat)를 설치할 수 있습니다:
218+
219+```bash
220+pkg install bat
221+```
222+
223+또는 FreeBSD 포트에서 직접 빌드할 수도 있습니다:
224+
225+```bash
226+cd /usr/ports/textproc/bat
227+make install
228+```
229+
230+### Via nix
231+
232+[nix package manager](https://nixos.org/nix)를 이용해 `bat`을 설치할 수 있습니다:
233+
234+```bash
235+nix-env -i bat
236+```
237+
238+### On openSUSE
239+
240+zypper을 이용해 `bat`을 설치할 수 있습니다:
241+
242+```bash
243+zypper install bat
244+```
245+
246+### On macOS
247+
248+[Homebrew](http://braumeister.org/formula/bat)를 이용해 `bat`을 설치할 수 있습니다:
249+
250+```bash
251+brew install bat
252+```
253+
254+또는 [MacPorts](https://ports.macports.org/port/bat/summary)를 사용할 수도 있습니다:
255+
256+```bash
257+port install bat
258+```
259+
260+### On Windows
261+
262+Windows에서 `bat`을 설치할 수 있는 몇 가지 옵션들이 있습니다. 먼저 `bat`을 설치 한 후, ["Windows에서 사용하기"](#Windows에서-사용하기) 참고하시기 바랍니다.
263+
264+#### With Chocolatey
265+
266+[Chocolatey](https://chocolatey.org/packages/Bat)를 이용해 `bat`을 설치할 수 있습니다:
267+```bash
268+choco install bat
269+```
270+
271+#### With Scoop
272+
273+[scoop](https://scoop.sh/)을 이용해 `bat`을 설치할 수 있습니다:
274+```bash
275+scoop install bat
276+```
277+[Visual C++ Redistributable 패키지](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)를 같이 설치해 주어야 합니다.
278+
279+#### From prebuilt binaries:
280+
281+[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 빌드된 바이너리를 다운받을 수 있습니다.
282+
283+[Visual C++ Redistributable 패키지](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)를 같이 설치해 주어야 합니다.
284+
285+### Via Docker
286+
287+컨테이너에서 `bat`을 사용할 수 있는 [Docker image](https://hub.docker.com/r/danlynn/bat/)가 있습니다.:
288+```bash
289+docker pull danlynn/bat
290+alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat'
291+```
292+
293+### Via Ansible
294+
295+[Ansible](https://www.ansible.com/)을 사용해 `bat`을 설치할 수 있습니다:
296+
297+```bash
298+# Install role on local machine
299+ansible-galaxy install aeimer.install_bat
300+```
301+
302+```yaml
303+---
304+# Playbook to install bat
305+- host: all
306+ roles:
307+ - aeimer.install_bat
308+```
309+
310+- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat)
311+- [GitHub](https://github.com/aeimer/ansible-install-bat)
312+
313+다음 배포판들에서 동작합니다:
314+- Debian/Ubuntu
315+- ARM (eg. Raspberry PI)
316+- Arch Linux
317+- Void Linux
318+- FreeBSD
319+- MacOS
320+
321+### From binaries
322+
323+[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다양한 환경을 위해 빌드된 버전들을 확인 할 수 있습니다. 정적 링크 바이너리들은 아카이브에서 파일 이름에 `musl` 이 포함 파일로 확인 할 수 있습니다.
324+
325+### From source
326+
327+`bat`의 소스를 직접 빌드하기 위해서는, Rust 1.36 이상이 필요하며 `cargo`를 이용해 빌드할 수 있습니다.
328+
329+```bash
330+cargo install bat
331+```
332+
333+일부 플랫폼에서는 `llvm` 그리고/또는 `libclang-dev` 설치가 필요할 수도 있습니다.
334+
335+## 커스터마이즈
336+
337+### 문법 강조 테마
338+
339+`bat --list-themes`을 사용하면, 현재 사용 가능한 문법 강조 테마들을 확인할 수 있습니다. `TwoDark` 테마 선택하는 경우, `--theme=TwoDark` 옵션과 함께 `bat`을 사용하거나 환경변수에서 `BAT_THEME`를 `TwoDark`로 세팅해주면 됩니다. 쉘 시작 파일에 `export BAT_THEME="TwoDark"` 를 정의해 계속 사용도 가능합니다. 이 밖에 `bat`의 [설정 파일](#설정-파일)을 이용할 수도 있습니다.
340+
341+다른 테마를 미리 보고 싶은경우 다음 명령어와 같이 사용할 수 있습니다.(이 경우 [`fzf`](https://github.com/junegunn/fzf)가 필요합니다.)
342+
343+```bash
344+bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
345+```
346+`bat`의 기본 테마는 어두운 배경색 터미널에 적합합니다. 만일 밝은 배경색을 사용할 경우에는 `GitHub` 이나 `OneHalfLight` 과 같은 테마가 더 잘 어울립니다. 아래 [새로운 테마 추가하기](#새로운-테마-추가하기)에 따라 커스텀 테마를 사용할수도 있습니다.
347+
348+### 출력 스타일
349+
350+`--style` 옵션을 이용하여 `bat`의 출력 스타일을 변경 할 수 있습니다. 예를 들어, `--style=numbers,changes`는 Git 변경분과 라인 넘버에 대해서만 출력하며 눈금과 파일 헤더가 표시되지 않습니다. `BAT_STYLE` 환경 변수로 정의하여 계속해서 사용하거나`bat`의 [설정 파일](#설정-파일)을 사용할 수도 있습니다.
351+
352+### 새로운 문법 강조 / 언어 추가하기
353+
354+`bat`은 문법 강조를 위해 [`syntect`](https://github.com/trishume/syntect/) 라이브러리를 사용하고 있습니다. `syntect`는 [Sublime Text의 `.sublime-syntax` 파일](https://www.sublimetext.com/docs/3/syntax.html)과 테마를 읽을 수 있습니다. 새로운 문법 강조를 추가하는 방법은 다음과 같습니다.
355+
356+우선 문법 정의 파일을 넣을 폴더를 만듭니다:
357+
358+```bash
359+mkdir -p "$(bat --config-dir)/syntaxes"
360+cd "$(bat --config-dir)/syntaxes"
361+
362+# Put new '.sublime-syntax' language definition files
363+# in this folder (or its subdirectories), for example:
364+git clone https://github.com/tellnobody1/sublime-purescript-syntax
365+```
366+
367+다음 명령어를 통해 파일을 바이너리 캐시로 파싱합니다.
368+
369+```bash
370+bat cache --build
371+```
372+
373+마지막으로 `bat --list-languages`을 통해 새로운 언어가 사용 가능한지 확인합니다.
374+
375+기본 설정으로 돌아가려면, 다음 명령어를 이용합니다.:
376+
377+```bash
378+bat cache --clear
379+```
380+
381+### 새로운 테마 추가하기
382+
383+새로운 문법 정의 추가와 매우 유사합니다.
384+
385+먼저, 새로운 문법 강조 테마 폴더를 만듭니다.
386+```bash
387+mkdir -p "$(bat --config-dir)/themes"
388+cd "$(bat --config-dir)/themes"
389+
390+# Download a theme in '.tmTheme' format, for example:
391+git clone https://github.com/greggb/sublime-snazzy
392+
393+# Update the binary cache
394+bat cache --build
395+```
396+
397+마지막으로 `bat --list-themes`을 통해 새로운 테마가 사용 가능한지 확인합니다.
398+
399+### 다른 페이져 사용하기
400+
401+`bat`은 환경변수 `PAGER`로 사용할 페이져를 명시합니다. 만약 이 변수가 정의되어있지 않다면 `less`가 기본입니다. 만약 다른 페이져를 사용하고 싶다면 `PAGER` 변수를 수정하거나 `BAT_PAGER` 환경 변수로 `PAGER` 대신 정의 할 수도 있습니다.
402+
403+만약 커맨드라인 인수로 넘기려면, `PAGER`/`BAT_PAGER` 변수를 정의를 통해 사용 할 수 있습니다. :
404+
405+```bash
406+export BAT_PAGER="less -RF"
407+```
408+
409+환경 변수 대신, `bat`의 [설정 파일](#설정-파일)에서 페이져를 설정 할 수도 있습니다.(`--pager` 옵션)
410+
411+**참고**: 기본적으로 페이져가 `less`로 설정 되어있다면, `bat`은 다음 옵션들을 받을 수 있습니다: `-R`/`--RAW-CONTROL-CHARS`,
412+`-F`/`--quit-if-one-screen` 그리고 `-X`/`--no-init`. 마지막 옵션(`-X`)은 530 이전 버전에서만 사용됩니다.
413+
414+`-R` 옵션은 ANSI 컬러를 올바르게 해석하기 위해 필요합니다. 두번째 옵션 (`-F`)은 출력 크기가 터미널의 세로 크기보다 작을 경우 즉시 종료되도록 합니다.
415+페이져를 종료하기 위해 `q`를 누를 필요 없기 때문에 작은 파일을 다룰 때 용이합니다. 세번째 옵션(`-X`)는 `less` 이전 버전의 `--quit-if-one-screen` 기능과 함께 버그를 잡을 때 필요합니다. 안타깝게도, `less`의 마우스 휠 지원은 종료합니다.
416+
417+`less` 예전 버전에서 마우스 휠 기능을 활성화 시키려면, `-R` 옵션을 사용하면 됩니다. (위의 예제처럼, 이 옵션은 quit-if-one-screen 기능을 비활성화 시킵니다.)
418+530 이하 버전에서는 그대로 사용할 수 있습니다.
419+
420+### 다크 모드
421+
422+macOS에서 다크 모드를 사용하고 있다면, OS 테마에 따라 다른 테마를 사용하도록 `bat`의 구성할 수 있습니다. 아래 코드는 라이트 모드에서는 `default` 테마를 다크모드에서는 `Github` 테마를 사용하는 방법입니다.
423+
424+```bash
425+alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)"
426+```
427+
428+## 설정 파일
429+
430+`bat` 설정 파일로 커스터마이즈 할 수 있습니다. 파일의 위치는 운영 체제에 따라 다릅니다. 아래 커맨드를 통해 시스템의 기본 경로를 알 수 있습니다.
431+```
432+bat --config-file
433+```
434+
435+또는, `BAT_CONFIG_PATH` 환경 변수를 사용하여 `bat`의 설정 파일 위치를 지정할 수 있습니다.
436+```bash
437+export BAT_CONFIG_PATH="/path/to/bat.conf"
438+```
439+
440+### 포맷
441+
442+설정 파일은 명령어 인수들의 리스트 입니다. `bat --help`를 이용하여 가능한 옵션들과 값들을 확인해 볼 수 있습니다. 또, `#` 으로 주석을 추가할수도 있습니다.
443+
444+설정 파일의 예:
445+```bash
446+# Set the theme to "TwoDark"
447+--theme="TwoDark"
448+
449+# Show line numbers, Git modifications and file header (but no grid)
450+--style="numbers,changes,header"
451+
452+# Use italic text on the terminal (not supported on all terminals)
453+--italic-text=always
454+
455+# Use C++ syntax for .ino files
456+--map-syntax "*.ino:C++"
457+
458+# Use ".gitignore"-style highlighting for ".ignore" files
459+--map-syntax ".ignore:Git Ignore"
460+```
461+
462+## Windows에서 사용하기
463+
464+`bat` 대부분의 경우 Windows에서 기본적으로 잘 작동하지만, 일부 기능에는 추가 적인 구성이 필요할 수 있습니다.
465+
466+### 페이징
467+
468+Windows는 `more` 형식의 매우 제한된 페이저만이 포함되어있습니다. `less`용 Windows 바이너리는 [이 홈페이지](http://www.greenwoodsoftware.com/less/download.html)나 [Chocolatey](https://chocolatey.org/packages/Less)에서 다운로드 받을 수 있습니다. 이를 사용하려면 바이너리를 `PATH` 디렉토리에 배치하거나 [환경 변수로 정의](#using-a-different-pager) 하세요. [Chocolatey 패키지](#on-windows)로 `less`를 자동으로 설치할 수 있습니다.
469+
470+### 색상
471+
472+Windows 10은 기본 내장기능으로 [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)) 이후의 `conhost.exe`(Command Prompt) 와 PowerShell, 그리고 최신 버전의 bash에서 색상을 지원합니다. 이전 버전의 Windows에서는, [ConEmu](https://conemu.github.io/)가 포함 된 [Cmder](http://cmder.net/)를 사용할 수 있습니다 .
473+
474+**참고:** `less`의 Git과 MSYS 버전은 Windows에서 색상을 올바르게 해석하지 않습니다. 다른 페이져가 설치되어 있지 않은 경우, `--paging=never` 하거나 `BAT_PAGER`를 빈 문자열로 설정하여 페이징을 완전히 비활성화 할 수 있습니다 .
475+
476+### Cygwin
477+
478+Windows에서의 `bat`은 기본적으로 Cygwin의 unix 스타일의 경로(`/cygdrive/*`)를 지원하지 않습니다. cygwin 절대경로를 인자로 받았을 때, `bat`은 다음과 같이 오류를 반환합니다. `:The system cannot find the path specified. (os error 3)`
479+
480+이 경우, wrapper를 만들거나 다음 함수를 `.bash_profile`추가하여 문제를 해결하실 수 있습니다 :
481+
482+```bash
483+bat() {
484+ local index
485+ local args=("$@")
486+ for index in $(seq 0 ${#args[@]}) ; do
487+ case "${args[index]}" in
488+ -*) continue;;
489+ *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";;
490+ esac
491+ done
492+ command bat "${args[@]}"
493+}
494+```
495+
496+## 트러블슈팅
497+
498+### 터미널과 색상
499+
500+`bat`은 터미널 트루컬러 지원 여부와 상관없이 동작합니다. 하지만, 문법 강조 테마의 색상이 8-bit 컬러에는 최적화 되어 있지 않고 있으며, 24-bit 트루컬러 지원하는 터미널 사용하는 것을 적극 권장합니다.(`terminator`, `konsole`, `iTerm2`, ...). [이 글](https://gist.github.com/XVilka/8346728)에서 24-bit 트루컬러 지원하는 터미널들을 찾아보실 수 있습니다.
501+
502+사용하고 있는 터미널에서 `COLORTERM`을 `truecolor` 혹은
503+`24bit`으로 설정 되어있는지 확인하세요. 만약 아니라면, `bat`은 24-bit escape sequence를 지원되는지 여부를 판단 할 수 없습니다. (그리고 8-bit 색상으로 돌아갑니다.)
504+
505+### 라인 숫자와 눈금이 잘 보이지 않는 경우
506+
507+다른 테마를 사용해 보세요. (`bat --list-themes`에서 테마들을 확인해 볼 수 있습니다.) `OneHalfDark` 과 `OneHalfLight` 테마는 눈금과 선의 색을 밝게 합니다.
508+
509+### 파일 인코딩
510+
511+`bat`은 기본적으로 UTF-8과 UTF-8을 제공합니다. 다른 파일 인코딩의 경우, 자동 감지 되지 않으므로 UTF-8로 먼저 변환해 주어야 합니다. 이렇게 할 때, `iconv`를 사용 할 수 있습니다. 예를 들어, Latin-1 (ISO-8859-1)로 인코딩된 PHP파일이라면 다음과 같이 사용할 수 있습니다.:
512+``` bash
513+iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat
514+```
515+참고: `bat`으로 자동 감지가 되지 않는 경우에는 `-l`/`--language` 옵션을 사용할 수도 있습니다.
516+
517+## 배포
518+
519+```bash
520+# Recursive clone to retrieve all submodules
521+git clone --recursive https://github.com/sharkdp/bat
522+
523+# Build (debug version)
524+cd bat
525+cargo build --bins
526+
527+# Run unit tests and integration tests
528+cargo test
529+
530+# Install (release version)
531+cargo install
532+
533+# Build a bat binary with modified syntaxes and themes
534+bash assets/create.sh
535+cargo install -f
536+```
537+
538+## 메인테이너들
539+
540+- [sharkdp](https://github.com/sharkdp)
541+- [eth-p](https://github.com/eth-p)
542+
543+## 프로젝트 목표와 대안들
544+
545+`bat`은 아래와 같은 목표를 달성하려고 합니다:
546+
547+- 아름답고 발전된 문법 강조 기능
548+- Git 연동을 통한 파일 수정 내역 확인
549+- (POSIX)`cat`의 대체제
550+- 사용자 친화적인 CLI 제공
551+
552+
553+비슷한 프로그램들을 찾고 있다면, 많은 대안들이 있습니다. 비교는 [이 문서]((doc/alternatives.md))를 참조해주세요.
554+
555+## 라이센스
556+Copyright (c) 2018-2020 [bat-developers](https://github.com/sharkdp/bat).
557+
558+`bat`는 MIT 라이센스 및 Apache 라이센스 2.0의 조건에 따라 배포됩니다.
559+
560+라이센스 세부사항은 [LICENSE-APACHE](LICENSE-APACHE)와 [LICENSE-MIT](LICENSE-MIT)를 참조하세요.
examples/cat.rsnew file+33
@@ -0,0 +1,33 @@
1+/// A very simple colorized `cat` clone, using `bat` as a library.
2+/// See `src/bin/bat` for the full `bat` application.
3+use bat::{
4+ config::{Config, InputFile, StyleComponent, StyleComponents},
5+ Controller, HighlightingAssets,
6+};
7+use console::Term;
8+use std::process;
9+
10+fn main() {
11+ let files = std::env::args_os().skip(1).collect::<Vec<_>>();
12+
13+ if files.is_empty() {
14+ eprintln!("No input files specified");
15+ process::exit(1);
16+ }
17+
18+ let config = Config {
19+ term_width: Term::stdout().size().1 as usize,
20+ colored_output: true,
21+ true_color: true,
22+ style_components: StyleComponents::new(&[
23+ StyleComponent::Header,
24+ StyleComponent::Grid,
25+ StyleComponent::Numbers,
26+ ]),
27+ files: files.iter().map(|file| InputFile::Ordinary(file)).collect(),
28+ ..Default::default()
29+ };
30+ let assets = HighlightingAssets::from_binary();
31+
32+ Controller::new(&config, &assets).run().expect("no errors");
33+}
examples/simple.rs+7−22
@@ -1,35 +1,20 @@
1+/// A simple program that prints its own source code using the bat library
12use bat::{
2− assets::HighlightingAssets,
3− controller::Controller,
4− inputfile::InputFile,
5− style::{OutputComponent, OutputComponents},
6− Config,
3+ config::{Config, InputFile},
4+ Controller, HighlightingAssets,
75};
8−use console::Term;
9−use std::process;
6+use std::ffi::OsStr;
107
118fn main() {
12− let files = std::env::args_os().skip(1).collect::<Vec<_>>();
13−
14− if files.is_empty() {
15− eprintln!("No input files specified");
16− process::exit(1);
17− }
9+ let path_to_this_file = OsStr::new(file!());
1810
1911 let config = Config {
20− term_width: Term::stdout().size().1 as usize,
12+ files: vec![InputFile::Ordinary(path_to_this_file)],
2113 colored_output: true,
2214 true_color: true,
23− output_components: OutputComponents::new(&[
24− OutputComponent::Header,
25− OutputComponent::Grid,
26− OutputComponent::Numbers,
27− ]),
28− files: files.iter().map(|file| InputFile::Ordinary(file)).collect(),
29− theme: "1337".into(),
3015 ..Default::default()
3116 };
32− let assets = HighlightingAssets::new();
17+ let assets = HighlightingAssets::from_binary();
3318
3419 Controller::new(&config, &assets).run().expect("no errors");
3520}
src/assets.rs+169−65
@@ -1,41 +1,35 @@
1−use std::borrow::Cow;
21use std::collections::BTreeMap;
32use std::fs::{self, File};
43use std::io::BufReader;
5−use std::path::{Path, PathBuf};
4+use std::path::Path;
65
76use syntect::dumps::{dump_to_file, from_binary, from_reader};
87use syntect::highlighting::{Theme, ThemeSet};
98use syntect::parsing::{SyntaxReference, SyntaxSet, SyntaxSetBuilder};
109
11−use crate::dirs::PROJECT_DIRS;
12−
1310use crate::errors::*;
1411use crate::inputfile::{InputFile, InputFileReader};
15−use crate::syntax_mapping::SyntaxMapping;
16−
17−pub const BAT_THEME_DEFAULT: &str = "Monokai Extended";
12+use crate::syntax_mapping::{MappingTarget, SyntaxMapping};
1813
1914#[derive(Debug)]
2015pub struct HighlightingAssets {
21− pub syntax_set: SyntaxSet,
22− pub theme_set: ThemeSet,
16+ pub(crate) syntax_set: SyntaxSet,
17+ pub(crate) theme_set: ThemeSet,
18+ fallback_theme: Option<&'static str>,
2319}
2420
2521impl HighlightingAssets {
26− pub fn new() -> Self {
27− Self::from_cache().unwrap_or_else(|_| Self::from_binary())
22+ pub fn default_theme() -> &'static str {
23+ "Monokai Extended"
2824 }
2925
30− pub fn from_files(dir: Option<&Path>, start_empty: bool) -> Result<Self> {
31− let source_dir = dir.unwrap_or_else(|| PROJECT_DIRS.config_dir());
32−
33− let mut theme_set = if start_empty {
26+ pub fn from_files(source_dir: &Path, include_integrated_assets: bool) -> Result<Self> {
27+ let mut theme_set = if include_integrated_assets {
28+ Self::get_integrated_themeset()
29+ } else {
3430 ThemeSet {
3531 themes: BTreeMap::new(),
3632 }
37− } else {
38− Self::get_integrated_themeset()
3933 };
4034
4135 let theme_dir = source_dir.join("themes");
@@ -48,7 +42,7 @@ impl HighlightingAssets {
4842 );
4943 }
5044
51− let mut syntax_set_builder = if start_empty {
45+ let mut syntax_set_builder = if !include_integrated_assets {
5246 let mut builder = SyntaxSetBuilder::new();
5347 builder.add_plain_text_syntax();
5448 builder
@@ -69,15 +63,15 @@ impl HighlightingAssets {
6963 Ok(HighlightingAssets {
7064 syntax_set: syntax_set_builder.build(),
7165 theme_set,
66+ fallback_theme: None,
7267 })
7368 }
7469
75− fn from_cache() -> Result<Self> {
76− let theme_set_path = theme_set_path();
77− let syntax_set_file = File::open(&syntax_set_path()).chain_err(|| {
70+ pub fn from_cache(theme_set_path: &Path, syntax_set_path: &Path) -> Result<Self> {
71+ let syntax_set_file = File::open(syntax_set_path).chain_err(|| {
7872 format!(
7973 "Could not load cached syntax set '{}'",
80− syntax_set_path().to_string_lossy()
74+ syntax_set_path.to_string_lossy()
8175 )
8276 })?;
8377 let syntax_set: SyntaxSet = from_reader(BufReader::new(syntax_set_file))
@@ -95,6 +89,7 @@ impl HighlightingAssets {
9589 Ok(HighlightingAssets {
9690 syntax_set,
9791 theme_set,
92+ fallback_theme: None,
9893 })
9994 }
10095
@@ -106,18 +101,18 @@ impl HighlightingAssets {
106101 from_binary(include_bytes!("../assets/themes.bin"))
107102 }
108103
109− fn from_binary() -> Self {
104+ pub fn from_binary() -> Self {
110105 let syntax_set = Self::get_integrated_syntaxset();
111106 let theme_set = Self::get_integrated_themeset();
112107
113108 HighlightingAssets {
114109 syntax_set,
115110 theme_set,
111+ fallback_theme: None,
116112 }
117113 }
118114
119− pub fn save(&self, dir: Option<&Path>) -> Result<()> {
120− let target_dir = dir.unwrap_or_else(|| PROJECT_DIRS.cache_dir());
115+ pub fn save_to_cache(&self, target_dir: &Path) -> Result<()> {
121116 let _ = fs::create_dir_all(target_dir);
122117 let theme_set_path = target_dir.join("themes.bin");
123118 let syntax_set_path = target_dir.join("syntaxes.bin");
@@ -149,22 +144,36 @@ impl HighlightingAssets {
149144 Ok(())
150145 }
151146
152− pub fn get_theme(&self, theme: &str) -> &Theme {
147+ pub fn set_fallback_theme(&mut self, theme: &'static str) {
148+ self.fallback_theme = Some(theme);
149+ }
150+
151+ pub fn syntaxes(&self) -> &[SyntaxReference] {
152+ self.syntax_set.syntaxes()
153+ }
154+
155+ pub fn themes(&self) -> impl Iterator<Item = &String> {
156+ self.theme_set.themes.keys()
157+ }
158+
159+ pub(crate) fn get_theme(&self, theme: &str) -> &Theme {
153160 match self.theme_set.themes.get(theme) {
154161 Some(theme) => theme,
155162 None => {
156− use ansi_term::Colour::Yellow;
157− eprintln!(
158− "{}: Unknown theme '{}', using default.",
159− Yellow.paint("[bat warning]"),
160− theme
161− );
162− &self.theme_set.themes[BAT_THEME_DEFAULT]
163+ if theme != "" {
164+ use ansi_term::Colour::Yellow;
165+ eprintln!(
166+ "{}: Unknown theme '{}', using default.",
167+ Yellow.paint("[bat warning]"),
168+ theme
169+ );
170+ }
171+ &self.theme_set.themes[self.fallback_theme.unwrap_or(Self::default_theme())]
163172 }
164173 }
165174 }
166175
167− pub fn get_syntax(
176+ pub(crate) fn get_syntax(
168177 &self,
169178 language: Option<&str>,
170179 filename: InputFile,
@@ -175,25 +184,28 @@ impl HighlightingAssets {
175184 (Some(language), _) => self.syntax_set.find_syntax_by_token(language),
176185 (None, InputFile::Ordinary(filename)) => {
177186 let path = Path::new(filename);
187+
178188 let file_name = path.file_name().and_then(|n| n.to_str()).unwrap_or("");
179189 let extension = path.extension().and_then(|x| x.to_str()).unwrap_or("");
180190
181− let file_name = mapping.replace(file_name);
182− let extension = mapping.replace(extension);
183−
184191 let ext_syntax = self
185192 .syntax_set
186193 .find_syntax_by_extension(&file_name)
187194 .or_else(|| self.syntax_set.find_syntax_by_extension(&extension));
188− let line_syntax = if ext_syntax.is_none() {
189− String::from_utf8(reader.first_line.clone())
190− .ok()
191− .and_then(|l| self.syntax_set.find_syntax_by_first_line(&l))
192− } else {
193− None
194− };
195−
196− ext_syntax.or(line_syntax)
195+ let line_syntax = String::from_utf8(reader.first_line.clone())
196+ .ok()
197+ .and_then(|l| self.syntax_set.find_syntax_by_first_line(&l));
198+
199+ let absolute_path = path.canonicalize().ok().unwrap_or(path.to_owned());
200+ match mapping.get_syntax_for(absolute_path) {
201+ Some(MappingTarget::MapTo(syntax_name)) => {
202+ // TODO: we should probably return an error here if this syntax can not be
203+ // found. Currently, we just fall back to 'plain'.
204+ self.syntax_set.find_syntax_by_name(syntax_name)
205+ }
206+ Some(MappingTarget::MapToUnknown) => line_syntax,
207+ None => ext_syntax.or(line_syntax),
208+ }
197209 }
198210 (None, InputFile::StdIn) => String::from_utf8(reader.first_line.clone())
199211 .ok()
@@ -205,28 +217,120 @@ impl HighlightingAssets {
205217 }
206218}
207219
208−fn theme_set_path() -> PathBuf {
209− PROJECT_DIRS.cache_dir().join("themes.bin")
210−}
220+#[cfg(test)]
221+mod tests {
222+ use std::ffi::OsStr;
223+ use std::fs::File;
224+ use std::io;
225+ use std::io::Write;
211226
212−fn syntax_set_path() -> PathBuf {
213− PROJECT_DIRS.cache_dir().join("syntaxes.bin")
214−}
227+ use tempdir::TempDir;
215228
216−pub fn config_dir() -> Cow<'static, str> {
217− PROJECT_DIRS.config_dir().to_string_lossy()
218−}
229+ use crate::assets::HighlightingAssets;
230+ use crate::inputfile::InputFile;
231+ use crate::syntax_mapping::{MappingTarget, SyntaxMapping};
219232
220−pub fn cache_dir() -> Cow<'static, str> {
221− PROJECT_DIRS.cache_dir().to_string_lossy()
222−}
233+ struct SyntaxDetectionTest<'a> {
234+ assets: HighlightingAssets,
235+ pub syntax_mapping: SyntaxMapping<'a>,
236+ temp_dir: TempDir,
237+ }
238+
239+ impl<'a> SyntaxDetectionTest<'a> {
240+ fn new() -> Self {
241+ SyntaxDetectionTest {
242+ assets: HighlightingAssets::from_binary(),
243+ syntax_mapping: SyntaxMapping::builtin(),
244+ temp_dir: TempDir::new("bat_syntax_detection_tests")
245+ .expect("creation of temporary directory"),
246+ }
247+ }
248+
249+ fn synax_for_file_with_content(&self, file_name: &str, first_line: &str) -> String {
250+ let file_path = self.temp_dir.path().join(file_name);
251+ {
252+ let mut temp_file = File::create(&file_path).unwrap();
253+ writeln!(temp_file, "{}", first_line).unwrap();
254+ }
255+
256+ let input_file = InputFile::Ordinary(OsStr::new(&file_path));
257+ let syntax = self.assets.get_syntax(
258+ None,
259+ input_file,
260+ &mut input_file.get_reader(&io::stdin()).unwrap(),
261+ &self.syntax_mapping,
262+ );
223263
224−pub fn clear_assets() {
225− print!("Clearing theme set cache ... ");
226− fs::remove_file(theme_set_path()).ok();
227− println!("okay");
264+ syntax.name.clone()
265+ }
266+
267+ fn syntax_for_file(&self, file_name: &str) -> String {
268+ self.synax_for_file_with_content(file_name, "")
269+ }
270+ }
228271
229− print!("Clearing syntax set cache ... ");
230− fs::remove_file(syntax_set_path()).ok();
231− println!("okay");
272+ #[test]
273+ fn syntax_detection_basic() {
274+ let test = SyntaxDetectionTest::new();
275+
276+ assert_eq!(test.syntax_for_file("test.rs"), "Rust");
277+ assert_eq!(test.syntax_for_file("test.cpp"), "C++");
278+ assert_eq!(test.syntax_for_file("test.build"), "NAnt Build File");
279+ assert_eq!(
280+ test.syntax_for_file("PKGBUILD"),
281+ "Bourne Again Shell (bash)"
282+ );
283+ assert_eq!(test.syntax_for_file(".bashrc"), "Bourne Again Shell (bash)");
284+ assert_eq!(test.syntax_for_file("Makefile"), "Makefile");
285+ }
286+
287+ #[test]
288+ fn syntax_detection_well_defined_mapping_for_duplicate_extensions() {
289+ let test = SyntaxDetectionTest::new();
290+
291+ assert_eq!(test.syntax_for_file("test.h"), "C++");
292+ assert_eq!(test.syntax_for_file("test.sass"), "Sass");
293+ assert_eq!(test.syntax_for_file("test.hs"), "Haskell (improved)");
294+ assert_eq!(test.syntax_for_file("test.js"), "JavaScript (Babel)");
295+ }
296+
297+ #[test]
298+ fn syntax_detection_first_line() {
299+ let test = SyntaxDetectionTest::new();
300+
301+ assert_eq!(
302+ test.synax_for_file_with_content("my_script", "#!/bin/bash"),
303+ "Bourne Again Shell (bash)"
304+ );
305+ assert_eq!(
306+ test.synax_for_file_with_content("build", "#!/bin/bash"),
307+ "Bourne Again Shell (bash)"
308+ );
309+ assert_eq!(
310+ test.synax_for_file_with_content("my_script", "<?php"),
311+ "PHP"
312+ );
313+ }
314+
315+ #[test]
316+ fn syntax_detection_with_custom_mapping() {
317+ let mut test = SyntaxDetectionTest::new();
318+
319+ assert_eq!(test.syntax_for_file("test.h"), "C++");
320+ test.syntax_mapping
321+ .insert("*.h", MappingTarget::MapTo("C"))
322+ .ok();
323+ assert_eq!(test.syntax_for_file("test.h"), "C");
324+ }
325+
326+ #[test]
327+ fn syntax_detection_is_case_sensitive() {
328+ let mut test = SyntaxDetectionTest::new();
329+
330+ assert_ne!(test.syntax_for_file("README.MD"), "Markdown");
331+ test.syntax_mapping
332+ .insert("*.MD", MappingTarget::MapTo("Markdown"))
333+ .ok();
334+ assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
335+ }
232336}
src/bin/bat/app.rs+38−38
@@ -17,13 +17,12 @@ use console::Term;
1717use ansi_term;
1818
1919use bat::{
20− assets::BAT_THEME_DEFAULT,
20+ config::{
21+ Config, HighlightedLineRanges, InputFile, LineRange, LineRanges, MappingTarget, OutputWrap,
22+ PagingMode, StyleComponent, StyleComponents, SyntaxMapping,
23+ },
2124 errors::*,
22− inputfile::InputFile,
23− line_range::{LineRange, LineRanges},
24− style::{OutputComponent, OutputComponents, OutputWrap},
25− syntax_mapping::SyntaxMapping,
26− Config, PagingMode,
25+ HighlightingAssets,
2726};
2827
2928fn is_truecolor_terminal() -> bool {
@@ -79,7 +78,7 @@ impl App {
7978
8079 pub fn config(&self) -> Result<Config> {
8180 let files = self.files();
82− let output_components = self.output_components()?;
81+ let style_components = self.style_components()?;
8382
8483 let paging_mode = match self.matches.value_of("paging") {
8584 Some("always") => PagingMode::Always,
@@ -105,17 +104,17 @@ impl App {
105104 }
106105 };
107106
108− let mut syntax_mapping = SyntaxMapping::new();
107+ let mut syntax_mapping = SyntaxMapping::builtin();
109108
110109 if let Some(values) = self.matches.values_of("map-syntax") {
111110 for from_to in values {
112111 let parts: Vec<_> = from_to.split(':').collect();
113112
114113 if parts.len() != 2 {
115− return Err("Invalid syntax mapping. The format of the -m/--map-syntax option is 'from:to'.".into());
114+ return Err("Invalid syntax mapping. The format of the -m/--map-syntax option is '<glob-pattern>:<syntax-name>'. For example: '*.cpp:C++'.".into());
116115 }
117116
118− syntax_mapping.insert(parts[0], parts[1]);
117+ syntax_mapping.insert(parts[0], MappingTarget::MapTo(parts[1]))?;
119118 }
120119 }
121120
@@ -158,7 +157,7 @@ impl App {
158157 Some("character") => OutputWrap::Character,
159158 Some("never") => OutputWrap::None,
160159 Some("auto") | _ => {
161− if output_components.plain() {
160+ if style_components.plain() {
162161 OutputWrap::None
163162 } else {
164163 OutputWrap::Character
@@ -188,7 +187,7 @@ impl App {
188187 .or_else(|| env::var("BAT_TABS").ok())
189188 .and_then(|t| t.parse().ok())
190189 .unwrap_or(
191− if output_components.plain() && paging_mode == PagingMode::Never {
190+ if style_components.plain() && paging_mode == PagingMode::Never {
192191 0
193192 } else {
194193 4
@@ -201,33 +200,34 @@ impl App {
201200 .or_else(|| env::var("BAT_THEME").ok())
202201 .map(|s| {
203202 if s == "default" {
204− String::from(BAT_THEME_DEFAULT)
203+ String::from(HighlightingAssets::default_theme())
205204 } else {
206205 s
207206 }
208207 })
209− .unwrap_or_else(|| String::from(BAT_THEME_DEFAULT)),
210− line_ranges: LineRanges::from(
211− self.matches
212− .values_of("line-range")
213− .map(|vs| vs.map(LineRange::from).collect())
214− .transpose()?
215− .unwrap_or_else(|| vec![]),
216− ),
217− output_components,
208+ .unwrap_or_else(|| String::from(HighlightingAssets::default_theme())),
209+ line_ranges: self
210+ .matches
211+ .values_of("line-range")
212+ .map(|vs| vs.map(LineRange::from).collect())
213+ .transpose()?
214+ .map(LineRanges::from)
215+ .unwrap_or_default(),
216+ style_components,
218217 syntax_mapping,
219218 pager: self.matches.value_of("pager"),
220219 use_italic_text: match self.matches.value_of("italic-text") {
221220 Some("always") => true,
222221 _ => false,
223222 },
224− highlight_lines: LineRanges::from(
225− self.matches
226− .values_of("highlight-line")
227− .map(|ws| ws.map(LineRange::from).collect())
228− .transpose()?
229− .unwrap_or_else(|| vec![LineRange { lower: 0, upper: 0 }]),
230− ),
223+ highlighted_lines: self
224+ .matches
225+ .values_of("highlight-line")
226+ .map(|ws| ws.map(LineRange::from).collect())
227+ .transpose()?
228+ .map(LineRanges::from)
229+ .map(|lr| HighlightedLineRanges(lr))
230+ .unwrap_or_default(),
231231 filenames: self
232232 .matches
233233 .values_of("file-name")
@@ -252,23 +252,23 @@ impl App {
252252 .unwrap_or_else(|| vec![InputFile::StdIn])
253253 }
254254
255− fn output_components(&self) -> Result<OutputComponents> {
255+ fn style_components(&self) -> Result<StyleComponents> {
256256 let matches = &self.matches;
257− Ok(OutputComponents(
257+ Ok(StyleComponents(
258258 if matches.value_of("decorations") == Some("never") {
259259 HashSet::new()
260260 } else if matches.is_present("number") {
261− [OutputComponent::Numbers].iter().cloned().collect()
261+ [StyleComponent::Numbers].iter().cloned().collect()
262262 } else if matches.is_present("plain") {
263− [OutputComponent::Plain].iter().cloned().collect()
263+ [StyleComponent::Plain].iter().cloned().collect()
264264 } else {
265− let env_style_components: Option<Vec<OutputComponent>> = env::var("BAT_STYLE")
265+ let env_style_components: Option<Vec<StyleComponent>> = env::var("BAT_STYLE")
266266 .ok()
267267 .map(|style_str| {
268268 style_str
269269 .split(',')
270− .map(|x| OutputComponent::from_str(&x))
271− .collect::<Result<Vec<OutputComponent>>>()
270+ .map(|x| StyleComponent::from_str(&x))
271+ .collect::<Result<Vec<StyleComponent>>>()
272272 })
273273 .transpose()?;
274274
@@ -277,12 +277,12 @@ impl App {
277277 .map(|styles| {
278278 styles
279279 .split(',')
280− .map(|style| style.parse::<OutputComponent>())
280+ .map(|style| style.parse::<StyleComponent>())
281281 .filter_map(|style| style.ok())
282282 .collect::<Vec<_>>()
283283 })
284284 .or(env_style_components)
285− .unwrap_or_else(|| vec![OutputComponent::Full])
285+ .unwrap_or_else(|| vec![StyleComponent::Full])
286286 .into_iter()
287287 .map(|style| style.components(self.interactive_output))
288288 .fold(HashSet::new(), |mut acc, components| {
src/bin/bat/assets.rsnew file+38
@@ -0,0 +1,38 @@
1+use std::borrow::Cow;
2+use std::fs;
3+use std::path::PathBuf;
4+
5+use crate::directories::PROJECT_DIRS;
6+
7+use bat::HighlightingAssets;
8+
9+fn theme_set_path() -> PathBuf {
10+ PROJECT_DIRS.cache_dir().join("themes.bin")
11+}
12+
13+fn syntax_set_path() -> PathBuf {
14+ PROJECT_DIRS.cache_dir().join("syntaxes.bin")
15+}
16+
17+pub fn config_dir() -> Cow<'static, str> {
18+ PROJECT_DIRS.config_dir().to_string_lossy()
19+}
20+
21+pub fn cache_dir() -> Cow<'static, str> {
22+ PROJECT_DIRS.cache_dir().to_string_lossy()
23+}
24+
25+pub fn clear_assets() {
26+ print!("Clearing theme set cache ... ");
27+ fs::remove_file(theme_set_path()).ok();
28+ println!("okay");
29+
30+ print!("Clearing syntax set cache ... ");
31+ fs::remove_file(syntax_set_path()).ok();
32+ println!("okay");
33+}
34+
35+pub fn assets_from_cache_or_binary() -> HighlightingAssets {
36+ HighlightingAssets::from_cache(&theme_set_path(), &syntax_set_path())
37+ .unwrap_or(HighlightingAssets::from_binary())
38+}
src/bin/bat/clap_app.rs+7−7
@@ -260,13 +260,13 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
260260 .multiple(true)
261261 .takes_value(true)
262262 .number_of_values(1)
263− .value_name("from:to")
264− .help("Map a file extension or name to an existing syntax.")
263+ .value_name("glob:syntax")
264+ .help("Use the specified syntax for files matching the glob pattern ('*.cpp:C++').")
265265 .long_help(
266− "Map a file extension or file name to an existing syntax (specified by a file \
267− extension or file name). For example, to highlight *.build files with the \
268− Python syntax, use '-m build:py'. To highlight files named '.myignore' with \
269− the Git Ignore syntax, use '-m .myignore:gitignore'.",
266+ "Map a glob pattern to an existing syntax name. The glob pattern is matched \
267+ on the full path and the filename. For example, to highlight *.build files \
268+ with the Python syntax, use -m '*.build:Python'. To highlight files named \
269+ '.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'.",
270270 )
271271 .takes_value(true),
272272 )
@@ -293,7 +293,7 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> {
293293 .arg(
294294 Arg::with_name("style")
295295 .long("style")
296− .value_name("style-components")
296+ .value_name("components")
297297 // Need to turn this off for overrides_with to work as we want. See the bottom most
298298 // example at https://docs.rs/clap/2.32.0/clap/struct.Arg.html#method.overrides_with
299299 .use_delimiter(false)
src/bin/bat/config.rs+1−1
@@ -5,7 +5,7 @@ use std::path::PathBuf;
55
66use shell_words;
77
8−use bat::dirs::PROJECT_DIRS;
8+use crate::directories::PROJECT_DIRS;
99
1010pub fn config_file() -> PathBuf {
1111 env::var("BAT_CONFIG_PATH")
src/dirs.rs → src/bin/bat/directories.rsrenamed+25−15
@@ -1,8 +1,8 @@
1−use crate::dirs_rs;
1+use std::env;
22use std::path::{Path, PathBuf};
33
4−#[cfg(target_os = "macos")]
5−use std::env;
4+use dirs;
5+use lazy_static::lazy_static;
66
77/// Wrapper for 'dirs' that treats MacOS more like Linux, by following the XDG specification.
88/// This means that the `XDG_CACHE_HOME` and `XDG_CONFIG_HOME` environment variables are
@@ -14,25 +14,16 @@ pub struct BatProjectDirs {
1414
1515impl BatProjectDirs {
1616 fn new() -> Option<BatProjectDirs> {
17− #[cfg(target_os = "macos")]
18− let cache_dir_op = env::var_os("XDG_CACHE_HOME")
19− .map(PathBuf::from)
20− .filter(|p| p.is_absolute())
21− .or_else(|| dirs_rs::home_dir().map(|d| d.join(".cache")));
22−
23− #[cfg(not(target_os = "macos"))]
24− let cache_dir_op = dirs_rs::cache_dir();
25−
26− let cache_dir = cache_dir_op.map(|d| d.join("bat"))?;
17+ let cache_dir = BatProjectDirs::get_cache_dir()?;
2718
2819 #[cfg(target_os = "macos")]
2920 let config_dir_op = env::var_os("XDG_CONFIG_HOME")
3021 .map(PathBuf::from)
3122 .filter(|p| p.is_absolute())
32− .or_else(|| dirs_rs::home_dir().map(|d| d.join(".config")));
23+ .or_else(|| dirs::home_dir().map(|d| d.join(".config")));
3324
3425 #[cfg(not(target_os = "macos"))]
35− let config_dir_op = dirs_rs::config_dir();
26+ let config_dir_op = dirs::config_dir();
3627
3728 let config_dir = config_dir_op.map(|d| d.join("bat"))?;
3829
@@ -42,6 +33,25 @@ impl BatProjectDirs {
4233 })
4334 }
4435
36+ pub fn get_cache_dir() -> Option<PathBuf> {
37+ // on all OS prefer BAT_CACHE_PATH if set
38+ let cache_dir_op = env::var_os("BAT_CACHE_PATH").map(PathBuf::from);
39+ if cache_dir_op.is_some() {
40+ return cache_dir_op;
41+ }
42+
43+ #[cfg(target_os = "macos")]
44+ let cache_dir_op = env::var_os("XDG_CACHE_HOME")
45+ .map(PathBuf::from)
46+ .filter(|p| p.is_absolute())
47+ .or_else(|| dirs::home_dir().map(|d| d.join(".cache")));
48+
49+ #[cfg(not(target_os = "macos"))]
50+ let cache_dir_op = dirs::cache_dir();
51+
52+ cache_dir_op.map(|d| d.join("bat"))
53+ }
54+
4555 pub fn cache_dir(&self) -> &Path {
4656 &self.cache_dir
4757 }
src/bin/bat/main.rs+27−19
@@ -4,9 +4,13 @@
44#[macro_use]
55extern crate clap;
66
7+extern crate dirs as dirs_rs;
8+
79mod app;
10+mod assets;
811mod clap_app;
912mod config;
13+mod directories;
1014
1115use std::collections::HashSet;
1216use std::ffi::OsStr;
@@ -19,25 +23,31 @@ use ansi_term::Colour::Green;
1923use ansi_term::Style;
2024
2125use crate::{app::App, config::config_file};
22−use bat::controller::Controller;
26+use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
27+use bat::Controller;
28+use directories::PROJECT_DIRS;
2329
2430use bat::{
25− assets::{cache_dir, clear_assets, config_dir, HighlightingAssets},
31+ config::{Config, InputFile, StyleComponent, StyleComponents},
2632 errors::*,
27− inputfile::InputFile,
28− style::{OutputComponent, OutputComponents},
29− Config,
33+ HighlightingAssets,
3034};
3135
3236fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
3337 if matches.is_present("build") {
34− let source_dir = matches.value_of("source").map(Path::new);
35− let target_dir = matches.value_of("target").map(Path::new);
38+ let source_dir = matches
39+ .value_of("source")
40+ .map(Path::new)
41+ .unwrap_or_else(|| PROJECT_DIRS.config_dir());
42+ let target_dir = matches
43+ .value_of("target")
44+ .map(Path::new)
45+ .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
3646
3747 let blank = matches.is_present("blank");
3848
39− let assets = HighlightingAssets::from_files(source_dir, blank)?;
40− assets.save(target_dir)?;
49+ let assets = HighlightingAssets::from_files(source_dir, !blank)?;
50+ assets.save_to_cache(target_dir)?;
4151 } else if matches.is_present("clear") {
4252 clear_assets();
4353 }
@@ -46,9 +56,8 @@ fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
4656}
4757
4858pub fn list_languages(config: &Config) -> Result<()> {
49− let assets = HighlightingAssets::new();
59+ let assets = assets_from_cache_or_binary();
5060 let mut languages = assets
51− .syntax_set
5261 .syntaxes()
5362 .iter()
5463 .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty())
@@ -109,19 +118,18 @@ pub fn list_languages(config: &Config) -> Result<()> {
109118}
110119
111120pub fn list_themes(cfg: &Config) -> Result<()> {
112− let assets = HighlightingAssets::new();
113− let themes = &assets.theme_set.themes;
121+ let assets = assets_from_cache_or_binary();
114122 let mut config = cfg.clone();
115123 let mut style = HashSet::new();
116− style.insert(OutputComponent::Plain);
124+ style.insert(StyleComponent::Plain);
117125 config.files = vec![InputFile::ThemePreviewFile];
118− config.output_components = OutputComponents(style);
126+ config.style_components = StyleComponents(style);
119127
120128 let stdout = io::stdout();
121129 let mut stdout = stdout.lock();
122130
123131 if config.colored_output {
124− for (theme, _) in themes.iter() {
132+ for theme in assets.themes() {
125133 writeln!(
126134 stdout,
127135 "Theme: {}\n",
@@ -132,7 +140,7 @@ pub fn list_themes(cfg: &Config) -> Result<()> {
132140 writeln!(stdout)?;
133141 }
134142 } else {
135− for (theme, _) in themes.iter() {
143+ for theme in assets.themes() {
136144 writeln!(stdout, "{}", theme)?;
137145 }
138146 }
@@ -141,7 +149,7 @@ pub fn list_themes(cfg: &Config) -> Result<()> {
141149}
142150
143151fn run_controller(config: &Config) -> Result<bool> {
144− let assets = HighlightingAssets::new();
152+ let assets = assets_from_cache_or_binary();
145153 let controller = Controller::new(&config, &assets);
146154 controller.run()
147155}
@@ -199,7 +207,7 @@ fn main() {
199207
200208 match result {
201209 Err(error) => {
202− handle_error(&error);
210+ default_error_handler(&error);
203211 process::exit(1);
204212 }
205213 Ok(false) => {
src/config.rsnew file+96
@@ -0,0 +1,96 @@
1+pub use crate::inputfile::InputFile;
2+pub use crate::line_range::{HighlightedLineRanges, LineRange, LineRanges};
3+pub use crate::style::{StyleComponent, StyleComponents};
4+pub use crate::syntax_mapping::{MappingTarget, SyntaxMapping};
5+pub use crate::wrap::OutputWrap;
6+
7+#[derive(Debug, Clone, Copy, PartialEq)]
8+pub enum PagingMode {
9+ Always,
10+ QuitIfOneScreen,
11+ Never,
12+}
13+
14+impl Default for PagingMode {
15+ fn default() -> Self {
16+ PagingMode::Never
17+ }
18+}
19+
20+#[derive(Debug, Clone, Default)]
21+pub struct Config<'a> {
22+ /// List of files to print
23+ pub files: Vec<InputFile<'a>>,
24+
25+ /// The explicitly configured language, if any
26+ pub language: Option<&'a str>,
27+
28+ /// Whether or not to show/replace non-printable characters like space, tab and newline.
29+ pub show_nonprintable: bool,
30+
31+ /// The character width of the terminal
32+ pub term_width: usize,
33+
34+ /// The width of tab characters.
35+ /// Currently, a value of 0 will cause tabs to be passed through without expanding them.
36+ pub tab_width: usize,
37+
38+ /// Whether or not to simply loop through all input (`cat` mode)
39+ pub loop_through: bool,
40+
41+ /// Whether or not the output should be colorized
42+ pub colored_output: bool,
43+
44+ /// Whether or not the output terminal supports true color
45+ pub true_color: bool,
46+
47+ /// Style elements (grid, line numbers, ...)
48+ pub style_components: StyleComponents,
49+
50+ /// Text wrapping mode
51+ pub output_wrap: OutputWrap,
52+
53+ /// Pager or STDOUT
54+ pub paging_mode: PagingMode,
55+
56+ /// Specifies the lines that should be printed
57+ pub line_ranges: LineRanges,
58+
59+ /// The syntax highlighting theme
60+ pub theme: String,
61+
62+ /// File extension/name mappings
63+ pub syntax_mapping: SyntaxMapping<'a>,
64+
65+ /// Command to start the pager
66+ pub pager: Option<&'a str>,
67+
68+ /// Whether or not to use ANSI italics
69+ pub use_italic_text: bool,
70+
71+ /// Ranges of lines which should be highlighted with a special background color
72+ pub highlighted_lines: HighlightedLineRanges,
73+
74+ /// Name of file to display when printing
75+ pub filenames: Option<Vec<&'a str>>,
76+}
77+
78+#[test]
79+fn default_config_should_include_all_lines() {
80+ use crate::line_range::RangeCheckResult;
81+
82+ assert_eq!(
83+ Config::default().line_ranges.check(17),
84+ RangeCheckResult::InRange
85+ );
86+}
87+
88+#[test]
89+fn default_config_should_highlight_no_lines() {
90+ use crate::line_range::RangeCheckResult;
91+
92+ assert_ne!(
93+ Config::default().highlighted_lines.0.check(17),
94+ RangeCheckResult::InRange
95+ );
96+}
src/controller.rs+8−4
@@ -2,12 +2,12 @@ use std::io::{self, Write};
22use std::path::Path;
33
44use crate::assets::HighlightingAssets;
5+use crate::config::{Config, PagingMode};
56use crate::errors::*;
67use crate::inputfile::{InputFile, InputFileReader};
78use crate::line_range::{LineRanges, RangeCheckResult};
89use crate::output::OutputType;
910use crate::printer::{InteractivePrinter, Printer, SimplePrinter};
10−use crate::{Config, PagingMode};
1111
1212pub struct Controller<'a> {
1313 config: &'a Config<'a>,
@@ -20,6 +20,10 @@ impl<'b> Controller<'b> {
2020 }
2121
2222 pub fn run(&self) -> Result<bool> {
23+ self.run_with_error_handler(default_error_handler)
24+ }
25+
26+ pub fn run_with_error_handler(&self, handle_error: impl Fn(&Error)) -> Result<bool> {
2327 // Do not launch the pager if NONE of the input files exist
2428 let mut paging_mode = self.config.paging_mode;
2529 if self.config.paging_mode != PagingMode::Never {
@@ -93,7 +97,7 @@ impl<'b> Controller<'b> {
9397 input_file: InputFile<'a>,
9498 file_name: Option<&str>,
9599 ) -> Result<()> {
96− if !reader.first_line.is_empty() || self.config.output_components.header() {
100+ if !reader.first_line.is_empty() || self.config.style_components.header() {
97101 printer.print_header(writer, input_file, file_name)?;
98102 }
99103
@@ -120,7 +124,7 @@ impl<'b> Controller<'b> {
120124
121125 while reader.read_line(&mut line_buffer)? {
122126 match line_ranges.check(line_number) {
123− RangeCheckResult::OutsideRange => {
127+ RangeCheckResult::BeforeOrBetweenRanges => {
124128 // Call the printer in case we need to call the syntax highlighter
125129 // for this line. However, set `out_of_range` to `true`.
126130 printer.print_line(true, writer, line_number, &line_buffer)?;
@@ -128,7 +132,7 @@ impl<'b> Controller<'b> {
128132 }
129133
130134 RangeCheckResult::InRange => {
131− if self.config.output_components.snip() {
135+ if self.config.style_components.snip() {
132136 if first_range {
133137 first_range = false;
134138 mid_range = true;
src/errors.rsnew file+25
@@ -0,0 +1,25 @@
1+use error_chain::error_chain;
2+
3+error_chain! {
4+ foreign_links {
5+ Clap(::clap::Error);
6+ Io(::std::io::Error);
7+ SyntectError(::syntect::LoadingError);
8+ ParseIntError(::std::num::ParseIntError);
9+ GlobParsingError(::globset::Error);
10+ }
11+}
12+
13+pub fn default_error_handler(error: &Error) {
14+ match error {
15+ Error(ErrorKind::Io(ref io_error), _)
16+ if io_error.kind() == ::std::io::ErrorKind::BrokenPipe =>
17+ {
18+ ::std::process::exit(0);
19+ }
20+ _ => {
21+ use ansi_term::Colour::Red;
22+ eprintln!("{}: {}", Red.paint("[bat error]"), error);
23+ }
24+ };
25+}
src/inputfile.rs+4−4
@@ -10,8 +10,8 @@ const THEME_PREVIEW_FILE: &[u8] = include_bytes!("../assets/theme_preview.rs");
1010
1111pub struct InputFileReader<'a> {
1212 inner: Box<dyn BufRead + 'a>,
13− pub first_line: Vec<u8>,
14− pub content_type: Option<ContentType>,
13+ pub(crate) first_line: Vec<u8>,
14+ pub(crate) content_type: Option<ContentType>,
1515}
1616
1717impl<'a> InputFileReader<'a> {
@@ -36,7 +36,7 @@ impl<'a> InputFileReader<'a> {
3636 }
3737 }
3838
39− pub fn read_line(&mut self, buf: &mut Vec<u8>) -> io::Result<bool> {
39+ pub(crate) fn read_line(&mut self, buf: &mut Vec<u8>) -> io::Result<bool> {
4040 if self.first_line.is_empty() {
4141 let res = self.inner.read_until(b'\n', buf).map(|size| size > 0)?;
4242
@@ -60,7 +60,7 @@ pub enum InputFile<'a> {
6060}
6161
6262impl<'a> InputFile<'a> {
63− pub fn get_reader(&self, stdin: &'a io::Stdin) -> Result<InputFileReader> {
63+ pub(crate) fn get_reader(&self, stdin: &'a io::Stdin) -> Result<InputFileReader> {
6464 match self {
6565 InputFile::StdIn => Ok(InputFileReader::new(stdin.lock())),
6666 InputFile::Ordinary(filename) => {
src/lib.rs+13−114
@@ -1,12 +1,6 @@
11// `error_chain!` can recurse deeply
22#![recursion_limit = "1024"]
33
4−#[macro_use]
5−extern crate error_chain;
6−
7−#[macro_use]
8−extern crate lazy_static;
9−
104extern crate ansi_term;
115extern crate atty;
126extern crate console;
@@ -18,118 +12,23 @@ extern crate shell_words;
1812extern crate syntect;
1913extern crate wild;
2014
21−pub mod assets;
22−pub mod controller;
15+pub(crate) mod assets;
16+pub mod config;
17+pub(crate) mod controller;
2318mod decorations;
2419mod diff;
25−pub mod dirs;
26−pub mod inputfile;
20+pub mod errors;
21+pub(crate) mod inputfile;
2722mod less;
28−pub mod line_range;
23+pub(crate) mod line_range;
2924mod output;
3025mod preprocessor;
31−mod printer;
32−pub mod style;
33−pub mod syntax_mapping;
26+pub(crate) mod printer;
27+pub(crate) mod style;
28+pub(crate) mod syntax_mapping;
3429mod terminal;
30+pub(crate) mod wrap;
3531
36−pub mod errors {
37− error_chain! {
38− foreign_links {
39− Clap(::clap::Error);
40− Io(::std::io::Error);
41− SyntectError(::syntect::LoadingError);
42− ParseIntError(::std::num::ParseIntError);
43− }
44− }
45−
46− pub fn handle_error(error: &Error) {
47− match error {
48− Error(ErrorKind::Io(ref io_error), _)
49− if io_error.kind() == ::std::io::ErrorKind::BrokenPipe =>
50− {
51− ::std::process::exit(0);
52− }
53− _ => {
54− use ansi_term::Colour::Red;
55− eprintln!("{}: {}", Red.paint("[bat error]"), error);
56− }
57− };
58− }
59−}
60−
61−#[derive(Debug, Clone, Copy, PartialEq)]
62−pub enum PagingMode {
63− Always,
64− QuitIfOneScreen,
65− Never,
66−}
67−
68−impl Default for PagingMode {
69− fn default() -> Self {
70− PagingMode::Never
71− }
72−}
73−
74−use inputfile::InputFile;
75−use line_range::LineRanges;
76−use style::{OutputComponents, OutputWrap};
77−use syntax_mapping::SyntaxMapping;
78−
79−#[derive(Debug, Clone, Default)]
80−pub struct Config<'a> {
81− /// List of files to print
82− pub files: Vec<InputFile<'a>>,
83−
84− /// The explicitly configured language, if any
85− pub language: Option<&'a str>,
86−
87− /// Whether or not to show/replace non-printable characters like space, tab and newline.
88− pub show_nonprintable: bool,
89−
90− /// The character width of the terminal
91− pub term_width: usize,
92−
93− /// The width of tab characters.
94− /// Currently, a value of 0 will cause tabs to be passed through without expanding them.
95− pub tab_width: usize,
96−
97− /// Whether or not to simply loop through all input (`cat` mode)
98− pub loop_through: bool,
99−
100− /// Whether or not the output should be colorized
101− pub colored_output: bool,
102−
103− /// Whether or not the output terminal supports true color
104− pub true_color: bool,
105−
106− /// Style elements (grid, line numbers, ...)
107− pub output_components: OutputComponents,
108−
109− /// Text wrapping mode
110− pub output_wrap: OutputWrap,
111−
112− /// Pager or STDOUT
113− pub paging_mode: PagingMode,
114−
115− /// Specifies the lines that should be printed
116− pub line_ranges: LineRanges,
117−
118− /// The syntax highlighting theme
119− pub theme: String,
120−
121− /// File extension/name mappings
122− pub syntax_mapping: SyntaxMapping,
123−
124− /// Command to start the pager
125− pub pager: Option<&'a str>,
126−
127− /// Whether or not to use ANSI italics
128− pub use_italic_text: bool,
129−
130− /// Lines to highlight
131− pub highlight_lines: LineRanges,
132−
133− /// Name of file to display when printing
134− pub filenames: Option<Vec<&'a str>>,
135−}
32+pub use assets::HighlightingAssets;
33+pub use controller::Controller;
34+pub use printer::{InteractivePrinter, Printer, SimplePrinter};
src/line_range.rs+53−21
@@ -6,20 +6,22 @@ pub struct LineRange {
66 pub upper: usize,
77}
88
9−impl LineRange {
10− pub fn from(range_raw: &str) -> Result<LineRange> {
11− LineRange::parse_range(range_raw)
12− }
13−
14− pub fn new() -> LineRange {
9+impl Default for LineRange {
10+ fn default() -> LineRange {
1511 LineRange {
1612 lower: usize::min_value(),
1713 upper: usize::max_value(),
1814 }
1915 }
16+}
17+
18+impl LineRange {
19+ pub fn from(range_raw: &str) -> Result<LineRange> {
20+ LineRange::parse_range(range_raw)
21+ }
2022
21− pub fn parse_range(range_raw: &str) -> Result<LineRange> {
22− let mut new_range = LineRange::new();
23+ fn parse_range(range_raw: &str) -> Result<LineRange> {
24+ let mut new_range = LineRange::default();
2325
2426 if range_raw.bytes().nth(0).ok_or("Empty line range")? == b':' {
2527 new_range.upper = range_raw[1..].parse()?;
@@ -48,7 +50,7 @@ impl LineRange {
4850 }
4951 }
5052
51− pub fn is_inside(&self, line: usize) -> bool {
53+ pub(crate) fn is_inside(&self, line: usize) -> bool {
5254 line >= self.lower && line <= self.upper
5355 }
5456}
@@ -97,19 +99,27 @@ pub enum RangeCheckResult {
9799 InRange,
98100
99101 // Before the first range or within two ranges
100− OutsideRange,
102+ BeforeOrBetweenRanges,
101103
102104 // Line number is outside of all ranges and larger than the last range.
103105 AfterLastRange,
104106}
105107
106−#[derive(Debug, Clone, Default)]
108+#[derive(Debug, Clone)]
107109pub struct LineRanges {
108110 ranges: Vec<LineRange>,
109111 largest_upper_bound: usize,
110112}
111113
112114impl LineRanges {
115+ pub fn none() -> LineRanges {
116+ LineRanges::from(vec![])
117+ }
118+
119+ pub fn all() -> LineRanges {
120+ LineRanges::from(vec![LineRange::default()])
121+ }
122+
113123 pub fn from(ranges: Vec<LineRange>) -> LineRanges {
114124 let largest_upper_bound = ranges
115125 .iter()
@@ -122,17 +132,32 @@ impl LineRanges {
122132 }
123133 }
124134
125− pub fn check(&self, line: usize) -> RangeCheckResult {
126− if self.ranges.is_empty() | self.ranges.iter().any(|r| r.is_inside(line)) {
135+ pub(crate) fn check(&self, line: usize) -> RangeCheckResult {
136+ if self.ranges.iter().any(|r| r.is_inside(line)) {
127137 RangeCheckResult::InRange
128138 } else if line < self.largest_upper_bound {
129− RangeCheckResult::OutsideRange
139+ RangeCheckResult::BeforeOrBetweenRanges
130140 } else {
131141 RangeCheckResult::AfterLastRange
132142 }
133143 }
134144}
135145
146+impl Default for LineRanges {
147+ fn default() -> Self {
148+ Self::all()
149+ }
150+}
151+
152+#[derive(Debug, Clone)]
153+pub struct HighlightedLineRanges(pub LineRanges);
154+
155+impl Default for HighlightedLineRanges {
156+ fn default() -> Self {
157+ HighlightedLineRanges(LineRanges::none())
158+ }
159+}
160+
136161#[cfg(test)]
137162fn ranges(rs: &[&str]) -> LineRanges {
138163 LineRanges::from(rs.iter().map(|r| LineRange::from(r).unwrap()).collect())
@@ -142,7 +167,7 @@ fn ranges(rs: &[&str]) -> LineRanges {
142167fn test_ranges_simple() {
143168 let ranges = ranges(&["3:8"]);
144169
145− assert_eq!(RangeCheckResult::OutsideRange, ranges.check(2));
170+ assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(2));
146171 assert_eq!(RangeCheckResult::InRange, ranges.check(5));
147172 assert_eq!(RangeCheckResult::AfterLastRange, ranges.check(9));
148173}
@@ -151,11 +176,11 @@ fn test_ranges_simple() {
151176fn test_ranges_advanced() {
152177 let ranges = ranges(&["3:8", "11:20", "25:30"]);
153178
154− assert_eq!(RangeCheckResult::OutsideRange, ranges.check(2));
179+ assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(2));
155180 assert_eq!(RangeCheckResult::InRange, ranges.check(5));
156− assert_eq!(RangeCheckResult::OutsideRange, ranges.check(9));
181+ assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(9));
157182 assert_eq!(RangeCheckResult::InRange, ranges.check(11));
158− assert_eq!(RangeCheckResult::OutsideRange, ranges.check(22));
183+ assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(22));
159184 assert_eq!(RangeCheckResult::InRange, ranges.check(28));
160185 assert_eq!(RangeCheckResult::AfterLastRange, ranges.check(31));
161186}
@@ -174,15 +199,22 @@ fn test_ranges_open_low() {
174199fn test_ranges_open_high() {
175200 let ranges = ranges(&["3:", "2:5"]);
176201
177− assert_eq!(RangeCheckResult::OutsideRange, ranges.check(1));
202+ assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(1));
178203 assert_eq!(RangeCheckResult::InRange, ranges.check(3));
179204 assert_eq!(RangeCheckResult::InRange, ranges.check(5));
180205 assert_eq!(RangeCheckResult::InRange, ranges.check(9));
181206}
182207
183208#[test]
184−fn test_ranges_empty() {
185− let ranges = ranges(&[]);
209+fn test_ranges_all() {
210+ let ranges = LineRanges::all();
186211
187212 assert_eq!(RangeCheckResult::InRange, ranges.check(1));
188213}
214+
215+#[test]
216+fn test_ranges_none() {
217+ let ranges = LineRanges::none();
218+
219+ assert_ne!(RangeCheckResult::InRange, ranges.check(1));
220+}
src/output.rs+1−1
@@ -6,9 +6,9 @@ use std::process::{Child, Command, Stdio};
66
77use shell_words;
88
9+use crate::config::PagingMode;
910use crate::errors::*;
1011use crate::less::retrieve_less_version;
11−use crate::PagingMode;
1212
1313#[derive(Debug)]
1414pub enum OutputType {
src/printer.rs+13−13
@@ -20,6 +20,7 @@ use encoding::{DecoderTrap, Encoding};
2020use unicode_width::UnicodeWidthChar;
2121
2222use crate::assets::HighlightingAssets;
23+use crate::config::Config;
2324use crate::decorations::{
2425 Decoration, GridBorderDecoration, LineChangesDecoration, LineNumberDecoration,
2526};
@@ -29,9 +30,8 @@ use crate::errors::*;
2930use crate::inputfile::{InputFile, InputFileReader};
3031use crate::line_range::RangeCheckResult;
3132use crate::preprocessor::{expand_tabs, replace_nonprintable};
32−use crate::style::OutputWrap;
3333use crate::terminal::{as_terminal_escaped, to_ansi_color};
34−use crate::Config;
34+use crate::wrap::OutputWrap;
3535
3636pub trait Printer {
3737 fn print_header(
@@ -126,11 +126,11 @@ impl<'a> InteractivePrinter<'a> {
126126 // Create decorations.
127127 let mut decorations: Vec<Box<dyn Decoration>> = Vec::new();
128128
129− if config.output_components.numbers() {
129+ if config.style_components.numbers() {
130130 decorations.push(Box::new(LineNumberDecoration::new(&colors)));
131131 }
132132
133− if config.output_components.changes() {
133+ if config.style_components.changes() {
134134 decorations.push(Box::new(LineChangesDecoration::new(&colors)));
135135 }
136136
@@ -140,7 +140,7 @@ impl<'a> InteractivePrinter<'a> {
140140 // The grid border decoration isn't added until after the panel_width calculation, since the
141141 // print_horizontal_line, print_header, and print_footer functions all assume the panel
142142 // width is without the grid border.
143− if config.output_components.grid() && !decorations.is_empty() {
143+ if config.style_components.grid() && !decorations.is_empty() {
144144 decorations.push(Box::new(GridBorderDecoration::new(&colors)));
145145 }
146146
@@ -162,7 +162,7 @@ impl<'a> InteractivePrinter<'a> {
162162 None
163163 } else {
164164 // Get the Git modifications
165− line_changes = if config.output_components.changes() {
165+ line_changes = if config.style_components.changes() {
166166 match file {
167167 InputFile::Ordinary(filename) => get_git_diff(filename),
168168 _ => None,
@@ -216,7 +216,7 @@ impl<'a> InteractivePrinter<'a> {
216216 text_truncated,
217217 " ".repeat(self.panel_width - 1 - text_truncated.len())
218218 );
219− if self.config.output_components.grid() {
219+ if self.config.style_components.grid() {
220220 format!("{} │ ", text_filled)
221221 } else {
222222 format!("{}", text_filled)
@@ -240,7 +240,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
240240 file: InputFile,
241241 file_name: Option<&str>,
242242 ) -> Result<()> {
243− if !self.config.output_components.header() {
243+ if !self.config.style_components.header() {
244244 if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable {
245245 let input = match file {
246246 InputFile::Ordinary(filename) => format!(
@@ -259,14 +259,14 @@ impl<'a> Printer for InteractivePrinter<'a> {
259259 input
260260 )?;
261261 } else {
262− if self.config.output_components.grid() {
262+ if self.config.style_components.grid() {
263263 self.print_horizontal_line(handle, '┬')?;
264264 }
265265 }
266266 return Ok(());
267267 }
268268
269− if self.config.output_components.grid() {
269+ if self.config.style_components.grid() {
270270 self.print_horizontal_line(handle, '┬')?;
271271
272272 write!(
@@ -305,7 +305,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
305305 mode
306306 )?;
307307
308− if self.config.output_components.grid() {
308+ if self.config.style_components.grid() {
309309 if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable {
310310 self.print_horizontal_line(handle, '┼')?;
311311 } else {
@@ -317,7 +317,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
317317 }
318318
319319 fn print_footer(&mut self, handle: &mut dyn Write) -> Result<()> {
320− if self.config.output_components.grid()
320+ if self.config.style_components.grid()
321321 && (self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable)
322322 {
323323 self.print_horizontal_line(handle, '┴')
@@ -395,7 +395,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
395395
396396 // Line highlighting
397397 let highlight_this_line =
398− self.config.highlight_lines.check(line_number) == RangeCheckResult::InRange;
398+ self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange;
399399
400400 let background_color = self
401401 .background_color_highlight
src/style.rs+37−49
@@ -4,7 +4,7 @@ use std::str::FromStr;
44use crate::errors::*;
55
66#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
7−pub enum OutputComponent {
7+pub enum StyleComponent {
88 Auto,
99 Changes,
1010 Grid,
@@ -15,92 +15,80 @@ pub enum OutputComponent {
1515 Plain,
1616}
1717
18−#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
19−pub enum OutputWrap {
20− Character,
21− None,
22−}
23−
24−impl Default for OutputWrap {
25− fn default() -> Self {
26− OutputWrap::None
27− }
28−}
29−
30−impl OutputComponent {
31− pub fn components(self, interactive_terminal: bool) -> &'static [OutputComponent] {
18+impl StyleComponent {
19+ pub fn components(self, interactive_terminal: bool) -> &'static [StyleComponent] {
3220 match self {
33− OutputComponent::Auto => {
21+ StyleComponent::Auto => {
3422 if interactive_terminal {
35− OutputComponent::Full.components(interactive_terminal)
23+ StyleComponent::Full.components(interactive_terminal)
3624 } else {
37− OutputComponent::Plain.components(interactive_terminal)
25+ StyleComponent::Plain.components(interactive_terminal)
3826 }
3927 }
40− OutputComponent::Changes => &[OutputComponent::Changes],
41− OutputComponent::Grid => &[OutputComponent::Grid],
42− OutputComponent::Header => &[OutputComponent::Header],
43− OutputComponent::Numbers => &[OutputComponent::Numbers],
44− OutputComponent::Snip => &[OutputComponent::Snip],
45− OutputComponent::Full => &[
46− OutputComponent::Changes,
47− OutputComponent::Grid,
48− OutputComponent::Header,
49− OutputComponent::Numbers,
50− OutputComponent::Snip,
28+ StyleComponent::Changes => &[StyleComponent::Changes],
29+ StyleComponent::Grid => &[StyleComponent::Grid],
30+ StyleComponent::Header => &[StyleComponent::Header],
31+ StyleComponent::Numbers => &[StyleComponent::Numbers],
32+ StyleComponent::Snip => &[StyleComponent::Snip],
33+ StyleComponent::Full => &[
34+ StyleComponent::Changes,
35+ StyleComponent::Grid,
36+ StyleComponent::Header,
37+ StyleComponent::Numbers,
38+ StyleComponent::Snip,
5139 ],
52− OutputComponent::Plain => &[],
40+ StyleComponent::Plain => &[],
5341 }
5442 }
5543}
5644
57−impl FromStr for OutputComponent {
45+impl FromStr for StyleComponent {
5846 type Err = Error;
5947
6048 fn from_str(s: &str) -> Result<Self> {
6149 match s {
62− "auto" => Ok(OutputComponent::Auto),
63− "changes" => Ok(OutputComponent::Changes),
64− "grid" => Ok(OutputComponent::Grid),
65− "header" => Ok(OutputComponent::Header),
66− "numbers" => Ok(OutputComponent::Numbers),
67− "snip" => Ok(OutputComponent::Snip),
68− "full" => Ok(OutputComponent::Full),
69− "plain" => Ok(OutputComponent::Plain),
50+ "auto" => Ok(StyleComponent::Auto),
51+ "changes" => Ok(StyleComponent::Changes),
52+ "grid" => Ok(StyleComponent::Grid),
53+ "header" => Ok(StyleComponent::Header),
54+ "numbers" => Ok(StyleComponent::Numbers),
55+ "snip" => Ok(StyleComponent::Snip),
56+ "full" => Ok(StyleComponent::Full),
57+ "plain" => Ok(StyleComponent::Plain),
7058 _ => Err(format!("Unknown style '{}'", s).into()),
7159 }
7260 }
7361}
7462
7563#[derive(Debug, Clone, Default)]
76−pub struct OutputComponents(pub HashSet<OutputComponent>);
64+pub struct StyleComponents(pub HashSet<StyleComponent>);
7765
78−impl OutputComponents {
79− pub fn new(components: &[OutputComponent]) -> OutputComponents {
80− OutputComponents(components.iter().cloned().collect())
66+impl StyleComponents {
67+ pub fn new(components: &[StyleComponent]) -> StyleComponents {
68+ StyleComponents(components.iter().cloned().collect())
8169 }
8270
8371 pub fn changes(&self) -> bool {
84− self.0.contains(&OutputComponent::Changes)
72+ self.0.contains(&StyleComponent::Changes)
8573 }
8674
8775 pub fn grid(&self) -> bool {
88− self.0.contains(&OutputComponent::Grid)
76+ self.0.contains(&StyleComponent::Grid)
8977 }
9078
9179 pub fn header(&self) -> bool {
92− self.0.contains(&OutputComponent::Header)
80+ self.0.contains(&StyleComponent::Header)
9381 }
9482
9583 pub fn numbers(&self) -> bool {
96− self.0.contains(&OutputComponent::Numbers)
84+ self.0.contains(&StyleComponent::Numbers)
9785 }
9886
9987 pub fn snip(&self) -> bool {
100− self.0.contains(&OutputComponent::Snip)
88+ self.0.contains(&StyleComponent::Snip)
10189 }
10290
10391 pub fn plain(&self) -> bool {
104− self.0.iter().all(|c| c == &OutputComponent::Plain)
92+ self.0.iter().all(|c| c == &StyleComponent::Plain)
10593 }
10694}
src/syntax_mapping.rs+94−18
@@ -1,35 +1,111 @@
1−use std::borrow::Cow;
2−use std::collections::HashMap;
1+use std::path::Path;
2+
3+use crate::errors::Result;
4+
5+use globset::{Candidate, GlobBuilder, GlobMatcher};
6+
7+#[derive(Debug, Clone, Copy, PartialEq)]
8+pub enum MappingTarget<'a> {
9+ MapTo(&'a str),
10+ MapToUnknown,
11+}
312
413#[derive(Debug, Clone, Default)]
5−pub struct SyntaxMapping(HashMap<String, String>);
14+pub struct SyntaxMapping<'a> {
15+ mappings: Vec<(GlobMatcher, MappingTarget<'a>)>,
16+}
617
7−impl SyntaxMapping {
8− pub fn new() -> SyntaxMapping {
18+impl<'a> SyntaxMapping<'a> {
19+ pub fn empty() -> SyntaxMapping<'a> {
920 Default::default()
1021 }
1122
12− pub fn insert(&mut self, from: impl Into<String>, to: impl Into<String>) -> Option<String> {
13− self.0.insert(from.into(), to.into())
23+ pub fn builtin() -> SyntaxMapping<'a> {
24+ let mut mapping = Self::empty();
25+ mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap();
26+ mapping
27+ .insert("build", MappingTarget::MapToUnknown)
28+ .unwrap();
29+ mapping
30+ .insert("**/.ssh/config", MappingTarget::MapTo("SSH Config"))
31+ .unwrap();
32+ mapping
33+ .insert(
34+ "/etc/profile",
35+ MappingTarget::MapTo("Bourne Again Shell (bash)"),
36+ )
37+ .unwrap();
38+
39+ mapping
40+ }
41+
42+ pub fn insert(&mut self, from: &str, to: MappingTarget<'a>) -> Result<()> {
43+ let glob = GlobBuilder::new(from)
44+ .case_insensitive(false)
45+ .literal_separator(true)
46+ .build()?;
47+ self.mappings.push((glob.compile_matcher(), to));
48+ Ok(())
1449 }
1550
16− pub fn replace<'a>(&self, input: impl Into<Cow<'a, str>>) -> Cow<'a, str> {
17− let input = input.into();
18− match self.0.get(input.as_ref()) {
19− Some(s) => Cow::from(s.clone()),
20− None => input,
51+ pub(crate) fn get_syntax_for(&self, path: impl AsRef<Path>) -> Option<MappingTarget<'a>> {
52+ let candidate = Candidate::new(path.as_ref());
53+ let canddidate_filename = path.as_ref().file_name().map(Candidate::new);
54+ for (ref glob, ref syntax) in self.mappings.iter().rev() {
55+ if glob.is_match_candidate(&candidate)
56+ || canddidate_filename
57+ .as_ref()
58+ .map_or(false, |filename| glob.is_match_candidate(filename))
59+ {
60+ return Some(*syntax);
61+ }
2162 }
63+ None
2264 }
2365}
2466
2567#[test]
2668fn basic() {
27− let mut map = SyntaxMapping::new();
28− map.insert("Cargo.lock", "toml");
29− map.insert(".ignore", ".gitignore");
69+ let mut map = SyntaxMapping::empty();
70+ map.insert("/path/to/Cargo.lock", MappingTarget::MapTo("TOML"))
71+ .ok();
72+ map.insert("/path/to/.ignore", MappingTarget::MapTo("Git Ignore"))
73+ .ok();
3074
31− assert_eq!("toml", map.replace("Cargo.lock"));
32− assert_eq!("other.lock", map.replace("other.lock"));
75+ assert_eq!(
76+ map.get_syntax_for("/path/to/Cargo.lock"),
77+ Some(MappingTarget::MapTo("TOML"))
78+ );
79+ assert_eq!(map.get_syntax_for("/path/to/other.lock"), None);
80+
81+ assert_eq!(
82+ map.get_syntax_for("/path/to/.ignore"),
83+ Some(MappingTarget::MapTo("Git Ignore"))
84+ );
85+}
86+
87+#[test]
88+fn user_can_override_builtin_mappings() {
89+ let mut map = SyntaxMapping::builtin();
90+
91+ assert_eq!(
92+ map.get_syntax_for("/etc/profile"),
93+ Some(MappingTarget::MapTo("Bourne Again Shell (bash)"))
94+ );
95+ map.insert("/etc/profile", MappingTarget::MapTo("My Syntax"))
96+ .ok();
97+ assert_eq!(
98+ map.get_syntax_for("/etc/profile"),
99+ Some(MappingTarget::MapTo("My Syntax"))
100+ );
101+}
102+
103+#[test]
104+fn builtin_mappings() {
105+ let map = SyntaxMapping::builtin();
33106
34− assert_eq!(".gitignore", map.replace(".ignore"));
107+ assert_eq!(
108+ map.get_syntax_for("/path/to/build"),
109+ Some(MappingTarget::MapToUnknown)
110+ );
35111}
src/wrap.rsnew file+11
@@ -0,0 +1,11 @@
1+#[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)]
2+pub enum OutputWrap {
3+ Character,
4+ None,
5+}
6+
7+impl Default for OutputWrap {
8+ fn default() -> Self {
9+ OutputWrap::None
10+ }
11+}
tests/no_duplicate_extensions.rsnew file+35
@@ -0,0 +1,35 @@
1+use std::collections::HashSet;
2+
3+use bat::HighlightingAssets;
4+
5+#[test]
6+fn no_duplicate_extensions() {
7+ const KNOWN_EXCEPTIONS: &[&'static str] = &[
8+ // The '.h' extension currently appears in multiple syntaxes: C, C++, Objective C,
9+ // Objective C++
10+ "h",
11+ // In addition to the standard Haskell syntax in 'Packages', we also ship the 'Cabal'
12+ // syntax which comes with a "Haskell (improved)" syntax.
13+ "hs",
14+ // In addition to the standard JavaScript syntax in 'Packages', we also ship the
15+ // 'Javascript (Babel)' syntax.
16+ "js",
17+ // The "Ruby Haml" syntax also comes with a '.sass' extension. However, we make sure
18+ // that 'sass' is mapped to the 'Sass' syntax.
19+ "sass",
20+ ];
21+
22+ let assets = HighlightingAssets::from_binary();
23+
24+ let mut extensions = HashSet::new();
25+
26+ for syntax in assets.syntaxes() {
27+ for extension in &syntax.file_extensions {
28+ assert!(
29+ KNOWN_EXCEPTIONS.contains(&extension.as_str()) || extensions.insert(extension),
30+ "File extension / pattern \"{}\" appears twice in the syntax set",
31+ extension
32+ );
33+ }
34+ }
35+}
tests/syntax_detection.rsdeleted−78
@@ -1,78 +0,0 @@
1−use std::ffi::OsStr;
2−use std::fs::File;
3−use std::io;
4−use std::io::Write;
5−
6−use tempdir::TempDir;
7−
8−use bat::assets::HighlightingAssets;
9−use bat::inputfile::InputFile;
10−use bat::syntax_mapping::SyntaxMapping;
11−
12−struct SyntaxDetectionTest {
13− assets: HighlightingAssets,
14− pub syntax_mapping: SyntaxMapping,
15− temp_dir: TempDir,
16−}
17−
18−impl SyntaxDetectionTest {
19− fn new() -> Self {
20− SyntaxDetectionTest {
21− assets: HighlightingAssets::new(),
22− syntax_mapping: SyntaxMapping::new(),
23− temp_dir: TempDir::new("bat_syntax_detection_tests")
24− .expect("creation of temporary directory"),
25− }
26− }
27−
28− fn syntax_name_with_content(&self, file_name: &str, first_line: &str) -> String {
29− let file_path = self.temp_dir.path().join(file_name);
30− {
31− let mut temp_file = File::create(&file_path).unwrap();
32− writeln!(temp_file, "{}", first_line).unwrap();
33− }
34−
35− let input_file = InputFile::Ordinary(OsStr::new(&file_path));
36− let syntax = self.assets.get_syntax(
37− None,
38− input_file,
39− &mut input_file.get_reader(&io::stdin()).unwrap(),
40− &self.syntax_mapping,
41− );
42−
43− syntax.name.clone()
44− }
45−
46− fn syntax_name(&self, file_name: &str) -> String {
47− self.syntax_name_with_content(file_name, "")
48− }
49−}
50−
51−#[test]
52−fn syntax_detection_basic() {
53− let test = SyntaxDetectionTest::new();
54−
55− assert_eq!(test.syntax_name("test.rs"), "Rust");
56− assert_eq!(test.syntax_name("test.cpp"), "C++");
57− assert_eq!(test.syntax_name("PKGBUILD"), "Bourne Again Shell (bash)");
58−}
59−
60−#[test]
61−fn syntax_detection_first_line() {
62− let test = SyntaxDetectionTest::new();
63−
64− assert_eq!(
65− test.syntax_name_with_content("my_script", "#!/bin/bash"),
66− "Bourne Again Shell (bash)"
67− );
68− assert_eq!(test.syntax_name_with_content("my_script", "<?php"), "PHP");
69−}
70−
71−#[test]
72−fn syntax_detection_with_custom_mapping() {
73− let mut test = SyntaxDetectionTest::new();
74−
75− assert_ne!(test.syntax_name("test.h"), "C++");
76− test.syntax_mapping.insert("h", "cpp");
77− assert_eq!(test.syntax_name("test.h"), "C++");
78−}