diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..b4987cae
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,18 @@
+version: 2
+updates:
+- package-ecosystem: cargo
+ directory: "/"
+ schedule:
+ interval: monthly
+ time: "04:00"
+ timezone: Europe/Berlin
+ ignore:
+ - dependency-name: git2
+ versions:
+ - 0.13.17
+- package-ecosystem: gitsubmodule
+ directory: "/"
+ schedule:
+ interval: monthly
+ time: "04:00"
+ timezone: Europe/Berlin
diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml
index 2116fd85..11119192 100644
--- a/.github/workflows/CICD.yml
+++ b/.github/workflows/CICD.yml
@@ -79,6 +79,13 @@ jobs:
run: bat --list-languages
- name: List of themes
run: bat --list-themes
+ - name: Check documentation
+ env:
+ RUSTDOCFLAGS: -D warnings
+ uses: actions-rs/cargo@v1
+ with:
+ command: doc
+ args: --no-deps --document-private-items --all-features
build:
name: ${{ matrix.job.os }} (${{ matrix.job.target }})
diff --git a/.gitmodules b/.gitmodules
index 98bf500f..993123b0 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -61,9 +61,6 @@
[submodule "assets/syntaxes/Puppet"]
path = assets/syntaxes/02_Extra/Puppet
url = https://github.com/russCloak/SublimePuppet
-[submodule "assets/syntaxes/CSV"]
- path = assets/syntaxes/02_Extra/CSV
- url = https://github.com/wadetb/Sublime-Text-Advanced-CSV
[submodule "assets/themes/onehalf"]
path = assets/themes/onehalf
url = https://github.com/sonph/onehalf
@@ -218,7 +215,7 @@
url = https://github.com/hesstobi/sublime_gnuplot
[submodule "assets/syntaxes/02_Extra/SystemVerilog"]
path = assets/syntaxes/02_Extra/SystemVerilog
- url = git@github.com:TheClams/SystemVerilog.git
+ url = https://github.com/TheClams/SystemVerilog.git
[submodule "assets/themes/visual-studio-dark-plus"]
path = assets/themes/visual-studio-dark-plus
- url = https://github.com/vidann1/visual-studio-dark-plus.git
+ url = https://github.com/vidann1/visual-studio-dark-plus.git
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2b02eb41..d3341148 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,10 +8,13 @@
## Other
- `Input::ordinary_file` and `Input::with_name` now accept `Path` rather than `OsStr` see #1571 (@matklad)
+- The `LESS` environment variable is now included in `bat --diagnostic`, see #1589 (@Enselic)
- Increased min. required Rust version to 1.45
## Syntaxes
+- Replaced "Advanced CSV" with a custom CSV syntax definition written especially for `bat`; see #1574 (@keith-hall)
+
## New themes
## `bat` as a library
diff --git a/Cargo.lock b/Cargo.lock
index a4949d67..893f68a6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -226,9 +226,9 @@ dependencies = [
[[package]]
name = "console"
-version = "0.14.0"
+version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cc80946b3480f421c2f17ed1cb841753a371c7c5104f51d507e13f532c856aa"
+checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45"
dependencies = [
"encode_unicode",
"lazy_static",
diff --git a/Cargo.toml b/Cargo.toml
index f0eb26c0..f5c3b358 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -36,7 +36,7 @@ regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine
atty = { version = "0.2.14", optional = true }
ansi_term = "^0.12.1"
ansi_colours = "^1.0"
-console = "0.14.0"
+console = "0.14.1"
lazy_static = { version = "1.4", optional = true }
wild = { version = "2.0", optional = true }
content_inspector = "0.2.4"
diff --git a/assets/patches/Monokai-Extended.tmTheme.patch b/assets/patches/Monokai-Extended.tmTheme.patch
index 24573a7b..16624d5f 100644
--- a/assets/patches/Monokai-Extended.tmTheme.patch
+++ b/assets/patches/Monokai-Extended.tmTheme.patch
@@ -7,7 +7,7 @@ index 9c2aa3e..180cbbf 100644
JSON String
scope
- meta.structure.dictionary.json string.quoted.double.json
-+ meta.mapping.key.json string.quoted.double.json
++ meta.mapping.key.json string.quoted.double.json, punctuation.separator.sequence.csv
settings
foreground
diff --git a/assets/syntaxes/02_Extra/CSV b/assets/syntaxes/02_Extra/CSV
deleted file mode 160000
index 4786d037..00000000
--- a/assets/syntaxes/02_Extra/CSV
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4786d037a761bc45e516f6b0624a839919ec6d05
diff --git a/assets/syntaxes/02_Extra/CSV.sublime-syntax b/assets/syntaxes/02_Extra/CSV.sublime-syntax
index 1bbc5b97..cca7cd2c 100644
--- a/assets/syntaxes/02_Extra/CSV.sublime-syntax
+++ b/assets/syntaxes/02_Extra/CSV.sublime-syntax
@@ -1,46 +1,78 @@
%YAML 1.2
---
-# http://www.sublimetext.com/docs/3/syntax.html
-name: Advanced CSV
+# See http://www.sublimetext.com/docs/3/syntax.html
+name: Comma Separated Values
file_extensions:
- csv
- tsv
-scope: text.advanced_csv
+scope: text.csv
+variables:
+ field_separator: (?:[,;\t])
+ record_separator: (?:$\n?)
contexts:
+ prototype:
+ - match: (?={{record_separator}})
+ pop: true
+ fields:
+ - match: ''
+ push:
+ - field_or_record_separator
+ - field4
+ - field_or_record_separator
+ - field3
+ - field_or_record_separator
+ - field2
+ - field_or_record_separator
+ - field1
main:
- - match: (\")
- captures:
- 1: string.quoted.double.advanced_csv
- push:
- - meta_scope: meta.quoted.advanced_csv
- - match: (\")
- captures:
- 1: string.quoted.double.advanced_csv
- pop: true
- - include: main
- - match: '(\[([+-]?\d*)(\:)?([+-]?\d*)(\,)?([+-]?\d*)(\:)?([+-]?\d*)\])?\s*([<>v^])?\s*(=)'
- captures:
- 1: keyword.operator.advanced_csv
- 2: constant.numeric.formula.advanced_csv
- 4: constant.numeric.formula.advanced_csv
- 6: constant.numeric.formula.advanced_csv
- 8: constant.numeric.formula.advanced_csv
- 9: keyword.operator.advanced_csv
- 10: keyword.operator.advanced_csv
- push:
- - meta_scope: meta.range.advanced_csv
- - match: (?=(\")|$)
- pop: true
- - include: scope:source.python
- - match: '(?<=^|,|\s|\")([0-9.eE+-]+)(?=$|,|\s|\")'
- scope: meta.number.advanced_csv
- captures:
- 1: constant.numeric.advanced_csv
- - match: '(?<=^|,|\s|\")([^, \t\"]+)(?=$|,|\s|\")'
- scope: meta.nonnumber.advanced_csv
- captures:
- 1: storage.type.advanced_csv
- - match: (\,)
- scope: meta.delimiter.advanced_csv
- captures:
- 1: keyword.operator.advanced_csv
+ - meta_include_prototype: false
+ - match: '^'
+ set: fields
+
+ field_or_record_separator:
+ - meta_include_prototype: false
+ - match: '{{record_separator}}'
+ scope: punctuation.terminator.record.csv
+ pop: true
+ - match: '{{field_separator}}'
+ scope: punctuation.separator.sequence.csv
+ pop: true
+
+ field_contents:
+ - match: '"'
+ scope: punctuation.definition.string.begin.csv
+ push: double_quoted_string
+
+ - match: (?={{field_separator}}|{{record_separator}})
+ pop: true
+
+ double_quoted_string:
+ - meta_include_prototype: false
+ - meta_scope: string.quoted.double.csv
+ - match: '""'
+ scope: constant.character.escape.csv
+ - match: '"'
+ scope: punctuation.definition.string.end.csv
+ pop: true
+
+ field1:
+ - match: ''
+ set:
+ - meta_content_scope: meta.field-1.csv support.type
+ - include: field_contents
+ field2:
+ - match: ''
+ set:
+ - meta_content_scope: meta.field-2.csv support.function
+ - include: field_contents
+ field3:
+ - match: ''
+ set:
+ - meta_content_scope: meta.field-3.csv constant.numeric
+ - include: field_contents
+ field4:
+ - match: ''
+ set:
+ - meta_content_scope: meta.field-4.csv keyword.operator
+ - include: field_contents
+
diff --git a/assets/syntaxes/02_Extra/Julia b/assets/syntaxes/02_Extra/Julia
index 45a1b6fe..cc13e7d4 160000
--- a/assets/syntaxes/02_Extra/Julia
+++ b/assets/syntaxes/02_Extra/Julia
@@ -1 +1 @@
-Subproject commit 45a1b6fe6cc37a2b614ae199d85c702b8711e22a
+Subproject commit cc13e7d4ef74a6556af09d8858d2cc6a47ef5451
diff --git a/assets/syntaxes/02_Extra/SCSS_Sass b/assets/syntaxes/02_Extra/SCSS_Sass
index 48683220..63819a1a 160000
--- a/assets/syntaxes/02_Extra/SCSS_Sass
+++ b/assets/syntaxes/02_Extra/SCSS_Sass
@@ -1 +1 @@
-Subproject commit 4868322030c3644d6b8cfff68c85849789d9bdb2
+Subproject commit 63819a1ab6b2075360933b2cfe41b416de0e3c26
diff --git a/assets/syntaxes/02_Extra/syntax_test_csv.csv b/assets/syntaxes/02_Extra/syntax_test_csv.csv
new file mode 100644
index 00000000..c997b2bd
--- /dev/null
+++ b/assets/syntaxes/02_Extra/syntax_test_csv.csv
@@ -0,0 +1,60 @@
+# SYNTAX TEST "CSV.sublime-syntax"
+Forename,Surname,House No.,Street,City,Postcode
+#^^^^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^ meta.field-3
+# ^ punctuation.separator.sequence
+# ^^^^^^ meta.field-4
+# ^ punctuation.separator.sequence
+# ^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
+John,Doe,87,Logon Road,Citiville,TU43 6GH
+#^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^ meta.field-3
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^^ meta.field-4
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
+Jane,Doe,22,"""Fun"" Street","The City, County",FA90 1XA
+#^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^ meta.field-3
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
+# ^^ constant.character.escape
+# ^^ constant.character.escape
+# ^ punctuation.separator.sequence
+# ^ meta.field-1 string.quoted.double punctuation.definition.string.begin
+# ^^^^^^^^^^^^^^^^^ meta.field-1 string.quoted.double
+# ^ meta.field-1 string.quoted.double punctuation.definition.string.end
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
+Fred,Bloggs,"19","Street
+#^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^^ meta.field-3 string.quoted.double
+# ^ punctuation.separator.sequence
+# ^ meta.field-4 punctuation.definition.string.begin
+# ^^^^^^^^ meta.field-4 string.quoted.double
+Spanning Multiple ""
+#^^^^^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
+# ^^ constant.character.escape
+Lines",Citee,P0stc0d3
+#^^^^^ meta.field-4 string.quoted.double
+# ^ meta.field-4 punctuation.definition.string.end
+# ^ punctuation.separator.sequence
+# ^^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
diff --git a/assets/syntaxes/02_Extra/syntax_test_tsv.tsv b/assets/syntaxes/02_Extra/syntax_test_tsv.tsv
new file mode 100644
index 00000000..8c2645b8
--- /dev/null
+++ b/assets/syntaxes/02_Extra/syntax_test_tsv.tsv
@@ -0,0 +1,60 @@
+# SYNTAX TEST "CSV.sublime-syntax"
+Forename Surname House No. Street City Postcode
+#^^^^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^ meta.field-3
+# ^ punctuation.separator.sequence
+# ^^^^^^ meta.field-4
+# ^ punctuation.separator.sequence
+# ^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
+John Doe 87 Logon Road Citiville TU43 6GH
+#^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^ meta.field-3
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^^ meta.field-4
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
+Jane Doe 22 """Fun"" Street" "The City County" FA90 1XA
+#^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^ meta.field-3
+# ^ punctuation.separator.sequence
+# ^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
+# ^^ constant.character.escape
+# ^^ constant.character.escape
+# ^ punctuation.separator.sequence
+# ^ meta.field-1 string.quoted.double punctuation.definition.string.begin
+# ^^^^^^^^^^^^^^^^^ meta.field-1 string.quoted.double
+# ^ meta.field-1 string.quoted.double punctuation.definition.string.end
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
+Fred Bloggs "19" "Street
+#^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^ meta.field-2
+# ^ punctuation.separator.sequence
+# ^^^ meta.field-3 string.quoted.double
+# ^ punctuation.separator.sequence
+# ^ meta.field-4 punctuation.definition.string.begin
+# ^^^^^^^^ meta.field-4 string.quoted.double
+Spanning Multiple ""
+#^^^^^^^^^^^^^^^^^^^^ meta.field-4 string.quoted.double
+# ^^ constant.character.escape
+Lines" Citee P0stc0d3
+#^^^^^ meta.field-4 string.quoted.double
+# ^ meta.field-4 punctuation.definition.string.end
+# ^ punctuation.separator.sequence
+# ^^^^^ meta.field-1
+# ^ punctuation.separator.sequence
+# ^^^^^^^^ meta.field-2
diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs
index eb047809..dadcc673 100644
--- a/src/bin/bat/main.rs
+++ b/src/bin/bat/main.rs
@@ -238,6 +238,7 @@ fn run() -> Result {
.info(EnvironmentVariables::list(&[
"SHELL",
"PAGER",
+ "LESS",
"BAT_PAGER",
"BAT_CACHE_PATH",
"BAT_CONFIG_PATH",
diff --git a/tests/syntax-tests/highlighted/CSV/comma_in_quotes.csv b/tests/syntax-tests/highlighted/CSV/comma_in_quotes.csv
index 2ad5b914..9bd0da1a 100644
--- a/tests/syntax-tests/highlighted/CSV/comma_in_quotes.csv
+++ b/tests/syntax-tests/highlighted/CSV/comma_in_quotes.csv
@@ -1,7 +1,7 @@
-[3;38;2;102;217;239mfirst[0m[38;2;249;38;114m,[0m[3;38;2;102;217;239mlast[0m[38;2;249;38;114m,[0m[3;38;2;102;217;239maddress[0m[38;2;249;38;114m,[0m[3;38;2;102;217;239mcity[0m[38;2;249;38;114m,[0m[3;38;2;102;217;239mzip[0m
-[3;38;2;102;217;239mJohn[0m[38;2;249;38;114m,[0m[3;38;2;102;217;239mDoe[0m[38;2;249;38;114m,[0m[38;2;190;132;255m120[0m[38;2;248;248;242m [0m[3;38;2;102;217;239many[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mst.[0m[38;2;249;38;114m,[0m[38;2;230;219;116m"[0m[3;38;2;102;217;239mAnytown[0m[38;2;249;38;114m,[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mWW[0m[38;2;230;219;116m"[0m[38;2;249;38;114m,[0m[38;2;190;132;255m08123[0m
-[3;38;2;102;217;239ma[0m[38;2;249;38;114m,[0m[3;38;2;102;217;239mb[0m
-[38;2;190;132;255m1[0m[38;2;249;38;114m,[0m[38;2;230;219;116m"[0m[3;38;2;102;217;239mha[0m[38;2;248;248;242m [0m
-[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[3;38;2;102;217;239mha[0m[38;2;230;219;116m"[0m[38;2;230;219;116m"[0m[38;2;248;248;242m [0m
-[3;38;2;102;217;239mha[0m[38;2;230;219;116m"[0m[38;2;249;38;114m,[0m[38;2;190;132;255m120[0m[38;2;248;248;242m [0m[3;38;2;102;217;239many[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mst.[0m[38;2;249;38;114m,[0m[38;2;230;219;116m"[0m[3;38;2;102;217;239mAnytown[0m[38;2;249;38;114m,[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mWW[0m[38;2;230;219;116m"[0m[38;2;249;38;114m,[0m[38;2;190;132;255m08123[0m
-[38;2;190;132;255m3[0m[38;2;249;38;114m,[0m[38;2;190;132;255m4[0m[38;2;249;38;114m,[0m[38;2;190;132;255m120[0m[38;2;248;248;242m [0m[3;38;2;102;217;239many[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mst.[0m[38;2;249;38;114m,[0m[38;2;230;219;116m"[0m[3;38;2;102;217;239mAnytown[0m[38;2;249;38;114m,[0m[38;2;248;248;242m [0m[3;38;2;102;217;239mWW[0m[38;2;230;219;116m"[0m[38;2;249;38;114m,[0m[38;2;190;132;255m08123[0m
+[3;38;2;166;226;46mfirst[0m[38;2;253;151;31m,[0m[38;2;102;217;239mlast[0m[38;2;253;151;31m,[0m[38;2;190;132;255maddress[0m[38;2;253;151;31m,[0m[38;2;249;38;114mcity[0m[38;2;253;151;31m,[0m[3;38;2;166;226;46mzip[0m
+[3;38;2;166;226;46mJohn[0m[38;2;253;151;31m,[0m[38;2;102;217;239mDoe[0m[38;2;253;151;31m,[0m[38;2;190;132;255m120 any st.[0m[38;2;253;151;31m,[0m[38;2;230;219;116m"[0m[38;2;230;219;116mAnytown, WW[0m[38;2;230;219;116m"[0m[38;2;253;151;31m,[0m[3;38;2;166;226;46m08123[0m
+[3;38;2;166;226;46ma[0m[38;2;253;151;31m,[0m[38;2;102;217;239mb[0m
+[3;38;2;166;226;46m1[0m[38;2;253;151;31m,[0m[38;2;230;219;116m"[0m[38;2;230;219;116mha [0m
+[38;2;190;132;255m""[0m[38;2;230;219;116mha[0m[38;2;190;132;255m""[0m[38;2;230;219;116m [0m
+[38;2;230;219;116mha[0m[38;2;230;219;116m"[0m[38;2;253;151;31m,[0m[38;2;190;132;255m120 any st.[0m[38;2;253;151;31m,[0m[38;2;230;219;116m"[0m[38;2;230;219;116mAnytown, WW[0m[38;2;230;219;116m"[0m[38;2;253;151;31m,[0m[3;38;2;166;226;46m08123[0m
+[3;38;2;166;226;46m3[0m[38;2;253;151;31m,[0m[38;2;102;217;239m4[0m[38;2;253;151;31m,[0m[38;2;190;132;255m120 any st.[0m[38;2;253;151;31m,[0m[38;2;230;219;116m"[0m[38;2;230;219;116mAnytown, WW[0m[38;2;230;219;116m"[0m[38;2;253;151;31m,[0m[3;38;2;166;226;46m08123[0m